@cybedefend/vibedefend 1.4.7 → 1.6.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 (246) hide show
  1. package/README.md +77 -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 +264 -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 +24873 -5068
  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 +126 -53
  66. package/dist/hooks/runtime/emit.js.map +1 -1
  67. package/dist/hooks/runtime/fetch-rules.js +27 -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 +21 -6
  82. package/dist/hooks/runtime/pre-compact.js.map +1 -1
  83. package/dist/hooks/runtime/resolve.js +108 -17
  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 +226 -0
  92. package/dist/hooks/runtime/session-activation.js.map +1 -0
  93. package/dist/hooks/runtime/session-review.js +174 -46
  94. package/dist/hooks/runtime/session-review.js.map +1 -1
  95. package/dist/hooks/runtime/session-start.js +35 -4
  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 +8 -2
  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 +99 -14
  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 +397 -0
  172. package/dist/mcp/proxy/inject.js.map +1 -0
  173. package/dist/mcp/proxy/intercept.js +37 -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 +53 -0
  180. package/dist/mcp/proxy/paths.js.map +1 -0
  181. package/dist/mcp/proxy/proxy.js +510 -0
  182. package/dist/mcp/proxy/proxy.js.map +1 -0
  183. package/dist/mcp/proxy/spec.js +203 -0
  184. package/dist/mcp/proxy/spec.js.map +1 -0
  185. package/dist/mcp/proxy/sse.js +77 -0
  186. package/dist/mcp/proxy/sse.js.map +1 -0
  187. package/dist/mcp/proxy/upstream.js +2 -0
  188. package/dist/mcp/proxy/upstream.js.map +1 -0
  189. package/dist/mcp/proxy/upstreamHttp.js +499 -0
  190. package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
  191. package/dist/mcp/proxy/upstreamStdio.js +188 -0
  192. package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
  193. package/dist/mcp/proxy/upstreams.js +143 -0
  194. package/dist/mcp/proxy/upstreams.js.map +1 -0
  195. package/dist/mcp/proxy/verifyInterceptor.js +559 -0
  196. package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
  197. package/dist/mcp/proxy/windowsCommand.js +99 -0
  198. package/dist/mcp/proxy/windowsCommand.js.map +1 -0
  199. package/dist/mcp/scan/args.js +228 -0
  200. package/dist/mcp/scan/args.js.map +1 -0
  201. package/dist/mcp/scan/results.js +253 -0
  202. package/dist/mcp/scan/results.js.map +1 -0
  203. package/dist/mcp/scan/types.js +40 -0
  204. package/dist/mcp/scan/types.js.map +1 -0
  205. package/dist/mcp/verify/api.js +475 -0
  206. package/dist/mcp/verify/api.js.map +1 -0
  207. package/dist/mcp/verify/backend.js +143 -0
  208. package/dist/mcp/verify/backend.js.map +1 -0
  209. package/dist/mcp/verify/cache.js +182 -0
  210. package/dist/mcp/verify/cache.js.map +1 -0
  211. package/dist/mcp/verify/contract-errors.js +198 -0
  212. package/dist/mcp/verify/contract-errors.js.map +1 -0
  213. package/dist/mcp/verify/digest.js +91 -0
  214. package/dist/mcp/verify/digest.js.map +1 -0
  215. package/dist/mcp/verify/factory.js +56 -0
  216. package/dist/mcp/verify/factory.js.map +1 -0
  217. package/dist/mcp/verify/identity.js +173 -0
  218. package/dist/mcp/verify/identity.js.map +1 -0
  219. package/dist/mcp/verify/policy-store.js +63 -0
  220. package/dist/mcp/verify/policy-store.js.map +1 -0
  221. package/dist/mcp/verify/policy.js +158 -0
  222. package/dist/mcp/verify/policy.js.map +1 -0
  223. package/dist/mcp/verify/pool.js +27 -0
  224. package/dist/mcp/verify/pool.js.map +1 -0
  225. package/dist/mcp/verify/token-refresh.js +44 -0
  226. package/dist/mcp/verify/token-refresh.js.map +1 -0
  227. package/dist/mcp/verify/token.js +67 -0
  228. package/dist/mcp/verify/token.js.map +1 -0
  229. package/dist/mcp/verify/verifier.js +1009 -0
  230. package/dist/mcp/verify/verifier.js.map +1 -0
  231. package/dist/org-gate.js +1 -1
  232. package/dist/org-gate.js.map +1 -1
  233. package/dist/org.js +146 -0
  234. package/dist/org.js.map +1 -0
  235. package/dist/project-create.js +129 -0
  236. package/dist/project-create.js.map +1 -0
  237. package/dist/prompts.js +21 -0
  238. package/dist/prompts.js.map +1 -1
  239. package/dist/re2.wasm +0 -0
  240. package/dist/status.js +61 -0
  241. package/dist/status.js.map +1 -1
  242. package/dist/uninstall.js +49 -4
  243. package/dist/uninstall.js.map +1 -1
  244. package/dist/utils.js +62 -6
  245. package/dist/utils.js.map +1 -1
  246. package/package.json +10 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-resolve.js","sourceRoot":"","sources":["../../../src/hooks/runtime/script-resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Per-session CybeDefend activation.
