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
package/src/utilities/logger.js
CHANGED
|
@@ -1,480 +1,480 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger - Centralized logging system for the Loxia AI Agents System
|
|
3
|
-
*
|
|
4
|
-
* Purpose:
|
|
5
|
-
* - Structured logging with different levels
|
|
6
|
-
* - Agent activity logging
|
|
7
|
-
* - Tool execution logging
|
|
8
|
-
* - System event logging
|
|
9
|
-
* - Log output management (console, file)
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { promises as fs } from 'fs';
|
|
13
|
-
import path from 'path';
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
SYSTEM_VERSION
|
|
17
|
-
} from './constants.js';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Back-reference keys that appear inside tool-execute `context` objects
|
|
21
|
-
* and form cycles (AgentPool ⇄ MessageProcessor ⇄ Orchestrator etc.).
|
|
22
|
-
* Replaced with a '[ref:XYZ]' sentinel when they turn up in log metadata
|
|
23
|
-
* so a careless `logger.error('...', { context })` doesn't crash the
|
|
24
|
-
* process with "Converting circular structure to JSON".
|
|
25
|
-
*
|
|
26
|
-
* Kept here as a flat set so the per-call replacer stays O(1).
|
|
27
|
-
*/
|
|
28
|
-
const _LOG_CYCLE_KEYS = new Set([
|
|
29
|
-
'agentPool', 'messageProcessor', 'orchestrator',
|
|
30
|
-
'contextManager', 'aiService', 'toolsRegistry',
|
|
31
|
-
'webServer', 'stateManager', 'scheduler',
|
|
32
|
-
'webSocketManager', 'flowExecutor',
|
|
33
|
-
]);
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* JSON.stringify with a defensive replacer:
|
|
37
|
-
* 1. Known back-reference fields → '[ref:Foo]' (no serialisation)
|
|
38
|
-
* 2. Seen-set catches any other cycle that slips through
|
|
39
|
-
*
|
|
40
|
-
* Defence-in-depth for the "logger crashes if anyone passes a
|
|
41
|
-
* context-shaped object" class of bug. Callers should still pluck
|
|
42
|
-
* their own metadata — this is the safety net, not the main guard.
|
|
43
|
-
*/
|
|
44
|
-
function _safeStringify(obj) {
|
|
45
|
-
const seen = new WeakSet();
|
|
46
|
-
try {
|
|
47
|
-
return JSON.stringify(obj, (key, value) => {
|
|
48
|
-
if (_LOG_CYCLE_KEYS.has(key) && value && typeof value === 'object') {
|
|
49
|
-
const ctor = value.constructor?.name || 'Object';
|
|
50
|
-
return `[ref:${ctor}]`;
|
|
51
|
-
}
|
|
52
|
-
if (value && typeof value === 'object') {
|
|
53
|
-
if (seen.has(value)) return '[circular]';
|
|
54
|
-
seen.add(value);
|
|
55
|
-
}
|
|
56
|
-
return value;
|
|
57
|
-
});
|
|
58
|
-
} catch (err) {
|
|
59
|
-
return `[unserialisable: ${err.message}]`;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
class Logger {
|
|
64
|
-
constructor(config = {}) {
|
|
65
|
-
this.config = config;
|
|
66
|
-
|
|
67
|
-
// Log levels in order of severity
|
|
68
|
-
this.levels = {
|
|
69
|
-
error: 0,
|
|
70
|
-
warn: 1,
|
|
71
|
-
info: 2,
|
|
72
|
-
debug: 3
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
this.currentLevel = this.levels[config.level || 'info'];
|
|
76
|
-
this.outputs = config.outputs || ['console'];
|
|
77
|
-
this.logFile = config.logFile || null;
|
|
78
|
-
this.maxFileSize = config.maxFileSize || 10 * 1024 * 1024; // 10MB
|
|
79
|
-
this.maxFiles = config.maxFiles || 5;
|
|
80
|
-
|
|
81
|
-
// Log formatting
|
|
82
|
-
this.enableColors = config.colors !== false;
|
|
83
|
-
this.includeTimestamp = config.timestamp !== false;
|
|
84
|
-
this.includeLevel = config.includeLevel !== false;
|
|
85
|
-
|
|
86
|
-
// Color codes for console output
|
|
87
|
-
this.colors = {
|
|
88
|
-
error: '\x1b[31m', // Red
|
|
89
|
-
warn: '\x1b[33m', // Yellow
|
|
90
|
-
info: '\x1b[36m', // Cyan
|
|
91
|
-
debug: '\x1b[90m', // Gray
|
|
92
|
-
reset: '\x1b[0m'
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
this.initialized = false;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Initialize logger
|
|
100
|
-
* @returns {Promise<void>}
|
|
101
|
-
*/
|
|
102
|
-
async initialize() {
|
|
103
|
-
if (this.initialized) return;
|
|
104
|
-
|
|
105
|
-
try {
|
|
106
|
-
// Create log directory if file output is enabled
|
|
107
|
-
if (this.outputs.includes('file') && this.logFile) {
|
|
108
|
-
const logDir = path.dirname(this.logFile);
|
|
109
|
-
await fs.mkdir(logDir, { recursive: true });
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
this.initialized = true;
|
|
113
|
-
this.info('Logger initialized', {
|
|
114
|
-
level: Object.keys(this.levels)[this.currentLevel],
|
|
115
|
-
outputs: this.outputs,
|
|
116
|
-
logFile: this.logFile
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
} catch (error) {
|
|
120
|
-
console.error('Logger initialization failed:', error.message);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Log error message
|
|
126
|
-
* @param {string} message - Log message
|
|
127
|
-
* @param {Object} meta - Additional metadata
|
|
128
|
-
*/
|
|
129
|
-
error(message, meta = {}) {
|
|
130
|
-
this.log('error', message, meta);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Log warning message
|
|
135
|
-
* @param {string} message - Log message
|
|
136
|
-
* @param {Object} meta - Additional metadata
|
|
137
|
-
*/
|
|
138
|
-
warn(message, meta = {}) {
|
|
139
|
-
this.log('warn', message, meta);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Log info message
|
|
144
|
-
* @param {string} message - Log message
|
|
145
|
-
* @param {Object} meta - Additional metadata
|
|
146
|
-
*/
|
|
147
|
-
info(message, meta = {}) {
|
|
148
|
-
this.log('info', message, meta);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Log debug message
|
|
153
|
-
* @param {string} message - Log message
|
|
154
|
-
* @param {Object} meta - Additional metadata
|
|
155
|
-
*/
|
|
156
|
-
debug(message, meta = {}) {
|
|
157
|
-
this.log('debug', message, meta);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Log agent activity
|
|
162
|
-
* @param {string} agentId - Agent identifier
|
|
163
|
-
* @param {string} action - Action performed
|
|
164
|
-
* @param {Object} details - Action details
|
|
165
|
-
*/
|
|
166
|
-
logAgentActivity(agentId, action, details = {}) {
|
|
167
|
-
this.info(`[AGENT:${agentId}] ${action}`, {
|
|
168
|
-
category: 'agent-activity',
|
|
169
|
-
agentId,
|
|
170
|
-
action,
|
|
171
|
-
...details
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Log tool execution
|
|
177
|
-
* @param {string} toolId - Tool identifier
|
|
178
|
-
* @param {string} operationId - Operation identifier
|
|
179
|
-
* @param {string} status - Execution status
|
|
180
|
-
* @param {number} duration - Execution duration in ms
|
|
181
|
-
* @param {Object} details - Additional details
|
|
182
|
-
*/
|
|
183
|
-
logToolExecution(toolId, operationId, status, duration, details = {}) {
|
|
184
|
-
const level = status === 'failed' ? 'error' : 'info';
|
|
185
|
-
this[level](`[TOOL:${toolId}] Operation ${operationId} ${status} (${duration}ms)`, {
|
|
186
|
-
category: 'tool-execution',
|
|
187
|
-
toolId,
|
|
188
|
-
operationId,
|
|
189
|
-
status,
|
|
190
|
-
duration,
|
|
191
|
-
...details
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Log system event
|
|
197
|
-
* @param {string} event - Event name
|
|
198
|
-
* @param {Object} context - Event context
|
|
199
|
-
*/
|
|
200
|
-
logSystemEvent(event, context = {}) {
|
|
201
|
-
this.info(`[SYSTEM] ${event}`, {
|
|
202
|
-
category: 'system-event',
|
|
203
|
-
event,
|
|
204
|
-
...context
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Log API request/response
|
|
210
|
-
* @param {string} method - HTTP method
|
|
211
|
-
* @param {string} url - Request URL
|
|
212
|
-
* @param {number} status - Response status
|
|
213
|
-
* @param {number} duration - Request duration in ms
|
|
214
|
-
* @param {Object} details - Additional details
|
|
215
|
-
*/
|
|
216
|
-
logApiRequest(method, url, status, duration, details = {}) {
|
|
217
|
-
const level = status >= 400 ? 'error' : 'info';
|
|
218
|
-
this[level](`[API] ${method} ${url} ${status} (${duration}ms)`, {
|
|
219
|
-
category: 'api-request',
|
|
220
|
-
method,
|
|
221
|
-
url,
|
|
222
|
-
status,
|
|
223
|
-
duration,
|
|
224
|
-
...details
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Log with specified level
|
|
230
|
-
* @param {string} level - Log level
|
|
231
|
-
* @param {string} message - Log message
|
|
232
|
-
* @param {Object} meta - Additional metadata
|
|
233
|
-
*/
|
|
234
|
-
log(level, message, meta = {}) {
|
|
235
|
-
// Check if level is enabled
|
|
236
|
-
if (this.levels[level] > this.currentLevel) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const logEntry = this.createLogEntry(level, message, meta);
|
|
241
|
-
|
|
242
|
-
// Output to configured destinations
|
|
243
|
-
for (const output of this.outputs) {
|
|
244
|
-
switch (output) {
|
|
245
|
-
case 'console':
|
|
246
|
-
this.outputToConsole(logEntry);
|
|
247
|
-
break;
|
|
248
|
-
case 'file':
|
|
249
|
-
this.outputToFile(logEntry);
|
|
250
|
-
break;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Create structured log entry
|
|
257
|
-
* @private
|
|
258
|
-
*/
|
|
259
|
-
createLogEntry(level, message, meta) {
|
|
260
|
-
const entry = {
|
|
261
|
-
timestamp: new Date().toISOString(),
|
|
262
|
-
level: level.toUpperCase(),
|
|
263
|
-
message,
|
|
264
|
-
version: SYSTEM_VERSION,
|
|
265
|
-
...meta
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
// Add process information
|
|
269
|
-
entry.pid = process.pid;
|
|
270
|
-
|
|
271
|
-
// Add memory usage for debug level
|
|
272
|
-
if (level === 'debug') {
|
|
273
|
-
const memUsage = process.memoryUsage();
|
|
274
|
-
entry.memory = {
|
|
275
|
-
rss: Math.round(memUsage.rss / 1024 / 1024),
|
|
276
|
-
heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
|
|
277
|
-
heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024)
|
|
278
|
-
};
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return entry;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Output log entry to console
|
|
286
|
-
* @private
|
|
287
|
-
*/
|
|
288
|
-
outputToConsole(entry) {
|
|
289
|
-
let output = '';
|
|
290
|
-
|
|
291
|
-
// Add timestamp
|
|
292
|
-
if (this.includeTimestamp) {
|
|
293
|
-
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
294
|
-
output += `[${timestamp}] `;
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Add level with color
|
|
298
|
-
if (this.includeLevel) {
|
|
299
|
-
const levelStr = entry.level.padEnd(5);
|
|
300
|
-
if (this.enableColors && process.stdout.isTTY) {
|
|
301
|
-
const color = this.colors[entry.level.toLowerCase()] || '';
|
|
302
|
-
output += `${color}${levelStr}${this.colors.reset} `;
|
|
303
|
-
} else {
|
|
304
|
-
output += `${levelStr} `;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Add message
|
|
309
|
-
output += entry.message;
|
|
310
|
-
|
|
311
|
-
// Add metadata if present
|
|
312
|
-
const { timestamp, level, message, version, pid, ...metadata } = entry;
|
|
313
|
-
if (Object.keys(metadata).length > 0) {
|
|
314
|
-
output += ` ${_safeStringify(metadata)}`;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// Output based on level
|
|
318
|
-
if (entry.level === 'ERROR') {
|
|
319
|
-
console.error(output);
|
|
320
|
-
} else {
|
|
321
|
-
console.log(output);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Output log entry to file
|
|
327
|
-
* @private
|
|
328
|
-
*/
|
|
329
|
-
async outputToFile(entry) {
|
|
330
|
-
if (!this.logFile) return;
|
|
331
|
-
|
|
332
|
-
try {
|
|
333
|
-
// Check file size and rotate if needed
|
|
334
|
-
await this.rotateLogFileIfNeeded();
|
|
335
|
-
|
|
336
|
-
const logLine = _safeStringify(entry) + '\n';
|
|
337
|
-
await fs.appendFile(this.logFile, logLine, 'utf8');
|
|
338
|
-
|
|
339
|
-
} catch (error) {
|
|
340
|
-
console.error('Failed to write to log file:', error.message);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/**
|
|
345
|
-
* Rotate log file if it exceeds max size
|
|
346
|
-
* @private
|
|
347
|
-
*/
|
|
348
|
-
async rotateLogFileIfNeeded() {
|
|
349
|
-
try {
|
|
350
|
-
const stats = await fs.stat(this.logFile);
|
|
351
|
-
|
|
352
|
-
if (stats.size >= this.maxFileSize) {
|
|
353
|
-
await this.rotateLogFiles();
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
} catch (error) {
|
|
357
|
-
// File doesn't exist yet, that's ok
|
|
358
|
-
if (error.code !== 'ENOENT') {
|
|
359
|
-
throw error;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Rotate log files
|
|
366
|
-
* @private
|
|
367
|
-
*/
|
|
368
|
-
async rotateLogFiles() {
|
|
369
|
-
const dir = path.dirname(this.logFile);
|
|
370
|
-
const basename = path.basename(this.logFile, path.extname(this.logFile));
|
|
371
|
-
const ext = path.extname(this.logFile);
|
|
372
|
-
|
|
373
|
-
// Rotate existing files
|
|
374
|
-
for (let i = this.maxFiles - 1; i >= 1; i--) {
|
|
375
|
-
const oldFile = path.join(dir, `${basename}.${i}${ext}`);
|
|
376
|
-
const newFile = path.join(dir, `${basename}.${i + 1}${ext}`);
|
|
377
|
-
|
|
378
|
-
try {
|
|
379
|
-
await fs.rename(oldFile, newFile);
|
|
380
|
-
} catch (error) {
|
|
381
|
-
// File doesn't exist, continue
|
|
382
|
-
if (error.code !== 'ENOENT') {
|
|
383
|
-
console.error(`Failed to rotate log file ${oldFile}:`, error.message);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// Move current file to .1
|
|
389
|
-
const rotatedFile = path.join(dir, `${basename}.1${ext}`);
|
|
390
|
-
try {
|
|
391
|
-
await fs.rename(this.logFile, rotatedFile);
|
|
392
|
-
} catch (error) {
|
|
393
|
-
console.error(`Failed to rotate current log file:`, error.message);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/**
|
|
398
|
-
* Set log level
|
|
399
|
-
* @param {string} level - New log level
|
|
400
|
-
*/
|
|
401
|
-
setLevel(level) {
|
|
402
|
-
if (level in this.levels) {
|
|
403
|
-
this.currentLevel = this.levels[level];
|
|
404
|
-
this.info(`Log level changed to: ${level}`);
|
|
405
|
-
} else {
|
|
406
|
-
this.warn(`Invalid log level: ${level}. Valid levels: ${Object.keys(this.levels).join(', ')}`);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Add output destination
|
|
412
|
-
* @param {string} output - Output destination ('console' or 'file')
|
|
413
|
-
*/
|
|
414
|
-
addOutput(output) {
|
|
415
|
-
if (!this.outputs.includes(output)) {
|
|
416
|
-
this.outputs.push(output);
|
|
417
|
-
this.info(`Added log output: ${output}`);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
/**
|
|
422
|
-
* Remove output destination
|
|
423
|
-
* @param {string} output - Output destination to remove
|
|
424
|
-
*/
|
|
425
|
-
removeOutput(output) {
|
|
426
|
-
const index = this.outputs.indexOf(output);
|
|
427
|
-
if (index > -1) {
|
|
428
|
-
this.outputs.splice(index, 1);
|
|
429
|
-
this.info(`Removed log output: ${output}`);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/**
|
|
434
|
-
* Create child logger with additional context
|
|
435
|
-
* @param {Object} context - Additional context to include in all logs
|
|
436
|
-
* @returns {Logger} Child logger instance
|
|
437
|
-
*/
|
|
438
|
-
child(context) {
|
|
439
|
-
const childLogger = Object.create(this);
|
|
440
|
-
childLogger.childContext = { ...this.childContext, ...context };
|
|
441
|
-
return childLogger;
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* Flush any pending log entries
|
|
446
|
-
* @returns {Promise<void>}
|
|
447
|
-
*/
|
|
448
|
-
async flush() {
|
|
449
|
-
// File system writes are typically immediate, but this provides
|
|
450
|
-
// a hook for more complex logging backends
|
|
451
|
-
return Promise.resolve();
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/**
|
|
455
|
-
* Close logger and cleanup resources
|
|
456
|
-
* @returns {Promise<void>}
|
|
457
|
-
*/
|
|
458
|
-
async close() {
|
|
459
|
-
await this.flush();
|
|
460
|
-
this.info('Logger closed');
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Create a logger instance with specified configuration
|
|
466
|
-
* @param {Object} config - Logger configuration
|
|
467
|
-
* @returns {Logger} Logger instance
|
|
468
|
-
*/
|
|
469
|
-
function createLogger(config = {}) {
|
|
470
|
-
const logger = new Logger(config);
|
|
471
|
-
|
|
472
|
-
// Auto-initialize if not explicitly disabled
|
|
473
|
-
if (config.autoInit !== false) {
|
|
474
|
-
setImmediate(() => logger.initialize());
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return logger;
|
|
478
|
-
}
|
|
479
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Logger - Centralized logging system for the Loxia AI Agents System
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* - Structured logging with different levels
|
|
6
|
+
* - Agent activity logging
|
|
7
|
+
* - Tool execution logging
|
|
8
|
+
* - System event logging
|
|
9
|
+
* - Log output management (console, file)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { promises as fs } from 'fs';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
SYSTEM_VERSION
|
|
17
|
+
} from './constants.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Back-reference keys that appear inside tool-execute `context` objects
|
|
21
|
+
* and form cycles (AgentPool ⇄ MessageProcessor ⇄ Orchestrator etc.).
|
|
22
|
+
* Replaced with a '[ref:XYZ]' sentinel when they turn up in log metadata
|
|
23
|
+
* so a careless `logger.error('...', { context })` doesn't crash the
|
|
24
|
+
* process with "Converting circular structure to JSON".
|
|
25
|
+
*
|
|
26
|
+
* Kept here as a flat set so the per-call replacer stays O(1).
|
|
27
|
+
*/
|
|
28
|
+
const _LOG_CYCLE_KEYS = new Set([
|
|
29
|
+
'agentPool', 'messageProcessor', 'orchestrator',
|
|
30
|
+
'contextManager', 'aiService', 'toolsRegistry',
|
|
31
|
+
'webServer', 'stateManager', 'scheduler',
|
|
32
|
+
'webSocketManager', 'flowExecutor',
|
|
33
|
+
]);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* JSON.stringify with a defensive replacer:
|
|
37
|
+
* 1. Known back-reference fields → '[ref:Foo]' (no serialisation)
|
|
38
|
+
* 2. Seen-set catches any other cycle that slips through
|
|
39
|
+
*
|
|
40
|
+
* Defence-in-depth for the "logger crashes if anyone passes a
|
|
41
|
+
* context-shaped object" class of bug. Callers should still pluck
|
|
42
|
+
* their own metadata — this is the safety net, not the main guard.
|
|
43
|
+
*/
|
|
44
|
+
function _safeStringify(obj) {
|
|
45
|
+
const seen = new WeakSet();
|
|
46
|
+
try {
|
|
47
|
+
return JSON.stringify(obj, (key, value) => {
|
|
48
|
+
if (_LOG_CYCLE_KEYS.has(key) && value && typeof value === 'object') {
|
|
49
|
+
const ctor = value.constructor?.name || 'Object';
|
|
50
|
+
return `[ref:${ctor}]`;
|
|
51
|
+
}
|
|
52
|
+
if (value && typeof value === 'object') {
|
|
53
|
+
if (seen.has(value)) return '[circular]';
|
|
54
|
+
seen.add(value);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
});
|
|
58
|
+
} catch (err) {
|
|
59
|
+
return `[unserialisable: ${err.message}]`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
class Logger {
|
|
64
|
+
constructor(config = {}) {
|
|
65
|
+
this.config = config;
|
|
66
|
+
|
|
67
|
+
// Log levels in order of severity
|
|
68
|
+
this.levels = {
|
|
69
|
+
error: 0,
|
|
70
|
+
warn: 1,
|
|
71
|
+
info: 2,
|
|
72
|
+
debug: 3
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
this.currentLevel = this.levels[config.level || 'info'];
|
|
76
|
+
this.outputs = config.outputs || ['console'];
|
|
77
|
+
this.logFile = config.logFile || null;
|
|
78
|
+
this.maxFileSize = config.maxFileSize || 10 * 1024 * 1024; // 10MB
|
|
79
|
+
this.maxFiles = config.maxFiles || 5;
|
|
80
|
+
|
|
81
|
+
// Log formatting
|
|
82
|
+
this.enableColors = config.colors !== false;
|
|
83
|
+
this.includeTimestamp = config.timestamp !== false;
|
|
84
|
+
this.includeLevel = config.includeLevel !== false;
|
|
85
|
+
|
|
86
|
+
// Color codes for console output
|
|
87
|
+
this.colors = {
|
|
88
|
+
error: '\x1b[31m', // Red
|
|
89
|
+
warn: '\x1b[33m', // Yellow
|
|
90
|
+
info: '\x1b[36m', // Cyan
|
|
91
|
+
debug: '\x1b[90m', // Gray
|
|
92
|
+
reset: '\x1b[0m'
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
this.initialized = false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Initialize logger
|
|
100
|
+
* @returns {Promise<void>}
|
|
101
|
+
*/
|
|
102
|
+
async initialize() {
|
|
103
|
+
if (this.initialized) return;
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
// Create log directory if file output is enabled
|
|
107
|
+
if (this.outputs.includes('file') && this.logFile) {
|
|
108
|
+
const logDir = path.dirname(this.logFile);
|
|
109
|
+
await fs.mkdir(logDir, { recursive: true });
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
this.initialized = true;
|
|
113
|
+
this.info('Logger initialized', {
|
|
114
|
+
level: Object.keys(this.levels)[this.currentLevel],
|
|
115
|
+
outputs: this.outputs,
|
|
116
|
+
logFile: this.logFile
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error('Logger initialization failed:', error.message);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Log error message
|
|
126
|
+
* @param {string} message - Log message
|
|
127
|
+
* @param {Object} meta - Additional metadata
|
|
128
|
+
*/
|
|
129
|
+
error(message, meta = {}) {
|
|
130
|
+
this.log('error', message, meta);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Log warning message
|
|
135
|
+
* @param {string} message - Log message
|
|
136
|
+
* @param {Object} meta - Additional metadata
|
|
137
|
+
*/
|
|
138
|
+
warn(message, meta = {}) {
|
|
139
|
+
this.log('warn', message, meta);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Log info message
|
|
144
|
+
* @param {string} message - Log message
|
|
145
|
+
* @param {Object} meta - Additional metadata
|
|
146
|
+
*/
|
|
147
|
+
info(message, meta = {}) {
|
|
148
|
+
this.log('info', message, meta);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Log debug message
|
|
153
|
+
* @param {string} message - Log message
|
|
154
|
+
* @param {Object} meta - Additional metadata
|
|
155
|
+
*/
|
|
156
|
+
debug(message, meta = {}) {
|
|
157
|
+
this.log('debug', message, meta);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Log agent activity
|
|
162
|
+
* @param {string} agentId - Agent identifier
|
|
163
|
+
* @param {string} action - Action performed
|
|
164
|
+
* @param {Object} details - Action details
|
|
165
|
+
*/
|
|
166
|
+
logAgentActivity(agentId, action, details = {}) {
|
|
167
|
+
this.info(`[AGENT:${agentId}] ${action}`, {
|
|
168
|
+
category: 'agent-activity',
|
|
169
|
+
agentId,
|
|
170
|
+
action,
|
|
171
|
+
...details
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Log tool execution
|
|
177
|
+
* @param {string} toolId - Tool identifier
|
|
178
|
+
* @param {string} operationId - Operation identifier
|
|
179
|
+
* @param {string} status - Execution status
|
|
180
|
+
* @param {number} duration - Execution duration in ms
|
|
181
|
+
* @param {Object} details - Additional details
|
|
182
|
+
*/
|
|
183
|
+
logToolExecution(toolId, operationId, status, duration, details = {}) {
|
|
184
|
+
const level = status === 'failed' ? 'error' : 'info';
|
|
185
|
+
this[level](`[TOOL:${toolId}] Operation ${operationId} ${status} (${duration}ms)`, {
|
|
186
|
+
category: 'tool-execution',
|
|
187
|
+
toolId,
|
|
188
|
+
operationId,
|
|
189
|
+
status,
|
|
190
|
+
duration,
|
|
191
|
+
...details
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Log system event
|
|
197
|
+
* @param {string} event - Event name
|
|
198
|
+
* @param {Object} context - Event context
|
|
199
|
+
*/
|
|
200
|
+
logSystemEvent(event, context = {}) {
|
|
201
|
+
this.info(`[SYSTEM] ${event}`, {
|
|
202
|
+
category: 'system-event',
|
|
203
|
+
event,
|
|
204
|
+
...context
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Log API request/response
|
|
210
|
+
* @param {string} method - HTTP method
|
|
211
|
+
* @param {string} url - Request URL
|
|
212
|
+
* @param {number} status - Response status
|
|
213
|
+
* @param {number} duration - Request duration in ms
|
|
214
|
+
* @param {Object} details - Additional details
|
|
215
|
+
*/
|
|
216
|
+
logApiRequest(method, url, status, duration, details = {}) {
|
|
217
|
+
const level = status >= 400 ? 'error' : 'info';
|
|
218
|
+
this[level](`[API] ${method} ${url} ${status} (${duration}ms)`, {
|
|
219
|
+
category: 'api-request',
|
|
220
|
+
method,
|
|
221
|
+
url,
|
|
222
|
+
status,
|
|
223
|
+
duration,
|
|
224
|
+
...details
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Log with specified level
|
|
230
|
+
* @param {string} level - Log level
|
|
231
|
+
* @param {string} message - Log message
|
|
232
|
+
* @param {Object} meta - Additional metadata
|
|
233
|
+
*/
|
|
234
|
+
log(level, message, meta = {}) {
|
|
235
|
+
// Check if level is enabled
|
|
236
|
+
if (this.levels[level] > this.currentLevel) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const logEntry = this.createLogEntry(level, message, meta);
|
|
241
|
+
|
|
242
|
+
// Output to configured destinations
|
|
243
|
+
for (const output of this.outputs) {
|
|
244
|
+
switch (output) {
|
|
245
|
+
case 'console':
|
|
246
|
+
this.outputToConsole(logEntry);
|
|
247
|
+
break;
|
|
248
|
+
case 'file':
|
|
249
|
+
this.outputToFile(logEntry);
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Create structured log entry
|
|
257
|
+
* @private
|
|
258
|
+
*/
|
|
259
|
+
createLogEntry(level, message, meta) {
|
|
260
|
+
const entry = {
|
|
261
|
+
timestamp: new Date().toISOString(),
|
|
262
|
+
level: level.toUpperCase(),
|
|
263
|
+
message,
|
|
264
|
+
version: SYSTEM_VERSION,
|
|
265
|
+
...meta
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
// Add process information
|
|
269
|
+
entry.pid = process.pid;
|
|
270
|
+
|
|
271
|
+
// Add memory usage for debug level
|
|
272
|
+
if (level === 'debug') {
|
|
273
|
+
const memUsage = process.memoryUsage();
|
|
274
|
+
entry.memory = {
|
|
275
|
+
rss: Math.round(memUsage.rss / 1024 / 1024),
|
|
276
|
+
heapUsed: Math.round(memUsage.heapUsed / 1024 / 1024),
|
|
277
|
+
heapTotal: Math.round(memUsage.heapTotal / 1024 / 1024)
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return entry;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Output log entry to console
|
|
286
|
+
* @private
|
|
287
|
+
*/
|
|
288
|
+
outputToConsole(entry) {
|
|
289
|
+
let output = '';
|
|
290
|
+
|
|
291
|
+
// Add timestamp
|
|
292
|
+
if (this.includeTimestamp) {
|
|
293
|
+
const timestamp = new Date(entry.timestamp).toLocaleTimeString();
|
|
294
|
+
output += `[${timestamp}] `;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Add level with color
|
|
298
|
+
if (this.includeLevel) {
|
|
299
|
+
const levelStr = entry.level.padEnd(5);
|
|
300
|
+
if (this.enableColors && process.stdout.isTTY) {
|
|
301
|
+
const color = this.colors[entry.level.toLowerCase()] || '';
|
|
302
|
+
output += `${color}${levelStr}${this.colors.reset} `;
|
|
303
|
+
} else {
|
|
304
|
+
output += `${levelStr} `;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Add message
|
|
309
|
+
output += entry.message;
|
|
310
|
+
|
|
311
|
+
// Add metadata if present
|
|
312
|
+
const { timestamp: _timestamp, level: _level, message: _message, version: _version, pid: _pid, ...metadata } = entry;
|
|
313
|
+
if (Object.keys(metadata).length > 0) {
|
|
314
|
+
output += ` ${_safeStringify(metadata)}`;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Output based on level
|
|
318
|
+
if (entry.level === 'ERROR') {
|
|
319
|
+
console.error(output);
|
|
320
|
+
} else {
|
|
321
|
+
console.log(output);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Output log entry to file
|
|
327
|
+
* @private
|
|
328
|
+
*/
|
|
329
|
+
async outputToFile(entry) {
|
|
330
|
+
if (!this.logFile) return;
|
|
331
|
+
|
|
332
|
+
try {
|
|
333
|
+
// Check file size and rotate if needed
|
|
334
|
+
await this.rotateLogFileIfNeeded();
|
|
335
|
+
|
|
336
|
+
const logLine = _safeStringify(entry) + '\n';
|
|
337
|
+
await fs.appendFile(this.logFile, logLine, 'utf8');
|
|
338
|
+
|
|
339
|
+
} catch (error) {
|
|
340
|
+
console.error('Failed to write to log file:', error.message);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Rotate log file if it exceeds max size
|
|
346
|
+
* @private
|
|
347
|
+
*/
|
|
348
|
+
async rotateLogFileIfNeeded() {
|
|
349
|
+
try {
|
|
350
|
+
const stats = await fs.stat(this.logFile);
|
|
351
|
+
|
|
352
|
+
if (stats.size >= this.maxFileSize) {
|
|
353
|
+
await this.rotateLogFiles();
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
} catch (error) {
|
|
357
|
+
// File doesn't exist yet, that's ok
|
|
358
|
+
if (error.code !== 'ENOENT') {
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Rotate log files
|
|
366
|
+
* @private
|
|
367
|
+
*/
|
|
368
|
+
async rotateLogFiles() {
|
|
369
|
+
const dir = path.dirname(this.logFile);
|
|
370
|
+
const basename = path.basename(this.logFile, path.extname(this.logFile));
|
|
371
|
+
const ext = path.extname(this.logFile);
|
|
372
|
+
|
|
373
|
+
// Rotate existing files
|
|
374
|
+
for (let i = this.maxFiles - 1; i >= 1; i--) {
|
|
375
|
+
const oldFile = path.join(dir, `${basename}.${i}${ext}`);
|
|
376
|
+
const newFile = path.join(dir, `${basename}.${i + 1}${ext}`);
|
|
377
|
+
|
|
378
|
+
try {
|
|
379
|
+
await fs.rename(oldFile, newFile);
|
|
380
|
+
} catch (error) {
|
|
381
|
+
// File doesn't exist, continue
|
|
382
|
+
if (error.code !== 'ENOENT') {
|
|
383
|
+
console.error(`Failed to rotate log file ${oldFile}:`, error.message);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// Move current file to .1
|
|
389
|
+
const rotatedFile = path.join(dir, `${basename}.1${ext}`);
|
|
390
|
+
try {
|
|
391
|
+
await fs.rename(this.logFile, rotatedFile);
|
|
392
|
+
} catch (error) {
|
|
393
|
+
console.error(`Failed to rotate current log file:`, error.message);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Set log level
|
|
399
|
+
* @param {string} level - New log level
|
|
400
|
+
*/
|
|
401
|
+
setLevel(level) {
|
|
402
|
+
if (level in this.levels) {
|
|
403
|
+
this.currentLevel = this.levels[level];
|
|
404
|
+
this.info(`Log level changed to: ${level}`);
|
|
405
|
+
} else {
|
|
406
|
+
this.warn(`Invalid log level: ${level}. Valid levels: ${Object.keys(this.levels).join(', ')}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Add output destination
|
|
412
|
+
* @param {string} output - Output destination ('console' or 'file')
|
|
413
|
+
*/
|
|
414
|
+
addOutput(output) {
|
|
415
|
+
if (!this.outputs.includes(output)) {
|
|
416
|
+
this.outputs.push(output);
|
|
417
|
+
this.info(`Added log output: ${output}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/**
|
|
422
|
+
* Remove output destination
|
|
423
|
+
* @param {string} output - Output destination to remove
|
|
424
|
+
*/
|
|
425
|
+
removeOutput(output) {
|
|
426
|
+
const index = this.outputs.indexOf(output);
|
|
427
|
+
if (index > -1) {
|
|
428
|
+
this.outputs.splice(index, 1);
|
|
429
|
+
this.info(`Removed log output: ${output}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Create child logger with additional context
|
|
435
|
+
* @param {Object} context - Additional context to include in all logs
|
|
436
|
+
* @returns {Logger} Child logger instance
|
|
437
|
+
*/
|
|
438
|
+
child(context) {
|
|
439
|
+
const childLogger = Object.create(this);
|
|
440
|
+
childLogger.childContext = { ...this.childContext, ...context };
|
|
441
|
+
return childLogger;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Flush any pending log entries
|
|
446
|
+
* @returns {Promise<void>}
|
|
447
|
+
*/
|
|
448
|
+
async flush() {
|
|
449
|
+
// File system writes are typically immediate, but this provides
|
|
450
|
+
// a hook for more complex logging backends
|
|
451
|
+
return Promise.resolve();
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Close logger and cleanup resources
|
|
456
|
+
* @returns {Promise<void>}
|
|
457
|
+
*/
|
|
458
|
+
async close() {
|
|
459
|
+
await this.flush();
|
|
460
|
+
this.info('Logger closed');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/**
|
|
465
|
+
* Create a logger instance with specified configuration
|
|
466
|
+
* @param {Object} config - Logger configuration
|
|
467
|
+
* @returns {Logger} Logger instance
|
|
468
|
+
*/
|
|
469
|
+
function createLogger(config = {}) {
|
|
470
|
+
const logger = new Logger(config);
|
|
471
|
+
|
|
472
|
+
// Auto-initialize if not explicitly disabled
|
|
473
|
+
if (config.autoInit !== false) {
|
|
474
|
+
setImmediate(() => logger.initialize());
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return logger;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
480
|
export { Logger, createLogger };
|