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,263 +1,263 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for LocalEmbeddingProvider.
|
|
3
|
-
*
|
|
4
|
-
* Key design: tests inject a `pipelineFactory` instead of letting the
|
|
5
|
-
* provider load real ONNX models — we'd otherwise download ~250 MB
|
|
6
|
-
* on every CI run. The factory returns a stub pipeline that mirrors
|
|
7
|
-
* the Transformers.js return shape (Tensor with .tolist()).
|
|
8
|
-
*
|
|
9
|
-
* Real model loading is covered by an opt-in integration test that
|
|
10
|
-
* runs only when LOXIA_RUN_LOCAL_EMBED_E2E=1.
|
|
11
|
-
*
|
|
12
|
-
* What this pins:
|
|
13
|
-
* - Lazy model load (no work at construction; first embed triggers it)
|
|
14
|
-
* - Load failure is sticky — repeated calls don't retry forever
|
|
15
|
-
* - Concurrent first-calls dedup the load (no double download)
|
|
16
|
-
* - nomic prefix applied to query vs document
|
|
17
|
-
* - BGE prefix applied to query only
|
|
18
|
-
* - 1-D pipeline output gets wrapped back into 2-D (Transformers.js
|
|
19
|
-
* versioning quirk we defend against)
|
|
20
|
-
* - getModelFingerprint changes when model changes
|
|
21
|
-
* - warmup() forces the load + can be called repeatedly safely
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { describe, test, expect, jest } from '@jest/globals';
|
|
25
|
-
import {
|
|
26
|
-
LocalEmbeddingProvider,
|
|
27
|
-
LOCAL_MODELS,
|
|
28
|
-
DEFAULT_LOCAL_MODEL,
|
|
29
|
-
} from '../providers/localProvider.js';
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Build a stub pipeline that records every call and returns a
|
|
34
|
-
* Transformers.js-shape Tensor-like.
|
|
35
|
-
*/
|
|
36
|
-
function makeStubPipeline({ dimensions, returnShape = '2d' } = {}) {
|
|
37
|
-
const calls = [];
|
|
38
|
-
const pipe = jest.fn(async (input, options) => {
|
|
39
|
-
calls.push({ input, options });
|
|
40
|
-
const inputs = Array.isArray(input) ? input : [input];
|
|
41
|
-
const matrix = inputs.map((text, i) =>
|
|
42
|
-
// Distinct, non-zero vectors per input so order can be verified.
|
|
43
|
-
Array.from({ length: dimensions }, (_, j) => (i + 1) * (j + 1) * 0.1 + text.length * 0.001),
|
|
44
|
-
);
|
|
45
|
-
if (returnShape === '1d' && matrix.length === 1) {
|
|
46
|
-
// Simulate a Transformers.js version that returns 1-D for single input.
|
|
47
|
-
return { tolist: () => matrix[0] };
|
|
48
|
-
}
|
|
49
|
-
return { tolist: () => matrix };
|
|
50
|
-
});
|
|
51
|
-
pipe._calls = calls;
|
|
52
|
-
return pipe;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
describe('LocalEmbeddingProvider — defaults + info', () => {
|
|
56
|
-
test('default model is nomic-embed-text-v1.5', () => {
|
|
57
|
-
const p = new LocalEmbeddingProvider();
|
|
58
|
-
const info = p.getInfo();
|
|
59
|
-
expect(info.name).toBe('local');
|
|
60
|
-
expect(info.modelId).toBe(DEFAULT_LOCAL_MODEL);
|
|
61
|
-
expect(info.dimensions).toBe(768);
|
|
62
|
-
expect(info.isLocal).toBe(true);
|
|
63
|
-
expect(info.distinguishesQueryAndDocument).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('known models auto-discover their dimensions', () => {
|
|
67
|
-
const bge = new LocalEmbeddingProvider({ modelId: 'Xenova/bge-small-en-v1.5' });
|
|
68
|
-
expect(bge.getInfo().dimensions).toBe(384);
|
|
69
|
-
const mini = new LocalEmbeddingProvider({ modelId: 'Xenova/all-MiniLM-L6-v2' });
|
|
70
|
-
expect(mini.getInfo().dimensions).toBe(384);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
test('unknown models default to 768 dims (safe fallback)', () => {
|
|
74
|
-
const p = new LocalEmbeddingProvider({ modelId: 'Custom/some-unknown' });
|
|
75
|
-
expect(p.getInfo().dimensions).toBe(768);
|
|
76
|
-
expect(p.getInfo().distinguishesQueryAndDocument).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test('LOCAL_MODELS table includes all three sanctioned models', () => {
|
|
80
|
-
expect(Object.keys(LOCAL_MODELS).sort()).toEqual([
|
|
81
|
-
'Xenova/all-MiniLM-L6-v2',
|
|
82
|
-
'Xenova/bge-small-en-v1.5',
|
|
83
|
-
'Xenova/nomic-embed-text-v1.5',
|
|
84
|
-
]);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test('getModelFingerprint includes modelId', () => {
|
|
88
|
-
const a = new LocalEmbeddingProvider();
|
|
89
|
-
const b = new LocalEmbeddingProvider({ modelId: 'Xenova/bge-small-en-v1.5' });
|
|
90
|
-
expect(a.getModelFingerprint()).toBe('local:Xenova/nomic-embed-text-v1.5');
|
|
91
|
-
expect(b.getModelFingerprint()).toBe('local:Xenova/bge-small-en-v1.5');
|
|
92
|
-
expect(a.getModelFingerprint()).not.toBe(b.getModelFingerprint());
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
describe('LocalEmbeddingProvider — health + lazy load', () => {
|
|
97
|
-
test('health() reports not-loaded BEFORE first embed call', async () => {
|
|
98
|
-
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
99
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
100
|
-
const h = await p.health();
|
|
101
|
-
expect(h.ok).toBe(false);
|
|
102
|
-
expect(h.reason).toMatch(/not loaded/);
|
|
103
|
-
expect(factory).not.toHaveBeenCalled(); // construction is free
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test('health() reports ok after model loads', async () => {
|
|
107
|
-
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
108
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
109
|
-
await p.warmup();
|
|
110
|
-
expect(await p.health()).toEqual({ ok: true });
|
|
111
|
-
expect(factory).toHaveBeenCalledTimes(1);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
test('concurrent first-calls dedup the load (factory called once)', async () => {
|
|
115
|
-
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
116
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
117
|
-
// Fire 3 concurrent loads; they should all settle on the same pipeline.
|
|
118
|
-
const [a, b, c] = await Promise.all([
|
|
119
|
-
p.embedDocuments(['x']),
|
|
120
|
-
p.embedDocuments(['y']),
|
|
121
|
-
p.embedDocuments(['z']),
|
|
122
|
-
]);
|
|
123
|
-
expect(factory).toHaveBeenCalledTimes(1);
|
|
124
|
-
expect(a).toHaveLength(1);
|
|
125
|
-
expect(b).toHaveLength(1);
|
|
126
|
-
expect(c).toHaveLength(1);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('load failure surfaces as NOT_INITIALIZED with remediation', async () => {
|
|
130
|
-
const factory = jest.fn(async () => { throw new Error('disk full'); });
|
|
131
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
132
|
-
await expect(p.embedDocuments(['x'])).rejects.toMatchObject({
|
|
133
|
-
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
134
|
-
transient: false,
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
|
|
138
|
-
test('load failure is sticky — second call does NOT re-attempt', async () => {
|
|
139
|
-
const factory = jest.fn(async () => { throw new Error('disk full'); });
|
|
140
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
141
|
-
await expect(p.embedDocuments(['x'])).rejects.toThrow();
|
|
142
|
-
await expect(p.embedDocuments(['y'])).rejects.toThrow();
|
|
143
|
-
// Only one load attempt — failure caches.
|
|
144
|
-
expect(factory).toHaveBeenCalledTimes(1);
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test('factory must return a callable', async () => {
|
|
148
|
-
const factory = jest.fn(async () => 'not-callable');
|
|
149
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
150
|
-
await expect(p.embedDocuments(['x'])).rejects.toMatchObject({
|
|
151
|
-
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
describe('LocalEmbeddingProvider — task prefixes', () => {
|
|
157
|
-
test('nomic applies search_query: / search_document: prefixes', async () => {
|
|
158
|
-
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
159
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
160
|
-
await p.embedDocuments(['hello world'], 'document');
|
|
161
|
-
await p.embedQuery('hello world');
|
|
162
|
-
expect(pipe._calls[0].input).toEqual(['search_document: hello world']);
|
|
163
|
-
expect(pipe._calls[1].input).toEqual(['search_query: hello world']);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test('BGE applies query prefix only — documents stay raw', async () => {
|
|
167
|
-
const pipe = makeStubPipeline({ dimensions: 384 });
|
|
168
|
-
const p = new LocalEmbeddingProvider({
|
|
169
|
-
modelId: 'Xenova/bge-small-en-v1.5',
|
|
170
|
-
pipelineFactory: async () => pipe,
|
|
171
|
-
});
|
|
172
|
-
await p.embedDocuments(['raw document'], 'document');
|
|
173
|
-
await p.embedQuery('question');
|
|
174
|
-
expect(pipe._calls[0].input).toEqual(['raw document']);
|
|
175
|
-
expect(pipe._calls[1].input).toEqual([
|
|
176
|
-
'Represent this sentence for searching relevant passages: question',
|
|
177
|
-
]);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test('MiniLM applies no prefix in either direction', async () => {
|
|
181
|
-
const pipe = makeStubPipeline({ dimensions: 384 });
|
|
182
|
-
const p = new LocalEmbeddingProvider({
|
|
183
|
-
modelId: 'Xenova/all-MiniLM-L6-v2',
|
|
184
|
-
pipelineFactory: async () => pipe,
|
|
185
|
-
});
|
|
186
|
-
await p.embedDocuments(['a doc'], 'document');
|
|
187
|
-
await p.embedQuery('a query');
|
|
188
|
-
expect(pipe._calls[0].input).toEqual(['a doc']);
|
|
189
|
-
expect(pipe._calls[1].input).toEqual(['a query']);
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
describe('LocalEmbeddingProvider — pipeline output handling', () => {
|
|
194
|
-
test('pools mean and skips normalize (base class will normalize)', async () => {
|
|
195
|
-
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
196
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
197
|
-
await p.embedQuery('x');
|
|
198
|
-
expect(pipe._calls[0].options).toEqual({ pooling: 'mean', normalize: false });
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
test('1-D output (single input quirk) gets wrapped to 2-D', async () => {
|
|
202
|
-
// Simulate the Transformers.js version that flattens single-input output.
|
|
203
|
-
const pipe = makeStubPipeline({ dimensions: 768, returnShape: '1d' });
|
|
204
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
205
|
-
const [v] = await p.embedDocuments(['just one']);
|
|
206
|
-
expect(v).toBeInstanceOf(Float32Array);
|
|
207
|
-
expect(v.length).toBe(768);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
test('batches respect maxBatchSize across underlying calls', async () => {
|
|
211
|
-
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
212
|
-
const p = new LocalEmbeddingProvider({
|
|
213
|
-
maxBatchSize: 2,
|
|
214
|
-
pipelineFactory: async () => pipe,
|
|
215
|
-
});
|
|
216
|
-
await p.embedDocuments(['a', 'b', 'c', 'd', 'e']);
|
|
217
|
-
expect(pipe).toHaveBeenCalledTimes(3);
|
|
218
|
-
expect(pipe._calls[0].input).toHaveLength(2);
|
|
219
|
-
expect(pipe._calls[2].input).toHaveLength(1);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
test('returned vectors are L2-normalized (base-class contract)', async () => {
|
|
223
|
-
const pipe = makeStubPipeline({ dimensions: 8 });
|
|
224
|
-
const p = new LocalEmbeddingProvider({
|
|
225
|
-
modelId: 'Xenova/bge-small-en-v1.5', // 384-dim known, but stub returns 8
|
|
226
|
-
pipelineFactory: async () => pipe,
|
|
227
|
-
});
|
|
228
|
-
// Override dims so the test isn't blocked by the 384-vs-8 mismatch.
|
|
229
|
-
p._dimensions = 8;
|
|
230
|
-
const [v] = await p.embedDocuments(['x']);
|
|
231
|
-
let sum = 0;
|
|
232
|
-
for (let i = 0; i < v.length; i++) sum += v[i] * v[i];
|
|
233
|
-
expect(Math.sqrt(sum)).toBeCloseTo(1, 6);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
test('pipeline inference error → PROVIDER_UNAVAILABLE (transient)', async () => {
|
|
237
|
-
const failingPipe = jest.fn(async () => { throw new Error('OOM'); });
|
|
238
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => failingPipe });
|
|
239
|
-
await expect(p.embedQuery('hi')).rejects.toMatchObject({
|
|
240
|
-
code: EMBEDDING_ERROR_CODES.PROVIDER_UNAVAILABLE,
|
|
241
|
-
transient: true,
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
describe('LocalEmbeddingProvider — warmup', () => {
|
|
247
|
-
test('warmup() is idempotent', async () => {
|
|
248
|
-
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
249
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
250
|
-
await p.warmup();
|
|
251
|
-
await p.warmup();
|
|
252
|
-
await p.warmup();
|
|
253
|
-
expect(factory).toHaveBeenCalledTimes(1);
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
test('warmup() throws when load fails', async () => {
|
|
257
|
-
const factory = jest.fn(async () => { throw new Error('no internet'); });
|
|
258
|
-
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
259
|
-
await expect(p.warmup()).rejects.toMatchObject({
|
|
260
|
-
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* Tests for LocalEmbeddingProvider.
|
|
3
|
+
*
|
|
4
|
+
* Key design: tests inject a `pipelineFactory` instead of letting the
|
|
5
|
+
* provider load real ONNX models — we'd otherwise download ~250 MB
|
|
6
|
+
* on every CI run. The factory returns a stub pipeline that mirrors
|
|
7
|
+
* the Transformers.js return shape (Tensor with .tolist()).
|
|
8
|
+
*
|
|
9
|
+
* Real model loading is covered by an opt-in integration test that
|
|
10
|
+
* runs only when LOXIA_RUN_LOCAL_EMBED_E2E=1.
|
|
11
|
+
*
|
|
12
|
+
* What this pins:
|
|
13
|
+
* - Lazy model load (no work at construction; first embed triggers it)
|
|
14
|
+
* - Load failure is sticky — repeated calls don't retry forever
|
|
15
|
+
* - Concurrent first-calls dedup the load (no double download)
|
|
16
|
+
* - nomic prefix applied to query vs document
|
|
17
|
+
* - BGE prefix applied to query only
|
|
18
|
+
* - 1-D pipeline output gets wrapped back into 2-D (Transformers.js
|
|
19
|
+
* versioning quirk we defend against)
|
|
20
|
+
* - getModelFingerprint changes when model changes
|
|
21
|
+
* - warmup() forces the load + can be called repeatedly safely
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { describe, test, expect, jest } from '@jest/globals';
|
|
25
|
+
import {
|
|
26
|
+
LocalEmbeddingProvider,
|
|
27
|
+
LOCAL_MODELS,
|
|
28
|
+
DEFAULT_LOCAL_MODEL,
|
|
29
|
+
} from '../providers/localProvider.js';
|
|
30
|
+
import { EMBEDDING_ERROR_CODES } from '../providerInterface.js';
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Build a stub pipeline that records every call and returns a
|
|
34
|
+
* Transformers.js-shape Tensor-like.
|
|
35
|
+
*/
|
|
36
|
+
function makeStubPipeline({ dimensions, returnShape = '2d' } = {}) {
|
|
37
|
+
const calls = [];
|
|
38
|
+
const pipe = jest.fn(async (input, options) => {
|
|
39
|
+
calls.push({ input, options });
|
|
40
|
+
const inputs = Array.isArray(input) ? input : [input];
|
|
41
|
+
const matrix = inputs.map((text, i) =>
|
|
42
|
+
// Distinct, non-zero vectors per input so order can be verified.
|
|
43
|
+
Array.from({ length: dimensions }, (_, j) => (i + 1) * (j + 1) * 0.1 + text.length * 0.001),
|
|
44
|
+
);
|
|
45
|
+
if (returnShape === '1d' && matrix.length === 1) {
|
|
46
|
+
// Simulate a Transformers.js version that returns 1-D for single input.
|
|
47
|
+
return { tolist: () => matrix[0] };
|
|
48
|
+
}
|
|
49
|
+
return { tolist: () => matrix };
|
|
50
|
+
});
|
|
51
|
+
pipe._calls = calls;
|
|
52
|
+
return pipe;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe('LocalEmbeddingProvider — defaults + info', () => {
|
|
56
|
+
test('default model is nomic-embed-text-v1.5', () => {
|
|
57
|
+
const p = new LocalEmbeddingProvider();
|
|
58
|
+
const info = p.getInfo();
|
|
59
|
+
expect(info.name).toBe('local');
|
|
60
|
+
expect(info.modelId).toBe(DEFAULT_LOCAL_MODEL);
|
|
61
|
+
expect(info.dimensions).toBe(768);
|
|
62
|
+
expect(info.isLocal).toBe(true);
|
|
63
|
+
expect(info.distinguishesQueryAndDocument).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('known models auto-discover their dimensions', () => {
|
|
67
|
+
const bge = new LocalEmbeddingProvider({ modelId: 'Xenova/bge-small-en-v1.5' });
|
|
68
|
+
expect(bge.getInfo().dimensions).toBe(384);
|
|
69
|
+
const mini = new LocalEmbeddingProvider({ modelId: 'Xenova/all-MiniLM-L6-v2' });
|
|
70
|
+
expect(mini.getInfo().dimensions).toBe(384);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('unknown models default to 768 dims (safe fallback)', () => {
|
|
74
|
+
const p = new LocalEmbeddingProvider({ modelId: 'Custom/some-unknown' });
|
|
75
|
+
expect(p.getInfo().dimensions).toBe(768);
|
|
76
|
+
expect(p.getInfo().distinguishesQueryAndDocument).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('LOCAL_MODELS table includes all three sanctioned models', () => {
|
|
80
|
+
expect(Object.keys(LOCAL_MODELS).sort()).toEqual([
|
|
81
|
+
'Xenova/all-MiniLM-L6-v2',
|
|
82
|
+
'Xenova/bge-small-en-v1.5',
|
|
83
|
+
'Xenova/nomic-embed-text-v1.5',
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('getModelFingerprint includes modelId', () => {
|
|
88
|
+
const a = new LocalEmbeddingProvider();
|
|
89
|
+
const b = new LocalEmbeddingProvider({ modelId: 'Xenova/bge-small-en-v1.5' });
|
|
90
|
+
expect(a.getModelFingerprint()).toBe('local:Xenova/nomic-embed-text-v1.5');
|
|
91
|
+
expect(b.getModelFingerprint()).toBe('local:Xenova/bge-small-en-v1.5');
|
|
92
|
+
expect(a.getModelFingerprint()).not.toBe(b.getModelFingerprint());
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('LocalEmbeddingProvider — health + lazy load', () => {
|
|
97
|
+
test('health() reports not-loaded BEFORE first embed call', async () => {
|
|
98
|
+
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
99
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
100
|
+
const h = await p.health();
|
|
101
|
+
expect(h.ok).toBe(false);
|
|
102
|
+
expect(h.reason).toMatch(/not loaded/);
|
|
103
|
+
expect(factory).not.toHaveBeenCalled(); // construction is free
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('health() reports ok after model loads', async () => {
|
|
107
|
+
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
108
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
109
|
+
await p.warmup();
|
|
110
|
+
expect(await p.health()).toEqual({ ok: true });
|
|
111
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('concurrent first-calls dedup the load (factory called once)', async () => {
|
|
115
|
+
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
116
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
117
|
+
// Fire 3 concurrent loads; they should all settle on the same pipeline.
|
|
118
|
+
const [a, b, c] = await Promise.all([
|
|
119
|
+
p.embedDocuments(['x']),
|
|
120
|
+
p.embedDocuments(['y']),
|
|
121
|
+
p.embedDocuments(['z']),
|
|
122
|
+
]);
|
|
123
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
124
|
+
expect(a).toHaveLength(1);
|
|
125
|
+
expect(b).toHaveLength(1);
|
|
126
|
+
expect(c).toHaveLength(1);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('load failure surfaces as NOT_INITIALIZED with remediation', async () => {
|
|
130
|
+
const factory = jest.fn(async () => { throw new Error('disk full'); });
|
|
131
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
132
|
+
await expect(p.embedDocuments(['x'])).rejects.toMatchObject({
|
|
133
|
+
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
134
|
+
transient: false,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('load failure is sticky — second call does NOT re-attempt', async () => {
|
|
139
|
+
const factory = jest.fn(async () => { throw new Error('disk full'); });
|
|
140
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
141
|
+
await expect(p.embedDocuments(['x'])).rejects.toThrow();
|
|
142
|
+
await expect(p.embedDocuments(['y'])).rejects.toThrow();
|
|
143
|
+
// Only one load attempt — failure caches.
|
|
144
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('factory must return a callable', async () => {
|
|
148
|
+
const factory = jest.fn(async () => 'not-callable');
|
|
149
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
150
|
+
await expect(p.embedDocuments(['x'])).rejects.toMatchObject({
|
|
151
|
+
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('LocalEmbeddingProvider — task prefixes', () => {
|
|
157
|
+
test('nomic applies search_query: / search_document: prefixes', async () => {
|
|
158
|
+
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
159
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
160
|
+
await p.embedDocuments(['hello world'], 'document');
|
|
161
|
+
await p.embedQuery('hello world');
|
|
162
|
+
expect(pipe._calls[0].input).toEqual(['search_document: hello world']);
|
|
163
|
+
expect(pipe._calls[1].input).toEqual(['search_query: hello world']);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('BGE applies query prefix only — documents stay raw', async () => {
|
|
167
|
+
const pipe = makeStubPipeline({ dimensions: 384 });
|
|
168
|
+
const p = new LocalEmbeddingProvider({
|
|
169
|
+
modelId: 'Xenova/bge-small-en-v1.5',
|
|
170
|
+
pipelineFactory: async () => pipe,
|
|
171
|
+
});
|
|
172
|
+
await p.embedDocuments(['raw document'], 'document');
|
|
173
|
+
await p.embedQuery('question');
|
|
174
|
+
expect(pipe._calls[0].input).toEqual(['raw document']);
|
|
175
|
+
expect(pipe._calls[1].input).toEqual([
|
|
176
|
+
'Represent this sentence for searching relevant passages: question',
|
|
177
|
+
]);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('MiniLM applies no prefix in either direction', async () => {
|
|
181
|
+
const pipe = makeStubPipeline({ dimensions: 384 });
|
|
182
|
+
const p = new LocalEmbeddingProvider({
|
|
183
|
+
modelId: 'Xenova/all-MiniLM-L6-v2',
|
|
184
|
+
pipelineFactory: async () => pipe,
|
|
185
|
+
});
|
|
186
|
+
await p.embedDocuments(['a doc'], 'document');
|
|
187
|
+
await p.embedQuery('a query');
|
|
188
|
+
expect(pipe._calls[0].input).toEqual(['a doc']);
|
|
189
|
+
expect(pipe._calls[1].input).toEqual(['a query']);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe('LocalEmbeddingProvider — pipeline output handling', () => {
|
|
194
|
+
test('pools mean and skips normalize (base class will normalize)', async () => {
|
|
195
|
+
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
196
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
197
|
+
await p.embedQuery('x');
|
|
198
|
+
expect(pipe._calls[0].options).toEqual({ pooling: 'mean', normalize: false });
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('1-D output (single input quirk) gets wrapped to 2-D', async () => {
|
|
202
|
+
// Simulate the Transformers.js version that flattens single-input output.
|
|
203
|
+
const pipe = makeStubPipeline({ dimensions: 768, returnShape: '1d' });
|
|
204
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => pipe });
|
|
205
|
+
const [v] = await p.embedDocuments(['just one']);
|
|
206
|
+
expect(v).toBeInstanceOf(Float32Array);
|
|
207
|
+
expect(v.length).toBe(768);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('batches respect maxBatchSize across underlying calls', async () => {
|
|
211
|
+
const pipe = makeStubPipeline({ dimensions: 768 });
|
|
212
|
+
const p = new LocalEmbeddingProvider({
|
|
213
|
+
maxBatchSize: 2,
|
|
214
|
+
pipelineFactory: async () => pipe,
|
|
215
|
+
});
|
|
216
|
+
await p.embedDocuments(['a', 'b', 'c', 'd', 'e']);
|
|
217
|
+
expect(pipe).toHaveBeenCalledTimes(3);
|
|
218
|
+
expect(pipe._calls[0].input).toHaveLength(2);
|
|
219
|
+
expect(pipe._calls[2].input).toHaveLength(1);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test('returned vectors are L2-normalized (base-class contract)', async () => {
|
|
223
|
+
const pipe = makeStubPipeline({ dimensions: 8 });
|
|
224
|
+
const p = new LocalEmbeddingProvider({
|
|
225
|
+
modelId: 'Xenova/bge-small-en-v1.5', // 384-dim known, but stub returns 8
|
|
226
|
+
pipelineFactory: async () => pipe,
|
|
227
|
+
});
|
|
228
|
+
// Override dims so the test isn't blocked by the 384-vs-8 mismatch.
|
|
229
|
+
p._dimensions = 8;
|
|
230
|
+
const [v] = await p.embedDocuments(['x']);
|
|
231
|
+
let sum = 0;
|
|
232
|
+
for (let i = 0; i < v.length; i++) sum += v[i] * v[i];
|
|
233
|
+
expect(Math.sqrt(sum)).toBeCloseTo(1, 6);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test('pipeline inference error → PROVIDER_UNAVAILABLE (transient)', async () => {
|
|
237
|
+
const failingPipe = jest.fn(async () => { throw new Error('OOM'); });
|
|
238
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: async () => failingPipe });
|
|
239
|
+
await expect(p.embedQuery('hi')).rejects.toMatchObject({
|
|
240
|
+
code: EMBEDDING_ERROR_CODES.PROVIDER_UNAVAILABLE,
|
|
241
|
+
transient: true,
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
describe('LocalEmbeddingProvider — warmup', () => {
|
|
247
|
+
test('warmup() is idempotent', async () => {
|
|
248
|
+
const factory = jest.fn(async () => makeStubPipeline({ dimensions: 768 }));
|
|
249
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
250
|
+
await p.warmup();
|
|
251
|
+
await p.warmup();
|
|
252
|
+
await p.warmup();
|
|
253
|
+
expect(factory).toHaveBeenCalledTimes(1);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test('warmup() throws when load fails', async () => {
|
|
257
|
+
const factory = jest.fn(async () => { throw new Error('no internet'); });
|
|
258
|
+
const p = new LocalEmbeddingProvider({ pipelineFactory: factory });
|
|
259
|
+
await expect(p.warmup()).rejects.toMatchObject({
|
|
260
|
+
code: EMBEDDING_ERROR_CODES.NOT_INITIALIZED,
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
});
|