3
+ *
4
+ * VibeDefend's hooks are installed machine-wide, so they fire in every folder
5
+ * an agent is opened in: notes, finance folders, unrelated repositories.
6
+ * CybeDefend only has something to say when the folder maps to a CybeDefend
7
+ * project, so SessionStart decides it once per session:
8
+ *
9
+ * - a project is found → the hooks run as usual;
10
+ * - no project → the user gets one short notice and the session is recorded
11
+ * here. When the reason settles the question (no git origin, an origin
12
+ * that is not GitHub/GitLab, no project linked to it, an unlinked folder in
13
+ * opt-in mode), every later hook of
14
+ * the session exits before any git or network work.
15
+ *
16
+ * A project id that appears mid-session in `$CYBEDEFEND_PROJECT_ID` or
17
+ * `.cybedefend/config.json` (`vibedefend link`, the MCP create_project flow)
18
+ * always wins over the record. Reasons that may change on the next try (not
19
+ * signed in, API unreachable) are recorded only so the notice is not repeated;
20
+ * they never switch the hooks off.
21
+ *
22
+ * File: `~/.cybedefend/inactive-sessions.json`, capped, best-effort: any read
23
+ * or write failure reads as "no record", which falls back to the normal
24
+ * per-hook resolution.
25
+ */
26
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
27
+ import { homedir } from 'node:os';
28
+ import { dirname, isAbsolute, join, resolve as resolvePath } from 'node:path';
29
+ import { fileURLToPath } from 'node:url';
30
+ import { SYSTEM_MESSAGE_CLIENTS } from './emit.js';
31
+ import { resolveProjectId, } from './resolve.js';
32
+ /** Reasons that hold for the whole session: no need to look again. */
33
+ const SETTLED_REASONS = new Set([
34
+ 'no-git-origin',
35
+ 'unsupported-remote',
36
+ 'no-linked-project',
37
+ 'opt-in-not-linked',
38
+ ]);
39
+ export function isSettledReason(reason) {
40
+ return SETTLED_REASONS.has(reason);
41
+ }
42
+ /** Cap on recorded sessions — the oldest are dropped past it. */
43
+ const SESSIONS_CAP = 200;
44
+ function defaultStoreFile() {
45
+ const dir = process.env.CYBEDEFEND_BASELINE_DIR ?? join(homedir(), '.cybedefend');
46
+ return join(dir, 'inactive-sessions.json');
47
+ }
48
+ /** Disk-backed store. Never throws. */
49
+ export function defaultInactiveSessionStore(file = defaultStoreFile(), now = Date.now) {
50
+ function load() {
51
+ if (!existsSync(file))
52
+ return {};
53
+ try {
54
+ const parsed = JSON.parse(readFileSync(file, 'utf8'));
55
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
56
+ ? parsed
57
+ : {};
58
+ }
59
+ catch {
60
+ return {};
61
+ }
62
+ }
63
+ function save(map) {
64
+ try {
65
+ mkdirSync(dirname(file), { recursive: true });
66
+ writeFileSync(file, JSON.stringify(map) + '\n', 'utf8');
67
+ }
68
+ catch {
69
+ /* best-effort: the next hook just resolves the project again */
70
+ }
71
+ }
72
+ return {
73
+ get(sessionId) {
74
+ const rec = load()[sessionId];
75
+ if (!rec ||
76
+ typeof rec !== 'object' ||
77
+ typeof rec.cwd !== 'string' ||
78
+ typeof rec.reason !== 'string') {
79
+ return null;
80
+ }
81
+ return rec;
82
+ },
83
+ mark(sessionId, record) {
84
+ const map = load();
85
+ map[sessionId] = { ...record, at: now() };
86
+ const entries = Object.entries(map);
87
+ if (entries.length > SESSIONS_CAP) {
88
+ entries.sort(([, a], [, b]) => (a.at ?? 0) - (b.at ?? 0));
89
+ save(Object.fromEntries(entries.slice(-SESSIONS_CAP)));
90
+ return;
91
+ }
92
+ save(map);
93
+ },
94
+ clear(sessionId) {
95
+ const map = load();
96
+ if (!(sessionId in map))
97
+ return;
98
+ delete map[sessionId];
99
+ save(map);
100
+ },
101
+ };
102
+ }
103
+ /**
104
+ * The agent's session id, whatever the client calls it: `session_id`
105
+ * (Claude Code, Codex), `sessionId` (VS Code), `conversation_id` (Cursor),
106
+ * `trajectory_id` (Windsurf). Null when the payload carries none.
107
+ */
108
+ export function sessionIdOf(stdin) {
109
+ for (const key of ['session_id', 'sessionId', 'conversation_id', 'trajectory_id']) {
110
+ const v = stdin[key];
111
+ if (typeof v === 'string' && v.length > 0)
112
+ return v;
113
+ }
114
+ return null;
115
+ }
116
+ /**
117
+ * The folder the agent is working in, which is where the project is looked
118
+ * up. Not always the hook's own working directory: Cursor runs user-level
119
+ * hooks (`~/.cursor/hooks.json`, where VibeDefend installs them) from
120
+ * `~/.cursor/`, and VS Code Copilot does not document its default.
121
+ *
122
+ * 1. Cursor: `workspace_roots[0]` (sent on every event), else
123
+ * `$CURSOR_PROJECT_DIR`.
124
+ * 2. `cwd` from the payload (Claude Code, Codex, VS Code Copilot).
125
+ * 3. The hook's working directory (Windsurf runs hooks from the workspace
126
+ * root).
127
+ *
128
+ * Only absolute paths are accepted (a `file://` URI is converted); anything
129
+ * else falls through to the next source.
130
+ */
131
+ export function sessionFolderOf(stdin, client, env = process.env) {
132
+ const candidates = [];
133
+ if (client === 'cursor') {
134
+ const roots = stdin.workspace_roots;
135
+ if (Array.isArray(roots))
136
+ candidates.push(roots[0]);
137
+ candidates.push(env.CURSOR_PROJECT_DIR);
138
+ }
139
+ candidates.push(stdin.cwd);
140
+ for (const c of candidates) {
141
+ const folder = absoluteFolder(c);
142
+ if (folder)
143
+ return folder;
144
+ }
145
+ return process.cwd();
146
+ }
147
+ function absoluteFolder(value) {
148
+ if (typeof value !== 'string' || value.length === 0)
149
+ return null;
150
+ let p = value;
151
+ if (p.startsWith('file://')) {
152
+ try {
153
+ p = fileURLToPath(p);
154
+ }
155
+ catch {
156
+ return null;
157
+ }
158
+ }
159
+ return isAbsolute(p) ? resolvePath(p) : null;
160
+ }
161
+ /**
162
+ * True when SessionStart found no CybeDefend project for this session and
163
+ * the reason holds for the whole session. Hooks call this first and exit when
164
+ * it is true, before any git or network work.
165
+ */
166
+ export function isSessionInactive(stdin, deps = {}) {
167
+ try {
168
+ const sessionId = sessionIdOf(stdin);
169
+ if (!sessionId)
170
+ return false;
171
+ const record = (deps.store ?? defaultInactiveSessionStore()).get(sessionId);
172
+ if (!record || !isSettledReason(record.reason))
173
+ return false;
174
+ const cwd = deps.cwd ?? process.cwd();
175
+ if (record.cwd !== cwd)
176
+ return false;
177
+ // A project linked mid-session wins over the record.
178
+ const resolveSync = deps.resolveSync ?? resolveProjectId;
179
+ return !resolveSync(cwd).projectId;
180
+ }
181
+ catch {
182
+ return false;
183
+ }
184
+ }
185
+ function whyInactive(reason, repository) {
186
+ const repo = repository ? `\`${repository}\`` : 'this folder';
187
+ switch (reason) {
188
+ case 'no-git-origin':
189
+ return 'this folder has no `.cybedefend/config.json` and no GitHub or GitLab `origin` remote';
190
+ case 'unsupported-remote':
191
+ return `this folder has no \`.cybedefend/config.json\` and its git \`origin\`${repository ? ` (${repo})` : ''} is not on GitHub or GitLab`;
192
+ case 'no-linked-project':
193
+ return `this folder has no \`.cybedefend/config.json\` and no CybeDefend project with VibeDefend enabled matches ${repo}`;
194
+ case 'not-signed-in':
195
+ return `you are not signed in, so the CybeDefend project for ${repo} could not be looked up`;
196
+ case 'lookup-failed':
197
+ return `the CybeDefend API did not answer, so the project for ${repo} could not be looked up`;
198
+ case 'opt-in-not-linked':
199
+ return 'VibeDefend is set to opt-in and this folder is not linked (no `.cybedefend/config.json`)';
200
+ }
201
+ }
202
+ export function composeInactiveNotice(reason, repository, client) {
203
+ const why = whyInactive(reason, repository);
204
+ const settled = isSettledReason(reason);
205
+ const userMessage = settled
206
+ ? `🛡️ CybeDefend is off for this session: ${why}. Run \`vibedefend link\` in this folder to turn it on.`
207
+ : reason === 'not-signed-in'
208
+ ? `🛡️ CybeDefend is off for now: ${why}. Run \`vibedefend login\` to turn it on.`
209
+ : `🛡️ CybeDefend is off for now: ${why}. It will try again on the next prompt or edit.`;
210
+ const scope = settled
211
+ ? '- Its hooks stay off until this session ends: no rules fetch, no proposal inbox, no Action Guards, no end-of-session review.'
212
+ : '- Its hooks stay quiet until the project can be found.';
213
+ const relay = SYSTEM_MESSAGE_CLIENTS.has(client)
214
+ ? '- The user has already been shown this notice; do not repeat it.'
215
+ : '- Tell the user once, in one short line, that CybeDefend is off for this session and why.';
216
+ const modelContext = [
217
+ '## CybeDefend is not active in this session',
218
+ `CybeDefend found no project for this folder: ${why}.`,
219
+ scope,
220
+ '- Do not call CybeDefend MCP tools, run the CybeDefend workflow or ask for a CybeDefend project id unless the user asks about CybeDefend.',
221
+ relay,
222
+ '',
223
+ ].join('\n');
224
+ return { userMessage, modelContext };
225
+ }
226
+ //# sourceMappingURL=session-activation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-activation.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-activation.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Stop / end-of-session gap-analysis hook.
3
3
  *
