crewly 1.8.9 → 1.8.12
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.
- package/config/constants.d.ts.map +1 -0
- package/config/index.d.ts.map +1 -0
- package/config/roles/_common/memory-instructions.md +6 -5
- package/config/roles/_common/wiki-instructions.md +49 -0
- package/config/roles/architect/prompt.md +2 -2
- package/config/roles/backend-developer/prompt.md +2 -2
- package/config/roles/designer/prompt.md +2 -2
- package/config/roles/developer/prompt.md +2 -2
- package/config/roles/frontend-developer/prompt.md +2 -2
- package/config/roles/fullstack-dev/prompt.md +2 -2
- package/config/roles/generalist/prompt.md +2 -2
- package/config/roles/ops/prompt.md +2 -2
- package/config/roles/orchestrator/prompt.md +135 -11
- package/config/roles/product-manager/prompt.md +2 -2
- package/config/roles/qa/prompt.md +2 -2
- package/config/roles/qa-engineer/prompt.md +2 -2
- package/config/roles/researcher/prompt.md +15 -6
- package/config/roles/sales/prompt.md +2 -2
- package/config/roles/support/prompt.md +2 -2
- package/config/roles/team-leader/prompt.md +17 -2
- package/config/roles/tpm/prompt.md +2 -2
- package/config/roles/ux-designer/prompt.md +2 -2
- package/config/skills/orchestrator/wiki-cleanup/SKILL.md +89 -0
- package/config/skills/orchestrator/wiki-cleanup/execute.sh +139 -0
- package/config/skills/orchestrator/wiki-lint/SKILL.md +75 -0
- package/config/skills/orchestrator/wiki-lint/execute.sh +66 -0
- package/config/skills/orchestrator/wiki-migrate/SKILL.md +103 -0
- package/config/skills/orchestrator/wiki-migrate/execute.sh +82 -0
- package/config/skills/orchestrator/wiki-process-queue/SKILL.md +9 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +169 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1779 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +18 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +63 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +5 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +109 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +419 -4
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +11 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +78 -3
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/index.js.orc-bak-20260529 +3130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +513 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +1568 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +86 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +147 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +279 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +340 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +1176 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +79 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +145 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +16 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +16 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +141 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +310 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +135 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +1937 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +1 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +171 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js +725 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +50 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +45 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +34 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +118 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +326 -0
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts +72 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +186 -0
- package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +27 -4
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +133 -10
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +15 -4
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +160 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +399 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +182 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +505 -0
- package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +232 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +1416 -0
- package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +102 -0
- package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +104 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +229 -0
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +90 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js +190 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +164 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +675 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +65 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
- package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/backend/backend/src/types/cron-task.types.d.ts +16 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +111 -0
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/esm-require.utils.js +124 -0
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +220 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +37 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +56 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +91 -0
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +304 -0
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +115 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +215 -0
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +78 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.js +179 -0
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +1 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +331 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.js +814 -0
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +1 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +171 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.js +725 -0
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +45 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
- package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/cli/cli/src/index.js +0 -0
- package/frontend/dist/assets/{index-db3f5041.css → index-068bb4f6.css} +10 -1
- package/frontend/dist/assets/index-c24ceb15.js +4960 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/config/skills/agent/core/query-knowledge/SKILL.md +0 -87
- package/config/skills/agent/core/query-knowledge/execute.sh +0 -30
- package/config/skills/orchestrator/query-knowledge/SKILL.md +0 -75
- package/config/skills/orchestrator/query-knowledge/execute.sh +0 -30
- package/frontend/dist/assets/index-cc115bb4.js +0 -4926
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learnings-index.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/learnings-index.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
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 { Fts5IndexService, type FtsSearchResult } from './fts5-index.service.js';
|
|
11
|
+
/**
|
|
12
|
+
* Parsed frontmatter result containing extracted metadata and the body text.
|
|
13
|
+
*/
|
|
14
|
+
interface ParsedFrontmatter {
|
|
15
|
+
/** Key-value pairs extracted from YAML frontmatter */
|
|
16
|
+
frontmatter: Record<string, string>;
|
|
17
|
+
/** The markdown body after the frontmatter block */
|
|
18
|
+
body: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse YAML frontmatter from a Markdown file content string.
|
|
22
|
+
* Handles simple key: value pairs and bracket-delimited arrays.
|
|
23
|
+
* Does not require an external YAML parsing dependency.
|
|
24
|
+
*
|
|
25
|
+
* @param content - Raw file content including frontmatter
|
|
26
|
+
* @returns Parsed frontmatter object and body text
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseFrontmatter(content: string): ParsedFrontmatter;
|
|
29
|
+
/**
|
|
30
|
+
* WikiCompilerService scans `.md` files in a knowledge directory, parses
|
|
31
|
+
* their YAML frontmatter, and indexes the content into an FTS5 database
|
|
32
|
+
* for fast full-text search.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const compiler = new WikiCompilerService('/Users/me/.crewly/knowledge');
|
|
37
|
+
* const { indexed, errors } = await compiler.reindex();
|
|
38
|
+
* const results = compiler.search('deployment guide');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare class WikiCompilerService {
|
|
42
|
+
private readonly fts5;
|
|
43
|
+
private readonly knowledgePath;
|
|
44
|
+
private readonly logger;
|
|
45
|
+
/**
|
|
46
|
+
* Create a WikiCompilerService.
|
|
47
|
+
*
|
|
48
|
+
* @param knowledgePath - Directory containing `.md` knowledge files
|
|
49
|
+
*/
|
|
50
|
+
constructor(knowledgePath: string);
|
|
51
|
+
/**
|
|
52
|
+
* Get the path to the knowledge directory.
|
|
53
|
+
*
|
|
54
|
+
* @returns The absolute path to the knowledge directory
|
|
55
|
+
*/
|
|
56
|
+
getKnowledgePath(): string;
|
|
57
|
+
/**
|
|
58
|
+
* Recursively find all `.md` files under the knowledge directory.
|
|
59
|
+
*
|
|
60
|
+
* @returns Array of absolute file paths
|
|
61
|
+
*/
|
|
62
|
+
getMarkdownFiles(): Promise<string[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Scan all `.md` files in the knowledge directory (recursively), parse
|
|
65
|
+
* their frontmatter, and rebuild the FTS5 index from scratch.
|
|
66
|
+
*
|
|
67
|
+
* @returns An object with the count of indexed documents and any errors encountered
|
|
68
|
+
*/
|
|
69
|
+
reindex(): Promise<{
|
|
70
|
+
indexed: number;
|
|
71
|
+
errors: string[];
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Index a single markdown file into the FTS5 database.
|
|
75
|
+
*
|
|
76
|
+
* @param filePath - Absolute path to the markdown file
|
|
77
|
+
*/
|
|
78
|
+
indexFile(filePath: string): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Search the knowledge base using FTS5 full-text search.
|
|
81
|
+
*
|
|
82
|
+
* @param query - The search query string
|
|
83
|
+
* @param options - Optional search parameters (category filter, result limit)
|
|
84
|
+
* @returns Array of matching documents sorted by BM25 relevance
|
|
85
|
+
*/
|
|
86
|
+
search(query: string, options?: {
|
|
87
|
+
category?: string;
|
|
88
|
+
limit?: number;
|
|
89
|
+
}): FtsSearchResult[];
|
|
90
|
+
/**
|
|
91
|
+
* Get direct access to the underlying FTS5 index service.
|
|
92
|
+
*
|
|
93
|
+
* @returns The Fts5IndexService instance
|
|
94
|
+
*/
|
|
95
|
+
getFts5(): Fts5IndexService;
|
|
96
|
+
/**
|
|
97
|
+
* Close the underlying FTS5 database connection.
|
|
98
|
+
*/
|
|
99
|
+
close(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Recursively find all `.md` files under the knowledge directory.
|
|
102
|
+
*
|
|
103
|
+
* @returns Array of absolute file paths
|
|
104
|
+
*/
|
|
105
|
+
private globMarkdownFiles;
|
|
106
|
+
/**
|
|
107
|
+
* Read and parse a single markdown file into an FTS5 document shape.
|
|
108
|
+
*
|
|
109
|
+
* @param filePath - Absolute path to the markdown file
|
|
110
|
+
* @returns Parsed document ready for FTS5 indexing
|
|
111
|
+
*/
|
|
112
|
+
private parseFile;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
|
115
|
+
//# sourceMappingURL=wiki-compiler.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-compiler.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/wiki-compiler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAMjF;;GAEG;AACH,UAAU,iBAAiB;IACzB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA4BnE;AAkBD;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC;;;;OAIG;gBACS,aAAa,EAAE,MAAM;IAMjC;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3C;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA4B/D;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,eAAe,EAAE;IAIzF;;;;OAIG;IACH,OAAO,IAAI,gBAAgB;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;;;OAIG;YACW,iBAAiB;IAyB/B;;;;;OAKG;YACW,SAAS;CAcxB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-compiler.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/knowledge/wiki-compiler.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../../../../../backend/src/services/memory/embedding-provider.ts"],"names":[],"mappings":"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"}
|