@cybedefend/vibedefend 1.5.0 → 1.7.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 (264) hide show
  1. package/README.md +71 -2
  2. package/dist/api/gateway-request.js +49 -0
  3. package/dist/api/gateway-request.js.map +1 -0
  4. package/dist/api/projects.js +67 -0
  5. package/dist/api/projects.js.map +1 -1
  6. package/dist/api/repository-link.js +157 -0
  7. package/dist/api/repository-link.js.map +1 -0
  8. package/dist/auth/auth-store.js +107 -25
  9. package/dist/auth/auth-store.js.map +1 -1
  10. package/dist/auth/auth.js +21 -0
  11. package/dist/auth/auth.js.map +1 -1
  12. package/dist/clients/cursor.js +5 -1
  13. package/dist/clients/cursor.js.map +1 -1
  14. package/dist/clients/vscode.js +38 -29
  15. package/dist/clients/vscode.js.map +1 -1
  16. package/dist/commands/mcp/allow.js +219 -0
  17. package/dist/commands/mcp/allow.js.map +1 -0
  18. package/dist/commands/mcp/connect.js +337 -0
  19. package/dist/commands/mcp/connect.js.map +1 -0
  20. package/dist/commands/mcp/index.js +170 -0
  21. package/dist/commands/mcp/index.js.map +1 -0
  22. package/dist/commands/mcp/proxy.js +320 -0
  23. package/dist/commands/mcp/proxy.js.map +1 -0
  24. package/dist/commands/mcp/scan.js +349 -0
  25. package/dist/commands/mcp/scan.js.map +1 -0
  26. package/dist/commands/mcp/sync.js +215 -0
  27. package/dist/commands/mcp/sync.js.map +1 -0
  28. package/dist/config.js +6 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/diagnostics.js +78 -12
  31. package/dist/diagnostics.js.map +1 -1
  32. package/dist/doctor.js +19 -0
  33. package/dist/doctor.js.map +1 -1
  34. package/dist/guards-evaluator/analysis-types.js +27 -0
  35. package/dist/guards-evaluator/analysis-types.js.map +1 -0
  36. package/dist/guards-evaluator/command-analysis.js +572 -0
  37. package/dist/guards-evaluator/command-analysis.js.map +1 -0
  38. package/dist/guards-evaluator/command-view.js +586 -0
  39. package/dist/guards-evaluator/command-view.js.map +1 -0
  40. package/dist/guards-evaluator/env.js +11 -0
  41. package/dist/guards-evaluator/env.js.map +1 -0
  42. package/dist/guards-evaluator/evaluate.js +91 -41
  43. package/dist/guards-evaluator/evaluate.js.map +1 -1
  44. package/dist/guards-evaluator/index.js +2 -1
  45. package/dist/guards-evaluator/index.js.map +1 -1
  46. package/dist/guards-evaluator/inline-code.js +259 -0
  47. package/dist/guards-evaluator/inline-code.js.map +1 -0
  48. package/dist/guards-evaluator/normalize.js +716 -0
  49. package/dist/guards-evaluator/normalize.js.map +1 -0
  50. package/dist/guards-evaluator/preprocess.js +13 -5
  51. package/dist/guards-evaluator/preprocess.js.map +1 -1
  52. package/dist/guards-evaluator/redact.js +19 -0
  53. package/dist/guards-evaluator/redact.js.map +1 -1
  54. package/dist/guards-evaluator/regex.js +25 -3
  55. package/dist/guards-evaluator/regex.js.map +1 -1
  56. package/dist/guards-evaluator/safe-commands.js +155 -0
  57. package/dist/guards-evaluator/safe-commands.js.map +1 -0
  58. package/dist/guards-evaluator/triage.js +315 -0
  59. package/dist/guards-evaluator/triage.js.map +1 -0
  60. package/dist/hook-runner.js +24679 -5079
  61. package/dist/hooks/install.js +38 -0
  62. package/dist/hooks/install.js.map +1 -1
  63. package/dist/hooks/runtime/config.js +38 -0
  64. package/dist/hooks/runtime/config.js.map +1 -1
  65. package/dist/hooks/runtime/emit.js +94 -61
  66. package/dist/hooks/runtime/emit.js.map +1 -1
  67. package/dist/hooks/runtime/fetch-rules.js +22 -7
  68. package/dist/hooks/runtime/fetch-rules.js.map +1 -1
  69. package/dist/hooks/runtime/gateway-http-error.js +34 -0
  70. package/dist/hooks/runtime/gateway-http-error.js.map +1 -0
  71. package/dist/hooks/runtime/guard-rules-cache.js +139 -17
  72. package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
  73. package/dist/hooks/runtime/guard-violations-buffer.js +321 -48
  74. package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
  75. package/dist/hooks/runtime/judge-cache.js +6 -0
  76. package/dist/hooks/runtime/judge-cache.js.map +1 -1
  77. package/dist/hooks/runtime/judge-triage.js +193 -0
  78. package/dist/hooks/runtime/judge-triage.js.map +1 -0
  79. package/dist/hooks/runtime/judge.js +7 -1
  80. package/dist/hooks/runtime/judge.js.map +1 -1
  81. package/dist/hooks/runtime/pre-compact.js +12 -6
  82. package/dist/hooks/runtime/pre-compact.js.map +1 -1
  83. package/dist/hooks/runtime/resolve.js +90 -8
  84. package/dist/hooks/runtime/resolve.js.map +1 -1
  85. package/dist/hooks/runtime/retry-policy.js +57 -0
  86. package/dist/hooks/runtime/retry-policy.js.map +1 -0
  87. package/dist/hooks/runtime/review-sessions.js +74 -0
  88. package/dist/hooks/runtime/review-sessions.js.map +1 -0
  89. package/dist/hooks/runtime/script-resolve.js +695 -0
  90. package/dist/hooks/runtime/script-resolve.js.map +1 -0
  91. package/dist/hooks/runtime/session-activation.js +5 -1
  92. package/dist/hooks/runtime/session-activation.js.map +1 -1
  93. package/dist/hooks/runtime/session-review.js +163 -45
  94. package/dist/hooks/runtime/session-review.js.map +1 -1
  95. package/dist/hooks/runtime/session-start.js +2 -1
  96. package/dist/hooks/runtime/session-start.js.map +1 -1
  97. package/dist/hooks/runtime/session-writes.js +232 -0
  98. package/dist/hooks/runtime/session-writes.js.map +1 -0
  99. package/dist/hooks/runtime/sniff.js +26 -7
  100. package/dist/hooks/runtime/sniff.js.map +1 -1
  101. package/dist/hooks/runtime/target-resolve.js +336 -0
  102. package/dist/hooks/runtime/target-resolve.js.map +1 -0
  103. package/dist/hooks/runtime/unmapped-tools.js +93 -0
  104. package/dist/hooks/runtime/unmapped-tools.js.map +1 -0
  105. package/dist/hooks/runtime/usage-block.js +4 -0
  106. package/dist/hooks/runtime/usage-block.js.map +1 -1
  107. package/dist/hooks/runtime/user-prompt-submit.js +2 -1
  108. package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
  109. package/dist/hooks/runtime/wire-text.js +41 -0
  110. package/dist/hooks/runtime/wire-text.js.map +1 -0
  111. package/dist/hooks/runtime/work-dir.js +84 -0
  112. package/dist/hooks/runtime/work-dir.js.map +1 -0
  113. package/dist/index.js +45 -12
  114. package/dist/index.js.map +1 -1
  115. package/dist/install.js +174 -11
  116. package/dist/install.js.map +1 -1
  117. package/dist/link.js +74 -48
  118. package/dist/link.js.map +1 -1
  119. package/dist/login.js +77 -11
  120. package/dist/login.js.map +1 -1
  121. package/dist/mcp/auth/agent-sign-ins.js +174 -0
  122. package/dist/mcp/auth/agent-sign-ins.js.map +1 -0
  123. package/dist/mcp/auth/callback.js +200 -0
  124. package/dist/mcp/auth/callback.js.map +1 -0
  125. package/dist/mcp/auth/connect.js +392 -0
  126. package/dist/mcp/auth/connect.js.map +1 -0
  127. package/dist/mcp/auth/discovery.js +399 -0
  128. package/dist/mcp/auth/discovery.js.map +1 -0
  129. package/dist/mcp/auth/oauth.js +326 -0
  130. package/dist/mcp/auth/oauth.js.map +1 -0
  131. package/dist/mcp/auth/probe.js +128 -0
  132. package/dist/mcp/auth/probe.js.map +1 -0
  133. package/dist/mcp/auth/secrets.js +446 -0
  134. package/dist/mcp/auth/secrets.js.map +1 -0
  135. package/dist/mcp/auth/store.js +260 -0
  136. package/dist/mcp/auth/store.js.map +1 -0
  137. package/dist/mcp/auth/tokenSource.js +55 -0
  138. package/dist/mcp/auth/tokenSource.js.map +1 -0
  139. package/dist/mcp/config/atomicWrite.js +98 -0
  140. package/dist/mcp/config/atomicWrite.js.map +1 -0
  141. package/dist/mcp/config/clients.js +171 -0
  142. package/dist/mcp/config/clients.js.map +1 -0
  143. package/dist/mcp/config/cybedefend-servers.js +48 -0
  144. package/dist/mcp/config/cybedefend-servers.js.map +1 -0
  145. package/dist/mcp/config/discover.js +114 -0
  146. package/dist/mcp/config/discover.js.map +1 -0
  147. package/dist/mcp/config/hook.js +123 -0
  148. package/dist/mcp/config/hook.js.map +1 -0
  149. package/dist/mcp/config/index.js +11 -0
  150. package/dist/mcp/config/index.js.map +1 -0
  151. package/dist/mcp/config/install.js +132 -0
  152. package/dist/mcp/config/install.js.map +1 -0
  153. package/dist/mcp/config/installed.js +37 -0
  154. package/dist/mcp/config/installed.js.map +1 -0
  155. package/dist/mcp/config/jsonEdit.js +119 -0
  156. package/dist/mcp/config/jsonEdit.js.map +1 -0
  157. package/dist/mcp/config/lock.js +102 -0
  158. package/dist/mcp/config/lock.js.map +1 -0
  159. package/dist/mcp/config/proxyBinary.js +211 -0
  160. package/dist/mcp/config/proxyBinary.js.map +1 -0
  161. package/dist/mcp/config/rewrite.js +388 -0
  162. package/dist/mcp/config/rewrite.js.map +1 -0
  163. package/dist/mcp/config/types.js +34 -0
  164. package/dist/mcp/config/types.js.map +1 -0
  165. package/dist/mcp/proxy/audit.js +83 -0
  166. package/dist/mcp/proxy/audit.js.map +1 -0
  167. package/dist/mcp/proxy/authInterceptor.js +119 -0
  168. package/dist/mcp/proxy/authInterceptor.js.map +1 -0
  169. package/dist/mcp/proxy/expand.js +93 -0
  170. package/dist/mcp/proxy/expand.js.map +1 -0
  171. package/dist/mcp/proxy/inject.js +412 -0
  172. package/dist/mcp/proxy/inject.js.map +1 -0
  173. package/dist/mcp/proxy/intercept.js +63 -0
  174. package/dist/mcp/proxy/intercept.js.map +1 -0
  175. package/dist/mcp/proxy/jsonrpc.js +153 -0
  176. package/dist/mcp/proxy/jsonrpc.js.map +1 -0
  177. package/dist/mcp/proxy/log.js +109 -0
  178. package/dist/mcp/proxy/log.js.map +1 -0
  179. package/dist/mcp/proxy/paths.js +57 -0
  180. package/dist/mcp/proxy/paths.js.map +1 -0
  181. package/dist/mcp/proxy/proxy.js +520 -0
  182. package/dist/mcp/proxy/proxy.js.map +1 -0
  183. package/dist/mcp/proxy/serverCheckTimer.js +75 -0
  184. package/dist/mcp/proxy/serverCheckTimer.js.map +1 -0
  185. package/dist/mcp/proxy/sessionLifecycle.js +29 -0
  186. package/dist/mcp/proxy/sessionLifecycle.js.map +1 -0
  187. package/dist/mcp/proxy/spec.js +203 -0
  188. package/dist/mcp/proxy/spec.js.map +1 -0
  189. package/dist/mcp/proxy/sse.js +77 -0
  190. package/dist/mcp/proxy/sse.js.map +1 -0
  191. package/dist/mcp/proxy/upstream.js +2 -0
  192. package/dist/mcp/proxy/upstream.js.map +1 -0
  193. package/dist/mcp/proxy/upstreamHttp.js +499 -0
  194. package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
  195. package/dist/mcp/proxy/upstreamStdio.js +188 -0
  196. package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
  197. package/dist/mcp/proxy/upstreams.js +143 -0
  198. package/dist/mcp/proxy/upstreams.js.map +1 -0
  199. package/dist/mcp/proxy/verifyInterceptor.js +718 -0
  200. package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
  201. package/dist/mcp/proxy/windowsCommand.js +99 -0
  202. package/dist/mcp/proxy/windowsCommand.js.map +1 -0
  203. package/dist/mcp/report/buffer.js +351 -0
  204. package/dist/mcp/report/buffer.js.map +1 -0
  205. package/dist/mcp/report/coalesce.js +165 -0
  206. package/dist/mcp/report/coalesce.js.map +1 -0
  207. package/dist/mcp/report/constants.js +51 -0
  208. package/dist/mcp/report/constants.js.map +1 -0
  209. package/dist/mcp/report/project.js +83 -0
  210. package/dist/mcp/report/project.js.map +1 -0
  211. package/dist/mcp/report/reporter.js +443 -0
  212. package/dist/mcp/report/reporter.js.map +1 -0
  213. package/dist/mcp/report/types.js +3 -0
  214. package/dist/mcp/report/types.js.map +1 -0
  215. package/dist/mcp/report/validate.js +179 -0
  216. package/dist/mcp/report/validate.js.map +1 -0
  217. package/dist/mcp/scan/args.js +228 -0
  218. package/dist/mcp/scan/args.js.map +1 -0
  219. package/dist/mcp/scan/results.js +253 -0
  220. package/dist/mcp/scan/results.js.map +1 -0
  221. package/dist/mcp/scan/types.js +40 -0
  222. package/dist/mcp/scan/types.js.map +1 -0
  223. package/dist/mcp/verify/api.js +514 -0
  224. package/dist/mcp/verify/api.js.map +1 -0
  225. package/dist/mcp/verify/backend.js +143 -0
  226. package/dist/mcp/verify/backend.js.map +1 -0
  227. package/dist/mcp/verify/cache.js +200 -0
  228. package/dist/mcp/verify/cache.js.map +1 -0
  229. package/dist/mcp/verify/contract-errors.js +198 -0
  230. package/dist/mcp/verify/contract-errors.js.map +1 -0
  231. package/dist/mcp/verify/digest.js +91 -0
  232. package/dist/mcp/verify/digest.js.map +1 -0
  233. package/dist/mcp/verify/factory.js +56 -0
  234. package/dist/mcp/verify/factory.js.map +1 -0
  235. package/dist/mcp/verify/identity.js +286 -0
  236. package/dist/mcp/verify/identity.js.map +1 -0
  237. package/dist/mcp/verify/policy-store.js +63 -0
  238. package/dist/mcp/verify/policy-store.js.map +1 -0
  239. package/dist/mcp/verify/policy.js +160 -0
  240. package/dist/mcp/verify/policy.js.map +1 -0
  241. package/dist/mcp/verify/pool.js +27 -0
  242. package/dist/mcp/verify/pool.js.map +1 -0
  243. package/dist/mcp/verify/token-refresh.js +44 -0
  244. package/dist/mcp/verify/token-refresh.js.map +1 -0
  245. package/dist/mcp/verify/token.js +67 -0
  246. package/dist/mcp/verify/token.js.map +1 -0
  247. package/dist/mcp/verify/verifier.js +1166 -0
  248. package/dist/mcp/verify/verifier.js.map +1 -0
  249. package/dist/org-gate.js +1 -1
  250. package/dist/org-gate.js.map +1 -1
  251. package/dist/org.js +146 -0
  252. package/dist/org.js.map +1 -0
  253. package/dist/project-create.js +129 -0
  254. package/dist/project-create.js.map +1 -0
  255. package/dist/prompts.js +21 -0
  256. package/dist/prompts.js.map +1 -1
  257. package/dist/re2.wasm +0 -0
  258. package/dist/status.js +61 -0
  259. package/dist/status.js.map +1 -1
  260. package/dist/uninstall.js +49 -4
  261. package/dist/uninstall.js.map +1 -1
  262. package/dist/utils.js +62 -6
  263. package/dist/utils.js.map +1 -1
  264. package/package.json +10 -3