4
- * Counts how many code-mutating tool calls happened in the transcript;
5
- * if `>= reviewThreshold` (or `CYBEDEFEND_REVIEW_THRESHOLD`, see
6
- * `resolveReviewThreshold`), emits the cybe-review directive that asks the
4
+ * Counts the code-mutating tool calls no earlier review covered; when the
5
+ * current turn made at least one and the total is `>= reviewThreshold` (or
6
+ * `CYBEDEFEND_REVIEW_THRESHOLD`, see `resolveReviewThreshold`), emits the
7
+ * cybe-review directive that asks the
7
8
  * agent to compare the user's prompt against the rules applied during the
8
9
  * session and, ONLY when a durable/reusable gap stands out, offer to propose
9
10
  * a single missing rule (proposing nothing is the expected default).
@@ -18,6 +19,9 @@ import { sniff, filePathFromPatch } from './sniff.js';
18
19
  import { emitStop } from './emit.js';
19
20
  import { loadRuntimeConfig, readStdinJson } from './config.js';
20
21
  import { DIRECT_PROPOSE_DIRECTIVES, resolveProposalMode, } from './proposal-mode.js';
22
+ import { resolveProjectIdWithApi } from './resolve.js';
23
+ import { defaultReviewSessionStore, } from './review-sessions.js';
24
+ import { isSessionInactive, sessionFolderOf, sessionIdOf, } from './session-activation.js';
21
25
  const COUNTED_TOOLS = new Set([
22
26
  'Edit',
23
27
  'Write',
@@ -26,23 +30,103 @@ const COUNTED_TOOLS = new Set([
26
30
  'pre_write_code',
27
31
  ]);
28
32
  /**
29
- * Stable substring of the gap-analysis directive's header (see
30
- * `composeReviewBody`). Its presence anywhere in the transcript means a prior
31
- * Stop already emitted the review this session — used to de-dup re-firing.
33
+ * Start of the concise Stop `reason` (see `composeStopReason`). Keep it stable:
34
+ * it is how a review already injected on Claude Code is found in the transcript.
32
35
  */
33
- const REVIEW_SENTINEL = 'CybeDefend gap analysis (Stop hook';
36
+ const STOP_REASON_TEXT = 'CybeDefend — before wrapping up, run the end-of-session review';
37
+ const STOP_REASON_PREFIX = `🛡️ ${STOP_REASON_TEXT}`;
34
38
  /**
35
- * Whether the review directive was already injected this session. Scans the
36
- * whole serialized transcript so it catches the sentinel wherever Claude Code
37
- * recorded the block `reason` (turn role/shape varies). Best-effort.
39
+ * Text that marks a review this hook sent: the concise reason, or the full
40
+ * directive's header that older versions sent as the reason.
38
41
  */
39
- function transcriptHasReviewSentinel(transcript) {
42
+ const REVIEW_MARKERS = ['CybeDefend gap analysis (Stop hook', STOP_REASON_TEXT];
43
+ /**
44
+ * Whether this transcript event is a review this hook sent. Only the two
45
+ * entries Claude Code writes for a Stop that blocked count: the
46
+ * "Stop hook feedback:" turn (`isMeta`) and its `hook_blocking_error`
47
+ * attachment. The same text anywhere else is a copy — a pasted prompt, the
48
+ * agent quoting it, a tool call on this file, an `api-request-blob` dump —
49
+ * not a review. Other clients rely on the per-session record.
50
+ */
51
+ function isReviewMarker(event) {
52
+ if (!event || typeof event !== 'object')
53
+ return false;
54
+ const rec = event;
55
+ let carrier;
56
+ if (rec.type === 'user' && rec.isMeta === true) {
57
+ carrier = rec.message;
58
+ }
59
+ else if (rec.type === 'attachment') {
60
+ const attachment = rec.attachment;
61
+ if (attachment?.hookEvent !== 'Stop')
62
+ return false;
63
+ carrier = attachment;
64
+ }
65
+ else {
66
+ return false;
67
+ }
68
+ let s;
40
69
  try {
41
- return JSON.stringify(transcript).includes(REVIEW_SENTINEL);
70
+ s = JSON.stringify(carrier) ?? '';
42
71
  }
43
72
  catch {
44
73
  return false;
45
74
  }
75
+ return REVIEW_MARKERS.some((m) => s.includes(m));
76
+ }
77
+ /**
78
+ * Claude Code records `{ type: 'system', subtype: 'stop_hook_summary' }` once
79
+ * all hooks of a Stop have run, so the last one closes the previous turn.
80
+ * Other clients record nothing like it: their turns are told apart by the
81
+ * per-session record (review-sessions.ts).
82
+ */
83
+ function isStopBoundary(event) {
84
+ if (!event || typeof event !== 'object')
85
+ return false;
86
+ const rec = event;
87
+ return rec.type === 'system' && rec.subtype === 'stop_hook_summary';
88
+ }
89
+ /** Index of the last element matching `pred`, or -1. */
90
+ function lastIndexWhere(arr, pred) {
91
+ for (let i = arr.length - 1; i >= 0; i--)
92
+ if (pred(arr[i]))
93
+ return i;
94
+ return -1;
95
+ }
96
+ /** Edits in the events up to and including index `i` (0 when `i < 0`). */
97
+ function editsThrough(transcript, i) {
98
+ return i < 0 ? 0 : countEdits(transcript.slice(0, i + 1));
99
+ }
100
+ /**
101
+ * Where the session stands, in edits counted from the start of the transcript:
102
+ * - `total`: all of them;
103
+ * - `reviewed`: those an earlier review already covered;
104
+ * - `seen`: those made before the current turn.
105
+ *
106
+ * Two sources, the one that knows more wins: the per-session record (every
107
+ * client, see review-sessions.ts) and what the transcript shows (Claude Code
108
+ * only: the reviews it recorded and its `stop_hook_summary` turn ends). A
109
+ * record holding more edits than the transcript belongs to a transcript that
110
+ * was reset, so it is ignored.
111
+ */
112
+ export function reviewProgress(transcript, record = null) {
113
+ const total = countEdits(transcript);
114
+ const rec = record && record.seen <= total && record.reviewed <= total ? record : null;
115
+ const reviewed = Math.max(rec?.reviewed ?? 0, editsThrough(transcript, lastIndexWhere(transcript, isReviewMarker)));
116
+ const seen = Math.max(rec?.seen ?? 0, editsThrough(transcript, lastIndexWhere(transcript, isStopBoundary)), reviewed);
117
+ return { total, reviewed, seen };
118
+ }
119
+ /** The events from the one holding edit number `n + 1` on: what follows the first `n` edits. */
120
+ function eventsAfterEdits(transcript, n) {
121
+ if (n <= 0)
122
+ return transcript;
123
+ let count = 0;
124
+ for (let i = 0; i < transcript.length; i++) {
125
+ count += countEdits([transcript[i]]);
126
+ if (count > n)
127
+ return transcript.slice(i);
128
+ }
129
+ return [];
46
130
  }
47
131
  /**
48
132
  * Edits needed before the Stop hook fires. `CYBEDEFEND_REVIEW_THRESHOLD` wins
@@ -63,12 +147,10 @@ export async function sessionReviewHook(deps = {}) {
63
147
  const readTranscriptFile = deps.readTranscriptFile ?? defaultReadTranscript;
64
148
  const stdin = await readStdin();
65
149
  const event = sniff(stdin);
66
- // Loop guard: on Claude Code, `emitStop` returns `decision: "block"` so the
67
- // model continues and runs the review; the next Stop then carries
68
- // `stop_hook_active: true`. Re-blocking would loop forever, so no-op on the
69
- // continuation's final stop. (Other clients never set this flag.) Accept the
70
- // boolean `true` or a stringified `'true'` defensively.
71
- if (stdin.stop_hook_active === true || stdin.stop_hook_active === 'true') {
150
+ // Never queue a Cursor follow-up after the user aborted the turn or it
151
+ // errored. Nothing is recorded either: its edits count toward the next turn.
152
+ if (event.client === 'cursor' &&
153
+ (stdin.status === 'aborted' || stdin.status === 'error')) {
72
154
  return;
73
155
  }
74
156
  const config = loadConfig();
@@ -77,23 +159,65 @@ export async function sessionReviewHook(deps = {}) {
77
159
  if (!config.hooks.enableSessionReview)
78
160
  return;
79
161
  const transcript = loadTranscript(stdin, readTranscriptFile);
80
- // Once-per-session de-dup: the Stop hook fires at the end of EVERY turn, and
81
- // `editCount` is recomputed over the whole transcript, so without this a
82
- // `decision: "block"` would re-fire the review on every later turn-end. If a
83
- // prior Stop already injected the directive this session (its sentinel is now
84
- // in the transcript, e.g. via the block `reason`), no-op. Best-effort: if the
85
- // sentinel never lands in the transcript, behaviour is unchanged.
86
- if (transcriptHasReviewSentinel(transcript))
162
+ // The Stop hook fires at the end of EVERY turn, on every client. Edits a
163
+ // previous review already covered must not trigger it again, and a turn that
164
+ // changed no file (a question, a task notification, a message from another
165
+ // session) has nothing to review: skip it.
166
+ const sessionId = sessionIdOf(stdin);
167
+ const store = sessionId ? (deps.reviewStore ?? defaultReviewSessionStore()) : null;
168
+ const record = sessionId && store ? store.get(sessionId) : null;
169
+ const { total, reviewed, seen } = reviewProgress(transcript, record);
170
+ const remember = (reviewedNow) => {
171
+ if (!sessionId || !store)
172
+ return;
173
+ // A session that edited nothing needs no record: no record reads as 0.
174
+ if (!record && total === 0)
175
+ return;
176
+ if (record?.seen === total && record.reviewed === reviewedNow)
177
+ return;
178
+ store.set(sessionId, { seen: total, reviewed: reviewedNow });
179
+ };
180
+ // Loop guard: on Claude Code, Codex and VS Code, `emitStop` returns
181
+ // `decision: "block"` so the model continues and runs the review; the next
182
+ // Stop then carries `stop_hook_active: true` (accepted as the string 'true'
183
+ // too). Cursor's equivalent: `loop_count` counts the follow-up messages stop
184
+ // hooks already sent, so > 0 means the review turn (or another hook's)
185
+ // already ran. Re-blocking would loop forever, so no-op on that Stop — but
186
+ // remember its edits as seen: they are the continuation's own fixes, not a
187
+ // new turn.
188
+ const continuation = stdin.stop_hook_active === true ||
189
+ stdin.stop_hook_active === 'true' ||
190
+ (event.client === 'cursor' &&
191
+ typeof stdin.loop_count === 'number' &&
192
+ stdin.loop_count > 0);
193
+ if (continuation) {
194
+ remember(reviewed);
87
195
  return;
88
- let editCount = countEdits(transcript);
89
- // Dry-run override for hook-debug — pretend the session had N edits.
90
- if (process.env.CYBEDEFEND_DRY_RUN === '1') {
196
+ }
197
+ let editCount = total - reviewed;
198
+ let turnEdits = total - seen;
199
+ const dryRun = process.env.CYBEDEFEND_DRY_RUN === '1';
200
+ if (dryRun) {
201
+ // Dry-run override for hook-debug — pretend the session had N edits.
91
202
  editCount = parseInt(process.env.CYBEDEFEND_DRY_RUN_EDITS ?? '5', 10);
203
+ turnEdits = editCount;
92
204
  }
93
- if (editCount === 0)
205
+ else {
206
+ remember(reviewed);
207
+ }
208
+ if (turnEdits <= 0)
94
209
  return;
95
210
  if (editCount < resolveReviewThreshold(config))
96
211
  return;
212
+ // Last, as it may cost a git call and a gateway lookup: the review only
213
+ // makes sense in a folder that maps to a CybeDefend project. The hooks are
214
+ // machine-wide, so without this it fired in notes, finance folders, etc.
215
+ const folder = sessionFolderOf(stdin, event.client);
216
+ if (isSessionInactive(stdin, { store: deps.sessionStore, cwd: folder }))
217
+ return;
218
+ const { projectId } = await (deps.resolveProject ?? resolveProjectIdWithApi)(folder);
219
+ if (!projectId)
220
+ return;
97
221
  const userPrompt = extractFirstUserPrompt(transcript);
98
222
  const proposalMode = resolveProposalMode(config);
99
223
  let body = composeReviewBody(editCount, event.client, userPrompt, proposalMode);
@@ -103,14 +227,16 @@ export async function sessionReviewHook(deps = {}) {
103
227
  const withDiffScan = config.hooks.enableDiffScan !== false;
104
228
  if (withDiffScan) {
105
229
  // Claude Code records `file_path` as absolute — relativize against the
106
- // session cwd so the directive (and the scan) use repo-relative paths.
107
- const cwd = typeof stdin.cwd === 'string' && stdin.cwd ? stdin.cwd : process.cwd();
230
+ // session folder so the directive (and the scan) use repo-relative paths.
231
+ const unreviewed = eventsAfterEdits(transcript, reviewed);
108
232
  body +=
109
- '\n' + composeDiffScanBody(extractChangedFiles(transcript, undefined, cwd));
233
+ '\n' + composeDiffScanBody(extractChangedFiles(unreviewed, undefined, folder));
110
234
  }
111
235
  // claude-code gets only the concise `reason`; `body` is the full directive
112
236
  // used by the other clients (and as the fallback). See emitStop.
113
237
  emitFn(body, event.client, composeStopReason(withDiffScan, proposalMode));
238
+ if (!dryRun)
239
+ remember(total);
114
240
  }
115
241
  /**
116
242
  * Resolve the transcript to a JS array of "events". Each client packages
@@ -440,9 +566,8 @@ function composeReviewBody(editCount, client, userPrompt, proposalMode) {
440
566
  ' users end up rejecting everything — when in doubt, propose nothing.',
441
567
  '4. If (and only if) one gap clears that bar:',
442
568
  proposalLine,
443
- '5. Otherwise — the normal case — propose nothing and say so:',
444
- ' "🛡️ CybeDefend gap analysis: nothing this session warrants a new',
445
- ' standing rule. No proposals."',
569
+ '5. Otherwise — the normal case — propose nothing: do NOT ask the user',
570
+ ' (no AskUserQuestion) and do not mention the gap analysis.',
446
571
  '',
447
572
  ].join('\n');
448
573
  }
@@ -517,28 +642,31 @@ function composeDiffScanBody(changedFiles) {
517
642
  */
518
643
  function composeStopReason(withDiffScan, proposalMode) {
519
644
  const scan = withDiffScan
520
- ? ', then run a pre-commit `cybe_scan_diff` on the files you changed' +
645
+ ? ' Then run a pre-commit `cybe_scan_diff` on the files you changed' +
521
646
  ' (poll `cybe_scan_status`, read `cybe_scan_findings`) and fix or justify' +
522
- ' each finding'
647
+ ' each finding.'
523
648
  : '';
524
649
  // Claude Code only ever sees this reason (not the full body), so the
525
650
  // auto-propose / non-blocking override has to live here too.
526
- const directPropose = 'if — and only if — one durable gap stands out, propose that single rule ' +
651
+ const directPropose = 'If — and only if — one durable rule is missing, propose that single rule ' +
527
652
  'directly with `cybe_rules_report_missing` (`confirmed_by_user: true`). ';
528
653
  const propose = {
529
- ask: 'for any uncovered security/data concern, offer to propose a rule via ' +
530
- 'AskUserQuestion (`cybe_rules_report_missing` only on an explicit yes)',
654
+ // Ask only when the analysis found a rule: asking "propose a rule?" with
655
+ // nothing to propose is noise.
656
+ ask: 'If — and only if — one durable rule is missing, ask the user via ' +
657
+ 'AskUserQuestion whether to propose it (`cybe_rules_report_missing` only ' +
658
+ 'on an explicit yes). If none is missing — the usual case — do not ask ' +
659
+ 'and do not mention it.',
531
660
  auto: directPropose +
532
661
  'Auto-propose mode: do NOT ask the user (no AskUserQuestion) — they ' +
533
- 'review it at the next session start',
662
+ 'review it at the next session start.',
534
663
  'non-blocking': directPropose +
535
664
  'Non-blocking mode: do NOT ask the user (no AskUserQuestion) — a human ' +
536
- 'reviews the proposal in the CybeDefend dashboard',
665
+ 'reviews the proposal in the CybeDefend dashboard.',
537
666
  };
538
- return ('🛡️ CybeDefend — before wrapping up, run the end-of-session review: ' +
539
- "gap-analyse the request against this session's business rules and, " +
667
+ return (`${STOP_REASON_PREFIX}: ` +
668
+ "gap-analyse the request against this session's business rules. " +
540
669
  propose[proposalMode] +
541
- scan +
542
- '.');
670
+ scan);
543
671
  }
544
672
  //# sourceMappingURL=session-review.js.map