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
|
@@ -18,10 +18,9 @@ import {
|
|
|
18
18
|
COMMAND_FORMATS,
|
|
19
19
|
JSON_STRUCTURES,
|
|
20
20
|
identifyJsonStructure,
|
|
21
|
-
getToolIdFromAction
|
|
22
|
-
isValidToolId
|
|
21
|
+
getToolIdFromAction
|
|
23
22
|
} from './toolConstants.js';
|
|
24
|
-
import { parseJSONWithRepair
|
|
23
|
+
import { parseJSONWithRepair } from './jsonRepair.js';
|
|
25
24
|
|
|
26
25
|
class TagParser {
|
|
27
26
|
constructor() {
|
|
@@ -393,11 +392,11 @@ class TagParser {
|
|
|
393
392
|
}
|
|
394
393
|
break;
|
|
395
394
|
|
|
396
|
-
case JSON_STRUCTURES.DIRECT_ACTION:
|
|
395
|
+
case JSON_STRUCTURES.DIRECT_ACTION: {
|
|
397
396
|
// Get tool from type field
|
|
398
397
|
const toolId = getToolIdFromAction(jsonData.type);
|
|
399
398
|
return toolId || 'unknown';
|
|
400
|
-
|
|
399
|
+
}
|
|
401
400
|
case JSON_STRUCTURES.TOOL_COMMANDS:
|
|
402
401
|
// Get from first command
|
|
403
402
|
if (jsonData.toolCommands && jsonData.toolCommands.length > 0) {
|
|
@@ -477,8 +476,6 @@ class TagParser {
|
|
|
477
476
|
? openTag.substring(1, spaceIndex)
|
|
478
477
|
: openTag.substring(1, openTag.length - 1);
|
|
479
478
|
|
|
480
|
-
const isValid = this.isValidXmlTagName(tagName);
|
|
481
|
-
|
|
482
479
|
// Skip malformed tags or content that looks like code
|
|
483
480
|
if (tagName.includes('/') || !tagName || !this.isValidXmlTagName(tagName)) {
|
|
484
481
|
position = openTagEnd + 1;
|
|
@@ -492,9 +489,7 @@ class TagParser {
|
|
|
492
489
|
let closingTagStart = openTagEnd;
|
|
493
490
|
|
|
494
491
|
if (isSelfClosing) {
|
|
495
|
-
// Self-closing tag has no content
|
|
496
|
-
tagContent = '';
|
|
497
|
-
closingTagStart = openTagEnd; // Position right after the self-closing tag
|
|
492
|
+
// Self-closing tag has no content; initial values for tagContent and closingTagStart are already correct
|
|
498
493
|
} else {
|
|
499
494
|
// Look for the closing tag
|
|
500
495
|
const closingTag = `</${tagName}>`;
|
|
@@ -1,308 +1,308 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* User Data Directory Utility
|
|
3
|
-
*
|
|
4
|
-
* Determines the appropriate persistent storage location for user data
|
|
5
|
-
* that survives package updates (npm i -g).
|
|
6
|
-
*
|
|
7
|
-
* This solves the critical issue where user data (agents, conversations,
|
|
8
|
-
* settings, API keys) was lost when updating the globally installed package
|
|
9
|
-
* because data was stored relative to the package installation directory.
|
|
10
|
-
*
|
|
11
|
-
* Storage Locations by Platform:
|
|
12
|
-
* - Linux: ~/.local/share/loxia-autopilot/
|
|
13
|
-
* - macOS: ~/Library/Application Support/loxia-autopilot/
|
|
14
|
-
* - Windows: %LOCALAPPDATA%/loxia-autopilot/ (typically C:\Users\<user>\AppData\Local\loxia-autopilot)
|
|
15
|
-
*
|
|
16
|
-
* Environment Variable Override:
|
|
17
|
-
* - LOXIA_DATA_DIR: If set, uses this path instead of the platform default
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import os from 'os';
|
|
21
|
-
import path from 'path';
|
|
22
|
-
import { promises as fs } from 'fs';
|
|
23
|
-
|
|
24
|
-
// IMPORTANT: both brands (autopilot + onbuzz) DELIBERATELY share this
|
|
25
|
-
// directory. Agents, conversations, attachments, gallery — all of it
|
|
26
|
-
// is intended to be a single fleet visible to whichever brand the user
|
|
27
|
-
// happens to launch. Don't make this brand-specific without explicit
|
|
28
|
-
// product approval.
|
|
29
|
-
const APP_NAME = 'loxia-autopilot';
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Get the platform-appropriate user data directory
|
|
33
|
-
* @returns {string} Absolute path to user data directory
|
|
34
|
-
*/
|
|
35
|
-
export function getUserDataDir() {
|
|
36
|
-
// Allow override via environment variable
|
|
37
|
-
if (process.env.LOXIA_DATA_DIR) {
|
|
38
|
-
return path.resolve(process.env.LOXIA_DATA_DIR);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const platform = process.platform;
|
|
42
|
-
const homeDir = os.homedir();
|
|
43
|
-
|
|
44
|
-
switch (platform) {
|
|
45
|
-
case 'win32': {
|
|
46
|
-
// Windows: Use LOCALAPPDATA (persists locally, not roamed)
|
|
47
|
-
// Falls back to APPDATA, then to home directory
|
|
48
|
-
const localAppData = process.env.LOCALAPPDATA || process.env.APPDATA;
|
|
49
|
-
if (localAppData) {
|
|
50
|
-
return path.join(localAppData, APP_NAME);
|
|
51
|
-
}
|
|
52
|
-
return path.join(homeDir, 'AppData', 'Local', APP_NAME);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
case 'darwin': {
|
|
56
|
-
// macOS: Use Application Support directory
|
|
57
|
-
return path.join(homeDir, 'Library', 'Application Support', APP_NAME);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
case 'linux':
|
|
61
|
-
default: {
|
|
62
|
-
// Linux/Unix: Follow XDG Base Directory Specification
|
|
63
|
-
// Use XDG_DATA_HOME if set, otherwise ~/.local/share
|
|
64
|
-
const xdgDataHome = process.env.XDG_DATA_HOME;
|
|
65
|
-
if (xdgDataHome) {
|
|
66
|
-
return path.join(xdgDataHome, APP_NAME);
|
|
67
|
-
}
|
|
68
|
-
return path.join(homeDir, '.local', 'share', APP_NAME);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Get specific subdirectories within user data directory
|
|
75
|
-
*/
|
|
76
|
-
export function getUserDataPaths() {
|
|
77
|
-
const baseDir = getUserDataDir();
|
|
78
|
-
|
|
79
|
-
return {
|
|
80
|
-
base: baseDir,
|
|
81
|
-
state: path.join(baseDir, 'state'), // Agent state, conversations
|
|
82
|
-
agents: path.join(baseDir, 'state', 'agents'), // Individual agent data
|
|
83
|
-
settings: path.join(baseDir, 'settings'), // User settings, API keys
|
|
84
|
-
attachments: path.join(baseDir, 'attachments'), // File attachments
|
|
85
|
-
logs: path.join(baseDir, 'logs'), // Application logs
|
|
86
|
-
cache: path.join(baseDir, 'cache'), // Temporary cache data
|
|
87
|
-
operations: path.join(baseDir, 'state', 'operations'), // Async operations
|
|
88
|
-
models: path.join(baseDir, 'state', 'models'), // Model router cache
|
|
89
|
-
runtime: path.join(baseDir, 'runtime'), // Runtime data (port registry, etc.)
|
|
90
|
-
skills: path.join(baseDir, 'state', 'skills'), // Global skills library
|
|
91
|
-
gallery: path.join(baseDir, 'gallery'), // Durable gallery root
|
|
92
|
-
galleryImages: path.join(baseDir, 'gallery', 'images'), // Saved image-gen outputs
|
|
93
|
-
galleryVideos: path.join(baseDir, 'gallery', 'videos'), // Saved video-gen outputs
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Ensure user data directory structure exists
|
|
99
|
-
* @returns {Promise<Object>} Created paths
|
|
100
|
-
*/
|
|
101
|
-
export async function ensureUserDataDirs() {
|
|
102
|
-
const paths = getUserDataPaths();
|
|
103
|
-
|
|
104
|
-
const dirsToCreate = [
|
|
105
|
-
paths.base,
|
|
106
|
-
paths.state,
|
|
107
|
-
paths.agents,
|
|
108
|
-
paths.settings,
|
|
109
|
-
paths.attachments,
|
|
110
|
-
paths.logs,
|
|
111
|
-
paths.cache,
|
|
112
|
-
paths.operations,
|
|
113
|
-
paths.models,
|
|
114
|
-
paths.runtime,
|
|
115
|
-
paths.skills,
|
|
116
|
-
];
|
|
117
|
-
|
|
118
|
-
for (const dir of dirsToCreate) {
|
|
119
|
-
try {
|
|
120
|
-
await fs.mkdir(dir, { recursive: true });
|
|
121
|
-
} catch (error) {
|
|
122
|
-
// Ignore if already exists
|
|
123
|
-
if (error.code !== 'EEXIST') {
|
|
124
|
-
throw error;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return paths;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Check if user data directory exists and is accessible
|
|
134
|
-
* @returns {Promise<boolean>}
|
|
135
|
-
*/
|
|
136
|
-
export async function userDataDirExists() {
|
|
137
|
-
try {
|
|
138
|
-
const baseDir = getUserDataDir();
|
|
139
|
-
const stats = await fs.stat(baseDir);
|
|
140
|
-
return stats.isDirectory();
|
|
141
|
-
} catch
|
|
142
|
-
return false;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Migrate data from old location to new user data directory
|
|
148
|
-
* This helps users transition from the old storage location
|
|
149
|
-
*
|
|
150
|
-
* @param {string} oldDir - Old data directory path
|
|
151
|
-
* @param {Object} options - Migration options
|
|
152
|
-
* @returns {Promise<Object>} Migration result
|
|
153
|
-
*/
|
|
154
|
-
export async function migrateFromOldLocation(oldDir, options = {}) {
|
|
155
|
-
const { dryRun = false, logger = null } = options;
|
|
156
|
-
const newPaths = getUserDataPaths();
|
|
157
|
-
|
|
158
|
-
const result = {
|
|
159
|
-
migrated: [],
|
|
160
|
-
skipped: [],
|
|
161
|
-
errors: [],
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
try {
|
|
165
|
-
// Check if old directory exists
|
|
166
|
-
try {
|
|
167
|
-
await fs.access(oldDir);
|
|
168
|
-
} catch {
|
|
169
|
-
logger?.info('No old data directory found, skipping migration', { oldDir });
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Check if new directory already has data (don't overwrite)
|
|
174
|
-
const newHasData = await userDataDirExists();
|
|
175
|
-
if (newHasData) {
|
|
176
|
-
const newStateDir = newPaths.state;
|
|
177
|
-
try {
|
|
178
|
-
const files = await fs.readdir(newStateDir);
|
|
179
|
-
if (files.length > 0) {
|
|
180
|
-
logger?.info('New data directory already has data, skipping migration to prevent overwrite');
|
|
181
|
-
result.skipped.push({ reason: 'new_location_has_data', path: newStateDir });
|
|
182
|
-
return result;
|
|
183
|
-
}
|
|
184
|
-
} catch {
|
|
185
|
-
// Directory doesn't exist or is empty, continue with migration
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Ensure new directories exist
|
|
190
|
-
if (!dryRun) {
|
|
191
|
-
await ensureUserDataDirs();
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Migration mappings: oldSubPath -> newPath
|
|
195
|
-
const migrations = [
|
|
196
|
-
{ old: 'agents', new: newPaths.agents },
|
|
197
|
-
{ old: 'operations', new: newPaths.operations },
|
|
198
|
-
{ old: 'models', new: newPaths.models },
|
|
199
|
-
{ old: 'attachments', new: newPaths.attachments },
|
|
200
|
-
{ old: 'terminal-settings.json', new: path.join(newPaths.settings, 'terminal-settings.json') },
|
|
201
|
-
{ old: 'project-state.json', new: path.join(newPaths.state, 'project-state.json') },
|
|
202
|
-
{ old: 'agent-index.json', new: path.join(newPaths.state, 'agent-index.json') },
|
|
203
|
-
{ old: 'last-session.json', new: path.join(newPaths.state, 'last-session.json') },
|
|
204
|
-
];
|
|
205
|
-
|
|
206
|
-
for (const migration of migrations) {
|
|
207
|
-
const oldPath = path.join(oldDir, migration.old);
|
|
208
|
-
const newPath = migration.new;
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
await fs.access(oldPath);
|
|
212
|
-
|
|
213
|
-
if (dryRun) {
|
|
214
|
-
result.migrated.push({ from: oldPath, to: newPath, dryRun: true });
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Check if it's a directory or file
|
|
219
|
-
const stats = await fs.stat(oldPath);
|
|
220
|
-
|
|
221
|
-
if (stats.isDirectory()) {
|
|
222
|
-
// Copy directory contents recursively
|
|
223
|
-
await copyDir(oldPath, newPath);
|
|
224
|
-
} else {
|
|
225
|
-
// Copy single file
|
|
226
|
-
await fs.copyFile(oldPath, newPath);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
result.migrated.push({ from: oldPath, to: newPath });
|
|
230
|
-
logger?.info('Migrated data', { from: oldPath, to: newPath });
|
|
231
|
-
|
|
232
|
-
} catch (error) {
|
|
233
|
-
if (error.code === 'ENOENT') {
|
|
234
|
-
// File/dir doesn't exist, skip silently
|
|
235
|
-
result.skipped.push({ path: oldPath, reason: 'not_found' });
|
|
236
|
-
} else {
|
|
237
|
-
result.errors.push({ path: oldPath, error: error.message });
|
|
238
|
-
logger?.warn('Migration error', { path: oldPath, error: error.message });
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (result.migrated.length > 0 && !dryRun) {
|
|
244
|
-
logger?.info('Data migration completed', {
|
|
245
|
-
migratedCount: result.migrated.length,
|
|
246
|
-
skippedCount: result.skipped.length,
|
|
247
|
-
errorCount: result.errors.length,
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
} catch (error) {
|
|
252
|
-
result.errors.push({ path: oldDir, error: error.message });
|
|
253
|
-
logger?.error('Migration failed', { error: error.message });
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return result;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Recursively copy a directory
|
|
261
|
-
* @param {string} src - Source directory
|
|
262
|
-
* @param {string} dest - Destination directory
|
|
263
|
-
*/
|
|
264
|
-
async function copyDir(src, dest) {
|
|
265
|
-
await fs.mkdir(dest, { recursive: true });
|
|
266
|
-
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
267
|
-
|
|
268
|
-
for (const entry of entries) {
|
|
269
|
-
const srcPath = path.join(src, entry.name);
|
|
270
|
-
const destPath = path.join(dest, entry.name);
|
|
271
|
-
|
|
272
|
-
if (entry.isDirectory()) {
|
|
273
|
-
await copyDir(srcPath, destPath);
|
|
274
|
-
} else {
|
|
275
|
-
await fs.copyFile(srcPath, destPath);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
/**
|
|
281
|
-
* Get legacy data directory paths for migration detection
|
|
282
|
-
* @returns {string[]} Array of potential old data locations
|
|
283
|
-
*/
|
|
284
|
-
export function getLegacyDataPaths() {
|
|
285
|
-
const paths = [];
|
|
286
|
-
|
|
287
|
-
// Old location: relative to package install (inside node_modules)
|
|
288
|
-
// This won't work after package update, but useful for first-run detection
|
|
289
|
-
|
|
290
|
-
// Old location: process.cwd() based
|
|
291
|
-
const cwdBased = path.join(process.cwd(), '.loxia-state');
|
|
292
|
-
paths.push(cwdBased);
|
|
293
|
-
|
|
294
|
-
// Alternative old location
|
|
295
|
-
const cwdBasedAlt = path.join(process.cwd(), 'loxia-state');
|
|
296
|
-
paths.push(cwdBasedAlt);
|
|
297
|
-
|
|
298
|
-
return paths;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
export default {
|
|
302
|
-
getUserDataDir,
|
|
303
|
-
getUserDataPaths,
|
|
304
|
-
ensureUserDataDirs,
|
|
305
|
-
userDataDirExists,
|
|
306
|
-
migrateFromOldLocation,
|
|
307
|
-
getLegacyDataPaths,
|
|
308
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* User Data Directory Utility
|
|
3
|
+
*
|
|
4
|
+
* Determines the appropriate persistent storage location for user data
|
|
5
|
+
* that survives package updates (npm i -g).
|
|
6
|
+
*
|
|
7
|
+
* This solves the critical issue where user data (agents, conversations,
|
|
8
|
+
* settings, API keys) was lost when updating the globally installed package
|
|
9
|
+
* because data was stored relative to the package installation directory.
|
|
10
|
+
*
|
|
11
|
+
* Storage Locations by Platform:
|
|
12
|
+
* - Linux: ~/.local/share/loxia-autopilot/
|
|
13
|
+
* - macOS: ~/Library/Application Support/loxia-autopilot/
|
|
14
|
+
* - Windows: %LOCALAPPDATA%/loxia-autopilot/ (typically C:\Users\<user>\AppData\Local\loxia-autopilot)
|
|
15
|
+
*
|
|
16
|
+
* Environment Variable Override:
|
|
17
|
+
* - LOXIA_DATA_DIR: If set, uses this path instead of the platform default
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import os from 'os';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { promises as fs } from 'fs';
|
|
23
|
+
|
|
24
|
+
// IMPORTANT: both brands (autopilot + onbuzz) DELIBERATELY share this
|
|
25
|
+
// directory. Agents, conversations, attachments, gallery — all of it
|
|
26
|
+
// is intended to be a single fleet visible to whichever brand the user
|
|
27
|
+
// happens to launch. Don't make this brand-specific without explicit
|
|
28
|
+
// product approval.
|
|
29
|
+
const APP_NAME = 'loxia-autopilot';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get the platform-appropriate user data directory
|
|
33
|
+
* @returns {string} Absolute path to user data directory
|
|
34
|
+
*/
|
|
35
|
+
export function getUserDataDir() {
|
|
36
|
+
// Allow override via environment variable
|
|
37
|
+
if (process.env.LOXIA_DATA_DIR) {
|
|
38
|
+
return path.resolve(process.env.LOXIA_DATA_DIR);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const platform = process.platform;
|
|
42
|
+
const homeDir = os.homedir();
|
|
43
|
+
|
|
44
|
+
switch (platform) {
|
|
45
|
+
case 'win32': {
|
|
46
|
+
// Windows: Use LOCALAPPDATA (persists locally, not roamed)
|
|
47
|
+
// Falls back to APPDATA, then to home directory
|
|
48
|
+
const localAppData = process.env.LOCALAPPDATA || process.env.APPDATA;
|
|
49
|
+
if (localAppData) {
|
|
50
|
+
return path.join(localAppData, APP_NAME);
|
|
51
|
+
}
|
|
52
|
+
return path.join(homeDir, 'AppData', 'Local', APP_NAME);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
case 'darwin': {
|
|
56
|
+
// macOS: Use Application Support directory
|
|
57
|
+
return path.join(homeDir, 'Library', 'Application Support', APP_NAME);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
case 'linux':
|
|
61
|
+
default: {
|
|
62
|
+
// Linux/Unix: Follow XDG Base Directory Specification
|
|
63
|
+
// Use XDG_DATA_HOME if set, otherwise ~/.local/share
|
|
64
|
+
const xdgDataHome = process.env.XDG_DATA_HOME;
|
|
65
|
+
if (xdgDataHome) {
|
|
66
|
+
return path.join(xdgDataHome, APP_NAME);
|
|
67
|
+
}
|
|
68
|
+
return path.join(homeDir, '.local', 'share', APP_NAME);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Get specific subdirectories within user data directory
|
|
75
|
+
*/
|
|
76
|
+
export function getUserDataPaths() {
|
|
77
|
+
const baseDir = getUserDataDir();
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
base: baseDir,
|
|
81
|
+
state: path.join(baseDir, 'state'), // Agent state, conversations
|
|
82
|
+
agents: path.join(baseDir, 'state', 'agents'), // Individual agent data
|
|
83
|
+
settings: path.join(baseDir, 'settings'), // User settings, API keys
|
|
84
|
+
attachments: path.join(baseDir, 'attachments'), // File attachments
|
|
85
|
+
logs: path.join(baseDir, 'logs'), // Application logs
|
|
86
|
+
cache: path.join(baseDir, 'cache'), // Temporary cache data
|
|
87
|
+
operations: path.join(baseDir, 'state', 'operations'), // Async operations
|
|
88
|
+
models: path.join(baseDir, 'state', 'models'), // Model router cache
|
|
89
|
+
runtime: path.join(baseDir, 'runtime'), // Runtime data (port registry, etc.)
|
|
90
|
+
skills: path.join(baseDir, 'state', 'skills'), // Global skills library
|
|
91
|
+
gallery: path.join(baseDir, 'gallery'), // Durable gallery root
|
|
92
|
+
galleryImages: path.join(baseDir, 'gallery', 'images'), // Saved image-gen outputs
|
|
93
|
+
galleryVideos: path.join(baseDir, 'gallery', 'videos'), // Saved video-gen outputs
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Ensure user data directory structure exists
|
|
99
|
+
* @returns {Promise<Object>} Created paths
|
|
100
|
+
*/
|
|
101
|
+
export async function ensureUserDataDirs() {
|
|
102
|
+
const paths = getUserDataPaths();
|
|
103
|
+
|
|
104
|
+
const dirsToCreate = [
|
|
105
|
+
paths.base,
|
|
106
|
+
paths.state,
|
|
107
|
+
paths.agents,
|
|
108
|
+
paths.settings,
|
|
109
|
+
paths.attachments,
|
|
110
|
+
paths.logs,
|
|
111
|
+
paths.cache,
|
|
112
|
+
paths.operations,
|
|
113
|
+
paths.models,
|
|
114
|
+
paths.runtime,
|
|
115
|
+
paths.skills,
|
|
116
|
+
];
|
|
117
|
+
|
|
118
|
+
for (const dir of dirsToCreate) {
|
|
119
|
+
try {
|
|
120
|
+
await fs.mkdir(dir, { recursive: true });
|
|
121
|
+
} catch (error) {
|
|
122
|
+
// Ignore if already exists
|
|
123
|
+
if (error.code !== 'EEXIST') {
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return paths;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Check if user data directory exists and is accessible
|
|
134
|
+
* @returns {Promise<boolean>}
|
|
135
|
+
*/
|
|
136
|
+
export async function userDataDirExists() {
|
|
137
|
+
try {
|
|
138
|
+
const baseDir = getUserDataDir();
|
|
139
|
+
const stats = await fs.stat(baseDir);
|
|
140
|
+
return stats.isDirectory();
|
|
141
|
+
} catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Migrate data from old location to new user data directory
|
|
148
|
+
* This helps users transition from the old storage location
|
|
149
|
+
*
|
|
150
|
+
* @param {string} oldDir - Old data directory path
|
|
151
|
+
* @param {Object} options - Migration options
|
|
152
|
+
* @returns {Promise<Object>} Migration result
|
|
153
|
+
*/
|
|
154
|
+
export async function migrateFromOldLocation(oldDir, options = {}) {
|
|
155
|
+
const { dryRun = false, logger = null } = options;
|
|
156
|
+
const newPaths = getUserDataPaths();
|
|
157
|
+
|
|
158
|
+
const result = {
|
|
159
|
+
migrated: [],
|
|
160
|
+
skipped: [],
|
|
161
|
+
errors: [],
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
// Check if old directory exists
|
|
166
|
+
try {
|
|
167
|
+
await fs.access(oldDir);
|
|
168
|
+
} catch {
|
|
169
|
+
logger?.info('No old data directory found, skipping migration', { oldDir });
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Check if new directory already has data (don't overwrite)
|
|
174
|
+
const newHasData = await userDataDirExists();
|
|
175
|
+
if (newHasData) {
|
|
176
|
+
const newStateDir = newPaths.state;
|
|
177
|
+
try {
|
|
178
|
+
const files = await fs.readdir(newStateDir);
|
|
179
|
+
if (files.length > 0) {
|
|
180
|
+
logger?.info('New data directory already has data, skipping migration to prevent overwrite');
|
|
181
|
+
result.skipped.push({ reason: 'new_location_has_data', path: newStateDir });
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
} catch {
|
|
185
|
+
// Directory doesn't exist or is empty, continue with migration
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Ensure new directories exist
|
|
190
|
+
if (!dryRun) {
|
|
191
|
+
await ensureUserDataDirs();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Migration mappings: oldSubPath -> newPath
|
|
195
|
+
const migrations = [
|
|
196
|
+
{ old: 'agents', new: newPaths.agents },
|
|
197
|
+
{ old: 'operations', new: newPaths.operations },
|
|
198
|
+
{ old: 'models', new: newPaths.models },
|
|
199
|
+
{ old: 'attachments', new: newPaths.attachments },
|
|
200
|
+
{ old: 'terminal-settings.json', new: path.join(newPaths.settings, 'terminal-settings.json') },
|
|
201
|
+
{ old: 'project-state.json', new: path.join(newPaths.state, 'project-state.json') },
|
|
202
|
+
{ old: 'agent-index.json', new: path.join(newPaths.state, 'agent-index.json') },
|
|
203
|
+
{ old: 'last-session.json', new: path.join(newPaths.state, 'last-session.json') },
|
|
204
|
+
];
|
|
205
|
+
|
|
206
|
+
for (const migration of migrations) {
|
|
207
|
+
const oldPath = path.join(oldDir, migration.old);
|
|
208
|
+
const newPath = migration.new;
|
|
209
|
+
|
|
210
|
+
try {
|
|
211
|
+
await fs.access(oldPath);
|
|
212
|
+
|
|
213
|
+
if (dryRun) {
|
|
214
|
+
result.migrated.push({ from: oldPath, to: newPath, dryRun: true });
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Check if it's a directory or file
|
|
219
|
+
const stats = await fs.stat(oldPath);
|
|
220
|
+
|
|
221
|
+
if (stats.isDirectory()) {
|
|
222
|
+
// Copy directory contents recursively
|
|
223
|
+
await copyDir(oldPath, newPath);
|
|
224
|
+
} else {
|
|
225
|
+
// Copy single file
|
|
226
|
+
await fs.copyFile(oldPath, newPath);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
result.migrated.push({ from: oldPath, to: newPath });
|
|
230
|
+
logger?.info('Migrated data', { from: oldPath, to: newPath });
|
|
231
|
+
|
|
232
|
+
} catch (error) {
|
|
233
|
+
if (error.code === 'ENOENT') {
|
|
234
|
+
// File/dir doesn't exist, skip silently
|
|
235
|
+
result.skipped.push({ path: oldPath, reason: 'not_found' });
|
|
236
|
+
} else {
|
|
237
|
+
result.errors.push({ path: oldPath, error: error.message });
|
|
238
|
+
logger?.warn('Migration error', { path: oldPath, error: error.message });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (result.migrated.length > 0 && !dryRun) {
|
|
244
|
+
logger?.info('Data migration completed', {
|
|
245
|
+
migratedCount: result.migrated.length,
|
|
246
|
+
skippedCount: result.skipped.length,
|
|
247
|
+
errorCount: result.errors.length,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
} catch (error) {
|
|
252
|
+
result.errors.push({ path: oldDir, error: error.message });
|
|
253
|
+
logger?.error('Migration failed', { error: error.message });
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Recursively copy a directory
|
|
261
|
+
* @param {string} src - Source directory
|
|
262
|
+
* @param {string} dest - Destination directory
|
|
263
|
+
*/
|
|
264
|
+
async function copyDir(src, dest) {
|
|
265
|
+
await fs.mkdir(dest, { recursive: true });
|
|
266
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
267
|
+
|
|
268
|
+
for (const entry of entries) {
|
|
269
|
+
const srcPath = path.join(src, entry.name);
|
|
270
|
+
const destPath = path.join(dest, entry.name);
|
|
271
|
+
|
|
272
|
+
if (entry.isDirectory()) {
|
|
273
|
+
await copyDir(srcPath, destPath);
|
|
274
|
+
} else {
|
|
275
|
+
await fs.copyFile(srcPath, destPath);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get legacy data directory paths for migration detection
|
|
282
|
+
* @returns {string[]} Array of potential old data locations
|
|
283
|
+
*/
|
|
284
|
+
export function getLegacyDataPaths() {
|
|
285
|
+
const paths = [];
|
|
286
|
+
|
|
287
|
+
// Old location: relative to package install (inside node_modules)
|
|
288
|
+
// This won't work after package update, but useful for first-run detection
|
|
289
|
+
|
|
290
|
+
// Old location: process.cwd() based
|
|
291
|
+
const cwdBased = path.join(process.cwd(), '.loxia-state');
|
|
292
|
+
paths.push(cwdBased);
|
|
293
|
+
|
|
294
|
+
// Alternative old location
|
|
295
|
+
const cwdBasedAlt = path.join(process.cwd(), 'loxia-state');
|
|
296
|
+
paths.push(cwdBasedAlt);
|
|
297
|
+
|
|
298
|
+
return paths;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export default {
|
|
302
|
+
getUserDataDir,
|
|
303
|
+
getUserDataPaths,
|
|
304
|
+
ensureUserDataDirs,
|
|
305
|
+
userDataDirExists,
|
|
306
|
+
migrateFromOldLocation,
|
|
307
|
+
getLegacyDataPaths,
|
|
308
|
+
};
|