@@ -0,0 +1,315 @@
1
+ import { isKnownSafe } from './safe-commands.js';
2
+ // ── dangerous reason slugs ──────────────────────────────────────────────────
3
+ const R_RM_RF = 'rm-rf-root-home';
4
+ const R_CHMOD_777 = 'chmod-777-broad';
5
+ const R_ENCODED_PIPE = 'encoded-pipe-to-shell';
6
+ // ── suspect signal slugs (the fixed set, in stable report order) ────────────
7
+ const S_INDIRECT = 'indirect-executable';
8
+ const S_INCOMPLETE = 'incomplete-parse';
9
+ const S_DECODE = 'encoded-decode-step';
10
+ const S_INLINE = 'inline-interpreter-code';
11
+ const S_EXEC_SCRIPT = 'executes-script';
12
+ const S_READ_EXFIL = 'read-then-exfil';
13
+ const S_SUBST = 'substitution-in-args';
14
+ const S_UNCLASSIFIED = 'unclassified';
15
+ // ── command families ─────────────────────────────────────────────────────────
16
+ /** Shells whose stdin / file argument is itself a command. */
17
+ const SHELLS = new Set(['sh', 'bash', 'zsh', 'dash', 'ksh', 'fish', 'ash']);
18
+ /** Script interpreters with an inline-code flag (`-c` / `-e`) or a stdin body. */
19
+ const INLINE_FAMILIES = new Set([
20
+ 'python',
21
+ 'python2',
22
+ 'python3',
23
+ 'node',
24
+ 'nodejs',
25
+ 'ruby',
26
+ 'perl',
27
+ ]);
28
+ /** Commands that read / copy file CONTENT (a secret can leave through them). */
29
+ const READ_EXES = new Set([
30
+ 'cat',
31
+ 'head',
32
+ 'tail',
33
+ 'less',
34
+ 'more',
35
+ 'cp',
36
+ 'mv',
37
+ 'dd',
38
+ 'tee',
39
+ 'od',
40
+ 'strings',
41
+ 'xxd',
42
+ 'base64',
43
+ 'base32',
44
+ 'source',
45
+ '.',
46
+ 'openssl',
47
+ 'gpg',
48
+ ]);
49
+ /** Commands that move bytes over the network (the exfil half of read→exfil). */
50
+ const NET_EXES = new Set([
51
+ 'curl',
52
+ 'wget',
53
+ 'nc',
54
+ 'ncat',
55
+ 'netcat',
56
+ 'telnet',
57
+ 'ssh',
58
+ 'scp',
59
+ 'sftp',
60
+ 'rsync',
61
+ 'ftp',
62
+ 'socat',
63
+ 'http',
64
+ 'https',
65
+ 'httpie',
66
+ 'xh',
67
+ 'aria2c',
68
+ ]);
69
+ // ── dangerous: rm -rf of root/home ───────────────────────────────────────────
70
+ /** `/`, `/*`, `~`, `~/`, `~/*`, `$HOME`, `${HOME}`, `$HOME/`, `$HOME/*`. */
71
+ export function isCatastrophicPathArg(arg) {
72
+ const a = arg.trim();
73
+ if (a === '/' || a === '/*' || a === '/.')
74
+ return true;
75
+ if (a === '~' || a === '~/' || a === '~/*')
76
+ return true;
77
+ return /^\$\{?HOME\}?(?:\/\*?)?$/.test(a);
78
+ }
79
+ function isRmRfCatastrophic(cmd) {
80
+ if (cmd.executable !== 'rm')
81
+ return false;
82
+ if (!(cmd.flagLetters.has('r') && cmd.flagLetters.has('f')))
83
+ return false;
84
+ return cmd.args.some(isCatastrophicPathArg);
85
+ }
86
+ // ── dangerous: chmod 777 over a broad path ───────────────────────────────────
87
+ function hasMode777(cmd) {
88
+ return cmd.args.some((a) => /^0*777$/.test(a) || /^(?:a|ugo)?[=+]rwx$/.test(a));
89
+ }
90
+ /** System / home / root paths: 777 here is dangerous even without `-R`. */
91
+ const CHMOD_BROAD_ABS = new Set([
92
+ '/',
93
+ '/*',
94
+ '~',
95
+ '~/',
96
+ '/etc',
97
+ '/usr',
98
+ '/usr/bin',
99
+ '/usr/local',
100
+ '/var',
101
+ '/bin',
102
+ '/sbin',
103
+ '/lib',
104
+ '/opt',
105
+ '/root',
106
+ '/boot',
107
+ ]);
108
+ /** Working-tree roots: broad only when applied recursively. */
109
+ const CHMOD_BROAD_REL = new Set(['.', './', '*', './*', '..', '../']);
110
+ function isChmod777Broad(cmd) {
111
+ if (cmd.executable !== 'chmod')
112
+ return false;
113
+ if (!hasMode777(cmd))
114
+ return false;
115
+ const recursive = cmd.flagLetters.has('R') || cmd.longFlags.includes('recursive');
116
+ for (const a of cmd.args) {
117
+ if (CHMOD_BROAD_ABS.has(a))
118
+ return true;
119
+ if (/^\$\{?HOME\}?$/.test(a))
120
+ return true;
121
+ if (recursive && CHMOD_BROAD_REL.has(a))
122
+ return true;
123
+ }
124
+ return false;
125
+ }
126
+ // ── dangerous: decode step piped straight into a shell/interpreter ───────────
127
+ function isDecodeStep(cmd) {
128
+ const e = cmd.executable;
129
+ if (e === 'base64' || e === 'base32') {
130
+ return cmd.flagLetters.has('d') || cmd.longFlags.includes('decode');
131
+ }
132
+ if (e === 'xxd') {
133
+ return cmd.flagLetters.has('r') || cmd.longFlags.includes('revert');
134
+ }
135
+ if (e === 'uudecode')
136
+ return true;
137
+ if (e === 'openssl') {
138
+ return (cmd.args.includes('enc') &&
139
+ (cmd.flagLetters.has('d') || cmd.longFlags.includes('decrypt')));
140
+ }
141
+ return false;
142
+ }
143
+ /**
144
+ * A bare interpreter reading its SCRIPT from stdin — `… | sh`, `… | python3`.
145
+ * "Bare" = no script file argument and no inline-code flag, so whatever is
146
+ * piped in IS the program. Combined with a decode step in the same action this
147
+ * is the classic `echo <b64> | base64 -d | sh` loader.
148
+ */
149
+ function isBareStdinInterpreter(cmd) {
150
+ const e = cmd.executable;
151
+ if (SHELLS.has(e)) {
152
+ return cmd.args.length === 0 && !cmd.flagLetters.has('c');
153
+ }
154
+ if (INLINE_FAMILIES.has(e)) {
155
+ return (cmd.args.length === 0 &&
156
+ !cmd.flagLetters.has('c') &&
157
+ !cmd.flagLetters.has('e') &&
158
+ !cmd.flagLetters.has('p') &&
159
+ !cmd.flagLetters.has('v') &&
160
+ !cmd.longFlags.includes('version'));
161
+ }
162
+ return false;
163
+ }
164
+ // ── suspect signals ───────────────────────────────────────────────────────────
165
+ function isInlineInterpreterCode(cmd) {
166
+ if (!INLINE_FAMILIES.has(cmd.executable))
167
+ return false;
168
+ return (cmd.flagLetters.has('c') ||
169
+ cmd.flagLetters.has('e') ||
170
+ cmd.longFlags.includes('eval') ||
171
+ cmd.longFlags.includes('command'));
172
+ }
173
+ function isExecutesScript(cmd) {
174
+ const e = cmd.executable;
175
+ // A shell handed a script FILE (not `-c`, which the normalizer descends into).
176
+ if (SHELLS.has(e) && cmd.args.length > 0 && !cmd.flagLetters.has('c')) {
177
+ return true;
178
+ }
179
+ // `./x`, `../x`, or a relative path `scripts/x.sh` — running a local file.
180
+ const re = cmd.rawExecutable ?? '';
181
+ if (re.startsWith('./') || re.startsWith('../'))
182
+ return true;
183
+ if (re.includes('/') && !re.startsWith('/') && !re.startsWith('~')) {
184
+ return true;
185
+ }
186
+ // `npm run …`, `pnpm run …`, `yarn run …`, `npx …`, `pnpm|yarn dlx …`.
187
+ if (e === 'npm' || e === 'pnpm' || e === 'yarn') {
188
+ const sub = cmd.args[0];
189
+ if (sub === 'run' || sub === 'run-script')
190
+ return true;
191
+ if ((e === 'pnpm' || e === 'yarn') && sub === 'dlx')
192
+ return true;
193
+ }
194
+ if (e === 'npx')
195
+ return true;
196
+ return false;
197
+ }
198
+ /** A dotfile / credential / key / `/etc/shadow`-style path. */
199
+ function looksSecretPath(arg) {
200
+ const a = arg.toLowerCase();
201
+ if (/(?:^|[/@=])\.env(?:\.[a-z0-9_.-]+)?$/.test(a))
202
+ return true;
203
+ if (/(?:^|[/@=])\.(?:netrc|npmrc|pypirc|git-credentials|htpasswd)$/.test(a)) {
204
+ return true;
205
+ }
206
+ if (/(?:^|[/@=])\.?(?:aws|ssh|gnupg|kube|docker)\//.test(a))
207
+ return true;
208
+ if (/id_(?:rsa|dsa|ecdsa|ed25519)/.test(a))
209
+ return true;
210
+ if (/\.(?:pem|key|p12|pfx|keystore|jks|ppk)(?:$|["')\]])/.test(a))
211
+ return true;
212
+ if (/(?:^|[/@=])(?:credentials|secrets?)(?:$|\.)/.test(a))
213
+ return true;
214
+ if (/(?:secret|credential|password|passwd|apikey|api_key|private[_-]?key)/.test(a)) {
215
+ return true;
216
+ }
217
+ if (a === '/etc/shadow' || a === '/etc/passwd')
218
+ return true;
219
+ return false;
220
+ }
221
+ function cmdReadsSecret(cmd) {
222
+ return READ_EXES.has(cmd.executable) && cmd.args.some(looksSecretPath);
223
+ }
224
+ function hasSubstitutionArg(cmd) {
225
+ return cmd.args.some((a) => a.includes('$(') || a.includes('`'));
226
+ }
227
+ // ── assembly ──────────────────────────────────────────────────────────────────
228
+ function uniq(cmds) {
229
+ const seen = new Set();
230
+ const out = [];
231
+ for (const c of cmds) {
232
+ if (!seen.has(c)) {
233
+ seen.add(c);
234
+ out.push(c);
235
+ }
236
+ }
237
+ return out;
238
+ }
239
+ export function triageCommand(result) {
240
+ try {
241
+ const commands = result && Array.isArray(result.commands) ? result.commands : [];
242
+ // 1. DANGEROUS — unambiguous, block without a judge. Checked first.
243
+ const dangerReasons = [];
244
+ const dangerFlagged = [];
245
+ for (const cmd of commands) {
246
+ if (isRmRfCatastrophic(cmd)) {
247
+ if (!dangerReasons.includes(R_RM_RF))
248
+ dangerReasons.push(R_RM_RF);
249
+ dangerFlagged.push(cmd);
250
+ }
251
+ if (isChmod777Broad(cmd)) {
252
+ if (!dangerReasons.includes(R_CHMOD_777))
253
+ dangerReasons.push(R_CHMOD_777);
254
+ dangerFlagged.push(cmd);
255
+ }
256
+ }
257
+ const decoders = commands.filter(isDecodeStep);
258
+ const bareInterps = commands.filter(isBareStdinInterpreter);
259
+ if (decoders.length > 0 && bareInterps.length > 0) {
260
+ dangerReasons.push(R_ENCODED_PIPE);
261
+ dangerFlagged.push(...decoders, ...bareInterps);
262
+ }
263
+ if (dangerReasons.length > 0) {
264
+ return {
265
+ class: 'dangerous',
266
+ reasons: dangerReasons,
267
+ flagged: uniq(dangerFlagged),
268
+ };
269
+ }
270
+ // 2. SUSPECT signals — stable order. Each contributes its slug + drivers.
271
+ const reasons = [];
272
+ const flagged = [];
273
+ const add = (slug, drivers) => {
274
+ if (drivers.length === 0 && slug !== S_INCOMPLETE)
275
+ return;
276
+ if (!reasons.includes(slug))
277
+ reasons.push(slug);
278
+ flagged.push(...drivers);
279
+ };
280
+ add(S_INDIRECT, commands.filter((c) => c.executable === ''));
281
+ if (result && result.incomplete === true) {
282
+ reasons.push(S_INCOMPLETE);
283
+ flagged.push(...commands);
284
+ }
285
+ add(S_DECODE, decoders);
286
+ add(S_INLINE, commands.filter(isInlineInterpreterCode));
287
+ add(S_EXEC_SCRIPT, commands.filter(isExecutesScript));
288
+ const readers = commands.filter(cmdReadsSecret);
289
+ const netCmds = commands.filter((c) => NET_EXES.has(c.executable));
290
+ const netReadingSecret = netCmds.filter((c) => c.args.some(looksSecretPath));
291
+ if ((readers.length > 0 && netCmds.length > 0) || netReadingSecret.length > 0) {
292
+ add(S_READ_EXFIL, uniq([...readers, ...netCmds]));
293
+ }
294
+ add(S_SUBST, commands.filter(hasSubstitutionArg));
295
+ if (reasons.length > 0) {
296
+ return { class: 'suspect', reasons, flagged: uniq(flagged) };
297
+ }
298
+ // 3. SAFE — every command known-safe and the parse was complete.
299
+ if (!(result && result.incomplete === true) && commands.every(isKnownSafe)) {
300
+ return { class: 'safe', reasons: [], flagged: [] };
301
+ }
302
+ // 4. DEFAULT — not known-safe, not dangerous, no signal → suspect.
303
+ return {
304
+ class: 'suspect',
305
+ reasons: [S_UNCLASSIFIED],
306
+ flagged: commands.filter((c) => !isKnownSafe(c)),
307
+ };
308
+ }
309
+ catch {
310
+ // Never throw on the hot path: escalate to "look closer".
311
+ const commands = result && Array.isArray(result.commands) ? result.commands : [];
312
+ return { class: 'suspect', reasons: ['triage-error'], flagged: commands };
313
+ }
314
+ }
315
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/guards-evaluator/triage.ts"],"names":[],"mappings":"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"}