mstro-app 0.4.2 → 0.4.4

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 (342) hide show
  1. package/bin/mstro.js +119 -40
  2. package/dist/server/cli/headless/claude-invoker-process.d.ts +11 -0
  3. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -0
  4. package/dist/server/cli/headless/claude-invoker-process.js +140 -0
  5. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -0
  6. package/dist/server/cli/headless/claude-invoker-stall.d.ts +40 -0
  7. package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -0
  8. package/dist/server/cli/headless/claude-invoker-stall.js +98 -0
  9. package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -0
  10. package/dist/server/cli/headless/claude-invoker-stream.d.ts +44 -0
  11. package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -0
  12. package/dist/server/cli/headless/claude-invoker-stream.js +276 -0
  13. package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -0
  14. package/dist/server/cli/headless/claude-invoker-tools.d.ts +21 -0
  15. package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -0
  16. package/dist/server/cli/headless/claude-invoker-tools.js +137 -0
  17. package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -0
  18. package/dist/server/cli/headless/claude-invoker.d.ts +6 -4
  19. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  20. package/dist/server/cli/headless/claude-invoker.js +10 -804
  21. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  22. package/dist/server/cli/headless/haiku-assessments.d.ts +62 -0
  23. package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -0
  24. package/dist/server/cli/headless/haiku-assessments.js +281 -0
  25. package/dist/server/cli/headless/haiku-assessments.js.map +1 -0
  26. package/dist/server/cli/headless/headless-logger.d.ts +3 -2
  27. package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
  28. package/dist/server/cli/headless/headless-logger.js +28 -5
  29. package/dist/server/cli/headless/headless-logger.js.map +1 -1
  30. package/dist/server/cli/headless/native-timeout-detector.d.ts +44 -0
  31. package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -0
  32. package/dist/server/cli/headless/native-timeout-detector.js +99 -0
  33. package/dist/server/cli/headless/native-timeout-detector.js.map +1 -0
  34. package/dist/server/cli/headless/stall-assessor.d.ts +2 -110
  35. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  36. package/dist/server/cli/headless/stall-assessor.js +65 -457
  37. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  38. package/dist/server/cli/headless/types.d.ts +4 -1
  39. package/dist/server/cli/headless/types.d.ts.map +1 -1
  40. package/dist/server/cli/improvisation-attachments.d.ts +21 -0
  41. package/dist/server/cli/improvisation-attachments.d.ts.map +1 -0
  42. package/dist/server/cli/improvisation-attachments.js +116 -0
  43. package/dist/server/cli/improvisation-attachments.js.map +1 -0
  44. package/dist/server/cli/improvisation-retry.d.ts +52 -0
  45. package/dist/server/cli/improvisation-retry.d.ts.map +1 -0
  46. package/dist/server/cli/improvisation-retry.js +434 -0
  47. package/dist/server/cli/improvisation-retry.js.map +1 -0
  48. package/dist/server/cli/improvisation-session-manager.d.ts +10 -266
  49. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  50. package/dist/server/cli/improvisation-session-manager.js +117 -1079
  51. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  52. package/dist/server/cli/improvisation-types.d.ts +86 -0
  53. package/dist/server/cli/improvisation-types.d.ts.map +1 -0
  54. package/dist/server/cli/improvisation-types.js +10 -0
  55. package/dist/server/cli/improvisation-types.js.map +1 -0
  56. package/dist/server/cli/prompt-builders.d.ts +68 -0
  57. package/dist/server/cli/prompt-builders.d.ts.map +1 -0
  58. package/dist/server/cli/prompt-builders.js +312 -0
  59. package/dist/server/cli/prompt-builders.js.map +1 -0
  60. package/dist/server/index.js +33 -212
  61. package/dist/server/index.js.map +1 -1
  62. package/dist/server/mcp/bouncer-haiku.d.ts +10 -0
  63. package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -0
  64. package/dist/server/mcp/bouncer-haiku.js +152 -0
  65. package/dist/server/mcp/bouncer-haiku.js.map +1 -0
  66. package/dist/server/mcp/bouncer-integration.d.ts +3 -4
  67. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  68. package/dist/server/mcp/bouncer-integration.js +50 -196
  69. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  70. package/dist/server/mcp/security-analysis.d.ts +38 -0
  71. package/dist/server/mcp/security-analysis.d.ts.map +1 -0
  72. package/dist/server/mcp/security-analysis.js +183 -0
  73. package/dist/server/mcp/security-analysis.js.map +1 -0
  74. package/dist/server/mcp/security-audit.d.ts +1 -1
  75. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  76. package/dist/server/mcp/security-patterns.d.ts +1 -25
  77. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  78. package/dist/server/mcp/security-patterns.js +55 -260
  79. package/dist/server/mcp/security-patterns.js.map +1 -1
  80. package/dist/server/server-setup.d.ts +22 -0
  81. package/dist/server/server-setup.d.ts.map +1 -0
  82. package/dist/server/server-setup.js +101 -0
  83. package/dist/server/server-setup.js.map +1 -0
  84. package/dist/server/services/file-explorer-ops.d.ts +24 -0
  85. package/dist/server/services/file-explorer-ops.d.ts.map +1 -0
  86. package/dist/server/services/file-explorer-ops.js +211 -0
  87. package/dist/server/services/file-explorer-ops.js.map +1 -0
  88. package/dist/server/services/files.d.ts +2 -85
  89. package/dist/server/services/files.d.ts.map +1 -1
  90. package/dist/server/services/files.js +7 -427
  91. package/dist/server/services/files.js.map +1 -1
  92. package/dist/server/services/plan/composer.d.ts +1 -1
  93. package/dist/server/services/plan/composer.d.ts.map +1 -1
  94. package/dist/server/services/plan/composer.js +118 -32
  95. package/dist/server/services/plan/composer.js.map +1 -1
  96. package/dist/server/services/plan/config-installer.d.ts +25 -0
  97. package/dist/server/services/plan/config-installer.d.ts.map +1 -0
  98. package/dist/server/services/plan/config-installer.js +182 -0
  99. package/dist/server/services/plan/config-installer.js.map +1 -0
  100. package/dist/server/services/plan/dependency-resolver.d.ts +1 -1
  101. package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
  102. package/dist/server/services/plan/dependency-resolver.js +4 -1
  103. package/dist/server/services/plan/dependency-resolver.js.map +1 -1
  104. package/dist/server/services/plan/executor.d.ts +38 -74
  105. package/dist/server/services/plan/executor.d.ts.map +1 -1
  106. package/dist/server/services/plan/executor.js +274 -460
  107. package/dist/server/services/plan/executor.js.map +1 -1
  108. package/dist/server/services/plan/front-matter.d.ts +18 -0
  109. package/dist/server/services/plan/front-matter.d.ts.map +1 -0
  110. package/dist/server/services/plan/front-matter.js +44 -0
  111. package/dist/server/services/plan/front-matter.js.map +1 -0
  112. package/dist/server/services/plan/output-manager.d.ts +22 -0
  113. package/dist/server/services/plan/output-manager.d.ts.map +1 -0
  114. package/dist/server/services/plan/output-manager.js +97 -0
  115. package/dist/server/services/plan/output-manager.js.map +1 -0
  116. package/dist/server/services/plan/parser-core.d.ts +20 -0
  117. package/dist/server/services/plan/parser-core.d.ts.map +1 -0
  118. package/dist/server/services/plan/parser-core.js +350 -0
  119. package/dist/server/services/plan/parser-core.js.map +1 -0
  120. package/dist/server/services/plan/parser-migration.d.ts +5 -0
  121. package/dist/server/services/plan/parser-migration.d.ts.map +1 -0
  122. package/dist/server/services/plan/parser-migration.js +124 -0
  123. package/dist/server/services/plan/parser-migration.js.map +1 -0
  124. package/dist/server/services/plan/parser.d.ts +11 -3
  125. package/dist/server/services/plan/parser.d.ts.map +1 -1
  126. package/dist/server/services/plan/parser.js +184 -369
  127. package/dist/server/services/plan/parser.js.map +1 -1
  128. package/dist/server/services/plan/prompt-builder.d.ts +17 -0
  129. package/dist/server/services/plan/prompt-builder.d.ts.map +1 -0
  130. package/dist/server/services/plan/prompt-builder.js +137 -0
  131. package/dist/server/services/plan/prompt-builder.js.map +1 -0
  132. package/dist/server/services/plan/review-gate.d.ts +28 -0
  133. package/dist/server/services/plan/review-gate.d.ts.map +1 -0
  134. package/dist/server/services/plan/review-gate.js +191 -0
  135. package/dist/server/services/plan/review-gate.js.map +1 -0
  136. package/dist/server/services/plan/state-reconciler.d.ts +1 -1
  137. package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
  138. package/dist/server/services/plan/state-reconciler.js +59 -7
  139. package/dist/server/services/plan/state-reconciler.js.map +1 -1
  140. package/dist/server/services/plan/types.d.ts +68 -0
  141. package/dist/server/services/plan/types.d.ts.map +1 -1
  142. package/dist/server/services/platform-credentials.d.ts +24 -0
  143. package/dist/server/services/platform-credentials.d.ts.map +1 -0
  144. package/dist/server/services/platform-credentials.js +68 -0
  145. package/dist/server/services/platform-credentials.js.map +1 -0
  146. package/dist/server/services/platform.d.ts +1 -31
  147. package/dist/server/services/platform.d.ts.map +1 -1
  148. package/dist/server/services/platform.js +11 -109
  149. package/dist/server/services/platform.js.map +1 -1
  150. package/dist/server/services/terminal/pty-manager.d.ts +7 -97
  151. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  152. package/dist/server/services/terminal/pty-manager.js +53 -266
  153. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  154. package/dist/server/services/terminal/pty-utils.d.ts +57 -0
  155. package/dist/server/services/terminal/pty-utils.d.ts.map +1 -0
  156. package/dist/server/services/terminal/pty-utils.js +141 -0
  157. package/dist/server/services/terminal/pty-utils.js.map +1 -0
  158. package/dist/server/services/websocket/file-definition-handlers.d.ts +4 -0
  159. package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -0
  160. package/dist/server/services/websocket/file-definition-handlers.js +153 -0
  161. package/dist/server/services/websocket/file-definition-handlers.js.map +1 -0
  162. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
  163. package/dist/server/services/websocket/file-explorer-handlers.js +52 -391
  164. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  165. package/dist/server/services/websocket/file-search-handlers.d.ts +5 -0
  166. package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -0
  167. package/dist/server/services/websocket/file-search-handlers.js +238 -0
  168. package/dist/server/services/websocket/file-search-handlers.js.map +1 -0
  169. package/dist/server/services/websocket/file-utils.js +3 -3
  170. package/dist/server/services/websocket/file-utils.js.map +1 -1
  171. package/dist/server/services/websocket/git-branch-handlers.d.ts +7 -0
  172. package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -0
  173. package/dist/server/services/websocket/git-branch-handlers.js +110 -0
  174. package/dist/server/services/websocket/git-branch-handlers.js.map +1 -0
  175. package/dist/server/services/websocket/git-diff-handlers.d.ts +6 -0
  176. package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -0
  177. package/dist/server/services/websocket/git-diff-handlers.js +123 -0
  178. package/dist/server/services/websocket/git-diff-handlers.js.map +1 -0
  179. package/dist/server/services/websocket/git-handlers.d.ts +2 -31
  180. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
  181. package/dist/server/services/websocket/git-handlers.js +35 -541
  182. package/dist/server/services/websocket/git-handlers.js.map +1 -1
  183. package/dist/server/services/websocket/git-log-handlers.d.ts +6 -0
  184. package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -0
  185. package/dist/server/services/websocket/git-log-handlers.js +128 -0
  186. package/dist/server/services/websocket/git-log-handlers.js.map +1 -0
  187. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
  188. package/dist/server/services/websocket/git-pr-handlers.js +13 -53
  189. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
  190. package/dist/server/services/websocket/git-tag-handlers.d.ts +6 -0
  191. package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -0
  192. package/dist/server/services/websocket/git-tag-handlers.js +76 -0
  193. package/dist/server/services/websocket/git-tag-handlers.js.map +1 -0
  194. package/dist/server/services/websocket/git-utils.d.ts +43 -0
  195. package/dist/server/services/websocket/git-utils.d.ts.map +1 -0
  196. package/dist/server/services/websocket/git-utils.js +201 -0
  197. package/dist/server/services/websocket/git-utils.js.map +1 -0
  198. package/dist/server/services/websocket/handler.d.ts +2 -0
  199. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  200. package/dist/server/services/websocket/handler.js +37 -112
  201. package/dist/server/services/websocket/handler.js.map +1 -1
  202. package/dist/server/services/websocket/plan-board-handlers.d.ts +11 -0
  203. package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -0
  204. package/dist/server/services/websocket/plan-board-handlers.js +218 -0
  205. package/dist/server/services/websocket/plan-board-handlers.js.map +1 -0
  206. package/dist/server/services/websocket/plan-execution-handlers.d.ts +9 -0
  207. package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -0
  208. package/dist/server/services/websocket/plan-execution-handlers.js +142 -0
  209. package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -0
  210. package/dist/server/services/websocket/plan-handlers.d.ts +7 -2
  211. package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
  212. package/dist/server/services/websocket/plan-handlers.js +21 -462
  213. package/dist/server/services/websocket/plan-handlers.js.map +1 -1
  214. package/dist/server/services/websocket/plan-helpers.d.ts +19 -0
  215. package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -0
  216. package/dist/server/services/websocket/plan-helpers.js +199 -0
  217. package/dist/server/services/websocket/plan-helpers.js.map +1 -0
  218. package/dist/server/services/websocket/plan-issue-handlers.d.ts +12 -0
  219. package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -0
  220. package/dist/server/services/websocket/plan-issue-handlers.js +162 -0
  221. package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -0
  222. package/dist/server/services/websocket/plan-sprint-handlers.d.ts +7 -0
  223. package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -0
  224. package/dist/server/services/websocket/plan-sprint-handlers.js +206 -0
  225. package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -0
  226. package/dist/server/services/websocket/quality-complexity.d.ts +14 -0
  227. package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -0
  228. package/dist/server/services/websocket/quality-complexity.js +262 -0
  229. package/dist/server/services/websocket/quality-complexity.js.map +1 -0
  230. package/dist/server/services/websocket/quality-fix-agent.d.ts +16 -0
  231. package/dist/server/services/websocket/quality-fix-agent.d.ts.map +1 -0
  232. package/dist/server/services/websocket/quality-fix-agent.js +140 -0
  233. package/dist/server/services/websocket/quality-fix-agent.js.map +1 -0
  234. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  235. package/dist/server/services/websocket/quality-handlers.js +34 -346
  236. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  237. package/dist/server/services/websocket/quality-linting.d.ts +9 -0
  238. package/dist/server/services/websocket/quality-linting.d.ts.map +1 -0
  239. package/dist/server/services/websocket/quality-linting.js +178 -0
  240. package/dist/server/services/websocket/quality-linting.js.map +1 -0
  241. package/dist/server/services/websocket/quality-review-agent.d.ts +19 -0
  242. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -0
  243. package/dist/server/services/websocket/quality-review-agent.js +206 -0
  244. package/dist/server/services/websocket/quality-review-agent.js.map +1 -0
  245. package/dist/server/services/websocket/quality-service.d.ts +3 -51
  246. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  247. package/dist/server/services/websocket/quality-service.js +9 -651
  248. package/dist/server/services/websocket/quality-service.js.map +1 -1
  249. package/dist/server/services/websocket/quality-tools.d.ts +23 -0
  250. package/dist/server/services/websocket/quality-tools.d.ts.map +1 -0
  251. package/dist/server/services/websocket/quality-tools.js +208 -0
  252. package/dist/server/services/websocket/quality-tools.js.map +1 -0
  253. package/dist/server/services/websocket/quality-types.d.ts +59 -0
  254. package/dist/server/services/websocket/quality-types.d.ts.map +1 -0
  255. package/dist/server/services/websocket/quality-types.js +101 -0
  256. package/dist/server/services/websocket/quality-types.js.map +1 -0
  257. package/dist/server/services/websocket/session-handlers.d.ts +3 -4
  258. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  259. package/dist/server/services/websocket/session-handlers.js +3 -378
  260. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  261. package/dist/server/services/websocket/session-history.d.ts +4 -0
  262. package/dist/server/services/websocket/session-history.d.ts.map +1 -0
  263. package/dist/server/services/websocket/session-history.js +208 -0
  264. package/dist/server/services/websocket/session-history.js.map +1 -0
  265. package/dist/server/services/websocket/session-initialization.d.ts +5 -0
  266. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -0
  267. package/dist/server/services/websocket/session-initialization.js +163 -0
  268. package/dist/server/services/websocket/session-initialization.js.map +1 -0
  269. package/dist/server/services/websocket/types.d.ts +12 -2
  270. package/dist/server/services/websocket/types.d.ts.map +1 -1
  271. package/package.json +1 -2
  272. package/server/cli/headless/claude-invoker-process.ts +204 -0
  273. package/server/cli/headless/claude-invoker-stall.ts +164 -0
  274. package/server/cli/headless/claude-invoker-stream.ts +353 -0
  275. package/server/cli/headless/claude-invoker-tools.ts +187 -0
  276. package/server/cli/headless/claude-invoker.ts +15 -1092
  277. package/server/cli/headless/haiku-assessments.ts +365 -0
  278. package/server/cli/headless/headless-logger.ts +26 -5
  279. package/server/cli/headless/native-timeout-detector.ts +117 -0
  280. package/server/cli/headless/stall-assessor.ts +65 -618
  281. package/server/cli/headless/types.ts +4 -1
  282. package/server/cli/improvisation-attachments.ts +148 -0
  283. package/server/cli/improvisation-retry.ts +602 -0
  284. package/server/cli/improvisation-session-manager.ts +140 -1349
  285. package/server/cli/improvisation-types.ts +98 -0
  286. package/server/cli/prompt-builders.ts +370 -0
  287. package/server/index.ts +35 -246
  288. package/server/mcp/bouncer-haiku.ts +182 -0
  289. package/server/mcp/bouncer-integration.ts +87 -248
  290. package/server/mcp/security-analysis.ts +217 -0
  291. package/server/mcp/security-audit.ts +1 -1
  292. package/server/mcp/security-patterns.ts +60 -283
  293. package/server/server-setup.ts +114 -0
  294. package/server/services/file-explorer-ops.ts +293 -0
  295. package/server/services/files.ts +20 -532
  296. package/server/services/plan/composer.ts +140 -35
  297. package/server/services/plan/config-installer.ts +187 -0
  298. package/server/services/plan/dependency-resolver.ts +4 -1
  299. package/server/services/plan/executor.ts +281 -488
  300. package/server/services/plan/front-matter.ts +48 -0
  301. package/server/services/plan/output-manager.ts +113 -0
  302. package/server/services/plan/parser-core.ts +406 -0
  303. package/server/services/plan/parser-migration.ts +128 -0
  304. package/server/services/plan/parser.ts +188 -394
  305. package/server/services/plan/prompt-builder.ts +161 -0
  306. package/server/services/plan/review-gate.ts +212 -0
  307. package/server/services/plan/state-reconciler.ts +68 -7
  308. package/server/services/plan/types.ts +101 -1
  309. package/server/services/platform-credentials.ts +83 -0
  310. package/server/services/platform.ts +16 -131
  311. package/server/services/terminal/pty-manager.ts +66 -313
  312. package/server/services/terminal/pty-utils.ts +176 -0
  313. package/server/services/websocket/file-definition-handlers.ts +165 -0
  314. package/server/services/websocket/file-explorer-handlers.ts +37 -452
  315. package/server/services/websocket/file-search-handlers.ts +291 -0
  316. package/server/services/websocket/file-utils.ts +3 -3
  317. package/server/services/websocket/git-branch-handlers.ts +130 -0
  318. package/server/services/websocket/git-diff-handlers.ts +140 -0
  319. package/server/services/websocket/git-handlers.ts +40 -625
  320. package/server/services/websocket/git-log-handlers.ts +149 -0
  321. package/server/services/websocket/git-pr-handlers.ts +17 -62
  322. package/server/services/websocket/git-tag-handlers.ts +91 -0
  323. package/server/services/websocket/git-utils.ts +230 -0
  324. package/server/services/websocket/handler.ts +39 -112
  325. package/server/services/websocket/plan-board-handlers.ts +277 -0
  326. package/server/services/websocket/plan-execution-handlers.ts +184 -0
  327. package/server/services/websocket/plan-handlers.ts +23 -544
  328. package/server/services/websocket/plan-helpers.ts +215 -0
  329. package/server/services/websocket/plan-issue-handlers.ts +204 -0
  330. package/server/services/websocket/plan-sprint-handlers.ts +252 -0
  331. package/server/services/websocket/quality-complexity.ts +294 -0
  332. package/server/services/websocket/quality-fix-agent.ts +181 -0
  333. package/server/services/websocket/quality-handlers.ts +36 -404
  334. package/server/services/websocket/quality-linting.ts +187 -0
  335. package/server/services/websocket/quality-review-agent.ts +246 -0
  336. package/server/services/websocket/quality-service.ts +11 -762
  337. package/server/services/websocket/quality-tools.ts +209 -0
  338. package/server/services/websocket/quality-types.ts +169 -0
  339. package/server/services/websocket/session-handlers.ts +5 -437
  340. package/server/services/websocket/session-history.ts +222 -0
  341. package/server/services/websocket/session-initialization.ts +209 -0
  342. package/server/services/websocket/types.ts +46 -2
