@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.
- package/README.md +77 -2
- package/dist/api/gateway-request.js +49 -0
- package/dist/api/gateway-request.js.map +1 -0
- package/dist/api/projects.js +67 -0
- package/dist/api/projects.js.map +1 -1
- package/dist/api/repository-link.js +157 -0
- package/dist/api/repository-link.js.map +1 -0
- package/dist/auth/auth-store.js +107 -25
- package/dist/auth/auth-store.js.map +1 -1
- package/dist/auth/auth.js +21 -0
- package/dist/auth/auth.js.map +1 -1
- package/dist/clients/cursor.js +5 -1
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/vscode.js +38 -29
- package/dist/clients/vscode.js.map +1 -1
- package/dist/commands/mcp/allow.js +219 -0
- package/dist/commands/mcp/allow.js.map +1 -0
- package/dist/commands/mcp/connect.js +337 -0
- package/dist/commands/mcp/connect.js.map +1 -0
- package/dist/commands/mcp/index.js +170 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/mcp/proxy.js +264 -0
- package/dist/commands/mcp/proxy.js.map +1 -0
- package/dist/commands/mcp/scan.js +349 -0
- package/dist/commands/mcp/scan.js.map +1 -0
- package/dist/commands/mcp/sync.js +215 -0
- package/dist/commands/mcp/sync.js.map +1 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/diagnostics.js +78 -12
- package/dist/diagnostics.js.map +1 -1
- package/dist/doctor.js +19 -0
- package/dist/doctor.js.map +1 -1
- package/dist/guards-evaluator/analysis-types.js +27 -0
- package/dist/guards-evaluator/analysis-types.js.map +1 -0
- package/dist/guards-evaluator/command-analysis.js +572 -0
- package/dist/guards-evaluator/command-analysis.js.map +1 -0
- package/dist/guards-evaluator/command-view.js +586 -0
- package/dist/guards-evaluator/command-view.js.map +1 -0
- package/dist/guards-evaluator/env.js +11 -0
- package/dist/guards-evaluator/env.js.map +1 -0
- package/dist/guards-evaluator/evaluate.js +91 -41
- package/dist/guards-evaluator/evaluate.js.map +1 -1
- package/dist/guards-evaluator/index.js +2 -1
- package/dist/guards-evaluator/index.js.map +1 -1
- package/dist/guards-evaluator/inline-code.js +259 -0
- package/dist/guards-evaluator/inline-code.js.map +1 -0
- package/dist/guards-evaluator/normalize.js +716 -0
- package/dist/guards-evaluator/normalize.js.map +1 -0
- package/dist/guards-evaluator/preprocess.js +13 -5
- package/dist/guards-evaluator/preprocess.js.map +1 -1
- package/dist/guards-evaluator/redact.js +19 -0
- package/dist/guards-evaluator/redact.js.map +1 -1
- package/dist/guards-evaluator/regex.js +25 -3
- package/dist/guards-evaluator/regex.js.map +1 -1
- package/dist/guards-evaluator/safe-commands.js +155 -0
- package/dist/guards-evaluator/safe-commands.js.map +1 -0
- package/dist/guards-evaluator/triage.js +315 -0
- package/dist/guards-evaluator/triage.js.map +1 -0
- package/dist/hook-runner.js +24873 -5068
- package/dist/hooks/install.js +38 -0
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/runtime/config.js +38 -0
- package/dist/hooks/runtime/config.js.map +1 -1
- package/dist/hooks/runtime/emit.js +126 -53
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +27 -7
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/gateway-http-error.js +34 -0
- package/dist/hooks/runtime/gateway-http-error.js.map +1 -0
- package/dist/hooks/runtime/guard-rules-cache.js +139 -17
- package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
- package/dist/hooks/runtime/guard-violations-buffer.js +321 -48
- package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
- package/dist/hooks/runtime/judge-cache.js +6 -0
- package/dist/hooks/runtime/judge-cache.js.map +1 -1
- package/dist/hooks/runtime/judge-triage.js +193 -0
- package/dist/hooks/runtime/judge-triage.js.map +1 -0
- package/dist/hooks/runtime/judge.js +7 -1
- package/dist/hooks/runtime/judge.js.map +1 -1
- package/dist/hooks/runtime/pre-compact.js +21 -6
- package/dist/hooks/runtime/pre-compact.js.map +1 -1
- package/dist/hooks/runtime/resolve.js +108 -17
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/retry-policy.js +57 -0
- package/dist/hooks/runtime/retry-policy.js.map +1 -0
- package/dist/hooks/runtime/review-sessions.js +74 -0
- package/dist/hooks/runtime/review-sessions.js.map +1 -0
- package/dist/hooks/runtime/script-resolve.js +695 -0
- package/dist/hooks/runtime/script-resolve.js.map +1 -0
- package/dist/hooks/runtime/session-activation.js +226 -0
- package/dist/hooks/runtime/session-activation.js.map +1 -0
- package/dist/hooks/runtime/session-review.js +174 -46
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +35 -4
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/session-writes.js +232 -0
- package/dist/hooks/runtime/session-writes.js.map +1 -0
- package/dist/hooks/runtime/sniff.js +26 -7
- package/dist/hooks/runtime/sniff.js.map +1 -1
- package/dist/hooks/runtime/target-resolve.js +336 -0
- package/dist/hooks/runtime/target-resolve.js.map +1 -0
- package/dist/hooks/runtime/unmapped-tools.js +93 -0
- package/dist/hooks/runtime/unmapped-tools.js.map +1 -0
- package/dist/hooks/runtime/usage-block.js +4 -0
- package/dist/hooks/runtime/usage-block.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +8 -2
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/hooks/runtime/wire-text.js +41 -0
- package/dist/hooks/runtime/wire-text.js.map +1 -0
- package/dist/hooks/runtime/work-dir.js +84 -0
- package/dist/hooks/runtime/work-dir.js.map +1 -0
- package/dist/index.js +45 -12
- package/dist/index.js.map +1 -1
- package/dist/install.js +174 -11
- package/dist/install.js.map +1 -1
- package/dist/link.js +74 -48
- package/dist/link.js.map +1 -1
- package/dist/login.js +99 -14
- package/dist/login.js.map +1 -1
- package/dist/mcp/auth/agent-sign-ins.js +174 -0
- package/dist/mcp/auth/agent-sign-ins.js.map +1 -0
- package/dist/mcp/auth/callback.js +200 -0
- package/dist/mcp/auth/callback.js.map +1 -0
- package/dist/mcp/auth/connect.js +392 -0
- package/dist/mcp/auth/connect.js.map +1 -0
- package/dist/mcp/auth/discovery.js +399 -0
- package/dist/mcp/auth/discovery.js.map +1 -0
- package/dist/mcp/auth/oauth.js +326 -0
- package/dist/mcp/auth/oauth.js.map +1 -0
- package/dist/mcp/auth/probe.js +128 -0
- package/dist/mcp/auth/probe.js.map +1 -0
- package/dist/mcp/auth/secrets.js +446 -0
- package/dist/mcp/auth/secrets.js.map +1 -0
- package/dist/mcp/auth/store.js +260 -0
- package/dist/mcp/auth/store.js.map +1 -0
- package/dist/mcp/auth/tokenSource.js +55 -0
- package/dist/mcp/auth/tokenSource.js.map +1 -0
- package/dist/mcp/config/atomicWrite.js +98 -0
- package/dist/mcp/config/atomicWrite.js.map +1 -0
- package/dist/mcp/config/clients.js +171 -0
- package/dist/mcp/config/clients.js.map +1 -0
- package/dist/mcp/config/cybedefend-servers.js +48 -0
- package/dist/mcp/config/cybedefend-servers.js.map +1 -0
- package/dist/mcp/config/discover.js +114 -0
- package/dist/mcp/config/discover.js.map +1 -0
- package/dist/mcp/config/hook.js +123 -0
- package/dist/mcp/config/hook.js.map +1 -0
- package/dist/mcp/config/index.js +11 -0
- package/dist/mcp/config/index.js.map +1 -0
- package/dist/mcp/config/install.js +132 -0
- package/dist/mcp/config/install.js.map +1 -0
- package/dist/mcp/config/installed.js +37 -0
- package/dist/mcp/config/installed.js.map +1 -0
- package/dist/mcp/config/jsonEdit.js +119 -0
- package/dist/mcp/config/jsonEdit.js.map +1 -0
- package/dist/mcp/config/lock.js +102 -0
- package/dist/mcp/config/lock.js.map +1 -0
- package/dist/mcp/config/proxyBinary.js +211 -0
- package/dist/mcp/config/proxyBinary.js.map +1 -0
- package/dist/mcp/config/rewrite.js +388 -0
- package/dist/mcp/config/rewrite.js.map +1 -0
- package/dist/mcp/config/types.js +34 -0
- package/dist/mcp/config/types.js.map +1 -0
- package/dist/mcp/proxy/audit.js +83 -0
- package/dist/mcp/proxy/audit.js.map +1 -0
- package/dist/mcp/proxy/authInterceptor.js +119 -0
- package/dist/mcp/proxy/authInterceptor.js.map +1 -0
- package/dist/mcp/proxy/expand.js +93 -0
- package/dist/mcp/proxy/expand.js.map +1 -0
- package/dist/mcp/proxy/inject.js +397 -0
- package/dist/mcp/proxy/inject.js.map +1 -0
- package/dist/mcp/proxy/intercept.js +37 -0
- package/dist/mcp/proxy/intercept.js.map +1 -0
- package/dist/mcp/proxy/jsonrpc.js +153 -0
- package/dist/mcp/proxy/jsonrpc.js.map +1 -0
- package/dist/mcp/proxy/log.js +109 -0
- package/dist/mcp/proxy/log.js.map +1 -0
- package/dist/mcp/proxy/paths.js +53 -0
- package/dist/mcp/proxy/paths.js.map +1 -0
- package/dist/mcp/proxy/proxy.js +510 -0
- package/dist/mcp/proxy/proxy.js.map +1 -0
- package/dist/mcp/proxy/spec.js +203 -0
- package/dist/mcp/proxy/spec.js.map +1 -0
- package/dist/mcp/proxy/sse.js +77 -0
- package/dist/mcp/proxy/sse.js.map +1 -0
- package/dist/mcp/proxy/upstream.js +2 -0
- package/dist/mcp/proxy/upstream.js.map +1 -0
- package/dist/mcp/proxy/upstreamHttp.js +499 -0
- package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
- package/dist/mcp/proxy/upstreamStdio.js +188 -0
- package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
- package/dist/mcp/proxy/upstreams.js +143 -0
- package/dist/mcp/proxy/upstreams.js.map +1 -0
- package/dist/mcp/proxy/verifyInterceptor.js +559 -0
- package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
- package/dist/mcp/proxy/windowsCommand.js +99 -0
- package/dist/mcp/proxy/windowsCommand.js.map +1 -0
- package/dist/mcp/scan/args.js +228 -0
- package/dist/mcp/scan/args.js.map +1 -0
- package/dist/mcp/scan/results.js +253 -0
- package/dist/mcp/scan/results.js.map +1 -0
- package/dist/mcp/scan/types.js +40 -0
- package/dist/mcp/scan/types.js.map +1 -0
- package/dist/mcp/verify/api.js +475 -0
- package/dist/mcp/verify/api.js.map +1 -0
- package/dist/mcp/verify/backend.js +143 -0
- package/dist/mcp/verify/backend.js.map +1 -0
- package/dist/mcp/verify/cache.js +182 -0
- package/dist/mcp/verify/cache.js.map +1 -0
- package/dist/mcp/verify/contract-errors.js +198 -0
- package/dist/mcp/verify/contract-errors.js.map +1 -0
- package/dist/mcp/verify/digest.js +91 -0
- package/dist/mcp/verify/digest.js.map +1 -0
- package/dist/mcp/verify/factory.js +56 -0
- package/dist/mcp/verify/factory.js.map +1 -0
- package/dist/mcp/verify/identity.js +173 -0
- package/dist/mcp/verify/identity.js.map +1 -0
- package/dist/mcp/verify/policy-store.js +63 -0
- package/dist/mcp/verify/policy-store.js.map +1 -0
- package/dist/mcp/verify/policy.js +158 -0
- package/dist/mcp/verify/policy.js.map +1 -0
- package/dist/mcp/verify/pool.js +27 -0
- package/dist/mcp/verify/pool.js.map +1 -0
- package/dist/mcp/verify/token-refresh.js +44 -0
- package/dist/mcp/verify/token-refresh.js.map +1 -0
- package/dist/mcp/verify/token.js +67 -0
- package/dist/mcp/verify/token.js.map +1 -0
- package/dist/mcp/verify/verifier.js +1009 -0
- package/dist/mcp/verify/verifier.js.map +1 -0
- package/dist/org-gate.js +1 -1
- package/dist/org-gate.js.map +1 -1
- package/dist/org.js +146 -0
- package/dist/org.js.map +1 -0
- package/dist/project-create.js +129 -0
- package/dist/project-create.js.map +1 -0
- package/dist/prompts.js +21 -0
- package/dist/prompts.js.map +1 -1
- package/dist/re2.wasm +0 -0
- package/dist/status.js +61 -0
- package/dist/status.js.map +1 -1
- package/dist/uninstall.js +49 -4
- package/dist/uninstall.js.map +1 -1
- package/dist/utils.js +62 -6
- package/dist/utils.js.map +1 -1
- 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
|
|
5
|
-
*
|
|
6
|
-
* `resolveReviewThreshold`), emits 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
|
-
*
|
|
30
|
-
*
|
|
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
|
|
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
|
-
*
|
|
36
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
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
|
|
107
|
-
const
|
|
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(
|
|
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
|
|
444
|
-
'
|
|
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
|
-
? '
|
|
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 = '
|
|
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
|
-
|
|
530
|
-
|
|
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 (
|
|
539
|
-
"gap-analyse the request against this session's business rules
|
|
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
|