glancey 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +435 -0
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
- package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
- package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +157 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
- package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/gemini.test.js +178 -0
- package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +273 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +334 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +102 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +279 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +1305 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
- package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/commit-handlers.test.js +153 -0
- package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/index-handlers.test.js +184 -0
- package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
- package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/memory-handlers.test.js +175 -0
- package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/search-handlers.test.js +229 -0
- package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
- package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
- package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
- package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
- package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
- package/dist/__tests__/utils/cache.test.d.ts +2 -0
- package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
- package/dist/__tests__/utils/cache.test.js +147 -0
- package/dist/__tests__/utils/cache.test.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/logger.test.d.ts +2 -0
- package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
- package/dist/__tests__/utils/logger.test.js +131 -0
- package/dist/__tests__/utils/logger.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +191 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +788 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +64 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +211 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +505 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +172 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +362 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/token-tracking.d.ts +143 -0
- package/dist/dashboard/token-tracking.d.ts.map +1 -0
- package/dist/dashboard/token-tracking.js +363 -0
- package/dist/dashboard/token-tracking.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +2710 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +28 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +165 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +34 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +120 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +22 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +179 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +20 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +227 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +103 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +23 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2028 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +29 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +236 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/chunk-utils.d.ts +24 -0
- package/dist/search/chunk-utils.d.ts.map +1 -0
- package/dist/search/chunk-utils.js +41 -0
- package/dist/search/chunk-utils.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +377 -0
- package/dist/search/indexer.d.ts.map +1 -0
- package/dist/search/indexer.js +1557 -0
- package/dist/search/indexer.js.map +1 -0
- package/dist/search/tree-sitter-chunker.d.ts +64 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +412 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/tools/clustering-handlers.d.ts +70 -0
- package/dist/tools/clustering-handlers.d.ts.map +1 -0
- package/dist/tools/clustering-handlers.js +150 -0
- package/dist/tools/clustering-handlers.js.map +1 -0
- package/dist/tools/commit-handlers.d.ts +77 -0
- package/dist/tools/commit-handlers.d.ts.map +1 -0
- package/dist/tools/commit-handlers.js +251 -0
- package/dist/tools/commit-handlers.js.map +1 -0
- package/dist/tools/index-handlers.d.ts +31 -0
- package/dist/tools/index-handlers.d.ts.map +1 -0
- package/dist/tools/index-handlers.js +53 -0
- package/dist/tools/index-handlers.js.map +1 -0
- package/dist/tools/instructions-handlers.d.ts +25 -0
- package/dist/tools/instructions-handlers.d.ts.map +1 -0
- package/dist/tools/instructions-handlers.js +36 -0
- package/dist/tools/instructions-handlers.js.map +1 -0
- package/dist/tools/memory-handlers.d.ts +95 -0
- package/dist/tools/memory-handlers.d.ts.map +1 -0
- package/dist/tools/memory-handlers.js +126 -0
- package/dist/tools/memory-handlers.js.map +1 -0
- package/dist/tools/search-handlers.d.ts +51 -0
- package/dist/tools/search-handlers.d.ts.map +1 -0
- package/dist/tools/search-handlers.js +128 -0
- package/dist/tools/search-handlers.js.map +1 -0
- package/dist/tools/symbol-handlers.d.ts +171 -0
- package/dist/tools/symbol-handlers.d.ts.map +1 -0
- package/dist/tools/symbol-handlers.js +456 -0
- package/dist/tools/symbol-handlers.js.map +1 -0
- package/dist/tools/types.d.ts +32 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +17 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/worktree-handlers.d.ts +96 -0
- package/dist/tools/worktree-handlers.d.ts.map +1 -0
- package/dist/tools/worktree-handlers.js +186 -0
- package/dist/tools/worktree-handlers.js.map +1 -0
- package/dist/utils/cache.d.ts +77 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +134 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +87 -0
- package/scripts/postinstall.js +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/dashboard/ui.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,QAAQ,GAAG,4pLAA4pL,CAAC;AAE9qL;;GAEG;AACH,MAAM,WAAW,GAAG,w7HAAw7H,CAAC;AAE78H;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;;;;;;4CAMmC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAipCf,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA++CxC,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EmbeddingBackend, EmbeddingConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Google Gemini embedding backend
|
|
4
|
+
* Uses Google's Generative AI API for embeddings
|
|
5
|
+
* Free tier: 1500 RPM, no credit card required
|
|
6
|
+
* Get API key at: https://aistudio.google.com/app/apikey
|
|
7
|
+
*/
|
|
8
|
+
export declare class GeminiBackend implements EmbeddingBackend {
|
|
9
|
+
name: string;
|
|
10
|
+
private model;
|
|
11
|
+
private apiKey;
|
|
12
|
+
private baseUrl;
|
|
13
|
+
private dimensions;
|
|
14
|
+
private rateLimiter;
|
|
15
|
+
private batchSize;
|
|
16
|
+
constructor(config: EmbeddingConfig);
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
embed(text: string): Promise<number[]>;
|
|
19
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
20
|
+
/**
|
|
21
|
+
* Embed a batch of texts using Gemini's batchEmbedContents endpoint.
|
|
22
|
+
* Used internally by embedBatch.
|
|
23
|
+
*/
|
|
24
|
+
private embedBatchDirect;
|
|
25
|
+
getDimensions(): number;
|
|
26
|
+
getModel(): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/embeddings/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkBpE;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAsD;IACrE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,eAAe;IAkB7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA+BtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAmDtD;;;OAGG;YACW,gBAAgB;IAsD9B,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { chunkArray } from './types.js';
|
|
2
|
+
import { fetchWithRetry, setRetryLogCallback } from './retry.js';
|
|
3
|
+
import { RateLimiter } from './rate-limiter.js';
|
|
4
|
+
import { broadcastLog, updateSubProgress } from '../dashboard/events.js';
|
|
5
|
+
// Set up retry logging to broadcast to dashboard
|
|
6
|
+
setRetryLogCallback(broadcastLog);
|
|
7
|
+
/** Default batch size for Gemini API requests (max 100 per batch request) */
|
|
8
|
+
const DEFAULT_BATCH_SIZE = 100;
|
|
9
|
+
/** Default model for Gemini embeddings */
|
|
10
|
+
const DEFAULT_GEMINI_MODEL = 'gemini-embedding-001';
|
|
11
|
+
/** Default dimensions - using 768 to match other backends for compatibility */
|
|
12
|
+
const DEFAULT_DIMENSIONS = 768;
|
|
13
|
+
/**
|
|
14
|
+
* Google Gemini embedding backend
|
|
15
|
+
* Uses Google's Generative AI API for embeddings
|
|
16
|
+
* Free tier: 1500 RPM, no credit card required
|
|
17
|
+
* Get API key at: https://aistudio.google.com/app/apikey
|
|
18
|
+
*/
|
|
19
|
+
export class GeminiBackend {
|
|
20
|
+
name = 'gemini';
|
|
21
|
+
model;
|
|
22
|
+
apiKey;
|
|
23
|
+
baseUrl = 'https://generativelanguage.googleapis.com/v1beta';
|
|
24
|
+
dimensions;
|
|
25
|
+
rateLimiter;
|
|
26
|
+
batchSize;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.model = config.model || DEFAULT_GEMINI_MODEL;
|
|
29
|
+
if (!config.apiKey) {
|
|
30
|
+
throw new Error('Gemini API key is required. Get a free key at https://aistudio.google.com/app/apikey and set GEMINI_API_KEY environment variable.');
|
|
31
|
+
}
|
|
32
|
+
this.apiKey = config.apiKey;
|
|
33
|
+
this.dimensions = DEFAULT_DIMENSIONS;
|
|
34
|
+
this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
35
|
+
// Initialize rate limiter - Gemini free tier is 1500 RPM = 25 RPS
|
|
36
|
+
this.rateLimiter = new RateLimiter({
|
|
37
|
+
requestsPerSecond: config.rateLimitRps ?? 20,
|
|
38
|
+
burstCapacity: config.rateLimitBurst ?? 30,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async initialize() {
|
|
42
|
+
// Test API key with a small request
|
|
43
|
+
try {
|
|
44
|
+
await this.embed('test');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new Error(`Failed to initialize Gemini backend: ${error}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async embed(text) {
|
|
51
|
+
// Acquire a rate limit token before making the request
|
|
52
|
+
await this.rateLimiter.acquire();
|
|
53
|
+
const url = `${this.baseUrl}/models/${this.model}:embedContent`;
|
|
54
|
+
const response = await fetchWithRetry(url, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
'x-goog-api-key': this.apiKey,
|
|
59
|
+
},
|
|
60
|
+
body: JSON.stringify({
|
|
61
|
+
model: `models/${this.model}`,
|
|
62
|
+
content: {
|
|
63
|
+
parts: [{ text }],
|
|
64
|
+
},
|
|
65
|
+
outputDimensionality: this.dimensions,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
const error = await response.text();
|
|
70
|
+
throw new Error(`Gemini API error: ${response.status} - ${error}`);
|
|
71
|
+
}
|
|
72
|
+
const data = (await response.json());
|
|
73
|
+
return data.embedding.values;
|
|
74
|
+
}
|
|
75
|
+
async embedBatch(texts) {
|
|
76
|
+
// For small batches, process directly
|
|
77
|
+
if (texts.length <= this.batchSize) {
|
|
78
|
+
return this.embedBatchDirect(texts);
|
|
79
|
+
}
|
|
80
|
+
// For large batches, chunk and process sequentially with progress logging
|
|
81
|
+
const chunks = chunkArray(texts, this.batchSize);
|
|
82
|
+
const results = [];
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
const initMsg = `Gemini: embedding ${texts.length} texts in ${chunks.length} batches (${this.batchSize} texts/batch)`;
|
|
85
|
+
console.error(`[glancey] ${initMsg}`);
|
|
86
|
+
broadcastLog('info', initMsg);
|
|
87
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
88
|
+
const chunk = chunks[i];
|
|
89
|
+
const batchNum = i + 1;
|
|
90
|
+
const batchStart = Date.now();
|
|
91
|
+
const textsProcessedBefore = i * this.batchSize;
|
|
92
|
+
// Update progress bar before starting batch
|
|
93
|
+
updateSubProgress(textsProcessedBefore, texts.length, `Gemini batch ${batchNum}/${chunks.length}: embedding ${chunk.length} texts...`);
|
|
94
|
+
const chunkResults = await this.embedBatchDirect(chunk);
|
|
95
|
+
results.push(...chunkResults);
|
|
96
|
+
const batchElapsed = ((Date.now() - batchStart) / 1000).toFixed(1);
|
|
97
|
+
const totalElapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
98
|
+
const textsProcessed = Math.min((i + 1) * this.batchSize, texts.length);
|
|
99
|
+
const progressMsg = `Gemini batch ${batchNum}/${chunks.length}: done in ${batchElapsed}s (${textsProcessed}/${texts.length} texts, ${totalElapsed}s total)`;
|
|
100
|
+
console.error(`[glancey] ${progressMsg}`);
|
|
101
|
+
broadcastLog('info', progressMsg);
|
|
102
|
+
// Update progress bar after batch completes
|
|
103
|
+
updateSubProgress(textsProcessed, texts.length, progressMsg);
|
|
104
|
+
}
|
|
105
|
+
const totalElapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
106
|
+
const completeMsg = `Gemini: completed embedding ${texts.length} texts in ${totalElapsed}s`;
|
|
107
|
+
console.error(`[glancey] ${completeMsg}`);
|
|
108
|
+
broadcastLog('info', completeMsg);
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Embed a batch of texts using Gemini's batchEmbedContents endpoint.
|
|
113
|
+
* Used internally by embedBatch.
|
|
114
|
+
*/
|
|
115
|
+
async embedBatchDirect(texts) {
|
|
116
|
+
// Acquire a rate limit token before making the request
|
|
117
|
+
const acquireMsg = 'Gemini: acquiring rate limit token...';
|
|
118
|
+
console.error(`[glancey] ${acquireMsg}`);
|
|
119
|
+
broadcastLog('info', acquireMsg);
|
|
120
|
+
await this.rateLimiter.acquire();
|
|
121
|
+
const acquiredMsg = 'Gemini: rate limit token acquired';
|
|
122
|
+
console.error(`[glancey] ${acquiredMsg}`);
|
|
123
|
+
broadcastLog('info', acquiredMsg);
|
|
124
|
+
const url = `${this.baseUrl}/models/${this.model}:batchEmbedContents`;
|
|
125
|
+
const requestBody = JSON.stringify({
|
|
126
|
+
requests: texts.map((text) => ({
|
|
127
|
+
model: `models/${this.model}`,
|
|
128
|
+
content: {
|
|
129
|
+
parts: [{ text }],
|
|
130
|
+
},
|
|
131
|
+
outputDimensionality: this.dimensions,
|
|
132
|
+
})),
|
|
133
|
+
});
|
|
134
|
+
const payloadSizeKb = (requestBody.length / 1024).toFixed(1);
|
|
135
|
+
const sendingMsg = `Gemini: sending batch request (${texts.length} texts, ${payloadSizeKb} KB payload)...`;
|
|
136
|
+
console.error(`[glancey] ${sendingMsg}`);
|
|
137
|
+
broadcastLog('info', sendingMsg);
|
|
138
|
+
const fetchStart = Date.now();
|
|
139
|
+
const response = await fetchWithRetry(url, {
|
|
140
|
+
method: 'POST',
|
|
141
|
+
headers: {
|
|
142
|
+
'Content-Type': 'application/json',
|
|
143
|
+
'x-goog-api-key': this.apiKey,
|
|
144
|
+
},
|
|
145
|
+
body: requestBody,
|
|
146
|
+
});
|
|
147
|
+
const fetchTime = ((Date.now() - fetchStart) / 1000).toFixed(1);
|
|
148
|
+
const responseMsg = `Gemini: received response in ${fetchTime}s (status: ${response.status})`;
|
|
149
|
+
console.error(`[glancey] ${responseMsg}`);
|
|
150
|
+
broadcastLog('info', responseMsg);
|
|
151
|
+
if (!response.ok) {
|
|
152
|
+
const error = await response.text();
|
|
153
|
+
throw new Error(`Gemini API error: ${response.status} - ${error}`);
|
|
154
|
+
}
|
|
155
|
+
const data = (await response.json());
|
|
156
|
+
return data.embeddings.map((e) => e.values);
|
|
157
|
+
}
|
|
158
|
+
getDimensions() {
|
|
159
|
+
return this.dimensions;
|
|
160
|
+
}
|
|
161
|
+
getModel() {
|
|
162
|
+
return this.model;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/embeddings/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EmbeddingConfig, CreateBackendResult } from './types.js';
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export { chunkArray } from './types.js';
|
|
4
|
+
export { OllamaBackend, DEFAULT_OLLAMA_MODEL } from './ollama.js';
|
|
5
|
+
export { GeminiBackend } from './gemini.js';
|
|
6
|
+
export { RateLimiter, type RateLimiterConfig } from './rate-limiter.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create an embedding backend based on configuration and available credentials.
|
|
9
|
+
*
|
|
10
|
+
* Tries backends in priority order:
|
|
11
|
+
* 1. Gemini (if GEMINI_API_KEY environment variable is set) - free tier, recommended
|
|
12
|
+
* 2. Ollama (local fallback, requires Ollama to be running)
|
|
13
|
+
*
|
|
14
|
+
* If an explicitly configured backend fails to initialize (e.g., rate limited),
|
|
15
|
+
* automatically falls back to Ollama and returns fallback info.
|
|
16
|
+
*
|
|
17
|
+
* @param config - Optional configuration to customize the backend
|
|
18
|
+
* @returns A promise resolving to the backend and optional fallback info
|
|
19
|
+
* @throws Error if no backend is available (no API keys and Ollama not running)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Use automatic backend selection
|
|
24
|
+
* const { backend } = await createEmbeddingBackend();
|
|
25
|
+
*
|
|
26
|
+
* // Force a specific backend (will fallback to Ollama on failure)
|
|
27
|
+
* const { backend, fallback } = await createEmbeddingBackend({ backend: 'gemini' });
|
|
28
|
+
* if (fallback) {
|
|
29
|
+
* console.warn(`Fell back to ${fallback.fallbackBackend}: ${fallback.reason}`);
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function createEmbeddingBackend(config?: Partial<EmbeddingConfig>): Promise<CreateBackendResult>;
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAIpB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAoG9B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { OllamaBackend, DEFAULT_OLLAMA_MODEL } from './ollama.js';
|
|
2
|
+
import { GeminiBackend } from './gemini.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export { chunkArray } from './types.js';
|
|
5
|
+
export { OllamaBackend, DEFAULT_OLLAMA_MODEL } from './ollama.js';
|
|
6
|
+
export { GeminiBackend } from './gemini.js';
|
|
7
|
+
export { RateLimiter } from './rate-limiter.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create an embedding backend based on configuration and available credentials.
|
|
10
|
+
*
|
|
11
|
+
* Tries backends in priority order:
|
|
12
|
+
* 1. Gemini (if GEMINI_API_KEY environment variable is set) - free tier, recommended
|
|
13
|
+
* 2. Ollama (local fallback, requires Ollama to be running)
|
|
14
|
+
*
|
|
15
|
+
* If an explicitly configured backend fails to initialize (e.g., rate limited),
|
|
16
|
+
* automatically falls back to Ollama and returns fallback info.
|
|
17
|
+
*
|
|
18
|
+
* @param config - Optional configuration to customize the backend
|
|
19
|
+
* @returns A promise resolving to the backend and optional fallback info
|
|
20
|
+
* @throws Error if no backend is available (no API keys and Ollama not running)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Use automatic backend selection
|
|
25
|
+
* const { backend } = await createEmbeddingBackend();
|
|
26
|
+
*
|
|
27
|
+
* // Force a specific backend (will fallback to Ollama on failure)
|
|
28
|
+
* const { backend, fallback } = await createEmbeddingBackend({ backend: 'gemini' });
|
|
29
|
+
* if (fallback) {
|
|
30
|
+
* console.warn(`Fell back to ${fallback.fallbackBackend}: ${fallback.reason}`);
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export async function createEmbeddingBackend(config) {
|
|
35
|
+
const geminiKey = config?.apiKey || process.env.GEMINI_API_KEY;
|
|
36
|
+
const ollamaUrl = config?.baseUrl || process.env.OLLAMA_URL || 'http://localhost:11434';
|
|
37
|
+
const ollamaModel = config?.model || DEFAULT_OLLAMA_MODEL;
|
|
38
|
+
const ollamaBatchSize = config?.batchSize;
|
|
39
|
+
const ollamaConcurrency = config?.concurrency;
|
|
40
|
+
// Helper to create Ollama backend
|
|
41
|
+
const createOllamaBackend = () => new OllamaBackend({
|
|
42
|
+
backend: 'ollama',
|
|
43
|
+
baseUrl: ollamaUrl,
|
|
44
|
+
model: ollamaModel,
|
|
45
|
+
batchSize: ollamaBatchSize,
|
|
46
|
+
concurrency: ollamaConcurrency,
|
|
47
|
+
});
|
|
48
|
+
// Helper to try Ollama as fallback
|
|
49
|
+
const tryOllamaFallback = async (originalBackend, reason) => {
|
|
50
|
+
console.error(`[glancey] WARN: ${originalBackend} backend failed: ${reason}`);
|
|
51
|
+
console.error(`[glancey] WARN: Falling back to Ollama...`);
|
|
52
|
+
try {
|
|
53
|
+
const fallbackBackend = createOllamaBackend();
|
|
54
|
+
await fallbackBackend.initialize();
|
|
55
|
+
console.error(`[glancey] Using ollama embedding backend (fallback from ${originalBackend})`);
|
|
56
|
+
const fallbackInfo = {
|
|
57
|
+
occurred: true,
|
|
58
|
+
originalBackend,
|
|
59
|
+
fallbackBackend: 'ollama',
|
|
60
|
+
reason,
|
|
61
|
+
};
|
|
62
|
+
return { backend: fallbackBackend, fallback: fallbackInfo };
|
|
63
|
+
}
|
|
64
|
+
catch (ollamaError) {
|
|
65
|
+
throw new Error(`Configured ${originalBackend} backend failed (${reason}) and Ollama fallback also failed: ${ollamaError}`);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
// If explicit backend is specified, try it first with fallback to Ollama
|
|
69
|
+
if (config?.backend && config.backend !== 'local') {
|
|
70
|
+
if (config.backend === 'gemini') {
|
|
71
|
+
if (!geminiKey) {
|
|
72
|
+
throw new Error('Gemini backend requested but no API key available. Get a free key at https://aistudio.google.com/app/apikey and set GEMINI_API_KEY.');
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const backend = new GeminiBackend({ backend: 'gemini', apiKey: geminiKey, ...config });
|
|
76
|
+
await backend.initialize();
|
|
77
|
+
console.error(`[glancey] Using gemini embedding backend (explicitly configured)`);
|
|
78
|
+
return { backend };
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return tryOllamaFallback('gemini', String(error));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (config.backend === 'ollama') {
|
|
85
|
+
// Ollama explicitly configured - no fallback available
|
|
86
|
+
const backend = createOllamaBackend();
|
|
87
|
+
await backend.initialize();
|
|
88
|
+
console.error(`[glancey] Using ollama embedding backend (explicitly configured)`);
|
|
89
|
+
return { backend };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Auto-select: try backends in priority order
|
|
93
|
+
const backends = [];
|
|
94
|
+
// Priority 1: Gemini (if API key available) - free tier, recommended
|
|
95
|
+
if (geminiKey) {
|
|
96
|
+
backends.push({
|
|
97
|
+
name: 'gemini',
|
|
98
|
+
create: () => new GeminiBackend({ backend: 'gemini', apiKey: geminiKey, ...config }),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
// Priority 2: Ollama (local fallback)
|
|
102
|
+
backends.push({
|
|
103
|
+
name: 'ollama',
|
|
104
|
+
create: createOllamaBackend,
|
|
105
|
+
});
|
|
106
|
+
// Try each backend until one works
|
|
107
|
+
for (const { name, create } of backends) {
|
|
108
|
+
try {
|
|
109
|
+
const backend = create();
|
|
110
|
+
await backend.initialize();
|
|
111
|
+
console.error(`[glancey] Using ${name} embedding backend`);
|
|
112
|
+
return { backend };
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error(`[glancey] Backend ${name} failed: ${error}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
throw new Error('No embedding backend available. Set GEMINI_API_KEY (free) or install Ollama.');
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EmbeddingBackend, EmbeddingConfig } from './types.js';
|
|
2
|
+
/** Default Ollama model optimized for code search */
|
|
3
|
+
export declare const DEFAULT_OLLAMA_MODEL = "qwen3-embedding:0.6b";
|
|
4
|
+
/**
|
|
5
|
+
* Ollama embedding backend
|
|
6
|
+
* Uses local Ollama server for embeddings
|
|
7
|
+
*/
|
|
8
|
+
export declare class OllamaBackend implements EmbeddingBackend {
|
|
9
|
+
name: string;
|
|
10
|
+
private model;
|
|
11
|
+
private baseUrl;
|
|
12
|
+
private dimensions;
|
|
13
|
+
private batchSize;
|
|
14
|
+
private concurrency;
|
|
15
|
+
constructor(config: EmbeddingConfig);
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
embed(text: string): Promise<number[]>;
|
|
18
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
19
|
+
getDimensions(): number;
|
|
20
|
+
getModel(): string;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAcpE,qDAAqD;AACrD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAY3D;;;GAGG;AACH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,IAAI,SAAY;IAChB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,eAAe;IAS7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAqHtD,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { chunkArray } from './types.js';
|
|
2
|
+
import { fetchWithRetry } from './retry.js';
|
|
3
|
+
import { broadcastLog, updateProgressMessage } from '../dashboard/events.js';
|
|
4
|
+
/** Default batch size for Ollama (texts per request) - larger batches reduce HTTP overhead */
|
|
5
|
+
const DEFAULT_BATCH_SIZE = 256;
|
|
6
|
+
/** Default concurrency for Ollama (sequential - Ollama processes one at a time anyway) */
|
|
7
|
+
const DEFAULT_CONCURRENCY = 1;
|
|
8
|
+
/** Default timeout for embedding requests (2 minutes per batch) */
|
|
9
|
+
const DEFAULT_TIMEOUT_MS = 2 * 60 * 1000;
|
|
10
|
+
/** Default Ollama model optimized for code search */
|
|
11
|
+
export const DEFAULT_OLLAMA_MODEL = 'qwen3-embedding:0.6b';
|
|
12
|
+
/** Model dimension defaults (used when dimensions can't be auto-detected) */
|
|
13
|
+
const MODEL_DIMENSIONS = {
|
|
14
|
+
'qwen3-embedding:0.6b': 1024,
|
|
15
|
+
'qwen3-embedding:4b': 1024,
|
|
16
|
+
'qwen3-embedding:8b': 1024,
|
|
17
|
+
'nomic-embed-text': 768,
|
|
18
|
+
'mxbai-embed-large': 1024,
|
|
19
|
+
'all-minilm': 384,
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Ollama embedding backend
|
|
23
|
+
* Uses local Ollama server for embeddings
|
|
24
|
+
*/
|
|
25
|
+
export class OllamaBackend {
|
|
26
|
+
name = 'ollama';
|
|
27
|
+
model;
|
|
28
|
+
baseUrl;
|
|
29
|
+
dimensions;
|
|
30
|
+
batchSize;
|
|
31
|
+
concurrency;
|
|
32
|
+
constructor(config) {
|
|
33
|
+
this.model = config.model || DEFAULT_OLLAMA_MODEL;
|
|
34
|
+
this.baseUrl = config.baseUrl || 'http://localhost:11434';
|
|
35
|
+
this.batchSize = config.batchSize ?? DEFAULT_BATCH_SIZE;
|
|
36
|
+
this.concurrency = config.concurrency ?? DEFAULT_CONCURRENCY;
|
|
37
|
+
// Set dimensions based on known models, default to 1024 for unknown models
|
|
38
|
+
this.dimensions = MODEL_DIMENSIONS[this.model] ?? 1024;
|
|
39
|
+
}
|
|
40
|
+
async initialize() {
|
|
41
|
+
// Test connection and check if model is available
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetchWithRetry(`${this.baseUrl}/api/tags`, {});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`Ollama server returned ${response.status}`);
|
|
46
|
+
}
|
|
47
|
+
// Check if our model is available
|
|
48
|
+
const data = (await response.json());
|
|
49
|
+
const availableModels = data.models?.map((m) => m.name) || [];
|
|
50
|
+
const modelAvailable = availableModels.some((name) => name === this.model || name.startsWith(`${this.model}:`));
|
|
51
|
+
if (!modelAvailable) {
|
|
52
|
+
throw new Error(`Model '${this.model}' not found in Ollama.\n\n` +
|
|
53
|
+
`To install it, run:\n` +
|
|
54
|
+
` ollama pull ${this.model}\n\n` +
|
|
55
|
+
`Available models: ${availableModels.length > 0 ? availableModels.join(', ') : 'none'}\n\n` +
|
|
56
|
+
`For best code search results, we recommend:\n` +
|
|
57
|
+
` ollama pull ${DEFAULT_OLLAMA_MODEL}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof Error && error.message.includes('Model')) {
|
|
62
|
+
throw error; // Re-throw model not found errors as-is
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Failed to connect to Ollama at ${this.baseUrl}.\n\n` +
|
|
65
|
+
`Make sure Ollama is installed and running:\n` +
|
|
66
|
+
` 1. Install Ollama from https://ollama.com\n` +
|
|
67
|
+
` 2. Start Ollama (it runs in the background)\n` +
|
|
68
|
+
` 3. Pull the embedding model: ollama pull ${DEFAULT_OLLAMA_MODEL}\n\n` +
|
|
69
|
+
`Original error: ${error}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async embed(text) {
|
|
73
|
+
const results = await this.embedBatch([text]);
|
|
74
|
+
return results[0];
|
|
75
|
+
}
|
|
76
|
+
async embedBatch(texts) {
|
|
77
|
+
// Use Ollama's batch API (/api/embed) which accepts an array of texts
|
|
78
|
+
// Process in small batches with limited concurrency for reliability
|
|
79
|
+
const batches = chunkArray(texts, this.batchSize);
|
|
80
|
+
const results = new Array(texts.length);
|
|
81
|
+
const totalGroups = Math.ceil(batches.length / this.concurrency);
|
|
82
|
+
const initMsg = `Ollama: embedding ${texts.length} texts in ${batches.length} batches (${this.batchSize} texts/batch, ${this.concurrency} parallel, ${totalGroups} groups)`;
|
|
83
|
+
const modelMsg = `Ollama: using model ${this.model} at ${this.baseUrl}`;
|
|
84
|
+
console.error(`[glancey] ${initMsg}`);
|
|
85
|
+
console.error(`[glancey] ${modelMsg}`);
|
|
86
|
+
broadcastLog('info', initMsg);
|
|
87
|
+
broadcastLog('info', modelMsg);
|
|
88
|
+
// Process batches in parallel groups controlled by concurrency
|
|
89
|
+
for (let i = 0; i < batches.length; i += this.concurrency) {
|
|
90
|
+
const batchGroup = batches.slice(i, i + this.concurrency);
|
|
91
|
+
const groupNum = Math.floor(i / this.concurrency) + 1;
|
|
92
|
+
const groupStart = Date.now();
|
|
93
|
+
// Track batch statuses for this group
|
|
94
|
+
const batchStatuses = new Map();
|
|
95
|
+
const updateBatchProgress = () => {
|
|
96
|
+
const statusLines = [`Group ${groupNum}/${totalGroups}`];
|
|
97
|
+
for (const [batchNum, status] of batchStatuses) {
|
|
98
|
+
statusLines.push(` Batch ${batchNum}/${batches.length}: ${status}`);
|
|
99
|
+
}
|
|
100
|
+
updateProgressMessage(statusLines.join('\n'));
|
|
101
|
+
};
|
|
102
|
+
const groupStartMsg = `Embedding group ${groupNum}/${totalGroups} (${batchGroup.length} batches)...`;
|
|
103
|
+
console.error(`[glancey] ${groupStartMsg}`);
|
|
104
|
+
broadcastLog('info', groupStartMsg);
|
|
105
|
+
updateProgressMessage(groupStartMsg);
|
|
106
|
+
const batchPromises = batchGroup.map(async (batch, groupIndex) => {
|
|
107
|
+
const batchNum = i + groupIndex + 1;
|
|
108
|
+
// Mark batch as running
|
|
109
|
+
batchStatuses.set(batchNum, '⏳ running...');
|
|
110
|
+
updateBatchProgress();
|
|
111
|
+
const batchStartMsg = `Batch ${batchNum}/${batches.length}: sending ${batch.length} texts...`;
|
|
112
|
+
console.error(`[glancey] ${batchStartMsg}`);
|
|
113
|
+
broadcastLog('info', batchStartMsg);
|
|
114
|
+
const batchStart = Date.now();
|
|
115
|
+
try {
|
|
116
|
+
const response = await fetchWithRetry(`${this.baseUrl}/api/embed`, {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
headers: { 'Content-Type': 'application/json' },
|
|
119
|
+
body: JSON.stringify({
|
|
120
|
+
model: this.model,
|
|
121
|
+
input: batch,
|
|
122
|
+
keep_alive: '10m', // Keep model loaded for 10 minutes
|
|
123
|
+
}),
|
|
124
|
+
}, {
|
|
125
|
+
// Ollama is local and can be slow, especially on first load
|
|
126
|
+
// Use longer timeout (2 minutes per batch)
|
|
127
|
+
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
128
|
+
});
|
|
129
|
+
if (!response.ok) {
|
|
130
|
+
throw new Error(`Ollama embedding failed: ${response.status}`);
|
|
131
|
+
}
|
|
132
|
+
const data = (await response.json());
|
|
133
|
+
const batchElapsed = ((Date.now() - batchStart) / 1000).toFixed(1);
|
|
134
|
+
// Mark batch as done
|
|
135
|
+
batchStatuses.set(batchNum, `✅ done (${batchElapsed}s)`);
|
|
136
|
+
updateBatchProgress();
|
|
137
|
+
const batchDoneMsg = `Batch ${batchNum}/${batches.length}: done in ${batchElapsed}s`;
|
|
138
|
+
console.error(`[glancey] ${batchDoneMsg}`);
|
|
139
|
+
broadcastLog('info', batchDoneMsg);
|
|
140
|
+
return { batchIndex: i + groupIndex, embeddings: data.embeddings };
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
144
|
+
// Add timeout context to error message
|
|
145
|
+
const isTimeout = errorMsg.includes('timeout');
|
|
146
|
+
const batchErrorMsg = isTimeout
|
|
147
|
+
? `Batch ${batchNum}/${batches.length}: TIMEOUT after ${DEFAULT_TIMEOUT_MS / 1000}s - ${errorMsg}`
|
|
148
|
+
: `Batch ${batchNum}/${batches.length}: ERROR - ${errorMsg}`;
|
|
149
|
+
console.error(`[glancey] ${batchErrorMsg}`);
|
|
150
|
+
broadcastLog('error', batchErrorMsg);
|
|
151
|
+
batchStatuses.set(batchNum, isTimeout ? '⏱️ TIMEOUT' : '❌ ERROR');
|
|
152
|
+
updateBatchProgress();
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
const batchResults = await Promise.all(batchPromises);
|
|
157
|
+
const groupElapsed = ((Date.now() - groupStart) / 1000).toFixed(1);
|
|
158
|
+
const processedSoFar = Math.min((i + this.concurrency) * this.batchSize, texts.length);
|
|
159
|
+
const groupCompleteMsg = `Embedded batch group ${Math.floor(i / this.concurrency) + 1}/${Math.ceil(batches.length / this.concurrency)} (${processedSoFar}/${texts.length} texts) in ${groupElapsed}s`;
|
|
160
|
+
console.error(`[glancey] ${groupCompleteMsg}`);
|
|
161
|
+
broadcastLog('info', groupCompleteMsg);
|
|
162
|
+
// Place results in correct positions
|
|
163
|
+
for (const { batchIndex, embeddings } of batchResults) {
|
|
164
|
+
const startIndex = batchIndex * this.batchSize;
|
|
165
|
+
for (let j = 0; j < embeddings.length; j++) {
|
|
166
|
+
results[startIndex + j] = embeddings[j];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
getDimensions() {
|
|
173
|
+
return this.dimensions;
|
|
174
|
+
}
|
|
175
|
+
getModel() {
|
|
176
|
+
return this.model;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embeddings/ollama.ts"],"names":[],"mappings":"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"}
|