@cybedefend/vibedefend 1.2.4 → 1.3.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 +8 -1
- package/dist/config.js +15 -5
- package/dist/config.js.map +1 -1
- package/dist/doctor.js +23 -6
- package/dist/doctor.js.map +1 -1
- package/dist/guards-evaluator/redact.js +25 -0
- package/dist/guards-evaluator/redact.js.map +1 -1
- package/dist/hook-runner.js +838 -96
- package/dist/hooks/install.js +1 -0
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/runtime/emit.js +35 -0
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/guard-rules-cache.js +24 -9
- package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
- package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
- package/dist/hooks/runtime/judge-cache.js +64 -0
- package/dist/hooks/runtime/judge-cache.js.map +1 -0
- package/dist/hooks/runtime/judge.js +45 -0
- package/dist/hooks/runtime/judge.js.map +1 -0
- package/dist/hooks/runtime/near-miss.js +362 -0
- package/dist/hooks/runtime/near-miss.js.map +1 -0
- package/dist/hooks/runtime/resolve.js +28 -15
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/session-review.js +261 -28
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/sniff.js +1 -1
- package/dist/hooks/runtime/sniff.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/prompts.js +13 -3
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
const RE_CLASS_ESCAPES = new Set([
|
|
2
|
+
's',
|
|
3
|
+
'S',
|
|
4
|
+
'd',
|
|
5
|
+
'D',
|
|
6
|
+
'w',
|
|
7
|
+
'W',
|
|
8
|
+
'b',
|
|
9
|
+
'B',
|
|
10
|
+
'n',
|
|
11
|
+
'r',
|
|
12
|
+
't',
|
|
13
|
+
'f',
|
|
14
|
+
'v',
|
|
15
|
+
'A',
|
|
16
|
+
'Z',
|
|
17
|
+
'z',
|
|
18
|
+
'G',
|
|
19
|
+
]);
|
|
20
|
+
// Characters that are literal inside a command/path token (regex metachars are
|
|
21
|
+
// handled separately and act as token separators).
|
|
22
|
+
const TOKEN_CHARS = /[A-Za-z0-9_\-/=:.@]/;
|
|
23
|
+
function dedupe(xs) {
|
|
24
|
+
return [...new Set(xs.filter((x) => x.length > 0))];
|
|
25
|
+
}
|
|
26
|
+
function basename(p) {
|
|
27
|
+
const parts = p.split('/');
|
|
28
|
+
return parts[parts.length - 1] ?? p;
|
|
29
|
+
}
|
|
30
|
+
function expandTilde(p, homeDir) {
|
|
31
|
+
if (p === '~')
|
|
32
|
+
return homeDir;
|
|
33
|
+
if (p.startsWith('~/'))
|
|
34
|
+
return `${homeDir}/${p.slice(2)}`;
|
|
35
|
+
return p;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Anchor extraction
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Pull literal anchors out of a command regex WITHOUT compiling it. Walks the
|
|
42
|
+
* source char-by-char, flushing a literal buffer on any regex metacharacter,
|
|
43
|
+
* and honouring `\.`, `\/`, `\-` as literal escapes while treating `\s`, `\b`,
|
|
44
|
+
* etc. as separators. Alternation `(a|b)` yields multiple tokens. Anchors that
|
|
45
|
+
* cannot be extracted (pure `.*`, lookaheads only) yield empty arrays — the
|
|
46
|
+
* caller then treats the rule as NOT a near-miss (favouring a low call rate).
|
|
47
|
+
*/
|
|
48
|
+
export function extractCommandAnchors(src) {
|
|
49
|
+
const tokens = [];
|
|
50
|
+
// Escaped shell operators (`\|`, `\>`, `\<`, `\&`) are strong structural
|
|
51
|
+
// anchors — "pipe to shell", "redirect to device" — kept even though they
|
|
52
|
+
// are single chars that the length filter would otherwise drop.
|
|
53
|
+
const opLiterals = [];
|
|
54
|
+
let buf = '';
|
|
55
|
+
const flush = () => {
|
|
56
|
+
if (buf)
|
|
57
|
+
tokens.push(buf);
|
|
58
|
+
buf = '';
|
|
59
|
+
};
|
|
60
|
+
for (let i = 0; i < src.length; i++) {
|
|
61
|
+
const c = src[i];
|
|
62
|
+
if (c === '\\') {
|
|
63
|
+
const nxt = src[i + 1] ?? '';
|
|
64
|
+
i++;
|
|
65
|
+
if ('|><&'.includes(nxt)) {
|
|
66
|
+
flush();
|
|
67
|
+
opLiterals.push(nxt); // structural operator, e.g. curl ... \| bash
|
|
68
|
+
}
|
|
69
|
+
else if (RE_CLASS_ESCAPES.has(nxt)) {
|
|
70
|
+
flush(); // \s \b \d ... — a separator, not a literal
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
buf += nxt; // \. \/ \- ... — the escaped char is a literal
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (c === '[') {
|
|
78
|
+
// Skip a character class entirely — its contents are not literal anchors.
|
|
79
|
+
flush();
|
|
80
|
+
while (i < src.length && src[i] !== ']')
|
|
81
|
+
i++;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (c === '.') {
|
|
85
|
+
// Bare dot = wildcard → separator (escaped dot handled above).
|
|
86
|
+
flush();
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (TOKEN_CHARS.test(c)) {
|
|
90
|
+
buf += c;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Any other metachar: ^ $ * + ? ( ) | { } < > whitespace, etc.
|
|
94
|
+
flush();
|
|
95
|
+
}
|
|
96
|
+
flush();
|
|
97
|
+
const commands = [];
|
|
98
|
+
const flags = [];
|
|
99
|
+
const literals = [];
|
|
100
|
+
for (const raw of tokens) {
|
|
101
|
+
// Strip a leading/trailing quantifier remnant like a bare '=' with nothing.
|
|
102
|
+
const t = raw;
|
|
103
|
+
if (/^--?[A-Za-z][A-Za-z0-9-]*$/.test(t)) {
|
|
104
|
+
flags.push(t);
|
|
105
|
+
}
|
|
106
|
+
else if (/[/=:@]/.test(t) || /\d{1,3}(\.\d{1,3}){2,}/.test(t)) {
|
|
107
|
+
// Contains a path/kv/host separator or looks like an IP → a context literal.
|
|
108
|
+
literals.push(t);
|
|
109
|
+
}
|
|
110
|
+
else if (/^[A-Za-z][A-Za-z0-9_-]{1,}$/.test(t)) {
|
|
111
|
+
// A word ≥2 chars → candidate command name.
|
|
112
|
+
commands.push(t);
|
|
113
|
+
}
|
|
114
|
+
else if (t.length >= 3) {
|
|
115
|
+
literals.push(t);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Coarsen over-specific path literals: `of=/dev/sd` also yields `/dev/` so a
|
|
119
|
+
// near-miss fires on `/dev/nvme0n1`, `/dev/sda`, etc. — not only the exact
|
|
120
|
+
// device the rule spelled out.
|
|
121
|
+
const subLiterals = [];
|
|
122
|
+
for (const lit of literals) {
|
|
123
|
+
const m = lit.match(/\/[A-Za-z]{2,}\//g);
|
|
124
|
+
if (m)
|
|
125
|
+
subLiterals.push(...m);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
commands: dedupe(commands),
|
|
129
|
+
flags: dedupe(flags),
|
|
130
|
+
literals: dedupe([...literals, ...subLiterals, ...opLiterals]),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Pull literal anchors out of a single file-path glob WITHOUT expanding it.
|
|
135
|
+
* `**` / `*` segments are dropped; distinctive dotfiles (".env"), extensions
|
|
136
|
+
* ("*.pem" → ".pem") and named segments ("id_rsa", "shadow") are kept.
|
|
137
|
+
*/
|
|
138
|
+
// Common directory/file-name segments that carry NO secret signal. Keeping them
|
|
139
|
+
// as anchors would make ordinary files (`config.yaml`, `src/…`) near-miss a
|
|
140
|
+
// sensitive-path rule. Dotfiles ("." prefix) and extensions bypass this list.
|
|
141
|
+
const GENERIC_SEGMENTS = new Set([
|
|
142
|
+
'config',
|
|
143
|
+
'conf',
|
|
144
|
+
'configs',
|
|
145
|
+
'settings',
|
|
146
|
+
'data',
|
|
147
|
+
'home',
|
|
148
|
+
'user',
|
|
149
|
+
'users',
|
|
150
|
+
'usr',
|
|
151
|
+
'var',
|
|
152
|
+
'tmp',
|
|
153
|
+
'opt',
|
|
154
|
+
'etc',
|
|
155
|
+
'app',
|
|
156
|
+
'apps',
|
|
157
|
+
'src',
|
|
158
|
+
'lib',
|
|
159
|
+
'bin',
|
|
160
|
+
'dist',
|
|
161
|
+
'build',
|
|
162
|
+
'out',
|
|
163
|
+
'target',
|
|
164
|
+
'public',
|
|
165
|
+
'static',
|
|
166
|
+
'assets',
|
|
167
|
+
'main',
|
|
168
|
+
'index',
|
|
169
|
+
'test',
|
|
170
|
+
'tests',
|
|
171
|
+
'docs',
|
|
172
|
+
'node_modules',
|
|
173
|
+
'vendor',
|
|
174
|
+
'project',
|
|
175
|
+
]);
|
|
176
|
+
export function extractGlobAnchors(glob) {
|
|
177
|
+
const segs = glob.split('/');
|
|
178
|
+
const literals = [];
|
|
179
|
+
let ext = null;
|
|
180
|
+
for (const seg of segs) {
|
|
181
|
+
if (!seg || seg === '**' || seg === '*')
|
|
182
|
+
continue;
|
|
183
|
+
const bare = seg.replace(/[*?]/g, '');
|
|
184
|
+
if (!bare)
|
|
185
|
+
continue;
|
|
186
|
+
if (bare.startsWith('.') && !bare.slice(1).includes('.')) {
|
|
187
|
+
// A dotfile or a star-dot-ext remnant: ".env", ".pem", ".key".
|
|
188
|
+
literals.push(bare);
|
|
189
|
+
if (bare.length <= 6)
|
|
190
|
+
ext = bare;
|
|
191
|
+
}
|
|
192
|
+
else if (bare.includes('.')) {
|
|
193
|
+
// A specific/compound filename (`terraform.tfstate.backup`, `config.json`)
|
|
194
|
+
// — anchor on the FULL literal (basename match), NOT on the trailing
|
|
195
|
+
// extension: `.backup`/`.json` are too generic and would near-miss every
|
|
196
|
+
// such file. Only pure `*.ext` / dotfile globs contribute an ext anchor.
|
|
197
|
+
literals.push(bare);
|
|
198
|
+
}
|
|
199
|
+
else if (bare.length >= 3 && !GENERIC_SEGMENTS.has(bare.toLowerCase())) {
|
|
200
|
+
literals.push(bare);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { ext, literals: dedupe(literals) };
|
|
204
|
+
}
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Per-bucket near-miss checks
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
function nearMissCommand(target, rule) {
|
|
209
|
+
if (!rule.commandRegex)
|
|
210
|
+
return false;
|
|
211
|
+
const { commands, flags, literals } = extractCommandAnchors(rule.commandRegex);
|
|
212
|
+
if (commands.length === 0 && flags.length === 0 && literals.length === 0)
|
|
213
|
+
return false;
|
|
214
|
+
const cmd = target.command;
|
|
215
|
+
const base = basename(cmd);
|
|
216
|
+
const joined = [cmd, ...target.argv].join(' ');
|
|
217
|
+
const flagHits = (fl) => {
|
|
218
|
+
if (fl.startsWith('--'))
|
|
219
|
+
return joined.includes(fl); // long flag: exact substring
|
|
220
|
+
// short combinable flag, e.g. -rf ≡ -fr ≡ -rvf: any dash-token carrying all letters
|
|
221
|
+
const letters = fl.replace(/^-+/, '').split('');
|
|
222
|
+
if (letters.length === 0)
|
|
223
|
+
return false;
|
|
224
|
+
return target.argv.some((t) => t.startsWith('-') && letters.every((ch) => t.includes(ch)));
|
|
225
|
+
};
|
|
226
|
+
const cmdHitCount = commands.filter((a) => cmd === a || base === a || target.argv.includes(a)).length;
|
|
227
|
+
const flagHitCount = flags.filter(flagHits).length;
|
|
228
|
+
const litHitCount = literals.filter((l) => joined.includes(l)).length;
|
|
229
|
+
// A "core" signal (command name or context literal) is required; a lone flag
|
|
230
|
+
// is never enough. When the rule carries ≥2 anchors overall, at least 2
|
|
231
|
+
// distinct signals must hit — so `rm file.txt` (only the `rm` command anchor
|
|
232
|
+
// of an `rm -rf /` rule) is NOT a near-miss, while `rm -rf ~/x` (command +
|
|
233
|
+
// flag) and `wget … && sh …` (downloader + shell) both are.
|
|
234
|
+
const core = cmdHitCount > 0 || litHitCount > 0;
|
|
235
|
+
const totalAnchors = commands.length + flags.length + literals.length;
|
|
236
|
+
const signalCount = cmdHitCount + flagHitCount + litHitCount;
|
|
237
|
+
const threshold = totalAnchors >= 2 ? 2 : 1;
|
|
238
|
+
return core && signalCount >= threshold;
|
|
239
|
+
}
|
|
240
|
+
function nearMissFile(target, rule, homeDir) {
|
|
241
|
+
const globs = rule.filePathGlobs;
|
|
242
|
+
if (!globs || globs.length === 0)
|
|
243
|
+
return false;
|
|
244
|
+
const path = expandTilde(target.path, homeDir);
|
|
245
|
+
const base = basename(path);
|
|
246
|
+
const segs = path.split('/');
|
|
247
|
+
for (const g of globs) {
|
|
248
|
+
const { ext, literals } = extractGlobAnchors(g);
|
|
249
|
+
if (ext && path.endsWith(ext))
|
|
250
|
+
return true;
|
|
251
|
+
for (const l of literals) {
|
|
252
|
+
if (l.startsWith('.')) {
|
|
253
|
+
// Dotfile/extension literal — must appear as a real ".env"-style token.
|
|
254
|
+
if (base.includes(l) || path.includes(`/${l}`) || path.endsWith(l))
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
else if (segs.includes(l) || base.includes(l)) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
function literalsFromGlobList(globs) {
|
|
265
|
+
const out = [];
|
|
266
|
+
for (const g of globs) {
|
|
267
|
+
for (const part of g.split(/[*?]/)) {
|
|
268
|
+
const p = part.replace(/^[._-]+|[._-]+$/g, '');
|
|
269
|
+
if (p.length >= 3)
|
|
270
|
+
out.push(part.length >= 3 ? part : p);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return dedupe(out);
|
|
274
|
+
}
|
|
275
|
+
function nearMissEnv(target, rule) {
|
|
276
|
+
const globs = rule.envNameGlobs;
|
|
277
|
+
if (!globs || globs.length === 0)
|
|
278
|
+
return false;
|
|
279
|
+
const name = target.name;
|
|
280
|
+
for (const g of globs) {
|
|
281
|
+
const lead = g.startsWith('*');
|
|
282
|
+
const trail = g.endsWith('*');
|
|
283
|
+
const core = g.replace(/[*?]/g, '');
|
|
284
|
+
if (core.length < 3)
|
|
285
|
+
continue; // too generic to anchor on
|
|
286
|
+
// Honour the glob's wildcard position: `AWS_*` is a PREFIX (not a
|
|
287
|
+
// substring), `*_KEY` a SUFFIX, `*SECRET*` a contains, `SECRET_KEY` exact.
|
|
288
|
+
if (lead && trail) {
|
|
289
|
+
if (name.includes(core))
|
|
290
|
+
return true;
|
|
291
|
+
}
|
|
292
|
+
else if (trail) {
|
|
293
|
+
if (name.startsWith(core))
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
else if (lead) {
|
|
297
|
+
if (name.endsWith(core))
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
else if (name === core) {
|
|
301
|
+
return true;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return false;
|
|
305
|
+
}
|
|
306
|
+
function nearMissHttp(target, rule) {
|
|
307
|
+
const globs = rule.httpHostGlobs;
|
|
308
|
+
if (!globs || globs.length === 0)
|
|
309
|
+
return false;
|
|
310
|
+
let hostname;
|
|
311
|
+
try {
|
|
312
|
+
hostname = new URL(target.url).hostname;
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
hostname = target.url;
|
|
316
|
+
}
|
|
317
|
+
const literals = literalsFromGlobList(globs);
|
|
318
|
+
// For IP-literal host rules, also anchor on the /16 prefix so a near-miss
|
|
319
|
+
// fires across the link-local metadata range (169.254.170.2, ...), not only
|
|
320
|
+
// the exact address the rule spelled out.
|
|
321
|
+
const prefixes = [];
|
|
322
|
+
for (const l of literals) {
|
|
323
|
+
const m = l.match(/^(\d{1,3}\.\d{1,3})\.\d/);
|
|
324
|
+
if (m)
|
|
325
|
+
prefixes.push(`${m[1]}.`);
|
|
326
|
+
}
|
|
327
|
+
return [...literals, ...prefixes].some((l) => hostname.includes(l));
|
|
328
|
+
}
|
|
329
|
+
function nearMissGit(target, rule) {
|
|
330
|
+
if (rule.gitSubcommand && rule.gitSubcommand.length > 0) {
|
|
331
|
+
return rule.gitSubcommand.includes(target.subcommand);
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
// ---------------------------------------------------------------------------
|
|
336
|
+
// Public entry point
|
|
337
|
+
// ---------------------------------------------------------------------------
|
|
338
|
+
/**
|
|
339
|
+
* Is `req`'s action a near-miss of the (unmatched, catch-eligible) `deny`
|
|
340
|
+
* `rule`? Pure and cheap: no LLM, no regex compile, no glob expansion.
|
|
341
|
+
*/
|
|
342
|
+
export function nearMiss(req, rule) {
|
|
343
|
+
if (rule.toolMatch &&
|
|
344
|
+
rule.toolMatch.length > 0 &&
|
|
345
|
+
!rule.toolMatch.includes(req.tool)) {
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
const { target, homeDir } = req;
|
|
349
|
+
switch (target.type) {
|
|
350
|
+
case 'command':
|
|
351
|
+
return nearMissCommand(target, rule);
|
|
352
|
+
case 'file':
|
|
353
|
+
return nearMissFile(target, rule, homeDir);
|
|
354
|
+
case 'env':
|
|
355
|
+
return nearMissEnv(target, rule);
|
|
356
|
+
case 'http':
|
|
357
|
+
return nearMissHttp(target, rule);
|
|
358
|
+
case 'git':
|
|
359
|
+
return nearMissGit(target, rule);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=near-miss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"near-miss.js","sourceRoot":"","sources":["../../../src/hooks/runtime/near-miss.ts"],"names":[],"mappings":"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"}
|
|
@@ -162,45 +162,58 @@ function resolveTokenLinux(mcpName) {
|
|
|
162
162
|
return null;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
|
-
// ─── Async token resolution with transparent refresh ─────────────────────────
|
|
166
165
|
/**
|
|
167
166
|
* Async variant of `resolveToken` that transparently refreshes the access_token
|
|
168
167
|
* when near expiry using the stored refresh_token.
|
|
169
168
|
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
169
|
+
* Resolution order (first hit wins):
|
|
170
|
+
* 1. CYBEDEFEND_TOKEN env var (CI / scripted use).
|
|
171
|
+
* 2. The new OAuth store via getValidAccessToken (transparent refresh).
|
|
172
|
+
* 3. The legacy keychain lookup (resolveToken) — reached BOTH on a transient
|
|
173
|
+
* OAuth-store error AND when the store requires login (LoginRequiredError:
|
|
174
|
+
* no `vibedefend login` yet, or a rejected refresh token). The MCP server
|
|
175
|
+
* may have been authenticated through the agent's OWN native OAuth (Claude
|
|
176
|
+
* Code / Codex keychain), which is a perfectly valid bearer token. See
|
|
177
|
+
* BACK-124: short-circuiting to null on LoginRequiredError silently
|
|
178
|
+
* disabled every Action Guard for keychain-only users.
|
|
173
179
|
*
|
|
174
|
-
* Returns null when
|
|
175
|
-
*
|
|
176
|
-
* or OAuth store), OR
|
|
177
|
-
* - The refresh_token was rejected by Logto (LoginRequiredError) — in this
|
|
178
|
-
* case local credentials are already cleared; the caller should trigger
|
|
179
|
-
* the UNVERIFIED banner.
|
|
180
|
+
* Returns null ONLY when no source yields a token. The caller then surfaces the
|
|
181
|
+
* loud UNVERIFIED banner (fail-open) instead of hard-blocking the session.
|
|
180
182
|
*
|
|
181
183
|
* Never throws — all errors are converted to null so hook callers remain
|
|
182
184
|
* fail-open.
|
|
183
185
|
*/
|
|
184
|
-
export async function resolveTokenWithRefresh(mcpName) {
|
|
186
|
+
export async function resolveTokenWithRefresh(mcpName, deps = {}) {
|
|
187
|
+
const getValidAccessTokenFn = deps.getValidAccessToken ?? getValidAccessToken;
|
|
188
|
+
const resolveTokenFn = deps.resolveTokenFn ?? resolveToken;
|
|
185
189
|
// 1. Env var takes highest precedence (CI / scripted use).
|
|
186
190
|
const envToken = process.env.CYBEDEFEND_TOKEN;
|
|
187
191
|
if (envToken && envToken.length > 0)
|
|
188
192
|
return envToken;
|
|
189
193
|
// 2. Try the new OAuth-store path (includes transparent refresh).
|
|
190
194
|
try {
|
|
191
|
-
const token = await
|
|
195
|
+
const token = await getValidAccessTokenFn(mcpName);
|
|
192
196
|
if (token)
|
|
193
197
|
return token;
|
|
194
198
|
}
|
|
195
199
|
catch (e) {
|
|
196
200
|
if (e instanceof LoginRequiredError) {
|
|
197
|
-
//
|
|
198
|
-
|
|
201
|
+
// BACK-124: the OAuth store has no usable credential — either the user
|
|
202
|
+
// never ran `vibedefend login`, or the stored refresh token was rejected.
|
|
203
|
+
// Do NOT give up here: the MCP server may have been authenticated through
|
|
204
|
+
// the AGENT's own native OAuth (Claude Code / Codex keychain), which is a
|
|
205
|
+
// perfectly valid bearer token. Fall through to the legacy keychain lookup
|
|
206
|
+
// below. Returning null unconditionally here silently fail-opened the
|
|
207
|
+
// guard on every tool call for anyone who only authenticated via the
|
|
208
|
+
// agent's MCP OAuth (the common case) — that is the .env-not-blocked bug.
|
|
209
|
+
// Only when the legacy lookup is ALSO empty do we return null, and the
|
|
210
|
+
// caller then surfaces the loud UNVERIFIED banner.
|
|
211
|
+
return resolveTokenFn(mcpName);
|
|
199
212
|
}
|
|
200
213
|
// Transient error (network/DNS) — fall through to the legacy path below
|
|
201
214
|
// so a stale-but-unexpired legacy token can still be used.
|
|
202
215
|
}
|
|
203
216
|
// 3. Fall back to the synchronous legacy keychain lookup (pre-PKCE tokens).
|
|
204
|
-
return
|
|
217
|
+
return resolveTokenFn(mcpName);
|
|
205
218
|
}
|
|
206
219
|
//# sourceMappingURL=resolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/hooks/runtime/resolve.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/hooks/runtime/resolve.ts"],"names":[],"mappings":"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"}
|