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,323 +1,323 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ModelsService - Manages available models from the backend API
|
|
3
|
-
*
|
|
4
|
-
* Purpose:
|
|
5
|
-
* - Fetch available models from /api/llm/models endpoint
|
|
6
|
-
* - Cache models for the session
|
|
7
|
-
* - Provide model names for routing
|
|
8
|
-
* - Show errors when API is unavailable
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
class ModelsService {
|
|
12
|
-
constructor(config, logger) {
|
|
13
|
-
this.config = config;
|
|
14
|
-
this.logger = logger;
|
|
15
|
-
|
|
16
|
-
this.models = null;
|
|
17
|
-
this.lastFetched = null;
|
|
18
|
-
this.isLoading = false;
|
|
19
|
-
this.cacheExpiry = 5 * 60 * 1000; // 5 minutes cache
|
|
20
|
-
|
|
21
|
-
// Use config backend URL (set via LOXIA_BACKEND_URL env var), fallback to local server
|
|
22
|
-
this.backendUrl = config.backend?.baseUrl || config.backendUrl || 'http://localhost:8080';
|
|
23
|
-
|
|
24
|
-
// Retry configuration
|
|
25
|
-
this.retryAttempts = 0;
|
|
26
|
-
this.maxRetries = 3;
|
|
27
|
-
this.retryDelay = 2000; // Start with 2 seconds
|
|
28
|
-
this.retryTimer = null;
|
|
29
|
-
this.lastError = null;
|
|
30
|
-
|
|
31
|
-
// API Key Manager reference (will be set by LoxiaSystem)
|
|
32
|
-
this.apiKeyManager = null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Set API key manager instance
|
|
37
|
-
* @param {ApiKeyManager} apiKeyManager - API key manager instance
|
|
38
|
-
*/
|
|
39
|
-
setApiKeyManager(apiKeyManager) {
|
|
40
|
-
this.apiKeyManager = apiKeyManager;
|
|
41
|
-
|
|
42
|
-
this.logger?.info('API key manager set for models service', {
|
|
43
|
-
hasManager: !!apiKeyManager
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Initialize the models service and fetch initial data
|
|
49
|
-
*/
|
|
50
|
-
async initialize() {
|
|
51
|
-
try {
|
|
52
|
-
await this.fetchModels();
|
|
53
|
-
this.logger.info('Models service initialized', {
|
|
54
|
-
modelCount: this.models?.length || 0
|
|
55
|
-
});
|
|
56
|
-
} catch (error) {
|
|
57
|
-
this.lastError = error.message;
|
|
58
|
-
this.logger.error('Failed to initialize models service - NO FALLBACK AVAILABLE', {
|
|
59
|
-
error: error.message,
|
|
60
|
-
endpoint: this.backendUrl,
|
|
61
|
-
willRetry: true
|
|
62
|
-
});
|
|
63
|
-
// Schedule retry instead of using hardcoded fallback
|
|
64
|
-
this._scheduleRetry();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Get available model names for routing
|
|
70
|
-
*/
|
|
71
|
-
getAvailableModelNames() {
|
|
72
|
-
if (!this.models || this.models.length === 0) {
|
|
73
|
-
this.logger.error('No models available - API fetch failed', {
|
|
74
|
-
lastError: this.lastError,
|
|
75
|
-
endpoint: this.backendUrl,
|
|
76
|
-
retryAttempt: this.retryAttempts,
|
|
77
|
-
maxRetries: this.maxRetries
|
|
78
|
-
});
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return this.models.map(model => model.name);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Get all model information
|
|
87
|
-
*/
|
|
88
|
-
getModels() {
|
|
89
|
-
if (!this.models || this.models.length === 0) {
|
|
90
|
-
this.logger.error('No models available - API fetch failed', {
|
|
91
|
-
lastError: this.lastError,
|
|
92
|
-
endpoint: this.backendUrl
|
|
93
|
-
});
|
|
94
|
-
return [];
|
|
95
|
-
}
|
|
96
|
-
return this.models;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Fetch models from backend API
|
|
101
|
-
* @param {Object} context - Optional context with API key
|
|
102
|
-
*/
|
|
103
|
-
async fetchModels(context = null) {
|
|
104
|
-
if (this.isLoading) {
|
|
105
|
-
this.logger.debug('Models fetch already in progress');
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
this.isLoading = true;
|
|
110
|
-
// Local server uses /api prefix, Azure backend doesn't
|
|
111
|
-
const isLocalServer = this.backendUrl.includes('localhost') || this.backendUrl.includes('127.0.0.1');
|
|
112
|
-
const url = isLocalServer ? `${this.backendUrl}/api/llm/models` : `${this.backendUrl}/llm/models`;
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
|
|
116
|
-
// Get API key from multiple sources
|
|
117
|
-
let apiKey = null;
|
|
118
|
-
|
|
119
|
-
// First try to get from API key manager (global storage)
|
|
120
|
-
if (this.apiKeyManager) {
|
|
121
|
-
const keys = this.apiKeyManager.getKeysForRequest(null, {
|
|
122
|
-
platformProvided: true, // Models endpoint uses platform key
|
|
123
|
-
vendor: null
|
|
124
|
-
});
|
|
125
|
-
apiKey = keys.loxiaApiKey;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Fallback to context, config, then environment
|
|
129
|
-
if (!apiKey && context && context.apiKey) {
|
|
130
|
-
apiKey = context.apiKey;
|
|
131
|
-
} else if (!apiKey && this.config.apiKey) {
|
|
132
|
-
apiKey = this.config.apiKey;
|
|
133
|
-
} else if (!apiKey && process.env.LOXIA_API_KEY) {
|
|
134
|
-
apiKey = process.env.LOXIA_API_KEY;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// Use AbortController for timeout (Node.js fetch doesn't support timeout option)
|
|
138
|
-
const controller = new AbortController();
|
|
139
|
-
const timeoutId = setTimeout(() => controller.abort(), 10000);
|
|
140
|
-
|
|
141
|
-
const fetchOptions = {
|
|
142
|
-
method: 'GET',
|
|
143
|
-
headers: {
|
|
144
|
-
'Content-Type': 'application/json',
|
|
145
|
-
...(apiKey && { 'Authorization': `Bearer ${apiKey}` })
|
|
146
|
-
},
|
|
147
|
-
signal: controller.signal
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
this.logger.debug('Fetching models from backend', {
|
|
151
|
-
url,
|
|
152
|
-
hasApiKey: !!apiKey,
|
|
153
|
-
apiKeySource: context?.apiKey ? 'context' : this.config.apiKey ? 'config' : process.env.LOXIA_API_KEY ? 'env' : 'none'
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
let response;
|
|
157
|
-
try {
|
|
158
|
-
response = await fetch(url, fetchOptions);
|
|
159
|
-
clearTimeout(timeoutId);
|
|
160
|
-
} catch (fetchError) {
|
|
161
|
-
clearTimeout(timeoutId);
|
|
162
|
-
if (fetchError.name === 'AbortError') {
|
|
163
|
-
throw new Error('Request timeout after 10 seconds');
|
|
164
|
-
}
|
|
165
|
-
throw fetchError;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
if (!response.ok) {
|
|
169
|
-
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
const data = await response.json();
|
|
173
|
-
|
|
174
|
-
if (data.models && Array.isArray(data.models)) {
|
|
175
|
-
this.models = data.models;
|
|
176
|
-
this.lastFetched = new Date();
|
|
177
|
-
this.needsRefresh = false;
|
|
178
|
-
|
|
179
|
-
this.logger.info('Models fetched from backend', {
|
|
180
|
-
modelCount: this.models.length,
|
|
181
|
-
models: this.models.map(m => m.name)
|
|
182
|
-
});
|
|
183
|
-
} else {
|
|
184
|
-
throw new Error('Invalid response format from models API');
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
} catch (error) {
|
|
188
|
-
this.lastError = error.message;
|
|
189
|
-
this.logger.error('Failed to fetch models from backend - NO FALLBACK', {
|
|
190
|
-
error: error.message,
|
|
191
|
-
endpoint: url,
|
|
192
|
-
retryAttempt: this.retryAttempts,
|
|
193
|
-
maxRetries: this.maxRetries
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// Schedule retry instead of using fallback
|
|
197
|
-
this._scheduleRetry(context);
|
|
198
|
-
|
|
199
|
-
// Rethrow if this was initial fetch and we have no models yet
|
|
200
|
-
if (!this.models) {
|
|
201
|
-
throw error;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
} finally {
|
|
205
|
-
this.isLoading = false;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Check if models cache needs refresh
|
|
211
|
-
*/
|
|
212
|
-
needsRefresh() {
|
|
213
|
-
if (!this.lastFetched) return true;
|
|
214
|
-
|
|
215
|
-
const timeSinceUpdate = Date.now() - this.lastFetched.getTime();
|
|
216
|
-
return timeSinceUpdate > this.cacheExpiry;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Force refresh models from backend
|
|
221
|
-
* @param {Object} context - Optional context with API key
|
|
222
|
-
*/
|
|
223
|
-
async refresh(context = null) {
|
|
224
|
-
this.logger.info('Force refreshing models');
|
|
225
|
-
await this.fetchModels(context);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Refresh models with API key context if needed
|
|
230
|
-
* @param {Object} context - Context with API key
|
|
231
|
-
*/
|
|
232
|
-
async refreshWithContext(context) {
|
|
233
|
-
// Only refresh if we haven't successfully fetched or if we need a refresh
|
|
234
|
-
if (this.needsRefresh || !this.lastFetched) {
|
|
235
|
-
this.logger.debug('Refreshing models with API key context');
|
|
236
|
-
await this.fetchModels(context);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Schedule retry for failed model fetch
|
|
242
|
-
* Implements exponential backoff
|
|
243
|
-
* @private
|
|
244
|
-
*/
|
|
245
|
-
_scheduleRetry(context = null) {
|
|
246
|
-
// Clear any existing retry timer
|
|
247
|
-
if (this.retryTimer) {
|
|
248
|
-
clearTimeout(this.retryTimer);
|
|
249
|
-
this.retryTimer = null;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Check if we've exceeded max retries
|
|
253
|
-
if (this.retryAttempts >= this.maxRetries) {
|
|
254
|
-
this.logger.error('Max retry attempts reached for model fetch', {
|
|
255
|
-
attempts: this.retryAttempts,
|
|
256
|
-
maxRetries: this.maxRetries,
|
|
257
|
-
lastError: this.lastError
|
|
258
|
-
});
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Calculate delay with exponential backoff: 2s, 4s, 8s, etc.
|
|
263
|
-
const delay = this.retryDelay * Math.pow(2, this.retryAttempts);
|
|
264
|
-
this.retryAttempts++;
|
|
265
|
-
|
|
266
|
-
this.logger.info('Scheduling model fetch retry', {
|
|
267
|
-
attempt: this.retryAttempts,
|
|
268
|
-
maxRetries: this.maxRetries,
|
|
269
|
-
delayMs: delay
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
// Schedule retry
|
|
273
|
-
this.retryTimer = setTimeout(async () => {
|
|
274
|
-
this.logger.info('Executing scheduled model fetch retry', {
|
|
275
|
-
attempt: this.retryAttempts
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
try {
|
|
279
|
-
await this.fetchModels(context);
|
|
280
|
-
// Success - reset retry counter
|
|
281
|
-
this.retryAttempts = 0;
|
|
282
|
-
this.lastError = null;
|
|
283
|
-
} catch (error) {
|
|
284
|
-
// fetchModels will handle scheduling next retry
|
|
285
|
-
this.logger.warn('Retry attempt failed', {
|
|
286
|
-
attempt: this.retryAttempts,
|
|
287
|
-
error: error.message
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}, delay);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Cancel any pending retry
|
|
295
|
-
* @private
|
|
296
|
-
*/
|
|
297
|
-
_cancelRetry() {
|
|
298
|
-
if (this.retryTimer) {
|
|
299
|
-
clearTimeout(this.retryTimer);
|
|
300
|
-
this.retryTimer = null;
|
|
301
|
-
this.logger.debug('Cancelled pending model fetch retry');
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/**
|
|
306
|
-
* Get service status
|
|
307
|
-
*/
|
|
308
|
-
getStatus() {
|
|
309
|
-
return {
|
|
310
|
-
initialized: !!this.models,
|
|
311
|
-
lastFetched: this.lastFetched?.toISOString() || null,
|
|
312
|
-
modelCount: this.models?.length || 0,
|
|
313
|
-
isLoading: this.isLoading,
|
|
314
|
-
needsRefresh: this.needsRefresh(),
|
|
315
|
-
error: this.lastError || null,
|
|
316
|
-
retryAttempts: this.retryAttempts,
|
|
317
|
-
maxRetries: this.maxRetries,
|
|
318
|
-
hasError: !!this.lastError
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
1
|
+
/**
|
|
2
|
+
* ModelsService - Manages available models from the backend API
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* - Fetch available models from /api/llm/models endpoint
|
|
6
|
+
* - Cache models for the session
|
|
7
|
+
* - Provide model names for routing
|
|
8
|
+
* - Show errors when API is unavailable
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
class ModelsService {
|
|
12
|
+
constructor(config, logger) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
|
|
16
|
+
this.models = null;
|
|
17
|
+
this.lastFetched = null;
|
|
18
|
+
this.isLoading = false;
|
|
19
|
+
this.cacheExpiry = 5 * 60 * 1000; // 5 minutes cache
|
|
20
|
+
|
|
21
|
+
// Use config backend URL (set via LOXIA_BACKEND_URL env var), fallback to local server
|
|
22
|
+
this.backendUrl = config.backend?.baseUrl || config.backendUrl || 'http://localhost:8080';
|
|
23
|
+
|
|
24
|
+
// Retry configuration
|
|
25
|
+
this.retryAttempts = 0;
|
|
26
|
+
this.maxRetries = 3;
|
|
27
|
+
this.retryDelay = 2000; // Start with 2 seconds
|
|
28
|
+
this.retryTimer = null;
|
|
29
|
+
this.lastError = null;
|
|
30
|
+
|
|
31
|
+
// API Key Manager reference (will be set by LoxiaSystem)
|
|
32
|
+
this.apiKeyManager = null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Set API key manager instance
|
|
37
|
+
* @param {ApiKeyManager} apiKeyManager - API key manager instance
|
|
38
|
+
*/
|
|
39
|
+
setApiKeyManager(apiKeyManager) {
|
|
40
|
+
this.apiKeyManager = apiKeyManager;
|
|
41
|
+
|
|
42
|
+
this.logger?.info('API key manager set for models service', {
|
|
43
|
+
hasManager: !!apiKeyManager
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Initialize the models service and fetch initial data
|
|
49
|
+
*/
|
|
50
|
+
async initialize() {
|
|
51
|
+
try {
|
|
52
|
+
await this.fetchModels();
|
|
53
|
+
this.logger.info('Models service initialized', {
|
|
54
|
+
modelCount: this.models?.length || 0
|
|
55
|
+
});
|
|
56
|
+
} catch (error) {
|
|
57
|
+
this.lastError = error.message;
|
|
58
|
+
this.logger.error('Failed to initialize models service - NO FALLBACK AVAILABLE', {
|
|
59
|
+
error: error.message,
|
|
60
|
+
endpoint: this.backendUrl,
|
|
61
|
+
willRetry: true
|
|
62
|
+
});
|
|
63
|
+
// Schedule retry instead of using hardcoded fallback
|
|
64
|
+
this._scheduleRetry();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Get available model names for routing
|
|
70
|
+
*/
|
|
71
|
+
getAvailableModelNames() {
|
|
72
|
+
if (!this.models || this.models.length === 0) {
|
|
73
|
+
this.logger.error('No models available - API fetch failed', {
|
|
74
|
+
lastError: this.lastError,
|
|
75
|
+
endpoint: this.backendUrl,
|
|
76
|
+
retryAttempt: this.retryAttempts,
|
|
77
|
+
maxRetries: this.maxRetries
|
|
78
|
+
});
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return this.models.map(model => model.name);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get all model information
|
|
87
|
+
*/
|
|
88
|
+
getModels() {
|
|
89
|
+
if (!this.models || this.models.length === 0) {
|
|
90
|
+
this.logger.error('No models available - API fetch failed', {
|
|
91
|
+
lastError: this.lastError,
|
|
92
|
+
endpoint: this.backendUrl
|
|
93
|
+
});
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
return this.models;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Fetch models from backend API
|
|
101
|
+
* @param {Object} context - Optional context with API key
|
|
102
|
+
*/
|
|
103
|
+
async fetchModels(context = null) {
|
|
104
|
+
if (this.isLoading) {
|
|
105
|
+
this.logger.debug('Models fetch already in progress');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
this.isLoading = true;
|
|
110
|
+
// Local server uses /api prefix, Azure backend doesn't
|
|
111
|
+
const isLocalServer = this.backendUrl.includes('localhost') || this.backendUrl.includes('127.0.0.1');
|
|
112
|
+
const url = isLocalServer ? `${this.backendUrl}/api/llm/models` : `${this.backendUrl}/llm/models`;
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
|
|
116
|
+
// Get API key from multiple sources
|
|
117
|
+
let apiKey = null;
|
|
118
|
+
|
|
119
|
+
// First try to get from API key manager (global storage)
|
|
120
|
+
if (this.apiKeyManager) {
|
|
121
|
+
const keys = this.apiKeyManager.getKeysForRequest(null, {
|
|
122
|
+
platformProvided: true, // Models endpoint uses platform key
|
|
123
|
+
vendor: null
|
|
124
|
+
});
|
|
125
|
+
apiKey = keys.loxiaApiKey;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Fallback to context, config, then environment
|
|
129
|
+
if (!apiKey && context && context.apiKey) {
|
|
130
|
+
apiKey = context.apiKey;
|
|
131
|
+
} else if (!apiKey && this.config.apiKey) {
|
|
132
|
+
apiKey = this.config.apiKey;
|
|
133
|
+
} else if (!apiKey && process.env.LOXIA_API_KEY) {
|
|
134
|
+
apiKey = process.env.LOXIA_API_KEY;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Use AbortController for timeout (Node.js fetch doesn't support timeout option)
|
|
138
|
+
const controller = new AbortController();
|
|
139
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000);
|
|
140
|
+
|
|
141
|
+
const fetchOptions = {
|
|
142
|
+
method: 'GET',
|
|
143
|
+
headers: {
|
|
144
|
+
'Content-Type': 'application/json',
|
|
145
|
+
...(apiKey && { 'Authorization': `Bearer ${apiKey}` })
|
|
146
|
+
},
|
|
147
|
+
signal: controller.signal
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
this.logger.debug('Fetching models from backend', {
|
|
151
|
+
url,
|
|
152
|
+
hasApiKey: !!apiKey,
|
|
153
|
+
apiKeySource: context?.apiKey ? 'context' : this.config.apiKey ? 'config' : process.env.LOXIA_API_KEY ? 'env' : 'none'
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
let response;
|
|
157
|
+
try {
|
|
158
|
+
response = await fetch(url, fetchOptions);
|
|
159
|
+
clearTimeout(timeoutId);
|
|
160
|
+
} catch (fetchError) {
|
|
161
|
+
clearTimeout(timeoutId);
|
|
162
|
+
if (fetchError.name === 'AbortError') {
|
|
163
|
+
throw new Error('Request timeout after 10 seconds', { cause: fetchError });
|
|
164
|
+
}
|
|
165
|
+
throw fetchError;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (!response.ok) {
|
|
169
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const data = await response.json();
|
|
173
|
+
|
|
174
|
+
if (data.models && Array.isArray(data.models)) {
|
|
175
|
+
this.models = data.models;
|
|
176
|
+
this.lastFetched = new Date();
|
|
177
|
+
this.needsRefresh = false;
|
|
178
|
+
|
|
179
|
+
this.logger.info('Models fetched from backend', {
|
|
180
|
+
modelCount: this.models.length,
|
|
181
|
+
models: this.models.map(m => m.name)
|
|
182
|
+
});
|
|
183
|
+
} else {
|
|
184
|
+
throw new Error('Invalid response format from models API');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
} catch (error) {
|
|
188
|
+
this.lastError = error.message;
|
|
189
|
+
this.logger.error('Failed to fetch models from backend - NO FALLBACK', {
|
|
190
|
+
error: error.message,
|
|
191
|
+
endpoint: url,
|
|
192
|
+
retryAttempt: this.retryAttempts,
|
|
193
|
+
maxRetries: this.maxRetries
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
// Schedule retry instead of using fallback
|
|
197
|
+
this._scheduleRetry(context);
|
|
198
|
+
|
|
199
|
+
// Rethrow if this was initial fetch and we have no models yet
|
|
200
|
+
if (!this.models) {
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
} finally {
|
|
205
|
+
this.isLoading = false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Check if models cache needs refresh
|
|
211
|
+
*/
|
|
212
|
+
needsRefresh() {
|
|
213
|
+
if (!this.lastFetched) return true;
|
|
214
|
+
|
|
215
|
+
const timeSinceUpdate = Date.now() - this.lastFetched.getTime();
|
|
216
|
+
return timeSinceUpdate > this.cacheExpiry;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Force refresh models from backend
|
|
221
|
+
* @param {Object} context - Optional context with API key
|
|
222
|
+
*/
|
|
223
|
+
async refresh(context = null) {
|
|
224
|
+
this.logger.info('Force refreshing models');
|
|
225
|
+
await this.fetchModels(context);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Refresh models with API key context if needed
|
|
230
|
+
* @param {Object} context - Context with API key
|
|
231
|
+
*/
|
|
232
|
+
async refreshWithContext(context) {
|
|
233
|
+
// Only refresh if we haven't successfully fetched or if we need a refresh
|
|
234
|
+
if (this.needsRefresh || !this.lastFetched) {
|
|
235
|
+
this.logger.debug('Refreshing models with API key context');
|
|
236
|
+
await this.fetchModels(context);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Schedule retry for failed model fetch
|
|
242
|
+
* Implements exponential backoff
|
|
243
|
+
* @private
|
|
244
|
+
*/
|
|
245
|
+
_scheduleRetry(context = null) {
|
|
246
|
+
// Clear any existing retry timer
|
|
247
|
+
if (this.retryTimer) {
|
|
248
|
+
clearTimeout(this.retryTimer);
|
|
249
|
+
this.retryTimer = null;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Check if we've exceeded max retries
|
|
253
|
+
if (this.retryAttempts >= this.maxRetries) {
|
|
254
|
+
this.logger.error('Max retry attempts reached for model fetch', {
|
|
255
|
+
attempts: this.retryAttempts,
|
|
256
|
+
maxRetries: this.maxRetries,
|
|
257
|
+
lastError: this.lastError
|
|
258
|
+
});
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Calculate delay with exponential backoff: 2s, 4s, 8s, etc.
|
|
263
|
+
const delay = this.retryDelay * Math.pow(2, this.retryAttempts);
|
|
264
|
+
this.retryAttempts++;
|
|
265
|
+
|
|
266
|
+
this.logger.info('Scheduling model fetch retry', {
|
|
267
|
+
attempt: this.retryAttempts,
|
|
268
|
+
maxRetries: this.maxRetries,
|
|
269
|
+
delayMs: delay
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
// Schedule retry
|
|
273
|
+
this.retryTimer = setTimeout(async () => {
|
|
274
|
+
this.logger.info('Executing scheduled model fetch retry', {
|
|
275
|
+
attempt: this.retryAttempts
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
try {
|
|
279
|
+
await this.fetchModels(context);
|
|
280
|
+
// Success - reset retry counter
|
|
281
|
+
this.retryAttempts = 0;
|
|
282
|
+
this.lastError = null;
|
|
283
|
+
} catch (error) {
|
|
284
|
+
// fetchModels will handle scheduling next retry
|
|
285
|
+
this.logger.warn('Retry attempt failed', {
|
|
286
|
+
attempt: this.retryAttempts,
|
|
287
|
+
error: error.message
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}, delay);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Cancel any pending retry
|
|
295
|
+
* @private
|
|
296
|
+
*/
|
|
297
|
+
_cancelRetry() {
|
|
298
|
+
if (this.retryTimer) {
|
|
299
|
+
clearTimeout(this.retryTimer);
|
|
300
|
+
this.retryTimer = null;
|
|
301
|
+
this.logger.debug('Cancelled pending model fetch retry');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Get service status
|
|
307
|
+
*/
|
|
308
|
+
getStatus() {
|
|
309
|
+
return {
|
|
310
|
+
initialized: !!this.models,
|
|
311
|
+
lastFetched: this.lastFetched?.toISOString() || null,
|
|
312
|
+
modelCount: this.models?.length || 0,
|
|
313
|
+
isLoading: this.isLoading,
|
|
314
|
+
needsRefresh: this.needsRefresh(),
|
|
315
|
+
error: this.lastError || null,
|
|
316
|
+
retryAttempts: this.retryAttempts,
|
|
317
|
+
maxRetries: this.maxRetries,
|
|
318
|
+
hasError: !!this.lastError
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
323
|
export default ModelsService;
|