@nxuss/lemma 1.31.0 → 1.32.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/README.md +55 -0
- package/dist/cjs/api/server.js +1 -1
- package/dist/cjs/api/server.js.map +1 -1
- package/dist/cjs/autopilot/AutopilotWatcher.js +2 -2
- package/dist/cjs/autopilot/AutopilotWatcher.js.map +1 -1
- package/dist/cjs/autopilot/Notifier.d.ts.map +1 -1
- package/dist/cjs/autopilot/Notifier.js +0 -1
- package/dist/cjs/autopilot/Notifier.js.map +1 -1
- package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/cjs/cli/lemma-proxy.js +18 -18
- package/dist/cjs/cli/lemma-proxy.js.map +1 -1
- package/dist/cjs/cli/stack.d.ts.map +1 -1
- package/dist/cjs/cli/stack.js.map +1 -1
- package/dist/cjs/cloud/TenantCache.d.ts.map +1 -1
- package/dist/cjs/cloud/TenantCache.js +0 -1
- package/dist/cjs/cloud/TenantCache.js.map +1 -1
- package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts.map +1 -1
- package/dist/cjs/cloud/scrub/StatelessScrubber.js +2 -1
- package/dist/cjs/cloud/scrub/StatelessScrubber.js.map +1 -1
- package/dist/cjs/cloud/server.js +4 -4
- package/dist/cjs/cloud/server.js.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.js +1 -1
- package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/cjs/consensus/ConsensusEngine.d.ts.map +1 -1
- package/dist/cjs/consensus/ConsensusEngine.js +0 -1
- package/dist/cjs/consensus/ConsensusEngine.js.map +1 -1
- package/dist/cjs/core/GhostListener.d.ts.map +1 -1
- package/dist/cjs/core/GhostListener.js.map +1 -1
- package/dist/cjs/core/OrchestrationEngine.d.ts.map +1 -1
- package/dist/cjs/core/OrchestrationEngine.js +1 -1
- package/dist/cjs/core/OrchestrationEngine.js.map +1 -1
- package/dist/cjs/core/SubconsciousEngine.d.ts.map +1 -1
- package/dist/cjs/core/SubconsciousEngine.js.map +1 -1
- package/dist/cjs/core/router.d.ts.map +1 -1
- package/dist/cjs/core/router.js +2 -2
- package/dist/cjs/core/router.js.map +1 -1
- package/dist/cjs/embed/index.d.ts.map +1 -1
- package/dist/cjs/embed/index.js +0 -1
- package/dist/cjs/embed/index.js.map +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/infra/analyzers/DriftDetector.js +1 -1
- package/dist/cjs/infra/analyzers/DriftDetector.js.map +1 -1
- package/dist/cjs/infra/config.d.ts.map +1 -1
- package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
- package/dist/cjs/infra/mcp-tools.js +29 -5
- package/dist/cjs/infra/mcp-tools.js.map +1 -1
- package/dist/cjs/infra/providers/InfraProvider.d.ts.map +1 -1
- package/dist/cjs/infra/providers/JenkinsProvider.js +1 -1
- package/dist/cjs/infra/templates/jenkins/index.d.ts.map +1 -1
- package/dist/cjs/infra/templates/jenkins/index.js +8 -4
- package/dist/cjs/infra/templates/jenkins/index.js.map +1 -1
- package/dist/cjs/mcp/index.js +1 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/tools/codenav.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/codenav.js +145 -48
- package/dist/cjs/mcp/tools/codenav.js.map +1 -1
- package/dist/cjs/mcp/tools/context-tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/context-tools.js +1 -1
- package/dist/cjs/mcp/tools/context-tools.js.map +1 -1
- package/dist/cjs/mcp/tools/devtools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/devtools.js +124 -33
- package/dist/cjs/mcp/tools/devtools.js.map +1 -1
- package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/memory.js +8 -0
- package/dist/cjs/mcp/tools/memory.js.map +1 -1
- package/dist/cjs/mcp/tools/misc.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/misc.js +16 -1
- package/dist/cjs/mcp/tools/misc.js.map +1 -1
- package/dist/cjs/mcp/tools/refactor.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/refactor.js +234 -107
- package/dist/cjs/mcp/tools/refactor.js.map +1 -1
- package/dist/cjs/mcp/tools/review.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/review.js +12 -11
- package/dist/cjs/mcp/tools/review.js.map +1 -1
- package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/cjs/mcp/tools/workspace.js +78 -16
- package/dist/cjs/mcp/tools/workspace.js.map +1 -1
- package/dist/cjs/mcp/tools.d.ts.map +1 -1
- package/dist/cjs/mcp/tools.js.map +1 -1
- package/dist/cjs/mcp/utils.d.ts +1 -1
- package/dist/cjs/mcp/utils.d.ts.map +1 -1
- package/dist/cjs/mcp/utils.js +242 -36
- package/dist/cjs/mcp/utils.js.map +1 -1
- package/dist/cjs/mcp/workspaceShared.d.ts +2 -0
- package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/cjs/mcp/workspaceShared.js +10 -3
- package/dist/cjs/mcp/workspaceShared.js.map +1 -1
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts +1 -1
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -1
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js +5 -5
- package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -1
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts +1 -1
- package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts.map +1 -1
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js +1 -1
- package/dist/cjs/pr-review/adapters/GitHubAdapter.js.map +1 -1
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts +1 -1
- package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts.map +1 -1
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js +1 -2
- package/dist/cjs/pr-review/adapters/GitLabAdapter.js.map +1 -1
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts +1 -1
- package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts.map +1 -1
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js +1 -2
- package/dist/cjs/pr-review/analyzers/RegressionDetector.js.map +1 -1
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js +2 -2
- package/dist/cjs/pr-review/analyzers/SecurityScanner.js.map +1 -1
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -1
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js +0 -6
- package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js.map +1 -1
- package/dist/cjs/protocol/flows.d.ts +4 -1
- package/dist/cjs/protocol/flows.d.ts.map +1 -1
- package/dist/cjs/protocol/flows.js +13 -8
- package/dist/cjs/protocol/flows.js.map +1 -1
- package/dist/cjs/protocol/validators.d.ts.map +1 -1
- package/dist/cjs/protocol/validators.js.map +1 -1
- package/dist/cjs/proxy/AgentMultiplexer.d.ts +1 -1
- package/dist/cjs/proxy/AgentMultiplexer.d.ts.map +1 -1
- package/dist/cjs/proxy/AgentMultiplexer.js +1 -1
- package/dist/cjs/proxy/AgentMultiplexer.js.map +1 -1
- package/dist/cjs/proxy/Gatekeeper.js +0 -1
- package/dist/cjs/proxy/Gatekeeper.js.map +1 -1
- package/dist/cjs/security/MessageSanitizer.d.ts.map +1 -1
- package/dist/cjs/security/MessageSanitizer.js +2 -1
- package/dist/cjs/security/MessageSanitizer.js.map +1 -1
- package/dist/cjs/security/SecurityMiddleware.d.ts.map +1 -1
- package/dist/cjs/security/SecurityMiddleware.js.map +1 -1
- package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -1
- package/dist/cjs/security/SemanticScrubber.js +54 -1
- package/dist/cjs/security/SemanticScrubber.js.map +1 -1
- package/dist/cjs/speculative/SpeculativeEngine.d.ts.map +1 -1
- package/dist/cjs/speculative/SpeculativeEngine.js.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/cjs/subconscious/TheBrainV2.js +1 -13
- package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
- package/dist/cjs/utils/AutoContextBundle.d.ts.map +1 -1
- package/dist/cjs/utils/AutoContextBundle.js.map +1 -1
- package/dist/cjs/utils/ClipboardWatcher.js +1 -1
- package/dist/cjs/utils/ClipboardWatcher.js.map +1 -1
- package/dist/cjs/utils/CommandEnv.d.ts +26 -0
- package/dist/cjs/utils/CommandEnv.d.ts.map +1 -0
- package/dist/cjs/utils/CommandEnv.js +91 -0
- package/dist/cjs/utils/CommandEnv.js.map +1 -0
- package/dist/cjs/utils/CommandSandbox.d.ts +42 -0
- package/dist/cjs/utils/CommandSandbox.d.ts.map +1 -0
- package/dist/cjs/utils/CommandSandbox.js +135 -0
- package/dist/cjs/utils/CommandSandbox.js.map +1 -0
- package/dist/cjs/utils/ContextSqueezer.d.ts +7 -1
- package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/cjs/utils/ContextSqueezer.js +187 -36
- package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
- package/dist/cjs/utils/DepGraph.d.ts.map +1 -1
- package/dist/cjs/utils/DepGraph.js +52 -21
- package/dist/cjs/utils/DepGraph.js.map +1 -1
- package/dist/cjs/utils/Eol.d.ts +10 -0
- package/dist/cjs/utils/Eol.d.ts.map +1 -0
- package/dist/cjs/utils/Eol.js +20 -0
- package/dist/cjs/utils/Eol.js.map +1 -0
- package/dist/cjs/utils/ImportTreeContext.d.ts.map +1 -1
- package/dist/cjs/utils/ImportTreeContext.js +18 -4
- package/dist/cjs/utils/ImportTreeContext.js.map +1 -1
- package/dist/cjs/utils/PatchMatcher.d.ts +1 -1
- package/dist/cjs/utils/PatchMatcher.d.ts.map +1 -1
- package/dist/cjs/utils/PatchMatcher.js +47 -1
- package/dist/cjs/utils/PatchMatcher.js.map +1 -1
- package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -1
- package/dist/cjs/utils/SurgicalASTInsert.js +3 -1
- package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -1
- package/dist/cjs/utils/SymbolSurgicalContext.js +3 -3
- package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
- package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -1
- package/dist/cjs/utils/TokenBudgetedReader.js +51 -37
- package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -1
- package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -1
- package/dist/cjs/utils/WorkspaceSearch.js +1 -0
- package/dist/cjs/utils/WorkspaceSearch.js.map +1 -1
- package/dist/cjs/utils/WormholeCompressor.js +3 -3
- package/dist/cjs/utils/WormholeCompressor.js.map +1 -1
- package/dist/esm/api/server.js +1 -1
- package/dist/esm/api/server.js.map +1 -1
- package/dist/esm/autopilot/AutopilotWatcher.js +2 -2
- package/dist/esm/autopilot/AutopilotWatcher.js.map +1 -1
- package/dist/esm/autopilot/Notifier.d.ts.map +1 -1
- package/dist/esm/autopilot/Notifier.js +0 -1
- package/dist/esm/autopilot/Notifier.js.map +1 -1
- package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
- package/dist/esm/cli/lemma-proxy.js +18 -18
- package/dist/esm/cli/lemma-proxy.js.map +1 -1
- package/dist/esm/cli/stack.d.ts.map +1 -1
- package/dist/esm/cli/stack.js.map +1 -1
- package/dist/esm/cloud/TenantCache.d.ts.map +1 -1
- package/dist/esm/cloud/TenantCache.js +0 -1
- package/dist/esm/cloud/TenantCache.js.map +1 -1
- package/dist/esm/cloud/scrub/StatelessScrubber.d.ts.map +1 -1
- package/dist/esm/cloud/scrub/StatelessScrubber.js +2 -1
- package/dist/esm/cloud/scrub/StatelessScrubber.js.map +1 -1
- package/dist/esm/cloud/server.js +4 -4
- package/dist/esm/cloud/server.js.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.js +1 -1
- package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
- package/dist/esm/consensus/ConsensusEngine.d.ts.map +1 -1
- package/dist/esm/consensus/ConsensusEngine.js +0 -1
- package/dist/esm/consensus/ConsensusEngine.js.map +1 -1
- package/dist/esm/core/GhostListener.d.ts.map +1 -1
- package/dist/esm/core/GhostListener.js.map +1 -1
- package/dist/esm/core/OrchestrationEngine.d.ts.map +1 -1
- package/dist/esm/core/OrchestrationEngine.js +1 -1
- package/dist/esm/core/OrchestrationEngine.js.map +1 -1
- package/dist/esm/core/SubconsciousEngine.d.ts.map +1 -1
- package/dist/esm/core/SubconsciousEngine.js.map +1 -1
- package/dist/esm/core/router.d.ts.map +1 -1
- package/dist/esm/core/router.js +2 -2
- package/dist/esm/core/router.js.map +1 -1
- package/dist/esm/embed/index.d.ts.map +1 -1
- package/dist/esm/embed/index.js +0 -1
- package/dist/esm/embed/index.js.map +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/infra/analyzers/DriftDetector.js +1 -1
- package/dist/esm/infra/analyzers/DriftDetector.js.map +1 -1
- package/dist/esm/infra/config.d.ts.map +1 -1
- package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
- package/dist/esm/infra/mcp-tools.js +29 -5
- package/dist/esm/infra/mcp-tools.js.map +1 -1
- package/dist/esm/infra/providers/InfraProvider.d.ts.map +1 -1
- package/dist/esm/infra/providers/JenkinsProvider.js +1 -1
- package/dist/esm/infra/templates/jenkins/index.d.ts.map +1 -1
- package/dist/esm/infra/templates/jenkins/index.js +8 -4
- package/dist/esm/infra/templates/jenkins/index.js.map +1 -1
- package/dist/esm/mcp/index.js +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/tools/codenav.d.ts.map +1 -1
- package/dist/esm/mcp/tools/codenav.js +145 -48
- package/dist/esm/mcp/tools/codenav.js.map +1 -1
- package/dist/esm/mcp/tools/context-tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools/context-tools.js +1 -1
- package/dist/esm/mcp/tools/context-tools.js.map +1 -1
- package/dist/esm/mcp/tools/devtools.d.ts.map +1 -1
- package/dist/esm/mcp/tools/devtools.js +124 -33
- package/dist/esm/mcp/tools/devtools.js.map +1 -1
- package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
- package/dist/esm/mcp/tools/memory.js +8 -0
- package/dist/esm/mcp/tools/memory.js.map +1 -1
- package/dist/esm/mcp/tools/misc.d.ts.map +1 -1
- package/dist/esm/mcp/tools/misc.js +16 -1
- package/dist/esm/mcp/tools/misc.js.map +1 -1
- package/dist/esm/mcp/tools/refactor.d.ts.map +1 -1
- package/dist/esm/mcp/tools/refactor.js +234 -107
- package/dist/esm/mcp/tools/refactor.js.map +1 -1
- package/dist/esm/mcp/tools/review.d.ts.map +1 -1
- package/dist/esm/mcp/tools/review.js +12 -11
- package/dist/esm/mcp/tools/review.js.map +1 -1
- package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
- package/dist/esm/mcp/tools/workspace.js +78 -16
- package/dist/esm/mcp/tools/workspace.js.map +1 -1
- package/dist/esm/mcp/tools.d.ts.map +1 -1
- package/dist/esm/mcp/tools.js.map +1 -1
- package/dist/esm/mcp/utils.d.ts +1 -1
- package/dist/esm/mcp/utils.d.ts.map +1 -1
- package/dist/esm/mcp/utils.js +242 -36
- package/dist/esm/mcp/utils.js.map +1 -1
- package/dist/esm/mcp/workspaceShared.d.ts +2 -0
- package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
- package/dist/esm/mcp/workspaceShared.js +9 -3
- package/dist/esm/mcp/workspaceShared.js.map +1 -1
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +1 -1
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -1
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +5 -5
- package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts.map +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.js +1 -1
- package/dist/esm/pr-review/adapters/GitHubAdapter.js.map +1 -1
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +1 -1
- package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts.map +1 -1
- package/dist/esm/pr-review/adapters/GitLabAdapter.js +1 -2
- package/dist/esm/pr-review/adapters/GitLabAdapter.js.map +1 -1
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +1 -1
- package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts.map +1 -1
- package/dist/esm/pr-review/analyzers/RegressionDetector.js +1 -2
- package/dist/esm/pr-review/analyzers/RegressionDetector.js.map +1 -1
- package/dist/esm/pr-review/analyzers/SecurityScanner.js +2 -2
- package/dist/esm/pr-review/analyzers/SecurityScanner.js.map +1 -1
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -1
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js +0 -6
- package/dist/esm/pr-review/analyzers/StaticAnalyzer.js.map +1 -1
- package/dist/esm/protocol/flows.d.ts +4 -1
- package/dist/esm/protocol/flows.d.ts.map +1 -1
- package/dist/esm/protocol/flows.js +13 -8
- package/dist/esm/protocol/flows.js.map +1 -1
- package/dist/esm/protocol/validators.d.ts.map +1 -1
- package/dist/esm/protocol/validators.js.map +1 -1
- package/dist/esm/proxy/AgentMultiplexer.d.ts +1 -1
- package/dist/esm/proxy/AgentMultiplexer.d.ts.map +1 -1
- package/dist/esm/proxy/AgentMultiplexer.js +1 -1
- package/dist/esm/proxy/AgentMultiplexer.js.map +1 -1
- package/dist/esm/proxy/Gatekeeper.js +0 -1
- package/dist/esm/proxy/Gatekeeper.js.map +1 -1
- package/dist/esm/security/MessageSanitizer.d.ts.map +1 -1
- package/dist/esm/security/MessageSanitizer.js +2 -1
- package/dist/esm/security/MessageSanitizer.js.map +1 -1
- package/dist/esm/security/SecurityMiddleware.d.ts.map +1 -1
- package/dist/esm/security/SecurityMiddleware.js.map +1 -1
- package/dist/esm/security/SemanticScrubber.d.ts.map +1 -1
- package/dist/esm/security/SemanticScrubber.js +54 -1
- package/dist/esm/security/SemanticScrubber.js.map +1 -1
- package/dist/esm/speculative/SpeculativeEngine.d.ts.map +1 -1
- package/dist/esm/speculative/SpeculativeEngine.js.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
- package/dist/esm/subconscious/TheBrainV2.js +1 -13
- package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
- package/dist/esm/utils/AutoContextBundle.d.ts.map +1 -1
- package/dist/esm/utils/AutoContextBundle.js.map +1 -1
- package/dist/esm/utils/ClipboardWatcher.js +1 -1
- package/dist/esm/utils/ClipboardWatcher.js.map +1 -1
- package/dist/esm/utils/CommandEnv.d.ts +26 -0
- package/dist/esm/utils/CommandEnv.d.ts.map +1 -0
- package/dist/esm/utils/CommandEnv.js +84 -0
- package/dist/esm/utils/CommandEnv.js.map +1 -0
- package/dist/esm/utils/CommandSandbox.d.ts +42 -0
- package/dist/esm/utils/CommandSandbox.d.ts.map +1 -0
- package/dist/esm/utils/CommandSandbox.js +126 -0
- package/dist/esm/utils/CommandSandbox.js.map +1 -0
- package/dist/esm/utils/ContextSqueezer.d.ts +7 -1
- package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
- package/dist/esm/utils/ContextSqueezer.js +187 -36
- package/dist/esm/utils/ContextSqueezer.js.map +1 -1
- package/dist/esm/utils/DepGraph.d.ts.map +1 -1
- package/dist/esm/utils/DepGraph.js +52 -21
- package/dist/esm/utils/DepGraph.js.map +1 -1
- package/dist/esm/utils/Eol.d.ts +10 -0
- package/dist/esm/utils/Eol.d.ts.map +1 -0
- package/dist/esm/utils/Eol.js +16 -0
- package/dist/esm/utils/Eol.js.map +1 -0
- package/dist/esm/utils/ImportTreeContext.d.ts.map +1 -1
- package/dist/esm/utils/ImportTreeContext.js +18 -4
- package/dist/esm/utils/ImportTreeContext.js.map +1 -1
- package/dist/esm/utils/PatchMatcher.d.ts +1 -1
- package/dist/esm/utils/PatchMatcher.d.ts.map +1 -1
- package/dist/esm/utils/PatchMatcher.js +47 -1
- package/dist/esm/utils/PatchMatcher.js.map +1 -1
- package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -1
- package/dist/esm/utils/SurgicalASTInsert.js +3 -1
- package/dist/esm/utils/SurgicalASTInsert.js.map +1 -1
- package/dist/esm/utils/SymbolSurgicalContext.js +3 -3
- package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
- package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -1
- package/dist/esm/utils/TokenBudgetedReader.js +51 -37
- package/dist/esm/utils/TokenBudgetedReader.js.map +1 -1
- package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -1
- package/dist/esm/utils/WorkspaceSearch.js +1 -0
- package/dist/esm/utils/WorkspaceSearch.js.map +1 -1
- package/dist/esm/utils/WormholeCompressor.js +3 -3
- package/dist/esm/utils/WormholeCompressor.js.map +1 -1
- package/package.json +5 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["../../../src/utils/ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,YAAY,CACjB,gBAAgB,EAChB,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,oBAAoB,CAAC,EACnE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CACxC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,KAAK,CAChB,gBAAgB,EAChB,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,wBAAwB,CAAC,EACvE,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAC;YACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;YAC3D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC/B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAEtC,6EAA6E;IAC7E,IAAI,OAAO,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/E,mEAAmE;IACnE,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtE,gCAAgC;IAChC,MAAM,WAAW,GAAG;QAClB,sBAAsB;QACtB,0DAA0D;QAC1D,8BAA8B;QAC9B,
|
|
1
|
+
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["../../../src/utils/ClipboardWatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment handed to commands run by run_workspace_command.
|
|
3
|
+
*
|
|
4
|
+
* The child used to inherit the whole of process.env, so `env`, `printenv` or any script the
|
|
5
|
+
* command ran could read every token and API key the MCP host had in its environment (cloud
|
|
6
|
+
* credentials, GITHUB_TOKEN, the Lemma license key…). Output scrubbing masks the common shapes
|
|
7
|
+
* after the fact; this keeps the secrets from reaching the child at all.
|
|
8
|
+
*
|
|
9
|
+
* Deny-by-default: only variables a build/test toolchain needs to find itself, plus whatever the
|
|
10
|
+
* project lists in lemma.config.json under `mcp.commandEnv.allow`. `mcp.commandEnv.mode: "inherit"`
|
|
11
|
+
* restores the old behavior for projects that need it.
|
|
12
|
+
*/
|
|
13
|
+
export interface CommandEnvPolicy {
|
|
14
|
+
mode: "filtered" | "inherit";
|
|
15
|
+
/** Extra variable names the project allows through. */
|
|
16
|
+
allow: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface CommandEnvResult {
|
|
19
|
+
env: NodeJS.ProcessEnv;
|
|
20
|
+
/** How many inherited variables were withheld (names are deliberately not reported). */
|
|
21
|
+
withheld: number;
|
|
22
|
+
}
|
|
23
|
+
/** Reads `mcp.commandEnv` from lemma.config.json in `dir`; any problem falls back to the safe default. */
|
|
24
|
+
export declare function loadCommandEnvPolicy(dir?: string): CommandEnvPolicy;
|
|
25
|
+
export declare function buildCommandEnv(base?: NodeJS.ProcessEnv, policy?: CommandEnvPolicy): CommandEnvResult;
|
|
26
|
+
//# sourceMappingURL=CommandEnv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandEnv.d.ts","sourceRoot":"","sources":["../../../src/utils/CommandEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA8BH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,uDAAuD;IACvD,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,0GAA0G;AAC1G,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAsB,GAAG,gBAAgB,CAclF;AAED,wBAAgB,eAAe,CAC7B,IAAI,GAAE,MAAM,CAAC,UAAwB,EACrC,MAAM,GAAE,gBAAyC,GAChD,gBAAgB,CAwBlB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment handed to commands run by run_workspace_command.
|
|
3
|
+
*
|
|
4
|
+
* The child used to inherit the whole of process.env, so `env`, `printenv` or any script the
|
|
5
|
+
* command ran could read every token and API key the MCP host had in its environment (cloud
|
|
6
|
+
* credentials, GITHUB_TOKEN, the Lemma license key…). Output scrubbing masks the common shapes
|
|
7
|
+
* after the fact; this keeps the secrets from reaching the child at all.
|
|
8
|
+
*
|
|
9
|
+
* Deny-by-default: only variables a build/test toolchain needs to find itself, plus whatever the
|
|
10
|
+
* project lists in lemma.config.json under `mcp.commandEnv.allow`. `mcp.commandEnv.mode: "inherit"`
|
|
11
|
+
* restores the old behavior for projects that need it.
|
|
12
|
+
*/
|
|
13
|
+
import fs from "fs";
|
|
14
|
+
import path from "path";
|
|
15
|
+
/** Names (compared case-insensitively on Windows, where env names are case-insensitive). */
|
|
16
|
+
const SAFE_EXACT = new Set([
|
|
17
|
+
// Locating tools and the shell
|
|
18
|
+
"PATH", "PATHEXT", "SHELL", "COMSPEC", "SYSTEMROOT", "SYSTEMDRIVE", "WINDIR", "OS",
|
|
19
|
+
"PROCESSOR_ARCHITECTURE", "NUMBER_OF_PROCESSORS",
|
|
20
|
+
// Where things live
|
|
21
|
+
"HOME", "USERPROFILE", "HOMEDRIVE", "HOMEPATH", "APPDATA", "LOCALAPPDATA",
|
|
22
|
+
"PROGRAMFILES", "PROGRAMFILES(X86)", "PROGRAMDATA", "COMMONPROGRAMFILES",
|
|
23
|
+
"TEMP", "TMP", "TMPDIR", "PWD",
|
|
24
|
+
// Identity and locale (no credentials)
|
|
25
|
+
"USER", "USERNAME", "LOGNAME", "HOSTNAME", "COMPUTERNAME", "LANG", "LANGUAGE", "TZ",
|
|
26
|
+
// Terminal behaviour
|
|
27
|
+
"TERM", "COLORTERM", "FORCE_COLOR", "NO_COLOR", "CI", "NODE_ENV",
|
|
28
|
+
// Toolchain locations: without them rustup, pyenv, nvm, volta, go, java… cannot find themselves
|
|
29
|
+
"JAVA_HOME", "GOPATH", "GOROOT", "CARGO_HOME", "RUSTUP_HOME", "PYENV_ROOT", "VOLTA_HOME",
|
|
30
|
+
"NVM_DIR", "NVM_BIN", "PNPM_HOME", "BUN_INSTALL", "DENO_DIR", "ASDF_DIR", "ASDF_DATA_DIR",
|
|
31
|
+
"GEM_HOME", "GEM_PATH", "VIRTUAL_ENV", "CONDA_PREFIX",
|
|
32
|
+
"XDG_CONFIG_HOME", "XDG_CACHE_HOME", "XDG_DATA_HOME",
|
|
33
|
+
// Certificate bundles (not secrets; without them installs fail behind corporate TLS). Proxy URLs
|
|
34
|
+
// can embed credentials, so HTTP_PROXY/HTTPS_PROXY are left for the project to allow explicitly.
|
|
35
|
+
"NODE_EXTRA_CA_CERTS", "SSL_CERT_FILE", "SSL_CERT_DIR", "NO_PROXY",
|
|
36
|
+
]);
|
|
37
|
+
const SAFE_PREFIXES = ["LC_"];
|
|
38
|
+
const isWindows = () => process.platform === "win32";
|
|
39
|
+
const norm = (name) => (isWindows() ? name.toUpperCase() : name);
|
|
40
|
+
/** Reads `mcp.commandEnv` from lemma.config.json in `dir`; any problem falls back to the safe default. */
|
|
41
|
+
export function loadCommandEnvPolicy(dir = process.cwd()) {
|
|
42
|
+
const policy = { mode: "filtered", allow: [] };
|
|
43
|
+
try {
|
|
44
|
+
const configPath = path.join(dir, "lemma.config.json");
|
|
45
|
+
if (!fs.existsSync(configPath))
|
|
46
|
+
return policy;
|
|
47
|
+
const raw = JSON.parse(fs.readFileSync(configPath, "utf8"))?.mcp?.commandEnv;
|
|
48
|
+
if (raw?.mode === "inherit")
|
|
49
|
+
policy.mode = "inherit";
|
|
50
|
+
if (Array.isArray(raw?.allow)) {
|
|
51
|
+
policy.allow = raw.allow.filter((n) => typeof n === "string" && n.trim().length > 0);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Unreadable config: stay on the restrictive default rather than widening access.
|
|
56
|
+
}
|
|
57
|
+
return policy;
|
|
58
|
+
}
|
|
59
|
+
export function buildCommandEnv(base = process.env, policy = loadCommandEnvPolicy()) {
|
|
60
|
+
const extra = new Set(policy.allow.map(norm));
|
|
61
|
+
let env;
|
|
62
|
+
let withheld = 0;
|
|
63
|
+
if (policy.mode === "inherit") {
|
|
64
|
+
env = { ...base };
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
env = {};
|
|
68
|
+
for (const [name, value] of Object.entries(base)) {
|
|
69
|
+
const key = norm(name);
|
|
70
|
+
if (SAFE_EXACT.has(key) || extra.has(key) || SAFE_PREFIXES.some((p) => key.startsWith(p))) {
|
|
71
|
+
env[name] = value;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
withheld++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// cmd.exe looks for a bare command name in the current directory before PATH, so a workspace
|
|
79
|
+
// `git.bat` would run in place of git with the allowlist's blessing. This switches that off.
|
|
80
|
+
if (isWindows())
|
|
81
|
+
env.NoDefaultCurrentDirectoryInExePath = "1";
|
|
82
|
+
return { env, withheld };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=CommandEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandEnv.js","sourceRoot":"","sources":["../../../src/utils/CommandEnv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in container sandbox for run_workspace_command.
|
|
3
|
+
*
|
|
4
|
+
* The allowlist and path checks are guards, not isolation: `node -e`, `python -c` and `npm run`
|
|
5
|
+
* run arbitrary code with the user's permissions. With `mcp.sandbox.mode: "docker"` the validated
|
|
6
|
+
* command instead runs inside a throwaway container that sees only the workspace, has no network
|
|
7
|
+
* by default, none of the host's environment, no capabilities, and bounded memory, CPU and
|
|
8
|
+
* processes. Docker is the one isolation layer that behaves the same on macOS, Linux and Windows.
|
|
9
|
+
*
|
|
10
|
+
* Fail closed: if the sandbox is enabled but cannot start, the command does not run on the host.
|
|
11
|
+
*/
|
|
12
|
+
export interface SandboxPolicy {
|
|
13
|
+
mode: "off" | "docker";
|
|
14
|
+
/** Needs the toolchain the project's commands use; node:22 ships node, npm, git, python3, make, gcc. */
|
|
15
|
+
image: string;
|
|
16
|
+
/** "none" blocks all network; "bridge" allows it (npm install, git fetch). `host` is never accepted. */
|
|
17
|
+
network: "none" | "bridge";
|
|
18
|
+
memory: string;
|
|
19
|
+
cpus: string;
|
|
20
|
+
pidsLimit: number;
|
|
21
|
+
}
|
|
22
|
+
export interface DockerInvocation {
|
|
23
|
+
file: string;
|
|
24
|
+
args: string[];
|
|
25
|
+
/** Container name, so a timed-out run can be killed by name. */
|
|
26
|
+
name: string;
|
|
27
|
+
image: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const DEFAULT_SANDBOX_IMAGE = "node:22-bookworm";
|
|
30
|
+
/**
|
|
31
|
+
* Reads `mcp.sandbox` from lemma.config.json. A bad value throws instead of falling back: a typo in
|
|
32
|
+
* `network` or `image` must not silently widen what the sandbox allows or run on the host.
|
|
33
|
+
*/
|
|
34
|
+
export declare function loadSandboxPolicy(dir?: string): SandboxPolicy;
|
|
35
|
+
/**
|
|
36
|
+
* Names (never values) of the host variables to forward: the harmless ones from the filtered env,
|
|
37
|
+
* plus whatever the project allowed explicitly. Values travel through the docker CLI's own
|
|
38
|
+
* environment (`-e NAME`), so they do not show up in `ps` output.
|
|
39
|
+
*/
|
|
40
|
+
export declare function containerEnvNames(filteredEnv: NodeJS.ProcessEnv, extraAllow?: string[]): string[];
|
|
41
|
+
export declare function buildDockerInvocation(command: string, workspaceRoot: string, policy: SandboxPolicy, filteredEnv: NodeJS.ProcessEnv, extraEnvAllow?: string[]): DockerInvocation;
|
|
42
|
+
//# sourceMappingURL=CommandSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandSandbox.d.ts","sourceRoot":"","sources":["../../../src/utils/CommandSandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IACvB,wGAAwG;IACxG,KAAK,EAAE,MAAM,CAAC;IACd,wGAAwG;IACxG,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAkBxD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,aAAa,CAsC5E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAQrG;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,CAAC,UAAU,EAC9B,aAAa,GAAE,MAAM,EAAO,GAC3B,gBAAgB,CAsClB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opt-in container sandbox for run_workspace_command.
|
|
3
|
+
*
|
|
4
|
+
* The allowlist and path checks are guards, not isolation: `node -e`, `python -c` and `npm run`
|
|
5
|
+
* run arbitrary code with the user's permissions. With `mcp.sandbox.mode: "docker"` the validated
|
|
6
|
+
* command instead runs inside a throwaway container that sees only the workspace, has no network
|
|
7
|
+
* by default, none of the host's environment, no capabilities, and bounded memory, CPU and
|
|
8
|
+
* processes. Docker is the one isolation layer that behaves the same on macOS, Linux and Windows.
|
|
9
|
+
*
|
|
10
|
+
* Fail closed: if the sandbox is enabled but cannot start, the command does not run on the host.
|
|
11
|
+
*/
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import path from "path";
|
|
14
|
+
import { randomBytes } from "crypto";
|
|
15
|
+
export const DEFAULT_SANDBOX_IMAGE = "node:22-bookworm";
|
|
16
|
+
const DEFAULTS = {
|
|
17
|
+
mode: "off",
|
|
18
|
+
image: DEFAULT_SANDBOX_IMAGE,
|
|
19
|
+
network: "none",
|
|
20
|
+
memory: "2g",
|
|
21
|
+
cpus: "2",
|
|
22
|
+
pidsLimit: 512,
|
|
23
|
+
};
|
|
24
|
+
const IMAGE_RE = /^[A-Za-z0-9][A-Za-z0-9._/:@-]*$/;
|
|
25
|
+
const MEMORY_RE = /^[1-9]\d*[kmg]?$/i;
|
|
26
|
+
const CPUS_RE = /^(?:[1-9]\d*|0?\.\d+|\d+\.\d+)$/;
|
|
27
|
+
/** Env variables that still mean something inside the container (the rest are host paths). */
|
|
28
|
+
const CONTAINER_ENV_EXACT = new Set(["NODE_ENV", "CI", "LANG", "LANGUAGE", "TZ", "TERM", "COLORTERM", "FORCE_COLOR", "NO_COLOR"]);
|
|
29
|
+
/**
|
|
30
|
+
* Reads `mcp.sandbox` from lemma.config.json. A bad value throws instead of falling back: a typo in
|
|
31
|
+
* `network` or `image` must not silently widen what the sandbox allows or run on the host.
|
|
32
|
+
*/
|
|
33
|
+
export function loadSandboxPolicy(dir = process.cwd()) {
|
|
34
|
+
const policy = { ...DEFAULTS };
|
|
35
|
+
let raw;
|
|
36
|
+
try {
|
|
37
|
+
const configPath = path.join(dir, "lemma.config.json");
|
|
38
|
+
if (!fs.existsSync(configPath))
|
|
39
|
+
return policy;
|
|
40
|
+
raw = JSON.parse(fs.readFileSync(configPath, "utf8"))?.mcp?.sandbox;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return policy; // unreadable config: sandbox stays off, as if unconfigured
|
|
44
|
+
}
|
|
45
|
+
if (!raw || typeof raw !== "object")
|
|
46
|
+
return policy;
|
|
47
|
+
if (raw.mode !== undefined) {
|
|
48
|
+
if (raw.mode !== "off" && raw.mode !== "docker")
|
|
49
|
+
throw new Error(`mcp.sandbox.mode must be "off" or "docker", got ${JSON.stringify(raw.mode)}`);
|
|
50
|
+
policy.mode = raw.mode;
|
|
51
|
+
}
|
|
52
|
+
if (raw.image !== undefined) {
|
|
53
|
+
if (typeof raw.image !== "string" || !IMAGE_RE.test(raw.image))
|
|
54
|
+
throw new Error(`mcp.sandbox.image is not a valid image reference: ${JSON.stringify(raw.image)}`);
|
|
55
|
+
policy.image = raw.image;
|
|
56
|
+
}
|
|
57
|
+
if (raw.network !== undefined) {
|
|
58
|
+
if (raw.network !== "none" && raw.network !== "bridge")
|
|
59
|
+
throw new Error(`mcp.sandbox.network must be "none" or "bridge", got ${JSON.stringify(raw.network)}`);
|
|
60
|
+
policy.network = raw.network;
|
|
61
|
+
}
|
|
62
|
+
if (raw.memory !== undefined) {
|
|
63
|
+
if (typeof raw.memory !== "string" || !MEMORY_RE.test(raw.memory))
|
|
64
|
+
throw new Error(`mcp.sandbox.memory must look like "512m" or "2g", got ${JSON.stringify(raw.memory)}`);
|
|
65
|
+
policy.memory = raw.memory;
|
|
66
|
+
}
|
|
67
|
+
if (raw.cpus !== undefined) {
|
|
68
|
+
const cpus = String(raw.cpus);
|
|
69
|
+
if (!CPUS_RE.test(cpus))
|
|
70
|
+
throw new Error(`mcp.sandbox.cpus must be a positive number, got ${JSON.stringify(raw.cpus)}`);
|
|
71
|
+
policy.cpus = cpus;
|
|
72
|
+
}
|
|
73
|
+
if (raw.pidsLimit !== undefined) {
|
|
74
|
+
if (typeof raw.pidsLimit !== "number" || !Number.isInteger(raw.pidsLimit) || raw.pidsLimit < 16)
|
|
75
|
+
throw new Error(`mcp.sandbox.pidsLimit must be an integer >= 16, got ${JSON.stringify(raw.pidsLimit)}`);
|
|
76
|
+
policy.pidsLimit = raw.pidsLimit;
|
|
77
|
+
}
|
|
78
|
+
return policy;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Names (never values) of the host variables to forward: the harmless ones from the filtered env,
|
|
82
|
+
* plus whatever the project allowed explicitly. Values travel through the docker CLI's own
|
|
83
|
+
* environment (`-e NAME`), so they do not show up in `ps` output.
|
|
84
|
+
*/
|
|
85
|
+
export function containerEnvNames(filteredEnv, extraAllow = []) {
|
|
86
|
+
const extra = new Set(extraAllow);
|
|
87
|
+
return Object.keys(filteredEnv).filter((name) => filteredEnv[name] !== undefined &&
|
|
88
|
+
/^[A-Za-z_][A-Za-z0-9_]*$/.test(name) &&
|
|
89
|
+
(CONTAINER_ENV_EXACT.has(name) || name.startsWith("LC_") || extra.has(name)));
|
|
90
|
+
}
|
|
91
|
+
export function buildDockerInvocation(command, workspaceRoot, policy, filteredEnv, extraEnvAllow = []) {
|
|
92
|
+
// --mount takes comma-separated key=value pairs, so these two characters would let a path inject options.
|
|
93
|
+
if (/[",\n\r]/.test(workspaceRoot)) {
|
|
94
|
+
throw new Error(`The workspace path contains a comma, quote or newline, which the Docker sandbox cannot mount safely: ${workspaceRoot}`);
|
|
95
|
+
}
|
|
96
|
+
const name = `lemma-sbx-${randomBytes(6).toString("hex")}`;
|
|
97
|
+
const args = [
|
|
98
|
+
"run", "--rm",
|
|
99
|
+
"--name", name,
|
|
100
|
+
"--network", policy.network,
|
|
101
|
+
"--cap-drop", "ALL",
|
|
102
|
+
"--security-opt", "no-new-privileges",
|
|
103
|
+
"--pids-limit", String(policy.pidsLimit),
|
|
104
|
+
"--memory", policy.memory,
|
|
105
|
+
"--cpus", policy.cpus,
|
|
106
|
+
// Only the workspace is writable; everything else in the image is read-only.
|
|
107
|
+
"--read-only",
|
|
108
|
+
"--tmpfs", "/tmp:rw,exec,size=512m",
|
|
109
|
+
"--mount", `type=bind,source=${workspaceRoot},target=/workspace`,
|
|
110
|
+
"--workdir", "/workspace",
|
|
111
|
+
"-e", "HOME=/tmp",
|
|
112
|
+
// An image's own ENTRYPOINT (redis, postgres…) would swallow `sh -c …` as its arguments.
|
|
113
|
+
"--entrypoint", "sh",
|
|
114
|
+
];
|
|
115
|
+
// Files created in the bind mount should belong to the user, not to root. Docker Desktop on
|
|
116
|
+
// Windows has no uid to map, so the flag is skipped there.
|
|
117
|
+
if (typeof process.getuid === "function" && typeof process.getgid === "function") {
|
|
118
|
+
args.push("--user", `${process.getuid()}:${process.getgid()}`);
|
|
119
|
+
}
|
|
120
|
+
for (const envName of containerEnvNames(filteredEnv, extraEnvAllow))
|
|
121
|
+
args.push("-e", envName);
|
|
122
|
+
// The command is one argv entry for `sh -c`; it is never concatenated into a host shell line.
|
|
123
|
+
args.push(policy.image, "-c", command);
|
|
124
|
+
return { file: "docker", args, name, image: policy.image };
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=CommandSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandSandbox.js","sourceRoot":"","sources":["../../../src/utils/CommandSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,13 @@ export interface SqueezeResult {
|
|
|
12
12
|
compressionRatio: number;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
|
|
15
|
+
* Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code.
|
|
16
|
+
*
|
|
17
|
+
* A scanner, not a pair of regexes: `//` and `/*` inside a string, a template literal or a regex
|
|
18
|
+
* literal are not comments. The previous implementation cut every line at its first `//`, so
|
|
19
|
+
* `` `file://${path}` `` lost the rest of its line, and its `/* … *\/` regex deleted the `/**\/` in
|
|
20
|
+
* a glob such as `src/**\/*.ts` (leaving `src*.ts`). Anything the scanner is unsure about is kept:
|
|
21
|
+
* a stray comment costs a few tokens, a wrongly deleted line misleads the reader.
|
|
16
22
|
*/
|
|
17
23
|
export declare function stripComments(code: string): string;
|
|
18
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED
|
|
1
|
+
{"version":3,"file":"ContextSqueezer.d.ts","sourceRoot":"","sources":["../../../src/utils/ContextSqueezer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4GlD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOtD;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0BxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,aAAa,CAiEf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CA0BvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAkDtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAClC,gGAAgG;IAChG,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,kBAAkB,CA+E3G;AAsDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2CjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoExE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiD1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiC3D"}
|
|
@@ -6,37 +6,150 @@
|
|
|
6
6
|
* saving up to 80% of token consumption in LLM context windows.
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
|
-
* Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
|
|
9
|
+
* Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code.
|
|
10
|
+
*
|
|
11
|
+
* A scanner, not a pair of regexes: `//` and `/*` inside a string, a template literal or a regex
|
|
12
|
+
* literal are not comments. The previous implementation cut every line at its first `//`, so
|
|
13
|
+
* `` `file://${path}` `` lost the rest of its line, and its `/* … *\/` regex deleted the `/**\/` in
|
|
14
|
+
* a glob such as `src/**\/*.ts` (leaving `src*.ts`). Anything the scanner is unsure about is kept:
|
|
15
|
+
* a stray comment costs a few tokens, a wrongly deleted line misleads the reader.
|
|
10
16
|
*/
|
|
11
17
|
export function stripComments(code) {
|
|
12
|
-
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
const n = code.length;
|
|
19
|
+
let out = '';
|
|
20
|
+
let i = 0;
|
|
21
|
+
// Copies a '…' or "…" string starting at i; an unterminated one ends at the newline.
|
|
22
|
+
const copyQuoted = (quote) => {
|
|
23
|
+
out += code[i++];
|
|
24
|
+
while (i < n) {
|
|
25
|
+
const ch = code[i];
|
|
26
|
+
if (ch === '\\' && i + 1 < n) {
|
|
27
|
+
out += ch + code[i + 1];
|
|
28
|
+
i += 2;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (ch === '\n')
|
|
32
|
+
return;
|
|
33
|
+
out += ch;
|
|
34
|
+
i++;
|
|
35
|
+
if (ch === quote)
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
// Copies a `…` template literal, including nested ${ … } expressions that hold strings,
|
|
40
|
+
// templates or braces of their own.
|
|
41
|
+
const copyTemplate = () => {
|
|
42
|
+
out += code[i++];
|
|
43
|
+
while (i < n) {
|
|
44
|
+
const ch = code[i];
|
|
45
|
+
if (ch === '\\' && i + 1 < n) {
|
|
46
|
+
out += ch + code[i + 1];
|
|
47
|
+
i += 2;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (ch === '`') {
|
|
51
|
+
out += ch;
|
|
52
|
+
i++;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (ch === '$' && code[i + 1] === '{') {
|
|
56
|
+
out += '${';
|
|
57
|
+
i += 2;
|
|
58
|
+
let depth = 1;
|
|
59
|
+
while (i < n && depth > 0) {
|
|
60
|
+
const e = code[i];
|
|
61
|
+
if (e === '`') {
|
|
62
|
+
copyTemplate();
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (e === '"' || e === "'") {
|
|
66
|
+
copyQuoted(e);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (e === '{')
|
|
70
|
+
depth++;
|
|
71
|
+
else if (e === '}')
|
|
72
|
+
depth--;
|
|
73
|
+
out += e;
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
25
77
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
78
|
+
out += ch;
|
|
79
|
+
i++;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
// True when a '/' at this point opens a regex literal rather than meaning division.
|
|
83
|
+
const startsRegex = () => {
|
|
84
|
+
const before = out.replace(/\s+$/, '');
|
|
85
|
+
if (before.length === 0)
|
|
86
|
+
return true;
|
|
87
|
+
if ('(,=:[!&|?{};+-*%<>~^'.includes(before[before.length - 1]))
|
|
88
|
+
return true;
|
|
89
|
+
return /(?:^|[^\w$.])(?:return|typeof|case|in|of|yield|await|void|delete|throw|else|do)$/.test(before);
|
|
90
|
+
};
|
|
91
|
+
// Copies a regex literal starting at i; returns false (copying nothing) if it does not close
|
|
92
|
+
// on its own line, in which case the '/' was not a regex after all.
|
|
93
|
+
const copyRegex = () => {
|
|
94
|
+
let j = i + 1;
|
|
95
|
+
let inClass = false;
|
|
96
|
+
while (j < n) {
|
|
97
|
+
const ch = code[j];
|
|
98
|
+
if (ch === '\n')
|
|
99
|
+
return false;
|
|
100
|
+
if (ch === '\\') {
|
|
101
|
+
j += 2;
|
|
102
|
+
continue;
|
|
30
103
|
}
|
|
31
|
-
|
|
104
|
+
if (ch === '[')
|
|
105
|
+
inClass = true;
|
|
106
|
+
else if (ch === ']')
|
|
107
|
+
inClass = false;
|
|
108
|
+
else if (ch === '/' && !inClass) {
|
|
109
|
+
j++;
|
|
110
|
+
while (j < n && /[a-z]/i.test(code[j]))
|
|
111
|
+
j++;
|
|
112
|
+
out += code.slice(i, j);
|
|
113
|
+
i = j;
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
j++;
|
|
32
117
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
118
|
+
return false;
|
|
119
|
+
};
|
|
120
|
+
while (i < n) {
|
|
121
|
+
const c = code[i];
|
|
122
|
+
const d = code[i + 1];
|
|
123
|
+
if (c === '"' || c === "'") {
|
|
124
|
+
copyQuoted(c);
|
|
125
|
+
continue;
|
|
36
126
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
127
|
+
if (c === '`') {
|
|
128
|
+
copyTemplate();
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (c === '/' && d === '*') {
|
|
132
|
+
const end = code.indexOf('*/', i + 2);
|
|
133
|
+
i = end === -1 ? n : end + 2; // block comment: removed entirely, newlines included
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (c === '/' && d === '/') {
|
|
137
|
+
// `scheme://` is a URL, not a comment (http, https, file, ws, s3, …).
|
|
138
|
+
if (code[i - 1] === ':' && /[a-z][a-z0-9+.-]*:$/i.test(out.slice(-24))) {
|
|
139
|
+
out += '//';
|
|
140
|
+
i += 2;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
while (i < n && code[i] !== '\n')
|
|
144
|
+
i++; // line comment: removed up to, not including, the newline
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (c === '/' && startsRegex() && copyRegex())
|
|
148
|
+
continue;
|
|
149
|
+
out += c;
|
|
150
|
+
i++;
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
40
153
|
}
|
|
41
154
|
/**
|
|
42
155
|
* Compress code structure by removing redundant whitespace and blank lines
|
|
@@ -153,7 +266,7 @@ export function detectFilePath(code) {
|
|
|
153
266
|
// // src/proxy/KeyManager.ts
|
|
154
267
|
// # src/proxy/KeyManager.py
|
|
155
268
|
// /* src/proxy/KeyManager.ts */
|
|
156
|
-
const match = firstLine.match(/^(?:\/\/#?|#|\/\*)\s*([a-zA-Z0-9_
|
|
269
|
+
const match = firstLine.match(/^(?:\/\/#?|#|\/\*)\s*([a-zA-Z0-9_\-./\\:]{3,120})(?:\s*\*\/)?$/);
|
|
157
270
|
if (match && match[1]) {
|
|
158
271
|
return match[1];
|
|
159
272
|
}
|
|
@@ -402,13 +515,31 @@ function extractModuleSpecifier(trimmed) {
|
|
|
402
515
|
return pyImport[1].split(',')[0].trim();
|
|
403
516
|
return null;
|
|
404
517
|
}
|
|
518
|
+
/** True once `s` (an import/require statement collected so far, on one line) is a whole statement. */
|
|
519
|
+
function importStatementComplete(s) {
|
|
520
|
+
if (s.startsWith('from ')) {
|
|
521
|
+
// Python: `from a import (` … `)` is complete when the parentheses balance.
|
|
522
|
+
return (s.match(/\(/g) || []).length <= (s.match(/\)/g) || []).length;
|
|
523
|
+
}
|
|
524
|
+
if (s.startsWith('@import'))
|
|
525
|
+
return s.includes(';') || /['")]\s*$/.test(s);
|
|
526
|
+
if (/^(?:const|let|var)\s/.test(s))
|
|
527
|
+
return /require\s*\([^)]*\)/.test(s);
|
|
528
|
+
// Python: `import os`, `import a.b as c, d`.
|
|
529
|
+
if (!/\bfrom\b/.test(s) && /^import\s+[\w.]+(?:\s+as\s+\w+)?(?:\s*,\s*[\w.]+(?:\s+as\s+\w+)?)*\s*;?$/.test(s))
|
|
530
|
+
return true;
|
|
531
|
+
// JS/TS: ends with a quoted module specifier.
|
|
532
|
+
return /['"]\s*;?\s*$/.test(s) && (/\bfrom\s*['"]/.test(s) || /^import\s*['"]/.test(s) || /=\s*require\(/.test(s));
|
|
533
|
+
}
|
|
405
534
|
function isImportLine(trimmed) {
|
|
406
535
|
// JS/TS standard imports: import ... from ... or import '...'
|
|
407
536
|
if (trimmed.startsWith('import ') || trimmed.startsWith('import{') || trimmed.startsWith('import*'))
|
|
408
537
|
return true;
|
|
409
538
|
// CommonJS require statement: const ... = require(...)
|
|
410
|
-
|
|
411
|
-
|
|
539
|
+
// Only a statement that is exactly `const x = require('mod')` (optionally `.prop`). Matching any
|
|
540
|
+
// line that merely contains require( removed `const c = require("x") as {` (leaving its type
|
|
541
|
+
// body behind) and `const s = require("fs").readFileSync(` (leaving its arguments behind).
|
|
542
|
+
if (/^(?:const|let|var)\s+(?:[\w$]+|\{[^}]*\})\s*=\s*require\(\s*['"][^'"]+['"]\s*\)(?:\.[\w$]+)?\s*;?$/.test(trimmed)) {
|
|
412
543
|
return true;
|
|
413
544
|
}
|
|
414
545
|
// Python: from ... import ...
|
|
@@ -426,23 +557,43 @@ export function stripImports(code) {
|
|
|
426
557
|
const lines = code.split('\n');
|
|
427
558
|
let removedCount = 0;
|
|
428
559
|
const specifiers = [];
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
560
|
+
// A statement can span lines (`import {\n a,\n b\n} from 'x'`). Removing only its first line left
|
|
561
|
+
// the rest (`a,` / `b` / `} from 'x';`) behind as orphan lines and hid the module from the list.
|
|
562
|
+
// Consume to the end of the statement; if it does not close within a few lines it is not one we
|
|
563
|
+
// understand, so keep the line rather than risk deleting real code.
|
|
564
|
+
const MAX_IMPORT_LINES = 40;
|
|
565
|
+
const processedLines = [];
|
|
566
|
+
for (let i = 0; i < lines.length; i++) {
|
|
567
|
+
const trimmed = lines[i].trim();
|
|
568
|
+
if (!isImportLine(trimmed)) {
|
|
569
|
+
processedLines.push(lines[i]);
|
|
570
|
+
continue;
|
|
571
|
+
}
|
|
572
|
+
let statement = trimmed;
|
|
573
|
+
let end = i;
|
|
574
|
+
while (!importStatementComplete(statement) && end + 1 < lines.length && end - i < MAX_IMPORT_LINES) {
|
|
575
|
+
end++;
|
|
576
|
+
statement += ' ' + lines[end].trim();
|
|
577
|
+
}
|
|
578
|
+
if (!importStatementComplete(statement)) {
|
|
579
|
+
processedLines.push(lines[i]);
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
433
582
|
removedCount++;
|
|
434
|
-
const spec = extractModuleSpecifier(
|
|
583
|
+
const spec = extractModuleSpecifier(statement);
|
|
435
584
|
if (spec && !specifiers.includes(spec))
|
|
436
585
|
specifiers.push(spec);
|
|
437
|
-
|
|
438
|
-
}
|
|
586
|
+
i = end;
|
|
587
|
+
}
|
|
439
588
|
if (removedCount > 0) {
|
|
440
589
|
// Cap the list: a barrel file with 60 imports would otherwise cost more than it saves.
|
|
441
590
|
const MAX_LISTED = 25;
|
|
442
591
|
const listed = specifiers.slice(0, MAX_LISTED).join(', ');
|
|
443
592
|
const extra = specifiers.length > MAX_LISTED ? `, +${specifiers.length - MAX_LISTED} more` : '';
|
|
444
593
|
const detail = specifiers.length > 0 ? `: ${listed}${extra}` : '';
|
|
445
|
-
|
|
594
|
+
// Keep a shebang first: a header above it turns `#!/usr/bin/env node` into a syntax error.
|
|
595
|
+
const at = processedLines.length > 0 && processedLines[0].startsWith('#!') ? 1 : 0;
|
|
596
|
+
processedLines.splice(at, 0, `// [Lemma Squeezer: Squeezed ${removedCount} import/dependency lines${detail}]`);
|
|
446
597
|
}
|
|
447
598
|
return processedLines.join('\n');
|
|
448
599
|
}
|