@cybedefend/vibedefend 1.4.6 → 1.5.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 +10 -0
- package/dist/hook-runner.js +611 -162
- package/dist/hooks/runtime/api.js +29 -2
- package/dist/hooks/runtime/api.js.map +1 -1
- package/dist/hooks/runtime/emit.js +40 -0
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +33 -2
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/guard-rules-cache.js +25 -3
- package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
- package/dist/hooks/runtime/judge.js +10 -2
- package/dist/hooks/runtime/judge.js.map +1 -1
- package/dist/hooks/runtime/pre-compact.js +9 -0
- package/dist/hooks/runtime/pre-compact.js.map +1 -1
- package/dist/hooks/runtime/resolve.js +18 -9
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/session-activation.js +222 -0
- package/dist/hooks/runtime/session-activation.js.map +1 -0
- package/dist/hooks/runtime/session-review.js +13 -3
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +33 -3
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/usage-block.js +199 -0
- package/dist/hooks/runtime/usage-block.js.map +1 -0
- package/dist/hooks/runtime/user-prompt-submit.js +6 -1
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/login.js +22 -3
- package/dist/login.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
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), every later hook of
|
|
13
|
+
* the session exits before any git or network work.
|
|
14
|
+
*
|
|
15
|
+
* A project id that appears mid-session in `$CYBEDEFEND_PROJECT_ID` or
|
|
16
|
+
* `.cybedefend/config.json` (`vibedefend link`, the MCP create_project flow)
|
|
17
|
+
* always wins over the record. Reasons that may change on the next try (not
|
|
18
|
+
* signed in, API unreachable) are recorded only so the notice is not repeated;
|
|
19
|
+
* they never switch the hooks off.
|
|
20
|
+
*
|
|
21
|
+
* File: `~/.cybedefend/inactive-sessions.json`, capped, best-effort: any read
|
|
22
|
+
* or write failure reads as "no record", which falls back to the normal
|
|
23
|
+
* per-hook resolution.
|
|
24
|
+
*/
|
|
25
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
26
|
+
import { homedir } from 'node:os';
|
|
27
|
+
import { dirname, isAbsolute, join, resolve as resolvePath } from 'node:path';
|
|
28
|
+
import { fileURLToPath } from 'node:url';
|
|
29
|
+
import { SYSTEM_MESSAGE_CLIENTS } from './emit.js';
|
|
30
|
+
import { resolveProjectId, } from './resolve.js';
|
|
31
|
+
/** Reasons that hold for the whole session: no need to look again. */
|
|
32
|
+
const SETTLED_REASONS = new Set([
|
|
33
|
+
'no-git-origin',
|
|
34
|
+
'unsupported-remote',
|
|
35
|
+
'no-linked-project',
|
|
36
|
+
]);
|
|
37
|
+
export function isSettledReason(reason) {
|
|
38
|
+
return SETTLED_REASONS.has(reason);
|
|
39
|
+
}
|
|
40
|
+
/** Cap on recorded sessions — the oldest are dropped past it. */
|
|
41
|
+
const SESSIONS_CAP = 200;
|
|
42
|
+
function defaultStoreFile() {
|
|
43
|
+
const dir = process.env.CYBEDEFEND_BASELINE_DIR ?? join(homedir(), '.cybedefend');
|
|
44
|
+
return join(dir, 'inactive-sessions.json');
|
|
45
|
+
}
|
|
46
|
+
/** Disk-backed store. Never throws. */
|
|
47
|
+
export function defaultInactiveSessionStore(file = defaultStoreFile(), now = Date.now) {
|
|
48
|
+
function load() {
|
|
49
|
+
if (!existsSync(file))
|
|
50
|
+
return {};
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
53
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
54
|
+
? parsed
|
|
55
|
+
: {};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function save(map) {
|
|
62
|
+
try {
|
|
63
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
64
|
+
writeFileSync(file, JSON.stringify(map) + '\n', 'utf8');
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* best-effort: the next hook just resolves the project again */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
get(sessionId) {
|
|
72
|
+
const rec = load()[sessionId];
|
|
73
|
+
if (!rec ||
|
|
74
|
+
typeof rec !== 'object' ||
|
|
75
|
+
typeof rec.cwd !== 'string' ||
|
|
76
|
+
typeof rec.reason !== 'string') {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return rec;
|
|
80
|
+
},
|
|
81
|
+
mark(sessionId, record) {
|
|
82
|
+
const map = load();
|
|
83
|
+
map[sessionId] = { ...record, at: now() };
|
|
84
|
+
const entries = Object.entries(map);
|
|
85
|
+
if (entries.length > SESSIONS_CAP) {
|
|
86
|
+
entries.sort(([, a], [, b]) => (a.at ?? 0) - (b.at ?? 0));
|
|
87
|
+
save(Object.fromEntries(entries.slice(-SESSIONS_CAP)));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
save(map);
|
|
91
|
+
},
|
|
92
|
+
clear(sessionId) {
|
|
93
|
+
const map = load();
|
|
94
|
+
if (!(sessionId in map))
|
|
95
|
+
return;
|
|
96
|
+
delete map[sessionId];
|
|
97
|
+
save(map);
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The agent's session id, whatever the client calls it: `session_id`
|
|
103
|
+
* (Claude Code, Codex), `sessionId` (VS Code), `conversation_id` (Cursor),
|
|
104
|
+
* `trajectory_id` (Windsurf). Null when the payload carries none.
|
|
105
|
+
*/
|
|
106
|
+
export function sessionIdOf(stdin) {
|
|
107
|
+
for (const key of ['session_id', 'sessionId', 'conversation_id', 'trajectory_id']) {
|
|
108
|
+
const v = stdin[key];
|
|
109
|
+
if (typeof v === 'string' && v.length > 0)
|
|
110
|
+
return v;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The folder the agent is working in, which is where the project is looked
|
|
116
|
+
* up. Not always the hook's own working directory: Cursor runs user-level
|
|
117
|
+
* hooks (`~/.cursor/hooks.json`, where VibeDefend installs them) from
|
|
118
|
+
* `~/.cursor/`, and VS Code Copilot does not document its default.
|
|
119
|
+
*
|
|
120
|
+
* 1. Cursor: `workspace_roots[0]` (sent on every event), else
|
|
121
|
+
* `$CURSOR_PROJECT_DIR`.
|
|
122
|
+
* 2. `cwd` from the payload (Claude Code, Codex, VS Code Copilot).
|
|
123
|
+
* 3. The hook's working directory (Windsurf runs hooks from the workspace
|
|
124
|
+
* root).
|
|
125
|
+
*
|
|
126
|
+
* Only absolute paths are accepted (a `file://` URI is converted); anything
|
|
127
|
+
* else falls through to the next source.
|
|
128
|
+
*/
|
|
129
|
+
export function sessionFolderOf(stdin, client, env = process.env) {
|
|
130
|
+
const candidates = [];
|
|
131
|
+
if (client === 'cursor') {
|
|
132
|
+
const roots = stdin.workspace_roots;
|
|
133
|
+
if (Array.isArray(roots))
|
|
134
|
+
candidates.push(roots[0]);
|
|
135
|
+
candidates.push(env.CURSOR_PROJECT_DIR);
|
|
136
|
+
}
|
|
137
|
+
candidates.push(stdin.cwd);
|
|
138
|
+
for (const c of candidates) {
|
|
139
|
+
const folder = absoluteFolder(c);
|
|
140
|
+
if (folder)
|
|
141
|
+
return folder;
|
|
142
|
+
}
|
|
143
|
+
return process.cwd();
|
|
144
|
+
}
|
|
145
|
+
function absoluteFolder(value) {
|
|
146
|
+
if (typeof value !== 'string' || value.length === 0)
|
|
147
|
+
return null;
|
|
148
|
+
let p = value;
|
|
149
|
+
if (p.startsWith('file://')) {
|
|
150
|
+
try {
|
|
151
|
+
p = fileURLToPath(p);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return isAbsolute(p) ? resolvePath(p) : null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* True when SessionStart found no CybeDefend project for this session and
|
|
161
|
+
* the reason holds for the whole session. Hooks call this first and exit when
|
|
162
|
+
* it is true, before any git or network work.
|
|
163
|
+
*/
|
|
164
|
+
export function isSessionInactive(stdin, deps = {}) {
|
|
165
|
+
try {
|
|
166
|
+
const sessionId = sessionIdOf(stdin);
|
|
167
|
+
if (!sessionId)
|
|
168
|
+
return false;
|
|
169
|
+
const record = (deps.store ?? defaultInactiveSessionStore()).get(sessionId);
|
|
170
|
+
if (!record || !isSettledReason(record.reason))
|
|
171
|
+
return false;
|
|
172
|
+
const cwd = deps.cwd ?? process.cwd();
|
|
173
|
+
if (record.cwd !== cwd)
|
|
174
|
+
return false;
|
|
175
|
+
// A project linked mid-session wins over the record.
|
|
176
|
+
const resolveSync = deps.resolveSync ?? resolveProjectId;
|
|
177
|
+
return !resolveSync(cwd).projectId;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function whyInactive(reason, repository) {
|
|
184
|
+
const repo = repository ? `\`${repository}\`` : 'this folder';
|
|
185
|
+
switch (reason) {
|
|
186
|
+
case 'no-git-origin':
|
|
187
|
+
return 'this folder has no `.cybedefend/config.json` and no GitHub or GitLab `origin` remote';
|
|
188
|
+
case 'unsupported-remote':
|
|
189
|
+
return `this folder has no \`.cybedefend/config.json\` and its git \`origin\`${repository ? ` (${repo})` : ''} is not on GitHub or GitLab`;
|
|
190
|
+
case 'no-linked-project':
|
|
191
|
+
return `this folder has no \`.cybedefend/config.json\` and no CybeDefend project with VibeDefend enabled matches ${repo}`;
|
|
192
|
+
case 'not-signed-in':
|
|
193
|
+
return `you are not signed in, so the CybeDefend project for ${repo} could not be looked up`;
|
|
194
|
+
case 'lookup-failed':
|
|
195
|
+
return `the CybeDefend API did not answer, so the project for ${repo} could not be looked up`;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
export function composeInactiveNotice(reason, repository, client) {
|
|
199
|
+
const why = whyInactive(reason, repository);
|
|
200
|
+
const settled = isSettledReason(reason);
|
|
201
|
+
const userMessage = settled
|
|
202
|
+
? `🛡️ CybeDefend is off for this session: ${why}. Run \`vibedefend link\` in this folder to turn it on.`
|
|
203
|
+
: reason === 'not-signed-in'
|
|
204
|
+
? `🛡️ CybeDefend is off for now: ${why}. Run \`vibedefend login\` to turn it on.`
|
|
205
|
+
: `🛡️ CybeDefend is off for now: ${why}. It will try again on the next prompt or edit.`;
|
|
206
|
+
const scope = settled
|
|
207
|
+
? '- Its hooks stay off until this session ends: no rules fetch, no proposal inbox, no Action Guards, no end-of-session review.'
|
|
208
|
+
: '- Its hooks stay quiet until the project can be found.';
|
|
209
|
+
const relay = SYSTEM_MESSAGE_CLIENTS.has(client)
|
|
210
|
+
? '- The user has already been shown this notice; do not repeat it.'
|
|
211
|
+
: '- Tell the user once, in one short line, that CybeDefend is off for this session and why.';
|
|
212
|
+
const modelContext = [
|
|
213
|
+
'## CybeDefend is not active in this session',
|
|
214
|
+
`CybeDefend found no project for this folder: ${why}.`,
|
|
215
|
+
scope,
|
|
216
|
+
'- Do not call CybeDefend MCP tools, run the CybeDefend workflow or ask for a CybeDefend project id unless the user asks about CybeDefend.',
|
|
217
|
+
relay,
|
|
218
|
+
'',
|
|
219
|
+
].join('\n');
|
|
220
|
+
return { userMessage, modelContext };
|
|
221
|
+
}
|
|
222
|
+
//# 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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"}
|
|
@@ -18,6 +18,8 @@ import { sniff, filePathFromPatch } from './sniff.js';
|
|
|
18
18
|
import { emitStop } from './emit.js';
|
|
19
19
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
20
20
|
import { DIRECT_PROPOSE_DIRECTIVES, resolveProposalMode, } from './proposal-mode.js';
|
|
21
|
+
import { resolveProjectIdWithApi } from './resolve.js';
|
|
22
|
+
import { isSessionInactive, sessionFolderOf, } from './session-activation.js';
|
|
21
23
|
const COUNTED_TOOLS = new Set([
|
|
22
24
|
'Edit',
|
|
23
25
|
'Write',
|
|
@@ -94,6 +96,15 @@ export async function sessionReviewHook(deps = {}) {
|
|
|
94
96
|
return;
|
|
95
97
|
if (editCount < resolveReviewThreshold(config))
|
|
96
98
|
return;
|
|
99
|
+
// Last, as it may cost a git call and a gateway lookup: the review only
|
|
100
|
+
// makes sense in a folder that maps to a CybeDefend project. The hooks are
|
|
101
|
+
// machine-wide, so without this it fired in notes, finance folders, etc.
|
|
102
|
+
const folder = sessionFolderOf(stdin, event.client);
|
|
103
|
+
if (isSessionInactive(stdin, { store: deps.sessionStore, cwd: folder }))
|
|
104
|
+
return;
|
|
105
|
+
const { projectId } = await (deps.resolveProject ?? resolveProjectIdWithApi)(folder);
|
|
106
|
+
if (!projectId)
|
|
107
|
+
return;
|
|
97
108
|
const userPrompt = extractFirstUserPrompt(transcript);
|
|
98
109
|
const proposalMode = resolveProposalMode(config);
|
|
99
110
|
let body = composeReviewBody(editCount, event.client, userPrompt, proposalMode);
|
|
@@ -103,10 +114,9 @@ export async function sessionReviewHook(deps = {}) {
|
|
|
103
114
|
const withDiffScan = config.hooks.enableDiffScan !== false;
|
|
104
115
|
if (withDiffScan) {
|
|
105
116
|
// Claude Code records `file_path` as absolute — relativize against the
|
|
106
|
-
// session
|
|
107
|
-
const cwd = typeof stdin.cwd === 'string' && stdin.cwd ? stdin.cwd : process.cwd();
|
|
117
|
+
// session folder so the directive (and the scan) use repo-relative paths.
|
|
108
118
|
body +=
|
|
109
|
-
'\n' + composeDiffScanBody(extractChangedFiles(transcript, undefined,
|
|
119
|
+
'\n' + composeDiffScanBody(extractChangedFiles(transcript, undefined, folder));
|
|
110
120
|
}
|
|
111
121
|
// claude-code gets only the concise `reason`; `body` is the full directive
|
|
112
122
|
// used by the other clients (and as the fallback). See emitStop.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-review.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-review.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-review.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
import { sniff } from './sniff.js';
|
|
12
12
|
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
13
13
|
import { fetchProposalsCount } from './api.js';
|
|
14
|
-
import { emitContext } from './emit.js';
|
|
14
|
+
import { emitContext, emitSessionNotice } from './emit.js';
|
|
15
|
+
import { composeInactiveNotice, defaultInactiveSessionStore, sessionFolderOf, sessionIdOf, } from './session-activation.js';
|
|
15
16
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
16
17
|
import { isNonBlockingMode, NON_BLOCKING_INBOX_DIRECTIVE, } from './proposal-mode.js';
|
|
17
18
|
import { selfUpdateCheck } from './self-update-check.js';
|
|
@@ -21,6 +22,22 @@ import { pkg } from '../../version.js';
|
|
|
21
22
|
function emitSessionStartContext(body, client) {
|
|
22
23
|
emitContext(body, client, 'SessionStart');
|
|
23
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* No project for this folder: tell the user once per session, and record the
|
|
27
|
+
* session so the other hooks skip it. A repeat SessionStart for the same
|
|
28
|
+
* session, folder and reason (resume, compact, Windsurf's every-turn event)
|
|
29
|
+
* stays silent.
|
|
30
|
+
*/
|
|
31
|
+
function announceInactive(resolution, sessionId, cwd, store, client, emitNoticeFn) {
|
|
32
|
+
const reason = resolution.inactiveReason ?? 'no-linked-project';
|
|
33
|
+
if (sessionId) {
|
|
34
|
+
const prior = store.get(sessionId);
|
|
35
|
+
if (prior && prior.cwd === cwd && prior.reason === reason)
|
|
36
|
+
return;
|
|
37
|
+
store.mark(sessionId, { cwd, reason });
|
|
38
|
+
}
|
|
39
|
+
emitNoticeFn(composeInactiveNotice(reason, resolution.repository, client), client);
|
|
40
|
+
}
|
|
24
41
|
export async function sessionStartHook(deps = {}) {
|
|
25
42
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
26
43
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
@@ -32,6 +49,7 @@ export async function sessionStartHook(deps = {}) {
|
|
|
32
49
|
// body lands inside Codex's `additionalContext` JSON envelope (and as
|
|
33
50
|
// plain markdown for everyone else). See emit.ts for the rationale.
|
|
34
51
|
const emitFn = deps.emitFn ?? emitSessionStartContext;
|
|
52
|
+
const emitNoticeFn = deps.emitNoticeFn ?? emitSessionNotice;
|
|
35
53
|
const stdin = await readStdin();
|
|
36
54
|
const event = sniff(stdin);
|
|
37
55
|
const config = loadConfig();
|
|
@@ -44,9 +62,21 @@ export async function sessionStartHook(deps = {}) {
|
|
|
44
62
|
});
|
|
45
63
|
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
46
64
|
// gateway call) when no env var / config.json projectId exists.
|
|
47
|
-
const
|
|
48
|
-
|
|
65
|
+
const folder = sessionFolderOf(stdin, event.client);
|
|
66
|
+
const resolution = await resolveProject(folder);
|
|
67
|
+
const { projectId, apiBase: configApiBase } = resolution;
|
|
68
|
+
const sessionStore = deps.sessionStore ?? defaultInactiveSessionStore();
|
|
69
|
+
const sessionId = sessionIdOf(stdin);
|
|
70
|
+
if (!projectId) {
|
|
71
|
+
// The hooks are machine-wide: this folder may have nothing to do with
|
|
72
|
+
// CybeDefend. Say so once, and record it so the other hooks of this
|
|
73
|
+
// session stay off (see session-activation.ts).
|
|
74
|
+
announceInactive(resolution, sessionId, folder, sessionStore, event.client, emitNoticeFn);
|
|
49
75
|
return;
|
|
76
|
+
}
|
|
77
|
+
// A project was found after all (resume / compact after `vibedefend link`).
|
|
78
|
+
if (sessionId)
|
|
79
|
+
sessionStore.clear(sessionId);
|
|
50
80
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
51
81
|
// Dry-run for hook-debug — emit a sentinel without hitting the API.
|
|
52
82
|
if (process.env.CYBEDEFEND_DRY_RUN === '1') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VibeDefend usage billing — what the hook does when the gateway says an
|
|
3
|
+
* organisation's usage is blocked or close to its limit.
|
|
4
|
+
*
|
|
5
|
+
* The gateway answers a refused unit with HTTP 402 and the body
|
|
6
|
+
* `{ success: false, code: 'VIBEDEFEND_BLOCKED', reason, unit, message }`, and
|
|
7
|
+
* flags a successful answer close to a limit with the header
|
|
8
|
+
* `x-vibedefend-usage-warning: <unit>:<approaching_limit|limit_reached>`.
|
|
9
|
+
*
|
|
10
|
+
* A block is NOT an outage: it must not trip the "policy engine unreachable"
|
|
11
|
+
* banner on every tool call, nor be retried on every call. It is told to the
|
|
12
|
+
* user once per session, in a fixed sentence per reason. The server's
|
|
13
|
+
* `message`, `reason` and `unit` are never printed as such: each is compared
|
|
14
|
+
* against the fixed values below, and only the matched literal picks a
|
|
15
|
+
* sentence (an unknown value reads as `unknown`).
|
|
16
|
+
*/
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { homedir } from 'node:os';
|
|
19
|
+
import { dirname, join } from 'node:path';
|
|
20
|
+
export const BLOCKED_CODE = 'VIBEDEFEND_BLOCKED';
|
|
21
|
+
export const USAGE_WARNING_HEADER = 'x-vibedefend-usage-warning';
|
|
22
|
+
const UNITS = ['injection', 'judgment', 'diff_scan'];
|
|
23
|
+
const REASONS = [
|
|
24
|
+
'free_tier_exhausted',
|
|
25
|
+
'cap_reached',
|
|
26
|
+
'unpaid',
|
|
27
|
+
'product_inactive',
|
|
28
|
+
];
|
|
29
|
+
const WARNINGS = [
|
|
30
|
+
'approaching_limit',
|
|
31
|
+
'limit_reached',
|
|
32
|
+
];
|
|
33
|
+
function pick(allowed, value) {
|
|
34
|
+
return allowed.find((v) => v === value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read a gateway answer as a VibeDefend block. `null` for anything else —
|
|
38
|
+
* another status, another code, a body that is not JSON — which the caller
|
|
39
|
+
* keeps treating as it always has (fail-open).
|
|
40
|
+
*
|
|
41
|
+
* Consumes the body of a 402 only; any other response is left untouched.
|
|
42
|
+
*/
|
|
43
|
+
export async function readVibedefendBlock(res) {
|
|
44
|
+
if (res.status !== 402)
|
|
45
|
+
return null;
|
|
46
|
+
let body;
|
|
47
|
+
try {
|
|
48
|
+
body = await res.json();
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (!body || typeof body !== 'object')
|
|
54
|
+
return null;
|
|
55
|
+
const root = body;
|
|
56
|
+
const data = root.data && typeof root.data === 'object'
|
|
57
|
+
? root.data
|
|
58
|
+
: root;
|
|
59
|
+
const source = data.code === BLOCKED_CODE ? data : root;
|
|
60
|
+
if (source.code !== BLOCKED_CODE)
|
|
61
|
+
return null;
|
|
62
|
+
return {
|
|
63
|
+
reason: pick(REASONS, source.reason) ?? 'unknown',
|
|
64
|
+
unit: pick(UNITS, source.unit) ?? 'unknown',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Read the usage warning header of a successful answer, `null` if absent or not one of the fixed values. */
|
|
68
|
+
export function readUsageWarning(res) {
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = res.headers?.get?.(USAGE_WARNING_HEADER);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
if (typeof raw !== 'string')
|
|
77
|
+
return null;
|
|
78
|
+
const parts = raw.trim().split(':');
|
|
79
|
+
if (parts.length !== 2)
|
|
80
|
+
return null;
|
|
81
|
+
const unit = pick(UNITS, parts[0]);
|
|
82
|
+
const warning = pick(WARNINGS, parts[1]);
|
|
83
|
+
if (!unit || !warning)
|
|
84
|
+
return null;
|
|
85
|
+
return { unit, warning };
|
|
86
|
+
}
|
|
87
|
+
const UNIT_LABEL = {
|
|
88
|
+
injection: 'Security rules injection',
|
|
89
|
+
judgment: 'Action Guards judgments',
|
|
90
|
+
diff_scan: 'Diff scans',
|
|
91
|
+
unknown: 'Part of VibeDefend',
|
|
92
|
+
};
|
|
93
|
+
/** What stops when the unit is blocked. */
|
|
94
|
+
const UNIT_EFFECT = {
|
|
95
|
+
injection: 'no security or business rules are added to your edits',
|
|
96
|
+
judgment: 'Action Guards are off for this session',
|
|
97
|
+
diff_scan: 'no diff scan can be started',
|
|
98
|
+
unknown: 'part of VibeDefend is paused',
|
|
99
|
+
};
|
|
100
|
+
/** One fixed sentence per reason. The unit only picks among fixed labels. */
|
|
101
|
+
export function blockSentence(block) {
|
|
102
|
+
const label = UNIT_LABEL[block.unit];
|
|
103
|
+
const effect = UNIT_EFFECT[block.unit];
|
|
104
|
+
switch (block.reason) {
|
|
105
|
+
case 'free_tier_exhausted':
|
|
106
|
+
return (`VibeDefend paused: ${label} used up this month's free tier, so ${effect}. ` +
|
|
107
|
+
'An administrator of your organisation can add a card in the VibeDefend usage page to continue.');
|
|
108
|
+
case 'cap_reached':
|
|
109
|
+
return (`VibeDefend paused: ${label} reached the monthly spending cap of your organisation, so ${effect}. ` +
|
|
110
|
+
'An administrator can raise the cap in the VibeDefend usage page.');
|
|
111
|
+
case 'unpaid':
|
|
112
|
+
return ("VibeDefend paused: your organisation's last VibeDefend invoice is unpaid, so rules, Action Guards and diff scans are off. " +
|
|
113
|
+
'An administrator can update the card in the VibeDefend usage page.');
|
|
114
|
+
case 'product_inactive':
|
|
115
|
+
return ('VibeDefend is not active for your organisation, so rules, Action Guards and diff scans are off. ' +
|
|
116
|
+
'An administrator can activate it in the CybeDefend dashboard.');
|
|
117
|
+
default:
|
|
118
|
+
return (`VibeDefend paused: ${label} is blocked for your organisation, so ${effect}. ` +
|
|
119
|
+
'An administrator can check the VibeDefend usage page.');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function warningSentence(w) {
|
|
123
|
+
const label = UNIT_LABEL[w.unit];
|
|
124
|
+
if (w.warning === 'approaching_limit') {
|
|
125
|
+
return (`VibeDefend: ${label} has used 80 % of this month's allowance of your organisation. ` +
|
|
126
|
+
'An administrator can follow it in the VibeDefend usage page.');
|
|
127
|
+
}
|
|
128
|
+
return (`VibeDefend: ${label} has reached this month's limit of your organisation; the next requests will be refused. ` +
|
|
129
|
+
'An administrator can add a card or raise the cap in the VibeDefend usage page.');
|
|
130
|
+
}
|
|
131
|
+
/** Reasons that stop every unit: told once per session, whatever the unit. */
|
|
132
|
+
const ORG_WIDE_REASONS = new Set([
|
|
133
|
+
'unpaid',
|
|
134
|
+
'product_inactive',
|
|
135
|
+
]);
|
|
136
|
+
function blockKey(block) {
|
|
137
|
+
return ORG_WIDE_REASONS.has(block.reason)
|
|
138
|
+
? `block:${block.reason}`
|
|
139
|
+
: `block:${block.reason}:${block.unit}`;
|
|
140
|
+
}
|
|
141
|
+
/** Bounded, like the other per-session trackers of the hook. */
|
|
142
|
+
const NOTICES_CAP = 300;
|
|
143
|
+
export function defaultUsageNoticesFile() {
|
|
144
|
+
const dir = process.env.CYBEDEFEND_BASELINE_DIR ?? join(homedir(), '.cybedefend');
|
|
145
|
+
return join(dir, 'usage-notices-sessions.json');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Once-per-session notices, kept on disk because every hook call is its own
|
|
149
|
+
* process. Without a session id there is nothing to dedupe on, so the sentence
|
|
150
|
+
* is always printed (the same choice as the judge's warn-once helper).
|
|
151
|
+
* Never throws: an unreadable or unwritable tracker only means printing again.
|
|
152
|
+
*/
|
|
153
|
+
export function makeUsageNotifier(opts = {}) {
|
|
154
|
+
const file = opts.file ?? defaultUsageNoticesFile();
|
|
155
|
+
const write = opts.write ??
|
|
156
|
+
((line) => {
|
|
157
|
+
try {
|
|
158
|
+
process.stderr.write(line);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// best-effort
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
function load() {
|
|
165
|
+
try {
|
|
166
|
+
if (!existsSync(file))
|
|
167
|
+
return [];
|
|
168
|
+
const data = JSON.parse(readFileSync(file, 'utf8'));
|
|
169
|
+
return Array.isArray(data.seen)
|
|
170
|
+
? data.seen.filter((s) => typeof s === 'string')
|
|
171
|
+
: [];
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function once(sessionId, key, sentence) {
|
|
178
|
+
if (sessionId) {
|
|
179
|
+
const marker = `${sessionId}|${key}`;
|
|
180
|
+
const seen = load();
|
|
181
|
+
if (seen.includes(marker))
|
|
182
|
+
return null;
|
|
183
|
+
try {
|
|
184
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
185
|
+
writeFileSync(file, JSON.stringify({ seen: [...seen, marker].slice(-NOTICES_CAP) }), 'utf8');
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// non-fatal
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
write(`[VibeDefend] ${sentence}\n`);
|
|
192
|
+
return sentence;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
notifyBlock: (sessionId, block) => once(sessionId, blockKey(block), blockSentence(block)),
|
|
196
|
+
notifyWarning: (sessionId, w) => once(sessionId, `warning:${w.unit}:${w.warning}`, warningSentence(w)),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=usage-block.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-block.js","sourceRoot":"","sources":["../../../src/hooks/runtime/usage-block.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,7 @@ import { fetchProposalsCount } from './api.js';
|
|
|
41
41
|
import { emit } from './emit.js';
|
|
42
42
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
43
43
|
import { isNonBlockingMode, NON_BLOCKING_INBOX_DIRECTIVE, } from './proposal-mode.js';
|
|
44
|
+
import { isSessionInactive, sessionFolderOf, } from './session-activation.js';
|
|
44
45
|
/** Cap on persisted entries — drops oldest when exceeded. */
|
|
45
46
|
const SESSIONS_CAP = 100;
|
|
46
47
|
/** Default filename for the disk-backed tracker. */
|
|
@@ -110,9 +111,13 @@ export async function userPromptSubmitHook(deps = {}) {
|
|
|
110
111
|
const config = loadConfig();
|
|
111
112
|
if (!config)
|
|
112
113
|
return;
|
|
114
|
+
// SessionStart found no CybeDefend project for this session: stay off.
|
|
115
|
+
const folder = sessionFolderOf(stdin, event.client);
|
|
116
|
+
if (isSessionInactive(stdin, { store: deps.sessionStore, cwd: folder }))
|
|
117
|
+
return;
|
|
113
118
|
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
114
119
|
// gateway call) when no env var / config.json projectId exists.
|
|
115
|
-
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
120
|
+
const { projectId, apiBase: configApiBase } = await resolveProject(folder);
|
|
116
121
|
if (!projectId)
|
|
117
122
|
return; // silent no-op — see file header
|
|
118
123
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|