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.
Files changed (79) hide show
  1. package/dist/agents/audit.js +1 -1
  2. package/dist/agents/audit.js.map +1 -1
  3. package/dist/agents/diagnostic.d.ts.map +1 -1
  4. package/dist/agents/diagnostic.js +1 -1
  5. package/dist/agents/diagnostic.js.map +1 -1
  6. package/dist/agents/fan-out-lenses.js +1 -1
  7. package/dist/agents/fan-out-lenses.js.map +1 -1
  8. package/dist/agents/prompts.js +1 -1
  9. package/dist/agents/prompts.js.map +1 -1
  10. package/dist/agents/simple.d.ts.map +1 -1
  11. package/dist/agents/simple.js +1 -1
  12. package/dist/agents/simple.js.map +1 -1
  13. package/dist/embed.d.ts +140 -0
  14. package/dist/embed.d.ts.map +1 -1
  15. package/dist/embed.js +288 -0
  16. package/dist/embed.js.map +1 -1
  17. package/dist/index.d.ts +6 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/memory/backfill.d.ts +58 -0
  22. package/dist/memory/backfill.d.ts.map +1 -0
  23. package/dist/memory/backfill.js +85 -0
  24. package/dist/memory/backfill.js.map +1 -0
  25. package/dist/memory/sqlite.d.ts +78 -12
  26. package/dist/memory/sqlite.d.ts.map +1 -1
  27. package/dist/memory/sqlite.js +265 -85
  28. package/dist/memory/sqlite.js.map +1 -1
  29. package/dist/pipeline/gather-context.d.ts.map +1 -1
  30. package/dist/pipeline/gather-context.js +4 -2
  31. package/dist/pipeline/gather-context.js.map +1 -1
  32. package/dist/pipeline/gather-safe.d.ts +24 -4
  33. package/dist/pipeline/gather-safe.d.ts.map +1 -1
  34. package/dist/pipeline/gather-safe.js +42 -6
  35. package/dist/pipeline/gather-safe.js.map +1 -1
  36. package/dist/pipeline/prepare.d.ts.map +1 -1
  37. package/dist/pipeline/prepare.js +26 -0
  38. package/dist/pipeline/prepare.js.map +1 -1
  39. package/dist/pipeline/providers.d.ts.map +1 -1
  40. package/dist/pipeline/providers.js +1 -0
  41. package/dist/pipeline/providers.js.map +1 -1
  42. package/dist/pipeline/state.d.ts +3 -1
  43. package/dist/pipeline/state.d.ts.map +1 -1
  44. package/dist/providers/cli-bridge.d.ts +5 -0
  45. package/dist/providers/cli-bridge.d.ts.map +1 -1
  46. package/dist/providers/cli-bridge.js +65 -5
  47. package/dist/providers/cli-bridge.js.map +1 -1
  48. package/dist/providers/gateway-discovery.d.ts +60 -0
  49. package/dist/providers/gateway-discovery.d.ts.map +1 -0
  50. package/dist/providers/gateway-discovery.js +118 -0
  51. package/dist/providers/gateway-discovery.js.map +1 -0
  52. package/dist/providers/gateway.d.ts +95 -0
  53. package/dist/providers/gateway.d.ts.map +1 -1
  54. package/dist/providers/gateway.js +391 -9
  55. package/dist/providers/gateway.js.map +1 -1
  56. package/dist/providers/generate-fn.d.ts +1 -0
  57. package/dist/providers/generate-fn.d.ts.map +1 -1
  58. package/dist/providers/generate-fn.js.map +1 -1
  59. package/dist/tools/cpd.js +2 -2
  60. package/dist/tools/cpd.js.map +1 -1
  61. package/dist/tools/execution.d.ts +3 -1
  62. package/dist/tools/execution.d.ts.map +1 -1
  63. package/dist/tools/execution.js +10 -2
  64. package/dist/tools/execution.js.map +1 -1
  65. package/dist/tools/gitleaks-config.toml +23 -0
  66. package/dist/tools/runner.d.ts.map +1 -1
  67. package/dist/tools/runner.js +2 -1
  68. package/dist/tools/runner.js.map +1 -1
  69. package/dist/tools/semgrep.js +2 -2
  70. package/dist/tools/semgrep.js.map +1 -1
  71. package/dist/types.d.ts +47 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js.map +1 -1
  74. package/dist/utils/concurrency.d.ts.map +1 -1
  75. package/dist/utils/concurrency.js +37 -1
  76. package/dist/utils/concurrency.js.map +1 -1
  77. package/dist/utils/llm-timeout.d.ts +1 -1
  78. package/dist/utils/llm-timeout.d.ts.map +1 -1
  79. 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((a) => a.available).map((a) => a.name);
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
- if (resolvedCLI && credentialEnvName) {
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
- const credentialValue = credentials[credentialEnvName];
418
- subprocessEnv = buildSubprocessEnv(credentialEnvName, credentialValue);
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
- const available = adapters.filter((a) => a.available);
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;;;;;;;;;;;;;GAaG;AAIH,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,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;AAID;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,eAAe,CAAC,CAyC1B"}
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"}