ghagga-core 3.0.0 → 3.2.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/dist/agents/audit.js +1 -1
- package/dist/agents/audit.js.map +1 -1
- package/dist/agents/diagnostic.d.ts.map +1 -1
- package/dist/agents/diagnostic.js +1 -1
- package/dist/agents/diagnostic.js.map +1 -1
- package/dist/agents/fan-out-lenses.js +1 -1
- package/dist/agents/fan-out-lenses.js.map +1 -1
- package/dist/agents/prompts.js +1 -1
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +1 -1
- package/dist/agents/simple.js.map +1 -1
- package/dist/embed.d.ts +140 -0
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.js +288 -0
- package/dist/embed.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/backfill.d.ts +58 -0
- package/dist/memory/backfill.d.ts.map +1 -0
- package/dist/memory/backfill.js +85 -0
- package/dist/memory/backfill.js.map +1 -0
- package/dist/memory/sqlite.d.ts +78 -12
- package/dist/memory/sqlite.d.ts.map +1 -1
- package/dist/memory/sqlite.js +265 -85
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/pipeline/gather-context.d.ts.map +1 -1
- package/dist/pipeline/gather-context.js +4 -2
- package/dist/pipeline/gather-context.js.map +1 -1
- package/dist/pipeline/gather-safe.d.ts +24 -4
- package/dist/pipeline/gather-safe.d.ts.map +1 -1
- package/dist/pipeline/gather-safe.js +42 -6
- package/dist/pipeline/gather-safe.js.map +1 -1
- package/dist/pipeline/prepare.d.ts.map +1 -1
- package/dist/pipeline/prepare.js +26 -0
- package/dist/pipeline/prepare.js.map +1 -1
- package/dist/pipeline/providers.d.ts.map +1 -1
- package/dist/pipeline/providers.js +1 -0
- package/dist/pipeline/providers.js.map +1 -1
- package/dist/pipeline/state.d.ts +3 -1
- package/dist/pipeline/state.d.ts.map +1 -1
- package/dist/providers/cli-bridge.d.ts +5 -0
- package/dist/providers/cli-bridge.d.ts.map +1 -1
- package/dist/providers/cli-bridge.js +65 -5
- package/dist/providers/cli-bridge.js.map +1 -1
- package/dist/providers/gateway-discovery.d.ts +60 -0
- package/dist/providers/gateway-discovery.d.ts.map +1 -0
- package/dist/providers/gateway-discovery.js +118 -0
- package/dist/providers/gateway-discovery.js.map +1 -0
- package/dist/providers/gateway.d.ts +95 -0
- package/dist/providers/gateway.d.ts.map +1 -1
- package/dist/providers/gateway.js +391 -9
- package/dist/providers/gateway.js.map +1 -1
- package/dist/providers/generate-fn.d.ts +1 -0
- package/dist/providers/generate-fn.d.ts.map +1 -1
- package/dist/providers/generate-fn.js.map +1 -1
- package/dist/tools/cpd.js +2 -2
- package/dist/tools/cpd.js.map +1 -1
- package/dist/tools/execution.d.ts +3 -1
- package/dist/tools/execution.d.ts.map +1 -1
- package/dist/tools/execution.js +10 -2
- package/dist/tools/execution.js.map +1 -1
- package/dist/tools/gitleaks-config.toml +23 -0
- package/dist/tools/runner.d.ts.map +1 -1
- package/dist/tools/runner.js +2 -1
- package/dist/tools/runner.js.map +1 -1
- package/dist/tools/semgrep.js +2 -2
- package/dist/tools/semgrep.js.map +1 -1
- package/dist/types.d.ts +47 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/concurrency.d.ts.map +1 -1
- package/dist/utils/concurrency.js +37 -1
- package/dist/utils/concurrency.js.map +1 -1
- package/dist/utils/llm-timeout.d.ts +1 -1
- package/dist/utils/llm-timeout.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -25,6 +25,17 @@ const CLAUDE_LEGACY_DEFAULT_MODEL = 'anthropic/claude-sonnet-4-5';
|
|
|
25
25
|
const STDIN_THRESHOLD = 10_000;
|
|
26
26
|
/** Regex for validating OpenCode cliModel format: `provider/model`. */
|
|
27
27
|
const CLI_MODEL_REGEX = /^[^/]+\/.+$/;
|
|
28
|
+
/**
|
|
29
|
+
* CLIs that can authenticate WITHOUT an env-var credential because they use
|
|
30
|
+
* an interactive OAuth login instead:
|
|
31
|
+
* - gemini: Google account OAuth (falls back to GEMINI_API_KEY if present)
|
|
32
|
+
* - copilot: GitHub login (falls back to COPILOT_GITHUB_TOKEN/GH_TOKEN if present)
|
|
33
|
+
*
|
|
34
|
+
* For these, a missing credential env var is NOT a configuration error — the CLI
|
|
35
|
+
* can still authenticate via its own login. opencode is NOT in this set: its
|
|
36
|
+
* provider models genuinely require the API key.
|
|
37
|
+
*/
|
|
38
|
+
const OAUTH_CAPABLE_CLIS = new Set(['gemini', 'copilot']);
|
|
28
39
|
// ─── Env-Var Mapping ────────────────────────────────────────────
|
|
29
40
|
/**
|
|
30
41
|
* Maps OpenCode provider prefixes to the env var they need for authentication.
|
|
@@ -92,6 +103,7 @@ export class CLIConfigurationError extends Error {
|
|
|
92
103
|
*/
|
|
93
104
|
function detectCLI(command) {
|
|
94
105
|
try {
|
|
106
|
+
// nosemgrep: command-injection-node -- `command` is only ever the hardcoded literals 'opencode'/'copilot'/'gemini' (see adapters[].command); no external input.
|
|
95
107
|
execSync(`which ${command}`, { timeout: 3000, stdio: 'pipe' });
|
|
96
108
|
return true;
|
|
97
109
|
}
|
|
@@ -308,6 +320,7 @@ const adapters = [
|
|
|
308
320
|
? `opencode ${cmdArgs}`
|
|
309
321
|
: `opencode ${cmdArgs} ${JSON.stringify(fullPrompt)}`;
|
|
310
322
|
try {
|
|
323
|
+
// nosemgrep: command-injection-node -- `cmd` is built from JSON.stringify-quoted args + config-derived cliModel validated against CLI_MODEL_REGEX; the prompt is passed via stdin, never interpolated into the shell command.
|
|
311
324
|
raw = execSync(cmd, {
|
|
312
325
|
...execOptions,
|
|
313
326
|
...(fullPrompt.length > STDIN_THRESHOLD ? { input: fullPrompt } : {}),
|
|
@@ -339,6 +352,7 @@ const adapters = [
|
|
|
339
352
|
const tmpFile = join(tmpdir(), `ghagga-prompt-${process.pid}-${Date.now()}.txt`);
|
|
340
353
|
try {
|
|
341
354
|
writeFileSync(tmpFile, prompt, 'utf8');
|
|
355
|
+
// nosemgrep: command-injection-node -- `tmpFile` is a server-constructed path (join(tmpdir(), `ghagga-prompt-${pid}-${Date.now()}.txt`)); the user prompt is written to that file, never interpolated into the shell command.
|
|
342
356
|
return execSync(`copilot -p "Read and analyze the file at ${tmpFile} and provide a code review"`, { ...CLI_EXEC_OPTIONS, ...(env ? { env } : {}) }).trim();
|
|
343
357
|
}
|
|
344
358
|
finally {
|
|
@@ -358,6 +372,7 @@ const adapters = [
|
|
|
358
372
|
generate(prompt, systemPrompt, _cliModel, env) {
|
|
359
373
|
// Gemini auto-detects non-TTY stdin and reads from it
|
|
360
374
|
const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt;
|
|
375
|
+
// nosemgrep: command-injection-node -- literal constant command string; the user prompt is passed via stdin (input), never interpolated into the shell command.
|
|
361
376
|
return execSync('gemini -p - --output-format text', {
|
|
362
377
|
...CLI_EXEC_OPTIONS,
|
|
363
378
|
...(env ? { env } : {}),
|
|
@@ -366,13 +381,37 @@ const adapters = [
|
|
|
366
381
|
},
|
|
367
382
|
},
|
|
368
383
|
];
|
|
384
|
+
// ─── Availability Override (testing) ────────────────────────────
|
|
385
|
+
/**
|
|
386
|
+
* Optional override for adapter availability, keyed by adapter name.
|
|
387
|
+
* `available` is frozen at module load via detectCLI(), so this seam lets tests
|
|
388
|
+
* deterministically exercise code paths (e.g. the gemini OAuth path) without a
|
|
389
|
+
* real CLI installed. Production code never sets this.
|
|
390
|
+
*
|
|
391
|
+
* @internal testing-only
|
|
392
|
+
*/
|
|
393
|
+
let availabilityOverride;
|
|
394
|
+
/**
|
|
395
|
+
* Set (or clear with undefined) the availability override.
|
|
396
|
+
* @internal Exported for testing only.
|
|
397
|
+
*/
|
|
398
|
+
export function _setAvailabilityOverride(override) {
|
|
399
|
+
availabilityOverride = override;
|
|
400
|
+
}
|
|
401
|
+
/** Resolve whether an adapter is available, honoring the testing override. */
|
|
402
|
+
function isAdapterAvailable(adapter) {
|
|
403
|
+
if (availabilityOverride && adapter.name in availabilityOverride) {
|
|
404
|
+
return availabilityOverride[adapter.name];
|
|
405
|
+
}
|
|
406
|
+
return adapter.available;
|
|
407
|
+
}
|
|
369
408
|
// ─── Public API ─────────────────────────────────────────────────
|
|
370
409
|
/**
|
|
371
410
|
* Get list of available CLI providers.
|
|
372
411
|
* Returns names from the adapter list (opencode, copilot, gemini).
|
|
373
412
|
*/
|
|
374
413
|
export function getAvailableCLIs() {
|
|
375
|
-
return adapters.filter(
|
|
414
|
+
return adapters.filter(isAdapterAvailable).map((a) => a.name);
|
|
376
415
|
}
|
|
377
416
|
/**
|
|
378
417
|
* Generate text using CLI bridge.
|
|
@@ -408,16 +447,37 @@ export function generateViaCLI(prompt, systemPrompt, options) {
|
|
|
408
447
|
// ── Resolve credential env var ──
|
|
409
448
|
const credentialEnvName = resolveCredentialEnvVar(resolvedCLI, cliModel);
|
|
410
449
|
// ── Validate credentials (configuration error = hard fail) ──
|
|
411
|
-
|
|
450
|
+
// OAuth-capable CLIs (gemini, copilot) skip the hard-fail: they can
|
|
451
|
+
// authenticate via Google/GitHub login when no env credential is present.
|
|
452
|
+
// The credential is still injected below when available.
|
|
453
|
+
if (resolvedCLI && credentialEnvName && !OAUTH_CAPABLE_CLIS.has(resolvedCLI)) {
|
|
412
454
|
validateCredentials(credentialEnvName, credentials);
|
|
413
455
|
}
|
|
414
456
|
// ── Build subprocess environment ──
|
|
457
|
+
// When a credential is available, restrict the subprocess to the SAFE_ENV_VARS
|
|
458
|
+
// allowlist plus that one credential (never the full parent env).
|
|
415
459
|
let subprocessEnv;
|
|
416
460
|
if (credentials && credentialEnvName) {
|
|
417
|
-
|
|
418
|
-
|
|
461
|
+
subprocessEnv = buildSubprocessEnv(credentialEnvName, credentials[credentialEnvName]);
|
|
462
|
+
}
|
|
463
|
+
else if (resolvedCLI && OAUTH_CAPABLE_CLIS.has(resolvedCLI)) {
|
|
464
|
+
// OAuth-capable CLI (gemini/copilot) selected explicitly with NO injected key:
|
|
465
|
+
// still restrict to the allowlist so the CLI can read its own login state
|
|
466
|
+
// (HOME/XDG) WITHOUT inheriting the full parent env, which would leak unrelated
|
|
467
|
+
// server secrets. (This path is newly reachable because the OAuth-skip above no
|
|
468
|
+
// longer hard-fails on a missing key.)
|
|
469
|
+
// Known limitation: this restricted (allowlist-only) env also applies to any
|
|
470
|
+
// FALLBACK adapter tried later in the loop below, so a fallback that relies on
|
|
471
|
+
// ambient (non-allowlisted) keys will not see them on this path. Acceptable:
|
|
472
|
+
// choosing an OAuth CLI explicitly is a deliberate restriction, and before this
|
|
473
|
+
// change the no-key path hard-failed before reaching the loop at all. Per-adapter
|
|
474
|
+
// env resolution would be a larger refactor, tracked separately.
|
|
475
|
+
subprocessEnv = buildSubprocessEnv();
|
|
419
476
|
}
|
|
420
|
-
|
|
477
|
+
// else: subprocessEnv stays undefined → preserves the PRE-EXISTING behavior for
|
|
478
|
+
// opencode / auto-mode (ambient-env inheritance). Closing that pre-existing path is
|
|
479
|
+
// tracked separately (PRE-LAUNCH backlog: fail-closed vs degradation) — out of scope here.
|
|
480
|
+
const available = adapters.filter(isAdapterAvailable);
|
|
421
481
|
if (available.length === 0) {
|
|
422
482
|
throw new Error('No CLI providers available. Install one of: opencode, copilot, gemini');
|
|
423
483
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-bridge.js","sourceRoot":"","sources":["../../src/providers/cli-bridge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-bridge.js","sourceRoot":"","sources":["../../src/providers/cli-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway discovery — query what the bridge actually exposes.
|
|
3
|
+
*
|
|
4
|
+
* The bridge advertises its live providers and models via GET /v1/providers
|
|
5
|
+
* and GET /v1/models. `validateProviderChain` can check a provider chain
|
|
6
|
+
* against them so a misconfigured voice (unknown/unavailable provider, or a
|
|
7
|
+
* model that provider doesn't serve) is caught up front.
|
|
8
|
+
*
|
|
9
|
+
* STATUS: this is an available capability, NOT yet wired into the review
|
|
10
|
+
* pipeline — callers must invoke validateProviderChain themselves. Until that
|
|
11
|
+
* wiring lands the chain is sent unvalidated (tracked as a follow-up).
|
|
12
|
+
*
|
|
13
|
+
* SECURITY: the fetch helpers take a raw gatewayUrl and attach the bearer
|
|
14
|
+
* token. They route through `pinnedFetch` (gateway.ts) — the SAME SSRF /
|
|
15
|
+
* DNS-rebinding-pinning policy as the generation path (SEC-001): the hostname
|
|
16
|
+
* is resolved ONCE, every A/AAAA answer is validated, and the socket is pinned
|
|
17
|
+
* to an approved IP with Host header + TLS SNI preserved. Discovery and generate
|
|
18
|
+
* therefore share one pinning policy; a rebound host can never receive the token.
|
|
19
|
+
*/
|
|
20
|
+
import type { ProviderChainEntry } from '../types.js';
|
|
21
|
+
/** One entry from GET /v1/models (`data[]`). */
|
|
22
|
+
export interface GatewayModelEntry {
|
|
23
|
+
id: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
provider?: string;
|
|
26
|
+
max_tokens?: number;
|
|
27
|
+
}
|
|
28
|
+
/** One entry from GET /v1/providers (`providers[]`). */
|
|
29
|
+
export interface GatewayProviderStatus {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
type: string;
|
|
33
|
+
available: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Fetch the bridge's advertised models (GET /v1/models). */
|
|
36
|
+
export declare function fetchGatewayModels(gatewayUrl: string, gatewayToken: string): Promise<GatewayModelEntry[]>;
|
|
37
|
+
/** Fetch the bridge's provider statuses (GET /v1/providers). */
|
|
38
|
+
export declare function fetchGatewayProviders(gatewayUrl: string, gatewayToken: string): Promise<GatewayProviderStatus[]>;
|
|
39
|
+
export interface ChainValidationResult {
|
|
40
|
+
/** Entries safe to send. */
|
|
41
|
+
valid: ProviderChainEntry[];
|
|
42
|
+
/** Entries that should NOT be sent, with a human-readable reason. */
|
|
43
|
+
invalid: Array<{
|
|
44
|
+
entry: ProviderChainEntry;
|
|
45
|
+
reason: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate gateway provider-chain entries against what the bridge actually
|
|
50
|
+
* exposes — so ghagga never sends a voice it only ASSUMES exists.
|
|
51
|
+
*
|
|
52
|
+
* Checks, per `provider === 'gateway'` entry:
|
|
53
|
+
* - `targetProvider` (if set) is a known, available bridge provider;
|
|
54
|
+
* - `model` (if not 'auto') is advertised — by that targetProvider when set,
|
|
55
|
+
* otherwise by any provider.
|
|
56
|
+
*
|
|
57
|
+
* Non-gateway entries pass through unchecked (they don't go to the bridge).
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateProviderChain(chain: ProviderChainEntry[], models: GatewayModelEntry[], providers: GatewayProviderStatus[]): ChainValidationResult;
|
|
60
|
+
//# sourceMappingURL=gateway-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-discovery.d.ts","sourceRoot":"","sources":["../../src/providers/gateway-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKtD,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wDAAwD;AACxD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAoCD,6DAA6D;AAC7D,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAS9B;AAED,gEAAgE;AAChE,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,EAAE,CAAC,CASlC;AAID,MAAM,WAAW,qBAAqB;IACpC,4BAA4B;IAC5B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,qEAAqE;IACrE,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,MAAM,EAAE,iBAAiB,EAAE,EAC3B,SAAS,EAAE,qBAAqB,EAAE,GACjC,qBAAqB,CAkBvB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway discovery — query what the bridge actually exposes.
|
|
3
|
+
*
|
|
4
|
+
* The bridge advertises its live providers and models via GET /v1/providers
|
|
5
|
+
* and GET /v1/models. `validateProviderChain` can check a provider chain
|
|
6
|
+
* against them so a misconfigured voice (unknown/unavailable provider, or a
|
|
7
|
+
* model that provider doesn't serve) is caught up front.
|
|
8
|
+
*
|
|
9
|
+
* STATUS: this is an available capability, NOT yet wired into the review
|
|
10
|
+
* pipeline — callers must invoke validateProviderChain themselves. Until that
|
|
11
|
+
* wiring lands the chain is sent unvalidated (tracked as a follow-up).
|
|
12
|
+
*
|
|
13
|
+
* SECURITY: the fetch helpers take a raw gatewayUrl and attach the bearer
|
|
14
|
+
* token. They route through `pinnedFetch` (gateway.ts) — the SAME SSRF /
|
|
15
|
+
* DNS-rebinding-pinning policy as the generation path (SEC-001): the hostname
|
|
16
|
+
* is resolved ONCE, every A/AAAA answer is validated, and the socket is pinned
|
|
17
|
+
* to an approved IP with Host header + TLS SNI preserved. Discovery and generate
|
|
18
|
+
* therefore share one pinning policy; a rebound host can never receive the token.
|
|
19
|
+
*/
|
|
20
|
+
import { pinnedFetch } from './gateway.js';
|
|
21
|
+
// ─── Fetch helpers ──────────────────────────────────────────────
|
|
22
|
+
async function gatewayGet(gatewayUrl, gatewayToken, path) {
|
|
23
|
+
if (!gatewayUrl) {
|
|
24
|
+
throw new Error('Gateway URL not configured — set it in the dashboard provider chain settings');
|
|
25
|
+
}
|
|
26
|
+
if (!gatewayToken) {
|
|
27
|
+
throw new Error('Gateway token not configured — set the API key in the dashboard provider chain settings');
|
|
28
|
+
}
|
|
29
|
+
// SSRF: pinnedFetch resolves once, validates every DNS answer, and pins the
|
|
30
|
+
// socket to a non-forbidden IP (same policy as generateViaGateway). Node's
|
|
31
|
+
// http/https client never follows a 3xx, so a redirect surfaces as a non-ok
|
|
32
|
+
// response below and can never chase a Location to an unvalidated host.
|
|
33
|
+
const response = await pinnedFetch(`${gatewayUrl}${path}`, {
|
|
34
|
+
method: 'GET',
|
|
35
|
+
headers: { Authorization: `Bearer ${gatewayToken}` },
|
|
36
|
+
signal: AbortSignal.timeout(30_000),
|
|
37
|
+
});
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
const error = await response.text().catch(() => 'unknown error');
|
|
40
|
+
throw new Error(`Gateway error (${response.status}): ${error}`);
|
|
41
|
+
}
|
|
42
|
+
return response.json();
|
|
43
|
+
}
|
|
44
|
+
/** Fetch the bridge's advertised models (GET /v1/models). */
|
|
45
|
+
export async function fetchGatewayModels(gatewayUrl, gatewayToken) {
|
|
46
|
+
const body = await gatewayGet(gatewayUrl, gatewayToken, '/v1/models');
|
|
47
|
+
const data = body.data;
|
|
48
|
+
if (!Array.isArray(data))
|
|
49
|
+
return [];
|
|
50
|
+
// Only trust entries that actually carry a string id — a malformed payload
|
|
51
|
+
// must not coerce into typed garbage that skews validation.
|
|
52
|
+
return data.filter((m) => typeof m?.id === 'string');
|
|
53
|
+
}
|
|
54
|
+
/** Fetch the bridge's provider statuses (GET /v1/providers). */
|
|
55
|
+
export async function fetchGatewayProviders(gatewayUrl, gatewayToken) {
|
|
56
|
+
const body = await gatewayGet(gatewayUrl, gatewayToken, '/v1/providers');
|
|
57
|
+
const providers = body.providers;
|
|
58
|
+
if (!Array.isArray(providers))
|
|
59
|
+
return [];
|
|
60
|
+
return providers.filter((p) => typeof p?.id === 'string' &&
|
|
61
|
+
typeof p?.available === 'boolean');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validate gateway provider-chain entries against what the bridge actually
|
|
65
|
+
* exposes — so ghagga never sends a voice it only ASSUMES exists.
|
|
66
|
+
*
|
|
67
|
+
* Checks, per `provider === 'gateway'` entry:
|
|
68
|
+
* - `targetProvider` (if set) is a known, available bridge provider;
|
|
69
|
+
* - `model` (if not 'auto') is advertised — by that targetProvider when set,
|
|
70
|
+
* otherwise by any provider.
|
|
71
|
+
*
|
|
72
|
+
* Non-gateway entries pass through unchecked (they don't go to the bridge).
|
|
73
|
+
*/
|
|
74
|
+
export function validateProviderChain(chain, models, providers) {
|
|
75
|
+
const result = { valid: [], invalid: [] };
|
|
76
|
+
for (const entry of chain) {
|
|
77
|
+
if (entry.provider !== 'gateway') {
|
|
78
|
+
result.valid.push(entry);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const reason = validateGatewayEntry(entry, models, providers);
|
|
82
|
+
if (reason) {
|
|
83
|
+
result.invalid.push({ entry, reason });
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
result.valid.push(entry);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
function validateGatewayEntry(entry, models, providers) {
|
|
92
|
+
// Fail-open per dimension: an EMPTY discovery list means "couldn't discover"
|
|
93
|
+
// (bridge unreachable / transient), not "nothing exists" — so we skip that
|
|
94
|
+
// check rather than nuke an otherwise-valid chain on a blip.
|
|
95
|
+
if (entry.targetProvider && providers.length > 0) {
|
|
96
|
+
const status = providers.find((p) => p.id === entry.targetProvider);
|
|
97
|
+
if (!status) {
|
|
98
|
+
return `unknown bridge provider '${entry.targetProvider}'`;
|
|
99
|
+
}
|
|
100
|
+
if (!status.available) {
|
|
101
|
+
return `bridge provider '${entry.targetProvider}' is unavailable`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// 'auto' lets the bridge choose — nothing to validate.
|
|
105
|
+
if (entry.model && entry.model !== 'auto' && models.length > 0) {
|
|
106
|
+
// The bridge always attributes a model's provider (GET /v1/models), so when
|
|
107
|
+
// targetProvider is set we require an exact provider match — no lenient
|
|
108
|
+
// "missing provider matches anything" escape hatch.
|
|
109
|
+
const known = models.some((m) => m.id === entry.model && (!entry.targetProvider || m.provider === entry.targetProvider));
|
|
110
|
+
if (!known) {
|
|
111
|
+
return entry.targetProvider
|
|
112
|
+
? `model '${entry.model}' not advertised by provider '${entry.targetProvider}'`
|
|
113
|
+
: `model '${entry.model}' not advertised by the bridge`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=gateway-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-discovery.js","sourceRoot":"","sources":["../../src/providers/gateway-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,14 +9,47 @@
|
|
|
9
9
|
* Request: { prompt, system, provider?, model?, project? }
|
|
10
10
|
* Response: { text, provider, model, tokensUsed }
|
|
11
11
|
*
|
|
12
|
+
* When `provider` is set, the bridge short-circuits its model-based routing
|
|
13
|
+
* and selects that provider directly (the model is passed through verbatim).
|
|
14
|
+
*
|
|
12
15
|
* This provider bypasses the AI SDK entirely — the gateway handles model
|
|
13
16
|
* selection, provider routing, and token management internally.
|
|
17
|
+
*
|
|
18
|
+
* ─── SSRF / DNS-rebinding defense (SEC-001) ─────────────────────────────────
|
|
19
|
+
*
|
|
20
|
+
* The gateway URL is user-supplied (dashboard provider chain). A naive
|
|
21
|
+
* `fetch(url)` re-resolves the hostname at connection time, so an attacker who
|
|
22
|
+
* controls the hostname's DNS can pass a persist-time/validation-time check
|
|
23
|
+
* (resolving to a public IP) and then rebind the record to loopback, cloud
|
|
24
|
+
* metadata (169.254.169.254), or an RFC-1918 host before the actual request.
|
|
25
|
+
*
|
|
26
|
+
* `pinnedFetch` (below) closes that TOCTOU: it resolves the hostname EXACTLY
|
|
27
|
+
* ONCE, validates EVERY A/AAAA answer against the forbidden ranges, rejects
|
|
28
|
+
* mixed public/private answer sets, picks one approved IP, and PINS the socket
|
|
29
|
+
* to that IP via a custom `lookup` fed to Node's built-in http/https client —
|
|
30
|
+
* while preserving the original Host header and TLS SNI (servername). Both the
|
|
31
|
+
* generation path (this file) AND the discovery path (gateway-discovery.ts)
|
|
32
|
+
* route through the SAME `pinnedFetch`, so they share one pinning policy.
|
|
33
|
+
*
|
|
34
|
+
* Node's http/https client never auto-follows redirects, so a 3xx surfaces as a
|
|
35
|
+
* non-ok response (the old `redirect: 'manual'` posture) and can never chase a
|
|
36
|
+
* Location header to an unvalidated address.
|
|
37
|
+
*
|
|
38
|
+
* Self-hosted escape hatch: `GHAGGA_ALLOW_PRIVATE_GATEWAY=true` skips the
|
|
39
|
+
* IP-range checks (for gateways that legitimately live on a private network) —
|
|
40
|
+
* the connection is STILL pinned to the resolved address, and the protocol /
|
|
41
|
+
* userinfo checks are always enforced.
|
|
14
42
|
*/
|
|
15
43
|
export interface GatewayOptions {
|
|
16
44
|
/** Gateway base URL (e.g., "https://llm-gateway.javierzader.com") */
|
|
17
45
|
gatewayUrl: string;
|
|
18
46
|
/** Bearer token for gateway authentication */
|
|
19
47
|
gatewayToken: string;
|
|
48
|
+
/**
|
|
49
|
+
* Bridge-side provider id to route to (e.g. 'codex-cli'). When set, the
|
|
50
|
+
* bridge selects this provider directly and skips model-based routing.
|
|
51
|
+
*/
|
|
52
|
+
provider?: string;
|
|
20
53
|
/** Model to request (optional — gateway can auto-select) */
|
|
21
54
|
model?: string;
|
|
22
55
|
/** Project identifier for gateway tracking/routing */
|
|
@@ -28,6 +61,67 @@ export interface GatewayResponse {
|
|
|
28
61
|
model: string;
|
|
29
62
|
tokensUsed?: number;
|
|
30
63
|
}
|
|
64
|
+
/** A hostname resolved and validated to a single approved, pinned address. */
|
|
65
|
+
export interface PinnedHost {
|
|
66
|
+
/** Parsed, protocol-checked URL. */
|
|
67
|
+
url: URL;
|
|
68
|
+
/** Hostname (brackets stripped for IPv6) — used for Host header + SNI. */
|
|
69
|
+
hostname: string;
|
|
70
|
+
/** The approved IP the socket is pinned to. */
|
|
71
|
+
ip: string;
|
|
72
|
+
/** IP family of the pinned address (4 or 6). */
|
|
73
|
+
family: 4 | 6;
|
|
74
|
+
/** Effective port. */
|
|
75
|
+
port: number;
|
|
76
|
+
}
|
|
77
|
+
/** An address record returned by DNS lookup. */
|
|
78
|
+
interface LookupAddress {
|
|
79
|
+
address: string;
|
|
80
|
+
family: number;
|
|
81
|
+
}
|
|
82
|
+
/** DNS resolver signature — injectable for tests. */
|
|
83
|
+
export type ResolveAllFn = (hostname: string) => Promise<LookupAddress[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a user-supplied gateway URL to exactly ONE approved, pinned IP.
|
|
86
|
+
*
|
|
87
|
+
* SECURITY: never echoes the hostname/address in thrown messages — the URL IS
|
|
88
|
+
* the SSRF target. Callers log the category only.
|
|
89
|
+
*
|
|
90
|
+
* @throws {Error} with a generic reason if the URL is unusable or forbidden.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveAndPinHost(rawUrl: string, resolveAll?: ResolveAllFn, opts?: {
|
|
93
|
+
signal?: AbortSignal;
|
|
94
|
+
dnsTimeoutMs?: number;
|
|
95
|
+
}): Promise<PinnedHost>;
|
|
96
|
+
/** Minimal fetch-like response returned by pinnedFetch. */
|
|
97
|
+
export interface PinnedResponse {
|
|
98
|
+
ok: boolean;
|
|
99
|
+
status: number;
|
|
100
|
+
text(): Promise<string>;
|
|
101
|
+
json(): Promise<unknown>;
|
|
102
|
+
}
|
|
103
|
+
interface PinnedRequestInit {
|
|
104
|
+
method: string;
|
|
105
|
+
headers: Record<string, string>;
|
|
106
|
+
body?: string;
|
|
107
|
+
/** Abort signal (e.g. AbortSignal.timeout(...)). */
|
|
108
|
+
signal?: AbortSignal;
|
|
109
|
+
/** Injectable resolver for tests. */
|
|
110
|
+
resolveAll?: ResolveAllFn;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Perform an HTTP(S) request to a user-supplied gateway URL with the connection
|
|
114
|
+
* PINNED to a validated, non-forbidden IP (SEC-001). See the module header.
|
|
115
|
+
*
|
|
116
|
+
* Both the generation and discovery paths call this, so they share one policy.
|
|
117
|
+
*
|
|
118
|
+
* ERROR SHAPE: on failure this rejects with a PLAIN `Error` (e.g. 'request
|
|
119
|
+
* aborted', 'request timed out', 'gateway host DNS resolution timed out'), NOT a
|
|
120
|
+
* fetch-shaped `TypeError`/`AbortError`. Callers must not branch on error type
|
|
121
|
+
* (`err.name === 'AbortError'`); inspect the message or treat any rejection as a
|
|
122
|
+
* failed request.
|
|
123
|
+
*/
|
|
124
|
+
export declare function pinnedFetch(rawUrl: string, init: PinnedRequestInit): Promise<PinnedResponse>;
|
|
31
125
|
/**
|
|
32
126
|
* Generate text via the LLM Gateway.
|
|
33
127
|
*
|
|
@@ -37,4 +131,5 @@ export interface GatewayResponse {
|
|
|
37
131
|
* @returns Gateway response with generated text and metadata
|
|
38
132
|
*/
|
|
39
133
|
export declare function generateViaGateway(prompt: string, systemPrompt?: string, options?: GatewayOptions): Promise<GatewayResponse>;
|
|
134
|
+
export {};
|
|
40
135
|
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/providers/gateway.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/providers/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AASH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkID,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,GAAG,EAAE,GAAG,CAAC;IACT,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IACd,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gDAAgD;AAChD,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;AA8D1E;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,YAAgC,EAC5C,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,UAAU,CAAC,CA+ErB;AAID,2DAA2D;AAC3D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,cAAc,CAAC,CAwFzB;AAID;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
|