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,279 +1,279 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ComposioIndexer — keeps a GLOBAL vector index of the Composio catalog
|
|
3
|
-
* (toolkits × actions) so the agent can find the right action by
|
|
4
|
-
* meaning instead of walking every toolkit's tool list.
|
|
5
|
-
*
|
|
6
|
-
* The discovery problem this solves:
|
|
7
|
-
* - Composio has ~250 toolkits and ~50–200 actions per toolkit.
|
|
8
|
-
* - Today the agent must `list-toolkits` → pick → `list-tools` →
|
|
9
|
-
* scan → pick → `execute`. Three round-trips minimum, more on
|
|
10
|
-
* wrong guesses. Action slugs like SLACK_SEND_DM aren't
|
|
11
|
-
* semantically obvious without their description.
|
|
12
|
-
* - After this indexer is in place: ONE call,
|
|
13
|
-
* `find-action({query: "send a slack DM"})`, returns ranked
|
|
14
|
-
* candidates with their inputSchemas already attached.
|
|
15
|
-
*
|
|
16
|
-
* Why GLOBAL (not per-agent) scope:
|
|
17
|
-
* - The catalog is the same for every agent at any point in time.
|
|
18
|
-
* Per-agent indexes would waste embedding cost N times for the
|
|
19
|
-
* same content.
|
|
20
|
-
* - Per-user connections (which toolkits a user has OAuth'd into)
|
|
21
|
-
* stay per-user; the catalog is read-only metadata.
|
|
22
|
-
*
|
|
23
|
-
* Failure policy (same as memory/reminisce indexers):
|
|
24
|
-
* - All public methods are best-effort. Errors are logged, structured
|
|
25
|
-
* results are returned, nothing throws to the caller. The Composio
|
|
26
|
-
* SDK errors get surfaced in the result rather than crashing the
|
|
27
|
-
* agent.
|
|
28
|
-
*
|
|
29
|
-
* Index lifecycle:
|
|
30
|
-
* - User runs `composio.backfill-actions-index` once after enabling
|
|
31
|
-
* embeddings (or after Composio refreshes its catalog, or after a
|
|
32
|
-
* provider/model swap).
|
|
33
|
-
* - The action then becomes callable. Stale-but-non-empty results
|
|
34
|
-
* are preferred over hard errors; if a toolkit was added since
|
|
35
|
-
* the last backfill, it won't appear until the next one runs.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Pack a Composio action object into the text the embedding model sees.
|
|
40
|
-
* Order matters: displayName first (most concise), then description
|
|
41
|
-
* (most informative), then slug + toolkit hint (identifier signal). The
|
|
42
|
-
* slug helps when the user knows the exact name.
|
|
43
|
-
*/
|
|
44
|
-
export function composioActionToText(toolkitSlug, action) {
|
|
45
|
-
if (!action) return '';
|
|
46
|
-
const parts = [];
|
|
47
|
-
if (action.displayName) parts.push(String(action.displayName));
|
|
48
|
-
if (action.description) parts.push(String(action.description));
|
|
49
|
-
// Slug + toolkit at the tail so they don't dominate the embedding.
|
|
50
|
-
const slug = action.slug || action.actionSlug || action.name;
|
|
51
|
-
if (slug) parts.push(`[${toolkitSlug || 'unknown'}/${slug}]`);
|
|
52
|
-
return parts.join('\n');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export class ComposioIndexer {
|
|
56
|
-
/**
|
|
57
|
-
* @param {object} opts
|
|
58
|
-
* @param {import('../embeddingService.js').EmbeddingService} opts.embeddingService
|
|
59
|
-
* @param {object} [opts.logger]
|
|
60
|
-
*/
|
|
61
|
-
constructor({ embeddingService, logger = null }) {
|
|
62
|
-
this._svc = embeddingService;
|
|
63
|
-
this._logger = logger;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
get isEnabled() {
|
|
67
|
-
return !!(this._svc && this._svc.isEnabled);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Walk a list of toolkits, fetch each toolkit's actions, embed all of
|
|
72
|
-
* them in batched calls, and write them to the global Composio index.
|
|
73
|
-
*
|
|
74
|
-
* `fetchToolsForToolkit` is a callback the caller provides so we don't
|
|
75
|
-
* have to reach into the Composio SDK from inside this module. It
|
|
76
|
-
* receives `toolkitSlug` and must return an array of action objects
|
|
77
|
-
* (or null/empty if the toolkit has no actions or fails to load).
|
|
78
|
-
*
|
|
79
|
-
* @param {Array<{slug: string, name?: string}>} toolkits
|
|
80
|
-
* @param {(toolkitSlug: string) => Promise<Array<object>|null>} fetchToolsForToolkit
|
|
81
|
-
* @returns {Promise<{ok: boolean, indexedActions: number, indexedToolkits: number, failedToolkits: number, skipped: number, error?: string, reason?: string}>}
|
|
82
|
-
*/
|
|
83
|
-
async indexCatalog(toolkits, fetchToolsForToolkit) {
|
|
84
|
-
if (!this.isEnabled) return { ok: false, reason: 'disabled', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
85
|
-
if (!Array.isArray(toolkits) || toolkits.length === 0) {
|
|
86
|
-
return { ok: false, reason: 'no-toolkits', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
87
|
-
}
|
|
88
|
-
if (typeof fetchToolsForToolkit !== 'function') {
|
|
89
|
-
return { ok: false, reason: 'invalid-input', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Gather all (toolkitSlug, action) pairs across every toolkit. We do
|
|
93
|
-
// this concurrently so the embedding batch sizes are large and the
|
|
94
|
-
// total wallclock stays reasonable even for ~250 toolkits.
|
|
95
|
-
const pairs = [];
|
|
96
|
-
let failedToolkits = 0;
|
|
97
|
-
let toolkitsTouched = new Set();
|
|
98
|
-
|
|
99
|
-
for (const tk of toolkits) {
|
|
100
|
-
const toolkitSlug = tk?.slug || tk?.name;
|
|
101
|
-
if (!toolkitSlug) { failedToolkits++; continue; }
|
|
102
|
-
let actions;
|
|
103
|
-
try {
|
|
104
|
-
actions = await fetchToolsForToolkit(toolkitSlug);
|
|
105
|
-
} catch (err) {
|
|
106
|
-
this._logger?.warn?.('[composioIndexer] fetch tools failed', {
|
|
107
|
-
toolkitSlug, error: err?.message,
|
|
108
|
-
});
|
|
109
|
-
failedToolkits++;
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (!Array.isArray(actions) || actions.length === 0) continue;
|
|
113
|
-
for (const action of actions) {
|
|
114
|
-
const slug = action?.slug || action?.actionSlug || action?.name;
|
|
115
|
-
if (!slug) continue;
|
|
116
|
-
const text = composioActionToText(toolkitSlug, action);
|
|
117
|
-
if (!text) continue;
|
|
118
|
-
pairs.push({ toolkitSlug, actionSlug: slug, action, text });
|
|
119
|
-
toolkitsTouched.add(toolkitSlug);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (pairs.length === 0) {
|
|
124
|
-
// Nothing to index, but we should still REPLACE the existing index
|
|
125
|
-
// (caller's intent was a full rebuild) — drop the store so a stale
|
|
126
|
-
// index doesn't linger.
|
|
127
|
-
try {
|
|
128
|
-
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
129
|
-
await store.drop();
|
|
130
|
-
} catch
|
|
131
|
-
return {
|
|
132
|
-
ok: true,
|
|
133
|
-
indexedActions: 0,
|
|
134
|
-
indexedToolkits: 0,
|
|
135
|
-
failedToolkits,
|
|
136
|
-
skipped: 0,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
let vectors;
|
|
141
|
-
try {
|
|
142
|
-
vectors = await this._svc.embedDocuments(pairs.map(p => p.text), 'document');
|
|
143
|
-
} catch (err) {
|
|
144
|
-
this._logger?.warn?.('[composioIndexer] embed batch failed', {
|
|
145
|
-
actions: pairs.length, error: err?.message,
|
|
146
|
-
});
|
|
147
|
-
return {
|
|
148
|
-
ok: false,
|
|
149
|
-
indexedActions: 0,
|
|
150
|
-
indexedToolkits: 0,
|
|
151
|
-
failedToolkits,
|
|
152
|
-
skipped: 0,
|
|
153
|
-
error: err?.message,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const rows = pairs.map((p, i) => ({
|
|
158
|
-
id: `${p.toolkitSlug}:${p.actionSlug}`,
|
|
159
|
-
vector: vectors[i],
|
|
160
|
-
metadata: this._buildMetadata(p.toolkitSlug, p.action, p.text),
|
|
161
|
-
}));
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
165
|
-
// Full rebuild semantics: drop the existing index before writing.
|
|
166
|
-
// Stale-row handling on partial failure is owned by the caller —
|
|
167
|
-
// they can re-run backfill.
|
|
168
|
-
await store.drop();
|
|
169
|
-
await store.upsertBatch(rows);
|
|
170
|
-
return {
|
|
171
|
-
ok: true,
|
|
172
|
-
indexedActions: rows.length,
|
|
173
|
-
indexedToolkits: toolkitsTouched.size,
|
|
174
|
-
failedToolkits,
|
|
175
|
-
skipped: 0,
|
|
176
|
-
};
|
|
177
|
-
} catch (err) {
|
|
178
|
-
this._logger?.warn?.('[composioIndexer] index write failed', {
|
|
179
|
-
actions: rows.length, error: err?.message,
|
|
180
|
-
});
|
|
181
|
-
return {
|
|
182
|
-
ok: false,
|
|
183
|
-
indexedActions: 0,
|
|
184
|
-
indexedToolkits: 0,
|
|
185
|
-
failedToolkits,
|
|
186
|
-
skipped: 0,
|
|
187
|
-
error: err?.message,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Find ranked actions for a query. Optional filter by toolkit so the
|
|
194
|
-
* model can narrow scope when it already knows which integration.
|
|
195
|
-
*
|
|
196
|
-
* @param {string} query
|
|
197
|
-
* @param {object} [opts]
|
|
198
|
-
* @param {string} [opts.toolkitSlug] Filter to one toolkit when set.
|
|
199
|
-
* @param {number} [opts.topK=10]
|
|
200
|
-
* @param {boolean} [opts.hybrid=true] Hybrid semantic + substring via RRF.
|
|
201
|
-
* @returns {Promise<{enabled: boolean, hits: Array<{id, score, toolkitSlug, actionSlug, displayName, description, metadata}>, error?: string}>}
|
|
202
|
-
*/
|
|
203
|
-
async search(query, { toolkitSlug = null, topK = 10, hybrid = true } = {}) {
|
|
204
|
-
if (!this.isEnabled) return { enabled: false, hits: [] };
|
|
205
|
-
if (typeof query !== 'string' || !query.trim()) {
|
|
206
|
-
return { enabled: true, hits: [] };
|
|
207
|
-
}
|
|
208
|
-
try {
|
|
209
|
-
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
210
|
-
const queryVec = await this._svc.embedQuery(query);
|
|
211
|
-
const filter = toolkitSlug
|
|
212
|
-
? (m) => m?.toolkitSlug === toolkitSlug
|
|
213
|
-
: null;
|
|
214
|
-
const raw = hybrid
|
|
215
|
-
? await store.hybridQuery(queryVec, query, { topK, filter })
|
|
216
|
-
: await store.query(queryVec, { topK, filter });
|
|
217
|
-
|
|
218
|
-
const hits = raw.map(r => ({
|
|
219
|
-
id: r.id,
|
|
220
|
-
score: r.score,
|
|
221
|
-
toolkitSlug: r.metadata?.toolkitSlug || '',
|
|
222
|
-
actionSlug: r.metadata?.actionSlug || '',
|
|
223
|
-
displayName: r.metadata?.displayName || '',
|
|
224
|
-
description: r.metadata?.description || '',
|
|
225
|
-
metadata: r.metadata,
|
|
226
|
-
}));
|
|
227
|
-
return { enabled: true, hits };
|
|
228
|
-
} catch (err) {
|
|
229
|
-
this._logger?.warn?.('[composioIndexer] search failed', { error: err?.message });
|
|
230
|
-
return { enabled: true, hits: [], error: err?.message };
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/** Read-only stats — used by the cost dashboard / status pill. */
|
|
235
|
-
async stats() {
|
|
236
|
-
if (!this.isEnabled) return { count: 0, enabled: false };
|
|
237
|
-
try {
|
|
238
|
-
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
239
|
-
const s = await store.stats();
|
|
240
|
-
return { ...s, enabled: true };
|
|
241
|
-
} catch (err) {
|
|
242
|
-
return { count: 0, enabled: true, error: err?.message };
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/** @private */
|
|
247
|
-
_buildMetadata(toolkitSlug, action, text) {
|
|
248
|
-
return {
|
|
249
|
-
toolkitSlug,
|
|
250
|
-
actionSlug: action?.slug || action?.actionSlug || action?.name || '',
|
|
251
|
-
displayName: action?.displayName || '',
|
|
252
|
-
description: action?.description || '',
|
|
253
|
-
// For hybrid substring matching.
|
|
254
|
-
text,
|
|
255
|
-
// Surface the inputSchema in metadata so the agent can call execute
|
|
256
|
-
// without a second round-trip. Cap size so we don't blow up the
|
|
257
|
-
// JSON store with huge schemas.
|
|
258
|
-
inputSchema: _capObjectSize(action?.inputSchema, 4000),
|
|
259
|
-
// Snapshot of indexing time for staleness UX.
|
|
260
|
-
indexedAt: new Date().toISOString(),
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* Cap an object's stringified size by truncating top-level string fields
|
|
267
|
-
* once their cumulative serialized size exceeds `maxBytes`. Returns the
|
|
268
|
-
* original object when it's already under the cap. Best-effort — used to
|
|
269
|
-
* keep VectorStore JSON sane without losing the most important parts of
|
|
270
|
-
* the inputSchema.
|
|
271
|
-
* @private
|
|
272
|
-
*/
|
|
273
|
-
function _capObjectSize(obj, maxBytes) {
|
|
274
|
-
if (obj == null || typeof obj !== 'object') return obj;
|
|
275
|
-
let serialized;
|
|
276
|
-
try { serialized = JSON.stringify(obj); } catch { return null; }
|
|
277
|
-
if (serialized.length <= maxBytes) return obj;
|
|
278
|
-
return { _truncated: true, _approxBytes: serialized.length, _preview: serialized.slice(0, maxBytes) + '…' };
|
|
279
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* ComposioIndexer — keeps a GLOBAL vector index of the Composio catalog
|
|
3
|
+
* (toolkits × actions) so the agent can find the right action by
|
|
4
|
+
* meaning instead of walking every toolkit's tool list.
|
|
5
|
+
*
|
|
6
|
+
* The discovery problem this solves:
|
|
7
|
+
* - Composio has ~250 toolkits and ~50–200 actions per toolkit.
|
|
8
|
+
* - Today the agent must `list-toolkits` → pick → `list-tools` →
|
|
9
|
+
* scan → pick → `execute`. Three round-trips minimum, more on
|
|
10
|
+
* wrong guesses. Action slugs like SLACK_SEND_DM aren't
|
|
11
|
+
* semantically obvious without their description.
|
|
12
|
+
* - After this indexer is in place: ONE call,
|
|
13
|
+
* `find-action({query: "send a slack DM"})`, returns ranked
|
|
14
|
+
* candidates with their inputSchemas already attached.
|
|
15
|
+
*
|
|
16
|
+
* Why GLOBAL (not per-agent) scope:
|
|
17
|
+
* - The catalog is the same for every agent at any point in time.
|
|
18
|
+
* Per-agent indexes would waste embedding cost N times for the
|
|
19
|
+
* same content.
|
|
20
|
+
* - Per-user connections (which toolkits a user has OAuth'd into)
|
|
21
|
+
* stay per-user; the catalog is read-only metadata.
|
|
22
|
+
*
|
|
23
|
+
* Failure policy (same as memory/reminisce indexers):
|
|
24
|
+
* - All public methods are best-effort. Errors are logged, structured
|
|
25
|
+
* results are returned, nothing throws to the caller. The Composio
|
|
26
|
+
* SDK errors get surfaced in the result rather than crashing the
|
|
27
|
+
* agent.
|
|
28
|
+
*
|
|
29
|
+
* Index lifecycle:
|
|
30
|
+
* - User runs `composio.backfill-actions-index` once after enabling
|
|
31
|
+
* embeddings (or after Composio refreshes its catalog, or after a
|
|
32
|
+
* provider/model swap).
|
|
33
|
+
* - The action then becomes callable. Stale-but-non-empty results
|
|
34
|
+
* are preferred over hard errors; if a toolkit was added since
|
|
35
|
+
* the last backfill, it won't appear until the next one runs.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Pack a Composio action object into the text the embedding model sees.
|
|
40
|
+
* Order matters: displayName first (most concise), then description
|
|
41
|
+
* (most informative), then slug + toolkit hint (identifier signal). The
|
|
42
|
+
* slug helps when the user knows the exact name.
|
|
43
|
+
*/
|
|
44
|
+
export function composioActionToText(toolkitSlug, action) {
|
|
45
|
+
if (!action) return '';
|
|
46
|
+
const parts = [];
|
|
47
|
+
if (action.displayName) parts.push(String(action.displayName));
|
|
48
|
+
if (action.description) parts.push(String(action.description));
|
|
49
|
+
// Slug + toolkit at the tail so they don't dominate the embedding.
|
|
50
|
+
const slug = action.slug || action.actionSlug || action.name;
|
|
51
|
+
if (slug) parts.push(`[${toolkitSlug || 'unknown'}/${slug}]`);
|
|
52
|
+
return parts.join('\n');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class ComposioIndexer {
|
|
56
|
+
/**
|
|
57
|
+
* @param {object} opts
|
|
58
|
+
* @param {import('../embeddingService.js').EmbeddingService} opts.embeddingService
|
|
59
|
+
* @param {object} [opts.logger]
|
|
60
|
+
*/
|
|
61
|
+
constructor({ embeddingService, logger = null }) {
|
|
62
|
+
this._svc = embeddingService;
|
|
63
|
+
this._logger = logger;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get isEnabled() {
|
|
67
|
+
return !!(this._svc && this._svc.isEnabled);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Walk a list of toolkits, fetch each toolkit's actions, embed all of
|
|
72
|
+
* them in batched calls, and write them to the global Composio index.
|
|
73
|
+
*
|
|
74
|
+
* `fetchToolsForToolkit` is a callback the caller provides so we don't
|
|
75
|
+
* have to reach into the Composio SDK from inside this module. It
|
|
76
|
+
* receives `toolkitSlug` and must return an array of action objects
|
|
77
|
+
* (or null/empty if the toolkit has no actions or fails to load).
|
|
78
|
+
*
|
|
79
|
+
* @param {Array<{slug: string, name?: string}>} toolkits
|
|
80
|
+
* @param {(toolkitSlug: string) => Promise<Array<object>|null>} fetchToolsForToolkit
|
|
81
|
+
* @returns {Promise<{ok: boolean, indexedActions: number, indexedToolkits: number, failedToolkits: number, skipped: number, error?: string, reason?: string}>}
|
|
82
|
+
*/
|
|
83
|
+
async indexCatalog(toolkits, fetchToolsForToolkit) {
|
|
84
|
+
if (!this.isEnabled) return { ok: false, reason: 'disabled', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
85
|
+
if (!Array.isArray(toolkits) || toolkits.length === 0) {
|
|
86
|
+
return { ok: false, reason: 'no-toolkits', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
87
|
+
}
|
|
88
|
+
if (typeof fetchToolsForToolkit !== 'function') {
|
|
89
|
+
return { ok: false, reason: 'invalid-input', indexedActions: 0, indexedToolkits: 0, failedToolkits: 0, skipped: 0 };
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Gather all (toolkitSlug, action) pairs across every toolkit. We do
|
|
93
|
+
// this concurrently so the embedding batch sizes are large and the
|
|
94
|
+
// total wallclock stays reasonable even for ~250 toolkits.
|
|
95
|
+
const pairs = [];
|
|
96
|
+
let failedToolkits = 0;
|
|
97
|
+
let toolkitsTouched = new Set();
|
|
98
|
+
|
|
99
|
+
for (const tk of toolkits) {
|
|
100
|
+
const toolkitSlug = tk?.slug || tk?.name;
|
|
101
|
+
if (!toolkitSlug) { failedToolkits++; continue; }
|
|
102
|
+
let actions;
|
|
103
|
+
try {
|
|
104
|
+
actions = await fetchToolsForToolkit(toolkitSlug);
|
|
105
|
+
} catch (err) {
|
|
106
|
+
this._logger?.warn?.('[composioIndexer] fetch tools failed', {
|
|
107
|
+
toolkitSlug, error: err?.message,
|
|
108
|
+
});
|
|
109
|
+
failedToolkits++;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
if (!Array.isArray(actions) || actions.length === 0) continue;
|
|
113
|
+
for (const action of actions) {
|
|
114
|
+
const slug = action?.slug || action?.actionSlug || action?.name;
|
|
115
|
+
if (!slug) continue;
|
|
116
|
+
const text = composioActionToText(toolkitSlug, action);
|
|
117
|
+
if (!text) continue;
|
|
118
|
+
pairs.push({ toolkitSlug, actionSlug: slug, action, text });
|
|
119
|
+
toolkitsTouched.add(toolkitSlug);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (pairs.length === 0) {
|
|
124
|
+
// Nothing to index, but we should still REPLACE the existing index
|
|
125
|
+
// (caller's intent was a full rebuild) — drop the store so a stale
|
|
126
|
+
// index doesn't linger.
|
|
127
|
+
try {
|
|
128
|
+
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
129
|
+
await store.drop();
|
|
130
|
+
} catch { /* best-effort */ }
|
|
131
|
+
return {
|
|
132
|
+
ok: true,
|
|
133
|
+
indexedActions: 0,
|
|
134
|
+
indexedToolkits: 0,
|
|
135
|
+
failedToolkits,
|
|
136
|
+
skipped: 0,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
let vectors;
|
|
141
|
+
try {
|
|
142
|
+
vectors = await this._svc.embedDocuments(pairs.map(p => p.text), 'document');
|
|
143
|
+
} catch (err) {
|
|
144
|
+
this._logger?.warn?.('[composioIndexer] embed batch failed', {
|
|
145
|
+
actions: pairs.length, error: err?.message,
|
|
146
|
+
});
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
indexedActions: 0,
|
|
150
|
+
indexedToolkits: 0,
|
|
151
|
+
failedToolkits,
|
|
152
|
+
skipped: 0,
|
|
153
|
+
error: err?.message,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const rows = pairs.map((p, i) => ({
|
|
158
|
+
id: `${p.toolkitSlug}:${p.actionSlug}`,
|
|
159
|
+
vector: vectors[i],
|
|
160
|
+
metadata: this._buildMetadata(p.toolkitSlug, p.action, p.text),
|
|
161
|
+
}));
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
165
|
+
// Full rebuild semantics: drop the existing index before writing.
|
|
166
|
+
// Stale-row handling on partial failure is owned by the caller —
|
|
167
|
+
// they can re-run backfill.
|
|
168
|
+
await store.drop();
|
|
169
|
+
await store.upsertBatch(rows);
|
|
170
|
+
return {
|
|
171
|
+
ok: true,
|
|
172
|
+
indexedActions: rows.length,
|
|
173
|
+
indexedToolkits: toolkitsTouched.size,
|
|
174
|
+
failedToolkits,
|
|
175
|
+
skipped: 0,
|
|
176
|
+
};
|
|
177
|
+
} catch (err) {
|
|
178
|
+
this._logger?.warn?.('[composioIndexer] index write failed', {
|
|
179
|
+
actions: rows.length, error: err?.message,
|
|
180
|
+
});
|
|
181
|
+
return {
|
|
182
|
+
ok: false,
|
|
183
|
+
indexedActions: 0,
|
|
184
|
+
indexedToolkits: 0,
|
|
185
|
+
failedToolkits,
|
|
186
|
+
skipped: 0,
|
|
187
|
+
error: err?.message,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Find ranked actions for a query. Optional filter by toolkit so the
|
|
194
|
+
* model can narrow scope when it already knows which integration.
|
|
195
|
+
*
|
|
196
|
+
* @param {string} query
|
|
197
|
+
* @param {object} [opts]
|
|
198
|
+
* @param {string} [opts.toolkitSlug] Filter to one toolkit when set.
|
|
199
|
+
* @param {number} [opts.topK=10]
|
|
200
|
+
* @param {boolean} [opts.hybrid=true] Hybrid semantic + substring via RRF.
|
|
201
|
+
* @returns {Promise<{enabled: boolean, hits: Array<{id, score, toolkitSlug, actionSlug, displayName, description, metadata}>, error?: string}>}
|
|
202
|
+
*/
|
|
203
|
+
async search(query, { toolkitSlug = null, topK = 10, hybrid = true } = {}) {
|
|
204
|
+
if (!this.isEnabled) return { enabled: false, hits: [] };
|
|
205
|
+
if (typeof query !== 'string' || !query.trim()) {
|
|
206
|
+
return { enabled: true, hits: [] };
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
210
|
+
const queryVec = await this._svc.embedQuery(query);
|
|
211
|
+
const filter = toolkitSlug
|
|
212
|
+
? (m) => m?.toolkitSlug === toolkitSlug
|
|
213
|
+
: null;
|
|
214
|
+
const raw = hybrid
|
|
215
|
+
? await store.hybridQuery(queryVec, query, { topK, filter })
|
|
216
|
+
: await store.query(queryVec, { topK, filter });
|
|
217
|
+
|
|
218
|
+
const hits = raw.map(r => ({
|
|
219
|
+
id: r.id,
|
|
220
|
+
score: r.score,
|
|
221
|
+
toolkitSlug: r.metadata?.toolkitSlug || '',
|
|
222
|
+
actionSlug: r.metadata?.actionSlug || '',
|
|
223
|
+
displayName: r.metadata?.displayName || '',
|
|
224
|
+
description: r.metadata?.description || '',
|
|
225
|
+
metadata: r.metadata,
|
|
226
|
+
}));
|
|
227
|
+
return { enabled: true, hits };
|
|
228
|
+
} catch (err) {
|
|
229
|
+
this._logger?.warn?.('[composioIndexer] search failed', { error: err?.message });
|
|
230
|
+
return { enabled: true, hits: [], error: err?.message };
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** Read-only stats — used by the cost dashboard / status pill. */
|
|
235
|
+
async stats() {
|
|
236
|
+
if (!this.isEnabled) return { count: 0, enabled: false };
|
|
237
|
+
try {
|
|
238
|
+
const store = await this._svc.getStore({ surface: 'composio-actions' });
|
|
239
|
+
const s = await store.stats();
|
|
240
|
+
return { ...s, enabled: true };
|
|
241
|
+
} catch (err) {
|
|
242
|
+
return { count: 0, enabled: true, error: err?.message };
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** @private */
|
|
247
|
+
_buildMetadata(toolkitSlug, action, text) {
|
|
248
|
+
return {
|
|
249
|
+
toolkitSlug,
|
|
250
|
+
actionSlug: action?.slug || action?.actionSlug || action?.name || '',
|
|
251
|
+
displayName: action?.displayName || '',
|
|
252
|
+
description: action?.description || '',
|
|
253
|
+
// For hybrid substring matching.
|
|
254
|
+
text,
|
|
255
|
+
// Surface the inputSchema in metadata so the agent can call execute
|
|
256
|
+
// without a second round-trip. Cap size so we don't blow up the
|
|
257
|
+
// JSON store with huge schemas.
|
|
258
|
+
inputSchema: _capObjectSize(action?.inputSchema, 4000),
|
|
259
|
+
// Snapshot of indexing time for staleness UX.
|
|
260
|
+
indexedAt: new Date().toISOString(),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Cap an object's stringified size by truncating top-level string fields
|
|
267
|
+
* once their cumulative serialized size exceeds `maxBytes`. Returns the
|
|
268
|
+
* original object when it's already under the cap. Best-effort — used to
|
|
269
|
+
* keep VectorStore JSON sane without losing the most important parts of
|
|
270
|
+
* the inputSchema.
|
|
271
|
+
* @private
|
|
272
|
+
*/
|
|
273
|
+
function _capObjectSize(obj, maxBytes) {
|
|
274
|
+
if (obj == null || typeof obj !== 'object') return obj;
|
|
275
|
+
let serialized;
|
|
276
|
+
try { serialized = JSON.stringify(obj); } catch { return null; }
|
|
277
|
+
if (serialized.length <= maxBytes) return obj;
|
|
278
|
+
return { _truncated: true, _approxBytes: serialized.length, _preview: serialized.slice(0, maxBytes) + '…' };
|
|
279
|
+
}
|