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,273 +1,273 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file tools/foundryWebSearchTool.js
|
|
3
|
-
*
|
|
4
|
-
* Azure AI Foundry web-search tool — wraps the backend's
|
|
5
|
-
* /llm/web-search endpoint (Foundry Responses API + Grounding with
|
|
6
|
-
* Bing Search).
|
|
7
|
-
*
|
|
8
|
-
* What this tool is FOR:
|
|
9
|
-
* - "Research X and cite your sources" — agent gets a synthesized
|
|
10
|
-
* answer + URL citations in one round-trip.
|
|
11
|
-
* - Time-sensitive lookups ("latest version of …", "what happened
|
|
12
|
-
* this week with …") where the model would otherwise guess from
|
|
13
|
-
* training data.
|
|
14
|
-
* - Anywhere you want CITATIONS in the response, not just raw URLs.
|
|
15
|
-
*
|
|
16
|
-
* What this tool is NOT for:
|
|
17
|
-
* - "Give me 10 raw search result links" — use the `web` tool
|
|
18
|
-
* (puppeteer-based) for that. The Foundry path doesn't expose
|
|
19
|
-
* raw URLs; it only returns what the model cited.
|
|
20
|
-
* - Sites that need login/interaction — Foundry's tool reads
|
|
21
|
-
* public web pages only. The `web` tool handles authenticated
|
|
22
|
-
* browsing.
|
|
23
|
-
*
|
|
24
|
-
* Architecture: model-centric. The agent decides locally to call this
|
|
25
|
-
* tool; the tool fires ONE backend HTTP request; the backend fires
|
|
26
|
-
* ONE Foundry HTTP request; Foundry runs the model+search+model loop
|
|
27
|
-
* server-side and returns a single answer. No streaming, no agent
|
|
28
|
-
* state on Foundry's side.
|
|
29
|
-
*/
|
|
30
|
-
|
|
31
|
-
import { BaseTool } from './baseTool.js';
|
|
32
|
-
import TagParser from '../utilities/tagParser.js';
|
|
33
|
-
|
|
34
|
-
class FoundryWebSearchTool extends BaseTool {
|
|
35
|
-
constructor(config = {}, logger = null) {
|
|
36
|
-
super(config, logger);
|
|
37
|
-
this.id = 'foundry_web_search';
|
|
38
|
-
this.name = 'Foundry Web Search (Grounded)';
|
|
39
|
-
this.version = '1.0.0';
|
|
40
|
-
this.requiresProject = false;
|
|
41
|
-
this.isAsync = true;
|
|
42
|
-
// Foundry round-trip is normally 2-5s but multi-search runs can
|
|
43
|
-
// hit 10s+. Don't penalize the agent with a long enforced wait —
|
|
44
|
-
// the aiService timeout is the real ceiling.
|
|
45
|
-
this.builtinDelay = 500;
|
|
46
|
-
|
|
47
|
-
// Reference to the AI service holding baseUrl + apiKeyManager.
|
|
48
|
-
// Set by ToolsRegistry.registerTool via setAIService().
|
|
49
|
-
this.aiService = null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Injected by the registry so we can reuse the auth + URL plumbing
|
|
54
|
-
* the image / video tools already use. Without it, the tool throws
|
|
55
|
-
* a clear "not initialised" error rather than half-running.
|
|
56
|
-
*/
|
|
57
|
-
setAIService(aiService) {
|
|
58
|
-
this.aiService = aiService;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
getDescription() {
|
|
62
|
-
return `
|
|
63
|
-
Foundry Web Search Tool: Grounded web search via Azure AI Foundry +
|
|
64
|
-
Bing. Returns a synthesized answer with citation URLs. Use this when
|
|
65
|
-
you need CURRENT information from the web AND want sources cited.
|
|
66
|
-
|
|
67
|
-
USAGE:
|
|
68
|
-
|
|
69
|
-
\`\`\`json
|
|
70
|
-
{
|
|
71
|
-
"toolId": "foundry_web_search",
|
|
72
|
-
"parameters": {
|
|
73
|
-
"query": "What is the current Node.js LTS version this week?"
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
\`\`\`
|
|
77
|
-
|
|
78
|
-
Optional parameters:
|
|
79
|
-
- "instructions": override the default tool-use nudge. Use only when
|
|
80
|
-
the model is ignoring the search; the default already says
|
|
81
|
-
"always call the web_search_preview tool".
|
|
82
|
-
- "model": chat model to orchestrate the search. Defaults to "gpt-4o"
|
|
83
|
-
(must have Grounding with Bing Search bound in Foundry).
|
|
84
|
-
|
|
85
|
-
XML form (when JSON isn't convenient):
|
|
86
|
-
|
|
87
|
-
\`\`\`
|
|
88
|
-
<foundry_web_search>
|
|
89
|
-
<query>Latest stable Postgres version</query>
|
|
90
|
-
</foundry_web_search>
|
|
91
|
-
\`\`\`
|
|
92
|
-
|
|
93
|
-
RESPONSE SHAPE:
|
|
94
|
-
- answer : string (model's synthesized answer)
|
|
95
|
-
- citations : array of { url, title, start, end } — the URLs the
|
|
96
|
-
model cited, with indices into \`answer\` so you can
|
|
97
|
-
render inline links.
|
|
98
|
-
- usage : { inputTokens, outputTokens, webSearches } — number
|
|
99
|
-
of Bing searches actually invoked. If \`webSearches:0\`
|
|
100
|
-
the model didn't use the tool (it thought it already
|
|
101
|
-
knew the answer); rephrase the query with explicit
|
|
102
|
-
"search the web for ..." wording.
|
|
103
|
-
|
|
104
|
-
WHEN TO USE:
|
|
105
|
-
✓ "Research X and cite sources"
|
|
106
|
-
✓ "What's the latest …" (time-sensitive)
|
|
107
|
-
✓ "Compare these companies' recent earnings" (factual + current)
|
|
108
|
-
|
|
109
|
-
WHEN NOT TO USE:
|
|
110
|
-
✗ "Give me 10 raw search links" — use the \`web\` tool
|
|
111
|
-
✗ "Log in to … and …" — use the \`web\` tool
|
|
112
|
-
✗ Questions answerable from training data (waste of $)
|
|
113
|
-
|
|
114
|
-
COST:
|
|
115
|
-
Per call: ~$0.007 (Bing) + chat-completion tokens ($0.01–0.05 typical).
|
|
116
|
-
The model may invoke multiple searches per call — usage.webSearches
|
|
117
|
-
shows how many fired. Each one bills.
|
|
118
|
-
|
|
119
|
-
LIMITATIONS:
|
|
120
|
-
Only the URLs the model CITED come back. The raw Bing results list
|
|
121
|
-
is hidden. For "show me all 10 results from a search", use the
|
|
122
|
-
\`web\` tool.
|
|
123
|
-
`.trim();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Parse parameters from tool command content. Supports both
|
|
128
|
-
* raw-XML form and JSON-in-content form (the latter is the
|
|
129
|
-
* standard agentic invocation).
|
|
130
|
-
*/
|
|
131
|
-
parseParameters(content) {
|
|
132
|
-
try {
|
|
133
|
-
// Prefer JSON: most agents emit JSON tool calls.
|
|
134
|
-
try {
|
|
135
|
-
const trimmed = (content || '').trim();
|
|
136
|
-
if (trimmed.startsWith('{')) {
|
|
137
|
-
const parsed = JSON.parse(trimmed);
|
|
138
|
-
// Agents may pass either {query: ...} OR {parameters: {query: ...}}
|
|
139
|
-
const inner = parsed.parameters || parsed;
|
|
140
|
-
return {
|
|
141
|
-
query: typeof inner.query === 'string' ? inner.query.trim() : null,
|
|
142
|
-
instructions: typeof inner.instructions === 'string' ? inner.instructions : undefined,
|
|
143
|
-
model: typeof inner.model === 'string' ? inner.model : undefined,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
} catch { /* fall through to XML */ }
|
|
147
|
-
|
|
148
|
-
const queryMatches = TagParser.extractContent(content, 'query');
|
|
149
|
-
const instructionsMatches = TagParser.extractContent(content, 'instructions');
|
|
150
|
-
const modelMatches = TagParser.extractContent(content, 'model');
|
|
151
|
-
return {
|
|
152
|
-
query: queryMatches.length > 0 ? queryMatches[0].trim() : null,
|
|
153
|
-
instructions: instructionsMatches.length > 0 ? instructionsMatches[0].trim() : undefined,
|
|
154
|
-
model: modelMatches.length > 0 ? modelMatches[0].trim() : undefined,
|
|
155
|
-
};
|
|
156
|
-
} catch (error) {
|
|
157
|
-
throw new Error(`Failed to parse foundry_web_search parameters: ${error.message}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
getSupportedActions() {
|
|
162
|
-
return ['search'];
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Execute the search.
|
|
167
|
-
*/
|
|
168
|
-
async execute(params, context) {
|
|
169
|
-
if (!this.aiService) {
|
|
170
|
-
return {
|
|
171
|
-
success: false,
|
|
172
|
-
error: 'foundry_web_search not initialised: aiService reference missing',
|
|
173
|
-
output: 'Internal configuration issue. This tool needs the AI service injected at startup.',
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const { query, instructions, model } = params || {};
|
|
178
|
-
if (!query) {
|
|
179
|
-
return {
|
|
180
|
-
success: false,
|
|
181
|
-
error: 'query is required',
|
|
182
|
-
output: 'Provide a `query` parameter with the search request.',
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
try {
|
|
187
|
-
// Idempotency key derived from agent + content hash; lets a
|
|
188
|
-
// repeated identical query inside the same turn reuse the
|
|
189
|
-
// prior billing row (the backend dedups on the same key).
|
|
190
|
-
const idempotencyKey = this._buildIdempotencyKey(context, query);
|
|
191
|
-
|
|
192
|
-
const result = await this.aiService.foundryWebSearch(query, {
|
|
193
|
-
instructions,
|
|
194
|
-
model,
|
|
195
|
-
idempotencyKey,
|
|
196
|
-
sessionId: context?.sessionId,
|
|
197
|
-
platformProvided: context?.platformProvided !== false,
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
// Format for agent consumption. The answer goes in `output` so
|
|
201
|
-
// the agent reads it as the primary result; structured fields
|
|
202
|
-
// (citations, usage) live alongside for any downstream tool
|
|
203
|
-
// that wants to act on URLs.
|
|
204
|
-
const citationsBlock = (result.citations || []).length > 0
|
|
205
|
-
? '\n\nSources:\n' + result.citations.map((c, i) =>
|
|
206
|
-
` [${i + 1}] ${c.title || '(untitled)'} — ${c.url}`).join('\n')
|
|
207
|
-
: '\n\n(No sources cited.)';
|
|
208
|
-
|
|
209
|
-
const searchCount = result.usage?.webSearches || 0;
|
|
210
|
-
const meta = ` [searches=${searchCount}, tokens=${result.usage?.inputTokens || 0}in/${result.usage?.outputTokens || 0}out]`;
|
|
211
|
-
|
|
212
|
-
return {
|
|
213
|
-
success: true,
|
|
214
|
-
output: result.answer + citationsBlock + meta,
|
|
215
|
-
// Structured fields downstream tools can inspect:
|
|
216
|
-
answer: result.answer,
|
|
217
|
-
citations: result.citations,
|
|
218
|
-
usage: result.usage,
|
|
219
|
-
model: result.model,
|
|
220
|
-
// Hint to the agent: if webSearches=0, the model didn't
|
|
221
|
-
// actually search. Surface this so the agent can decide to
|
|
222
|
-
// retry with stronger wording.
|
|
223
|
-
...(searchCount === 0 ? { warning: 'Model did not invoke the web search tool. Try phrasing the query as "Search the web for: ..." to force tool use.' } : {}),
|
|
224
|
-
};
|
|
225
|
-
|
|
226
|
-
} catch (error) {
|
|
227
|
-
// 503 = feature flag off / not provisioned. Distinct error path
|
|
228
|
-
// so the agent can fall back to the `web` tool instead of
|
|
229
|
-
// retrying.
|
|
230
|
-
if (error.status === 503) {
|
|
231
|
-
return {
|
|
232
|
-
success: false,
|
|
233
|
-
error: error.message,
|
|
234
|
-
output: error.message + '\n\nFallback: use the `web` tool for puppeteer-based search instead.',
|
|
235
|
-
notProvisioned: true,
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
return {
|
|
239
|
-
success: false,
|
|
240
|
-
error: error.message,
|
|
241
|
-
output: `Web search failed: ${error.message}`,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Build an idempotency key per (agentId, query). Stable for repeated
|
|
248
|
-
* identical queries inside the same turn — the backend's
|
|
249
|
-
* Transaction.findOne dedup short-circuits the duplicate billing.
|
|
250
|
-
*
|
|
251
|
-
* Different turns or different agents → different keys → fresh
|
|
252
|
-
* search + bill, which is correct (the world moves on between
|
|
253
|
-
* turns, the user expects a fresh result).
|
|
254
|
-
*
|
|
255
|
-
* @private
|
|
256
|
-
*/
|
|
257
|
-
_buildIdempotencyKey(context, query) {
|
|
258
|
-
const agentId = context?.agentId || 'unknown';
|
|
259
|
-
const turn = context?.turnId || context?.messageId || Date.now();
|
|
260
|
-
// Cheap, deterministic, no-deps hash. Doesn't need to be
|
|
261
|
-
// cryptographic — the keyspace is per-agent so collision risk
|
|
262
|
-
// is minimal.
|
|
263
|
-
let h = 0;
|
|
264
|
-
const s = `${agentId}|${turn}|${query}`;
|
|
265
|
-
for (let i = 0; i < s.length; i++) {
|
|
266
|
-
h = ((h << 5) - h) + s.charCodeAt(i);
|
|
267
|
-
h |= 0;
|
|
268
|
-
}
|
|
269
|
-
return `fws-${agentId}-${(h >>> 0).toString(36)}`;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
export default FoundryWebSearchTool;
|
|
1
|
+
/**
|
|
2
|
+
* @file tools/foundryWebSearchTool.js
|
|
3
|
+
*
|
|
4
|
+
* Azure AI Foundry web-search tool — wraps the backend's
|
|
5
|
+
* /llm/web-search endpoint (Foundry Responses API + Grounding with
|
|
6
|
+
* Bing Search).
|
|
7
|
+
*
|
|
8
|
+
* What this tool is FOR:
|
|
9
|
+
* - "Research X and cite your sources" — agent gets a synthesized
|
|
10
|
+
* answer + URL citations in one round-trip.
|
|
11
|
+
* - Time-sensitive lookups ("latest version of …", "what happened
|
|
12
|
+
* this week with …") where the model would otherwise guess from
|
|
13
|
+
* training data.
|
|
14
|
+
* - Anywhere you want CITATIONS in the response, not just raw URLs.
|
|
15
|
+
*
|
|
16
|
+
* What this tool is NOT for:
|
|
17
|
+
* - "Give me 10 raw search result links" — use the `web` tool
|
|
18
|
+
* (puppeteer-based) for that. The Foundry path doesn't expose
|
|
19
|
+
* raw URLs; it only returns what the model cited.
|
|
20
|
+
* - Sites that need login/interaction — Foundry's tool reads
|
|
21
|
+
* public web pages only. The `web` tool handles authenticated
|
|
22
|
+
* browsing.
|
|
23
|
+
*
|
|
24
|
+
* Architecture: model-centric. The agent decides locally to call this
|
|
25
|
+
* tool; the tool fires ONE backend HTTP request; the backend fires
|
|
26
|
+
* ONE Foundry HTTP request; Foundry runs the model+search+model loop
|
|
27
|
+
* server-side and returns a single answer. No streaming, no agent
|
|
28
|
+
* state on Foundry's side.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { BaseTool } from './baseTool.js';
|
|
32
|
+
import TagParser from '../utilities/tagParser.js';
|
|
33
|
+
|
|
34
|
+
class FoundryWebSearchTool extends BaseTool {
|
|
35
|
+
constructor(config = {}, logger = null) {
|
|
36
|
+
super(config, logger);
|
|
37
|
+
this.id = 'foundry_web_search';
|
|
38
|
+
this.name = 'Foundry Web Search (Grounded)';
|
|
39
|
+
this.version = '1.0.0';
|
|
40
|
+
this.requiresProject = false;
|
|
41
|
+
this.isAsync = true;
|
|
42
|
+
// Foundry round-trip is normally 2-5s but multi-search runs can
|
|
43
|
+
// hit 10s+. Don't penalize the agent with a long enforced wait —
|
|
44
|
+
// the aiService timeout is the real ceiling.
|
|
45
|
+
this.builtinDelay = 500;
|
|
46
|
+
|
|
47
|
+
// Reference to the AI service holding baseUrl + apiKeyManager.
|
|
48
|
+
// Set by ToolsRegistry.registerTool via setAIService().
|
|
49
|
+
this.aiService = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Injected by the registry so we can reuse the auth + URL plumbing
|
|
54
|
+
* the image / video tools already use. Without it, the tool throws
|
|
55
|
+
* a clear "not initialised" error rather than half-running.
|
|
56
|
+
*/
|
|
57
|
+
setAIService(aiService) {
|
|
58
|
+
this.aiService = aiService;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
getDescription() {
|
|
62
|
+
return `
|
|
63
|
+
Foundry Web Search Tool: Grounded web search via Azure AI Foundry +
|
|
64
|
+
Bing. Returns a synthesized answer with citation URLs. Use this when
|
|
65
|
+
you need CURRENT information from the web AND want sources cited.
|
|
66
|
+
|
|
67
|
+
USAGE:
|
|
68
|
+
|
|
69
|
+
\`\`\`json
|
|
70
|
+
{
|
|
71
|
+
"toolId": "foundry_web_search",
|
|
72
|
+
"parameters": {
|
|
73
|
+
"query": "What is the current Node.js LTS version this week?"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
\`\`\`
|
|
77
|
+
|
|
78
|
+
Optional parameters:
|
|
79
|
+
- "instructions": override the default tool-use nudge. Use only when
|
|
80
|
+
the model is ignoring the search; the default already says
|
|
81
|
+
"always call the web_search_preview tool".
|
|
82
|
+
- "model": chat model to orchestrate the search. Defaults to "gpt-4o"
|
|
83
|
+
(must have Grounding with Bing Search bound in Foundry).
|
|
84
|
+
|
|
85
|
+
XML form (when JSON isn't convenient):
|
|
86
|
+
|
|
87
|
+
\`\`\`
|
|
88
|
+
<foundry_web_search>
|
|
89
|
+
<query>Latest stable Postgres version</query>
|
|
90
|
+
</foundry_web_search>
|
|
91
|
+
\`\`\`
|
|
92
|
+
|
|
93
|
+
RESPONSE SHAPE:
|
|
94
|
+
- answer : string (model's synthesized answer)
|
|
95
|
+
- citations : array of { url, title, start, end } — the URLs the
|
|
96
|
+
model cited, with indices into \`answer\` so you can
|
|
97
|
+
render inline links.
|
|
98
|
+
- usage : { inputTokens, outputTokens, webSearches } — number
|
|
99
|
+
of Bing searches actually invoked. If \`webSearches:0\`
|
|
100
|
+
the model didn't use the tool (it thought it already
|
|
101
|
+
knew the answer); rephrase the query with explicit
|
|
102
|
+
"search the web for ..." wording.
|
|
103
|
+
|
|
104
|
+
WHEN TO USE:
|
|
105
|
+
✓ "Research X and cite sources"
|
|
106
|
+
✓ "What's the latest …" (time-sensitive)
|
|
107
|
+
✓ "Compare these companies' recent earnings" (factual + current)
|
|
108
|
+
|
|
109
|
+
WHEN NOT TO USE:
|
|
110
|
+
✗ "Give me 10 raw search links" — use the \`web\` tool
|
|
111
|
+
✗ "Log in to … and …" — use the \`web\` tool
|
|
112
|
+
✗ Questions answerable from training data (waste of $)
|
|
113
|
+
|
|
114
|
+
COST:
|
|
115
|
+
Per call: ~$0.007 (Bing) + chat-completion tokens ($0.01–0.05 typical).
|
|
116
|
+
The model may invoke multiple searches per call — usage.webSearches
|
|
117
|
+
shows how many fired. Each one bills.
|
|
118
|
+
|
|
119
|
+
LIMITATIONS:
|
|
120
|
+
Only the URLs the model CITED come back. The raw Bing results list
|
|
121
|
+
is hidden. For "show me all 10 results from a search", use the
|
|
122
|
+
\`web\` tool.
|
|
123
|
+
`.trim();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Parse parameters from tool command content. Supports both
|
|
128
|
+
* raw-XML form and JSON-in-content form (the latter is the
|
|
129
|
+
* standard agentic invocation).
|
|
130
|
+
*/
|
|
131
|
+
parseParameters(content) {
|
|
132
|
+
try {
|
|
133
|
+
// Prefer JSON: most agents emit JSON tool calls.
|
|
134
|
+
try {
|
|
135
|
+
const trimmed = (content || '').trim();
|
|
136
|
+
if (trimmed.startsWith('{')) {
|
|
137
|
+
const parsed = JSON.parse(trimmed);
|
|
138
|
+
// Agents may pass either {query: ...} OR {parameters: {query: ...}}
|
|
139
|
+
const inner = parsed.parameters || parsed;
|
|
140
|
+
return {
|
|
141
|
+
query: typeof inner.query === 'string' ? inner.query.trim() : null,
|
|
142
|
+
instructions: typeof inner.instructions === 'string' ? inner.instructions : undefined,
|
|
143
|
+
model: typeof inner.model === 'string' ? inner.model : undefined,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
} catch { /* fall through to XML */ }
|
|
147
|
+
|
|
148
|
+
const queryMatches = TagParser.extractContent(content, 'query');
|
|
149
|
+
const instructionsMatches = TagParser.extractContent(content, 'instructions');
|
|
150
|
+
const modelMatches = TagParser.extractContent(content, 'model');
|
|
151
|
+
return {
|
|
152
|
+
query: queryMatches.length > 0 ? queryMatches[0].trim() : null,
|
|
153
|
+
instructions: instructionsMatches.length > 0 ? instructionsMatches[0].trim() : undefined,
|
|
154
|
+
model: modelMatches.length > 0 ? modelMatches[0].trim() : undefined,
|
|
155
|
+
};
|
|
156
|
+
} catch (error) {
|
|
157
|
+
throw new Error(`Failed to parse foundry_web_search parameters: ${error.message}`, { cause: error });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
getSupportedActions() {
|
|
162
|
+
return ['search'];
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Execute the search.
|
|
167
|
+
*/
|
|
168
|
+
async execute(params, context) {
|
|
169
|
+
if (!this.aiService) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
error: 'foundry_web_search not initialised: aiService reference missing',
|
|
173
|
+
output: 'Internal configuration issue. This tool needs the AI service injected at startup.',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const { query, instructions, model } = params || {};
|
|
178
|
+
if (!query) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
error: 'query is required',
|
|
182
|
+
output: 'Provide a `query` parameter with the search request.',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
// Idempotency key derived from agent + content hash; lets a
|
|
188
|
+
// repeated identical query inside the same turn reuse the
|
|
189
|
+
// prior billing row (the backend dedups on the same key).
|
|
190
|
+
const idempotencyKey = this._buildIdempotencyKey(context, query);
|
|
191
|
+
|
|
192
|
+
const result = await this.aiService.foundryWebSearch(query, {
|
|
193
|
+
instructions,
|
|
194
|
+
model,
|
|
195
|
+
idempotencyKey,
|
|
196
|
+
sessionId: context?.sessionId,
|
|
197
|
+
platformProvided: context?.platformProvided !== false,
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Format for agent consumption. The answer goes in `output` so
|
|
201
|
+
// the agent reads it as the primary result; structured fields
|
|
202
|
+
// (citations, usage) live alongside for any downstream tool
|
|
203
|
+
// that wants to act on URLs.
|
|
204
|
+
const citationsBlock = (result.citations || []).length > 0
|
|
205
|
+
? '\n\nSources:\n' + result.citations.map((c, i) =>
|
|
206
|
+
` [${i + 1}] ${c.title || '(untitled)'} — ${c.url}`).join('\n')
|
|
207
|
+
: '\n\n(No sources cited.)';
|
|
208
|
+
|
|
209
|
+
const searchCount = result.usage?.webSearches || 0;
|
|
210
|
+
const meta = ` [searches=${searchCount}, tokens=${result.usage?.inputTokens || 0}in/${result.usage?.outputTokens || 0}out]`;
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
success: true,
|
|
214
|
+
output: result.answer + citationsBlock + meta,
|
|
215
|
+
// Structured fields downstream tools can inspect:
|
|
216
|
+
answer: result.answer,
|
|
217
|
+
citations: result.citations,
|
|
218
|
+
usage: result.usage,
|
|
219
|
+
model: result.model,
|
|
220
|
+
// Hint to the agent: if webSearches=0, the model didn't
|
|
221
|
+
// actually search. Surface this so the agent can decide to
|
|
222
|
+
// retry with stronger wording.
|
|
223
|
+
...(searchCount === 0 ? { warning: 'Model did not invoke the web search tool. Try phrasing the query as "Search the web for: ..." to force tool use.' } : {}),
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
} catch (error) {
|
|
227
|
+
// 503 = feature flag off / not provisioned. Distinct error path
|
|
228
|
+
// so the agent can fall back to the `web` tool instead of
|
|
229
|
+
// retrying.
|
|
230
|
+
if (error.status === 503) {
|
|
231
|
+
return {
|
|
232
|
+
success: false,
|
|
233
|
+
error: error.message,
|
|
234
|
+
output: error.message + '\n\nFallback: use the `web` tool for puppeteer-based search instead.',
|
|
235
|
+
notProvisioned: true,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
success: false,
|
|
240
|
+
error: error.message,
|
|
241
|
+
output: `Web search failed: ${error.message}`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Build an idempotency key per (agentId, query). Stable for repeated
|
|
248
|
+
* identical queries inside the same turn — the backend's
|
|
249
|
+
* Transaction.findOne dedup short-circuits the duplicate billing.
|
|
250
|
+
*
|
|
251
|
+
* Different turns or different agents → different keys → fresh
|
|
252
|
+
* search + bill, which is correct (the world moves on between
|
|
253
|
+
* turns, the user expects a fresh result).
|
|
254
|
+
*
|
|
255
|
+
* @private
|
|
256
|
+
*/
|
|
257
|
+
_buildIdempotencyKey(context, query) {
|
|
258
|
+
const agentId = context?.agentId || 'unknown';
|
|
259
|
+
const turn = context?.turnId || context?.messageId || Date.now();
|
|
260
|
+
// Cheap, deterministic, no-deps hash. Doesn't need to be
|
|
261
|
+
// cryptographic — the keyspace is per-agent so collision risk
|
|
262
|
+
// is minimal.
|
|
263
|
+
let h = 0;
|
|
264
|
+
const s = `${agentId}|${turn}|${query}`;
|
|
265
|
+
for (let i = 0; i < s.length; i++) {
|
|
266
|
+
h = ((h << 5) - h) + s.charCodeAt(i);
|
|
267
|
+
h |= 0;
|
|
268
|
+
}
|
|
269
|
+
return `fws-${agentId}-${(h >>> 0).toString(36)}`;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export default FoundryWebSearchTool;
|