@@ -1,3 +1,4 @@
1
+ export { classifyRisk, isSensitivePath, requiresAIReview } from './security-analysis.js';
1
2
  export interface SecurityPattern {
2
3
  pattern: RegExp;
3
4
  reason?: string;
@@ -27,11 +28,6 @@ export declare const SAFE_OPERATIONS: SecurityPattern[];
27
28
  /**
28
29
  * Patterns that trigger AI context review
29
30
  * These operations need context analysis to determine if they align with user intent
30
- *
31
- * The AI should consider:
32
- * 1. Did the user explicitly request this operation?
33
- * 2. Does it make sense given the task at hand?
34
- * 3. Is the content/action appropriate for the target?
35
31
  */
36
32
  export declare const NEEDS_AI_REVIEW: SecurityPattern[];
37
33
  /**
@@ -44,24 +40,4 @@ export declare function matchesPattern(operation: string, patterns: SecurityPatt
44
40
  * from matching safe home-directory patterns.
45
41
  */
46
42
  export declare function normalizeOperation(operation: string): string;
47
- export declare function requiresAIReview(operation: string): boolean;
48
- /**
49
- * Check if operation targets a sensitive path
50
- * Used to provide additional context to AI reviewer
51
- */
52
- export declare function isSensitivePath(operation: string): SecurityPattern | null;
53
- /**
54
- * Classify operation risk level for context-aware review
55
- *
56
- * Risk levels indicate how much scrutiny the AI should apply:
57
- * - critical: Catastrophic if wrong (rm -rf /, fork bombs) - auto-deny
58
- * - high: Needs clear user intent (sudo, sensitive paths, credentials)
59
- * - medium: Normal file operations - verify matches user request
60
- * - low: Safe operations - minimal review needed
61
- */
62
- export declare function classifyRisk(operation: string): {
63
- isDestructive: boolean;
64
- riskLevel: 'low' | 'medium' | 'high' | 'critical';
65
- reasons: string[];
66
- };
67
43
  //# sourceMappingURL=security-patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAiB5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,EA0C7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAoC5C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAqH5C,CAAC;AAEF;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAOrG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAgED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CA8C3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAEzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CA8DA"}
1
+ {"version":3,"file":"security-patterns.d.ts","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEzF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAiB5C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAqC7C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EA2D5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,EAoE5C,CAAC;AAIF;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,GAAG,IAAI,CAOrG;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5D"}
@@ -11,8 +11,13 @@
11
11
  * - Only truly catastrophic operations (rm -rf /, fork bombs) are auto-denied
12
12
  * - Sensitive operations (system paths, credentials) get AI review with context
13
13
  * - The question is: "Does this operation make sense given user intent?"
14
+ *
15
+ * Analysis logic (requiresAIReview, classifyRisk) lives in security-analysis.ts
16
+ * and is re-exported here for backward compatibility.
14
17
  */
15
18
  import { resolve } from 'node:path';
19
+ // Re-export analysis functions for backward compatibility
20
+ export { classifyRisk, isSensitivePath, requiresAIReview } from './security-analysis.js';
16
21
  /**
17
22
  * Sensitive paths that require AI context review
18
23
  * These aren't auto-denied - they need context analysis to determine intent
@@ -45,8 +50,6 @@ export const SENSITIVE_PATHS = [
45
50
  * for context review. Only truly never-legitimate commands are here.
46
51
  */
47
52
  export const CRITICAL_THREATS = [
48
- // Deleting root or home - no legitimate dev task requires this
49
- // If user really wants this, they can run it manually outside Claude
50
53
  {
51
54
  pattern: /rm\s+-rf\s+(\/|~)($|\s)/i,
52
55
  reason: 'Deleting root (/) or home (~) directory is never a legitimate dev task'
@@ -75,7 +78,6 @@ export const CRITICAL_THREATS = [
75
78
  pattern: /chmod\s+000\s+\//i,
76
79
  reason: 'Attempting to make system directories inaccessible'
77
80
  },
78
- // Reverse shells - never legitimate in a dev workflow
79
81
  {
80
82
  pattern: /\/dev\/tcp\//i,
81
83
  reason: 'Reverse shell via /dev/tcp - classic backdoor technique'
@@ -84,8 +86,6 @@ export const CRITICAL_THREATS = [
84
86
  pattern: /\bnc\b.*-[elp].*\b\d+\b/i,
85
87
  reason: 'Netcat listener/reverse shell - common backdoor technique'
86
88
  },
87
- // NOTE: curl|bash is NOT here - it goes to Haiku for context review
88
- // The question is "did a bad actor inject this?" not "is curl|bash dangerous?"
89
89
  ];
90
90
  /**
91
91
  * Safe operations that can be immediately allowed (confidence: 95%)
@@ -96,14 +96,12 @@ export const SAFE_OPERATIONS = [
96
96
  { pattern: /^Read:/i },
97
97
  { pattern: /^Glob:/i },
98
98
  { pattern: /^Grep:/i },
99
- // Write/Edit to user home directory or subdirectories - user requested, allow it
100
- // Excludes system paths which go through critical threats check
101
- { pattern: /^Write:\s*\/Users\/[^/]+\//i }, // macOS home dirs - Write
102
- { pattern: /^Edit:\s*\/Users\/[^/]+\//i }, // macOS home dirs - Edit
103
- { pattern: /^Write:\s*\/home\/[^/]+\//i }, // Linux home dirs - Write
104
- { pattern: /^Edit:\s*\/home\/[^/]+\//i }, // Linux home dirs - Edit
99
+ // Write/Edit to user home directory or subdirectories
100
+ { pattern: /^Write:\s*\/Users\/[^/]+\//i },
101
+ { pattern: /^Edit:\s*\/Users\/[^/]+\//i },
102
+ { pattern: /^Write:\s*\/home\/[^/]+\//i },
103
+ { pattern: /^Edit:\s*\/home\/[^/]+\//i },
105
104
  // Safe bash commands - common development workflows
106
- // NOTE: curl|bash goes to Haiku for context review, not auto-allowed
107
105
  { pattern: /^Bash:\s*(npm|yarn|pnpm|bun)\s+(install|ci|run|test|build|dev|start|lint|format)($|\s)/i },
108
106
  { pattern: /^Bash:\s*git\s+(status|log|diff|show|branch|clone|pull|fetch|add|stash|checkout)($|\s)/i },
109
107
  { pattern: /^Bash:\s*docker\s+(build|run|ps|logs|compose|images)($|\s)/i },
@@ -117,20 +115,37 @@ export const SAFE_OPERATIONS = [
117
115
  { pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?\.next($|\s)/i },
118
116
  { pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?target($|\s)/i },
119
117
  { pattern: /^Bash:\s*rm\s+-rf\s+(\.\/)?__pycache__($|\s)/i },
120
- // Write/Edit to temp directories - ephemeral, low risk
118
+ // Write/Edit to temp directories
121
119
  { pattern: /^(Write|Edit):\s*\/tmp\//i },
122
120
  { pattern: /^(Write|Edit):\s*\/var\/tmp\//i },
123
- // Side-effect-free tools - no dangerous operations possible
121
+ // Side-effect-free tools
124
122
  { pattern: /^(ExitPlanMode|EnterPlanMode|TodoWrite|AskUserQuestion):/i },
123
+ // Additional common dev commands
124
+ { pattern: /^Bash:\s*(tsc|tsx|node|bun|deno|npx|bunx)\s/i },
125
+ { pattern: /^Bash:\s*(vitest|jest|mocha|tap)\s/i },
126
+ { pattern: /^Bash:\s*(biome|eslint|prettier|tslint)\s+(check|lint|format)/i },
127
+ { pattern: /^Bash:\s*(make|cmake|ninja|meson)($|\s)/i },
128
+ { pattern: /^Bash:\s*git\s+(commit|push|tag|remote|rebase|merge|cherry-pick|reset|revert)($|\s)/i },
129
+ { pattern: /^Bash:\s*git\s+(worktree|submodule|config|clean|gc)($|\s)/i },
130
+ { pattern: /^Bash:\s*(uname|hostname|whoami|id|groups|uptime|df|du|free|top|ps|lsof|stat|file|readlink)($|\s)/i },
131
+ { pattern: /^Bash:\s*(mv|cp|touch|ln|basename|dirname|realpath|mktemp|xargs|tee|tr|cut|paste|comm|diff|patch)($|\s)/i },
132
+ { pattern: /^Bash:\s*(tar|gzip|gunzip|zip|unzip|bzip2)\s/i },
133
+ { pattern: /^Bash:\s*(ruby|python3?|php|java|javac|scala|kotlinc|swift|rustc|gcc|g\+\+|clang)\s/i },
134
+ { pattern: /^Bash:\s*(pip|pip3|gem|bundle|composer|maven|gradle|sbt|cargo|rustup)\s/i },
135
+ { pattern: /^Bash:\s*(gh|hub)\s+(pr|issue|repo|release|run|api)\s/i },
136
+ { pattern: /^Bash:\s*(flyctl|fly)\s+(status|logs|ssh|deploy|apps|machines|secrets)($|\s)/i },
137
+ { pattern: /^Bash:\s*(terraform|tofu)\s+(init|plan|apply|validate|fmt|show|output)($|\s)/i },
138
+ { pattern: /^Bash:\s*wc($|\s)/i },
139
+ // WebFetch/WebSearch are inherently read-only
140
+ { pattern: /^WebFetch:/i },
141
+ { pattern: /^WebSearch:/i },
142
+ // Agent and NotebookEdit are orchestration-only
143
+ { pattern: /^Agent:/i },
144
+ { pattern: /^NotebookEdit:/i },
125
145
  ];
126
146
  /**
127
147
  * Patterns that trigger AI context review
128
148
  * These operations need context analysis to determine if they align with user intent
129
- *
130
- * The AI should consider:
131
- * 1. Did the user explicitly request this operation?
132
- * 2. Does it make sense given the task at hand?
133
- * 3. Is the content/action appropriate for the target?
134
149
  */
135
150
  export const NEEDS_AI_REVIEW = [
136
151
  // Remote code execution patterns
@@ -139,106 +154,58 @@ export const NEEDS_AI_REVIEW = [
139
154
  reason: 'Pipe to shell - verify source is trusted and user intended this'
140
155
  },
141
156
  // Elevated privileges
142
- {
143
- pattern: /sudo/i,
144
- reason: 'Elevated privileges - verify user intended this action'
145
- },
157
+ { pattern: /sudo/i, reason: 'Elevated privileges - verify user intended this action' },
146
158
  // Destructive operations (except safe build artifact cleanup)
147
- {
148
- pattern: /rm\s+-rf/i,
149
- reason: 'Recursive deletion - verify target matches user intent'
150
- },
151
- // Data exfiltration patterns piping data to network tools
152
- {
153
- pattern: /\|\s*(nc|netcat|ncat)\b/i,
154
- reason: 'Pipe to netcat - potential data exfiltration'
155
- },
156
- {
157
- pattern: /\bscp\b.*@/i,
158
- reason: 'SCP to remote host - potential data exfiltration'
159
- },
160
- {
161
- pattern: /\|\s*curl\b/i,
162
- reason: 'Pipe to curl - potential data exfiltration'
163
- },
164
- {
165
- pattern: /curl\b.*-d\s*@/i,
166
- reason: 'Curl with file upload - potential data exfiltration'
167
- },
159
+ { pattern: /rm\s+-rf/i, reason: 'Recursive deletion - verify target matches user intent' },
160
+ // Data exfiltration patterns
161
+ { pattern: /\|\s*(nc|netcat|ncat)\b/i, reason: 'Pipe to netcat - potential data exfiltration' },
162
+ { pattern: /\bscp\b.*@/i, reason: 'SCP to remote host - potential data exfiltration' },
163
+ { pattern: /\|\s*curl\b/i, reason: 'Pipe to curl - potential data exfiltration' },
164
+ { pattern: /curl\b.*-d\s*@/i, reason: 'Curl with file upload - potential data exfiltration' },
168
165
  // ALL Write/Edit operations that aren't to /tmp go through context review
169
- // This is the key change: we review based on context, not blanket allow/deny
170
166
  {
171
167
  pattern: /^(Write|Edit):\s*(?!\/tmp\/|\/var\/tmp\/)/i,
172
168
  reason: 'File modification - verify aligns with user request'
173
169
  },
174
- // Reverse shells and bind shells — network-connected interactive shells
175
- {
176
- pattern: /\/dev\/tcp\//i,
177
- reason: 'Potential reverse shell via /dev/tcp'
178
- },
179
- {
180
- pattern: /\b(nc|netcat|ncat)\b.*-e\s/i,
181
- reason: 'Netcat with -e flag - potential reverse shell'
182
- },
170
+ // Reverse shells and bind shells
171
+ { pattern: /\/dev\/tcp\//i, reason: 'Potential reverse shell via /dev/tcp' },
172
+ { pattern: /\b(nc|netcat|ncat)\b.*-e\s/i, reason: 'Netcat with -e flag - potential reverse shell' },
183
173
  {
184
174
  pattern: /\bsocket\b.*\bconnect\b.*\b(dup2|subprocess|exec)\b/i,
185
175
  reason: 'Programmatic reverse shell pattern (socket+connect+exec)'
186
176
  },
187
- {
188
- pattern: /\bperl\b.*\bsocket\b.*\bexec\b/i,
189
- reason: 'Perl reverse shell pattern'
190
- },
177
+ { pattern: /\bperl\b.*\bsocket\b.*\bexec\b/i, reason: 'Perl reverse shell pattern' },
191
178
  // Encoded/obfuscated payloads piped to shell or eval
192
179
  {
193
180
  pattern: /\b(base64|base32)\b.*-d.*\|\s*(bash|sh)\b/i,
194
181
  reason: 'Decoded payload piped to shell - obfuscated command execution'
195
182
  },
196
- {
197
- pattern: /\\x[0-9a-f]{2}.*\|\s*(bash|sh)\b/i,
198
- reason: 'Hex-encoded payload piped to shell'
199
- },
200
- {
201
- pattern: /\bexec\b.*\b(base64|b64decode)\b/i,
202
- reason: 'Exec with base64 decoding - obfuscated code execution'
203
- },
183
+ { pattern: /\\x[0-9a-f]{2}.*\|\s*(bash|sh)\b/i, reason: 'Hex-encoded payload piped to shell' },
184
+ { pattern: /\bexec\b.*\b(base64|b64decode)\b/i, reason: 'Exec with base64 decoding - obfuscated code execution' },
204
185
  {
205
186
  pattern: /\bprintf\b.*\\x[0-9a-f].*\|\s*(bash|sh)\b/i,
206
187
  reason: 'Printf hex payload piped to shell'
207
188
  },
208
- // Cloud metadata / SSRF — accessing cloud instance credentials
209
- {
210
- pattern: /169\.254\.169\.254/i,
211
- reason: 'AWS/Azure IMDS access - potential credential theft'
212
- },
213
- {
214
- pattern: /metadata\.google\.internal/i,
215
- reason: 'GCP metadata access - potential credential theft'
216
- },
217
- // Persistence — writing to shell profiles, cron, authorized_keys via echo/append
189
+ // Cloud metadata / SSRF
190
+ { pattern: /169\.254\.169\.254/i, reason: 'AWS/Azure IMDS access - potential credential theft' },
191
+ { pattern: /metadata\.google\.internal/i, reason: 'GCP metadata access - potential credential theft' },
192
+ // Persistence mechanisms
218
193
  {
219
194
  pattern: />>\s*~?\/?.*\/(authorized_keys|\.bashrc|\.bash_profile|\.zshrc|\.profile)/i,
220
195
  reason: 'Appending to sensitive file - potential persistence mechanism'
221
196
  },
222
- {
223
- pattern: /\bld\.so\.preload\b/i,
224
- reason: 'LD_PRELOAD injection - shared library hijacking'
225
- },
197
+ { pattern: /\bld\.so\.preload\b/i, reason: 'LD_PRELOAD injection - shared library hijacking' },
226
198
  // wget with file upload
227
- {
228
- pattern: /wget\b.*--post-file/i,
229
- reason: 'wget file upload - potential data exfiltration'
230
- },
199
+ { pattern: /wget\b.*--post-file/i, reason: 'wget file upload - potential data exfiltration' },
231
200
  // pip install from custom index (supply chain attack)
232
201
  {
233
202
  pattern: /pip\b.*--index-url\s+https?:\/\/(?!pypi\.org)/i,
234
203
  reason: 'pip install from non-PyPI index - potential supply chain attack'
235
204
  },
236
205
  // MCP server manipulation
237
- {
238
- pattern: /\bclaude\b.*\bmcp\b.*\badd\b/i,
239
- reason: 'Adding MCP server - verify source is trusted'
240
- },
206
+ { pattern: /\bclaude\b.*\bmcp\b.*\badd\b/i, reason: 'Adding MCP server - verify source is trusted' },
241
207
  ];
208
+ // ── Utility functions ─────────────────────────────────────────
242
209
  /**
243
210
  * Check if operation matches any pattern in array
244
211
  */
@@ -264,176 +231,4 @@ export function normalizeOperation(operation) {
264
231
  }
265
232
  return operation;
266
233
  }
267
- /** Check if a Bash command contains chain operators that could hide dangerous ops after a safe prefix. */
268
- function containsChainOperators(operation) {
269
- const commandPart = operation.replace(/^Bash:\s*/i, '');
270
- return /;|&&|\|\||\n/.test(commandPart);
271
- }
272
- /** Check if a Bash command pipes output to known exfiltration/network tools or shells. */
273
- function containsDangerousPipe(operation) {
274
- const commandPart = operation.replace(/^Bash:\s*/i, '');
275
- return /\|\s*(nc|netcat|ncat|curl|wget|scp|bash|sh)\b/i.test(commandPart);
276
- }
277
- /** Check if a Bash command redirects output to sensitive paths (append or overwrite). */
278
- function containsSensitiveRedirect(operation) {
279
- const commandPart = operation.replace(/^Bash:\s*/i, '');
280
- return />>?\s*~?\/?.*\/(authorized_keys|\.bashrc|\.bash_profile|\.zshrc|\.profile|\.ssh\/|\.aws\/|\.gnupg\/|ld\.so\.preload|crontab|sudoers)/i.test(commandPart)
281
- || />>?\s*\/etc\//i.test(commandPart);
282
- }
283
- /** Check if a Bash command contains subshell or backtick expansion (not simple ${VAR}). */
284
- function containsBashExpansion(operation) {
285
- const commandPart = operation.replace(/^Bash:\s*/i, '');
286
- return /`[^`]+`/.test(commandPart) || /\$\([^)]+\)/.test(commandPart);
287
- }
288
- /** Check if a Bash command contains any form of shell expansion: ${VAR}, $(...), or backticks. */
289
- function containsAnyExpansion(operation) {
290
- const cmd = operation.replace(/^Bash:\s*/i, '');
291
- return /\$\{[^}]+\}/.test(cmd) || /\$\([^)]+\)/.test(cmd) || /`[^`]+`/.test(cmd);
292
- }
293
- /** Check if expansion is safely used as an argument to a known-safe command prefix.
294
- * e.g., "echo ${HOME}" or "cat ${FILE}" — the expansion can't change the command itself. */
295
- function isSafeExpansionUse(operation) {
296
- const cmd = operation.replace(/^Bash:\s*/i, '').trim();
297
- // If the expansion IS the command (first token), it's never safe
298
- if (/^(\$\{|\$\(|`)/.test(cmd))
299
- return false;
300
- // Safe command prefixes where expansion as an argument is harmless
301
- const safePrefix = /^(echo|printf|cat|ls|pwd|whoami|date|env|printenv|test|true|false)\s/i;
302
- return safePrefix.test(cmd);
303
- }
304
- /**
305
- * Determine if operation requires AI context review
306
- *
307
- * The philosophy here is:
308
- * - SENSITIVE_PATHS: Always require review (credentials, system configs)
309
- * - SAFE_OPERATIONS: No review needed, UNLESS the bash command contains
310
- * chain operators, dangerous pipes, or subshell/backtick expansion
311
- * - CRITICAL_THREATS: Auto-deny, no review (catastrophic operations)
312
- * - Everything else: AI reviews context to determine if it matches user intent
313
- */
314
- const SAFE_RM_PATTERNS = [
315
- /rm\s+-rf\s+(\.\/)?node_modules($|\s)/i,
316
- /rm\s+-rf\s+(\.\/)?dist($|\s)/i,
317
- /rm\s+-rf\s+(\.\/)?build($|\s)/i,
318
- /rm\s+-rf\s+(\.\/)?\.cache($|\s)/i,
319
- /rm\s+-rf\s+(\.\/)?\.next($|\s)/i,
320
- /rm\s+-rf\s+(\.\/)?target($|\s)/i,
321
- /rm\s+-rf\s+(\.\/)?__pycache__($|\s)/i,
322
- ];
323
- export function requiresAIReview(operation) {
324
- // Normalize paths to prevent .. traversal bypass
325
- const op = normalizeOperation(operation);
326
- // Check sensitive paths BEFORE safe operations — prevents home-dir
327
- // safe pattern from masking .ssh, .aws, .bashrc, etc.
328
- if (matchesPattern(op, SENSITIVE_PATHS))
329
- return true;
330
- // Bash commands with any shell expansion (${VAR}, $(...), backticks) are
331
- // opaque — the bouncer can't predict what they expand to at runtime.
332
- // Route to AI review BEFORE checking CRITICAL_THREATS or SAFE_OPERATIONS,
333
- // UNLESS the command is clearly safe (expansion is just an argument to a
334
- // known-safe prefix like "echo ${HOME}").
335
- if (/^Bash:/i.test(op) && containsAnyExpansion(op) && !isSafeExpansionUse(op)) {
336
- return true;
337
- }
338
- if (matchesPattern(op, SAFE_OPERATIONS)) {
339
- // Safe bash commands must not contain chain operators, dangerous pipes,
340
- // or subshell/backtick expansion that could hide dangerous operations.
341
- // A safe prefix (e.g., "git clone") with chain operators (&&, ;, ||)
342
- // means the full command isn't necessarily safe — route to AI review.
343
- if (/^Bash:/i.test(op) && (containsChainOperators(op) ||
344
- containsDangerousPipe(op) ||
345
- containsBashExpansion(op) ||
346
- containsSensitiveRedirect(op))) {
347
- return true;
348
- }
349
- return false;
350
- }
351
- if (matchesPattern(op, CRITICAL_THREATS))
352
- return false;
353
- if (matchesPattern(op, NEEDS_AI_REVIEW)) {
354
- return !SAFE_RM_PATTERNS.some(p => p.test(op));
355
- }
356
- // Glob patterns and script execution are concerning in Bash commands
357
- if (/^Bash:/.test(op)) {
358
- if (/\*\*?/.test(op))
359
- return true;
360
- if (/^Bash:\s*\.\//.test(op))
361
- return true;
362
- }
363
- return false;
364
- }
365
- /**
366
- * Check if operation targets a sensitive path
367
- * Used to provide additional context to AI reviewer
368
- */
369
- export function isSensitivePath(operation) {
370
- return matchesPattern(operation, SENSITIVE_PATHS);
371
- }
372
- /**
373
- * Classify operation risk level for context-aware review
374
- *
375
- * Risk levels indicate how much scrutiny the AI should apply:
376
- * - critical: Catastrophic if wrong (rm -rf /, fork bombs) - auto-deny
377
- * - high: Needs clear user intent (sudo, sensitive paths, credentials)
378
- * - medium: Normal file operations - verify matches user request
379
- * - low: Safe operations - minimal review needed
380
- */
381
- export function classifyRisk(operation) {
382
- // Critical threats are auto-denied
383
- const criticalThreat = matchesPattern(operation, CRITICAL_THREATS);
384
- if (criticalThreat) {
385
- return {
386
- isDestructive: true,
387
- riskLevel: 'critical',
388
- reasons: [criticalThreat.reason || 'Critical threat detected']
389
- };
390
- }
391
- // Sensitive paths need high scrutiny but aren't auto-denied
392
- const sensitivePath = matchesPattern(operation, SENSITIVE_PATHS);
393
- if (sensitivePath) {
394
- return {
395
- isDestructive: false, // Not inherently destructive, just sensitive
396
- riskLevel: 'high',
397
- reasons: [sensitivePath.reason || 'Sensitive path - requires clear user intent']
398
- };
399
- }
400
- // Other patterns that need elevated review
401
- const elevatedPatterns = [
402
- { pattern: /sudo/i, reason: 'Elevated privileges requested' },
403
- { pattern: /DROP\s+(TABLE|DATABASE)/i, reason: 'Database deletion' },
404
- { pattern: /chmod\s+777/i, reason: 'Dangerous permissions' },
405
- { pattern: /(curl|wget).*\|.*(bash|sh)/i, reason: 'Remote code execution' },
406
- { pattern: /pkill|killall/i, reason: 'Process termination' },
407
- { pattern: /\|\s*(nc|netcat|ncat)\b/i, reason: 'Data exfiltration via netcat' },
408
- { pattern: /\bscp\b.*@/i, reason: 'Data exfiltration via SCP' },
409
- { pattern: /curl\b.*-d\s*@/i, reason: 'Data exfiltration via curl file upload' },
410
- ];
411
- for (const pattern of elevatedPatterns) {
412
- if (pattern.pattern.test(operation)) {
413
- return {
414
- isDestructive: true,
415
- riskLevel: 'high',
416
- reasons: [pattern.reason || 'Elevated risk operation']
417
- };
418
- }
419
- }
420
- // Medium risk: only recursive deletions outside safe dirs
421
- // NOTE: Write/Edit are NOT flagged as risky - they're normal dev operations
422
- if (/rm\s+-rf/i.test(operation)) {
423
- // Check if it's actually safe (build artifacts, temp)
424
- if (matchesPattern(operation, SAFE_OPERATIONS)) {
425
- return { isDestructive: false, riskLevel: 'low', reasons: [] };
426
- }
427
- return {
428
- isDestructive: true,
429
- riskLevel: 'medium',
430
- reasons: ['Recursive deletion']
431
- };
432
- }
433
- return {
434
- isDestructive: false,
435
- riskLevel: 'low',
436
- reasons: []
437
- };
438
- }
439
234
  //# sourceMappingURL=security-patterns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security-patterns.js","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"security-patterns.js","sourceRoot":"","sources":["../../../server/mcp/security-patterns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { WebSocket as NodeWebSocket } from 'ws';
2
+ import type { WSContext } from './services/websocket/types.js';
3
+ /**
4
+ * Set the terminal tab title
5
+ * Format: "mstro: directory_name"
6
+ */
7
+ export declare function setTerminalTitle(directory: string): void;
8
+ /**
9
+ * Ensure .claude/settings.json exists with recommended settings
10
+ * for optimal Claude Code performance with Mstro
11
+ */
12
+ export declare function ensureClaudeSettings(workingDir: string): void;
13
+ /**
14
+ * Wrap a ws WebSocket to match our WSContext interface
15
+ */
16
+ export declare function wrapWebSocket(ws: NodeWebSocket, workingDir: string): WSContext;
17
+ /**
18
+ * Create a virtual WebSocket context that sends responses through the platform relay.
19
+ * This allows messages from the web (via platform) to be handled by the same wsHandler.
20
+ */
21
+ export declare function createPlatformRelayContext(platformSend: (message: unknown) => void, workingDir: string): WSContext;
22
+ //# sourceMappingURL=server-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-setup.d.ts","sourceRoot":"","sources":["../../server/server-setup.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,IAAI,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAE9D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CA6C7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,EACxC,UAAU,EAAE,MAAM,GACjB,SAAS,CAiBX"}
@@ -0,0 +1,101 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ /**
4
+ * Server Setup Utilities — Helpers for the main server entry point.
5
+ *
6
+ * - ensureClaudeSettings: Ensures .claude/settings.json has recommended defaults
7
+ * - wrapWebSocket / createPlatformRelayContext: WSContext adapters
8
+ */
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
10
+ import { basename, join } from 'node:path';
11
+ /**
12
+ * Set the terminal tab title
13
+ * Format: "mstro: directory_name"
14
+ */
15
+ export function setTerminalTitle(directory) {
16
+ const dirName = basename(directory) || directory;
17
+ const title = `mstro: ${dirName}`;
18
+ process.stdout.write(`\x1b]0;${title}\x07`);
19
+ }
20
+ /**
21
+ * Ensure .claude/settings.json exists with recommended settings
22
+ * for optimal Claude Code performance with Mstro
23
+ */
24
+ export function ensureClaudeSettings(workingDir) {
25
+ const claudeDir = join(workingDir, '.claude');
26
+ const settingsPath = join(claudeDir, 'settings.json');
27
+ if (!existsSync(claudeDir)) {
28
+ mkdirSync(claudeDir, { recursive: true });
29
+ }
30
+ const recommendedSettings = {
31
+ env: {
32
+ CLAUDE_CODE_MAX_OUTPUT_TOKENS: "64000",
33
+ DISABLE_NONESSENTIAL_TRAFFIC: "1"
34
+ }
35
+ };
36
+ if (!existsSync(settingsPath)) {
37
+ writeFileSync(settingsPath, JSON.stringify(recommendedSettings, null, 2));
38
+ console.log(`📝 Created .claude/settings.json with recommended settings`);
39
+ }
40
+ else {
41
+ try {
42
+ const existingSettings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
43
+ let updated = false;
44
+ if (!existingSettings.env) {
45
+ existingSettings.env = {};
46
+ updated = true;
47
+ }
48
+ if (!existingSettings.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS) {
49
+ existingSettings.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS = "64000";
50
+ updated = true;
51
+ }
52
+ if (!existingSettings.env.DISABLE_NONESSENTIAL_TRAFFIC) {
53
+ existingSettings.env.DISABLE_NONESSENTIAL_TRAFFIC = "1";
54
+ updated = true;
55
+ }
56
+ if (updated) {
57
+ writeFileSync(settingsPath, JSON.stringify(existingSettings, null, 2));
58
+ console.log(`📝 Updated .claude/settings.json with recommended env settings`);
59
+ }
60
+ }
61
+ catch (_e) {
62
+ console.warn(`⚠️ Could not parse existing .claude/settings.json, skipping update`);
63
+ }
64
+ }
65
+ }
66
+ /**
67
+ * Wrap a ws WebSocket to match our WSContext interface
68
+ */
69
+ export function wrapWebSocket(ws, workingDir) {
70
+ return {
71
+ send: (data) => ws.send(data),
72
+ close: () => ws.close(),
73
+ readyState: ws.readyState,
74
+ _workingDir: workingDir,
75
+ _ws: ws
76
+ };
77
+ }
78
+ /**
79
+ * Create a virtual WebSocket context that sends responses through the platform relay.
80
+ * This allows messages from the web (via platform) to be handled by the same wsHandler.
81
+ */
82
+ export function createPlatformRelayContext(platformSend, workingDir) {
83
+ return {
84
+ send: (data) => {
85
+ try {
86
+ const response = typeof data === 'string' ? JSON.parse(data) : JSON.parse(data.toString());
87
+ platformSend(response);
88
+ }
89
+ catch (e) {
90
+ console.error('[PlatformRelay] Failed to parse response:', e);
91
+ }
92
+ },
93
+ close: () => {
94
+ // No-op for platform relay
95
+ },
96
+ readyState: 1, // WebSocket.OPEN
97
+ _workingDir: workingDir,
98
+ _isPlatformRelay: true
99
+ };
100
+ }
101
+ //# sourceMappingURL=server-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-setup.js","sourceRoot":"","sources":["../../server/server-setup.ts"],"names":[],"mappings":"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"}