onbuzz 4.9.13 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/glob/README.md +31 -5
- package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/glob.js +2 -1
- package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
- package/node_modules/glob/dist/commonjs/index.min.js +3 -3
- package/node_modules/glob/dist/commonjs/index.min.js.map +4 -4
- package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/commonjs/pattern.js +4 -0
- package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
- package/node_modules/glob/dist/esm/glob.d.ts +8 -0
- package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/glob.js +2 -1
- package/node_modules/glob/dist/esm/glob.js.map +1 -1
- package/node_modules/glob/dist/esm/index.min.js +3 -3
- package/node_modules/glob/dist/esm/index.min.js.map +4 -4
- package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
- package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
- package/node_modules/glob/dist/esm/pattern.js +4 -0
- package/node_modules/glob/dist/esm/pattern.js.map +1 -1
- package/node_modules/{@isaacs → glob/node_modules}/balanced-match/README.md +7 -10
- package/node_modules/{@isaacs → glob/node_modules}/balanced-match/package.json +7 -18
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/README.md +3 -6
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.js +6 -4
- package/node_modules/glob/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -0
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.js +6 -4
- package/node_modules/glob/node_modules/brace-expansion/dist/esm/index.js.map +1 -0
- package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/package.json +11 -7
- package/node_modules/glob/node_modules/minimatch/README.md +76 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts +4 -2
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +309 -55
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +2 -4
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +4 -4
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts +81 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +232 -134
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +8 -8
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts +4 -2
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js +309 -55
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js +2 -4
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js +4 -4
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts +81 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js +232 -134
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -1
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js +8 -8
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js.map +1 -1
- package/node_modules/glob/node_modules/minimatch/package.json +17 -11
- package/node_modules/glob/package.json +10 -13
- package/node_modules/minipass/LICENSE.md +55 -0
- package/node_modules/minipass/dist/commonjs/index.d.ts +12 -16
- package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/commonjs/index.js +13 -3
- package/node_modules/minipass/dist/commonjs/index.js.map +1 -1
- package/node_modules/minipass/dist/esm/index.d.ts +12 -16
- package/node_modules/minipass/dist/esm/index.d.ts.map +1 -1
- package/node_modules/minipass/dist/esm/index.js +3 -1
- package/node_modules/minipass/dist/esm/index.js.map +1 -1
- package/node_modules/minipass/package.json +9 -14
- package/node_modules/path-scurry/node_modules/lru-cache/README.md +96 -10
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel-browser.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/diagnostics-channel.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js +1726 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/browser/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.cjs.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel-cjs.d.cts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/diagnostics-channel.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts +109 -32
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +334 -197
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js.map +4 -4
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel-node.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/diagnostics-channel.js +9 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js +1726 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/node/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js +10 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel-browser.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/diagnostics-channel.js +4 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js +1722 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/browser/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.d.mts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel-esm.mjs.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/diagnostics-channel.js +19 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts +109 -32
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +333 -196
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js.map +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +1 -1
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js.map +4 -4
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel-node.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.d.ts +5 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/diagnostics-channel.js +6 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts +1400 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js +1722 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/node/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts +12 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/perf.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/package.json +71 -18
- package/node_modules/path-scurry/package.json +8 -24
- package/package.json +1 -1
- package/scripts/debug-balance-probe.mjs +35 -35
- package/scripts/push-image.sh +43 -43
- package/scripts/setup-acr.sh +65 -65
- package/scripts/verify-optional-deps.js +96 -1
- package/src/__tests__/composioCliFlags.test.js +239 -239
- package/src/analyzers/CSSAnalyzer.js +298 -297
- package/src/analyzers/ConfigValidator.js +691 -690
- package/src/analyzers/ESLintAnalyzer.js +320 -320
- package/src/analyzers/JavaScriptAnalyzer.js +260 -261
- package/src/analyzers/PrettierFormatter.js +246 -247
- package/src/analyzers/PythonAnalyzer.js +283 -283
- package/src/analyzers/SecurityAnalyzer.js +729 -729
- package/src/analyzers/SparrowAnalyzer.js +341 -341
- package/src/analyzers/TypeScriptAnalyzer.js +247 -247
- package/src/analyzers/__tests__/CSSAnalyzer.test.js +41 -41
- package/src/analyzers/__tests__/ConfigValidator.test.js +362 -362
- package/src/analyzers/__tests__/JavaScriptAnalyzer.test.js +40 -40
- package/src/analyzers/__tests__/PythonAnalyzer.test.js +205 -208
- package/src/analyzers/__tests__/SecurityAnalyzer.test.js +303 -303
- package/src/analyzers/__tests__/TypeScriptAnalyzer.test.js +187 -187
- package/src/analyzers/codeCloneDetector/analyzer.js +344 -344
- package/src/analyzers/codeCloneDetector/detector.js +250 -250
- package/src/analyzers/codeCloneDetector/index.js +194 -192
- package/src/analyzers/codeCloneDetector/parser.js +199 -199
- package/src/core/__tests__/agentPool.test.js +866 -866
- package/src/core/__tests__/agentPoolAutoResume.test.js +209 -209
- package/src/core/__tests__/agentPoolWakeOnMessage.test.js +315 -315
- package/src/core/__tests__/agentScheduler.emptyResponseChatStall.test.js +213 -213
- package/src/core/__tests__/agentScheduler.errorCategorisation.test.js +246 -246
- package/src/core/__tests__/agentScheduler.firstChunkTimeout.test.js +138 -138
- package/src/core/__tests__/agentScheduler.modeTransitions.test.js +233 -233
- package/src/core/__tests__/agentScheduler.nativePromptPick.test.js +319 -319
- package/src/core/__tests__/agentScheduler.taskLifecycleInstruction.test.js +78 -78
- package/src/core/__tests__/agentScheduler.visualizer.test.js +258 -258
- package/src/core/__tests__/flowCheckpointStore.test.js +140 -140
- package/src/core/__tests__/flowEndToEnd.test.js +565 -565
- package/src/core/__tests__/flowFieldMapping.test.js +188 -189
- package/src/core/__tests__/flowLintClientMirror.test.js +96 -98
- package/src/core/__tests__/flowSavePayload.test.js +170 -169
- package/src/core/__tests__/flowTemplates.test.js +311 -311
- package/src/core/__tests__/flowVersionStore.test.js +123 -123
- package/src/core/__tests__/messageProcessor.test.js +669 -669
- package/src/core/__tests__/stateManager.test.js +0 -1
- package/src/core/agentPool.js +2474 -2475
- package/src/core/agentScheduler.js +1 -4
- package/src/core/contextManager.js +708 -708
- package/src/core/flowExecutor.js +1510 -1510
- package/src/core/flowFieldMapping.js +136 -138
- package/src/core/messageProcessor.js +953 -954
- package/src/core/orchestrator.js +593 -595
- package/src/core/stateManager.js +1765 -1752
- package/src/index.js +1221 -1221
- package/src/interfaces/__tests__/archivedAgentDelete.test.js +207 -207
- package/src/interfaces/__tests__/bulkAgentRoute.test.js +361 -361
- package/src/interfaces/__tests__/imageServing.test.js +228 -228
- package/src/interfaces/__tests__/remoteSessionAuth.test.js +308 -308
- package/src/interfaces/__tests__/videoJobsRoutes.test.js +178 -179
- package/src/interfaces/__tests__/webServer.marketplace.test.js +629 -629
- package/src/interfaces/schedulerRoutes.js +50 -50
- package/src/interfaces/terminal/__tests__/smoke/connection.test.js +341 -350
- package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +156 -156
- package/src/interfaces/terminal/__tests__/smoke/imports.test.js +325 -330
- package/src/interfaces/terminal/__tests__/smoke/tools.test.js +385 -388
- package/src/interfaces/terminal/api/session.js +265 -266
- package/src/interfaces/terminal/api/websocket.js +496 -497
- package/src/interfaces/terminal/components/AgentCreator.js +691 -705
- package/src/interfaces/terminal/components/AgentEditor.js +676 -678
- package/src/interfaces/terminal/components/AgentSwitcher.js +331 -330
- package/src/interfaces/terminal/components/ErrorPanel.js +263 -264
- package/src/interfaces/terminal/components/Header.js +28 -28
- package/src/interfaces/terminal/components/Layout.js +598 -603
- package/src/interfaces/terminal/components/MessageList.js +280 -281
- package/src/interfaces/terminal/components/SettingsPanel.js +410 -415
- package/src/interfaces/terminal/components/StatusBar.js +2 -0
- package/src/interfaces/terminal/index.js +168 -168
- package/src/interfaces/terminal/state/useAgentControl.js +496 -496
- package/src/interfaces/terminal/state/useAgents.js +537 -537
- package/src/interfaces/terminal/state/useMessages.js +629 -630
- package/src/interfaces/terminal/state/useTools.js +554 -554
- package/src/interfaces/terminal/utils/debugLogger.js +44 -44
- package/src/interfaces/terminal/utils/settingsStorage.js +232 -232
- package/src/interfaces/webServer.js +7578 -7579
- package/src/interfaces/webServer.js.bak +7046 -7046
- package/src/modules/fileExplorer/__tests__/zipDownload.test.js +237 -237
- package/src/modules/fileExplorer/controller.js +470 -469
- package/src/modules/fileExplorer/routes.js +285 -286
- package/src/modules/widget/__tests__/isDisabled.test.js +41 -41
- package/src/modules/widget/__tests__/routes.test.js +677 -678
- package/src/modules/widget/__tests__/runtime.test.js +401 -401
- package/src/modules/widget/__tests__/versioning.test.js +309 -309
- package/src/modules/widget/__tests__/webComponentRuntime.test.js +565 -565
- package/src/modules/widget/__tests__/widgetTool.test.js +316 -316
- package/src/modules/widget/routes.js +435 -435
- package/src/modules/widget/runtime/bundle.js +640 -640
- package/src/modules/widget/runtime/webComponentBundle.js +470 -470
- package/src/modules/widget/schema.js +182 -181
- package/src/modules/widget/widgetTool.js +1389 -1389
- package/src/services/__tests__/agentActivityService.test.js +401 -402
- package/src/services/__tests__/benchmarkService.test.js +184 -184
- package/src/services/__tests__/contextInjectionService.test.js +246 -246
- package/src/services/__tests__/conversationQuery.test.js +721 -723
- package/src/services/__tests__/credentialVault.test.js +469 -469
- package/src/services/__tests__/discordService.integration.test.js +638 -639
- package/src/services/__tests__/flowContextService.test.js +590 -590
- package/src/services/__tests__/memoryService.test.js +1 -1
- package/src/services/__tests__/messageSource.test.js +380 -380
- package/src/services/__tests__/modelRouterNaming.test.js +111 -111
- package/src/services/__tests__/projectDetector.test.js +34 -34
- package/src/services/__tests__/promptService.test.js +242 -242
- package/src/services/__tests__/telegramService.test.js +941 -941
- package/src/services/__tests__/tokenCountingService.test.js +48 -48
- package/src/services/agentActivityService.js +419 -420
- package/src/services/aiService.js +2997 -3001
- package/src/services/apiKeyManager.js +359 -359
- package/src/services/benchmarkService.js +196 -196
- package/src/services/codebaseKnowledgeService.js +2 -2
- package/src/services/composioService.js +738 -738
- package/src/services/conversationCompactionService.js +1258 -1257
- package/src/services/credentialVault.js +685 -685
- package/src/services/discordService.js +792 -793
- package/src/services/embeddings/__tests__/azureCustomProvider.test.js +232 -232
- package/src/services/embeddings/__tests__/embeddingService.test.js +417 -417
- package/src/services/embeddings/__tests__/localProvider.test.js +263 -263
- package/src/services/embeddings/autoRecall.js +218 -219
- package/src/services/embeddings/indexers/__tests__/agentIndexer.test.js +232 -232
- package/src/services/embeddings/indexers/__tests__/memoryIndexer.test.js +418 -418
- package/src/services/embeddings/indexers/__tests__/reminisceIndexer.test.js +356 -357
- package/src/services/embeddings/indexers/__tests__/skillsIndexer.test.js +145 -145
- package/src/services/embeddings/indexers/__tests__/taskIndexer.test.js +146 -146
- package/src/services/embeddings/indexers/composioIndexer.js +279 -279
- package/src/services/embeddings/providerInterface.js +206 -206
- package/src/services/embeddings/providers/localProvider.js +11 -7
- package/src/services/embeddings/providers/openaiProvider.js +101 -101
- package/src/services/embeddings/vectorStore/inMemoryJsonStore.js +356 -356
- package/src/services/errorHandler.js +809 -809
- package/src/services/flowContextService.js +586 -586
- package/src/services/grounding/MockAdapter.js +125 -125
- package/src/services/modelRouterService.js +26 -31
- package/src/services/modelsService.js +322 -322
- package/src/services/ollamaService.js +452 -452
- package/src/services/projectDetector.js +403 -404
- package/src/services/promptService.js +418 -418
- package/src/services/qualityInspector.js +795 -795
- package/src/services/scheduleService.js +726 -726
- package/src/services/serviceRegistry.js +386 -386
- package/src/services/telegrafBot.js +174 -174
- package/src/services/telegramService.js +1972 -1972
- package/src/services/visualEditorBridge.js +1033 -1033
- package/src/services/visualEditorServer.js +1769 -1774
- package/src/services/whatsappService.js +667 -668
- package/src/tools/__tests__/agentCommunicationTool.findAgent.test.js +226 -226
- package/src/tools/__tests__/agentCommunicationTool.test.js +3 -3
- package/src/tools/__tests__/agentDelayTool.test.js +342 -342
- package/src/tools/__tests__/baseTool.test.js +3 -3
- package/src/tools/__tests__/codeMapTool.test.js +915 -915
- package/src/tools/__tests__/fileContentReplaceTool.test.js +309 -309
- package/src/tools/__tests__/fileTreeTool.test.js +274 -274
- package/src/tools/__tests__/filesystemTool.test.js +815 -815
- package/src/tools/__tests__/foundryWebSearchTool.test.js +252 -252
- package/src/tools/__tests__/imageTool.validator.test.js +194 -194
- package/src/tools/__tests__/jobDoneTool.test.js +580 -581
- package/src/tools/__tests__/memoryTool.forgetStale.test.js +272 -272
- package/src/tools/__tests__/memoryTool.reminisce.test.js +2 -2
- package/src/tools/__tests__/memoryTool.reminisceSemanticSearch.test.js +301 -301
- package/src/tools/__tests__/memoryTool.semanticSearch.test.js +405 -405
- package/src/tools/__tests__/memoryTool.teamPool.test.js +293 -293
- package/src/tools/__tests__/memoryTool.test.js +1 -1
- package/src/tools/__tests__/seekTool.test.js +282 -282
- package/src/tools/__tests__/skillsTool.search.test.js +164 -164
- package/src/tools/__tests__/skillsTool.test.js +226 -226
- package/src/tools/__tests__/staticAnalysisTool.test.js +509 -509
- package/src/tools/__tests__/taskManagerTool.discipline.test.js +137 -137
- package/src/tools/__tests__/taskManagerTool.search.test.js +143 -143
- package/src/tools/__tests__/taskManagerTool.test.js +866 -866
- package/src/tools/__tests__/terminalTool.test.js +448 -448
- package/src/tools/__tests__/toolShapeForgiveness.test.js +259 -260
- package/src/tools/__tests__/userPromptTool.test.js +297 -297
- package/src/tools/__tests__/videoTool.jobs.test.js +147 -147
- package/src/tools/__tests__/webTool.e2e.test.js +609 -603
- package/src/tools/__tests__/webTool.unit.test.js +195 -195
- package/src/tools/__tests__/webTool.visionModel.test.js +75 -75
- package/src/tools/agentCommunicationTool.js +8 -10
- package/src/tools/agentDelayTool.js +496 -497
- package/src/tools/asyncToolManager.js +602 -603
- package/src/tools/baseTool.js +12 -11
- package/src/tools/cloneDetectionTool.js +576 -581
- package/src/tools/codeMapTool.js +0 -6
- package/src/tools/composioTool.js +617 -617
- package/src/tools/dependencyResolverTool.js +1211 -1212
- package/src/tools/desktop/DesktopTool.js +629 -638
- package/src/tools/desktop/__tests__/DesktopTool.e2e.test.js +306 -306
- package/src/tools/desktop/__tests__/DesktopTool.test.js +507 -507
- package/src/tools/desktop/__tests__/osController.test.js +364 -364
- package/src/tools/desktop/osController.js +491 -491
- package/src/tools/docxTool.js +623 -623
- package/src/tools/excelTool.js +636 -636
- package/src/tools/fileContentReplaceTool.js +5 -7
- package/src/tools/fileSystemTool.js +12 -19
- package/src/tools/fileTreeTool.js +840 -840
- package/src/tools/foundryWebSearchTool.js +273 -273
- package/src/tools/helpTool.js +198 -198
- package/src/tools/imageTool.js +1397 -1397
- package/src/tools/importAnalyzerTool.js +1056 -1056
- package/src/tools/jobDoneTool.js +495 -495
- package/src/tools/memoryTool.js +1 -1
- package/src/tools/office/pres/__tests__/presSystem.test.js +365 -365
- package/src/tools/office/pres/archetypes/agenda.js +61 -61
- package/src/tools/office/pres/archetypes/bentoGrid.js +218 -219
- package/src/tools/office/pres/archetypes/bigStat.js +140 -142
- package/src/tools/office/pres/archetypes/closing.js +70 -70
- package/src/tools/office/pres/archetypes/hero.js +70 -70
- package/src/tools/office/pres/archetypes/productHero.js +93 -94
- package/src/tools/office/pres/archetypes/table.js +73 -74
- package/src/tools/office/pres/backgrounds/orb.js +66 -66
- package/src/tools/office/pres/components.js +422 -423
- package/src/tools/officeTool.js +441 -441
- package/src/tools/pdfTool.js +625 -627
- package/src/tools/platformControlTool.js +1081 -1081
- package/src/tools/seekTool.js +917 -918
- package/src/tools/skillsTool.js +1 -1
- package/src/tools/staticAnalysisTool.js +2143 -2146
- package/src/tools/taskManagerTool.js +3324 -3324
- package/src/tools/terminalTool.js +2615 -2618
- package/src/tools/videoTool.js +1303 -1303
- package/src/tools/visionTool.js +508 -508
- package/src/tools/visualEditorTool.js +1289 -1290
- package/src/tools/webTool.js +3368 -3368
- package/src/tools/whatsappTool.js +464 -464
- package/src/types/__tests__/agent.test.js +499 -499
- package/src/types/__tests__/contextReference.test.js +606 -606
- package/src/types/__tests__/conversation.test.js +555 -555
- package/src/types/__tests__/toolCommand.test.js +584 -584
- package/src/types/contextReference.js +974 -971
- package/src/types/conversation.js +729 -729
- package/src/types/toolCommand.js +746 -746
- package/src/utilities/__tests__/attachmentValidator.test.js +80 -80
- package/src/utilities/__tests__/auditReport.test.js +328 -328
- package/src/utilities/__tests__/directoryAccessManager.test.js +388 -388
- package/src/utilities/__tests__/jsonRepair.test.js +103 -104
- package/src/utilities/__tests__/modeTransitionReasons.test.js +105 -105
- package/src/utilities/__tests__/platformUtils.test.js +80 -87
- package/src/utilities/__tests__/structuredFileValidator.test.js +261 -263
- package/src/utilities/__tests__/toolConstants.test.js +92 -94
- package/src/utilities/__tests__/useIsTouchDevice.detect.test.js +114 -114
- package/src/utilities/__tests__/webUiUtilSync.test.js +117 -117
- package/src/utilities/attachmentValidator.js +284 -288
- package/src/utilities/authCache.js.backup-1779570472481 +121 -121
- package/src/utilities/browserStealth.js +631 -630
- package/src/utilities/configManager.js +616 -617
- package/src/utilities/directoryAccessManager.js +564 -565
- package/src/utilities/fileProcessor.js +308 -307
- package/src/utilities/humanBehavior.js +454 -453
- package/src/utilities/logger.js +479 -479
- package/src/utilities/structuredFileValidator.js +696 -699
- package/src/utilities/tagParser.js +5 -10
- package/src/utilities/userDataDir.js +308 -308
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js.map +0 -1
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.js.map +0 -1
- package/node_modules/minipass/LICENSE +0 -15
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/LICENSE.md +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/index.js.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/index.js.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/balanced-match/dist/esm/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/LICENSE +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/commonjs/package.json +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{@isaacs → glob/node_modules}/brace-expansion/dist/esm/package.json +0 -0
|
@@ -1,388 +1,388 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
import DirectoryAccessManager from '../directoryAccessManager.js';
|
|
5
|
-
import { createMockLogger } from '../../__test-utils__/mockFactories.js';
|
|
6
|
-
|
|
7
|
-
describe('DirectoryAccessManager', () => {
|
|
8
|
-
let dam;
|
|
9
|
-
let logger;
|
|
10
|
-
const projectDir = path.resolve('/tmp/test-project');
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
logger = createMockLogger();
|
|
14
|
-
dam = new DirectoryAccessManager({}, logger);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
test('createDirectoryAccess returns config with working directory', () => {
|
|
18
|
-
const access = dam.createDirectoryAccess({
|
|
19
|
-
workingDirectory: projectDir
|
|
20
|
-
});
|
|
21
|
-
expect(access).toHaveProperty('workingDirectory');
|
|
22
|
-
expect(access.workingDirectory).toBe(projectDir);
|
|
23
|
-
expect(access).toHaveProperty('readOnlyDirectories');
|
|
24
|
-
expect(access).toHaveProperty('writeEnabledDirectories');
|
|
25
|
-
expect(access).toHaveProperty('restrictToProject');
|
|
26
|
-
expect(access).toHaveProperty('version', '1.0');
|
|
27
|
-
expect(access).toHaveProperty('createdAt');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
test('createDirectoryAccess includes workingDir in readOnly when restrictToProject', () => {
|
|
31
|
-
const access = dam.createDirectoryAccess({
|
|
32
|
-
workingDirectory: projectDir,
|
|
33
|
-
restrictToProject: true
|
|
34
|
-
});
|
|
35
|
-
expect(access.readOnlyDirectories).toContain(projectDir);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('createDirectoryAccess filters writeEnabled dirs outside project when restricted', () => {
|
|
39
|
-
const access = dam.createDirectoryAccess({
|
|
40
|
-
workingDirectory: projectDir,
|
|
41
|
-
restrictToProject: true,
|
|
42
|
-
writeEnabledDirectories: ['/tmp/other-project']
|
|
43
|
-
});
|
|
44
|
-
// /tmp/other-project is outside projectDir, should be filtered
|
|
45
|
-
expect(access.writeEnabledDirectories).not.toContain(path.resolve('/tmp/other-project'));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
test('createDirectoryAccess resolves custom restrictions to absolute paths', () => {
|
|
49
|
-
const access = dam.createDirectoryAccess({
|
|
50
|
-
workingDirectory: projectDir,
|
|
51
|
-
customRestrictions: ['sensitive']
|
|
52
|
-
});
|
|
53
|
-
expect(access.customRestrictions[0]).toBe(path.resolve('sensitive'));
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// ─── validateReadAccess ────────────────────────────────────────
|
|
57
|
-
|
|
58
|
-
test('validateReadAccess allows path within project', () => {
|
|
59
|
-
const access = dam.createDirectoryAccess({
|
|
60
|
-
workingDirectory: projectDir
|
|
61
|
-
});
|
|
62
|
-
const filePath = path.join(projectDir, 'src', 'index.js');
|
|
63
|
-
const result = dam.validateReadAccess(filePath, access);
|
|
64
|
-
expect(result.allowed).toBe(true);
|
|
65
|
-
expect(result.category).toBe('allowed');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
test('validateReadAccess denies system paths', () => {
|
|
69
|
-
const access = dam.createDirectoryAccess({
|
|
70
|
-
workingDirectory: projectDir
|
|
71
|
-
});
|
|
72
|
-
const systemPath = process.platform === 'win32'
|
|
73
|
-
? 'C:\\Windows\\System32\\config'
|
|
74
|
-
: '/etc/passwd';
|
|
75
|
-
const result = dam.validateReadAccess(systemPath, access);
|
|
76
|
-
expect(result.allowed).toBe(false);
|
|
77
|
-
expect(result.category).toBe('system_restricted');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('validateReadAccess allows system paths when allowSystemAccess is true', () => {
|
|
81
|
-
const sshPath = path.join(os.homedir(), '.ssh', 'known_hosts');
|
|
82
|
-
const access = dam.createDirectoryAccess({
|
|
83
|
-
workingDirectory: projectDir,
|
|
84
|
-
allowSystemAccess: true,
|
|
85
|
-
restrictToProject: false,
|
|
86
|
-
readOnlyDirectories: [os.homedir()]
|
|
87
|
-
});
|
|
88
|
-
const result = dam.validateReadAccess(sshPath, access);
|
|
89
|
-
expect(result.allowed).toBe(true);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test('validateReadAccess denies custom restricted paths', () => {
|
|
93
|
-
const restrictedDir = path.join(projectDir, 'secrets');
|
|
94
|
-
const access = dam.createDirectoryAccess({
|
|
95
|
-
workingDirectory: projectDir,
|
|
96
|
-
customRestrictions: [restrictedDir]
|
|
97
|
-
});
|
|
98
|
-
const result = dam.validateReadAccess(path.join(restrictedDir, 'key.pem'), access);
|
|
99
|
-
expect(result.allowed).toBe(false);
|
|
100
|
-
expect(result.category).toBe('custom_restricted');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
test('validateReadAccess denies path outside project scope', () => {
|
|
104
|
-
const access = dam.createDirectoryAccess({
|
|
105
|
-
workingDirectory: projectDir,
|
|
106
|
-
restrictToProject: true
|
|
107
|
-
});
|
|
108
|
-
const result = dam.validateReadAccess('/tmp/other-project/file.js', access);
|
|
109
|
-
expect(result.allowed).toBe(false);
|
|
110
|
-
expect(result.category).toBe('project_restricted');
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test('validateReadAccess handles validation errors gracefully', () => {
|
|
114
|
-
const access = dam.createDirectoryAccess({
|
|
115
|
-
workingDirectory: projectDir
|
|
116
|
-
});
|
|
117
|
-
// Pass an object instead of string to trigger error
|
|
118
|
-
const result = dam.validateReadAccess(null, access);
|
|
119
|
-
expect(result.allowed).toBe(false);
|
|
120
|
-
expect(result.category).toBe('validation_error');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
// ─── validateWriteAccess ───────────────────────────────────────
|
|
124
|
-
|
|
125
|
-
test('validateWriteAccess allows within write-enabled directory', () => {
|
|
126
|
-
const access = dam.createDirectoryAccess({
|
|
127
|
-
workingDirectory: projectDir,
|
|
128
|
-
writeEnabledDirectories: [projectDir]
|
|
129
|
-
});
|
|
130
|
-
const filePath = path.join(projectDir, 'output.txt');
|
|
131
|
-
const result = dam.validateWriteAccess(filePath, access);
|
|
132
|
-
expect(result.allowed).toBe(true);
|
|
133
|
-
expect(result.writeAllowed).toBe(true);
|
|
134
|
-
expect(result.category).toBe('write_allowed');
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
test('validateWriteAccess denies write to read-only directory', () => {
|
|
138
|
-
const readOnlyDir = path.join(projectDir, 'readonly');
|
|
139
|
-
const access = dam.createDirectoryAccess({
|
|
140
|
-
workingDirectory: projectDir,
|
|
141
|
-
readOnlyDirectories: [readOnlyDir],
|
|
142
|
-
writeEnabledDirectories: [path.join(projectDir, 'writable')],
|
|
143
|
-
restrictToProject: false
|
|
144
|
-
});
|
|
145
|
-
const result = dam.validateWriteAccess(path.join(readOnlyDir, 'file.txt'), access);
|
|
146
|
-
expect(result.allowed).toBe(false);
|
|
147
|
-
expect(result.writeAllowed).toBe(false);
|
|
148
|
-
expect(result.category).toBe('read_only_restricted');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
test('validateWriteAccess denies write outside write-enabled directories', () => {
|
|
152
|
-
const writeDir = path.join(projectDir, 'output');
|
|
153
|
-
const access = dam.createDirectoryAccess({
|
|
154
|
-
workingDirectory: projectDir,
|
|
155
|
-
writeEnabledDirectories: [writeDir],
|
|
156
|
-
restrictToProject: false
|
|
157
|
-
});
|
|
158
|
-
const otherPath = path.join(projectDir, 'src', 'file.js');
|
|
159
|
-
const result = dam.validateWriteAccess(otherPath, access);
|
|
160
|
-
expect(result.allowed).toBe(false);
|
|
161
|
-
expect(result.writeAllowed).toBe(false);
|
|
162
|
-
expect(result.category).toBe('write_restricted');
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
test('validateWriteAccess falls back to workingDirectory when no writeEnabled dirs', () => {
|
|
166
|
-
const access = dam.createDirectoryAccess({
|
|
167
|
-
workingDirectory: projectDir,
|
|
168
|
-
writeEnabledDirectories: [],
|
|
169
|
-
restrictToProject: true
|
|
170
|
-
});
|
|
171
|
-
// Manually clear writeEnabledDirectories that createDirectoryAccess may have filtered
|
|
172
|
-
access.writeEnabledDirectories = [];
|
|
173
|
-
const filePath = path.join(projectDir, 'output.txt');
|
|
174
|
-
const result = dam.validateWriteAccess(filePath, access);
|
|
175
|
-
expect(result.allowed).toBe(true);
|
|
176
|
-
expect(result.writeAllowed).toBe(true);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test('validateWriteAccess propagates read-access denial', () => {
|
|
180
|
-
const access = dam.createDirectoryAccess({
|
|
181
|
-
workingDirectory: projectDir
|
|
182
|
-
});
|
|
183
|
-
const systemPath = process.platform === 'win32'
|
|
184
|
-
? 'C:\\Windows\\System32\\config\\test.txt'
|
|
185
|
-
: '/etc/shadow';
|
|
186
|
-
const result = dam.validateWriteAccess(systemPath, access);
|
|
187
|
-
expect(result.allowed).toBe(false);
|
|
188
|
-
expect(result.writeAllowed).toBe(false);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// ─── getWorkingDirectory ───────────────────────────────────────
|
|
192
|
-
|
|
193
|
-
test('getWorkingDirectory returns workingDirectory from config', () => {
|
|
194
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
195
|
-
expect(dam.getWorkingDirectory(access)).toBe(projectDir);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
test('getWorkingDirectory falls back to cwd when no workingDirectory', () => {
|
|
199
|
-
expect(dam.getWorkingDirectory({})).toBe(process.cwd());
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
// ─── getAccessibleDirectories ──────────────────────────────────
|
|
203
|
-
|
|
204
|
-
test('getAccessibleDirectories returns directory listing', () => {
|
|
205
|
-
const access = dam.createDirectoryAccess({
|
|
206
|
-
workingDirectory: projectDir,
|
|
207
|
-
readOnlyDirectories: [path.join(projectDir, 'docs')],
|
|
208
|
-
writeEnabledDirectories: [path.join(projectDir, 'src')]
|
|
209
|
-
});
|
|
210
|
-
const result = dam.getAccessibleDirectories(access);
|
|
211
|
-
expect(result.workingDirectory).toBe(projectDir);
|
|
212
|
-
expect(result.readOnly).toContain(projectDir); // workingDir added
|
|
213
|
-
expect(result.projectRestricted).toBe(true);
|
|
214
|
-
expect(result.systemAccessAllowed).toBe(false);
|
|
215
|
-
expect(typeof result.totalDirectories).toBe('number');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
// ─── updateDirectoryAccess ─────────────────────────────────────
|
|
219
|
-
|
|
220
|
-
test('updateDirectoryAccess updates working directory', () => {
|
|
221
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
222
|
-
const updated = dam.updateDirectoryAccess(access, {
|
|
223
|
-
workingDirectory: '/tmp/new-project'
|
|
224
|
-
});
|
|
225
|
-
expect(updated.workingDirectory).toBe(path.resolve('/tmp/new-project'));
|
|
226
|
-
expect(updated.updatedAt).toBeDefined();
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
test('updateDirectoryAccess updates readOnlyDirectories', () => {
|
|
230
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
231
|
-
const updated = dam.updateDirectoryAccess(access, {
|
|
232
|
-
readOnlyDirectories: ['/tmp/docs']
|
|
233
|
-
});
|
|
234
|
-
// The stored path may be normalized differently per platform
|
|
235
|
-
const hasDocsPath = updated.readOnlyDirectories.some(d => d.includes('tmp') && d.includes('docs'));
|
|
236
|
-
expect(hasDocsPath).toBe(true);
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
test('updateDirectoryAccess updates writeEnabledDirectories', () => {
|
|
240
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
241
|
-
const updated = dam.updateDirectoryAccess(access, {
|
|
242
|
-
writeEnabledDirectories: [projectDir]
|
|
243
|
-
});
|
|
244
|
-
expect(updated.writeEnabledDirectories).toContain(projectDir);
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
test('updateDirectoryAccess updates boolean flags', () => {
|
|
248
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
249
|
-
const updated = dam.updateDirectoryAccess(access, {
|
|
250
|
-
restrictToProject: false,
|
|
251
|
-
allowSystemAccess: true
|
|
252
|
-
});
|
|
253
|
-
expect(updated.restrictToProject).toBe(false);
|
|
254
|
-
expect(updated.allowSystemAccess).toBe(true);
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
test('updateDirectoryAccess updates customRestrictions', () => {
|
|
258
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
259
|
-
const updated = dam.updateDirectoryAccess(access, {
|
|
260
|
-
customRestrictions: ['/tmp/restricted']
|
|
261
|
-
});
|
|
262
|
-
expect(updated.customRestrictions).toContain(path.resolve('/tmp/restricted'));
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
test('updateDirectoryAccess preserves version', () => {
|
|
266
|
-
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
267
|
-
const updated = dam.updateDirectoryAccess(access, {});
|
|
268
|
-
expect(updated.version).toBe('1.0');
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
// ─── validateAccessConfiguration ──────────────────────────────
|
|
272
|
-
|
|
273
|
-
test('validateAccessConfiguration validates valid config', () => {
|
|
274
|
-
const access = dam.createDirectoryAccess({
|
|
275
|
-
workingDirectory: projectDir,
|
|
276
|
-
writeEnabledDirectories: [projectDir]
|
|
277
|
-
});
|
|
278
|
-
const result = dam.validateAccessConfiguration(access);
|
|
279
|
-
expect(result.valid).toBe(true);
|
|
280
|
-
expect(result.errors).toHaveLength(0);
|
|
281
|
-
expect(result.summary).toBeDefined();
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
test('validateAccessConfiguration errors on missing workingDirectory', () => {
|
|
285
|
-
const config = {
|
|
286
|
-
readOnlyDirectories: [],
|
|
287
|
-
writeEnabledDirectories: []
|
|
288
|
-
};
|
|
289
|
-
const result = dam.validateAccessConfiguration(config);
|
|
290
|
-
expect(result.valid).toBe(false);
|
|
291
|
-
expect(result.errors.some(e => e.includes('Working directory'))).toBe(true);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
test('validateAccessConfiguration errors on non-array directories', () => {
|
|
295
|
-
const result = dam.validateAccessConfiguration({
|
|
296
|
-
workingDirectory: projectDir,
|
|
297
|
-
readOnlyDirectories: 'not-array',
|
|
298
|
-
writeEnabledDirectories: 'not-array'
|
|
299
|
-
});
|
|
300
|
-
expect(result.errors.some(e => e.includes('readOnlyDirectories must be an array'))).toBe(true);
|
|
301
|
-
expect(result.errors.some(e => e.includes('writeEnabledDirectories must be an array'))).toBe(true);
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
test('validateAccessConfiguration warns on overlapping directories', () => {
|
|
305
|
-
const result = dam.validateAccessConfiguration({
|
|
306
|
-
workingDirectory: projectDir,
|
|
307
|
-
readOnlyDirectories: [projectDir],
|
|
308
|
-
writeEnabledDirectories: [projectDir],
|
|
309
|
-
allowSystemAccess: false,
|
|
310
|
-
restrictToProject: true
|
|
311
|
-
});
|
|
312
|
-
expect(result.warnings.some(w => w.includes('Overlapping'))).toBe(true);
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
test('validateAccessConfiguration warns on system access enabled', () => {
|
|
316
|
-
const result = dam.validateAccessConfiguration({
|
|
317
|
-
workingDirectory: projectDir,
|
|
318
|
-
readOnlyDirectories: [],
|
|
319
|
-
writeEnabledDirectories: [],
|
|
320
|
-
allowSystemAccess: true
|
|
321
|
-
});
|
|
322
|
-
expect(result.warnings.some(w => w.includes('System path access'))).toBe(true);
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// ─── createRelativePath ────────────────────────────────────────
|
|
326
|
-
|
|
327
|
-
test('createRelativePath converts absolute to relative', () => {
|
|
328
|
-
const access = dam.createDirectoryAccess({
|
|
329
|
-
workingDirectory: projectDir,
|
|
330
|
-
writeEnabledDirectories: [projectDir]
|
|
331
|
-
});
|
|
332
|
-
const absPath = path.join(projectDir, 'src', 'index.js');
|
|
333
|
-
const result = dam.createRelativePath(absPath, access);
|
|
334
|
-
expect(result).toBe(path.join('src', 'index.js'));
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
test('createRelativePath returns original when not within any directory', () => {
|
|
338
|
-
const access = dam.createDirectoryAccess({
|
|
339
|
-
workingDirectory: projectDir,
|
|
340
|
-
readOnlyDirectories: [],
|
|
341
|
-
writeEnabledDirectories: []
|
|
342
|
-
});
|
|
343
|
-
// Clear auto-added dirs
|
|
344
|
-
access.readOnlyDirectories = [];
|
|
345
|
-
access.writeEnabledDirectories = [];
|
|
346
|
-
access.workingDirectory = '/nonexistent';
|
|
347
|
-
const absPath = '/completely/different/path.js';
|
|
348
|
-
const result = dam.createRelativePath(absPath, access);
|
|
349
|
-
expect(result).toBe(absPath);
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
// ─── getAccessSummary ──────────────────────────────────────────
|
|
353
|
-
|
|
354
|
-
test('getAccessSummary returns summary object', () => {
|
|
355
|
-
const access = dam.createDirectoryAccess({
|
|
356
|
-
workingDirectory: projectDir,
|
|
357
|
-
writeEnabledDirectories: [projectDir]
|
|
358
|
-
});
|
|
359
|
-
const summary = dam.getAccessSummary(access);
|
|
360
|
-
expect(summary.workingDirectory).toBe(projectDir);
|
|
361
|
-
expect(typeof summary.readOnlyCount).toBe('number');
|
|
362
|
-
expect(typeof summary.writeEnabledCount).toBe('number');
|
|
363
|
-
expect(typeof summary.projectRestricted).toBe('boolean');
|
|
364
|
-
expect(typeof summary.systemAccessAllowed).toBe('boolean');
|
|
365
|
-
expect(typeof summary.customRestrictionsCount).toBe('number');
|
|
366
|
-
expect(summary.configVersion).toBe('1.0');
|
|
367
|
-
expect(summary.lastUpdated).toBeDefined();
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
// ─── Static methods ───────────────────────────────────────────
|
|
371
|
-
|
|
372
|
-
test('createProjectDefaults returns config for given directory', () => {
|
|
373
|
-
const defaults = DirectoryAccessManager.createProjectDefaults(projectDir);
|
|
374
|
-
expect(defaults.workingDirectory).toBe(projectDir);
|
|
375
|
-
expect(defaults.readOnlyDirectories).toContain(projectDir);
|
|
376
|
-
expect(defaults.writeEnabledDirectories).toContain(projectDir);
|
|
377
|
-
expect(defaults.restrictToProject).toBe(true);
|
|
378
|
-
expect(defaults.allowSystemAccess).toBe(false);
|
|
379
|
-
});
|
|
380
|
-
|
|
381
|
-
test('createPermissiveDefaults returns permissive config', () => {
|
|
382
|
-
const defaults = DirectoryAccessManager.createPermissiveDefaults(projectDir);
|
|
383
|
-
expect(defaults.workingDirectory).toBe(projectDir);
|
|
384
|
-
expect(defaults.restrictToProject).toBe(false);
|
|
385
|
-
expect(defaults.allowSystemAccess).toBe(false);
|
|
386
|
-
expect(defaults.writeEnabledDirectories).toContain(projectDir);
|
|
387
|
-
});
|
|
388
|
-
});
|
|
1
|
+
import { describe, test, expect, beforeEach } from '@jest/globals';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import DirectoryAccessManager from '../directoryAccessManager.js';
|
|
5
|
+
import { createMockLogger } from '../../__test-utils__/mockFactories.js';
|
|
6
|
+
|
|
7
|
+
describe('DirectoryAccessManager', () => {
|
|
8
|
+
let dam;
|
|
9
|
+
let logger;
|
|
10
|
+
const projectDir = path.resolve('/tmp/test-project');
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
logger = createMockLogger();
|
|
14
|
+
dam = new DirectoryAccessManager({}, logger);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test('createDirectoryAccess returns config with working directory', () => {
|
|
18
|
+
const access = dam.createDirectoryAccess({
|
|
19
|
+
workingDirectory: projectDir
|
|
20
|
+
});
|
|
21
|
+
expect(access).toHaveProperty('workingDirectory');
|
|
22
|
+
expect(access.workingDirectory).toBe(projectDir);
|
|
23
|
+
expect(access).toHaveProperty('readOnlyDirectories');
|
|
24
|
+
expect(access).toHaveProperty('writeEnabledDirectories');
|
|
25
|
+
expect(access).toHaveProperty('restrictToProject');
|
|
26
|
+
expect(access).toHaveProperty('version', '1.0');
|
|
27
|
+
expect(access).toHaveProperty('createdAt');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test('createDirectoryAccess includes workingDir in readOnly when restrictToProject', () => {
|
|
31
|
+
const access = dam.createDirectoryAccess({
|
|
32
|
+
workingDirectory: projectDir,
|
|
33
|
+
restrictToProject: true
|
|
34
|
+
});
|
|
35
|
+
expect(access.readOnlyDirectories).toContain(projectDir);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('createDirectoryAccess filters writeEnabled dirs outside project when restricted', () => {
|
|
39
|
+
const access = dam.createDirectoryAccess({
|
|
40
|
+
workingDirectory: projectDir,
|
|
41
|
+
restrictToProject: true,
|
|
42
|
+
writeEnabledDirectories: ['/tmp/other-project']
|
|
43
|
+
});
|
|
44
|
+
// /tmp/other-project is outside projectDir, should be filtered
|
|
45
|
+
expect(access.writeEnabledDirectories).not.toContain(path.resolve('/tmp/other-project'));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('createDirectoryAccess resolves custom restrictions to absolute paths', () => {
|
|
49
|
+
const access = dam.createDirectoryAccess({
|
|
50
|
+
workingDirectory: projectDir,
|
|
51
|
+
customRestrictions: ['sensitive']
|
|
52
|
+
});
|
|
53
|
+
expect(access.customRestrictions[0]).toBe(path.resolve('sensitive'));
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// ─── validateReadAccess ────────────────────────────────────────
|
|
57
|
+
|
|
58
|
+
test('validateReadAccess allows path within project', () => {
|
|
59
|
+
const access = dam.createDirectoryAccess({
|
|
60
|
+
workingDirectory: projectDir
|
|
61
|
+
});
|
|
62
|
+
const filePath = path.join(projectDir, 'src', 'index.js');
|
|
63
|
+
const result = dam.validateReadAccess(filePath, access);
|
|
64
|
+
expect(result.allowed).toBe(true);
|
|
65
|
+
expect(result.category).toBe('allowed');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('validateReadAccess denies system paths', () => {
|
|
69
|
+
const access = dam.createDirectoryAccess({
|
|
70
|
+
workingDirectory: projectDir
|
|
71
|
+
});
|
|
72
|
+
const systemPath = process.platform === 'win32'
|
|
73
|
+
? 'C:\\Windows\\System32\\config'
|
|
74
|
+
: '/etc/passwd';
|
|
75
|
+
const result = dam.validateReadAccess(systemPath, access);
|
|
76
|
+
expect(result.allowed).toBe(false);
|
|
77
|
+
expect(result.category).toBe('system_restricted');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('validateReadAccess allows system paths when allowSystemAccess is true', () => {
|
|
81
|
+
const sshPath = path.join(os.homedir(), '.ssh', 'known_hosts');
|
|
82
|
+
const access = dam.createDirectoryAccess({
|
|
83
|
+
workingDirectory: projectDir,
|
|
84
|
+
allowSystemAccess: true,
|
|
85
|
+
restrictToProject: false,
|
|
86
|
+
readOnlyDirectories: [os.homedir()]
|
|
87
|
+
});
|
|
88
|
+
const result = dam.validateReadAccess(sshPath, access);
|
|
89
|
+
expect(result.allowed).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('validateReadAccess denies custom restricted paths', () => {
|
|
93
|
+
const restrictedDir = path.join(projectDir, 'secrets');
|
|
94
|
+
const access = dam.createDirectoryAccess({
|
|
95
|
+
workingDirectory: projectDir,
|
|
96
|
+
customRestrictions: [restrictedDir]
|
|
97
|
+
});
|
|
98
|
+
const result = dam.validateReadAccess(path.join(restrictedDir, 'key.pem'), access);
|
|
99
|
+
expect(result.allowed).toBe(false);
|
|
100
|
+
expect(result.category).toBe('custom_restricted');
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('validateReadAccess denies path outside project scope', () => {
|
|
104
|
+
const access = dam.createDirectoryAccess({
|
|
105
|
+
workingDirectory: projectDir,
|
|
106
|
+
restrictToProject: true
|
|
107
|
+
});
|
|
108
|
+
const result = dam.validateReadAccess('/tmp/other-project/file.js', access);
|
|
109
|
+
expect(result.allowed).toBe(false);
|
|
110
|
+
expect(result.category).toBe('project_restricted');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('validateReadAccess handles validation errors gracefully', () => {
|
|
114
|
+
const access = dam.createDirectoryAccess({
|
|
115
|
+
workingDirectory: projectDir
|
|
116
|
+
});
|
|
117
|
+
// Pass an object instead of string to trigger error
|
|
118
|
+
const result = dam.validateReadAccess(null, access);
|
|
119
|
+
expect(result.allowed).toBe(false);
|
|
120
|
+
expect(result.category).toBe('validation_error');
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// ─── validateWriteAccess ───────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
test('validateWriteAccess allows within write-enabled directory', () => {
|
|
126
|
+
const access = dam.createDirectoryAccess({
|
|
127
|
+
workingDirectory: projectDir,
|
|
128
|
+
writeEnabledDirectories: [projectDir]
|
|
129
|
+
});
|
|
130
|
+
const filePath = path.join(projectDir, 'output.txt');
|
|
131
|
+
const result = dam.validateWriteAccess(filePath, access);
|
|
132
|
+
expect(result.allowed).toBe(true);
|
|
133
|
+
expect(result.writeAllowed).toBe(true);
|
|
134
|
+
expect(result.category).toBe('write_allowed');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('validateWriteAccess denies write to read-only directory', () => {
|
|
138
|
+
const readOnlyDir = path.join(projectDir, 'readonly');
|
|
139
|
+
const access = dam.createDirectoryAccess({
|
|
140
|
+
workingDirectory: projectDir,
|
|
141
|
+
readOnlyDirectories: [readOnlyDir],
|
|
142
|
+
writeEnabledDirectories: [path.join(projectDir, 'writable')],
|
|
143
|
+
restrictToProject: false
|
|
144
|
+
});
|
|
145
|
+
const result = dam.validateWriteAccess(path.join(readOnlyDir, 'file.txt'), access);
|
|
146
|
+
expect(result.allowed).toBe(false);
|
|
147
|
+
expect(result.writeAllowed).toBe(false);
|
|
148
|
+
expect(result.category).toBe('read_only_restricted');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('validateWriteAccess denies write outside write-enabled directories', () => {
|
|
152
|
+
const writeDir = path.join(projectDir, 'output');
|
|
153
|
+
const access = dam.createDirectoryAccess({
|
|
154
|
+
workingDirectory: projectDir,
|
|
155
|
+
writeEnabledDirectories: [writeDir],
|
|
156
|
+
restrictToProject: false
|
|
157
|
+
});
|
|
158
|
+
const otherPath = path.join(projectDir, 'src', 'file.js');
|
|
159
|
+
const result = dam.validateWriteAccess(otherPath, access);
|
|
160
|
+
expect(result.allowed).toBe(false);
|
|
161
|
+
expect(result.writeAllowed).toBe(false);
|
|
162
|
+
expect(result.category).toBe('write_restricted');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('validateWriteAccess falls back to workingDirectory when no writeEnabled dirs', () => {
|
|
166
|
+
const access = dam.createDirectoryAccess({
|
|
167
|
+
workingDirectory: projectDir,
|
|
168
|
+
writeEnabledDirectories: [],
|
|
169
|
+
restrictToProject: true
|
|
170
|
+
});
|
|
171
|
+
// Manually clear writeEnabledDirectories that createDirectoryAccess may have filtered
|
|
172
|
+
access.writeEnabledDirectories = [];
|
|
173
|
+
const filePath = path.join(projectDir, 'output.txt');
|
|
174
|
+
const result = dam.validateWriteAccess(filePath, access);
|
|
175
|
+
expect(result.allowed).toBe(true);
|
|
176
|
+
expect(result.writeAllowed).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test('validateWriteAccess propagates read-access denial', () => {
|
|
180
|
+
const access = dam.createDirectoryAccess({
|
|
181
|
+
workingDirectory: projectDir
|
|
182
|
+
});
|
|
183
|
+
const systemPath = process.platform === 'win32'
|
|
184
|
+
? 'C:\\Windows\\System32\\config\\test.txt'
|
|
185
|
+
: '/etc/shadow';
|
|
186
|
+
const result = dam.validateWriteAccess(systemPath, access);
|
|
187
|
+
expect(result.allowed).toBe(false);
|
|
188
|
+
expect(result.writeAllowed).toBe(false);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// ─── getWorkingDirectory ───────────────────────────────────────
|
|
192
|
+
|
|
193
|
+
test('getWorkingDirectory returns workingDirectory from config', () => {
|
|
194
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
195
|
+
expect(dam.getWorkingDirectory(access)).toBe(projectDir);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test('getWorkingDirectory falls back to cwd when no workingDirectory', () => {
|
|
199
|
+
expect(dam.getWorkingDirectory({})).toBe(process.cwd());
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// ─── getAccessibleDirectories ──────────────────────────────────
|
|
203
|
+
|
|
204
|
+
test('getAccessibleDirectories returns directory listing', () => {
|
|
205
|
+
const access = dam.createDirectoryAccess({
|
|
206
|
+
workingDirectory: projectDir,
|
|
207
|
+
readOnlyDirectories: [path.join(projectDir, 'docs')],
|
|
208
|
+
writeEnabledDirectories: [path.join(projectDir, 'src')]
|
|
209
|
+
});
|
|
210
|
+
const result = dam.getAccessibleDirectories(access);
|
|
211
|
+
expect(result.workingDirectory).toBe(projectDir);
|
|
212
|
+
expect(result.readOnly).toContain(projectDir); // workingDir added
|
|
213
|
+
expect(result.projectRestricted).toBe(true);
|
|
214
|
+
expect(result.systemAccessAllowed).toBe(false);
|
|
215
|
+
expect(typeof result.totalDirectories).toBe('number');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// ─── updateDirectoryAccess ─────────────────────────────────────
|
|
219
|
+
|
|
220
|
+
test('updateDirectoryAccess updates working directory', () => {
|
|
221
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
222
|
+
const updated = dam.updateDirectoryAccess(access, {
|
|
223
|
+
workingDirectory: '/tmp/new-project'
|
|
224
|
+
});
|
|
225
|
+
expect(updated.workingDirectory).toBe(path.resolve('/tmp/new-project'));
|
|
226
|
+
expect(updated.updatedAt).toBeDefined();
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test('updateDirectoryAccess updates readOnlyDirectories', () => {
|
|
230
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
231
|
+
const updated = dam.updateDirectoryAccess(access, {
|
|
232
|
+
readOnlyDirectories: ['/tmp/docs']
|
|
233
|
+
});
|
|
234
|
+
// The stored path may be normalized differently per platform
|
|
235
|
+
const hasDocsPath = updated.readOnlyDirectories.some(d => d.includes('tmp') && d.includes('docs'));
|
|
236
|
+
expect(hasDocsPath).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test('updateDirectoryAccess updates writeEnabledDirectories', () => {
|
|
240
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
241
|
+
const updated = dam.updateDirectoryAccess(access, {
|
|
242
|
+
writeEnabledDirectories: [projectDir]
|
|
243
|
+
});
|
|
244
|
+
expect(updated.writeEnabledDirectories).toContain(projectDir);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('updateDirectoryAccess updates boolean flags', () => {
|
|
248
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
249
|
+
const updated = dam.updateDirectoryAccess(access, {
|
|
250
|
+
restrictToProject: false,
|
|
251
|
+
allowSystemAccess: true
|
|
252
|
+
});
|
|
253
|
+
expect(updated.restrictToProject).toBe(false);
|
|
254
|
+
expect(updated.allowSystemAccess).toBe(true);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test('updateDirectoryAccess updates customRestrictions', () => {
|
|
258
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
259
|
+
const updated = dam.updateDirectoryAccess(access, {
|
|
260
|
+
customRestrictions: ['/tmp/restricted']
|
|
261
|
+
});
|
|
262
|
+
expect(updated.customRestrictions).toContain(path.resolve('/tmp/restricted'));
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test('updateDirectoryAccess preserves version', () => {
|
|
266
|
+
const access = dam.createDirectoryAccess({ workingDirectory: projectDir });
|
|
267
|
+
const updated = dam.updateDirectoryAccess(access, {});
|
|
268
|
+
expect(updated.version).toBe('1.0');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// ─── validateAccessConfiguration ──────────────────────────────
|
|
272
|
+
|
|
273
|
+
test('validateAccessConfiguration validates valid config', () => {
|
|
274
|
+
const access = dam.createDirectoryAccess({
|
|
275
|
+
workingDirectory: projectDir,
|
|
276
|
+
writeEnabledDirectories: [projectDir]
|
|
277
|
+
});
|
|
278
|
+
const result = dam.validateAccessConfiguration(access);
|
|
279
|
+
expect(result.valid).toBe(true);
|
|
280
|
+
expect(result.errors).toHaveLength(0);
|
|
281
|
+
expect(result.summary).toBeDefined();
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test('validateAccessConfiguration errors on missing workingDirectory', () => {
|
|
285
|
+
const config = {
|
|
286
|
+
readOnlyDirectories: [],
|
|
287
|
+
writeEnabledDirectories: []
|
|
288
|
+
};
|
|
289
|
+
const result = dam.validateAccessConfiguration(config);
|
|
290
|
+
expect(result.valid).toBe(false);
|
|
291
|
+
expect(result.errors.some(e => e.includes('Working directory'))).toBe(true);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test('validateAccessConfiguration errors on non-array directories', () => {
|
|
295
|
+
const result = dam.validateAccessConfiguration({
|
|
296
|
+
workingDirectory: projectDir,
|
|
297
|
+
readOnlyDirectories: 'not-array',
|
|
298
|
+
writeEnabledDirectories: 'not-array'
|
|
299
|
+
});
|
|
300
|
+
expect(result.errors.some(e => e.includes('readOnlyDirectories must be an array'))).toBe(true);
|
|
301
|
+
expect(result.errors.some(e => e.includes('writeEnabledDirectories must be an array'))).toBe(true);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
test('validateAccessConfiguration warns on overlapping directories', () => {
|
|
305
|
+
const result = dam.validateAccessConfiguration({
|
|
306
|
+
workingDirectory: projectDir,
|
|
307
|
+
readOnlyDirectories: [projectDir],
|
|
308
|
+
writeEnabledDirectories: [projectDir],
|
|
309
|
+
allowSystemAccess: false,
|
|
310
|
+
restrictToProject: true
|
|
311
|
+
});
|
|
312
|
+
expect(result.warnings.some(w => w.includes('Overlapping'))).toBe(true);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test('validateAccessConfiguration warns on system access enabled', () => {
|
|
316
|
+
const result = dam.validateAccessConfiguration({
|
|
317
|
+
workingDirectory: projectDir,
|
|
318
|
+
readOnlyDirectories: [],
|
|
319
|
+
writeEnabledDirectories: [],
|
|
320
|
+
allowSystemAccess: true
|
|
321
|
+
});
|
|
322
|
+
expect(result.warnings.some(w => w.includes('System path access'))).toBe(true);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// ─── createRelativePath ────────────────────────────────────────
|
|
326
|
+
|
|
327
|
+
test('createRelativePath converts absolute to relative', () => {
|
|
328
|
+
const access = dam.createDirectoryAccess({
|
|
329
|
+
workingDirectory: projectDir,
|
|
330
|
+
writeEnabledDirectories: [projectDir]
|
|
331
|
+
});
|
|
332
|
+
const absPath = path.join(projectDir, 'src', 'index.js');
|
|
333
|
+
const result = dam.createRelativePath(absPath, access);
|
|
334
|
+
expect(result).toBe(path.join('src', 'index.js'));
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
test('createRelativePath returns original when not within any directory', () => {
|
|
338
|
+
const access = dam.createDirectoryAccess({
|
|
339
|
+
workingDirectory: projectDir,
|
|
340
|
+
readOnlyDirectories: [],
|
|
341
|
+
writeEnabledDirectories: []
|
|
342
|
+
});
|
|
343
|
+
// Clear auto-added dirs
|
|
344
|
+
access.readOnlyDirectories = [];
|
|
345
|
+
access.writeEnabledDirectories = [];
|
|
346
|
+
access.workingDirectory = '/nonexistent';
|
|
347
|
+
const absPath = '/completely/different/path.js';
|
|
348
|
+
const result = dam.createRelativePath(absPath, access);
|
|
349
|
+
expect(result).toBe(absPath);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// ─── getAccessSummary ──────────────────────────────────────────
|
|
353
|
+
|
|
354
|
+
test('getAccessSummary returns summary object', () => {
|
|
355
|
+
const access = dam.createDirectoryAccess({
|
|
356
|
+
workingDirectory: projectDir,
|
|
357
|
+
writeEnabledDirectories: [projectDir]
|
|
358
|
+
});
|
|
359
|
+
const summary = dam.getAccessSummary(access);
|
|
360
|
+
expect(summary.workingDirectory).toBe(projectDir);
|
|
361
|
+
expect(typeof summary.readOnlyCount).toBe('number');
|
|
362
|
+
expect(typeof summary.writeEnabledCount).toBe('number');
|
|
363
|
+
expect(typeof summary.projectRestricted).toBe('boolean');
|
|
364
|
+
expect(typeof summary.systemAccessAllowed).toBe('boolean');
|
|
365
|
+
expect(typeof summary.customRestrictionsCount).toBe('number');
|
|
366
|
+
expect(summary.configVersion).toBe('1.0');
|
|
367
|
+
expect(summary.lastUpdated).toBeDefined();
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// ─── Static methods ───────────────────────────────────────────
|
|
371
|
+
|
|
372
|
+
test('createProjectDefaults returns config for given directory', () => {
|
|
373
|
+
const defaults = DirectoryAccessManager.createProjectDefaults(projectDir);
|
|
374
|
+
expect(defaults.workingDirectory).toBe(projectDir);
|
|
375
|
+
expect(defaults.readOnlyDirectories).toContain(projectDir);
|
|
376
|
+
expect(defaults.writeEnabledDirectories).toContain(projectDir);
|
|
377
|
+
expect(defaults.restrictToProject).toBe(true);
|
|
378
|
+
expect(defaults.allowSystemAccess).toBe(false);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test('createPermissiveDefaults returns permissive config', () => {
|
|
382
|
+
const defaults = DirectoryAccessManager.createPermissiveDefaults(projectDir);
|
|
383
|
+
expect(defaults.workingDirectory).toBe(projectDir);
|
|
384
|
+
expect(defaults.restrictToProject).toBe(false);
|
|
385
|
+
expect(defaults.allowSystemAccess).toBe(false);
|
|
386
|
+
expect(defaults.writeEnabledDirectories).toContain(projectDir);
|
|
387
|
+
});
|
|
388
|
+
});
|