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,137 +1,137 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for the TASK DISCIPLINE signal — `currentFocus` returned on
|
|
3
|
-
* every taskmanager response — and the OPERATING POSTURE guideline
|
|
4
|
-
* that pairs with it.
|
|
5
|
-
*
|
|
6
|
-
* Production observation (scripts/memory-bench/live-v2-*,
|
|
7
|
-
* agent-agent-v2-v2-s2-multi-topic-1779570320941): Kimi-K2.6 and gpt-5.4
|
|
8
|
-
* lost task focus after cascading tool errors and silently reverted
|
|
9
|
-
* to a prior task instead of completing the current one. The fix is
|
|
10
|
-
* two-pronged:
|
|
11
|
-
* 1. Surface `currentFocus` on every taskmanager response so the
|
|
12
|
-
* anchor stays visible across error cascades.
|
|
13
|
-
* 2. OPERATING POSTURE explicitly tells the agent: only one task
|
|
14
|
-
* in_progress at a time, transition before working, finish or
|
|
15
|
-
* release before switching.
|
|
16
|
-
*/
|
|
17
|
-
import { describe, test, expect } from '@jest/globals';
|
|
18
|
-
import TaskManagerTool from '../taskManagerTool.js';
|
|
19
|
-
import {
|
|
20
|
-
|
|
21
|
-
const SILENT_LOGGER = { info() {}, warn() {}, error() {}, debug() {} };
|
|
22
|
-
|
|
23
|
-
function makeTool() {
|
|
24
|
-
const tool = new TaskManagerTool({ description: 'test' });
|
|
25
|
-
tool.logger = SILENT_LOGGER;
|
|
26
|
-
return tool;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
describe('_buildCurrentFocus — task-discipline signal', () => {
|
|
30
|
-
test('ok=true when exactly one task is in_progress', () => {
|
|
31
|
-
const focus = makeTool()._buildCurrentFocus([
|
|
32
|
-
{ id: 'task-1', title: 'Polish README', description: 'Rewrite intro', status: 'in_progress' },
|
|
33
|
-
{ id: 'task-2', title: 'Other thing', description: '...', status: 'pending' },
|
|
34
|
-
]);
|
|
35
|
-
expect(focus.ok).toBe(true);
|
|
36
|
-
expect(focus.inProgressCount).toBe(1);
|
|
37
|
-
expect(focus.current).toMatchObject({
|
|
38
|
-
taskId: 'task-1', title: 'Polish README', description: 'Rewrite intro',
|
|
39
|
-
});
|
|
40
|
-
expect(focus.warning).toBeUndefined();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('ok=false with warning when 0 tasks are in_progress', () => {
|
|
44
|
-
const focus = makeTool()._buildCurrentFocus([
|
|
45
|
-
{ id: 'task-1', title: 'X', description: '...', status: 'pending' },
|
|
46
|
-
{ id: 'task-2', title: 'Y', description: '...', status: 'completed' },
|
|
47
|
-
]);
|
|
48
|
-
expect(focus.ok).toBe(false);
|
|
49
|
-
expect(focus.inProgressCount).toBe(0);
|
|
50
|
-
expect(focus.current).toBeNull();
|
|
51
|
-
expect(focus.warning).toMatch(/in_progress/);
|
|
52
|
-
expect(focus.warning).toMatch(/BEFORE/);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test('ok=false with warning when 2+ tasks are in_progress', () => {
|
|
56
|
-
const focus = makeTool()._buildCurrentFocus([
|
|
57
|
-
{ id: 'task-1', title: 'A', description: '...', status: 'in_progress' },
|
|
58
|
-
{ id: 'task-2', title: 'B', description: '...', status: 'in_progress' },
|
|
59
|
-
{ id: 'task-3', title: 'C', description: '...', status: 'pending' },
|
|
60
|
-
]);
|
|
61
|
-
expect(focus.ok).toBe(false);
|
|
62
|
-
expect(focus.inProgressCount).toBe(2);
|
|
63
|
-
expect(Array.isArray(focus.current)).toBe(true);
|
|
64
|
-
expect(focus.current).toHaveLength(2);
|
|
65
|
-
expect(focus.warning).toMatch(/Multiple tasks/);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('empty task list reports 0 in_progress with warning', () => {
|
|
69
|
-
const focus = makeTool()._buildCurrentFocus([]);
|
|
70
|
-
expect(focus.ok).toBe(false);
|
|
71
|
-
expect(focus.inProgressCount).toBe(0);
|
|
72
|
-
expect(focus.current).toBeNull();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test('null/undefined input handled gracefully (no crash)', () => {
|
|
76
|
-
expect(() => makeTool()._buildCurrentFocus(null)).not.toThrow();
|
|
77
|
-
expect(() => makeTool()._buildCurrentFocus(undefined)).not.toThrow();
|
|
78
|
-
const f = makeTool()._buildCurrentFocus(null);
|
|
79
|
-
expect(f.inProgressCount).toBe(0);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
test('long descriptions are truncated to 140 chars', () => {
|
|
83
|
-
const long = 'x'.repeat(500);
|
|
84
|
-
const focus = makeTool()._buildCurrentFocus([
|
|
85
|
-
{ id: 'task-1', title: 'T', description: long, status: 'in_progress' },
|
|
86
|
-
]);
|
|
87
|
-
expect(focus.current.description.length).toBeLessThanOrEqual(141);
|
|
88
|
-
expect(focus.current.description.endsWith('…')).toBe(true);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test('non-string description is coerced to empty (no crash)', () => {
|
|
92
|
-
const focus = makeTool()._buildCurrentFocus([
|
|
93
|
-
{ id: 'task-1', title: 'T', description: null, status: 'in_progress' },
|
|
94
|
-
]);
|
|
95
|
-
expect(focus.current.description).toBe('');
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
describe('OPERATING POSTURE — TASK DISCIPLINE section', () => {
|
|
100
|
-
// The OPERATING POSTURE block lives in baseTool.js and is built per
|
|
101
|
-
// agent based on its capabilities. We construct a BaseTool-derived
|
|
102
|
-
// tool registry stub and verify the block content directly.
|
|
103
|
-
function buildOperatingPosture(capabilities) {
|
|
104
|
-
// Use the real ToolsRegistry — it's the class that owns
|
|
105
|
-
// generateToolDescriptionsForPrompt. Register fake tools matching
|
|
106
|
-
// the capability list so the block emits its sections.
|
|
107
|
-
const reg = new ToolsRegistry(SILENT_LOGGER);
|
|
108
|
-
for (const id of capabilities) {
|
|
109
|
-
reg.tools.set(id, { id, getDescription: () => `# ${id}` });
|
|
110
|
-
}
|
|
111
|
-
return reg.generateToolDescriptionsForPrompt(capabilities);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
test('section appears when taskmanager capability is present', () => {
|
|
115
|
-
const block = buildOperatingPosture(['memory', 'taskmanager']);
|
|
116
|
-
expect(block).toMatch(/TASK DISCIPLINE/);
|
|
117
|
-
expect(block).toMatch(/ONE.*task.*in_progress/);
|
|
118
|
-
expect(block).toMatch(/Transition first, then work/);
|
|
119
|
-
expect(block).toMatch(/Finish or release/);
|
|
120
|
-
expect(block).toMatch(/Anchor on tool failures/);
|
|
121
|
-
expect(block).toMatch(/currentFocus/);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test('section does NOT appear without taskmanager capability', () => {
|
|
125
|
-
const block = buildOperatingPosture(['memory']);
|
|
126
|
-
expect(block).not.toMatch(/TASK DISCIPLINE/);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('section guidance is descriptive of cognitive effort, not bureaucratic checklist', () => {
|
|
130
|
-
// The aim is "task list reflects actual work", not "fill in fields".
|
|
131
|
-
const block = buildOperatingPosture(['memory', 'taskmanager']);
|
|
132
|
-
expect(block).toMatch(/cognitive effort/);
|
|
133
|
-
// Should describe what to do on tool failures — that's the main
|
|
134
|
-
// failure mode we observed.
|
|
135
|
-
expect(block).toMatch(/tool.*fail/i);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the TASK DISCIPLINE signal — `currentFocus` returned on
|
|
3
|
+
* every taskmanager response — and the OPERATING POSTURE guideline
|
|
4
|
+
* that pairs with it.
|
|
5
|
+
*
|
|
6
|
+
* Production observation (scripts/memory-bench/live-v2-*,
|
|
7
|
+
* agent-agent-v2-v2-s2-multi-topic-1779570320941): Kimi-K2.6 and gpt-5.4
|
|
8
|
+
* lost task focus after cascading tool errors and silently reverted
|
|
9
|
+
* to a prior task instead of completing the current one. The fix is
|
|
10
|
+
* two-pronged:
|
|
11
|
+
* 1. Surface `currentFocus` on every taskmanager response so the
|
|
12
|
+
* anchor stays visible across error cascades.
|
|
13
|
+
* 2. OPERATING POSTURE explicitly tells the agent: only one task
|
|
14
|
+
* in_progress at a time, transition before working, finish or
|
|
15
|
+
* release before switching.
|
|
16
|
+
*/
|
|
17
|
+
import { describe, test, expect } from '@jest/globals';
|
|
18
|
+
import TaskManagerTool from '../taskManagerTool.js';
|
|
19
|
+
import { ToolsRegistry } from '../baseTool.js';
|
|
20
|
+
|
|
21
|
+
const SILENT_LOGGER = { info() {}, warn() {}, error() {}, debug() {} };
|
|
22
|
+
|
|
23
|
+
function makeTool() {
|
|
24
|
+
const tool = new TaskManagerTool({ description: 'test' });
|
|
25
|
+
tool.logger = SILENT_LOGGER;
|
|
26
|
+
return tool;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe('_buildCurrentFocus — task-discipline signal', () => {
|
|
30
|
+
test('ok=true when exactly one task is in_progress', () => {
|
|
31
|
+
const focus = makeTool()._buildCurrentFocus([
|
|
32
|
+
{ id: 'task-1', title: 'Polish README', description: 'Rewrite intro', status: 'in_progress' },
|
|
33
|
+
{ id: 'task-2', title: 'Other thing', description: '...', status: 'pending' },
|
|
34
|
+
]);
|
|
35
|
+
expect(focus.ok).toBe(true);
|
|
36
|
+
expect(focus.inProgressCount).toBe(1);
|
|
37
|
+
expect(focus.current).toMatchObject({
|
|
38
|
+
taskId: 'task-1', title: 'Polish README', description: 'Rewrite intro',
|
|
39
|
+
});
|
|
40
|
+
expect(focus.warning).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('ok=false with warning when 0 tasks are in_progress', () => {
|
|
44
|
+
const focus = makeTool()._buildCurrentFocus([
|
|
45
|
+
{ id: 'task-1', title: 'X', description: '...', status: 'pending' },
|
|
46
|
+
{ id: 'task-2', title: 'Y', description: '...', status: 'completed' },
|
|
47
|
+
]);
|
|
48
|
+
expect(focus.ok).toBe(false);
|
|
49
|
+
expect(focus.inProgressCount).toBe(0);
|
|
50
|
+
expect(focus.current).toBeNull();
|
|
51
|
+
expect(focus.warning).toMatch(/in_progress/);
|
|
52
|
+
expect(focus.warning).toMatch(/BEFORE/);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('ok=false with warning when 2+ tasks are in_progress', () => {
|
|
56
|
+
const focus = makeTool()._buildCurrentFocus([
|
|
57
|
+
{ id: 'task-1', title: 'A', description: '...', status: 'in_progress' },
|
|
58
|
+
{ id: 'task-2', title: 'B', description: '...', status: 'in_progress' },
|
|
59
|
+
{ id: 'task-3', title: 'C', description: '...', status: 'pending' },
|
|
60
|
+
]);
|
|
61
|
+
expect(focus.ok).toBe(false);
|
|
62
|
+
expect(focus.inProgressCount).toBe(2);
|
|
63
|
+
expect(Array.isArray(focus.current)).toBe(true);
|
|
64
|
+
expect(focus.current).toHaveLength(2);
|
|
65
|
+
expect(focus.warning).toMatch(/Multiple tasks/);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('empty task list reports 0 in_progress with warning', () => {
|
|
69
|
+
const focus = makeTool()._buildCurrentFocus([]);
|
|
70
|
+
expect(focus.ok).toBe(false);
|
|
71
|
+
expect(focus.inProgressCount).toBe(0);
|
|
72
|
+
expect(focus.current).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('null/undefined input handled gracefully (no crash)', () => {
|
|
76
|
+
expect(() => makeTool()._buildCurrentFocus(null)).not.toThrow();
|
|
77
|
+
expect(() => makeTool()._buildCurrentFocus(undefined)).not.toThrow();
|
|
78
|
+
const f = makeTool()._buildCurrentFocus(null);
|
|
79
|
+
expect(f.inProgressCount).toBe(0);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('long descriptions are truncated to 140 chars', () => {
|
|
83
|
+
const long = 'x'.repeat(500);
|
|
84
|
+
const focus = makeTool()._buildCurrentFocus([
|
|
85
|
+
{ id: 'task-1', title: 'T', description: long, status: 'in_progress' },
|
|
86
|
+
]);
|
|
87
|
+
expect(focus.current.description.length).toBeLessThanOrEqual(141);
|
|
88
|
+
expect(focus.current.description.endsWith('…')).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('non-string description is coerced to empty (no crash)', () => {
|
|
92
|
+
const focus = makeTool()._buildCurrentFocus([
|
|
93
|
+
{ id: 'task-1', title: 'T', description: null, status: 'in_progress' },
|
|
94
|
+
]);
|
|
95
|
+
expect(focus.current.description).toBe('');
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe('OPERATING POSTURE — TASK DISCIPLINE section', () => {
|
|
100
|
+
// The OPERATING POSTURE block lives in baseTool.js and is built per
|
|
101
|
+
// agent based on its capabilities. We construct a BaseTool-derived
|
|
102
|
+
// tool registry stub and verify the block content directly.
|
|
103
|
+
function buildOperatingPosture(capabilities) {
|
|
104
|
+
// Use the real ToolsRegistry — it's the class that owns
|
|
105
|
+
// generateToolDescriptionsForPrompt. Register fake tools matching
|
|
106
|
+
// the capability list so the block emits its sections.
|
|
107
|
+
const reg = new ToolsRegistry(SILENT_LOGGER);
|
|
108
|
+
for (const id of capabilities) {
|
|
109
|
+
reg.tools.set(id, { id, getDescription: () => `# ${id}` });
|
|
110
|
+
}
|
|
111
|
+
return reg.generateToolDescriptionsForPrompt(capabilities);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
test('section appears when taskmanager capability is present', () => {
|
|
115
|
+
const block = buildOperatingPosture(['memory', 'taskmanager']);
|
|
116
|
+
expect(block).toMatch(/TASK DISCIPLINE/);
|
|
117
|
+
expect(block).toMatch(/ONE.*task.*in_progress/);
|
|
118
|
+
expect(block).toMatch(/Transition first, then work/);
|
|
119
|
+
expect(block).toMatch(/Finish or release/);
|
|
120
|
+
expect(block).toMatch(/Anchor on tool failures/);
|
|
121
|
+
expect(block).toMatch(/currentFocus/);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('section does NOT appear without taskmanager capability', () => {
|
|
125
|
+
const block = buildOperatingPosture(['memory']);
|
|
126
|
+
expect(block).not.toMatch(/TASK DISCIPLINE/);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('section guidance is descriptive of cognitive effort, not bureaucratic checklist', () => {
|
|
130
|
+
// The aim is "task list reflects actual work", not "fill in fields".
|
|
131
|
+
const block = buildOperatingPosture(['memory', 'taskmanager']);
|
|
132
|
+
expect(block).toMatch(/cognitive effort/);
|
|
133
|
+
// Should describe what to do on tool failures — that's the main
|
|
134
|
+
// failure mode we observed.
|
|
135
|
+
expect(block).toMatch(/tool.*fail/i);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* taskManagerTool tests for search + backfill-search-index.
|
|
3
|
-
*
|
|
4
|
-
* Pins the wiring contracts only — the TaskIndexer's internals have
|
|
5
|
-
* their own dedicated suite. We test:
|
|
6
|
-
* - search dispatches to indexer when embeddings are enabled
|
|
7
|
-
* - search falls back to substring-on-title/description when disabled
|
|
8
|
-
* - status filter forwards correctly
|
|
9
|
-
* - missing query → clean error
|
|
10
|
-
* - hits hydrate back to live tasks from agent.taskList
|
|
11
|
-
* - backfill walks agent.taskList.tasks + reports counts
|
|
12
|
-
*
|
|
13
|
-
* Mocks: stub TaskIndexer at the module boundary.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
import { jest, describe, test, expect
|
|
17
|
-
|
|
18
|
-
const mockIndexerInstance = {
|
|
19
|
-
isEnabled: true,
|
|
20
|
-
indexOne: jest.fn().mockResolvedValue({ indexed: true }),
|
|
21
|
-
deleteOne: jest.fn().mockResolvedValue({ deleted: true }),
|
|
22
|
-
backfill: jest.fn().mockResolvedValue({ ok: true, indexed: 0, skipped: 0, failed: 0 }),
|
|
23
|
-
search: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
|
|
24
|
-
};
|
|
25
|
-
const MockTaskIndexer = jest.fn(() => mockIndexerInstance);
|
|
26
|
-
jest.unstable_mockModule('../../services/embeddings/indexers/taskIndexer.js', () => ({
|
|
27
|
-
TaskIndexer: MockTaskIndexer,
|
|
28
|
-
taskToText: () => '',
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
const { default: TaskManagerTool } = await import('../taskManagerTool.js');
|
|
32
|
-
|
|
33
|
-
function makeAgent(tasks = []) {
|
|
34
|
-
return {
|
|
35
|
-
id: 'agent-1',
|
|
36
|
-
taskList: { tasks },
|
|
37
|
-
status: 'active',
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function makeTool({ embeddingsEnabled = true } = {}) {
|
|
42
|
-
const tool = new TaskManagerTool();
|
|
43
|
-
mockIndexerInstance.isEnabled = embeddingsEnabled;
|
|
44
|
-
mockIndexerInstance.search.mockClear();
|
|
45
|
-
mockIndexerInstance.backfill.mockClear();
|
|
46
|
-
MockTaskIndexer.mockClear();
|
|
47
|
-
tool.aiService = { getEmbeddingService: () => ({ isEnabled: embeddingsEnabled }) };
|
|
48
|
-
tool._taskIndexer = null;
|
|
49
|
-
return tool;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const tasks = [
|
|
53
|
-
{ id: 't1', title: 'Refactor auth flow', description: 'Move to OAuth 2.1', status: 'pending', priority: 'high' },
|
|
54
|
-
{ id: 't2', title: 'Investigate Telegram dedup', description: 'Why are we flooding?', status: 'in_progress', priority: 'high' },
|
|
55
|
-
{ id: 't3', title: 'Update README', description: 'Add embeddings docs', status: 'completed', priority: 'medium' },
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
describe('taskManagerTool — search wiring', () => {
|
|
59
|
-
test('missing query → clean error', async () => {
|
|
60
|
-
const tool = makeTool();
|
|
61
|
-
const r = await tool.searchTasks(makeAgent(tasks), {});
|
|
62
|
-
expect(r.success).toBe(false);
|
|
63
|
-
expect(r.error).toMatch(/query/i);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
test('disabled embeddings → substring fallback over title/description', async () => {
|
|
67
|
-
const tool = makeTool({ embeddingsEnabled: false });
|
|
68
|
-
const r = await tool.searchTasks(makeAgent(tasks), { query: 'telegram' });
|
|
69
|
-
expect(mockIndexerInstance.search).not.toHaveBeenCalled();
|
|
70
|
-
expect(r.mode).toBe('substring-fallback');
|
|
71
|
-
expect(r.results.some(t => t.id === 't2')).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
test('disabled fallback respects status filter', async () => {
|
|
75
|
-
const tool = makeTool({ embeddingsEnabled: false });
|
|
76
|
-
const r = await tool.searchTasks(makeAgent(tasks), { query: 'auth', status: 'pending' });
|
|
77
|
-
expect(r.results.every(t => t.status === 'pending')).toBe(true);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('enabled embeddings → forwards query + topK + hybrid + statusFilter to indexer', async () => {
|
|
81
|
-
const tool = makeTool();
|
|
82
|
-
mockIndexerInstance.search.mockResolvedValue({ enabled: true, hits: [] });
|
|
83
|
-
await tool.searchTasks(makeAgent(tasks), {
|
|
84
|
-
query: 'telegram', topK: 3, hybrid: false, status: 'in_progress',
|
|
85
|
-
});
|
|
86
|
-
expect(mockIndexerInstance.search).toHaveBeenCalledWith(
|
|
87
|
-
'agent-1', 'telegram',
|
|
88
|
-
{ topK: 3, hybrid: false, statusFilter: 'in_progress' },
|
|
89
|
-
);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('enabled embeddings → hydrates hits back to live tasks', async () => {
|
|
93
|
-
const tool = makeTool();
|
|
94
|
-
mockIndexerInstance.search.mockResolvedValue({
|
|
95
|
-
enabled: true,
|
|
96
|
-
hits: [
|
|
97
|
-
{ id: 't2', score: 0.9, metadata: { title: 'snap', status: 'in_progress' } },
|
|
98
|
-
{ id: 'gone', score: 0.5, metadata: { title: 'archived', status: 'pending' } },
|
|
99
|
-
],
|
|
100
|
-
});
|
|
101
|
-
const r = await tool.searchTasks(makeAgent(tasks), { query: 'q' });
|
|
102
|
-
expect(r.results[0]).toMatchObject({ id: 't2', title: 'Investigate Telegram dedup', score: 0.9 });
|
|
103
|
-
expect(r.results[1]).toMatchObject({ id: 'gone', missing: true });
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
test('indexer error surfaces in result', async () => {
|
|
107
|
-
const tool = makeTool();
|
|
108
|
-
mockIndexerInstance.search.mockResolvedValue({ enabled: true, hits: [], error: 'rate-limited' });
|
|
109
|
-
const r = await tool.searchTasks(makeAgent(tasks), { query: 'q' });
|
|
110
|
-
expect(r.success).toBe(false);
|
|
111
|
-
expect(r.error).toBe('rate-limited');
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
describe('taskManagerTool — backfill-search-index wiring', () => {
|
|
116
|
-
test('disabled → clean error', async () => {
|
|
117
|
-
const tool = makeTool({ embeddingsEnabled: false });
|
|
118
|
-
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
119
|
-
expect(r.success).toBe(false);
|
|
120
|
-
expect(r.message).toMatch(/not enabled/i);
|
|
121
|
-
expect(mockIndexerInstance.backfill).not.toHaveBeenCalled();
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test('enabled → walks agent.taskList.tasks + calls indexer.backfill', async () => {
|
|
125
|
-
const tool = makeTool();
|
|
126
|
-
mockIndexerInstance.backfill.mockResolvedValue({ ok: true, indexed: 3, skipped: 0, failed: 0 });
|
|
127
|
-
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
128
|
-
expect(mockIndexerInstance.backfill).toHaveBeenCalledWith('agent-1', tasks);
|
|
129
|
-
expect(r.success).toBe(true);
|
|
130
|
-
expect(r.indexed).toBe(3);
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test('reports failure counts honestly', async () => {
|
|
134
|
-
const tool = makeTool();
|
|
135
|
-
mockIndexerInstance.backfill.mockResolvedValue({
|
|
136
|
-
ok: false, indexed: 0, skipped: 0, failed: 3, error: 'rate-limited',
|
|
137
|
-
});
|
|
138
|
-
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
139
|
-
expect(r.success).toBe(false);
|
|
140
|
-
expect(r.failed).toBe(3);
|
|
141
|
-
expect(r.error).toBe('rate-limited');
|
|
142
|
-
});
|
|
143
|
-
});
|
|
1
|
+
/**
|
|
2
|
+
* taskManagerTool tests for search + backfill-search-index.
|
|
3
|
+
*
|
|
4
|
+
* Pins the wiring contracts only — the TaskIndexer's internals have
|
|
5
|
+
* their own dedicated suite. We test:
|
|
6
|
+
* - search dispatches to indexer when embeddings are enabled
|
|
7
|
+
* - search falls back to substring-on-title/description when disabled
|
|
8
|
+
* - status filter forwards correctly
|
|
9
|
+
* - missing query → clean error
|
|
10
|
+
* - hits hydrate back to live tasks from agent.taskList
|
|
11
|
+
* - backfill walks agent.taskList.tasks + reports counts
|
|
12
|
+
*
|
|
13
|
+
* Mocks: stub TaskIndexer at the module boundary.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { jest, describe, test, expect } from '@jest/globals';
|
|
17
|
+
|
|
18
|
+
const mockIndexerInstance = {
|
|
19
|
+
isEnabled: true,
|
|
20
|
+
indexOne: jest.fn().mockResolvedValue({ indexed: true }),
|
|
21
|
+
deleteOne: jest.fn().mockResolvedValue({ deleted: true }),
|
|
22
|
+
backfill: jest.fn().mockResolvedValue({ ok: true, indexed: 0, skipped: 0, failed: 0 }),
|
|
23
|
+
search: jest.fn().mockResolvedValue({ enabled: true, hits: [] }),
|
|
24
|
+
};
|
|
25
|
+
const MockTaskIndexer = jest.fn(() => mockIndexerInstance);
|
|
26
|
+
jest.unstable_mockModule('../../services/embeddings/indexers/taskIndexer.js', () => ({
|
|
27
|
+
TaskIndexer: MockTaskIndexer,
|
|
28
|
+
taskToText: () => '',
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
const { default: TaskManagerTool } = await import('../taskManagerTool.js');
|
|
32
|
+
|
|
33
|
+
function makeAgent(tasks = []) {
|
|
34
|
+
return {
|
|
35
|
+
id: 'agent-1',
|
|
36
|
+
taskList: { tasks },
|
|
37
|
+
status: 'active',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function makeTool({ embeddingsEnabled = true } = {}) {
|
|
42
|
+
const tool = new TaskManagerTool();
|
|
43
|
+
mockIndexerInstance.isEnabled = embeddingsEnabled;
|
|
44
|
+
mockIndexerInstance.search.mockClear();
|
|
45
|
+
mockIndexerInstance.backfill.mockClear();
|
|
46
|
+
MockTaskIndexer.mockClear();
|
|
47
|
+
tool.aiService = { getEmbeddingService: () => ({ isEnabled: embeddingsEnabled }) };
|
|
48
|
+
tool._taskIndexer = null;
|
|
49
|
+
return tool;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const tasks = [
|
|
53
|
+
{ id: 't1', title: 'Refactor auth flow', description: 'Move to OAuth 2.1', status: 'pending', priority: 'high' },
|
|
54
|
+
{ id: 't2', title: 'Investigate Telegram dedup', description: 'Why are we flooding?', status: 'in_progress', priority: 'high' },
|
|
55
|
+
{ id: 't3', title: 'Update README', description: 'Add embeddings docs', status: 'completed', priority: 'medium' },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
describe('taskManagerTool — search wiring', () => {
|
|
59
|
+
test('missing query → clean error', async () => {
|
|
60
|
+
const tool = makeTool();
|
|
61
|
+
const r = await tool.searchTasks(makeAgent(tasks), {});
|
|
62
|
+
expect(r.success).toBe(false);
|
|
63
|
+
expect(r.error).toMatch(/query/i);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('disabled embeddings → substring fallback over title/description', async () => {
|
|
67
|
+
const tool = makeTool({ embeddingsEnabled: false });
|
|
68
|
+
const r = await tool.searchTasks(makeAgent(tasks), { query: 'telegram' });
|
|
69
|
+
expect(mockIndexerInstance.search).not.toHaveBeenCalled();
|
|
70
|
+
expect(r.mode).toBe('substring-fallback');
|
|
71
|
+
expect(r.results.some(t => t.id === 't2')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('disabled fallback respects status filter', async () => {
|
|
75
|
+
const tool = makeTool({ embeddingsEnabled: false });
|
|
76
|
+
const r = await tool.searchTasks(makeAgent(tasks), { query: 'auth', status: 'pending' });
|
|
77
|
+
expect(r.results.every(t => t.status === 'pending')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('enabled embeddings → forwards query + topK + hybrid + statusFilter to indexer', async () => {
|
|
81
|
+
const tool = makeTool();
|
|
82
|
+
mockIndexerInstance.search.mockResolvedValue({ enabled: true, hits: [] });
|
|
83
|
+
await tool.searchTasks(makeAgent(tasks), {
|
|
84
|
+
query: 'telegram', topK: 3, hybrid: false, status: 'in_progress',
|
|
85
|
+
});
|
|
86
|
+
expect(mockIndexerInstance.search).toHaveBeenCalledWith(
|
|
87
|
+
'agent-1', 'telegram',
|
|
88
|
+
{ topK: 3, hybrid: false, statusFilter: 'in_progress' },
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('enabled embeddings → hydrates hits back to live tasks', async () => {
|
|
93
|
+
const tool = makeTool();
|
|
94
|
+
mockIndexerInstance.search.mockResolvedValue({
|
|
95
|
+
enabled: true,
|
|
96
|
+
hits: [
|
|
97
|
+
{ id: 't2', score: 0.9, metadata: { title: 'snap', status: 'in_progress' } },
|
|
98
|
+
{ id: 'gone', score: 0.5, metadata: { title: 'archived', status: 'pending' } },
|
|
99
|
+
],
|
|
100
|
+
});
|
|
101
|
+
const r = await tool.searchTasks(makeAgent(tasks), { query: 'q' });
|
|
102
|
+
expect(r.results[0]).toMatchObject({ id: 't2', title: 'Investigate Telegram dedup', score: 0.9 });
|
|
103
|
+
expect(r.results[1]).toMatchObject({ id: 'gone', missing: true });
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('indexer error surfaces in result', async () => {
|
|
107
|
+
const tool = makeTool();
|
|
108
|
+
mockIndexerInstance.search.mockResolvedValue({ enabled: true, hits: [], error: 'rate-limited' });
|
|
109
|
+
const r = await tool.searchTasks(makeAgent(tasks), { query: 'q' });
|
|
110
|
+
expect(r.success).toBe(false);
|
|
111
|
+
expect(r.error).toBe('rate-limited');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('taskManagerTool — backfill-search-index wiring', () => {
|
|
116
|
+
test('disabled → clean error', async () => {
|
|
117
|
+
const tool = makeTool({ embeddingsEnabled: false });
|
|
118
|
+
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
119
|
+
expect(r.success).toBe(false);
|
|
120
|
+
expect(r.message).toMatch(/not enabled/i);
|
|
121
|
+
expect(mockIndexerInstance.backfill).not.toHaveBeenCalled();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
test('enabled → walks agent.taskList.tasks + calls indexer.backfill', async () => {
|
|
125
|
+
const tool = makeTool();
|
|
126
|
+
mockIndexerInstance.backfill.mockResolvedValue({ ok: true, indexed: 3, skipped: 0, failed: 0 });
|
|
127
|
+
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
128
|
+
expect(mockIndexerInstance.backfill).toHaveBeenCalledWith('agent-1', tasks);
|
|
129
|
+
expect(r.success).toBe(true);
|
|
130
|
+
expect(r.indexed).toBe(3);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('reports failure counts honestly', async () => {
|
|
134
|
+
const tool = makeTool();
|
|
135
|
+
mockIndexerInstance.backfill.mockResolvedValue({
|
|
136
|
+
ok: false, indexed: 0, skipped: 0, failed: 3, error: 'rate-limited',
|
|
137
|
+
});
|
|
138
|
+
const r = await tool.backfillTasksSearchIndex(makeAgent(tasks));
|
|
139
|
+
expect(r.success).toBe(false);
|
|
140
|
+
expect(r.failed).toBe(3);
|
|
141
|
+
expect(r.error).toBe('rate-limited');
|
|
142
|
+
});
|
|
143
|
+
});
|