@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,586 @@
1
+ /**
2
+ * Command-position views of a shell command (BACK-174).
3
+ *
4
+ * The rule regexes are written against the flat text of a command and carry
5
+ * a "bypass prefix" of the form
6
+ *
7
+ * (?:^|[;&|]\s*)(?:\w+=\S*\s+)*?(?:(?:bash|sh|python3|node|…)\b[\s\S]*?)?
8
+ *
9
+ * i.e. "at the start of a simple command, possibly after an interpreter".
10
+ * That prefix is right for shell text and wrong for everything a shell
11
+ * command can CARRY without executing it: heredoc bodies written to a file,
12
+ * URL query strings (`&su=` reads as `& su`), quoted data (`echo "a && su"`),
13
+ * code handed to a non-shell interpreter (`python3 -c "…"`). Two real blocks
14
+ * came from exactly those (a dict key `'su': subject`, a Gmail compose URL),
15
+ * and the agent then bypassed the guard with `'s'+'u'` — the worst of both
16
+ * worlds.
17
+ *
18
+ * `buildCommandViews(raw)` turns the raw command into one or more strings the
19
+ * regex is tested against; a rule matches if it matches ANY view:
20
+ *
21
+ * - the MAIN view — the command with shell structure intact (operators,
22
+ * unquoted words, `$(…)`), where
23
+ * · a heredoc body is replaced by `<HEREDOC>`,
24
+ * · the program handed to a general-purpose interpreter (`python3 -c`,
25
+ * `node -e`, `perl -pe`) is replaced by `<CODE>`,
26
+ * · URL query strings are replaced by `?<QUERY>` (unless they contain a
27
+ * substitution, which runs and stays visible),
28
+ * · `; & |` inside a quoted string are neutralised, UNLESS something in
29
+ * the same PIPELINE interprets shell (`bash -c`, `eval`, `xargs`,
30
+ * `ssh`, `sudo`, `npx -c`, `| bash`, …), the string is the value of a
31
+ * code-taking flag (`find -exec`, `git rebase -x`, `--command`), an
32
+ * environment assignment (`GIT_SSH_COMMAND="…" git push`), or it
33
+ * contains a substitution,
34
+ * · agent-harness scratch directories are rewritten to
35
+ * `<AGENT_SCRATCH>/` (see `rewriteScratchDirs`),
36
+ * then run through the BACK-150 data-argument masking (`-m`/`-F`).
37
+ * - one CODE-LINE view per line of a heredoc fed to a shell or interpreter
38
+ * anywhere in its pipeline (`bash <<EOF`, `python3 - <<EOF`,
39
+ * `cat <<EOF | sh`, `psql <<EOF`) and per line of a general-purpose
40
+ * interpreter's `-c` / `-e` program. Each line is tested on its own, so
41
+ * `curl … | bash` on a line is still caught while nothing chains the
42
+ * interpreter name to a word deep inside its code.
43
+ *
44
+ * A heredoc fed to anything else (`cat > file`, `tee`, `git commit -F -`,
45
+ * `kubectl apply -f -`) is content, exactly like the content of a `Write`
46
+ * tool call, which the guard never scans either — so it is masked outright.
47
+ * An UNTERMINATED heredoc is never masked: masking must not widen on
48
+ * malformed input (BACK-150 invariant).
49
+ *
50
+ * Accepted trade-offs, stated so the next reader does not rediscover them:
51
+ * - a dangerous word reachable ONLY through the interpreter-chaining of the
52
+ * prefix (`python3 -c "os.system('sudo x')"`) is no longer matched. That
53
+ * chaining is what produced the false positives, and it never resisted
54
+ * `'su'+'do'`. The lasting fix is on the rule-authoring side: drop the
55
+ * `[\s\S]*?` chaining from the shared prefix; the `<CODE>` extraction
56
+ * here becomes unnecessary the day that lands.
57
+ * - the shell-context allowlists below are finite. A wrapper we do not
58
+ * know that hands a quoted string to a shell has its `; & |` neutralised.
59
+ * Adding a name to SHELL_WRAPPER_RE / CODE_ARG_FLAG_RE is the fix.
60
+ *
61
+ * Pure: no I/O. `lex` is total; the one try/catch exists because this runs
62
+ * inside `evaluate()`, whose catch-all fails CLOSED — a lexer surprise must
63
+ * degrade to "show the regex everything", never to "deny every tool call".
64
+ */
65
+ import { delimiter, win32 } from "node:path";
66
+ import { containsSubstitution, stripDataArgs } from "./preprocess.js";
67
+ // ─── Command classes ─────────────────────────────────────────────────────────
68
+ /** Shells — a quoted argument may be shell code, a heredoc body is shell code. */
69
+ const SHELL_RE = /^(?:sh|bash|zsh|dash|ksh|fish|csh|tcsh|ash|busybox|eval|source|\.)$/;
70
+ /**
71
+ * General-purpose interpreters: their `-c` / `-e` argument is a PROGRAM, not
72
+ * shell code. It is examined line by line, on its own, instead of inline —
73
+ * these are exactly the names the rule prefix chains on.
74
+ */
75
+ const CODE_INTERPRETER_RE = /^(?:python(?:\d+(?:\.\d+)?)?|node|nodejs|deno|bun|ruby|perl|php|lua|Rscript)$/;
76
+ /**
77
+ * Everything whose heredoc is code of some kind (shells, general-purpose
78
+ * interpreters, database clients, AppleScript). Their `-c` / `-e` argument is
79
+ * NOT extracted when they are not in CODE_INTERPRETER_RE: `psql -c "DROP …"`
80
+ * must stay `psql … DROP` for a rule that names both, and `redis-cli -c` is
81
+ * cluster mode, not code.
82
+ */
83
+ const INTERPRETER_RE = /^(?:python(?:\d+(?:\.\d+)?)?|node|nodejs|deno|bun|ruby|perl|php|lua|Rscript|psql|mysql|sqlite3|redis-cli|mongo|mongosh|osascript|expect)$/;
84
+ /**
85
+ * Flags after which a general-purpose interpreter takes its program as the
86
+ * next argument: `-c`, `-e`, `--eval`, and the perl/ruby combined switches
87
+ * (`-pe`, `-ne`, `-lne`). `-p` / `-r` alone are NOT code flags (perl/ruby
88
+ * loop switch, node preload).
89
+ */
90
+ const CODE_FLAG_RE = /^(?:-[lnpwa]*[ce]|--eval)$/;
91
+ /**
92
+ * Commands that hand their arguments to a shell (or to another machine's
93
+ * shell). A quoted string they receive may execute, so its operators stay
94
+ * visible.
95
+ */
96
+ const SHELL_WRAPPER_RE = /^(?:xargs|parallel|ssh|su|sudo|doas|runuser|env|nohup|timeout|watch|time|nice|exec|command|builtin|trap|docker|podman|kubectl|nsenter|chroot|tmux|screen|script|systemd-run|at|batch|npx|bunx|pnpx|npm|pnpm|yarn|make|find|fd|entr|setsid|strace|ltrace|gdb|valgrind|hyperfine)$/;
97
+ /**
98
+ * Flags whose VALUE is a command line, whatever the command (`find -exec`,
99
+ * `git rebase -x`, `--command`). `-c` is deliberately absent: it is the code
100
+ * flag of shells and wrappers, which SHELL_RE / SHELL_WRAPPER_RE already
101
+ * cover, and a count flag for `grep`.
102
+ */
103
+ const CODE_ARG_FLAG_RE = /^(?:-x|--exec|-exec|-execdir|--command|--cmd|-cmd|--run|--shell|--onchange|--exec-command)$/;
104
+ /** `NAME=value` at the start of a simple command (also `env NAME=value`). */
105
+ const ASSIGNMENT_RE = /^[A-Za-z_][A-Za-z0-9_]*=/;
106
+ function basename(word) {
107
+ return win32.basename(word);
108
+ }
109
+ /**
110
+ * A command word the shell resolves only at run time — `$SHELL`, `${SHELL}`,
111
+ * `$(which bash)`, a backtick substitution. It cannot be classified as a known
112
+ * non-shell binary, so it is treated as a shell (fail closed): quoted
113
+ * operators stay visible to the rules instead of being neutralised.
114
+ * (Review of #2986.)
115
+ */
116
+ function isUnresolvedCommand(word) {
117
+ return /[$`]/.test(word);
118
+ }
119
+ function isShell(word) {
120
+ return SHELL_RE.test(basename(word));
121
+ }
122
+ function isCodeInterpreter(word) {
123
+ return CODE_INTERPRETER_RE.test(basename(word));
124
+ }
125
+ function isInterpreter(word) {
126
+ return INTERPRETER_RE.test(basename(word));
127
+ }
128
+ function isShellWrapper(word) {
129
+ return SHELL_WRAPPER_RE.test(basename(word));
130
+ }
131
+ // ─── Scratch-directory whitelist ─────────────────────────────────────────────
132
+ const SCRATCH_PLACEHOLDER = "<AGENT_SCRATCH>/";
133
+ /** Agents whose harness gives the model a per-session temp workspace. */
134
+ const HARNESS_NAMES = "claude|codex|cursor|windsurf|copilot";
135
+ /**
136
+ * `/tmp/claude-501/<project>/<session>/scratchpad/` (Linux) and the same
137
+ * under `/private/tmp` (macOS, where `/tmp` is a symlink). The `<agent>-<x>/`
138
+ * shape is what distinguishes a harness directory from a plain `/tmp/claude/`
139
+ * that anyone could create.
140
+ */
141
+ const POSIX_SCRATCH_RE = new RegExp(`(?:/private)?/tmp/(?:${HARNESS_NAMES})-[^/\\s'"]+/`, "g");
142
+ /** `C:\Users\me\AppData\Local\Temp\claude-501\…\` (any drive, either slash). */
143
+ const WINDOWS_SCRATCH_RE = new RegExp(`[A-Za-z]:[\\\\/](?:[^\\\\/\\s'"]+[\\\\/])*?[Tt]emp[\\\\/](?:${HARNESS_NAMES})-[^\\\\/\\s'"]+[\\\\/]`, "g");
144
+ /**
145
+ * Extra prefixes from `CYBEDEFEND_SCRATCH_DIRS` (path-delimiter separated,
146
+ * like `PATH`), normalised once per distinct env value. Lets a team whitelist a
147
+ * harness we do not know about without waiting for a release.
148
+ */
149
+ let userScratchCache = null;
150
+ function userScratchPrefixes() {
151
+ const key = process.env.CYBEDEFEND_SCRATCH_DIRS ?? "";
152
+ if (userScratchCache && userScratchCache.key === key)
153
+ return userScratchCache.prefixes;
154
+ const prefixes = key
155
+ .split(delimiter)
156
+ .map((p) => p.trim())
157
+ .filter((p) => p.length > 0)
158
+ .map((p) => (p.endsWith("/") || p.endsWith("\\") ? p : p + "/"));
159
+ userScratchCache = { key, prefixes };
160
+ return prefixes;
161
+ }
162
+ /**
163
+ * Rewrite every agent-harness scratch directory in `text` to
164
+ * `<AGENT_SCRATCH>/`. The rest of the path (file name, extension) is kept so
165
+ * rules keyed on those still see them; only the "lives under /tmp" signal is
166
+ * removed — the harness put it there, not a downloaded payload.
167
+ *
168
+ * Exported for tests.
169
+ */
170
+ export function rewriteScratchDirs(text) {
171
+ let out = text
172
+ .replace(POSIX_SCRATCH_RE, SCRATCH_PLACEHOLDER)
173
+ .replace(WINDOWS_SCRATCH_RE, SCRATCH_PLACEHOLDER);
174
+ for (const prefix of userScratchPrefixes())
175
+ out = out.split(prefix).join(SCRATCH_PLACEHOLDER);
176
+ return out;
177
+ }
178
+ // ─── URL query masking ───────────────────────────────────────────────────────
179
+ /**
180
+ * `https://host/path?a=1&su=2#frag` → `https://host/path?<QUERY>`. Scheme,
181
+ * host and path stay visible (host rules, `curl evil.example.com` patterns);
182
+ * only the part where `&key=` legitimately lives is hidden. A query that
183
+ * carries a substitution (`?d=$(id)`) EXECUTES and is left alone.
184
+ */
185
+ const URL_QUERY_RE = /([a-z][a-z0-9+.-]*:\/\/[^\s'"<>?#]*)([?#][^\s'"<>]*)/gi;
186
+ function maskUrlQueries(text) {
187
+ return text.replace(URL_QUERY_RE, (whole, head, tail) => containsSubstitution(tail) ? whole : head + "?<QUERY>");
188
+ }
189
+ // ─── Lexer ───────────────────────────────────────────────────────────────────
190
+ /** Chars a backslash escapes in an unquoted word; elsewhere `\` is literal. */
191
+ const UNQUOTED_ESCAPABLE = new Set([
192
+ " ",
193
+ "\t",
194
+ "\n",
195
+ '"',
196
+ "'",
197
+ "$",
198
+ "`",
199
+ "\\",
200
+ "|",
201
+ "&",
202
+ ";",
203
+ "(",
204
+ ")",
205
+ "<",
206
+ ">",
207
+ "#",
208
+ ]);
209
+ const HEREDOC_DELIM_RE = /^(-?)\s*(?:'([^']*)'|"([^"]*)"|\\?([^\s;&|<>]+))/;
210
+ /** First characters of a control operator — gate before the longest-match scan. */
211
+ const OP_START = new Set(["&", "|", ";", "(", ")"]);
212
+ const OP_LEXEMES = ["&&", "||", "|&", ";;", ";", "|", "&", "(", ")"];
213
+ /**
214
+ * Quote-, substitution- and heredoc-aware lexer. Produces words with their
215
+ * quoted/unquoted parts, control operators (`\n` included), and heredocs whose
216
+ * body has been cut out of the stream (or `body: null` when no terminator
217
+ * line exists).
218
+ */
219
+ function lex(raw) {
220
+ const tokens = [];
221
+ let parts = [];
222
+ let buf = "";
223
+ let quote = "none";
224
+ // Heredocs opened on the current line, resolved at the next unquoted newline.
225
+ let pending = [];
226
+ const flushPart = () => {
227
+ if (buf.length > 0 || quote !== "none")
228
+ parts.push({ text: buf, quote });
229
+ buf = "";
230
+ };
231
+ const flushWord = () => {
232
+ flushPart();
233
+ if (parts.length > 0)
234
+ tokens.push({ kind: "word", parts });
235
+ parts = [];
236
+ };
237
+ const pushOp = (text) => {
238
+ flushWord();
239
+ tokens.push({ kind: "op", text });
240
+ };
241
+ /**
242
+ * Copy a balanced `$( … )` / `<( … )` / `>( … )` span (or a backquoted one)
243
+ * verbatim into `buf`. `start` points at the `$`, `<`, `>` or backquote.
244
+ * Returns the index just past the closer (or the end of input).
245
+ */
246
+ const copySubstitution = (start) => {
247
+ if (raw[start] === "`") {
248
+ buf += "`";
249
+ let i = start + 1;
250
+ while (i < raw.length) {
251
+ const c = raw[i];
252
+ buf += c;
253
+ if (c === "\\" && i + 1 < raw.length) {
254
+ buf += raw[i + 1];
255
+ i += 2;
256
+ continue;
257
+ }
258
+ i++;
259
+ if (c === "`")
260
+ return i;
261
+ }
262
+ return i;
263
+ }
264
+ // Two-char opener `X(`: copy it, then balance parens from depth 1.
265
+ buf += raw[start] + "(";
266
+ let depth = 1;
267
+ let i = start + 2;
268
+ while (i < raw.length) {
269
+ const c = raw[i];
270
+ buf += c;
271
+ if (c === "\\" && i + 1 < raw.length) {
272
+ buf += raw[i + 1];
273
+ i += 2;
274
+ continue;
275
+ }
276
+ i++;
277
+ if (c === "(")
278
+ depth++;
279
+ else if (c === ")") {
280
+ depth--;
281
+ if (depth === 0)
282
+ return i;
283
+ }
284
+ }
285
+ return i;
286
+ };
287
+ /**
288
+ * Resolve heredocs opened on the line that just ended: consume body lines up
289
+ * to the terminator. Returns the index to resume lexing at. The remainder of
290
+ * the terminator line after the delimiter continues as command text — that
291
+ * un-masks EARLIER than a real shell would, i.e. the scanner sees more.
292
+ */
293
+ const readHeredocBodies = (from) => {
294
+ let i = from;
295
+ for (const h of pending) {
296
+ const lines = [];
297
+ let j = i;
298
+ let found = -1;
299
+ while (j <= raw.length) {
300
+ const nl = raw.indexOf("\n", j);
301
+ const line = nl === -1 ? raw.slice(j) : raw.slice(j, nl);
302
+ const candidate = h.strip ? line.replace(/^\t+/, "") : line;
303
+ const trimmed = candidate.replace(/^\s+/, "");
304
+ if (trimmed.startsWith(h.delim) &&
305
+ (trimmed.length === h.delim.length ||
306
+ /\s/.test(trimmed[h.delim.length]))) {
307
+ found = j + line.indexOf(trimmed) + h.delim.length;
308
+ break;
309
+ }
310
+ lines.push(line);
311
+ if (nl === -1)
312
+ break;
313
+ j = nl + 1;
314
+ }
315
+ if (found === -1) {
316
+ // Unterminated: leave the body in the stream; the opener stays a word.
317
+ h.token.body = null;
318
+ break;
319
+ }
320
+ h.token.body = lines;
321
+ i = found;
322
+ }
323
+ pending = [];
324
+ return i;
325
+ };
326
+ let i = 0;
327
+ while (i < raw.length) {
328
+ const c = raw[i];
329
+ if (quote === "single") {
330
+ if (c === "'") {
331
+ flushPart();
332
+ quote = "none";
333
+ }
334
+ else {
335
+ buf += c;
336
+ }
337
+ i++;
338
+ continue;
339
+ }
340
+ if (quote === "double") {
341
+ if (c === '"') {
342
+ flushPart();
343
+ quote = "none";
344
+ i++;
345
+ }
346
+ else if (c === "\\" &&
347
+ i + 1 < raw.length &&
348
+ '"\\$`\n'.includes(raw[i + 1])) {
349
+ if (raw[i + 1] !== "\n")
350
+ buf += raw[i + 1];
351
+ i += 2;
352
+ }
353
+ else if ((c === "$" && raw[i + 1] === "(") || c === "`") {
354
+ i = copySubstitution(i);
355
+ }
356
+ else {
357
+ buf += c;
358
+ i++;
359
+ }
360
+ continue;
361
+ }
362
+ // ── unquoted ──
363
+ if (c === "'" || c === '"') {
364
+ flushPart();
365
+ quote = c === "'" ? "single" : "double";
366
+ i++;
367
+ continue;
368
+ }
369
+ if (c === "\\") {
370
+ const next = raw[i + 1];
371
+ if (next === undefined) {
372
+ buf += c;
373
+ i++;
374
+ }
375
+ else if (next === "\n") {
376
+ i += 2; // line continuation
377
+ }
378
+ else if (UNQUOTED_ESCAPABLE.has(next)) {
379
+ buf += next;
380
+ i += 2;
381
+ }
382
+ else {
383
+ buf += c; // a Windows path separator, `\d` in a regex arg, …
384
+ i++;
385
+ }
386
+ continue;
387
+ }
388
+ if ((c === "$" || c === "<" || c === ">") && raw[i + 1] === "(") {
389
+ i = copySubstitution(i);
390
+ continue;
391
+ }
392
+ if (c === "`") {
393
+ i = copySubstitution(i);
394
+ continue;
395
+ }
396
+ if (c === " " || c === "\t" || c === "\r") {
397
+ flushWord();
398
+ i++;
399
+ continue;
400
+ }
401
+ if (c === "\n") {
402
+ pushOp("\n");
403
+ i++;
404
+ if (pending.length > 0)
405
+ i = readHeredocBodies(i);
406
+ continue;
407
+ }
408
+ if (c === "<" && raw[i + 1] === "<") {
409
+ if (raw[i + 2] === "<") {
410
+ buf += "<<<"; // here-string: a word, not a heredoc opener
411
+ i += 3;
412
+ continue;
413
+ }
414
+ const m = HEREDOC_DELIM_RE.exec(raw.slice(i + 2));
415
+ if (m) {
416
+ flushWord();
417
+ const delim = m[2] ?? m[3] ?? m[4] ?? "";
418
+ const open = raw.slice(i, i + 2 + m[0].length);
419
+ const token = {
420
+ kind: "heredoc",
421
+ open,
422
+ body: null,
423
+ };
424
+ tokens.push(token);
425
+ pending.push({ token, delim, strip: m[1] === "-" });
426
+ i += 2 + m[0].length;
427
+ continue;
428
+ }
429
+ }
430
+ if (c === "&" && raw[i + 1] === ">") {
431
+ buf += "&>";
432
+ i += 2;
433
+ continue;
434
+ }
435
+ if (OP_START.has(c)) {
436
+ const op = OP_LEXEMES.find((o) => raw.startsWith(o, i));
437
+ if (op) {
438
+ pushOp(op);
439
+ i += op.length;
440
+ continue;
441
+ }
442
+ }
443
+ buf += c;
444
+ i++;
445
+ }
446
+ flushWord();
447
+ if (pending.length > 0)
448
+ readHeredocBodies(raw.length);
449
+ return tokens;
450
+ }
451
+ // ─── Views ───────────────────────────────────────────────────────────────────
452
+ function plainText(parts) {
453
+ return parts.map((p) => p.text).join("");
454
+ }
455
+ /** First non-assignment word of every simple command in a pipeline. */
456
+ function commandWords(pipeline) {
457
+ const out = [];
458
+ let expectCommand = true;
459
+ for (const t of pipeline) {
460
+ if (t.kind === "op") {
461
+ expectCommand = true;
462
+ continue;
463
+ }
464
+ if (t.kind !== "word" || !expectCommand)
465
+ continue;
466
+ const text = plainText(t.parts);
467
+ if (ASSIGNMENT_RE.test(text))
468
+ continue;
469
+ out.push(text);
470
+ expectCommand = false;
471
+ }
472
+ return out;
473
+ }
474
+ function codeLines(text) {
475
+ return text
476
+ .split("\n")
477
+ .map((l) => l.trim())
478
+ .filter((l) => l.length > 0);
479
+ }
480
+ /**
481
+ * Build the views described in the module header. `raw` is the command
482
+ * exactly as the agent typed it — quotes intact.
483
+ */
484
+ export function buildCommandViews(raw) {
485
+ if (!raw)
486
+ return [""];
487
+ // Both rewrites are quote-agnostic, so they run on the raw text: a URL is
488
+ // a URL whether or not the agent quoted it (an unquoted `?a=1&b=2` would
489
+ // otherwise lex its `&` as a control operator before the query is hidden).
490
+ const pre = maskUrlQueries(rewriteScratchDirs(raw));
491
+ let tokens;
492
+ try {
493
+ tokens = lex(pre);
494
+ }
495
+ catch {
496
+ return [pre];
497
+ }
498
+ // Split into pipelines: simple commands joined by `|` / `|&` stay together.
499
+ // Context is a property of the PIPELINE, not of the command that receives
500
+ // the quotes — `echo "x; su -" | bash` is data for echo and code for bash.
501
+ const pipelines = [[]];
502
+ for (const t of tokens) {
503
+ if (t.kind === "op" && t.text !== "|" && t.text !== "|&") {
504
+ pipelines.push([t], []);
505
+ }
506
+ else {
507
+ pipelines[pipelines.length - 1].push(t);
508
+ }
509
+ }
510
+ const main = [];
511
+ const extra = [];
512
+ for (const pipeline of pipelines) {
513
+ // The COMMAND word of each simple command in the pipeline (first word
514
+ // that is not a `NAME=value` assignment) decides the context. Arguments
515
+ // do not: `grep su` is not `su`, `echo bash` is not `bash`.
516
+ const commands = commandWords(pipeline);
517
+ const shellContext = commands.some((w) => isShell(w) || isShellWrapper(w) || isUnresolvedCommand(w));
518
+ const hasCodeInterpreter = commands.some((w) => isCodeInterpreter(w));
519
+ const interpreterContext = shellContext || commands.some((w) => isInterpreter(w));
520
+ let extractNextAsCode = false;
521
+ let nextIsCodeArg = false;
522
+ let atCommandStart = true;
523
+ for (const t of pipeline) {
524
+ if (t.kind === "op") {
525
+ // A newline separates commands exactly like `;`, but the rule
526
+ // prefix only knows `[;&|]`. Emit both: the `;` anchors the next
527
+ // command, the `\n` keeps `[^\n]`-bounded rules on their line.
528
+ if (t.text === "\n")
529
+ main.push(";", "\n");
530
+ else
531
+ main.push(t.text);
532
+ extractNextAsCode = false;
533
+ nextIsCodeArg = false;
534
+ atCommandStart = true;
535
+ continue;
536
+ }
537
+ if (t.kind === "heredoc") {
538
+ if (t.body === null) {
539
+ main.push(t.open);
540
+ }
541
+ else {
542
+ main.push("<HEREDOC>");
543
+ if (interpreterContext)
544
+ extra.push(...codeLines(t.body.join("\n")));
545
+ }
546
+ continue;
547
+ }
548
+ const text = plainText(t.parts);
549
+ const unquoted = t.parts.every((p) => p.quote === "none");
550
+ const isAssignment = atCommandStart && ASSIGNMENT_RE.test(text);
551
+ if (!isAssignment)
552
+ atCommandStart = false;
553
+ if (extractNextAsCode) {
554
+ extractNextAsCode = false;
555
+ main.push("<CODE>");
556
+ extra.push(...codeLines(text));
557
+ continue;
558
+ }
559
+ if (hasCodeInterpreter &&
560
+ !shellContext &&
561
+ unquoted &&
562
+ CODE_FLAG_RE.test(text)) {
563
+ extractNextAsCode = true;
564
+ main.push(text);
565
+ continue;
566
+ }
567
+ // A quoted string is data unless something will interpret it as a
568
+ // command line: the pipeline's shell context, a code-taking flag just
569
+ // before it, an environment assignment, or a substitution inside it.
570
+ const keepOperators = shellContext || nextIsCodeArg || isAssignment;
571
+ nextIsCodeArg = unquoted && CODE_ARG_FLAG_RE.test(text);
572
+ const rendered = t.parts
573
+ .map((p) => {
574
+ if (p.quote === "none" ||
575
+ keepOperators ||
576
+ containsSubstitution(p.text))
577
+ return p.text;
578
+ return p.text.replace(/[;&|]/g, " ");
579
+ })
580
+ .join("");
581
+ main.push(rendered);
582
+ }
583
+ }
584
+ return [stripDataArgs(main), ...extra];
585
+ }
586
+ //# sourceMappingURL=command-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-view.js","sourceRoot":"","sources":["../../src/guards-evaluator/command-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * One parser for the boolean environment switches the hook runtime honours
3
+ * (`CYBEDEFEND_HOOK_DEBUG`, `CYBEDEFEND_GUARDS_STRICT`, …), so every site
4
+ * accepts the same spellings. Lives in guards-evaluator because it is the
5
+ * lowest layer: the evaluator must not import from hooks/runtime.
6
+ */
7
+ export function envFlag(name) {
8
+ const v = process.env[name];
9
+ return v === '1' || v === 'true' || v === 'TRUE';
10
+ }
11
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/guards-evaluator/env.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,CAAC;AACnD,CAAC"}