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,344 +1,344 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analyzes clones and provides refactoring recommendations
|
|
3
|
-
*/
|
|
4
|
-
export class RefactoringAnalyzer {
|
|
5
|
-
constructor(config) {
|
|
6
|
-
this.config = config;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Analyze clones and provide refactoring advice
|
|
11
|
-
* @param {Array} clones - Array of detected clones
|
|
12
|
-
* @returns {Array} Enriched clones with refactoring advice
|
|
13
|
-
*/
|
|
14
|
-
analyzeClones(clones) {
|
|
15
|
-
console.log('Analyzing clones for refactoring opportunities...');
|
|
16
|
-
|
|
17
|
-
return clones.map((clone, index) => {
|
|
18
|
-
const metrics = this.calculateMetrics(clone);
|
|
19
|
-
const advice = this.generateRefactoringAdvice(clone, metrics);
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
id: `clone-${index + 1}`,
|
|
23
|
-
type: clone.type,
|
|
24
|
-
confidence: clone.confidence,
|
|
25
|
-
instances: clone.blocks.map(block => ({
|
|
26
|
-
file: block.file,
|
|
27
|
-
startLine: block.startLine,
|
|
28
|
-
endLine: block.endLine,
|
|
29
|
-
code: this.truncateCode(block.code),
|
|
30
|
-
fullCode: block.code,
|
|
31
|
-
blockType: block.type
|
|
32
|
-
})),
|
|
33
|
-
metrics,
|
|
34
|
-
refactoringAdvice: advice
|
|
35
|
-
};
|
|
36
|
-
}).sort((a, b) => b.metrics.impactScore - a.metrics.impactScore);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Calculate metrics for a clone
|
|
41
|
-
*/
|
|
42
|
-
calculateMetrics(clone) {
|
|
43
|
-
const blocks = clone.blocks;
|
|
44
|
-
const tokenCount = clone.tokenCount;
|
|
45
|
-
const lineCount = this.averageLineCount(blocks);
|
|
46
|
-
const instanceCount = blocks.length;
|
|
47
|
-
|
|
48
|
-
// Calculate impact score (higher = more important to refactor)
|
|
49
|
-
const impactScore = this.calculateImpactScore(
|
|
50
|
-
tokenCount,
|
|
51
|
-
lineCount,
|
|
52
|
-
instanceCount,
|
|
53
|
-
clone.confidence
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
// Calculate duplication overhead
|
|
57
|
-
const duplicatedLines = lineCount * (instanceCount - 1);
|
|
58
|
-
const duplicatedTokens = tokenCount * (instanceCount - 1);
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
tokenCount,
|
|
62
|
-
lineCount,
|
|
63
|
-
instanceCount,
|
|
64
|
-
duplicatedLines,
|
|
65
|
-
duplicatedTokens,
|
|
66
|
-
impactScore: parseFloat(impactScore.toFixed(2)),
|
|
67
|
-
filesCovered: new Set(blocks.map(b => b.file)).size
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Calculate impact score for prioritization
|
|
73
|
-
*/
|
|
74
|
-
calculateImpactScore(tokenCount, lineCount, instanceCount, confidence) {
|
|
75
|
-
// Weighted formula:
|
|
76
|
-
// - Size matters (more tokens = more important)
|
|
77
|
-
// - Instances matter (more copies = more important)
|
|
78
|
-
// - Confidence matters
|
|
79
|
-
// - Line count matters (user visibility)
|
|
80
|
-
|
|
81
|
-
const sizeScore = Math.log10(tokenCount + 1) * 2;
|
|
82
|
-
const instanceScore = Math.log2(instanceCount + 1) * 3;
|
|
83
|
-
const confidenceScore = confidence * 2;
|
|
84
|
-
const lineScore = Math.min(lineCount / 10, 3);
|
|
85
|
-
|
|
86
|
-
return sizeScore + instanceScore + confidenceScore + lineScore;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Generate refactoring advice
|
|
91
|
-
*/
|
|
92
|
-
generateRefactoringAdvice(clone, metrics) {
|
|
93
|
-
const strategy = this.determineRefactoringStrategy(clone, metrics);
|
|
94
|
-
const priority = this.determinePriority(metrics);
|
|
95
|
-
const suggestedName = this.suggestName(clone);
|
|
96
|
-
const reasoning = this.generateReasoning(clone, metrics, strategy);
|
|
97
|
-
const estimatedEffort = this.estimateEffort(metrics, strategy);
|
|
98
|
-
const benefits = this.describeBenefits(metrics);
|
|
99
|
-
|
|
100
|
-
return {
|
|
101
|
-
priority,
|
|
102
|
-
strategy,
|
|
103
|
-
suggestedName,
|
|
104
|
-
reasoning,
|
|
105
|
-
estimatedEffort,
|
|
106
|
-
benefits,
|
|
107
|
-
actionableSteps: this.generateActionableSteps(strategy, suggestedName
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Determine refactoring strategy
|
|
113
|
-
*/
|
|
114
|
-
determineRefactoringStrategy(clone, metrics) {
|
|
115
|
-
const { tokenCount, lineCount,
|
|
116
|
-
const blockTypes = clone.blocks.map(b => b.type);
|
|
117
|
-
|
|
118
|
-
// Check if it's a function/method
|
|
119
|
-
const isFunctionLike = blockTypes.some(type =>
|
|
120
|
-
type.includes('Function') || type.includes('Method')
|
|
121
|
-
);
|
|
122
|
-
|
|
123
|
-
// Check if it's a class
|
|
124
|
-
const isClassLike = blockTypes.some(type =>
|
|
125
|
-
type.includes('Class')
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
// Decision tree
|
|
129
|
-
if (isClassLike && lineCount > 50) {
|
|
130
|
-
return 'extract-module';
|
|
131
|
-
} else if (filesCovered > 2 && tokenCount > 100) {
|
|
132
|
-
return 'extract-module';
|
|
133
|
-
} else if (isFunctionLike || (lineCount >= 10 && lineCount <= 50)) {
|
|
134
|
-
return 'extract-function';
|
|
135
|
-
} else if (lineCount > 50) {
|
|
136
|
-
return 'extract-class';
|
|
137
|
-
} else if (lineCount < 10) {
|
|
138
|
-
return 'extract-constant-or-utility';
|
|
139
|
-
} else {
|
|
140
|
-
return 'extract-function';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Determine priority level
|
|
146
|
-
*/
|
|
147
|
-
determinePriority(metrics) {
|
|
148
|
-
const { impactScore } = metrics;
|
|
149
|
-
|
|
150
|
-
if (impactScore >= 8) return 'high';
|
|
151
|
-
if (impactScore >= 5) return 'medium';
|
|
152
|
-
return 'low';
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Suggest a name based on code analysis
|
|
157
|
-
*/
|
|
158
|
-
suggestName(clone) {
|
|
159
|
-
// Extract common words from the code
|
|
160
|
-
const allCode = clone.blocks.map(b => b.code).join(' ');
|
|
161
|
-
|
|
162
|
-
// Look for common identifiers
|
|
163
|
-
const identifiers = allCode.match(/[a-zA-Z_$][a-zA-Z0-9_$]*/g) || [];
|
|
164
|
-
const frequency = {};
|
|
165
|
-
|
|
166
|
-
identifiers.forEach(id => {
|
|
167
|
-
// Skip common keywords
|
|
168
|
-
if (['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while'].includes(id)) {
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
frequency[id] = (frequency[id] || 0) + 1;
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
// Find most common meaningful identifier
|
|
175
|
-
const sorted = Object.entries(frequency)
|
|
176
|
-
.sort((a, b) => b[1] - a[1])
|
|
177
|
-
.slice(0, 3);
|
|
178
|
-
|
|
179
|
-
if (sorted.length > 0) {
|
|
180
|
-
// Create a descriptive name from top identifiers
|
|
181
|
-
const topWords = sorted.map(([word]) => word);
|
|
182
|
-
return this.createFunctionName(topWords);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return 'extractedFunction';
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Create a function name from words
|
|
190
|
-
*/
|
|
191
|
-
createFunctionName(words) {
|
|
192
|
-
if (words.length === 0) return 'extractedFunction';
|
|
193
|
-
|
|
194
|
-
// Convert to camelCase
|
|
195
|
-
return words[0] + words.slice(1).map(w =>
|
|
196
|
-
w.charAt(0).toUpperCase() + w.slice(1)
|
|
197
|
-
).join('');
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Generate reasoning for refactoring
|
|
202
|
-
*/
|
|
203
|
-
generateReasoning(clone, metrics, strategy) {
|
|
204
|
-
const { instanceCount, duplicatedLines, filesCovered } = metrics;
|
|
205
|
-
|
|
206
|
-
let reasoning = `This ${clone.type} code pattern appears ${instanceCount} times`;
|
|
207
|
-
|
|
208
|
-
if (filesCovered > 1) {
|
|
209
|
-
reasoning += ` across ${filesCovered} different files`;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
reasoning += `, resulting in ${duplicatedLines} duplicated lines. `;
|
|
213
|
-
|
|
214
|
-
reasoning += `Refactoring to ${strategy.replace(/-/g, ' ')} would improve maintainability`;
|
|
215
|
-
|
|
216
|
-
if (instanceCount >= 3) {
|
|
217
|
-
reasoning += ', reduce bugs from inconsistent changes';
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
reasoning += ', and reduce code size';
|
|
221
|
-
|
|
222
|
-
if (metrics.impactScore >= 8) {
|
|
223
|
-
reasoning += '. This is a high-impact refactoring opportunity';
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
return reasoning + '.';
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Estimate effort for refactoring
|
|
231
|
-
*/
|
|
232
|
-
estimateEffort(metrics, strategy) {
|
|
233
|
-
const { lineCount, instanceCount, filesCovered } = metrics;
|
|
234
|
-
|
|
235
|
-
let effortPoints = 0;
|
|
236
|
-
|
|
237
|
-
// Base effort on size
|
|
238
|
-
effortPoints += Math.min(lineCount / 10, 5);
|
|
239
|
-
|
|
240
|
-
// Effort increases with instances
|
|
241
|
-
effortPoints += instanceCount * 0.5;
|
|
242
|
-
|
|
243
|
-
// Effort increases with file spread
|
|
244
|
-
effortPoints += filesCovered * 0.5;
|
|
245
|
-
|
|
246
|
-
// Strategy-specific effort
|
|
247
|
-
if (strategy === 'extract-module') {
|
|
248
|
-
effortPoints += 3;
|
|
249
|
-
} else if (strategy === 'extract-class') {
|
|
250
|
-
effortPoints += 2;
|
|
251
|
-
} else if (strategy === 'extract-function') {
|
|
252
|
-
effortPoints += 1;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
if (effortPoints <= 3) return 'low';
|
|
256
|
-
if (effortPoints <= 7) return 'medium';
|
|
257
|
-
return 'high';
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Describe benefits of refactoring
|
|
262
|
-
*/
|
|
263
|
-
describeBenefits(metrics) {
|
|
264
|
-
const benefits = [];
|
|
265
|
-
|
|
266
|
-
benefits.push(`Eliminate ${metrics.duplicatedLines} duplicated lines of code`);
|
|
267
|
-
benefits.push(`Improve maintainability by centralizing logic in one place`);
|
|
268
|
-
|
|
269
|
-
if (metrics.instanceCount >= 3) {
|
|
270
|
-
benefits.push(`Reduce risk of inconsistent changes across ${metrics.instanceCount} locations`);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
if (metrics.filesCovered > 2) {
|
|
274
|
-
benefits.push(`Improve code organization across ${metrics.filesCovered} files`);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
benefits.push('Make future changes easier and less error-prone');
|
|
278
|
-
|
|
279
|
-
return benefits;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Generate actionable steps
|
|
284
|
-
*/
|
|
285
|
-
generateActionableSteps(strategy, suggestedName
|
|
286
|
-
const steps = [];
|
|
287
|
-
|
|
288
|
-
switch (strategy) {
|
|
289
|
-
case 'extract-function':
|
|
290
|
-
steps.push(`1. Create a new function named '${suggestedName}'`);
|
|
291
|
-
steps.push('2. Move the duplicated logic into this function');
|
|
292
|
-
steps.push('3. Identify parameters needed from the surrounding context');
|
|
293
|
-
steps.push('4. Replace all instances with calls to the new function');
|
|
294
|
-
steps.push('5. Test to ensure behavior is preserved');
|
|
295
|
-
break;
|
|
296
|
-
|
|
297
|
-
case 'extract-class':
|
|
298
|
-
steps.push(`1. Create a new class to encapsulate this functionality`);
|
|
299
|
-
steps.push('2. Move related methods and properties into the class');
|
|
300
|
-
steps.push('3. Update all instances to use the new class');
|
|
301
|
-
steps.push('4. Consider dependency injection for better testability');
|
|
302
|
-
break;
|
|
303
|
-
|
|
304
|
-
case 'extract-module':
|
|
305
|
-
steps.push(`1. Create a new module/file for this shared functionality`);
|
|
306
|
-
steps.push('2. Move the duplicated code into the new module');
|
|
307
|
-
steps.push('3. Export the necessary functions/classes');
|
|
308
|
-
steps.push('4. Update all files to import from the new module');
|
|
309
|
-
steps.push('5. Update any build configurations if needed');
|
|
310
|
-
break;
|
|
311
|
-
|
|
312
|
-
default:
|
|
313
|
-
steps.push(`1. Extract the duplicated code using ${strategy.replace(/-/g, ' ')}`);
|
|
314
|
-
steps.push('2. Replace all instances with the extracted version');
|
|
315
|
-
steps.push('3. Test thoroughly');
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
return steps;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Truncate code for display
|
|
323
|
-
*/
|
|
324
|
-
truncateCode(code, maxLines = 10) {
|
|
325
|
-
const lines = code.split('\n');
|
|
326
|
-
|
|
327
|
-
if (lines.length <= maxLines) {
|
|
328
|
-
return code;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return lines.slice(0, maxLines).join('\n') + '\n... (truncated)';
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Calculate average line count
|
|
336
|
-
*/
|
|
337
|
-
averageLineCount(blocks) {
|
|
338
|
-
const totalLines = blocks.reduce((sum, block) =>
|
|
339
|
-
sum + (block.endLine - block.startLine + 1), 0
|
|
340
|
-
);
|
|
341
|
-
|
|
342
|
-
return Math.round(totalLines / blocks.length);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Analyzes clones and provides refactoring recommendations
|
|
3
|
+
*/
|
|
4
|
+
export class RefactoringAnalyzer {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Analyze clones and provide refactoring advice
|
|
11
|
+
* @param {Array} clones - Array of detected clones
|
|
12
|
+
* @returns {Array} Enriched clones with refactoring advice
|
|
13
|
+
*/
|
|
14
|
+
analyzeClones(clones) {
|
|
15
|
+
console.log('Analyzing clones for refactoring opportunities...');
|
|
16
|
+
|
|
17
|
+
return clones.map((clone, index) => {
|
|
18
|
+
const metrics = this.calculateMetrics(clone);
|
|
19
|
+
const advice = this.generateRefactoringAdvice(clone, metrics);
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
id: `clone-${index + 1}`,
|
|
23
|
+
type: clone.type,
|
|
24
|
+
confidence: clone.confidence,
|
|
25
|
+
instances: clone.blocks.map(block => ({
|
|
26
|
+
file: block.file,
|
|
27
|
+
startLine: block.startLine,
|
|
28
|
+
endLine: block.endLine,
|
|
29
|
+
code: this.truncateCode(block.code),
|
|
30
|
+
fullCode: block.code,
|
|
31
|
+
blockType: block.type
|
|
32
|
+
})),
|
|
33
|
+
metrics,
|
|
34
|
+
refactoringAdvice: advice
|
|
35
|
+
};
|
|
36
|
+
}).sort((a, b) => b.metrics.impactScore - a.metrics.impactScore);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Calculate metrics for a clone
|
|
41
|
+
*/
|
|
42
|
+
calculateMetrics(clone) {
|
|
43
|
+
const blocks = clone.blocks;
|
|
44
|
+
const tokenCount = clone.tokenCount;
|
|
45
|
+
const lineCount = this.averageLineCount(blocks);
|
|
46
|
+
const instanceCount = blocks.length;
|
|
47
|
+
|
|
48
|
+
// Calculate impact score (higher = more important to refactor)
|
|
49
|
+
const impactScore = this.calculateImpactScore(
|
|
50
|
+
tokenCount,
|
|
51
|
+
lineCount,
|
|
52
|
+
instanceCount,
|
|
53
|
+
clone.confidence
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Calculate duplication overhead
|
|
57
|
+
const duplicatedLines = lineCount * (instanceCount - 1);
|
|
58
|
+
const duplicatedTokens = tokenCount * (instanceCount - 1);
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
tokenCount,
|
|
62
|
+
lineCount,
|
|
63
|
+
instanceCount,
|
|
64
|
+
duplicatedLines,
|
|
65
|
+
duplicatedTokens,
|
|
66
|
+
impactScore: parseFloat(impactScore.toFixed(2)),
|
|
67
|
+
filesCovered: new Set(blocks.map(b => b.file)).size
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Calculate impact score for prioritization
|
|
73
|
+
*/
|
|
74
|
+
calculateImpactScore(tokenCount, lineCount, instanceCount, confidence) {
|
|
75
|
+
// Weighted formula:
|
|
76
|
+
// - Size matters (more tokens = more important)
|
|
77
|
+
// - Instances matter (more copies = more important)
|
|
78
|
+
// - Confidence matters
|
|
79
|
+
// - Line count matters (user visibility)
|
|
80
|
+
|
|
81
|
+
const sizeScore = Math.log10(tokenCount + 1) * 2;
|
|
82
|
+
const instanceScore = Math.log2(instanceCount + 1) * 3;
|
|
83
|
+
const confidenceScore = confidence * 2;
|
|
84
|
+
const lineScore = Math.min(lineCount / 10, 3);
|
|
85
|
+
|
|
86
|
+
return sizeScore + instanceScore + confidenceScore + lineScore;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Generate refactoring advice
|
|
91
|
+
*/
|
|
92
|
+
generateRefactoringAdvice(clone, metrics) {
|
|
93
|
+
const strategy = this.determineRefactoringStrategy(clone, metrics);
|
|
94
|
+
const priority = this.determinePriority(metrics);
|
|
95
|
+
const suggestedName = this.suggestName(clone);
|
|
96
|
+
const reasoning = this.generateReasoning(clone, metrics, strategy);
|
|
97
|
+
const estimatedEffort = this.estimateEffort(metrics, strategy);
|
|
98
|
+
const benefits = this.describeBenefits(metrics);
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
priority,
|
|
102
|
+
strategy,
|
|
103
|
+
suggestedName,
|
|
104
|
+
reasoning,
|
|
105
|
+
estimatedEffort,
|
|
106
|
+
benefits,
|
|
107
|
+
actionableSteps: this.generateActionableSteps(strategy, suggestedName)
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Determine refactoring strategy
|
|
113
|
+
*/
|
|
114
|
+
determineRefactoringStrategy(clone, metrics) {
|
|
115
|
+
const { tokenCount, lineCount, filesCovered } = metrics;
|
|
116
|
+
const blockTypes = clone.blocks.map(b => b.type);
|
|
117
|
+
|
|
118
|
+
// Check if it's a function/method
|
|
119
|
+
const isFunctionLike = blockTypes.some(type =>
|
|
120
|
+
type.includes('Function') || type.includes('Method')
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
// Check if it's a class
|
|
124
|
+
const isClassLike = blockTypes.some(type =>
|
|
125
|
+
type.includes('Class')
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// Decision tree
|
|
129
|
+
if (isClassLike && lineCount > 50) {
|
|
130
|
+
return 'extract-module';
|
|
131
|
+
} else if (filesCovered > 2 && tokenCount > 100) {
|
|
132
|
+
return 'extract-module';
|
|
133
|
+
} else if (isFunctionLike || (lineCount >= 10 && lineCount <= 50)) {
|
|
134
|
+
return 'extract-function';
|
|
135
|
+
} else if (lineCount > 50) {
|
|
136
|
+
return 'extract-class';
|
|
137
|
+
} else if (lineCount < 10) {
|
|
138
|
+
return 'extract-constant-or-utility';
|
|
139
|
+
} else {
|
|
140
|
+
return 'extract-function';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Determine priority level
|
|
146
|
+
*/
|
|
147
|
+
determinePriority(metrics) {
|
|
148
|
+
const { impactScore } = metrics;
|
|
149
|
+
|
|
150
|
+
if (impactScore >= 8) return 'high';
|
|
151
|
+
if (impactScore >= 5) return 'medium';
|
|
152
|
+
return 'low';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Suggest a name based on code analysis
|
|
157
|
+
*/
|
|
158
|
+
suggestName(clone) {
|
|
159
|
+
// Extract common words from the code
|
|
160
|
+
const allCode = clone.blocks.map(b => b.code).join(' ');
|
|
161
|
+
|
|
162
|
+
// Look for common identifiers
|
|
163
|
+
const identifiers = allCode.match(/[a-zA-Z_$][a-zA-Z0-9_$]*/g) || [];
|
|
164
|
+
const frequency = {};
|
|
165
|
+
|
|
166
|
+
identifiers.forEach(id => {
|
|
167
|
+
// Skip common keywords
|
|
168
|
+
if (['const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while'].includes(id)) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
frequency[id] = (frequency[id] || 0) + 1;
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// Find most common meaningful identifier
|
|
175
|
+
const sorted = Object.entries(frequency)
|
|
176
|
+
.sort((a, b) => b[1] - a[1])
|
|
177
|
+
.slice(0, 3);
|
|
178
|
+
|
|
179
|
+
if (sorted.length > 0) {
|
|
180
|
+
// Create a descriptive name from top identifiers
|
|
181
|
+
const topWords = sorted.map(([word]) => word);
|
|
182
|
+
return this.createFunctionName(topWords);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return 'extractedFunction';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Create a function name from words
|
|
190
|
+
*/
|
|
191
|
+
createFunctionName(words) {
|
|
192
|
+
if (words.length === 0) return 'extractedFunction';
|
|
193
|
+
|
|
194
|
+
// Convert to camelCase
|
|
195
|
+
return words[0] + words.slice(1).map(w =>
|
|
196
|
+
w.charAt(0).toUpperCase() + w.slice(1)
|
|
197
|
+
).join('');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Generate reasoning for refactoring
|
|
202
|
+
*/
|
|
203
|
+
generateReasoning(clone, metrics, strategy) {
|
|
204
|
+
const { instanceCount, duplicatedLines, filesCovered } = metrics;
|
|
205
|
+
|
|
206
|
+
let reasoning = `This ${clone.type} code pattern appears ${instanceCount} times`;
|
|
207
|
+
|
|
208
|
+
if (filesCovered > 1) {
|
|
209
|
+
reasoning += ` across ${filesCovered} different files`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
reasoning += `, resulting in ${duplicatedLines} duplicated lines. `;
|
|
213
|
+
|
|
214
|
+
reasoning += `Refactoring to ${strategy.replace(/-/g, ' ')} would improve maintainability`;
|
|
215
|
+
|
|
216
|
+
if (instanceCount >= 3) {
|
|
217
|
+
reasoning += ', reduce bugs from inconsistent changes';
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
reasoning += ', and reduce code size';
|
|
221
|
+
|
|
222
|
+
if (metrics.impactScore >= 8) {
|
|
223
|
+
reasoning += '. This is a high-impact refactoring opportunity';
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return reasoning + '.';
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Estimate effort for refactoring
|
|
231
|
+
*/
|
|
232
|
+
estimateEffort(metrics, strategy) {
|
|
233
|
+
const { lineCount, instanceCount, filesCovered } = metrics;
|
|
234
|
+
|
|
235
|
+
let effortPoints = 0;
|
|
236
|
+
|
|
237
|
+
// Base effort on size
|
|
238
|
+
effortPoints += Math.min(lineCount / 10, 5);
|
|
239
|
+
|
|
240
|
+
// Effort increases with instances
|
|
241
|
+
effortPoints += instanceCount * 0.5;
|
|
242
|
+
|
|
243
|
+
// Effort increases with file spread
|
|
244
|
+
effortPoints += filesCovered * 0.5;
|
|
245
|
+
|
|
246
|
+
// Strategy-specific effort
|
|
247
|
+
if (strategy === 'extract-module') {
|
|
248
|
+
effortPoints += 3;
|
|
249
|
+
} else if (strategy === 'extract-class') {
|
|
250
|
+
effortPoints += 2;
|
|
251
|
+
} else if (strategy === 'extract-function') {
|
|
252
|
+
effortPoints += 1;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (effortPoints <= 3) return 'low';
|
|
256
|
+
if (effortPoints <= 7) return 'medium';
|
|
257
|
+
return 'high';
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Describe benefits of refactoring
|
|
262
|
+
*/
|
|
263
|
+
describeBenefits(metrics) {
|
|
264
|
+
const benefits = [];
|
|
265
|
+
|
|
266
|
+
benefits.push(`Eliminate ${metrics.duplicatedLines} duplicated lines of code`);
|
|
267
|
+
benefits.push(`Improve maintainability by centralizing logic in one place`);
|
|
268
|
+
|
|
269
|
+
if (metrics.instanceCount >= 3) {
|
|
270
|
+
benefits.push(`Reduce risk of inconsistent changes across ${metrics.instanceCount} locations`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (metrics.filesCovered > 2) {
|
|
274
|
+
benefits.push(`Improve code organization across ${metrics.filesCovered} files`);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
benefits.push('Make future changes easier and less error-prone');
|
|
278
|
+
|
|
279
|
+
return benefits;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Generate actionable steps
|
|
284
|
+
*/
|
|
285
|
+
generateActionableSteps(strategy, suggestedName) {
|
|
286
|
+
const steps = [];
|
|
287
|
+
|
|
288
|
+
switch (strategy) {
|
|
289
|
+
case 'extract-function':
|
|
290
|
+
steps.push(`1. Create a new function named '${suggestedName}'`);
|
|
291
|
+
steps.push('2. Move the duplicated logic into this function');
|
|
292
|
+
steps.push('3. Identify parameters needed from the surrounding context');
|
|
293
|
+
steps.push('4. Replace all instances with calls to the new function');
|
|
294
|
+
steps.push('5. Test to ensure behavior is preserved');
|
|
295
|
+
break;
|
|
296
|
+
|
|
297
|
+
case 'extract-class':
|
|
298
|
+
steps.push(`1. Create a new class to encapsulate this functionality`);
|
|
299
|
+
steps.push('2. Move related methods and properties into the class');
|
|
300
|
+
steps.push('3. Update all instances to use the new class');
|
|
301
|
+
steps.push('4. Consider dependency injection for better testability');
|
|
302
|
+
break;
|
|
303
|
+
|
|
304
|
+
case 'extract-module':
|
|
305
|
+
steps.push(`1. Create a new module/file for this shared functionality`);
|
|
306
|
+
steps.push('2. Move the duplicated code into the new module');
|
|
307
|
+
steps.push('3. Export the necessary functions/classes');
|
|
308
|
+
steps.push('4. Update all files to import from the new module');
|
|
309
|
+
steps.push('5. Update any build configurations if needed');
|
|
310
|
+
break;
|
|
311
|
+
|
|
312
|
+
default:
|
|
313
|
+
steps.push(`1. Extract the duplicated code using ${strategy.replace(/-/g, ' ')}`);
|
|
314
|
+
steps.push('2. Replace all instances with the extracted version');
|
|
315
|
+
steps.push('3. Test thoroughly');
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return steps;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Truncate code for display
|
|
323
|
+
*/
|
|
324
|
+
truncateCode(code, maxLines = 10) {
|
|
325
|
+
const lines = code.split('\n');
|
|
326
|
+
|
|
327
|
+
if (lines.length <= maxLines) {
|
|
328
|
+
return code;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return lines.slice(0, maxLines).join('\n') + '\n... (truncated)';
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Calculate average line count
|
|
336
|
+
*/
|
|
337
|
+
averageLineCount(blocks) {
|
|
338
|
+
const totalLines = blocks.reduce((sum, block) =>
|
|
339
|
+
sum + (block.endLine - block.startLine + 1), 0
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
return Math.round(totalLines / blocks.length);
|
|
343
|
+
}
|
|
344
|
+
}
|