onbuzz 4.9.13 → 4.10.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/node_modules/glob/README.md +31 -5
- package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/glob.js +2 -1
- package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
- package/node_modules/glob/dist/commonjs/index.min.js +3 -3
- package/node_modules/glob/dist/commonjs/index.min.js.map +4 -4
- package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/pattern.js +4 -0
- package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
- package/node_modules/glob/dist/esm/glob.d.ts +8 -0
- package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/glob.js +2 -1
- package/node_modules/glob/dist/esm/glob.js.map +1 -1
- package/node_modules/glob/dist/esm/index.min.js +3 -3
- package/node_modules/glob/dist/esm/index.min.js.map +4 -4
- package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
- package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/pattern.js +4 -0
- package/node_modules/glob/dist/esm/pattern.js.map +1 -1
- package/node_modules/{@isaacs → glob/node_modules}/balanced-match/README.md +7 -10
- package/node_modules/{@isaacs → glob/node_modules}/balanced-match/package.json +7 -18
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/README.md +3 -6
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.js +6 -4
- package/node_modules/glob/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -0
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.js +6 -4
- package/node_modules/glob/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/package.json +11 -7
- package/node_modules/glob/node_modules/minimatch/README.md +76 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts +4 -2
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +309 -55
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +2 -4
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +4 -4
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts +81 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +232 -134
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +8 -8
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts +4 -2
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js +309 -55
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js +2 -4
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js +4 -4
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts +81 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js +232 -134
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js +8 -8
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/package.json +17 -11
- package/node_modules/glob/package.json +10 -13
- package/node_modules/minipass/LICENSE.md +55 -0
- package/node_modules/minipass/dist/commonjs/index.d.ts +12 -16
- package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/commonjs/index.js +13 -3
- package/node_modules/minipass/dist/commonjs/index.js.map +1 -1
- package/node_modules/minipass/dist/esm/index.d.ts +12 -16
- package/node_modules/minipass/dist/esm/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/esm/index.js +3 -1
- package/node_modules/minipass/dist/esm/index.js.map +1 -1
- package/node_modules/minipass/package.json +9 -14
- package/node_modules/path-scurry/node_modules/lru-cache/README.md +96 -10
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js +1726 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts +109 -32
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +334 -197
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js.map +4 -4
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js +9 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js +1726 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js +4 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js +1722 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.js +19 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts +109 -32
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +333 -196
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js.map +4 -4
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js +6 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js +1722 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/package.json +71 -18
- package/node_modules/path-scurry/package.json +8 -24
- package/package.json +1 -1
- package/scripts/debug-balance-probe.mjs +35 -35
- package/scripts/push-image.sh +43 -43
- package/scripts/setup-acr.sh +65 -65
- package/scripts/verify-optional-deps.js +96 -1
- package/src/__tests__/composioCliFlags.test.js +239 -239
- package/src/analyzers/CSSAnalyzer.js +298 -297
- package/src/analyzers/ConfigValidator.js +691 -690
- package/src/analyzers/ESLintAnalyzer.js +320 -320
- package/src/analyzers/JavaScriptAnalyzer.js +260 -261
- package/src/analyzers/PrettierFormatter.js +246 -247
- package/src/analyzers/PythonAnalyzer.js +283 -283
- package/src/analyzers/SecurityAnalyzer.js +729 -729
- package/src/analyzers/SparrowAnalyzer.js +341 -341
- package/src/analyzers/TypeScriptAnalyzer.js +247 -247
- package/src/analyzers/__tests__/CSSAnalyzer.test.js +41 -41
- package/src/analyzers/__tests__/ConfigValidator.test.js +362 -362
- package/src/analyzers/__tests__/JavaScriptAnalyzer.test.js +40 -40
- package/src/analyzers/__tests__/PythonAnalyzer.test.js +205 -208
- package/src/analyzers/__tests__/SecurityAnalyzer.test.js +303 -303
- package/src/analyzers/__tests__/TypeScriptAnalyzer.test.js +187 -187
- package/src/analyzers/codeCloneDetector/analyzer.js +344 -344
- package/src/analyzers/codeCloneDetector/detector.js +250 -250
- package/src/analyzers/codeCloneDetector/index.js +194 -192
- package/src/analyzers/codeCloneDetector/parser.js +199 -199
- package/src/core/__tests__/agentPool.test.js +866 -866
- package/src/core/__tests__/agentPoolAutoResume.test.js +209 -209
- package/src/core/__tests__/agentPoolWakeOnMessage.test.js +315 -315
- package/src/core/__tests__/agentScheduler.emptyResponseChatStall.test.js +213 -213
- package/src/core/__tests__/agentScheduler.errorCategorisation.test.js +246 -246
- package/src/core/__tests__/agentScheduler.firstChunkTimeout.test.js +138 -138
- package/src/core/__tests__/agentScheduler.modeTransitions.test.js +233 -233
- package/src/core/__tests__/agentScheduler.nativePromptPick.test.js +319 -319
- package/src/core/__tests__/agentScheduler.taskLifecycleInstruction.test.js +78 -78
- package/src/core/__tests__/agentScheduler.visualizer.test.js +258 -258
- package/src/core/__tests__/flowCheckpointStore.test.js +140 -140
- package/src/core/__tests__/flowEndToEnd.test.js +565 -565
- package/src/core/__tests__/flowFieldMapping.test.js +188 -189
- package/src/core/__tests__/flowLintClientMirror.test.js +96 -98
- package/src/core/__tests__/flowSavePayload.test.js +170 -169
- package/src/core/__tests__/flowTemplates.test.js +311 -311
- package/src/core/__tests__/flowVersionStore.test.js +123 -123
- package/src/core/__tests__/messageProcessor.test.js +669 -669
- package/src/core/__tests__/stateManager.test.js +0 -1
- package/src/core/agentPool.js +2474 -2475
- package/src/core/agentScheduler.js +1 -4
- package/src/core/contextManager.js +708 -708
- package/src/core/flowExecutor.js +1510 -1510
- package/src/core/flowFieldMapping.js +136 -138
- package/src/core/messageProcessor.js +953 -954
- package/src/core/orchestrator.js +593 -595
- package/src/core/stateManager.js +1765 -1752
- package/src/index.js +1221 -1221
- package/src/interfaces/__tests__/archivedAgentDelete.test.js +207 -207
- package/src/interfaces/__tests__/bulkAgentRoute.test.js +361 -361
- package/src/interfaces/__tests__/imageServing.test.js +228 -228
- package/src/interfaces/__tests__/remoteSessionAuth.test.js +308 -308
- package/src/interfaces/__tests__/videoJobsRoutes.test.js +178 -179
- package/src/interfaces/__tests__/webServer.marketplace.test.js +629 -629
- package/src/interfaces/schedulerRoutes.js +50 -50
- package/src/interfaces/terminal/__tests__/smoke/connection.test.js +341 -350
- package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +156 -156
- package/src/interfaces/terminal/__tests__/smoke/imports.test.js +325 -330
- package/src/interfaces/terminal/__tests__/smoke/tools.test.js +385 -388
- package/src/interfaces/terminal/api/session.js +265 -266
- package/src/interfaces/terminal/api/websocket.js +496 -497
- package/src/interfaces/terminal/components/AgentCreator.js +691 -705
- package/src/interfaces/terminal/components/AgentEditor.js +676 -678
- package/src/interfaces/terminal/components/AgentSwitcher.js +331 -330
- package/src/interfaces/terminal/components/ErrorPanel.js +263 -264
- package/src/interfaces/terminal/components/Header.js +28 -28
- package/src/interfaces/terminal/components/Layout.js +598 -603
- package/src/interfaces/terminal/components/MessageList.js +280 -281
- package/src/interfaces/terminal/components/SettingsPanel.js +410 -415
- package/src/interfaces/terminal/components/StatusBar.js +2 -0
- package/src/interfaces/terminal/index.js +168 -168
- package/src/interfaces/terminal/state/useAgentControl.js +496 -496
- package/src/interfaces/terminal/state/useAgents.js +537 -537
- package/src/interfaces/terminal/state/useMessages.js +629 -630
- package/src/interfaces/terminal/state/useTools.js +554 -554
- package/src/interfaces/terminal/utils/debugLogger.js +44 -44
- package/src/interfaces/terminal/utils/settingsStorage.js +232 -232
- package/src/interfaces/webServer.js +7578 -7579
- package/src/interfaces/webServer.js.bak +7046 -7046
- package/src/modules/fileExplorer/__tests__/zipDownload.test.js +237 -237
- package/src/modules/fileExplorer/controller.js +470 -469
- package/src/modules/fileExplorer/routes.js +285 -286
- package/src/modules/widget/__tests__/isDisabled.test.js +41 -41
- package/src/modules/widget/__tests__/routes.test.js +677 -678
- package/src/modules/widget/__tests__/runtime.test.js +401 -401
- package/src/modules/widget/__tests__/versioning.test.js +309 -309
- package/src/modules/widget/__tests__/webComponentRuntime.test.js +565 -565
- package/src/modules/widget/__tests__/widgetTool.test.js +316 -316
- package/src/modules/widget/routes.js +435 -435
- package/src/modules/widget/runtime/bundle.js +640 -640
- package/src/modules/widget/runtime/webComponentBundle.js +470 -470
- package/src/modules/widget/schema.js +182 -181
- package/src/modules/widget/widgetTool.js +1389 -1389
- package/src/services/__tests__/agentActivityService.test.js +401 -402
- package/src/services/__tests__/benchmarkService.test.js +184 -184
- package/src/services/__tests__/contextInjectionService.test.js +246 -246
- package/src/services/__tests__/conversationQuery.test.js +721 -723
- package/src/services/__tests__/credentialVault.test.js +469 -469
- package/src/services/__tests__/discordService.integration.test.js +638 -639
- package/src/services/__tests__/flowContextService.test.js +590 -590
- package/src/services/__tests__/memoryService.test.js +1 -1
- package/src/services/__tests__/messageSource.test.js +380 -380
- package/src/services/__tests__/modelRouterNaming.test.js +111 -111
- package/src/services/__tests__/projectDetector.test.js +34 -34
- package/src/services/__tests__/promptService.test.js +242 -242
- package/src/services/__tests__/telegramService.test.js +941 -941
- package/src/services/__tests__/tokenCountingService.test.js +48 -48
- package/src/services/agentActivityService.js +419 -420
- package/src/services/aiService.js +2997 -3001
- package/src/services/apiKeyManager.js +359 -359
- package/src/services/benchmarkService.js +196 -196
- package/src/services/codebaseKnowledgeService.js +2 -2
- package/src/services/composioService.js +738 -738
- package/src/services/conversationCompactionService.js +1258 -1257
- package/src/services/credentialVault.js +685 -685
- package/src/services/discordService.js +792 -793
- package/src/services/embeddings/__tests__/azureCustomProvider.test.js +232 -232
- package/src/services/embeddings/__tests__/embeddingService.test.js +417 -417
- package/src/services/embeddings/__tests__/localProvider.test.js +263 -263
- package/src/services/embeddings/autoRecall.js +218 -219
- package/src/services/embeddings/indexers/__tests__/agentIndexer.test.js +232 -232
- package/src/services/embeddings/indexers/__tests__/memoryIndexer.test.js +418 -418
- package/src/services/embeddings/indexers/__tests__/reminisceIndexer.test.js +356 -357
- package/src/services/embeddings/indexers/__tests__/skillsIndexer.test.js +145 -145
- package/src/services/embeddings/indexers/__tests__/taskIndexer.test.js +146 -146
- package/src/services/embeddings/indexers/composioIndexer.js +279 -279
- package/src/services/embeddings/providerInterface.js +206 -206
- package/src/services/embeddings/providers/localProvider.js +11 -7
- package/src/services/embeddings/providers/openaiProvider.js +101 -101
- package/src/services/embeddings/vectorStore/inMemoryJsonStore.js +356 -356
- package/src/services/errorHandler.js +809 -809
- package/src/services/flowContextService.js +586 -586
- package/src/services/grounding/MockAdapter.js +125 -125
- package/src/services/modelRouterService.js +26 -31
- package/src/services/modelsService.js +322 -322
- package/src/services/ollamaService.js +452 -452
- package/src/services/projectDetector.js +403 -404
- package/src/services/promptService.js +418 -418
- package/src/services/qualityInspector.js +795 -795
- package/src/services/scheduleService.js +726 -726
- package/src/services/serviceRegistry.js +386 -386
- package/src/services/telegrafBot.js +174 -174
- package/src/services/telegramService.js +1972 -1972
- package/src/services/visualEditorBridge.js +1033 -1033
- package/src/services/visualEditorServer.js +1769 -1774
- package/src/services/whatsappService.js +667 -668
- package/src/tools/__tests__/agentCommunicationTool.findAgent.test.js +226 -226
- package/src/tools/__tests__/agentCommunicationTool.test.js +3 -3
- package/src/tools/__tests__/agentDelayTool.test.js +342 -342
- package/src/tools/__tests__/baseTool.test.js +3 -3
- package/src/tools/__tests__/codeMapTool.test.js +915 -915
- package/src/tools/__tests__/fileContentReplaceTool.test.js +309 -309
- package/src/tools/__tests__/fileTreeTool.test.js +274 -274
- package/src/tools/__tests__/filesystemTool.test.js +815 -815
- package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -252
- package/src/tools/__tests__/imageTool.validator.test.js +194 -194
- package/src/tools/__tests__/jobDoneTool.test.js +580 -581
- package/src/tools/__tests__/memoryTool.forgetStale.test.js +272 -272
- package/src/tools/__tests__/memoryTool.reminisce.test.js +2 -2
- package/src/tools/__tests__/memoryTool.reminisceSemanticSearch.test.js +301 -301
- package/src/tools/__tests__/memoryTool.semanticSearch.test.js +405 -405
- package/src/tools/__tests__/memoryTool.teamPool.test.js +293 -293
- package/src/tools/__tests__/memoryTool.test.js +1 -1
- package/src/tools/__tests__/seekTool.test.js +282 -282
- package/src/tools/__tests__/skillsTool.search.test.js +164 -164
- package/src/tools/__tests__/skillsTool.test.js +226 -226
- package/src/tools/__tests__/staticAnalysisTool.test.js +509 -509
- package/src/tools/__tests__/taskManagerTool.discipline.test.js +137 -137
- package/src/tools/__tests__/taskManagerTool.search.test.js +143 -143
- package/src/tools/__tests__/taskManagerTool.test.js +866 -866
- package/src/tools/__tests__/terminalTool.test.js +448 -448
- package/src/tools/__tests__/toolShapeForgiveness.test.js +259 -260
- package/src/tools/__tests__/userPromptTool.test.js +297 -297
- package/src/tools/__tests__/videoTool.jobs.test.js +147 -147
- package/src/tools/__tests__/webTool.e2e.test.js +609 -603
- package/src/tools/__tests__/webTool.unit.test.js +195 -195
- package/src/tools/__tests__/webTool.visionModel.test.js +75 -75
- package/src/tools/agentCommunicationTool.js +8 -10
- package/src/tools/agentDelayTool.js +496 -497
- package/src/tools/asyncToolManager.js +602 -603
- package/src/tools/baseTool.js +12 -11
- package/src/tools/cloneDetectionTool.js +576 -581
- package/src/tools/codeMapTool.js +0 -6
- package/src/tools/composioTool.js +617 -617
- package/src/tools/dependencyResolverTool.js +1211 -1212
- package/src/tools/desktop/DesktopTool.js +629 -638
- package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -306
- package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -507
- package/src/tools/desktop/__tests__/osController.test.js +364 -364
- package/src/tools/desktop/osController.js +491 -491
- package/src/tools/docxTool.js +623 -623
- package/src/tools/excelTool.js +636 -636
- package/src/tools/fileContentReplaceTool.js +5 -7
- package/src/tools/fileSystemTool.js +12 -19
- package/src/tools/fileTreeTool.js +840 -840
- package/src/tools/foundryWebSearchTool.js +273 -273
- package/src/tools/helpTool.js +198 -198
- package/src/tools/imageTool.js +1397 -1397
- package/src/tools/importAnalyzerTool.js +1056 -1056
- package/src/tools/jobDoneTool.js +495 -495
- package/src/tools/memoryTool.js +1 -1
- package/src/tools/office/pres/__tests__/presSystem.test.js +365 -365
- package/src/tools/office/pres/archetypes/agenda.js +61 -61
- package/src/tools/office/pres/archetypes/bentoGrid.js +218 -219
- package/src/tools/office/pres/archetypes/bigStat.js +140 -142
- package/src/tools/office/pres/archetypes/closing.js +70 -70
- package/src/tools/office/pres/archetypes/hero.js +70 -70
- package/src/tools/office/pres/archetypes/productHero.js +93 -94
- package/src/tools/office/pres/archetypes/table.js +73 -74
- package/src/tools/office/pres/backgrounds/orb.js +66 -66
- package/src/tools/office/pres/components.js +422 -423
- package/src/tools/officeTool.js +441 -441
- package/src/tools/pdfTool.js +625 -627
- package/src/tools/platformControlTool.js +1081 -1081
- package/src/tools/seekTool.js +917 -918
- package/src/tools/skillsTool.js +1 -1
- package/src/tools/staticAnalysisTool.js +2143 -2146
- package/src/tools/taskManagerTool.js +3324 -3324
- package/src/tools/terminalTool.js +2615 -2618
- package/src/tools/videoTool.js +1303 -1303
- package/src/tools/visionTool.js +508 -508
- package/src/tools/visualEditorTool.js +1289 -1290
- package/src/tools/webTool.js +3368 -3368
- package/src/tools/whatsappTool.js +464 -464
- package/src/types/__tests__/agent.test.js +499 -499
- package/src/types/__tests__/contextReference.test.js +606 -606
- package/src/types/__tests__/conversation.test.js +555 -555
- package/src/types/__tests__/toolCommand.test.js +584 -584
- package/src/types/contextReference.js +974 -971
- package/src/types/conversation.js +729 -729
- package/src/types/toolCommand.js +746 -746
- package/src/utilities/__tests__/attachmentValidator.test.js +80 -80
- package/src/utilities/__tests__/auditReport.test.js +328 -328
- package/src/utilities/__tests__/directoryAccessManager.test.js +388 -388
- package/src/utilities/__tests__/jsonRepair.test.js +103 -104
- package/src/utilities/__tests__/modeTransitionReasons.test.js +105 -105
- package/src/utilities/__tests__/platformUtils.test.js +80 -87
- package/src/utilities/__tests__/structuredFileValidator.test.js +261 -263
- package/src/utilities/__tests__/toolConstants.test.js +92 -94
- package/src/utilities/__tests__/useIsTouchDevice.detect.test.js +114 -114
- package/src/utilities/__tests__/webUiUtilSync.test.js +117 -117
- package/src/utilities/attachmentValidator.js +284 -288
- package/src/utilities/authCache.js.backup-1779570472481 +121 -121
- package/src/utilities/browserStealth.js +631 -630
- package/src/utilities/configManager.js +616 -617
- package/src/utilities/directoryAccessManager.js +564 -565
- package/src/utilities/fileProcessor.js +308 -307
- package/src/utilities/humanBehavior.js +454 -453
- package/src/utilities/logger.js +479 -479
- package/src/utilities/structuredFileValidator.js +696 -699
- package/src/utilities/tagParser.js +5 -10
- package/src/utilities/userDataDir.js +308 -308
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js.map +0 -1
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.js.map +0 -1
- package/node_modules/minipass/LICENSE +0 -15
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/LICENSE.md +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/LICENSE +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/package.json +0 -0
|
@@ -1,206 +1,206 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EmbeddingProvider — abstract base for cloud + local embedding backends.
|
|
3
|
-
*
|
|
4
|
-
* Why an abstract class (not a duck-typed object): we want the same shape
|
|
5
|
-
* — Float32Array out, batch + single APIs, capability metadata, single
|
|
6
|
-
* error vocabulary — across every provider so the orchestrator never
|
|
7
|
-
* needs to know which one it's talking to. Subclasses override
|
|
8
|
-
* `_embed(texts, kind)` and the base handles input validation, batching,
|
|
9
|
-
* L2-normalization, dimension checks, and error wrapping.
|
|
10
|
-
*
|
|
11
|
-
* Vector convention: we always return L2-normalized Float32Array, so
|
|
12
|
-
* cosine similarity in the VectorStore reduces to a dot product — saves
|
|
13
|
-
* a divide-per-query at search time. The base enforces normalization
|
|
14
|
-
* after the subclass returns raw vectors.
|
|
15
|
-
*
|
|
16
|
-
* Query vs document: BGE / nomic / e5 embed queries and documents into
|
|
17
|
-
* the same space but want different prefixes ("search_query: ..." vs
|
|
18
|
-
* "search_document: ..."). Subclasses that distinguish read the `kind`
|
|
19
|
-
* argument; providers that don't simply ignore it. The base class
|
|
20
|
-
* forwards kind transparently.
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Error vocabulary shared by every provider. Mirrors the agent-scheduler
|
|
25
|
-
* error categorisation (persistent vs transient): transient codes are
|
|
26
|
-
* retry / fallback candidates; persistent codes surface to the user.
|
|
27
|
-
*/
|
|
28
|
-
export const EMBEDDING_ERROR_CODES = Object.freeze({
|
|
29
|
-
NETWORK_ERROR: 'NETWORK_ERROR', // transient
|
|
30
|
-
RATE_LIMITED: 'RATE_LIMITED', // transient
|
|
31
|
-
PROVIDER_UNAVAILABLE: 'PROVIDER_UNAVAILABLE', // transient
|
|
32
|
-
AUTH_ERROR: 'AUTH_ERROR', // persistent
|
|
33
|
-
MODEL_NOT_FOUND: 'MODEL_NOT_FOUND', // persistent
|
|
34
|
-
INVALID_INPUT: 'INVALID_INPUT', // persistent
|
|
35
|
-
DIMENSION_MISMATCH: 'DIMENSION_MISMATCH', // persistent
|
|
36
|
-
NOT_INITIALIZED: 'NOT_INITIALIZED', // persistent
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
export class EmbeddingError extends Error {
|
|
40
|
-
/**
|
|
41
|
-
* @param {string} code - One of EMBEDDING_ERROR_CODES values.
|
|
42
|
-
* @param {string} message
|
|
43
|
-
* @param {object} [opts]
|
|
44
|
-
* @param {Error} [opts.cause]
|
|
45
|
-
* @param {string} [opts.provider]
|
|
46
|
-
* @param {boolean} [opts.transient] - If true, orchestrator may retry / fall back.
|
|
47
|
-
*/
|
|
48
|
-
constructor(code, message, opts = {}) {
|
|
49
|
-
super(message);
|
|
50
|
-
this.name = 'EmbeddingError';
|
|
51
|
-
this.code = code;
|
|
52
|
-
this.provider = opts.provider || null;
|
|
53
|
-
this.transient = opts.transient ?? false;
|
|
54
|
-
if (opts.cause) this.cause = opts.cause;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* @typedef {Object} EmbeddingProviderInfo
|
|
60
|
-
* @property {string} name - 'azure' | 'openai' | 'local'
|
|
61
|
-
* @property {string} modelId - The concrete model identifier
|
|
62
|
-
* @property {number} dimensions - Vector size in floats
|
|
63
|
-
* @property {number} maxBatchSize - Max texts per `_embed` call
|
|
64
|
-
* @property {number} maxTokensPerText - Hard upper bound on a single input
|
|
65
|
-
* @property {boolean} distinguishesQueryAndDocument - Honours the `kind` arg?
|
|
66
|
-
* @property {boolean} isLocal - True for offline providers
|
|
67
|
-
*/
|
|
68
|
-
|
|
69
|
-
export class EmbeddingProvider {
|
|
70
|
-
/**
|
|
71
|
-
* Synchronous capability description. Must be cheap and side-effect-free
|
|
72
|
-
* (the orchestrator reads it on every request to validate inputs).
|
|
73
|
-
* @returns {EmbeddingProviderInfo}
|
|
74
|
-
*/
|
|
75
|
-
getInfo() {
|
|
76
|
-
throw new Error(`${this.constructor.name}.getInfo() must be implemented`);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Can this provider serve requests right now? For cloud providers this
|
|
81
|
-
* checks that the API key + endpoint are set; for local it checks that
|
|
82
|
-
* the model has been loaded. Should NOT throw — returns a structured
|
|
83
|
-
* result so callers can show a remediation message.
|
|
84
|
-
* @returns {Promise<{ok: boolean, reason?: string}>}
|
|
85
|
-
*/
|
|
86
|
-
async health() {
|
|
87
|
-
return { ok: true };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Embed a single query. Convenience over `embedDocuments([text], 'query')`.
|
|
92
|
-
* @param {string} text
|
|
93
|
-
* @returns {Promise<Float32Array>}
|
|
94
|
-
*/
|
|
95
|
-
async embedQuery(text) {
|
|
96
|
-
if (typeof text !== 'string' || text.length === 0) {
|
|
97
|
-
throw new EmbeddingError(
|
|
98
|
-
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
99
|
-
'embedQuery requires a non-empty string',
|
|
100
|
-
{ provider: this.getInfo().name },
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
const [vec] = await this.embedDocuments([text], 'query');
|
|
104
|
-
return vec;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Embed many texts. Returns an array of Float32Array (L2-normalized) in
|
|
109
|
-
* the SAME order as the input. Batches under `maxBatchSize` transparently.
|
|
110
|
-
* Throws EmbeddingError on failure with a code from EMBEDDING_ERROR_CODES.
|
|
111
|
-
*
|
|
112
|
-
* @param {string[]} texts
|
|
113
|
-
* @param {'document'|'query'} [kind='document']
|
|
114
|
-
* @returns {Promise<Float32Array[]>}
|
|
115
|
-
*/
|
|
116
|
-
async embedDocuments(texts, kind = 'document') {
|
|
117
|
-
if (!Array.isArray(texts) || texts.length === 0) {
|
|
118
|
-
throw new EmbeddingError(
|
|
119
|
-
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
120
|
-
'embedDocuments requires a non-empty array of strings',
|
|
121
|
-
{ provider: this.getInfo().name },
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
for (let i = 0; i < texts.length; i++) {
|
|
125
|
-
if (typeof texts[i] !== 'string' || texts[i].length === 0) {
|
|
126
|
-
throw new EmbeddingError(
|
|
127
|
-
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
128
|
-
`embedDocuments[${i}] is not a non-empty string`,
|
|
129
|
-
{ provider: this.getInfo().name },
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const { maxBatchSize, dimensions, name } = this.getInfo();
|
|
135
|
-
const out = [];
|
|
136
|
-
for (let start = 0; start < texts.length; start += maxBatchSize) {
|
|
137
|
-
const batch = texts.slice(start, start + maxBatchSize);
|
|
138
|
-
const raw = await this._embed(batch, kind);
|
|
139
|
-
if (!Array.isArray(raw) || raw.length !== batch.length) {
|
|
140
|
-
throw new EmbeddingError(
|
|
141
|
-
EMBEDDING_ERROR_CODES.PROVIDER_UNAVAILABLE,
|
|
142
|
-
`Provider returned ${Array.isArray(raw) ? raw.length : 'non-array'} vectors for ${batch.length} inputs`,
|
|
143
|
-
{ provider: name, transient: true },
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
for (const v of raw) {
|
|
147
|
-
const f32 = v instanceof Float32Array ? v : Float32Array.from(v);
|
|
148
|
-
if (f32.length !== dimensions) {
|
|
149
|
-
throw new EmbeddingError(
|
|
150
|
-
EMBEDDING_ERROR_CODES.DIMENSION_MISMATCH,
|
|
151
|
-
`Expected ${dimensions} dims; got ${f32.length}`,
|
|
152
|
-
{ provider: name },
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
normalizeInPlace(f32);
|
|
156
|
-
out.push(f32);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return out;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Subclasses implement this: send `texts` to the provider, return an
|
|
164
|
-
* array of array-likes of numbers (the base class normalizes + validates
|
|
165
|
-
* dimensions before handing the result back to callers).
|
|
166
|
-
*
|
|
167
|
-
* Should throw EmbeddingError with a useful code on failure. Network /
|
|
168
|
-
* 5xx / 429 → transient codes; auth / bad request → persistent codes.
|
|
169
|
-
*
|
|
170
|
-
* @param {string[]} texts
|
|
171
|
-
* @param {'document'|'query'} kind
|
|
172
|
-
* @returns {Promise<(number[]|Float32Array)[]>}
|
|
173
|
-
* @protected
|
|
174
|
-
*/
|
|
175
|
-
async _embed(
|
|
176
|
-
throw new Error(`${this.constructor.name}._embed() must be implemented`);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Stable model fingerprint, used by VectorStore to detect provider /
|
|
181
|
-
* model changes and trigger re-embed. Default = `name:modelId`; override
|
|
182
|
-
* if a single modelId has multiple incompatible internal versions.
|
|
183
|
-
* @returns {string}
|
|
184
|
-
*/
|
|
185
|
-
getModelFingerprint() {
|
|
186
|
-
const { name, modelId } = this.getInfo();
|
|
187
|
-
return `${name}:${modelId}`;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* L2-normalize a vector in place so cosine(a, b) reduces to dot(a, b).
|
|
193
|
-
* Exposed for tests and for the VectorStore to validate stored vectors.
|
|
194
|
-
* Hot path — avoid allocations.
|
|
195
|
-
* @param {Float32Array} v
|
|
196
|
-
* @returns {Float32Array} the same array, normalized
|
|
197
|
-
*/
|
|
198
|
-
export function normalizeInPlace(v) {
|
|
199
|
-
let sum = 0;
|
|
200
|
-
for (let i = 0; i < v.length; i++) sum += v[i] * v[i];
|
|
201
|
-
const norm = Math.sqrt(sum);
|
|
202
|
-
if (norm === 0) return v;
|
|
203
|
-
const inv = 1 / norm;
|
|
204
|
-
for (let i = 0; i < v.length; i++) v[i] = v[i] * inv;
|
|
205
|
-
return v;
|
|
206
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* EmbeddingProvider — abstract base for cloud + local embedding backends.
|
|
3
|
+
*
|
|
4
|
+
* Why an abstract class (not a duck-typed object): we want the same shape
|
|
5
|
+
* — Float32Array out, batch + single APIs, capability metadata, single
|
|
6
|
+
* error vocabulary — across every provider so the orchestrator never
|
|
7
|
+
* needs to know which one it's talking to. Subclasses override
|
|
8
|
+
* `_embed(texts, kind)` and the base handles input validation, batching,
|
|
9
|
+
* L2-normalization, dimension checks, and error wrapping.
|
|
10
|
+
*
|
|
11
|
+
* Vector convention: we always return L2-normalized Float32Array, so
|
|
12
|
+
* cosine similarity in the VectorStore reduces to a dot product — saves
|
|
13
|
+
* a divide-per-query at search time. The base enforces normalization
|
|
14
|
+
* after the subclass returns raw vectors.
|
|
15
|
+
*
|
|
16
|
+
* Query vs document: BGE / nomic / e5 embed queries and documents into
|
|
17
|
+
* the same space but want different prefixes ("search_query: ..." vs
|
|
18
|
+
* "search_document: ..."). Subclasses that distinguish read the `kind`
|
|
19
|
+
* argument; providers that don't simply ignore it. The base class
|
|
20
|
+
* forwards kind transparently.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Error vocabulary shared by every provider. Mirrors the agent-scheduler
|
|
25
|
+
* error categorisation (persistent vs transient): transient codes are
|
|
26
|
+
* retry / fallback candidates; persistent codes surface to the user.
|
|
27
|
+
*/
|
|
28
|
+
export const EMBEDDING_ERROR_CODES = Object.freeze({
|
|
29
|
+
NETWORK_ERROR: 'NETWORK_ERROR', // transient
|
|
30
|
+
RATE_LIMITED: 'RATE_LIMITED', // transient
|
|
31
|
+
PROVIDER_UNAVAILABLE: 'PROVIDER_UNAVAILABLE', // transient
|
|
32
|
+
AUTH_ERROR: 'AUTH_ERROR', // persistent
|
|
33
|
+
MODEL_NOT_FOUND: 'MODEL_NOT_FOUND', // persistent
|
|
34
|
+
INVALID_INPUT: 'INVALID_INPUT', // persistent
|
|
35
|
+
DIMENSION_MISMATCH: 'DIMENSION_MISMATCH', // persistent
|
|
36
|
+
NOT_INITIALIZED: 'NOT_INITIALIZED', // persistent
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
export class EmbeddingError extends Error {
|
|
40
|
+
/**
|
|
41
|
+
* @param {string} code - One of EMBEDDING_ERROR_CODES values.
|
|
42
|
+
* @param {string} message
|
|
43
|
+
* @param {object} [opts]
|
|
44
|
+
* @param {Error} [opts.cause]
|
|
45
|
+
* @param {string} [opts.provider]
|
|
46
|
+
* @param {boolean} [opts.transient] - If true, orchestrator may retry / fall back.
|
|
47
|
+
*/
|
|
48
|
+
constructor(code, message, opts = {}) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = 'EmbeddingError';
|
|
51
|
+
this.code = code;
|
|
52
|
+
this.provider = opts.provider || null;
|
|
53
|
+
this.transient = opts.transient ?? false;
|
|
54
|
+
if (opts.cause) this.cause = opts.cause;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @typedef {Object} EmbeddingProviderInfo
|
|
60
|
+
* @property {string} name - 'azure' | 'openai' | 'local'
|
|
61
|
+
* @property {string} modelId - The concrete model identifier
|
|
62
|
+
* @property {number} dimensions - Vector size in floats
|
|
63
|
+
* @property {number} maxBatchSize - Max texts per `_embed` call
|
|
64
|
+
* @property {number} maxTokensPerText - Hard upper bound on a single input
|
|
65
|
+
* @property {boolean} distinguishesQueryAndDocument - Honours the `kind` arg?
|
|
66
|
+
* @property {boolean} isLocal - True for offline providers
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
export class EmbeddingProvider {
|
|
70
|
+
/**
|
|
71
|
+
* Synchronous capability description. Must be cheap and side-effect-free
|
|
72
|
+
* (the orchestrator reads it on every request to validate inputs).
|
|
73
|
+
* @returns {EmbeddingProviderInfo}
|
|
74
|
+
*/
|
|
75
|
+
getInfo() {
|
|
76
|
+
throw new Error(`${this.constructor.name}.getInfo() must be implemented`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Can this provider serve requests right now? For cloud providers this
|
|
81
|
+
* checks that the API key + endpoint are set; for local it checks that
|
|
82
|
+
* the model has been loaded. Should NOT throw — returns a structured
|
|
83
|
+
* result so callers can show a remediation message.
|
|
84
|
+
* @returns {Promise<{ok: boolean, reason?: string}>}
|
|
85
|
+
*/
|
|
86
|
+
async health() {
|
|
87
|
+
return { ok: true };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Embed a single query. Convenience over `embedDocuments([text], 'query')`.
|
|
92
|
+
* @param {string} text
|
|
93
|
+
* @returns {Promise<Float32Array>}
|
|
94
|
+
*/
|
|
95
|
+
async embedQuery(text) {
|
|
96
|
+
if (typeof text !== 'string' || text.length === 0) {
|
|
97
|
+
throw new EmbeddingError(
|
|
98
|
+
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
99
|
+
'embedQuery requires a non-empty string',
|
|
100
|
+
{ provider: this.getInfo().name },
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
const [vec] = await this.embedDocuments([text], 'query');
|
|
104
|
+
return vec;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Embed many texts. Returns an array of Float32Array (L2-normalized) in
|
|
109
|
+
* the SAME order as the input. Batches under `maxBatchSize` transparently.
|
|
110
|
+
* Throws EmbeddingError on failure with a code from EMBEDDING_ERROR_CODES.
|
|
111
|
+
*
|
|
112
|
+
* @param {string[]} texts
|
|
113
|
+
* @param {'document'|'query'} [kind='document']
|
|
114
|
+
* @returns {Promise<Float32Array[]>}
|
|
115
|
+
*/
|
|
116
|
+
async embedDocuments(texts, kind = 'document') {
|
|
117
|
+
if (!Array.isArray(texts) || texts.length === 0) {
|
|
118
|
+
throw new EmbeddingError(
|
|
119
|
+
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
120
|
+
'embedDocuments requires a non-empty array of strings',
|
|
121
|
+
{ provider: this.getInfo().name },
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
for (let i = 0; i < texts.length; i++) {
|
|
125
|
+
if (typeof texts[i] !== 'string' || texts[i].length === 0) {
|
|
126
|
+
throw new EmbeddingError(
|
|
127
|
+
EMBEDDING_ERROR_CODES.INVALID_INPUT,
|
|
128
|
+
`embedDocuments[${i}] is not a non-empty string`,
|
|
129
|
+
{ provider: this.getInfo().name },
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const { maxBatchSize, dimensions, name } = this.getInfo();
|
|
135
|
+
const out = [];
|
|
136
|
+
for (let start = 0; start < texts.length; start += maxBatchSize) {
|
|
137
|
+
const batch = texts.slice(start, start + maxBatchSize);
|
|
138
|
+
const raw = await this._embed(batch, kind);
|
|
139
|
+
if (!Array.isArray(raw) || raw.length !== batch.length) {
|
|
140
|
+
throw new EmbeddingError(
|
|
141
|
+
EMBEDDING_ERROR_CODES.PROVIDER_UNAVAILABLE,
|
|
142
|
+
`Provider returned ${Array.isArray(raw) ? raw.length : 'non-array'} vectors for ${batch.length} inputs`,
|
|
143
|
+
{ provider: name, transient: true },
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
for (const v of raw) {
|
|
147
|
+
const f32 = v instanceof Float32Array ? v : Float32Array.from(v);
|
|
148
|
+
if (f32.length !== dimensions) {
|
|
149
|
+
throw new EmbeddingError(
|
|
150
|
+
EMBEDDING_ERROR_CODES.DIMENSION_MISMATCH,
|
|
151
|
+
`Expected ${dimensions} dims; got ${f32.length}`,
|
|
152
|
+
{ provider: name },
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
normalizeInPlace(f32);
|
|
156
|
+
out.push(f32);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Subclasses implement this: send `texts` to the provider, return an
|
|
164
|
+
* array of array-likes of numbers (the base class normalizes + validates
|
|
165
|
+
* dimensions before handing the result back to callers).
|
|
166
|
+
*
|
|
167
|
+
* Should throw EmbeddingError with a useful code on failure. Network /
|
|
168
|
+
* 5xx / 429 → transient codes; auth / bad request → persistent codes.
|
|
169
|
+
*
|
|
170
|
+
* @param {string[]} texts
|
|
171
|
+
* @param {'document'|'query'} kind
|
|
172
|
+
* @returns {Promise<(number[]|Float32Array)[]>}
|
|
173
|
+
* @protected
|
|
174
|
+
*/
|
|
175
|
+
async _embed(_texts, _kind) {
|
|
176
|
+
throw new Error(`${this.constructor.name}._embed() must be implemented`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Stable model fingerprint, used by VectorStore to detect provider /
|
|
181
|
+
* model changes and trigger re-embed. Default = `name:modelId`; override
|
|
182
|
+
* if a single modelId has multiple incompatible internal versions.
|
|
183
|
+
* @returns {string}
|
|
184
|
+
*/
|
|
185
|
+
getModelFingerprint() {
|
|
186
|
+
const { name, modelId } = this.getInfo();
|
|
187
|
+
return `${name}:${modelId}`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* L2-normalize a vector in place so cosine(a, b) reduces to dot(a, b).
|
|
193
|
+
* Exposed for tests and for the VectorStore to validate stored vectors.
|
|
194
|
+
* Hot path — avoid allocations.
|
|
195
|
+
* @param {Float32Array} v
|
|
196
|
+
* @returns {Float32Array} the same array, normalized
|
|
197
|
+
*/
|
|
198
|
+
export function normalizeInPlace(v) {
|
|
199
|
+
let sum = 0;
|
|
200
|
+
for (let i = 0; i < v.length; i++) sum += v[i] * v[i];
|
|
201
|
+
const norm = Math.sqrt(sum);
|
|
202
|
+
if (norm === 0) return v;
|
|
203
|
+
const inv = 1 / norm;
|
|
204
|
+
for (let i = 0; i < v.length; i++) v[i] = v[i] * inv;
|
|
205
|
+
return v;
|
|
206
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - Zero external runtime dependency. Users who don't have Ollama,
|
|
7
7
|
* LM Studio, or any model runner still get high-quality local
|
|
8
8
|
* embeddings out of the box.
|
|
9
|
-
* - Pure `npm install @
|
|
9
|
+
* - Pure `npm install @huggingface/transformers` — ONNX Runtime ships
|
|
10
10
|
* prebuilt binaries for Win/Mac/Linux.
|
|
11
11
|
* - Runs in-process: no port, no socket, no IPC. Privacy boundary
|
|
12
12
|
* is the OS process.
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* "Represent this sentence for searching relevant passages: " for BGE
|
|
28
28
|
* queries — though many users skip this for BGE).
|
|
29
29
|
*
|
|
30
|
-
* @
|
|
30
|
+
* @huggingface/transformers is declared as an OPTIONAL dependency so cloud-only
|
|
31
31
|
* users don't pay the ~50 MB install cost. If the user selects the local
|
|
32
32
|
* provider without the package installed, they get a clear remediation
|
|
33
33
|
* message (NOT_INITIALIZED with install instructions).
|
|
@@ -99,7 +99,7 @@ export class LocalEmbeddingProvider extends EmbeddingProvider {
|
|
|
99
99
|
* memory pressure. 32 is a safe default on 8 GB RAM laptops.
|
|
100
100
|
* @param {(modelId: string) => Promise<Function>} [opts.pipelineFactory]
|
|
101
101
|
* - Injectable for tests. When supplied, replaces the real
|
|
102
|
-
* `@
|
|
102
|
+
* `@huggingface/transformers` dynamic import. The factory must
|
|
103
103
|
* return an awaitable pipeline function with signature
|
|
104
104
|
* `(input: string|string[], options) => Promise<{tolist():
|
|
105
105
|
* number[][] | number[]}>`.
|
|
@@ -207,13 +207,17 @@ export class LocalEmbeddingProvider extends EmbeddingProvider {
|
|
|
207
207
|
async _loadRealPipeline() {
|
|
208
208
|
let mod;
|
|
209
209
|
try {
|
|
210
|
-
// Dynamic import keeps @
|
|
211
|
-
// cloud-only users don't pay the install cost.
|
|
212
|
-
|
|
210
|
+
// Dynamic import keeps @huggingface/transformers an optional dep —
|
|
211
|
+
// cloud-only users don't pay the install cost. Migrated from
|
|
212
|
+
// @xenova/transformers (same author, abandoned upstream Q4 2025)
|
|
213
|
+
// because its ONNX dep chain still carried unpatched protobufjs +
|
|
214
|
+
// onnxruntime CVEs (1 critical + 3 high). The HF successor has
|
|
215
|
+
// identical { pipeline, env } API — drop-in for our usage.
|
|
216
|
+
mod = await import('@huggingface/transformers');
|
|
213
217
|
} catch (err) {
|
|
214
218
|
throw new EmbeddingError(
|
|
215
219
|
EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
216
|
-
'@
|
|
220
|
+
'@huggingface/transformers is not installed. Run `npm install @huggingface/transformers` to use local embeddings, or switch the embedding provider to cloud.',
|
|
217
221
|
{ provider: 'local', transient: false, cause: err },
|
|
218
222
|
);
|
|
219
223
|
}
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAIEmbeddingProvider — direct-to-OpenAI BYOK path.
|
|
3
|
-
*
|
|
4
|
-
* Unlike AzureEmbeddingProvider (which goes through the Loxia backend),
|
|
5
|
-
* this provider hits `https://api.openai.com/v1/embeddings` directly using
|
|
6
|
-
* the user's own OpenAI key from ApiKeyManager.vendorKeys.openai.
|
|
7
|
-
*
|
|
8
|
-
* Why both providers: some users want to bring their own OpenAI key
|
|
9
|
-
* rather than route through Loxia's backend. The Loxia backend doesn't
|
|
10
|
-
* have to be involved for them. Cost still lands on their OpenAI account.
|
|
11
|
-
*
|
|
12
|
-
* Same request/response shape as Azure (it's the OpenAI API in both cases);
|
|
13
|
-
* the difference is the URL + Authorization header.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { EmbeddingProvider, EmbeddingError, EMBEDDING_ERROR_CODES } from '../providerInterface.js';
|
|
17
|
-
import { postEmbeddings, extractOpenAIShape } from './cloudHttpTransport.js';
|
|
18
|
-
|
|
19
|
-
const DEFAULT_URL = 'https://api.openai.com/v1/embeddings';
|
|
20
|
-
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
21
|
-
const DEFAULT_DIMS = 1536;
|
|
22
|
-
const DEFAULT_MAX_BATCH = 16;
|
|
23
|
-
const DEFAULT_MAX_TOKENS = 8191;
|
|
24
|
-
|
|
25
|
-
export class OpenAIEmbeddingProvider extends EmbeddingProvider {
|
|
26
|
-
/**
|
|
27
|
-
* @param {object} opts
|
|
28
|
-
* @param {() => string|null} opts.getApiKey - Returns current OpenAI key.
|
|
29
|
-
* Callback (not stored string) so key rotation in the
|
|
30
|
-
* ApiKeyManager is reflected without re-instantiating.
|
|
31
|
-
* @param {string} [opts.url=DEFAULT_URL] - Override for compat-layer
|
|
32
|
-
* proxies (DeepInfra, Together, etc.) that mimic OpenAI's API.
|
|
33
|
-
* @param {string} [opts.modelId]
|
|
34
|
-
* @param {number} [opts.dimensions]
|
|
35
|
-
* @param {number} [opts.maxBatchSize]
|
|
36
|
-
* @param {number} [opts.timeoutMs]
|
|
37
|
-
* @param {typeof fetch} [opts.fetchImpl] - Injectable for tests.
|
|
38
|
-
*/
|
|
39
|
-
constructor({
|
|
40
|
-
getApiKey,
|
|
41
|
-
url = DEFAULT_URL,
|
|
42
|
-
modelId = DEFAULT_MODEL,
|
|
43
|
-
dimensions = DEFAULT_DIMS,
|
|
44
|
-
maxBatchSize = DEFAULT_MAX_BATCH,
|
|
45
|
-
timeoutMs,
|
|
46
|
-
fetchImpl,
|
|
47
|
-
} = {}) {
|
|
48
|
-
super();
|
|
49
|
-
if (typeof getApiKey !== 'function') {
|
|
50
|
-
throw new Error('OpenAIEmbeddingProvider requires a getApiKey() callback');
|
|
51
|
-
}
|
|
52
|
-
this._url = url;
|
|
53
|
-
this._getApiKey = getApiKey;
|
|
54
|
-
this._modelId = modelId;
|
|
55
|
-
this._dimensions = dimensions;
|
|
56
|
-
this._maxBatchSize = maxBatchSize;
|
|
57
|
-
this._timeoutMs = timeoutMs;
|
|
58
|
-
this._fetchImpl = fetchImpl;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
getInfo() {
|
|
62
|
-
return {
|
|
63
|
-
name: 'openai',
|
|
64
|
-
modelId: this._modelId,
|
|
65
|
-
dimensions: this._dimensions,
|
|
66
|
-
maxBatchSize: this._maxBatchSize,
|
|
67
|
-
maxTokensPerText: DEFAULT_MAX_TOKENS,
|
|
68
|
-
distinguishesQueryAndDocument: false,
|
|
69
|
-
isLocal: false,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async health() {
|
|
74
|
-
const key = this._getApiKey();
|
|
75
|
-
if (!key) return { ok: false, reason: 'No OpenAI API key set. Add one under Settings → API Keys.' };
|
|
76
|
-
return { ok: true };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async _embed(texts
|
|
80
|
-
const apiKey = this._getApiKey();
|
|
81
|
-
if (!apiKey) {
|
|
82
|
-
throw new EmbeddingError(
|
|
83
|
-
EMBEDDING_ERROR_CODES.AUTH_ERROR,
|
|
84
|
-
'No OpenAI API key set. Add one under Settings → API Keys.',
|
|
85
|
-
{ provider: 'openai', transient: false },
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
return postEmbeddings({
|
|
89
|
-
url: this._url,
|
|
90
|
-
headers: {
|
|
91
|
-
Authorization: `Bearer ${apiKey}`,
|
|
92
|
-
'Content-Type': 'application/json',
|
|
93
|
-
},
|
|
94
|
-
body: { input: texts, model: this._modelId },
|
|
95
|
-
providerName: 'openai',
|
|
96
|
-
extractVectors: extractOpenAIShape,
|
|
97
|
-
timeoutMs: this._timeoutMs,
|
|
98
|
-
fetchImpl: this._fetchImpl,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* OpenAIEmbeddingProvider — direct-to-OpenAI BYOK path.
|
|
3
|
+
*
|
|
4
|
+
* Unlike AzureEmbeddingProvider (which goes through the Loxia backend),
|
|
5
|
+
* this provider hits `https://api.openai.com/v1/embeddings` directly using
|
|
6
|
+
* the user's own OpenAI key from ApiKeyManager.vendorKeys.openai.
|
|
7
|
+
*
|
|
8
|
+
* Why both providers: some users want to bring their own OpenAI key
|
|
9
|
+
* rather than route through Loxia's backend. The Loxia backend doesn't
|
|
10
|
+
* have to be involved for them. Cost still lands on their OpenAI account.
|
|
11
|
+
*
|
|
12
|
+
* Same request/response shape as Azure (it's the OpenAI API in both cases);
|
|
13
|
+
* the difference is the URL + Authorization header.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { EmbeddingProvider, EmbeddingError, EMBEDDING_ERROR_CODES } from '../providerInterface.js';
|
|
17
|
+
import { postEmbeddings, extractOpenAIShape } from './cloudHttpTransport.js';
|
|
18
|
+
|
|
19
|
+
const DEFAULT_URL = 'https://api.openai.com/v1/embeddings';
|
|
20
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
21
|
+
const DEFAULT_DIMS = 1536;
|
|
22
|
+
const DEFAULT_MAX_BATCH = 16;
|
|
23
|
+
const DEFAULT_MAX_TOKENS = 8191;
|
|
24
|
+
|
|
25
|
+
export class OpenAIEmbeddingProvider extends EmbeddingProvider {
|
|
26
|
+
/**
|
|
27
|
+
* @param {object} opts
|
|
28
|
+
* @param {() => string|null} opts.getApiKey - Returns current OpenAI key.
|
|
29
|
+
* Callback (not stored string) so key rotation in the
|
|
30
|
+
* ApiKeyManager is reflected without re-instantiating.
|
|
31
|
+
* @param {string} [opts.url=DEFAULT_URL] - Override for compat-layer
|
|
32
|
+
* proxies (DeepInfra, Together, etc.) that mimic OpenAI's API.
|
|
33
|
+
* @param {string} [opts.modelId]
|
|
34
|
+
* @param {number} [opts.dimensions]
|
|
35
|
+
* @param {number} [opts.maxBatchSize]
|
|
36
|
+
* @param {number} [opts.timeoutMs]
|
|
37
|
+
* @param {typeof fetch} [opts.fetchImpl] - Injectable for tests.
|
|
38
|
+
*/
|
|
39
|
+
constructor({
|
|
40
|
+
getApiKey,
|
|
41
|
+
url = DEFAULT_URL,
|
|
42
|
+
modelId = DEFAULT_MODEL,
|
|
43
|
+
dimensions = DEFAULT_DIMS,
|
|
44
|
+
maxBatchSize = DEFAULT_MAX_BATCH,
|
|
45
|
+
timeoutMs,
|
|
46
|
+
fetchImpl,
|
|
47
|
+
} = {}) {
|
|
48
|
+
super();
|
|
49
|
+
if (typeof getApiKey !== 'function') {
|
|
50
|
+
throw new Error('OpenAIEmbeddingProvider requires a getApiKey() callback');
|
|
51
|
+
}
|
|
52
|
+
this._url = url;
|
|
53
|
+
this._getApiKey = getApiKey;
|
|
54
|
+
this._modelId = modelId;
|
|
55
|
+
this._dimensions = dimensions;
|
|
56
|
+
this._maxBatchSize = maxBatchSize;
|
|
57
|
+
this._timeoutMs = timeoutMs;
|
|
58
|
+
this._fetchImpl = fetchImpl;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
getInfo() {
|
|
62
|
+
return {
|
|
63
|
+
name: 'openai',
|
|
64
|
+
modelId: this._modelId,
|
|
65
|
+
dimensions: this._dimensions,
|
|
66
|
+
maxBatchSize: this._maxBatchSize,
|
|
67
|
+
maxTokensPerText: DEFAULT_MAX_TOKENS,
|
|
68
|
+
distinguishesQueryAndDocument: false,
|
|
69
|
+
isLocal: false,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async health() {
|
|
74
|
+
const key = this._getApiKey();
|
|
75
|
+
if (!key) return { ok: false, reason: 'No OpenAI API key set. Add one under Settings → API Keys.' };
|
|
76
|
+
return { ok: true };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async _embed(texts) {
|
|
80
|
+
const apiKey = this._getApiKey();
|
|
81
|
+
if (!apiKey) {
|
|
82
|
+
throw new EmbeddingError(
|
|
83
|
+
EMBEDDING_ERROR_CODES.AUTH_ERROR,
|
|
84
|
+
'No OpenAI API key set. Add one under Settings → API Keys.',
|
|
85
|
+
{ provider: 'openai', transient: false },
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return postEmbeddings({
|
|
89
|
+
url: this._url,
|
|
90
|
+
headers: {
|
|
91
|
+
Authorization: `Bearer ${apiKey}`,
|
|
92
|
+
'Content-Type': 'application/json',
|
|
93
|
+
},
|
|
94
|
+
body: { input: texts, model: this._modelId },
|
|
95
|
+
providerName: 'openai',
|
|
96
|
+
extractVectors: extractOpenAIShape,
|
|
97
|
+
timeoutMs: this._timeoutMs,
|
|
98
|
+
fetchImpl: this._fetchImpl,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|