@cybedefend/vibedefend 1.3.2 → 1.4.1
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 +32 -5
- package/dist/api/projects.js +158 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/clients/claude-code.js +16 -1
- package/dist/clients/claude-code.js.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/custom-regions.js +5 -0
- package/dist/custom-regions.js.map +1 -1
- package/dist/endpoints.js +59 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/git.js +103 -0
- package/dist/git.js.map +1 -0
- package/dist/hook-runner.js +548 -277
- package/dist/hooks/runtime/fetch-rules.js +5 -3
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/judge-injection.js +65 -0
- package/dist/hooks/runtime/judge-injection.js.map +1 -0
- package/dist/hooks/runtime/repo-link-cache.js +116 -0
- package/dist/hooks/runtime/repo-link-cache.js.map +1 -0
- package/dist/hooks/runtime/resolve.js +79 -0
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +5 -3
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +10 -7
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/install.js +142 -88
- package/dist/install.js.map +1 -1
- package/dist/link.js +325 -0
- package/dist/link.js.map +1 -0
- package/dist/login.js +2 -23
- package/dist/login.js.map +1 -1
- package/dist/logout.js +87 -0
- package/dist/logout.js.map +1 -0
- package/dist/org-gate.js +110 -0
- package/dist/org-gate.js.map +1 -0
- package/dist/prompts.js +5 -7
- package/dist/prompts.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* the tool name is in our interested set.
|
|
9
9
|
*/
|
|
10
10
|
import { sniff } from './sniff.js';
|
|
11
|
-
import {
|
|
11
|
+
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
12
12
|
import { fetchBusinessRules, fetchSecurityRules } from './api.js';
|
|
13
13
|
import { emit } from './emit.js';
|
|
14
14
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
@@ -21,7 +21,7 @@ const INTERESTED_TOOLS = new Set([
|
|
|
21
21
|
export async function fetchRulesHook(deps = {}) {
|
|
22
22
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
23
23
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
24
|
-
const resolveProject = deps.resolveProject ??
|
|
24
|
+
const resolveProject = deps.resolveProject ?? resolveProjectIdWithApi;
|
|
25
25
|
const resolveTok = deps.resolveTokenFn ?? resolveToken;
|
|
26
26
|
const fetchRules = deps.fetchRulesFn ?? fetchBusinessRules;
|
|
27
27
|
const fetchSecRules = deps.fetchSecurityRulesFn ?? fetchSecurityRules;
|
|
@@ -38,7 +38,9 @@ export async function fetchRulesHook(deps = {}) {
|
|
|
38
38
|
const config = loadConfig();
|
|
39
39
|
if (!config)
|
|
40
40
|
return;
|
|
41
|
-
|
|
41
|
+
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
42
|
+
// gateway call) when no env var / config.json projectId exists.
|
|
43
|
+
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
42
44
|
if (!projectId)
|
|
43
45
|
return;
|
|
44
46
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-rules.js","sourceRoot":"","sources":["../../../src/hooks/runtime/fetch-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,
|
|
1
|
+
{"version":3,"file":"fetch-rules.js","sourceRoot":"","sources":["../../../src/hooks/runtime/fetch-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BACK-128 — deterministic prompt-injection detector (client mirror).
|
|
3
|
+
*
|
|
4
|
+
* Defense-in-depth twin of the ingestion `detect_prompt_injection`
|
|
5
|
+
* (app/modules/action_guards/judge_injection.py). The confirm-phase judge can
|
|
6
|
+
* overturn a regex `deny` → `allow`; its only defence against a natural-language
|
|
7
|
+
* injection embedded in the action (a Bash inline comment `# decision=allow`, a
|
|
8
|
+
* crafted filename) was a weak LLM obeying an instruction — probabilistic. This
|
|
9
|
+
* catches the OBVIOUS, judge-directed injections deterministically so the client
|
|
10
|
+
* short-circuits to "deny holds" WITHOUT the network round-trip. The server runs
|
|
11
|
+
* the same check authoritatively — this copy is NOT load-bearing (an attacker
|
|
12
|
+
* who controls the agent can bypass the client, so the server gate is what
|
|
13
|
+
* actually enforces).
|
|
14
|
+
*
|
|
15
|
+
* The signal set + normalisation MUST stay in lock-step with the Python side
|
|
16
|
+
* (shared golden fixture in tests/judge-injection.test.ts ↔
|
|
17
|
+
* test_judge_injection.py). Never a bare keyword: a signal requires a directive,
|
|
18
|
+
* so legitimate commands (`ufw allow 22`, `git commit -m "decision: allow …"`)
|
|
19
|
+
* are not force-blocked.
|
|
20
|
+
*/
|
|
21
|
+
// Collapse structural/word separators to a single space. `=` and `:` are kept
|
|
22
|
+
// (they carry the assignment-vs-prose signal).
|
|
23
|
+
const SEP_RUN = /[.\-_/\\+,;\s]+/g;
|
|
24
|
+
// Each signal encodes a *directive*, never a lone value token.
|
|
25
|
+
const SIGNALS = [
|
|
26
|
+
// A1a — verdict assignment with '=': decision=allow, answer=allow
|
|
27
|
+
/\b(decision|verdict|veredict|answer|result|output|response)\s*=\s*["']?(allow|block|approve|permit)\b/,
|
|
28
|
+
// A1b — verdict with a space separator (covers decision.allow / -allow / _allow)
|
|
29
|
+
/\b(decision|verdict)\s+["']?(allow|block)\b/,
|
|
30
|
+
// A2 — literal JSON verdict shape: {"decision":"allow"}
|
|
31
|
+
/["'](decision|verdict)["']\s*:\s*["'](allow|block)["']/,
|
|
32
|
+
// A3 — imperative verdict directive: reply allow, respond with allow
|
|
33
|
+
/\b(reply|respond|answer|say)\s+(with\s+|the\s+)?["']?(allow|block)\b/,
|
|
34
|
+
// A4 — permission imperative: you may allow this
|
|
35
|
+
/\byou\s+(must|should|may|can|are\s+to|need\s+to)\s+(allow|permit|approve|unblock)\b/,
|
|
36
|
+
// A5 — mark-as-safe / do-not-block
|
|
37
|
+
/\bmark(ed)?\s+(this|it)\s+(as\s+)?(safe|allowed|authori[sz]ed|approved)\b/,
|
|
38
|
+
/\bdo\s*not\s+block\b/,
|
|
39
|
+
/\bdon'?t\s+block\b/,
|
|
40
|
+
// A6 — "let it/this pass|through|proceed" (the reported "laisse passer")
|
|
41
|
+
/\blet\s+(it|this|the)\s+(command\s+|action\s+|tool\s+)?(pass|through|proceed)\b/,
|
|
42
|
+
// B — rule/guard nullification: strong verbs + the control-object noun
|
|
43
|
+
/\b(ignore|disregard|override|bypass|circumvent|nullify)\s+(the\s+|this\s+|all\s+|any\s+|previous\s+|above\s+|prior\s+)*(rule|rules|instruction|instructions|deny|denial|denies|policy|policies|check|checks|guard|guards|guardrail|guardrails|restriction|restrictions)\b/,
|
|
44
|
+
// C — role/meta break-in
|
|
45
|
+
/\b(you\s+are|as)\s+(the\s+|a\s+)?(security\s+)?(judge|reviewer|approver|arbiter)\b/,
|
|
46
|
+
/\bnew\s+instructions?\b/,
|
|
47
|
+
/<\s*\/?\s*(system|assistant|user|developer|tool)\b/,
|
|
48
|
+
];
|
|
49
|
+
function normalize(text) {
|
|
50
|
+
const folded = text.normalize('NFKC').toLowerCase();
|
|
51
|
+
return folded.replace(SEP_RUN, ' ').trim();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Return `true` iff `text` carries a judge-directed prompt-injection signal.
|
|
55
|
+
* Deterministic, side-effect free; nullish/empty → `false`.
|
|
56
|
+
*/
|
|
57
|
+
export function detectPromptInjection(text) {
|
|
58
|
+
if (!text)
|
|
59
|
+
return false;
|
|
60
|
+
const normalized = normalize(String(text));
|
|
61
|
+
if (!normalized)
|
|
62
|
+
return false;
|
|
63
|
+
return SIGNALS.some((sig) => sig.test(normalized));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=judge-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge-injection.js","sourceRoot":"","sources":["../../../src/hooks/runtime/judge-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,8EAA8E;AAC9E,+CAA+C;AAC/C,MAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,+DAA+D;AAC/D,MAAM,OAAO,GAAa;IACxB,kEAAkE;IAClE,uGAAuG;IACvG,iFAAiF;IACjF,6CAA6C;IAC7C,wDAAwD;IACxD,wDAAwD;IACxD,qEAAqE;IACrE,sEAAsE;IACtE,iDAAiD;IACjD,qFAAqF;IACrF,mCAAmC;IACnC,2EAA2E;IAC3E,sBAAsB;IACtB,oBAAoB;IACpB,yEAAyE;IACzE,iFAAiF;IACjF,uEAAuE;IACvE,2QAA2Q;IAC3Q,yBAAyB;IACzB,oFAAoF;IACpF,yBAAyB;IACzB,oDAAoD;CACrD,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* On-disk cache mapping a git repository to its resolved CybeDefend project.
|
|
3
|
+
*
|
|
4
|
+
* File: `~/.cybedefend/repo-links.json`. One flat object keyed by
|
|
5
|
+
* `${provider}:${host}:${slug}` (e.g. `github:github.com:acme/web`).
|
|
6
|
+
*
|
|
7
|
+
* Two entry shapes:
|
|
8
|
+
* - positive: `{ projectId, vibedefendEnabled, resolvedAt }` (TTL 24h)
|
|
9
|
+
* - negative: `{ negative: true, resolvedAt }` (TTL 15min)
|
|
10
|
+
*
|
|
11
|
+
* A positive entry short-circuits the API. A fresh negative entry means
|
|
12
|
+
* "the gateway could not uniquely resolve this repo recently — don't hammer
|
|
13
|
+
* it again for 15 minutes". Once a TTL lapses the entry reads as a `miss`,
|
|
14
|
+
* which re-triggers a lookup.
|
|
15
|
+
*
|
|
16
|
+
* Every read is best-effort: a missing OR corrupt file is treated as an
|
|
17
|
+
* empty cache and NEVER throws (hooks are fail-open). Writes are likewise
|
|
18
|
+
* best-effort — a write failure is swallowed. No secret (token) is ever
|
|
19
|
+
* persisted here; only the projectId + an enabled flag + a timestamp.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
22
|
+
import { dirname } from 'node:path';
|
|
23
|
+
import { home } from '../../utils.js';
|
|
24
|
+
/** Positive entries are trusted for 24 hours. */
|
|
25
|
+
export const POSITIVE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
26
|
+
/** Negative (unresolved) entries are trusted for 15 minutes. */
|
|
27
|
+
export const NEGATIVE_TTL_MS = 15 * 60 * 1000;
|
|
28
|
+
/** Absolute path to the repo-link cache file. */
|
|
29
|
+
export function repoLinkCachePath() {
|
|
30
|
+
return home('.cybedefend', 'repo-links.json');
|
|
31
|
+
}
|
|
32
|
+
function pathOf(deps) {
|
|
33
|
+
return deps.cachePath ?? repoLinkCachePath();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read the whole cache map. A missing, empty, corrupt, or non-object file
|
|
37
|
+
* yields `{}` — never throws.
|
|
38
|
+
*/
|
|
39
|
+
export function readRepoLinkCache(deps = {}) {
|
|
40
|
+
const p = pathOf(deps);
|
|
41
|
+
if (!existsSync(p))
|
|
42
|
+
return {};
|
|
43
|
+
try {
|
|
44
|
+
const raw = readFileSync(p, 'utf8');
|
|
45
|
+
if (!raw.trim())
|
|
46
|
+
return {};
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Look up a key, honouring its TTL. Returns `positive` / `negative` only
|
|
59
|
+
* while fresh; otherwise `miss` (absent, expired, or malformed entry).
|
|
60
|
+
*/
|
|
61
|
+
export function getCachedRepoLink(key, deps = {}) {
|
|
62
|
+
const now = deps.now ?? Date.now;
|
|
63
|
+
const entry = readRepoLinkCache(deps)[key];
|
|
64
|
+
if (!entry || typeof entry !== 'object')
|
|
65
|
+
return { kind: 'miss' };
|
|
66
|
+
const resolvedAt = entry.resolvedAt;
|
|
67
|
+
if (typeof resolvedAt !== 'number')
|
|
68
|
+
return { kind: 'miss' };
|
|
69
|
+
const age = now() - resolvedAt;
|
|
70
|
+
// A future timestamp (clock skew) reads as a miss → harmless re-resolve.
|
|
71
|
+
if (age < 0)
|
|
72
|
+
return { kind: 'miss' };
|
|
73
|
+
if (entry.negative === true) {
|
|
74
|
+
return age < NEGATIVE_TTL_MS ? { kind: 'negative' } : { kind: 'miss' };
|
|
75
|
+
}
|
|
76
|
+
const pos = entry;
|
|
77
|
+
if (typeof pos.projectId !== 'string' || pos.projectId.length === 0) {
|
|
78
|
+
return { kind: 'miss' };
|
|
79
|
+
}
|
|
80
|
+
if (age < POSITIVE_TTL_MS) {
|
|
81
|
+
return {
|
|
82
|
+
kind: 'positive',
|
|
83
|
+
projectId: pos.projectId,
|
|
84
|
+
// Missing → treated as enabled; only explicit `false` disables.
|
|
85
|
+
vibedefendEnabled: pos.vibedefendEnabled !== false,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return { kind: 'miss' };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Upsert an entry, stamping `resolvedAt` with the current clock. Best-effort:
|
|
92
|
+
* any read/write failure is swallowed (never throws). Never persists a token.
|
|
93
|
+
*/
|
|
94
|
+
export function writeCachedRepoLink(key, entry, deps = {}) {
|
|
95
|
+
const now = deps.now ?? Date.now;
|
|
96
|
+
try {
|
|
97
|
+
const map = readRepoLinkCache(deps);
|
|
98
|
+
map[key] =
|
|
99
|
+
'negative' in entry
|
|
100
|
+
? { negative: true, resolvedAt: now() }
|
|
101
|
+
: {
|
|
102
|
+
projectId: entry.projectId,
|
|
103
|
+
vibedefendEnabled: entry.vibedefendEnabled,
|
|
104
|
+
resolvedAt: now(),
|
|
105
|
+
};
|
|
106
|
+
const p = pathOf(deps);
|
|
107
|
+
const dir = dirname(p);
|
|
108
|
+
if (!existsSync(dir))
|
|
109
|
+
mkdirSync(dir, { recursive: true });
|
|
110
|
+
writeFileSync(p, JSON.stringify(map, null, 2) + '\n');
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// best-effort — a failed write just means we re-resolve next time.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=repo-link-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-link-cache.js","sourceRoot":"","sources":["../../../src/hooks/runtime/repo-link-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
import { execFileSync } from 'node:child_process';
|
|
18
18
|
import { existsSync, readFileSync } from 'node:fs';
|
|
19
19
|
import { getValidAccessToken, LoginRequiredError } from '../../auth/auth.js';
|
|
20
|
+
import { getOriginRemote, parseRemoteUrl } from '../../git.js';
|
|
21
|
+
import { resolveProjectByRepository, } from '../../api/projects.js';
|
|
22
|
+
import { getCachedRepoLink, writeCachedRepoLink, } from './repo-link-cache.js';
|
|
23
|
+
import { loadRuntimeConfig } from './config.js';
|
|
20
24
|
export function resolveProjectId(cwd = process.cwd()) {
|
|
21
25
|
const envProjectId = process.env.CYBEDEFEND_PROJECT_ID;
|
|
22
26
|
if (envProjectId && envProjectId.length > 0) {
|
|
@@ -216,4 +220,79 @@ export async function resolveTokenWithRefresh(mcpName, deps = {}) {
|
|
|
216
220
|
// 3. Fall back to the synchronous legacy keychain lookup (pre-PKCE tokens).
|
|
217
221
|
return resolveTokenFn(mcpName);
|
|
218
222
|
}
|
|
223
|
+
const RESOLVE_API_TIMEOUT_MS = 4_000;
|
|
224
|
+
/**
|
|
225
|
+
* Async superset of {@link resolveProjectId} that adds a gateway
|
|
226
|
+
* auto-discovery step for repos that haven't been `link`-ed yet.
|
|
227
|
+
*
|
|
228
|
+
* Resolution chain (first hit wins, later steps are strictly gated):
|
|
229
|
+
* 1. `$CYBEDEFEND_PROJECT_ID` / `.cybedefend/config.json` (via the sync
|
|
230
|
+
* resolver) — unchanged behaviour, no network, no git.
|
|
231
|
+
* 2. Repo-link cache (`~/.cybedefend/repo-links.json`): a fresh POSITIVE
|
|
232
|
+
* hit returns immediately; a fresh NEGATIVE hit returns null (no API).
|
|
233
|
+
* 3. Otherwise call `GET /user/projects/resolve` — but ONLY when a token
|
|
234
|
+
* is resolvable AND `origin` parses to a known provider. Exactly ONE
|
|
235
|
+
* match with `vibedefendEnabled !== false` is used (cached 24h);
|
|
236
|
+
* 0 / ≥2 matches or a disabled project are negative-cached (15m) and
|
|
237
|
+
* return null. A network error returns null WITHOUT caching (transient).
|
|
238
|
+
*
|
|
239
|
+
* NEVER throws — every failure path resolves to `{ projectId: null, ... }`
|
|
240
|
+
* so hook callers stay fail-open. Kept separate from the sync
|
|
241
|
+
* {@link resolveProjectId} (which many callers still invoke synchronously)
|
|
242
|
+
* to preserve that function's backward-compatible signature.
|
|
243
|
+
*/
|
|
244
|
+
export async function resolveProjectIdWithApi(cwd = process.cwd(), deps = {}) {
|
|
245
|
+
const resolveSync = deps.resolveSync ?? resolveProjectId;
|
|
246
|
+
const base = resolveSync(cwd);
|
|
247
|
+
// 1. env var / config.json projectId always wins — no git, no network.
|
|
248
|
+
if (base.projectId)
|
|
249
|
+
return base;
|
|
250
|
+
try {
|
|
251
|
+
// 2. Need a parseable origin to build the cache key + query.
|
|
252
|
+
const getOrigin = deps.getOrigin ?? getOriginRemote;
|
|
253
|
+
const originUrl = getOrigin(cwd);
|
|
254
|
+
if (!originUrl)
|
|
255
|
+
return base;
|
|
256
|
+
const remote = parseRemoteUrl(originUrl);
|
|
257
|
+
if (!remote || remote.provider === null)
|
|
258
|
+
return base;
|
|
259
|
+
const key = `${remote.provider}:${remote.host}:${remote.slug}`;
|
|
260
|
+
// 3. Cache — fresh positive short-circuits, fresh negative suppresses.
|
|
261
|
+
const cached = getCachedRepoLink(key, deps.cacheDeps);
|
|
262
|
+
if (cached.kind === 'positive') {
|
|
263
|
+
return { projectId: cached.projectId, apiBase: base.apiBase };
|
|
264
|
+
}
|
|
265
|
+
if (cached.kind === 'negative') {
|
|
266
|
+
return base;
|
|
267
|
+
}
|
|
268
|
+
// 4. Need config (apiBase + mcpName) and a token before we call out.
|
|
269
|
+
const config = (deps.loadConfig ?? loadRuntimeConfig)();
|
|
270
|
+
if (!config)
|
|
271
|
+
return base;
|
|
272
|
+
const apiBase = base.apiBase ?? config.region.apiBase;
|
|
273
|
+
const resolveTokenFn = deps.resolveTokenFn ?? resolveTokenWithRefresh;
|
|
274
|
+
const token = await resolveTokenFn(config.region.mcpName);
|
|
275
|
+
if (!token)
|
|
276
|
+
return base;
|
|
277
|
+
// 5. Gateway lookup (bounded).
|
|
278
|
+
const resolveByRepo = deps.resolveByRepo ?? resolveProjectByRepository;
|
|
279
|
+
const matches = await resolveByRepo(apiBase, token, { provider: remote.provider, slug: remote.slug, host: remote.host }, { timeoutMs: deps.timeoutMs ?? RESOLVE_API_TIMEOUT_MS });
|
|
280
|
+
// Network / API error → null, WITHOUT caching (transient; retry next time).
|
|
281
|
+
if (matches === null)
|
|
282
|
+
return base;
|
|
283
|
+
// 6. Exactly one enabled match is usable → positive cache (24h).
|
|
284
|
+
if (matches.length === 1 && matches[0].vibedefendEnabled !== false) {
|
|
285
|
+
const m = matches[0];
|
|
286
|
+
writeCachedRepoLink(key, { projectId: m.projectId, vibedefendEnabled: m.vibedefendEnabled }, deps.cacheDeps);
|
|
287
|
+
return { projectId: m.projectId, apiBase: base.apiBase };
|
|
288
|
+
}
|
|
289
|
+
// 0 / ≥2 matches, or a disabled project → negative cache (15m).
|
|
290
|
+
writeCachedRepoLink(key, { negative: true }, deps.cacheDeps);
|
|
291
|
+
return base;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// Fail-open: any unexpected error yields no projectId, never throws.
|
|
295
|
+
return base;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
219
298
|
//# sourceMappingURL=resolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/hooks/runtime/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/hooks/runtime/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* the body only nudges if proposals exist)
|
|
10
10
|
*/
|
|
11
11
|
import { sniff } from './sniff.js';
|
|
12
|
-
import {
|
|
12
|
+
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
13
13
|
import { fetchProposalsCount } from './api.js';
|
|
14
14
|
import { emitContext } from './emit.js';
|
|
15
15
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
@@ -18,7 +18,7 @@ import { pkg } from '../../version.js';
|
|
|
18
18
|
export async function sessionStartHook(deps = {}) {
|
|
19
19
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
20
20
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
21
|
-
const resolveProject = deps.resolveProject ??
|
|
21
|
+
const resolveProject = deps.resolveProject ?? resolveProjectIdWithApi;
|
|
22
22
|
const resolveTok = deps.resolveTokenFn ?? resolveToken;
|
|
23
23
|
const fetchProposals = deps.fetchProposalsFn ?? fetchProposalsCount;
|
|
24
24
|
const selfUpdateCheckFn = deps.selfUpdateCheckFn ?? selfUpdateCheck;
|
|
@@ -31,7 +31,9 @@ export async function sessionStartHook(deps = {}) {
|
|
|
31
31
|
const config = loadConfig();
|
|
32
32
|
if (!config)
|
|
33
33
|
return;
|
|
34
|
-
|
|
34
|
+
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
35
|
+
// gateway call) when no env var / config.json projectId exists.
|
|
36
|
+
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
35
37
|
if (!projectId)
|
|
36
38
|
return;
|
|
37
39
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runtime/session-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,16 +23,17 @@
|
|
|
23
23
|
* - If the API/token is unavailable, the doctrine still surfaces with
|
|
24
24
|
* a "could not verify, call cybe_rules_list_proposals yourself"
|
|
25
25
|
* fallback — never blocks the user's prompt.
|
|
26
|
-
* - When projectId can't be resolved (no
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
26
|
+
* - When projectId can't be resolved (no env var, no
|
|
27
|
+
* `.cybedefend/config.json`, and git-origin auto-discovery found no
|
|
28
|
+
* unique match), the hook is a silent no-op — there's no project
|
|
29
|
+
* context to anchor the doctrine against and emitting a half-finished
|
|
30
|
+
* reminder would confuse more than help.
|
|
30
31
|
*/
|
|
31
32
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
32
33
|
import { homedir } from 'node:os';
|
|
33
34
|
import { join } from 'node:path';
|
|
34
35
|
import { sniff } from './sniff.js';
|
|
35
|
-
import {
|
|
36
|
+
import { resolveProjectIdWithApi, resolveToken, } from './resolve.js';
|
|
36
37
|
import { fetchProposalsCount } from './api.js';
|
|
37
38
|
import { emit } from './emit.js';
|
|
38
39
|
import { loadRuntimeConfig, readStdinJson } from './config.js';
|
|
@@ -85,7 +86,7 @@ export function defaultSessionTracker(file = defaultSessionsFile()) {
|
|
|
85
86
|
export async function userPromptSubmitHook(deps = {}) {
|
|
86
87
|
const readStdin = deps.readStdin ?? readStdinJson;
|
|
87
88
|
const loadConfig = deps.loadConfig ?? loadRuntimeConfig;
|
|
88
|
-
const resolveProject = deps.resolveProject ??
|
|
89
|
+
const resolveProject = deps.resolveProject ?? resolveProjectIdWithApi;
|
|
89
90
|
const resolveTok = deps.resolveTokenFn ?? resolveToken;
|
|
90
91
|
const fetchProposals = deps.fetchProposalsFn ?? fetchProposalsCount;
|
|
91
92
|
const emitFn = deps.emitFn ?? emit;
|
|
@@ -105,7 +106,9 @@ export async function userPromptSubmitHook(deps = {}) {
|
|
|
105
106
|
const config = loadConfig();
|
|
106
107
|
if (!config)
|
|
107
108
|
return;
|
|
108
|
-
|
|
109
|
+
// Async: falls back to git-origin auto-discovery (cache + bounded 4s
|
|
110
|
+
// gateway call) when no env var / config.json projectId exists.
|
|
111
|
+
const { projectId, apiBase: configApiBase } = await resolveProject();
|
|
109
112
|
if (!projectId)
|
|
110
113
|
return; // silent no-op — see file header
|
|
111
114
|
const apiBase = process.env.CYBEDEFEND_API_BASE ?? configApiBase ?? config.region.apiBase;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../../src/hooks/runtime/user-prompt-submit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../../src/hooks/runtime/user-prompt-submit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,9 @@ import { Command, Option } from 'commander';
|
|
|
4
4
|
import updateNotifier from 'update-notifier';
|
|
5
5
|
import { runDoctor } from './doctor.js';
|
|
6
6
|
import { runInstall } from './install.js';
|
|
7
|
+
import { runLinkCommand } from './link.js';
|
|
7
8
|
import { runLoginCommand } from './login.js';
|
|
9
|
+
import { runLogout } from './logout.js';
|
|
8
10
|
import { selfUpdate, detectInstallMode, resolveScriptPath, fetchLatestVersion, } from './self-update.js';
|
|
9
11
|
import { runUpdate } from './update.js';
|
|
10
12
|
import { runStatus } from './status.js';
|
|
@@ -44,9 +46,10 @@ program
|
|
|
44
46
|
program
|
|
45
47
|
.command('install')
|
|
46
48
|
.description('Interactive installer: pick a region, register the MCP, configure hooks for each detected agent.')
|
|
47
|
-
.
|
|
49
|
+
.option('--force', 'Force the browser sign-in step even if a VibeDefend session already exists (useful for testing sign-out / sign-in).')
|
|
50
|
+
.action(async (opts) => {
|
|
48
51
|
try {
|
|
49
|
-
await runInstall();
|
|
52
|
+
await runInstall({}, { force: opts.force });
|
|
50
53
|
}
|
|
51
54
|
catch (err) {
|
|
52
55
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -126,6 +129,41 @@ program
|
|
|
126
129
|
process.exit(1);
|
|
127
130
|
}
|
|
128
131
|
});
|
|
132
|
+
program
|
|
133
|
+
.command('logout')
|
|
134
|
+
.description("Sign out of CybeDefend: clear VibeDefend's stored credentials so the next install/login prompts a fresh browser sign-in.")
|
|
135
|
+
.option('--region <id>', 'Only sign out of this region (default: all configured regions).')
|
|
136
|
+
.action((opts) => {
|
|
137
|
+
try {
|
|
138
|
+
runLogout(opts);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
142
|
+
log.err(`Logout failed: ${message}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
program
|
|
147
|
+
.command('link')
|
|
148
|
+
.description('Link a repository to a CybeDefend project: resolves the project (via --project, ' +
|
|
149
|
+
'the git origin, or an interactive picker) and writes .cybedefend/config.json.')
|
|
150
|
+
.option('--project <id>', 'Project UUID to link directly, skipping auto-discovery.')
|
|
151
|
+
.option('--path <dir>', 'Directory to write .cybedefend/config.json into (default: current directory).')
|
|
152
|
+
.option('--region <id>', 'Region id to use when VibeDefend is not installed yet (e.g. eu, us).')
|
|
153
|
+
.action(async (opts) => {
|
|
154
|
+
try {
|
|
155
|
+
await runLinkCommand(opts);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
159
|
+
if (isUserCancellation(err)) {
|
|
160
|
+
log.info('Link cancelled by user.');
|
|
161
|
+
process.exit(130);
|
|
162
|
+
}
|
|
163
|
+
log.err(`Link failed: ${message}`);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
129
167
|
program
|
|
130
168
|
.command('status')
|
|
131
169
|
.description('Show the VibeDefend install state: region, agents, caches, and a live API check.')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEnC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,QAAQ,GAAG,cAAc,CAAC;IAC9B,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;IAC7C,mBAAmB,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,eAAe;CAC1D,CAAC,CAAC;AACH,QAAQ,CAAC,MAAM,CAAC;IACd,OAAO,EACL,gEAAgE;QAChE,4CAA4C;IAC9C,KAAK,EAAE,KAAK,EAAE,oDAAoD;IAClE,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACV,6HAA6H,CAC9H;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CACV,kGAAkG,CACnG;KACA,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|