@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.
Files changed (362) hide show
  1. package/README.md +55 -0
  2. package/dist/cjs/api/server.js +1 -1
  3. package/dist/cjs/api/server.js.map +1 -1
  4. package/dist/cjs/autopilot/AutopilotWatcher.js +2 -2
  5. package/dist/cjs/autopilot/AutopilotWatcher.js.map +1 -1
  6. package/dist/cjs/autopilot/Notifier.d.ts.map +1 -1
  7. package/dist/cjs/autopilot/Notifier.js +0 -1
  8. package/dist/cjs/autopilot/Notifier.js.map +1 -1
  9. package/dist/cjs/cli/lemma-proxy.d.ts.map +1 -1
  10. package/dist/cjs/cli/lemma-proxy.js +18 -18
  11. package/dist/cjs/cli/lemma-proxy.js.map +1 -1
  12. package/dist/cjs/cli/stack.d.ts.map +1 -1
  13. package/dist/cjs/cli/stack.js.map +1 -1
  14. package/dist/cjs/cloud/TenantCache.d.ts.map +1 -1
  15. package/dist/cjs/cloud/TenantCache.js +0 -1
  16. package/dist/cjs/cloud/TenantCache.js.map +1 -1
  17. package/dist/cjs/cloud/scrub/StatelessScrubber.d.ts.map +1 -1
  18. package/dist/cjs/cloud/scrub/StatelessScrubber.js +2 -1
  19. package/dist/cjs/cloud/scrub/StatelessScrubber.js.map +1 -1
  20. package/dist/cjs/cloud/server.js +4 -4
  21. package/dist/cjs/cloud/server.js.map +1 -1
  22. package/dist/cjs/cloud/store/FileBrainStore.d.ts.map +1 -1
  23. package/dist/cjs/cloud/store/FileBrainStore.js.map +1 -1
  24. package/dist/cjs/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  25. package/dist/cjs/cloud/store/PostgresBrainStore.js +1 -1
  26. package/dist/cjs/cloud/store/PostgresBrainStore.js.map +1 -1
  27. package/dist/cjs/consensus/ConsensusEngine.d.ts.map +1 -1
  28. package/dist/cjs/consensus/ConsensusEngine.js +0 -1
  29. package/dist/cjs/consensus/ConsensusEngine.js.map +1 -1
  30. package/dist/cjs/core/GhostListener.d.ts.map +1 -1
  31. package/dist/cjs/core/GhostListener.js.map +1 -1
  32. package/dist/cjs/core/OrchestrationEngine.d.ts.map +1 -1
  33. package/dist/cjs/core/OrchestrationEngine.js +1 -1
  34. package/dist/cjs/core/OrchestrationEngine.js.map +1 -1
  35. package/dist/cjs/core/SubconsciousEngine.d.ts.map +1 -1
  36. package/dist/cjs/core/SubconsciousEngine.js.map +1 -1
  37. package/dist/cjs/core/router.d.ts.map +1 -1
  38. package/dist/cjs/core/router.js +2 -2
  39. package/dist/cjs/core/router.js.map +1 -1
  40. package/dist/cjs/embed/index.d.ts.map +1 -1
  41. package/dist/cjs/embed/index.js +0 -1
  42. package/dist/cjs/embed/index.js.map +1 -1
  43. package/dist/cjs/index.d.ts.map +1 -1
  44. package/dist/cjs/index.js +1 -1
  45. package/dist/cjs/index.js.map +1 -1
  46. package/dist/cjs/infra/analyzers/DriftDetector.js +1 -1
  47. package/dist/cjs/infra/analyzers/DriftDetector.js.map +1 -1
  48. package/dist/cjs/infra/config.d.ts.map +1 -1
  49. package/dist/cjs/infra/mcp-tools.d.ts.map +1 -1
  50. package/dist/cjs/infra/mcp-tools.js +29 -5
  51. package/dist/cjs/infra/mcp-tools.js.map +1 -1
  52. package/dist/cjs/infra/providers/InfraProvider.d.ts.map +1 -1
  53. package/dist/cjs/infra/providers/JenkinsProvider.js +1 -1
  54. package/dist/cjs/infra/templates/jenkins/index.d.ts.map +1 -1
  55. package/dist/cjs/infra/templates/jenkins/index.js +8 -4
  56. package/dist/cjs/infra/templates/jenkins/index.js.map +1 -1
  57. package/dist/cjs/mcp/index.js +1 -1
  58. package/dist/cjs/mcp/index.js.map +1 -1
  59. package/dist/cjs/mcp/tools/codenav.d.ts.map +1 -1
  60. package/dist/cjs/mcp/tools/codenav.js +145 -48
  61. package/dist/cjs/mcp/tools/codenav.js.map +1 -1
  62. package/dist/cjs/mcp/tools/context-tools.d.ts.map +1 -1
  63. package/dist/cjs/mcp/tools/context-tools.js +1 -1
  64. package/dist/cjs/mcp/tools/context-tools.js.map +1 -1
  65. package/dist/cjs/mcp/tools/devtools.d.ts.map +1 -1
  66. package/dist/cjs/mcp/tools/devtools.js +124 -33
  67. package/dist/cjs/mcp/tools/devtools.js.map +1 -1
  68. package/dist/cjs/mcp/tools/memory.d.ts.map +1 -1
  69. package/dist/cjs/mcp/tools/memory.js +8 -0
  70. package/dist/cjs/mcp/tools/memory.js.map +1 -1
  71. package/dist/cjs/mcp/tools/misc.d.ts.map +1 -1
  72. package/dist/cjs/mcp/tools/misc.js +16 -1
  73. package/dist/cjs/mcp/tools/misc.js.map +1 -1
  74. package/dist/cjs/mcp/tools/refactor.d.ts.map +1 -1
  75. package/dist/cjs/mcp/tools/refactor.js +234 -107
  76. package/dist/cjs/mcp/tools/refactor.js.map +1 -1
  77. package/dist/cjs/mcp/tools/review.d.ts.map +1 -1
  78. package/dist/cjs/mcp/tools/review.js +12 -11
  79. package/dist/cjs/mcp/tools/review.js.map +1 -1
  80. package/dist/cjs/mcp/tools/workspace.d.ts.map +1 -1
  81. package/dist/cjs/mcp/tools/workspace.js +78 -16
  82. package/dist/cjs/mcp/tools/workspace.js.map +1 -1
  83. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  84. package/dist/cjs/mcp/tools.js.map +1 -1
  85. package/dist/cjs/mcp/utils.d.ts +1 -1
  86. package/dist/cjs/mcp/utils.d.ts.map +1 -1
  87. package/dist/cjs/mcp/utils.js +242 -36
  88. package/dist/cjs/mcp/utils.js.map +1 -1
  89. package/dist/cjs/mcp/workspaceShared.d.ts +2 -0
  90. package/dist/cjs/mcp/workspaceShared.d.ts.map +1 -1
  91. package/dist/cjs/mcp/workspaceShared.js +10 -3
  92. package/dist/cjs/mcp/workspaceShared.js.map +1 -1
  93. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts +1 -1
  94. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -1
  95. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js +5 -5
  96. package/dist/cjs/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -1
  97. package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts +1 -1
  98. package/dist/cjs/pr-review/adapters/GitHubAdapter.d.ts.map +1 -1
  99. package/dist/cjs/pr-review/adapters/GitHubAdapter.js +1 -1
  100. package/dist/cjs/pr-review/adapters/GitHubAdapter.js.map +1 -1
  101. package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts +1 -1
  102. package/dist/cjs/pr-review/adapters/GitLabAdapter.d.ts.map +1 -1
  103. package/dist/cjs/pr-review/adapters/GitLabAdapter.js +1 -2
  104. package/dist/cjs/pr-review/adapters/GitLabAdapter.js.map +1 -1
  105. package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts +1 -1
  106. package/dist/cjs/pr-review/analyzers/RegressionDetector.d.ts.map +1 -1
  107. package/dist/cjs/pr-review/analyzers/RegressionDetector.js +1 -2
  108. package/dist/cjs/pr-review/analyzers/RegressionDetector.js.map +1 -1
  109. package/dist/cjs/pr-review/analyzers/SecurityScanner.js +2 -2
  110. package/dist/cjs/pr-review/analyzers/SecurityScanner.js.map +1 -1
  111. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -1
  112. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js +0 -6
  113. package/dist/cjs/pr-review/analyzers/StaticAnalyzer.js.map +1 -1
  114. package/dist/cjs/protocol/flows.d.ts +4 -1
  115. package/dist/cjs/protocol/flows.d.ts.map +1 -1
  116. package/dist/cjs/protocol/flows.js +13 -8
  117. package/dist/cjs/protocol/flows.js.map +1 -1
  118. package/dist/cjs/protocol/validators.d.ts.map +1 -1
  119. package/dist/cjs/protocol/validators.js.map +1 -1
  120. package/dist/cjs/proxy/AgentMultiplexer.d.ts +1 -1
  121. package/dist/cjs/proxy/AgentMultiplexer.d.ts.map +1 -1
  122. package/dist/cjs/proxy/AgentMultiplexer.js +1 -1
  123. package/dist/cjs/proxy/AgentMultiplexer.js.map +1 -1
  124. package/dist/cjs/proxy/Gatekeeper.js +0 -1
  125. package/dist/cjs/proxy/Gatekeeper.js.map +1 -1
  126. package/dist/cjs/security/MessageSanitizer.d.ts.map +1 -1
  127. package/dist/cjs/security/MessageSanitizer.js +2 -1
  128. package/dist/cjs/security/MessageSanitizer.js.map +1 -1
  129. package/dist/cjs/security/SecurityMiddleware.d.ts.map +1 -1
  130. package/dist/cjs/security/SecurityMiddleware.js.map +1 -1
  131. package/dist/cjs/security/SemanticScrubber.d.ts.map +1 -1
  132. package/dist/cjs/security/SemanticScrubber.js +54 -1
  133. package/dist/cjs/security/SemanticScrubber.js.map +1 -1
  134. package/dist/cjs/speculative/SpeculativeEngine.d.ts.map +1 -1
  135. package/dist/cjs/speculative/SpeculativeEngine.js.map +1 -1
  136. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  137. package/dist/cjs/subconscious/TheBrainV2.js +1 -13
  138. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  139. package/dist/cjs/utils/AutoContextBundle.d.ts.map +1 -1
  140. package/dist/cjs/utils/AutoContextBundle.js.map +1 -1
  141. package/dist/cjs/utils/ClipboardWatcher.js +1 -1
  142. package/dist/cjs/utils/ClipboardWatcher.js.map +1 -1
  143. package/dist/cjs/utils/CommandEnv.d.ts +26 -0
  144. package/dist/cjs/utils/CommandEnv.d.ts.map +1 -0
  145. package/dist/cjs/utils/CommandEnv.js +91 -0
  146. package/dist/cjs/utils/CommandEnv.js.map +1 -0
  147. package/dist/cjs/utils/CommandSandbox.d.ts +42 -0
  148. package/dist/cjs/utils/CommandSandbox.d.ts.map +1 -0
  149. package/dist/cjs/utils/CommandSandbox.js +135 -0
  150. package/dist/cjs/utils/CommandSandbox.js.map +1 -0
  151. package/dist/cjs/utils/ContextSqueezer.d.ts +7 -1
  152. package/dist/cjs/utils/ContextSqueezer.d.ts.map +1 -1
  153. package/dist/cjs/utils/ContextSqueezer.js +187 -36
  154. package/dist/cjs/utils/ContextSqueezer.js.map +1 -1
  155. package/dist/cjs/utils/DepGraph.d.ts.map +1 -1
  156. package/dist/cjs/utils/DepGraph.js +52 -21
  157. package/dist/cjs/utils/DepGraph.js.map +1 -1
  158. package/dist/cjs/utils/Eol.d.ts +10 -0
  159. package/dist/cjs/utils/Eol.d.ts.map +1 -0
  160. package/dist/cjs/utils/Eol.js +20 -0
  161. package/dist/cjs/utils/Eol.js.map +1 -0
  162. package/dist/cjs/utils/ImportTreeContext.d.ts.map +1 -1
  163. package/dist/cjs/utils/ImportTreeContext.js +18 -4
  164. package/dist/cjs/utils/ImportTreeContext.js.map +1 -1
  165. package/dist/cjs/utils/PatchMatcher.d.ts +1 -1
  166. package/dist/cjs/utils/PatchMatcher.d.ts.map +1 -1
  167. package/dist/cjs/utils/PatchMatcher.js +47 -1
  168. package/dist/cjs/utils/PatchMatcher.js.map +1 -1
  169. package/dist/cjs/utils/SurgicalASTInsert.d.ts.map +1 -1
  170. package/dist/cjs/utils/SurgicalASTInsert.js +3 -1
  171. package/dist/cjs/utils/SurgicalASTInsert.js.map +1 -1
  172. package/dist/cjs/utils/SymbolSurgicalContext.js +3 -3
  173. package/dist/cjs/utils/SymbolSurgicalContext.js.map +1 -1
  174. package/dist/cjs/utils/TokenBudgetedReader.d.ts.map +1 -1
  175. package/dist/cjs/utils/TokenBudgetedReader.js +51 -37
  176. package/dist/cjs/utils/TokenBudgetedReader.js.map +1 -1
  177. package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -1
  178. package/dist/cjs/utils/WorkspaceSearch.js +1 -0
  179. package/dist/cjs/utils/WorkspaceSearch.js.map +1 -1
  180. package/dist/cjs/utils/WormholeCompressor.js +3 -3
  181. package/dist/cjs/utils/WormholeCompressor.js.map +1 -1
  182. package/dist/esm/api/server.js +1 -1
  183. package/dist/esm/api/server.js.map +1 -1
  184. package/dist/esm/autopilot/AutopilotWatcher.js +2 -2
  185. package/dist/esm/autopilot/AutopilotWatcher.js.map +1 -1
  186. package/dist/esm/autopilot/Notifier.d.ts.map +1 -1
  187. package/dist/esm/autopilot/Notifier.js +0 -1
  188. package/dist/esm/autopilot/Notifier.js.map +1 -1
  189. package/dist/esm/cli/lemma-proxy.d.ts.map +1 -1
  190. package/dist/esm/cli/lemma-proxy.js +18 -18
  191. package/dist/esm/cli/lemma-proxy.js.map +1 -1
  192. package/dist/esm/cli/stack.d.ts.map +1 -1
  193. package/dist/esm/cli/stack.js.map +1 -1
  194. package/dist/esm/cloud/TenantCache.d.ts.map +1 -1
  195. package/dist/esm/cloud/TenantCache.js +0 -1
  196. package/dist/esm/cloud/TenantCache.js.map +1 -1
  197. package/dist/esm/cloud/scrub/StatelessScrubber.d.ts.map +1 -1
  198. package/dist/esm/cloud/scrub/StatelessScrubber.js +2 -1
  199. package/dist/esm/cloud/scrub/StatelessScrubber.js.map +1 -1
  200. package/dist/esm/cloud/server.js +4 -4
  201. package/dist/esm/cloud/server.js.map +1 -1
  202. package/dist/esm/cloud/store/FileBrainStore.d.ts.map +1 -1
  203. package/dist/esm/cloud/store/FileBrainStore.js.map +1 -1
  204. package/dist/esm/cloud/store/PostgresBrainStore.d.ts.map +1 -1
  205. package/dist/esm/cloud/store/PostgresBrainStore.js +1 -1
  206. package/dist/esm/cloud/store/PostgresBrainStore.js.map +1 -1
  207. package/dist/esm/consensus/ConsensusEngine.d.ts.map +1 -1
  208. package/dist/esm/consensus/ConsensusEngine.js +0 -1
  209. package/dist/esm/consensus/ConsensusEngine.js.map +1 -1
  210. package/dist/esm/core/GhostListener.d.ts.map +1 -1
  211. package/dist/esm/core/GhostListener.js.map +1 -1
  212. package/dist/esm/core/OrchestrationEngine.d.ts.map +1 -1
  213. package/dist/esm/core/OrchestrationEngine.js +1 -1
  214. package/dist/esm/core/OrchestrationEngine.js.map +1 -1
  215. package/dist/esm/core/SubconsciousEngine.d.ts.map +1 -1
  216. package/dist/esm/core/SubconsciousEngine.js.map +1 -1
  217. package/dist/esm/core/router.d.ts.map +1 -1
  218. package/dist/esm/core/router.js +2 -2
  219. package/dist/esm/core/router.js.map +1 -1
  220. package/dist/esm/embed/index.d.ts.map +1 -1
  221. package/dist/esm/embed/index.js +0 -1
  222. package/dist/esm/embed/index.js.map +1 -1
  223. package/dist/esm/index.d.ts.map +1 -1
  224. package/dist/esm/index.js +1 -1
  225. package/dist/esm/index.js.map +1 -1
  226. package/dist/esm/infra/analyzers/DriftDetector.js +1 -1
  227. package/dist/esm/infra/analyzers/DriftDetector.js.map +1 -1
  228. package/dist/esm/infra/config.d.ts.map +1 -1
  229. package/dist/esm/infra/mcp-tools.d.ts.map +1 -1
  230. package/dist/esm/infra/mcp-tools.js +29 -5
  231. package/dist/esm/infra/mcp-tools.js.map +1 -1
  232. package/dist/esm/infra/providers/InfraProvider.d.ts.map +1 -1
  233. package/dist/esm/infra/providers/JenkinsProvider.js +1 -1
  234. package/dist/esm/infra/templates/jenkins/index.d.ts.map +1 -1
  235. package/dist/esm/infra/templates/jenkins/index.js +8 -4
  236. package/dist/esm/infra/templates/jenkins/index.js.map +1 -1
  237. package/dist/esm/mcp/index.js +1 -1
  238. package/dist/esm/mcp/index.js.map +1 -1
  239. package/dist/esm/mcp/tools/codenav.d.ts.map +1 -1
  240. package/dist/esm/mcp/tools/codenav.js +145 -48
  241. package/dist/esm/mcp/tools/codenav.js.map +1 -1
  242. package/dist/esm/mcp/tools/context-tools.d.ts.map +1 -1
  243. package/dist/esm/mcp/tools/context-tools.js +1 -1
  244. package/dist/esm/mcp/tools/context-tools.js.map +1 -1
  245. package/dist/esm/mcp/tools/devtools.d.ts.map +1 -1
  246. package/dist/esm/mcp/tools/devtools.js +124 -33
  247. package/dist/esm/mcp/tools/devtools.js.map +1 -1
  248. package/dist/esm/mcp/tools/memory.d.ts.map +1 -1
  249. package/dist/esm/mcp/tools/memory.js +8 -0
  250. package/dist/esm/mcp/tools/memory.js.map +1 -1
  251. package/dist/esm/mcp/tools/misc.d.ts.map +1 -1
  252. package/dist/esm/mcp/tools/misc.js +16 -1
  253. package/dist/esm/mcp/tools/misc.js.map +1 -1
  254. package/dist/esm/mcp/tools/refactor.d.ts.map +1 -1
  255. package/dist/esm/mcp/tools/refactor.js +234 -107
  256. package/dist/esm/mcp/tools/refactor.js.map +1 -1
  257. package/dist/esm/mcp/tools/review.d.ts.map +1 -1
  258. package/dist/esm/mcp/tools/review.js +12 -11
  259. package/dist/esm/mcp/tools/review.js.map +1 -1
  260. package/dist/esm/mcp/tools/workspace.d.ts.map +1 -1
  261. package/dist/esm/mcp/tools/workspace.js +78 -16
  262. package/dist/esm/mcp/tools/workspace.js.map +1 -1
  263. package/dist/esm/mcp/tools.d.ts.map +1 -1
  264. package/dist/esm/mcp/tools.js.map +1 -1
  265. package/dist/esm/mcp/utils.d.ts +1 -1
  266. package/dist/esm/mcp/utils.d.ts.map +1 -1
  267. package/dist/esm/mcp/utils.js +242 -36
  268. package/dist/esm/mcp/utils.js.map +1 -1
  269. package/dist/esm/mcp/workspaceShared.d.ts +2 -0
  270. package/dist/esm/mcp/workspaceShared.d.ts.map +1 -1
  271. package/dist/esm/mcp/workspaceShared.js +9 -3
  272. package/dist/esm/mcp/workspaceShared.js.map +1 -1
  273. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts +1 -1
  274. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.d.ts.map +1 -1
  275. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js +5 -5
  276. package/dist/esm/pr-review/adapters/AzureDevOpsAdapter.js.map +1 -1
  277. package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts +1 -1
  278. package/dist/esm/pr-review/adapters/GitHubAdapter.d.ts.map +1 -1
  279. package/dist/esm/pr-review/adapters/GitHubAdapter.js +1 -1
  280. package/dist/esm/pr-review/adapters/GitHubAdapter.js.map +1 -1
  281. package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts +1 -1
  282. package/dist/esm/pr-review/adapters/GitLabAdapter.d.ts.map +1 -1
  283. package/dist/esm/pr-review/adapters/GitLabAdapter.js +1 -2
  284. package/dist/esm/pr-review/adapters/GitLabAdapter.js.map +1 -1
  285. package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts +1 -1
  286. package/dist/esm/pr-review/analyzers/RegressionDetector.d.ts.map +1 -1
  287. package/dist/esm/pr-review/analyzers/RegressionDetector.js +1 -2
  288. package/dist/esm/pr-review/analyzers/RegressionDetector.js.map +1 -1
  289. package/dist/esm/pr-review/analyzers/SecurityScanner.js +2 -2
  290. package/dist/esm/pr-review/analyzers/SecurityScanner.js.map +1 -1
  291. package/dist/esm/pr-review/analyzers/StaticAnalyzer.d.ts.map +1 -1
  292. package/dist/esm/pr-review/analyzers/StaticAnalyzer.js +0 -6
  293. package/dist/esm/pr-review/analyzers/StaticAnalyzer.js.map +1 -1
  294. package/dist/esm/protocol/flows.d.ts +4 -1
  295. package/dist/esm/protocol/flows.d.ts.map +1 -1
  296. package/dist/esm/protocol/flows.js +13 -8
  297. package/dist/esm/protocol/flows.js.map +1 -1
  298. package/dist/esm/protocol/validators.d.ts.map +1 -1
  299. package/dist/esm/protocol/validators.js.map +1 -1
  300. package/dist/esm/proxy/AgentMultiplexer.d.ts +1 -1
  301. package/dist/esm/proxy/AgentMultiplexer.d.ts.map +1 -1
  302. package/dist/esm/proxy/AgentMultiplexer.js +1 -1
  303. package/dist/esm/proxy/AgentMultiplexer.js.map +1 -1
  304. package/dist/esm/proxy/Gatekeeper.js +0 -1
  305. package/dist/esm/proxy/Gatekeeper.js.map +1 -1
  306. package/dist/esm/security/MessageSanitizer.d.ts.map +1 -1
  307. package/dist/esm/security/MessageSanitizer.js +2 -1
  308. package/dist/esm/security/MessageSanitizer.js.map +1 -1
  309. package/dist/esm/security/SecurityMiddleware.d.ts.map +1 -1
  310. package/dist/esm/security/SecurityMiddleware.js.map +1 -1
  311. package/dist/esm/security/SemanticScrubber.d.ts.map +1 -1
  312. package/dist/esm/security/SemanticScrubber.js +54 -1
  313. package/dist/esm/security/SemanticScrubber.js.map +1 -1
  314. package/dist/esm/speculative/SpeculativeEngine.d.ts.map +1 -1
  315. package/dist/esm/speculative/SpeculativeEngine.js.map +1 -1
  316. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  317. package/dist/esm/subconscious/TheBrainV2.js +1 -13
  318. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  319. package/dist/esm/utils/AutoContextBundle.d.ts.map +1 -1
  320. package/dist/esm/utils/AutoContextBundle.js.map +1 -1
  321. package/dist/esm/utils/ClipboardWatcher.js +1 -1
  322. package/dist/esm/utils/ClipboardWatcher.js.map +1 -1
  323. package/dist/esm/utils/CommandEnv.d.ts +26 -0
  324. package/dist/esm/utils/CommandEnv.d.ts.map +1 -0
  325. package/dist/esm/utils/CommandEnv.js +84 -0
  326. package/dist/esm/utils/CommandEnv.js.map +1 -0
  327. package/dist/esm/utils/CommandSandbox.d.ts +42 -0
  328. package/dist/esm/utils/CommandSandbox.d.ts.map +1 -0
  329. package/dist/esm/utils/CommandSandbox.js +126 -0
  330. package/dist/esm/utils/CommandSandbox.js.map +1 -0
  331. package/dist/esm/utils/ContextSqueezer.d.ts +7 -1
  332. package/dist/esm/utils/ContextSqueezer.d.ts.map +1 -1
  333. package/dist/esm/utils/ContextSqueezer.js +187 -36
  334. package/dist/esm/utils/ContextSqueezer.js.map +1 -1
  335. package/dist/esm/utils/DepGraph.d.ts.map +1 -1
  336. package/dist/esm/utils/DepGraph.js +52 -21
  337. package/dist/esm/utils/DepGraph.js.map +1 -1
  338. package/dist/esm/utils/Eol.d.ts +10 -0
  339. package/dist/esm/utils/Eol.d.ts.map +1 -0
  340. package/dist/esm/utils/Eol.js +16 -0
  341. package/dist/esm/utils/Eol.js.map +1 -0
  342. package/dist/esm/utils/ImportTreeContext.d.ts.map +1 -1
  343. package/dist/esm/utils/ImportTreeContext.js +18 -4
  344. package/dist/esm/utils/ImportTreeContext.js.map +1 -1
  345. package/dist/esm/utils/PatchMatcher.d.ts +1 -1
  346. package/dist/esm/utils/PatchMatcher.d.ts.map +1 -1
  347. package/dist/esm/utils/PatchMatcher.js +47 -1
  348. package/dist/esm/utils/PatchMatcher.js.map +1 -1
  349. package/dist/esm/utils/SurgicalASTInsert.d.ts.map +1 -1
  350. package/dist/esm/utils/SurgicalASTInsert.js +3 -1
  351. package/dist/esm/utils/SurgicalASTInsert.js.map +1 -1
  352. package/dist/esm/utils/SymbolSurgicalContext.js +3 -3
  353. package/dist/esm/utils/SymbolSurgicalContext.js.map +1 -1
  354. package/dist/esm/utils/TokenBudgetedReader.d.ts.map +1 -1
  355. package/dist/esm/utils/TokenBudgetedReader.js +51 -37
  356. package/dist/esm/utils/TokenBudgetedReader.js.map +1 -1
  357. package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -1
  358. package/dist/esm/utils/WorkspaceSearch.js +1 -0
  359. package/dist/esm/utils/WorkspaceSearch.js.map +1 -1
  360. package/dist/esm/utils/WormholeCompressor.js +3 -3
  361. package/dist/esm/utils/WormholeCompressor.js.map +1 -1
  362. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["../../../src/utils/ClipboardWatcher.ts"],"names":[],"mappings":"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"}
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,91 @@
1
+ "use strict";
2
+ /**
3
+ * Environment handed to commands run by run_workspace_command.
4
+ *
5
+ * The child used to inherit the whole of process.env, so `env`, `printenv` or any script the
6
+ * command ran could read every token and API key the MCP host had in its environment (cloud
7
+ * credentials, GITHUB_TOKEN, the Lemma license key…). Output scrubbing masks the common shapes
8
+ * after the fact; this keeps the secrets from reaching the child at all.
9
+ *
10
+ * Deny-by-default: only variables a build/test toolchain needs to find itself, plus whatever the
11
+ * project lists in lemma.config.json under `mcp.commandEnv.allow`. `mcp.commandEnv.mode: "inherit"`
12
+ * restores the old behavior for projects that need it.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.loadCommandEnvPolicy = loadCommandEnvPolicy;
19
+ exports.buildCommandEnv = buildCommandEnv;
20
+ const fs_1 = __importDefault(require("fs"));
21
+ const path_1 = __importDefault(require("path"));
22
+ /** Names (compared case-insensitively on Windows, where env names are case-insensitive). */
23
+ const SAFE_EXACT = new Set([
24
+ // Locating tools and the shell
25
+ "PATH", "PATHEXT", "SHELL", "COMSPEC", "SYSTEMROOT", "SYSTEMDRIVE", "WINDIR", "OS",
26
+ "PROCESSOR_ARCHITECTURE", "NUMBER_OF_PROCESSORS",
27
+ // Where things live
28
+ "HOME", "USERPROFILE", "HOMEDRIVE", "HOMEPATH", "APPDATA", "LOCALAPPDATA",
29
+ "PROGRAMFILES", "PROGRAMFILES(X86)", "PROGRAMDATA", "COMMONPROGRAMFILES",
30
+ "TEMP", "TMP", "TMPDIR", "PWD",
31
+ // Identity and locale (no credentials)
32
+ "USER", "USERNAME", "LOGNAME", "HOSTNAME", "COMPUTERNAME", "LANG", "LANGUAGE", "TZ",
33
+ // Terminal behaviour
34
+ "TERM", "COLORTERM", "FORCE_COLOR", "NO_COLOR", "CI", "NODE_ENV",
35
+ // Toolchain locations: without them rustup, pyenv, nvm, volta, go, java… cannot find themselves
36
+ "JAVA_HOME", "GOPATH", "GOROOT", "CARGO_HOME", "RUSTUP_HOME", "PYENV_ROOT", "VOLTA_HOME",
37
+ "NVM_DIR", "NVM_BIN", "PNPM_HOME", "BUN_INSTALL", "DENO_DIR", "ASDF_DIR", "ASDF_DATA_DIR",
38
+ "GEM_HOME", "GEM_PATH", "VIRTUAL_ENV", "CONDA_PREFIX",
39
+ "XDG_CONFIG_HOME", "XDG_CACHE_HOME", "XDG_DATA_HOME",
40
+ // Certificate bundles (not secrets; without them installs fail behind corporate TLS). Proxy URLs
41
+ // can embed credentials, so HTTP_PROXY/HTTPS_PROXY are left for the project to allow explicitly.
42
+ "NODE_EXTRA_CA_CERTS", "SSL_CERT_FILE", "SSL_CERT_DIR", "NO_PROXY",
43
+ ]);
44
+ const SAFE_PREFIXES = ["LC_"];
45
+ const isWindows = () => process.platform === "win32";
46
+ const norm = (name) => (isWindows() ? name.toUpperCase() : name);
47
+ /** Reads `mcp.commandEnv` from lemma.config.json in `dir`; any problem falls back to the safe default. */
48
+ function loadCommandEnvPolicy(dir = process.cwd()) {
49
+ const policy = { mode: "filtered", allow: [] };
50
+ try {
51
+ const configPath = path_1.default.join(dir, "lemma.config.json");
52
+ if (!fs_1.default.existsSync(configPath))
53
+ return policy;
54
+ const raw = JSON.parse(fs_1.default.readFileSync(configPath, "utf8"))?.mcp?.commandEnv;
55
+ if (raw?.mode === "inherit")
56
+ policy.mode = "inherit";
57
+ if (Array.isArray(raw?.allow)) {
58
+ policy.allow = raw.allow.filter((n) => typeof n === "string" && n.trim().length > 0);
59
+ }
60
+ }
61
+ catch {
62
+ // Unreadable config: stay on the restrictive default rather than widening access.
63
+ }
64
+ return policy;
65
+ }
66
+ function buildCommandEnv(base = process.env, policy = loadCommandEnvPolicy()) {
67
+ const extra = new Set(policy.allow.map(norm));
68
+ let env;
69
+ let withheld = 0;
70
+ if (policy.mode === "inherit") {
71
+ env = { ...base };
72
+ }
73
+ else {
74
+ env = {};
75
+ for (const [name, value] of Object.entries(base)) {
76
+ const key = norm(name);
77
+ if (SAFE_EXACT.has(key) || extra.has(key) || SAFE_PREFIXES.some((p) => key.startsWith(p))) {
78
+ env[name] = value;
79
+ }
80
+ else {
81
+ withheld++;
82
+ }
83
+ }
84
+ }
85
+ // cmd.exe looks for a bare command name in the current directory before PATH, so a workspace
86
+ // `git.bat` would run in place of git with the allowlist's blessing. This switches that off.
87
+ if (isWindows())
88
+ env.NoDefaultCurrentDirectoryInExePath = "1";
89
+ return { env, withheld };
90
+ }
91
+ //# 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,135 @@
1
+ "use strict";
2
+ /**
3
+ * Opt-in container sandbox for run_workspace_command.
4
+ *
5
+ * The allowlist and path checks are guards, not isolation: `node -e`, `python -c` and `npm run`
6
+ * run arbitrary code with the user's permissions. With `mcp.sandbox.mode: "docker"` the validated
7
+ * command instead runs inside a throwaway container that sees only the workspace, has no network
8
+ * by default, none of the host's environment, no capabilities, and bounded memory, CPU and
9
+ * processes. Docker is the one isolation layer that behaves the same on macOS, Linux and Windows.
10
+ *
11
+ * Fail closed: if the sandbox is enabled but cannot start, the command does not run on the host.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DEFAULT_SANDBOX_IMAGE = void 0;
18
+ exports.loadSandboxPolicy = loadSandboxPolicy;
19
+ exports.containerEnvNames = containerEnvNames;
20
+ exports.buildDockerInvocation = buildDockerInvocation;
21
+ const fs_1 = __importDefault(require("fs"));
22
+ const path_1 = __importDefault(require("path"));
23
+ const crypto_1 = require("crypto");
24
+ exports.DEFAULT_SANDBOX_IMAGE = "node:22-bookworm";
25
+ const DEFAULTS = {
26
+ mode: "off",
27
+ image: exports.DEFAULT_SANDBOX_IMAGE,
28
+ network: "none",
29
+ memory: "2g",
30
+ cpus: "2",
31
+ pidsLimit: 512,
32
+ };
33
+ const IMAGE_RE = /^[A-Za-z0-9][A-Za-z0-9._/:@-]*$/;
34
+ const MEMORY_RE = /^[1-9]\d*[kmg]?$/i;
35
+ const CPUS_RE = /^(?:[1-9]\d*|0?\.\d+|\d+\.\d+)$/;
36
+ /** Env variables that still mean something inside the container (the rest are host paths). */
37
+ const CONTAINER_ENV_EXACT = new Set(["NODE_ENV", "CI", "LANG", "LANGUAGE", "TZ", "TERM", "COLORTERM", "FORCE_COLOR", "NO_COLOR"]);
38
+ /**
39
+ * Reads `mcp.sandbox` from lemma.config.json. A bad value throws instead of falling back: a typo in
40
+ * `network` or `image` must not silently widen what the sandbox allows or run on the host.
41
+ */
42
+ function loadSandboxPolicy(dir = process.cwd()) {
43
+ const policy = { ...DEFAULTS };
44
+ let raw;
45
+ try {
46
+ const configPath = path_1.default.join(dir, "lemma.config.json");
47
+ if (!fs_1.default.existsSync(configPath))
48
+ return policy;
49
+ raw = JSON.parse(fs_1.default.readFileSync(configPath, "utf8"))?.mcp?.sandbox;
50
+ }
51
+ catch {
52
+ return policy; // unreadable config: sandbox stays off, as if unconfigured
53
+ }
54
+ if (!raw || typeof raw !== "object")
55
+ return policy;
56
+ if (raw.mode !== undefined) {
57
+ if (raw.mode !== "off" && raw.mode !== "docker")
58
+ throw new Error(`mcp.sandbox.mode must be "off" or "docker", got ${JSON.stringify(raw.mode)}`);
59
+ policy.mode = raw.mode;
60
+ }
61
+ if (raw.image !== undefined) {
62
+ if (typeof raw.image !== "string" || !IMAGE_RE.test(raw.image))
63
+ throw new Error(`mcp.sandbox.image is not a valid image reference: ${JSON.stringify(raw.image)}`);
64
+ policy.image = raw.image;
65
+ }
66
+ if (raw.network !== undefined) {
67
+ if (raw.network !== "none" && raw.network !== "bridge")
68
+ throw new Error(`mcp.sandbox.network must be "none" or "bridge", got ${JSON.stringify(raw.network)}`);
69
+ policy.network = raw.network;
70
+ }
71
+ if (raw.memory !== undefined) {
72
+ if (typeof raw.memory !== "string" || !MEMORY_RE.test(raw.memory))
73
+ throw new Error(`mcp.sandbox.memory must look like "512m" or "2g", got ${JSON.stringify(raw.memory)}`);
74
+ policy.memory = raw.memory;
75
+ }
76
+ if (raw.cpus !== undefined) {
77
+ const cpus = String(raw.cpus);
78
+ if (!CPUS_RE.test(cpus))
79
+ throw new Error(`mcp.sandbox.cpus must be a positive number, got ${JSON.stringify(raw.cpus)}`);
80
+ policy.cpus = cpus;
81
+ }
82
+ if (raw.pidsLimit !== undefined) {
83
+ if (typeof raw.pidsLimit !== "number" || !Number.isInteger(raw.pidsLimit) || raw.pidsLimit < 16)
84
+ throw new Error(`mcp.sandbox.pidsLimit must be an integer >= 16, got ${JSON.stringify(raw.pidsLimit)}`);
85
+ policy.pidsLimit = raw.pidsLimit;
86
+ }
87
+ return policy;
88
+ }
89
+ /**
90
+ * Names (never values) of the host variables to forward: the harmless ones from the filtered env,
91
+ * plus whatever the project allowed explicitly. Values travel through the docker CLI's own
92
+ * environment (`-e NAME`), so they do not show up in `ps` output.
93
+ */
94
+ function containerEnvNames(filteredEnv, extraAllow = []) {
95
+ const extra = new Set(extraAllow);
96
+ return Object.keys(filteredEnv).filter((name) => filteredEnv[name] !== undefined &&
97
+ /^[A-Za-z_][A-Za-z0-9_]*$/.test(name) &&
98
+ (CONTAINER_ENV_EXACT.has(name) || name.startsWith("LC_") || extra.has(name)));
99
+ }
100
+ function buildDockerInvocation(command, workspaceRoot, policy, filteredEnv, extraEnvAllow = []) {
101
+ // --mount takes comma-separated key=value pairs, so these two characters would let a path inject options.
102
+ if (/[",\n\r]/.test(workspaceRoot)) {
103
+ throw new Error(`The workspace path contains a comma, quote or newline, which the Docker sandbox cannot mount safely: ${workspaceRoot}`);
104
+ }
105
+ const name = `lemma-sbx-${(0, crypto_1.randomBytes)(6).toString("hex")}`;
106
+ const args = [
107
+ "run", "--rm",
108
+ "--name", name,
109
+ "--network", policy.network,
110
+ "--cap-drop", "ALL",
111
+ "--security-opt", "no-new-privileges",
112
+ "--pids-limit", String(policy.pidsLimit),
113
+ "--memory", policy.memory,
114
+ "--cpus", policy.cpus,
115
+ // Only the workspace is writable; everything else in the image is read-only.
116
+ "--read-only",
117
+ "--tmpfs", "/tmp:rw,exec,size=512m",
118
+ "--mount", `type=bind,source=${workspaceRoot},target=/workspace`,
119
+ "--workdir", "/workspace",
120
+ "-e", "HOME=/tmp",
121
+ // An image's own ENTRYPOINT (redis, postgres…) would swallow `sh -c …` as its arguments.
122
+ "--entrypoint", "sh",
123
+ ];
124
+ // Files created in the bind mount should belong to the user, not to root. Docker Desktop on
125
+ // Windows has no uid to map, so the flag is skipped there.
126
+ if (typeof process.getuid === "function" && typeof process.getgid === "function") {
127
+ args.push("--user", `${process.getuid()}:${process.getgid()}`);
128
+ }
129
+ for (const envName of containerEnvNames(filteredEnv, extraEnvAllow))
130
+ args.push("-e", envName);
131
+ // The command is one argv entry for `sh -c`; it is never concatenated into a host shell line.
132
+ args.push(policy.image, "-c", command);
133
+ return { file: "docker", args, name, image: policy.image };
134
+ }
135
+ //# 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;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgClD;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;AAwCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAsBjD;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"}
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"}
@@ -22,37 +22,150 @@ exports.generateAstDiff = generateAstDiff;
22
22
  exports.filterHighDensityRAG = filterHighDensityRAG;
23
23
  exports.collapseRepetitiveLogs = collapseRepetitiveLogs;
24
24
  /**
25
- * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code
25
+ * Remove single-line and multi-line comments from JavaScript/TypeScript/JSON/CSS code.
26
+ *
27
+ * A scanner, not a pair of regexes: `//` and `/*` inside a string, a template literal or a regex
28
+ * literal are not comments. The previous implementation cut every line at its first `//`, so
29
+ * `` `file://${path}` `` lost the rest of its line, and its `/* … *\/` regex deleted the `/**\/` in
30
+ * a glob such as `src/**\/*.ts` (leaving `src*.ts`). Anything the scanner is unsure about is kept:
31
+ * a stray comment costs a few tokens, a wrongly deleted line misleads the reader.
26
32
  */
27
33
  function stripComments(code) {
28
- // 1. Remove multi-line comments /* ... */
29
- let clean = code.replace(/\/\*[\s\S]*?\*\//g, '');
30
- // 2. Remove single-line comments // ...
31
- // Be careful not to strip URL protocols like http:// or https://
32
- const lines = clean.split('\n');
33
- const processedLines = lines.map(line => {
34
- // If the line contains a URL, do not strip comments or do it carefully
35
- if (line.includes('http://') || line.includes('https://')) {
36
- // Find comment symbol not preceded by : or within a string (simple heuristic)
37
- const urlIndex = line.indexOf('://');
38
- const commentIndex = line.indexOf('//');
39
- if (commentIndex !== -1 && commentIndex < urlIndex) {
40
- return line.substring(0, commentIndex);
34
+ const n = code.length;
35
+ let out = '';
36
+ let i = 0;
37
+ // Copies a '…' or "…" string starting at i; an unterminated one ends at the newline.
38
+ const copyQuoted = (quote) => {
39
+ out += code[i++];
40
+ while (i < n) {
41
+ const ch = code[i];
42
+ if (ch === '\\' && i + 1 < n) {
43
+ out += ch + code[i + 1];
44
+ i += 2;
45
+ continue;
46
+ }
47
+ if (ch === '\n')
48
+ return;
49
+ out += ch;
50
+ i++;
51
+ if (ch === quote)
52
+ return;
53
+ }
54
+ };
55
+ // Copies a `…` template literal, including nested ${ … } expressions that hold strings,
56
+ // templates or braces of their own.
57
+ const copyTemplate = () => {
58
+ out += code[i++];
59
+ while (i < n) {
60
+ const ch = code[i];
61
+ if (ch === '\\' && i + 1 < n) {
62
+ out += ch + code[i + 1];
63
+ i += 2;
64
+ continue;
65
+ }
66
+ if (ch === '`') {
67
+ out += ch;
68
+ i++;
69
+ return;
70
+ }
71
+ if (ch === '$' && code[i + 1] === '{') {
72
+ out += '${';
73
+ i += 2;
74
+ let depth = 1;
75
+ while (i < n && depth > 0) {
76
+ const e = code[i];
77
+ if (e === '`') {
78
+ copyTemplate();
79
+ continue;
80
+ }
81
+ if (e === '"' || e === "'") {
82
+ copyQuoted(e);
83
+ continue;
84
+ }
85
+ if (e === '{')
86
+ depth++;
87
+ else if (e === '}')
88
+ depth--;
89
+ out += e;
90
+ i++;
91
+ }
92
+ continue;
41
93
  }
42
- // If comment is after the URL
43
- const postUrlComment = line.indexOf('//', urlIndex + 3);
44
- if (postUrlComment !== -1) {
45
- return line.substring(0, postUrlComment);
94
+ out += ch;
95
+ i++;
96
+ }
97
+ };
98
+ // True when a '/' at this point opens a regex literal rather than meaning division.
99
+ const startsRegex = () => {
100
+ const before = out.replace(/\s+$/, '');
101
+ if (before.length === 0)
102
+ return true;
103
+ if ('(,=:[!&|?{};+-*%<>~^'.includes(before[before.length - 1]))
104
+ return true;
105
+ return /(?:^|[^\w$.])(?:return|typeof|case|in|of|yield|await|void|delete|throw|else|do)$/.test(before);
106
+ };
107
+ // Copies a regex literal starting at i; returns false (copying nothing) if it does not close
108
+ // on its own line, in which case the '/' was not a regex after all.
109
+ const copyRegex = () => {
110
+ let j = i + 1;
111
+ let inClass = false;
112
+ while (j < n) {
113
+ const ch = code[j];
114
+ if (ch === '\n')
115
+ return false;
116
+ if (ch === '\\') {
117
+ j += 2;
118
+ continue;
46
119
  }
47
- return line;
120
+ if (ch === '[')
121
+ inClass = true;
122
+ else if (ch === ']')
123
+ inClass = false;
124
+ else if (ch === '/' && !inClass) {
125
+ j++;
126
+ while (j < n && /[a-z]/i.test(code[j]))
127
+ j++;
128
+ out += code.slice(i, j);
129
+ i = j;
130
+ return true;
131
+ }
132
+ j++;
48
133
  }
49
- const commentIndex = line.indexOf('//');
50
- if (commentIndex !== -1) {
51
- return line.substring(0, commentIndex);
134
+ return false;
135
+ };
136
+ while (i < n) {
137
+ const c = code[i];
138
+ const d = code[i + 1];
139
+ if (c === '"' || c === "'") {
140
+ copyQuoted(c);
141
+ continue;
52
142
  }
53
- return line;
54
- });
55
- return processedLines.join('\n');
143
+ if (c === '`') {
144
+ copyTemplate();
145
+ continue;
146
+ }
147
+ if (c === '/' && d === '*') {
148
+ const end = code.indexOf('*/', i + 2);
149
+ i = end === -1 ? n : end + 2; // block comment: removed entirely, newlines included
150
+ continue;
151
+ }
152
+ if (c === '/' && d === '/') {
153
+ // `scheme://` is a URL, not a comment (http, https, file, ws, s3, …).
154
+ if (code[i - 1] === ':' && /[a-z][a-z0-9+.-]*:$/i.test(out.slice(-24))) {
155
+ out += '//';
156
+ i += 2;
157
+ continue;
158
+ }
159
+ while (i < n && code[i] !== '\n')
160
+ i++; // line comment: removed up to, not including, the newline
161
+ continue;
162
+ }
163
+ if (c === '/' && startsRegex() && copyRegex())
164
+ continue;
165
+ out += c;
166
+ i++;
167
+ }
168
+ return out;
56
169
  }
57
170
  /**
58
171
  * Compress code structure by removing redundant whitespace and blank lines
@@ -169,7 +282,7 @@ function detectFilePath(code) {
169
282
  // // src/proxy/KeyManager.ts
170
283
  // # src/proxy/KeyManager.py
171
284
  // /* src/proxy/KeyManager.ts */
172
- const match = firstLine.match(/^(?:\/\/#?|#|\/\*)\s*([a-zA-Z0-9_\-\.\/\\:]{3,120})(?:\s*\*\/)?$/);
285
+ const match = firstLine.match(/^(?:\/\/#?|#|\/\*)\s*([a-zA-Z0-9_\-./\\:]{3,120})(?:\s*\*\/)?$/);
173
286
  if (match && match[1]) {
174
287
  return match[1];
175
288
  }
@@ -418,13 +531,31 @@ function extractModuleSpecifier(trimmed) {
418
531
  return pyImport[1].split(',')[0].trim();
419
532
  return null;
420
533
  }
534
+ /** True once `s` (an import/require statement collected so far, on one line) is a whole statement. */
535
+ function importStatementComplete(s) {
536
+ if (s.startsWith('from ')) {
537
+ // Python: `from a import (` … `)` is complete when the parentheses balance.
538
+ return (s.match(/\(/g) || []).length <= (s.match(/\)/g) || []).length;
539
+ }
540
+ if (s.startsWith('@import'))
541
+ return s.includes(';') || /['")]\s*$/.test(s);
542
+ if (/^(?:const|let|var)\s/.test(s))
543
+ return /require\s*\([^)]*\)/.test(s);
544
+ // Python: `import os`, `import a.b as c, d`.
545
+ if (!/\bfrom\b/.test(s) && /^import\s+[\w.]+(?:\s+as\s+\w+)?(?:\s*,\s*[\w.]+(?:\s+as\s+\w+)?)*\s*;?$/.test(s))
546
+ return true;
547
+ // JS/TS: ends with a quoted module specifier.
548
+ return /['"]\s*;?\s*$/.test(s) && (/\bfrom\s*['"]/.test(s) || /^import\s*['"]/.test(s) || /=\s*require\(/.test(s));
549
+ }
421
550
  function isImportLine(trimmed) {
422
551
  // JS/TS standard imports: import ... from ... or import '...'
423
552
  if (trimmed.startsWith('import ') || trimmed.startsWith('import{') || trimmed.startsWith('import*'))
424
553
  return true;
425
554
  // CommonJS require statement: const ... = require(...)
426
- if (trimmed.includes('require(') &&
427
- (trimmed.startsWith('const ') || trimmed.startsWith('let ') || trimmed.startsWith('var '))) {
555
+ // Only a statement that is exactly `const x = require('mod')` (optionally `.prop`). Matching any
556
+ // line that merely contains require( removed `const c = require("x") as {` (leaving its type
557
+ // body behind) and `const s = require("fs").readFileSync(` (leaving its arguments behind).
558
+ if (/^(?:const|let|var)\s+(?:[\w$]+|\{[^}]*\})\s*=\s*require\(\s*['"][^'"]+['"]\s*\)(?:\.[\w$]+)?\s*;?$/.test(trimmed)) {
428
559
  return true;
429
560
  }
430
561
  // Python: from ... import ...
@@ -442,23 +573,43 @@ function stripImports(code) {
442
573
  const lines = code.split('\n');
443
574
  let removedCount = 0;
444
575
  const specifiers = [];
445
- const processedLines = lines.filter(line => {
446
- const trimmed = line.trim();
447
- if (!isImportLine(trimmed))
448
- return true;
576
+ // A statement can span lines (`import {\n a,\n b\n} from 'x'`). Removing only its first line left
577
+ // the rest (`a,` / `b` / `} from 'x';`) behind as orphan lines and hid the module from the list.
578
+ // Consume to the end of the statement; if it does not close within a few lines it is not one we
579
+ // understand, so keep the line rather than risk deleting real code.
580
+ const MAX_IMPORT_LINES = 40;
581
+ const processedLines = [];
582
+ for (let i = 0; i < lines.length; i++) {
583
+ const trimmed = lines[i].trim();
584
+ if (!isImportLine(trimmed)) {
585
+ processedLines.push(lines[i]);
586
+ continue;
587
+ }
588
+ let statement = trimmed;
589
+ let end = i;
590
+ while (!importStatementComplete(statement) && end + 1 < lines.length && end - i < MAX_IMPORT_LINES) {
591
+ end++;
592
+ statement += ' ' + lines[end].trim();
593
+ }
594
+ if (!importStatementComplete(statement)) {
595
+ processedLines.push(lines[i]);
596
+ continue;
597
+ }
449
598
  removedCount++;
450
- const spec = extractModuleSpecifier(trimmed);
599
+ const spec = extractModuleSpecifier(statement);
451
600
  if (spec && !specifiers.includes(spec))
452
601
  specifiers.push(spec);
453
- return false;
454
- });
602
+ i = end;
603
+ }
455
604
  if (removedCount > 0) {
456
605
  // Cap the list: a barrel file with 60 imports would otherwise cost more than it saves.
457
606
  const MAX_LISTED = 25;
458
607
  const listed = specifiers.slice(0, MAX_LISTED).join(', ');
459
608
  const extra = specifiers.length > MAX_LISTED ? `, +${specifiers.length - MAX_LISTED} more` : '';
460
609
  const detail = specifiers.length > 0 ? `: ${listed}${extra}` : '';
461
- processedLines.unshift(`// [Lemma Squeezer: Squeezed ${removedCount} import/dependency lines${detail}]`);
610
+ // Keep a shebang first: a header above it turns `#!/usr/bin/env node` into a syntax error.
611
+ const at = processedLines.length > 0 && processedLines[0].startsWith('#!') ? 1 : 0;
612
+ processedLines.splice(at, 0, `// [Lemma Squeezer: Squeezed ${removedCount} import/dependency lines${detail}]`);
462
613
  }
463
614
  return processedLines.join('\n');
464
615
  }