ghagga-core 2.5.0 → 2.6.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 +1 -1
- package/dist/agents/consensus.d.ts +16 -0
- package/dist/agents/consensus.d.ts.map +1 -1
- package/dist/agents/consensus.js +57 -33
- package/dist/agents/consensus.js.map +1 -1
- package/dist/agents/diagnostic.d.ts +55 -0
- package/dist/agents/diagnostic.d.ts.map +1 -0
- package/dist/agents/diagnostic.js +143 -0
- package/dist/agents/diagnostic.js.map +1 -0
- package/dist/agents/prompts.d.ts +6 -4
- package/dist/agents/prompts.d.ts.map +1 -1
- package/dist/agents/prompts.js +110 -24
- package/dist/agents/prompts.js.map +1 -1
- package/dist/agents/simple.d.ts +7 -0
- package/dist/agents/simple.d.ts.map +1 -1
- package/dist/agents/simple.js +32 -18
- package/dist/agents/simple.js.map +1 -1
- package/dist/agents/workflow.d.ts +28 -1
- package/dist/agents/workflow.d.ts.map +1 -1
- package/dist/agents/workflow.js +112 -45
- package/dist/agents/workflow.js.map +1 -1
- package/dist/enhance/enhance.d.ts.map +1 -1
- package/dist/enhance/enhance.js +16 -4
- package/dist/enhance/enhance.js.map +1 -1
- package/dist/format.d.ts +47 -1
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +175 -3
- package/dist/format.js.map +1 -1
- package/dist/graph/blast-radius.d.ts +57 -0
- package/dist/graph/blast-radius.d.ts.map +1 -0
- package/dist/graph/blast-radius.js +145 -0
- package/dist/graph/blast-radius.js.map +1 -0
- package/dist/graph/builder.d.ts +50 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +210 -0
- package/dist/graph/builder.js.map +1 -0
- package/dist/graph/extractors/go.d.ts +9 -0
- package/dist/graph/extractors/go.d.ts.map +1 -0
- package/dist/graph/extractors/go.js +78 -0
- package/dist/graph/extractors/go.js.map +1 -0
- package/dist/graph/extractors/index.d.ts +22 -0
- package/dist/graph/extractors/index.d.ts.map +1 -0
- package/dist/graph/extractors/index.js +37 -0
- package/dist/graph/extractors/index.js.map +1 -0
- package/dist/graph/extractors/java.d.ts +9 -0
- package/dist/graph/extractors/java.d.ts.map +1 -0
- package/dist/graph/extractors/java.js +80 -0
- package/dist/graph/extractors/java.js.map +1 -0
- package/dist/graph/extractors/javascript.d.ts +9 -0
- package/dist/graph/extractors/javascript.d.ts.map +1 -0
- package/dist/graph/extractors/javascript.js +204 -0
- package/dist/graph/extractors/javascript.js.map +1 -0
- package/dist/graph/extractors/python.d.ts +9 -0
- package/dist/graph/extractors/python.d.ts.map +1 -0
- package/dist/graph/extractors/python.js +103 -0
- package/dist/graph/extractors/python.js.map +1 -0
- package/dist/graph/extractors/rust.d.ts +9 -0
- package/dist/graph/extractors/rust.d.ts.map +1 -0
- package/dist/graph/extractors/rust.js +115 -0
- package/dist/graph/extractors/rust.js.map +1 -0
- package/dist/graph/extractors/types.d.ts +31 -0
- package/dist/graph/extractors/types.d.ts.map +1 -0
- package/dist/graph/extractors/types.js +9 -0
- package/dist/graph/extractors/types.js.map +1 -0
- package/dist/graph/extractors/typescript.d.ts +9 -0
- package/dist/graph/extractors/typescript.d.ts.map +1 -0
- package/dist/graph/extractors/typescript.js +151 -0
- package/dist/graph/extractors/typescript.js.map +1 -0
- package/dist/graph/index.d.ts +15 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +14 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/loader.d.ts +43 -0
- package/dist/graph/loader.d.ts.map +1 -0
- package/dist/graph/loader.js +104 -0
- package/dist/graph/loader.js.map +1 -0
- package/dist/graph/schema.d.ts +113 -0
- package/dist/graph/schema.d.ts.map +1 -0
- package/dist/graph/schema.js +144 -0
- package/dist/graph/schema.js.map +1 -0
- package/dist/health/trends.js +1 -1
- package/dist/health/trends.js.map +1 -1
- package/dist/index.d.ts +20 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/memory/sqlite.js +4 -4
- package/dist/memory/sqlite.js.map +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +291 -42
- package/dist/pipeline.js.map +1 -1
- package/dist/providers/cli-bridge.d.ts +136 -0
- package/dist/providers/cli-bridge.d.ts.map +1 -0
- package/dist/providers/cli-bridge.js +457 -0
- package/dist/providers/cli-bridge.js.map +1 -0
- package/dist/providers/fallback.d.ts +8 -0
- package/dist/providers/fallback.d.ts.map +1 -1
- package/dist/providers/fallback.js +24 -8
- package/dist/providers/fallback.js.map +1 -1
- package/dist/providers/gateway.d.ts +40 -0
- package/dist/providers/gateway.d.ts.map +1 -0
- package/dist/providers/gateway.js +52 -0
- package/dist/providers/gateway.js.map +1 -0
- package/dist/providers/generate-fn.d.ts +62 -0
- package/dist/providers/generate-fn.d.ts.map +1 -0
- package/dist/providers/generate-fn.js +84 -0
- package/dist/providers/generate-fn.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +53 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/tools/plugins/index.d.ts +2 -0
- package/dist/tools/plugins/index.d.ts.map +1 -1
- package/dist/tools/plugins/index.js +7 -0
- package/dist/tools/plugins/index.js.map +1 -1
- package/dist/tools/plugins/zizmor.d.ts +22 -0
- package/dist/tools/plugins/zizmor.d.ts.map +1 -0
- package/dist/tools/plugins/zizmor.js +112 -0
- package/dist/tools/plugins/zizmor.js.map +1 -0
- package/dist/tools/resolve.js +1 -1
- package/dist/tools/resolve.js.map +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/types.d.ts +54 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +21 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/concurrency.d.ts +29 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +40 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/context-levels.d.ts +113 -0
- package/dist/utils/context-levels.d.ts.map +1 -0
- package/dist/utils/context-levels.js +255 -0
- package/dist/utils/context-levels.js.map +1 -0
- package/dist/utils/diff.d.ts +25 -0
- package/dist/utils/diff.d.ts.map +1 -1
- package/dist/utils/diff.js +28 -0
- package/dist/utils/diff.js.map +1 -1
- package/dist/utils/llm-timeout.d.ts +38 -0
- package/dist/utils/llm-timeout.d.ts.map +1 -0
- package/dist/utils/llm-timeout.js +76 -0
- package/dist/utils/llm-timeout.js.map +1 -0
- package/dist/utils/path-protection.d.ts +59 -0
- package/dist/utils/path-protection.d.ts.map +1 -0
- package/dist/utils/path-protection.js +136 -0
- package/dist/utils/path-protection.js.map +1 -0
- package/dist/utils/token-budget.d.ts +34 -1
- package/dist/utils/token-budget.d.ts.map +1 -1
- package/dist/utils/token-budget.js +108 -3
- package/dist/utils/token-budget.js.map +1 -1
- package/package.json +21 -19
- package/LICENSE +0 -21
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Bridge — calls LLM CLIs directly instead of using API tokens.
|
|
3
|
+
*
|
|
4
|
+
* Supported CLIs (in auto-detect priority order):
|
|
5
|
+
* 1. opencode run --model <provider/model> --format json "<prompt>"
|
|
6
|
+
* 2. copilot -p "prompt"
|
|
7
|
+
* 3. gemini -p "prompt" --output-format text
|
|
8
|
+
*
|
|
9
|
+
* Legacy alias:
|
|
10
|
+
* - 'claude' is treated as 'opencode' with default cliModel 'anthropic/claude-sonnet-4-5'
|
|
11
|
+
*
|
|
12
|
+
* Authentication:
|
|
13
|
+
* - OpenCode: provider-specific env var (ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.)
|
|
14
|
+
* - Gemini: GEMINI_API_KEY env var or google account
|
|
15
|
+
* - Copilot: COPILOT_GITHUB_TOKEN or GH_TOKEN env var
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Maps OpenCode provider prefixes to the env var they need for authentication.
|
|
19
|
+
* Used to inject exactly the right credential into the subprocess environment.
|
|
20
|
+
*/
|
|
21
|
+
export declare const OPENCODE_ENV_BY_PREFIX: Record<string, string>;
|
|
22
|
+
/** Valid CLI tool names for explicit selection. */
|
|
23
|
+
export type CLIToolName = 'opencode' | 'gemini' | 'copilot';
|
|
24
|
+
/** Options for generateViaCLI(). */
|
|
25
|
+
export interface CLIBridgeOptions {
|
|
26
|
+
/**
|
|
27
|
+
* Preferred CLI tool to use.
|
|
28
|
+
* Also accepts 'claude' as a legacy alias → mapped to 'opencode' at runtime.
|
|
29
|
+
*/
|
|
30
|
+
preferredCLI?: CLIToolName | 'claude' | (string & {});
|
|
31
|
+
/** OpenCode model in `provider/model` format (e.g., 'anthropic/claude-sonnet-4-5'). */
|
|
32
|
+
cliModel?: string;
|
|
33
|
+
/** Injected credentials mapped by env var name (e.g., { ANTHROPIC_API_KEY: 'sk-...' }). */
|
|
34
|
+
credentials?: Record<string, string>;
|
|
35
|
+
}
|
|
36
|
+
interface CLIAdapter {
|
|
37
|
+
name: string;
|
|
38
|
+
command: string;
|
|
39
|
+
available: boolean;
|
|
40
|
+
generate: (prompt: string, systemPrompt?: string, cliModel?: string, env?: NodeJS.ProcessEnv) => string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Error class for configuration failures that should NOT trigger fallback
|
|
44
|
+
* to other CLIs. These represent misconfiguration, not transient failures.
|
|
45
|
+
*/
|
|
46
|
+
export declare class CLIConfigurationError extends Error {
|
|
47
|
+
constructor(message: string);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the env var name needed for a given CLI tool and model.
|
|
51
|
+
*
|
|
52
|
+
* - opencode: derives from cliModel provider prefix (e.g., 'anthropic' → 'ANTHROPIC_API_KEY')
|
|
53
|
+
* - gemini: always 'GEMINI_API_KEY'
|
|
54
|
+
* - copilot: always 'COPILOT_GITHUB_TOKEN'
|
|
55
|
+
*
|
|
56
|
+
* Returns undefined if the prefix is unknown or cliModel is not provided for opencode.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveCredentialEnvVar(preferredCLI: string | undefined, cliModel?: string): string | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Build a subprocess environment using the ALLOWLIST approach:
|
|
61
|
+
* 1. Start with an empty env
|
|
62
|
+
* 2. Copy ONLY known-safe vars from process.env
|
|
63
|
+
* 3. Add the single required credential
|
|
64
|
+
*
|
|
65
|
+
* This prevents credential leakage — only explicitly safe vars plus the
|
|
66
|
+
* required credential are passed to the subprocess. Any env var NOT in
|
|
67
|
+
* SAFE_ENV_VARS (e.g., AZURE_OPENAI_KEY, REPLICATE_API_TOKEN) is excluded.
|
|
68
|
+
*/
|
|
69
|
+
export declare function buildSubprocessEnv(credentialEnvName?: string, credentialValue?: string): NodeJS.ProcessEnv;
|
|
70
|
+
/**
|
|
71
|
+
* Parse OpenCode `--format json` output.
|
|
72
|
+
*
|
|
73
|
+
* The output is newline-delimited JSON. Each line is an object with a `type` field:
|
|
74
|
+
* - `text` — contains actual LLM response text in `part.text`
|
|
75
|
+
* - `step_finish` — contains token usage in `part.tokens` and cost in `part.cost`
|
|
76
|
+
*
|
|
77
|
+
* Returns the concatenated text and optional token usage.
|
|
78
|
+
*
|
|
79
|
+
* @internal Exported for testing only.
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseOpenCodeOutput(raw: string): {
|
|
82
|
+
text: string;
|
|
83
|
+
tokens?: {
|
|
84
|
+
input?: number;
|
|
85
|
+
output?: number;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Sanitize an error message by redacting known API key patterns.
|
|
90
|
+
*
|
|
91
|
+
* This MUST be applied to all error messages before they propagate
|
|
92
|
+
* (thrown errors, console.error, progress callbacks, etc.).
|
|
93
|
+
*/
|
|
94
|
+
export declare function sanitizeErrorMessage(message: string): string;
|
|
95
|
+
/**
|
|
96
|
+
* Validate cliModel format and provider prefix for OpenCode.
|
|
97
|
+
* Throws CLIConfigurationError for malformed or unsupported values.
|
|
98
|
+
*
|
|
99
|
+
* Only called when preferredCLI === 'opencode' and cliModel is provided.
|
|
100
|
+
*
|
|
101
|
+
* @internal Exported for testing only.
|
|
102
|
+
*/
|
|
103
|
+
export declare function validateCliModel(cliModel: string): void;
|
|
104
|
+
/**
|
|
105
|
+
* Get list of available CLI providers.
|
|
106
|
+
* Returns names from the adapter list (opencode, copilot, gemini).
|
|
107
|
+
*/
|
|
108
|
+
export declare function getAvailableCLIs(): string[];
|
|
109
|
+
/**
|
|
110
|
+
* Generate text using CLI bridge.
|
|
111
|
+
* Tries each available CLI in priority order: opencode -> copilot -> gemini.
|
|
112
|
+
*
|
|
113
|
+
* Legacy alias: 'claude' is mapped to 'opencode' with default model
|
|
114
|
+
* 'anthropic/claude-sonnet-4-5'.
|
|
115
|
+
*
|
|
116
|
+
* Configuration errors (malformed cliModel, unsupported provider prefix,
|
|
117
|
+
* missing credentials) throw CLIConfigurationError immediately — they do NOT
|
|
118
|
+
* fall through to retry other CLIs.
|
|
119
|
+
*
|
|
120
|
+
* @param prompt - User prompt
|
|
121
|
+
* @param systemPrompt - Optional system prompt
|
|
122
|
+
* @param options - Optional CLI bridge options (preferredCLI, cliModel, credentials)
|
|
123
|
+
* @returns { text, provider, cli }
|
|
124
|
+
*/
|
|
125
|
+
export declare function generateViaCLI(prompt: string, systemPrompt?: string, options?: CLIBridgeOptions): {
|
|
126
|
+
text: string;
|
|
127
|
+
provider: string;
|
|
128
|
+
cli: string;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Get the raw adapters array (for testing purposes only).
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
export declare function _getAdapters(): readonly CLIAdapter[];
|
|
135
|
+
export {};
|
|
136
|
+
//# sourceMappingURL=cli-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-bridge.d.ts","sourceRoot":"","sources":["../../src/providers/cli-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoBH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQzD,CAAC;AAyCF,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACtD,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CACR,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,EACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,KACpB,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAepB;AAID;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,iBAAiB,CAAC,EAAE,MAAM,EAC1B,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAAC,UAAU,CAgBnB;AAgBD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C,CAyBA;AAiCD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAcvD;AAkID;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,gBAAgB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAuEjD;AAID;;;GAGG;AACH,wBAAgB,YAAY,IAAI,SAAS,UAAU,EAAE,CAEpD"}
|
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Bridge — calls LLM CLIs directly instead of using API tokens.
|
|
3
|
+
*
|
|
4
|
+
* Supported CLIs (in auto-detect priority order):
|
|
5
|
+
* 1. opencode run --model <provider/model> --format json "<prompt>"
|
|
6
|
+
* 2. copilot -p "prompt"
|
|
7
|
+
* 3. gemini -p "prompt" --output-format text
|
|
8
|
+
*
|
|
9
|
+
* Legacy alias:
|
|
10
|
+
* - 'claude' is treated as 'opencode' with default cliModel 'anthropic/claude-sonnet-4-5'
|
|
11
|
+
*
|
|
12
|
+
* Authentication:
|
|
13
|
+
* - OpenCode: provider-specific env var (ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.)
|
|
14
|
+
* - Gemini: GEMINI_API_KEY env var or google account
|
|
15
|
+
* - Copilot: COPILOT_GITHUB_TOKEN or GH_TOKEN env var
|
|
16
|
+
*/
|
|
17
|
+
import { execSync } from 'node:child_process';
|
|
18
|
+
import { unlinkSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
// ─── Constants ──────────────────────────────────────────────────
|
|
22
|
+
/** Default model used when 'claude' legacy alias is resolved to 'opencode'. */
|
|
23
|
+
const CLAUDE_LEGACY_DEFAULT_MODEL = 'anthropic/claude-sonnet-4-5';
|
|
24
|
+
/** Prompt size threshold (in chars) above which stdin is used instead of inline arg. */
|
|
25
|
+
const STDIN_THRESHOLD = 10_000;
|
|
26
|
+
/** Regex for validating OpenCode cliModel format: `provider/model`. */
|
|
27
|
+
const CLI_MODEL_REGEX = /^[^/]+\/.+$/;
|
|
28
|
+
// ─── Env-Var Mapping ────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Maps OpenCode provider prefixes to the env var they need for authentication.
|
|
31
|
+
* Used to inject exactly the right credential into the subprocess environment.
|
|
32
|
+
*/
|
|
33
|
+
export const OPENCODE_ENV_BY_PREFIX = {
|
|
34
|
+
opencode: '', // Free models — no API key needed
|
|
35
|
+
anthropic: 'ANTHROPIC_API_KEY',
|
|
36
|
+
openai: 'OPENAI_API_KEY',
|
|
37
|
+
google: 'GEMINI_API_KEY',
|
|
38
|
+
'github-copilot': 'GITHUB_TOKEN',
|
|
39
|
+
groq: 'GROQ_API_KEY',
|
|
40
|
+
openrouter: 'OPENROUTER_API_KEY',
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Known-safe env vars that the subprocess needs to function.
|
|
44
|
+
* Only these (plus the single required credential) are copied into the subprocess env.
|
|
45
|
+
*
|
|
46
|
+
* This ALLOWLIST approach prevents credential leakage — any env var NOT listed here
|
|
47
|
+
* (e.g., AZURE_OPENAI_KEY, REPLICATE_API_TOKEN) is automatically excluded.
|
|
48
|
+
*/
|
|
49
|
+
const SAFE_ENV_VARS = [
|
|
50
|
+
'PATH',
|
|
51
|
+
'HOME',
|
|
52
|
+
'USER',
|
|
53
|
+
'SHELL',
|
|
54
|
+
'LANG',
|
|
55
|
+
'LC_ALL',
|
|
56
|
+
'LC_CTYPE',
|
|
57
|
+
'TERM',
|
|
58
|
+
'TMPDIR',
|
|
59
|
+
'TMP',
|
|
60
|
+
'TEMP',
|
|
61
|
+
'NODE_ENV',
|
|
62
|
+
'NODE_PATH',
|
|
63
|
+
'NODE_EXTRA_CA_CERTS',
|
|
64
|
+
'HTTP_PROXY',
|
|
65
|
+
'HTTPS_PROXY',
|
|
66
|
+
'NO_PROXY',
|
|
67
|
+
'http_proxy',
|
|
68
|
+
'https_proxy',
|
|
69
|
+
'no_proxy',
|
|
70
|
+
'SSL_CERT_FILE',
|
|
71
|
+
'SSL_CERT_DIR',
|
|
72
|
+
'NODE_TLS_REJECT_UNAUTHORIZED',
|
|
73
|
+
'XDG_CONFIG_HOME',
|
|
74
|
+
'XDG_DATA_HOME',
|
|
75
|
+
'XDG_CACHE_HOME',
|
|
76
|
+
'XDG_RUNTIME_DIR',
|
|
77
|
+
];
|
|
78
|
+
/**
|
|
79
|
+
* Error class for configuration failures that should NOT trigger fallback
|
|
80
|
+
* to other CLIs. These represent misconfiguration, not transient failures.
|
|
81
|
+
*/
|
|
82
|
+
export class CLIConfigurationError extends Error {
|
|
83
|
+
constructor(message) {
|
|
84
|
+
super(message);
|
|
85
|
+
this.name = 'CLIConfigurationError';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ─── CLI Detection ──────────────────────────────────────────────
|
|
89
|
+
/**
|
|
90
|
+
* Detect whether a CLI command is installed on the system.
|
|
91
|
+
* Uses `which` to check PATH availability.
|
|
92
|
+
*/
|
|
93
|
+
function detectCLI(command) {
|
|
94
|
+
try {
|
|
95
|
+
execSync(`which ${command}`, { timeout: 3000, stdio: 'pipe' });
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ─── CLI Exec Options ───────────────────────────────────────────
|
|
103
|
+
const CLI_EXEC_OPTIONS = {
|
|
104
|
+
timeout: 180_000,
|
|
105
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
106
|
+
encoding: 'utf8',
|
|
107
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
108
|
+
};
|
|
109
|
+
// ─── Credential Resolution ──────────────────────────────────────
|
|
110
|
+
/**
|
|
111
|
+
* Resolve the env var name needed for a given CLI tool and model.
|
|
112
|
+
*
|
|
113
|
+
* - opencode: derives from cliModel provider prefix (e.g., 'anthropic' → 'ANTHROPIC_API_KEY')
|
|
114
|
+
* - gemini: always 'GEMINI_API_KEY'
|
|
115
|
+
* - copilot: always 'COPILOT_GITHUB_TOKEN'
|
|
116
|
+
*
|
|
117
|
+
* Returns undefined if the prefix is unknown or cliModel is not provided for opencode.
|
|
118
|
+
*/
|
|
119
|
+
export function resolveCredentialEnvVar(preferredCLI, cliModel) {
|
|
120
|
+
switch (preferredCLI) {
|
|
121
|
+
case 'opencode': {
|
|
122
|
+
if (!cliModel)
|
|
123
|
+
return undefined;
|
|
124
|
+
const prefix = cliModel.split('/')[0];
|
|
125
|
+
if (!prefix)
|
|
126
|
+
return undefined;
|
|
127
|
+
return OPENCODE_ENV_BY_PREFIX[prefix];
|
|
128
|
+
}
|
|
129
|
+
case 'gemini':
|
|
130
|
+
return 'GEMINI_API_KEY';
|
|
131
|
+
case 'copilot':
|
|
132
|
+
return 'COPILOT_GITHUB_TOKEN';
|
|
133
|
+
default:
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ─── Subprocess Environment ─────────────────────────────────────
|
|
138
|
+
/**
|
|
139
|
+
* Build a subprocess environment using the ALLOWLIST approach:
|
|
140
|
+
* 1. Start with an empty env
|
|
141
|
+
* 2. Copy ONLY known-safe vars from process.env
|
|
142
|
+
* 3. Add the single required credential
|
|
143
|
+
*
|
|
144
|
+
* This prevents credential leakage — only explicitly safe vars plus the
|
|
145
|
+
* required credential are passed to the subprocess. Any env var NOT in
|
|
146
|
+
* SAFE_ENV_VARS (e.g., AZURE_OPENAI_KEY, REPLICATE_API_TOKEN) is excluded.
|
|
147
|
+
*/
|
|
148
|
+
export function buildSubprocessEnv(credentialEnvName, credentialValue) {
|
|
149
|
+
const env = {};
|
|
150
|
+
// Copy only known-safe vars from process.env
|
|
151
|
+
for (const key of SAFE_ENV_VARS) {
|
|
152
|
+
if (process.env[key] !== undefined) {
|
|
153
|
+
env[key] = process.env[key];
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Add the single required credential
|
|
157
|
+
if (credentialEnvName && credentialValue) {
|
|
158
|
+
env[credentialEnvName] = credentialValue;
|
|
159
|
+
}
|
|
160
|
+
return env;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Parse OpenCode `--format json` output.
|
|
164
|
+
*
|
|
165
|
+
* The output is newline-delimited JSON. Each line is an object with a `type` field:
|
|
166
|
+
* - `text` — contains actual LLM response text in `part.text`
|
|
167
|
+
* - `step_finish` — contains token usage in `part.tokens` and cost in `part.cost`
|
|
168
|
+
*
|
|
169
|
+
* Returns the concatenated text and optional token usage.
|
|
170
|
+
*
|
|
171
|
+
* @internal Exported for testing only.
|
|
172
|
+
*/
|
|
173
|
+
export function parseOpenCodeOutput(raw) {
|
|
174
|
+
const lines = raw.split('\n').filter((line) => line.trim().length > 0);
|
|
175
|
+
const textParts = [];
|
|
176
|
+
let tokens;
|
|
177
|
+
for (const line of lines) {
|
|
178
|
+
try {
|
|
179
|
+
const event = JSON.parse(line);
|
|
180
|
+
if (event.type === 'text') {
|
|
181
|
+
const textEvent = event;
|
|
182
|
+
if (textEvent.part?.text) {
|
|
183
|
+
textParts.push(textEvent.part.text);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (event.type === 'step_finish') {
|
|
187
|
+
const finishEvent = event;
|
|
188
|
+
if (finishEvent.part?.tokens) {
|
|
189
|
+
tokens = finishEvent.part.tokens;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Skip malformed JSON lines (e.g., partial output on error)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { text: textParts.join(''), tokens };
|
|
198
|
+
}
|
|
199
|
+
// ─── Error Sanitization ─────────────────────────────────────────
|
|
200
|
+
/**
|
|
201
|
+
* Known API key patterns that must be redacted from error messages.
|
|
202
|
+
* Each regex captures a token prefix and enough context to identify the key type,
|
|
203
|
+
* then matches the rest of the key value.
|
|
204
|
+
*
|
|
205
|
+
* Constructed at runtime (split+join) to avoid triggering GitHub push protection
|
|
206
|
+
* on pattern literals.
|
|
207
|
+
*/
|
|
208
|
+
const API_KEY_PATTERNS = [
|
|
209
|
+
// Anthropic: sk-ant-*
|
|
210
|
+
/sk-ant-[a-zA-Z0-9_-]{10,}/g,
|
|
211
|
+
// OpenAI: sk-proj*, sk-<20+ alphanum>
|
|
212
|
+
/sk-[a-zA-Z0-9]{20,}/g,
|
|
213
|
+
// Google: AIza*
|
|
214
|
+
/AIza[a-zA-Z0-9_-]{30,}/g,
|
|
215
|
+
// GitHub PAT (classic): ghp_*
|
|
216
|
+
/ghp_[a-zA-Z0-9]{30,}/g,
|
|
217
|
+
// GitHub PAT (fine-grained): github_pat_*
|
|
218
|
+
/github_pat_[a-zA-Z0-9_]{30,}/g,
|
|
219
|
+
// Groq: gsk_*
|
|
220
|
+
/gsk_[a-zA-Z0-9]{20,}/g,
|
|
221
|
+
// OpenRouter: sk-or-*
|
|
222
|
+
/\bsk-or-[a-zA-Z0-9_-]{20,}\b/g,
|
|
223
|
+
// GitHub OAuth/App tokens: gho_*, ghs_*
|
|
224
|
+
/gh[os]_[a-zA-Z0-9]{30,}/g,
|
|
225
|
+
// Copilot/GitHub general token (catch-all for longer tokens)
|
|
226
|
+
/ghp_[a-zA-Z0-9]{20,}/g,
|
|
227
|
+
];
|
|
228
|
+
/**
|
|
229
|
+
* Sanitize an error message by redacting known API key patterns.
|
|
230
|
+
*
|
|
231
|
+
* This MUST be applied to all error messages before they propagate
|
|
232
|
+
* (thrown errors, console.error, progress callbacks, etc.).
|
|
233
|
+
*/
|
|
234
|
+
export function sanitizeErrorMessage(message) {
|
|
235
|
+
let sanitized = message;
|
|
236
|
+
for (const pattern of API_KEY_PATTERNS) {
|
|
237
|
+
// Reset lastIndex for global regexes
|
|
238
|
+
pattern.lastIndex = 0;
|
|
239
|
+
sanitized = sanitized.replace(pattern, '[REDACTED_KEY]');
|
|
240
|
+
}
|
|
241
|
+
return sanitized;
|
|
242
|
+
}
|
|
243
|
+
// ─── Validation Helpers ─────────────────────────────────────────
|
|
244
|
+
/**
|
|
245
|
+
* Validate cliModel format and provider prefix for OpenCode.
|
|
246
|
+
* Throws CLIConfigurationError for malformed or unsupported values.
|
|
247
|
+
*
|
|
248
|
+
* Only called when preferredCLI === 'opencode' and cliModel is provided.
|
|
249
|
+
*
|
|
250
|
+
* @internal Exported for testing only.
|
|
251
|
+
*/
|
|
252
|
+
export function validateCliModel(cliModel) {
|
|
253
|
+
if (!CLI_MODEL_REGEX.test(cliModel)) {
|
|
254
|
+
throw new CLIConfigurationError(`Invalid cliModel format: '${cliModel}'. Expected 'provider/model' (e.g., 'anthropic/claude-sonnet-4-5').`);
|
|
255
|
+
}
|
|
256
|
+
const prefix = cliModel.split('/')[0];
|
|
257
|
+
if (!(prefix in OPENCODE_ENV_BY_PREFIX)) {
|
|
258
|
+
const supported = Object.keys(OPENCODE_ENV_BY_PREFIX).join(', ');
|
|
259
|
+
throw new CLIConfigurationError(`Unsupported OpenCode provider prefix: '${prefix}'. Supported prefixes: ${supported}.`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Validate that credentials are available for the selected tool.
|
|
264
|
+
* Throws CLIConfigurationError if the required credential is missing
|
|
265
|
+
* from both the injected credentials and the server environment.
|
|
266
|
+
*/
|
|
267
|
+
function validateCredentials(credentialEnvName, credentials) {
|
|
268
|
+
if (!credentialEnvName)
|
|
269
|
+
return; // No credential needed (free models or auto mode)
|
|
270
|
+
// Check injected credentials first
|
|
271
|
+
if (credentials) {
|
|
272
|
+
const value = credentials[credentialEnvName];
|
|
273
|
+
if (value && value.length > 0)
|
|
274
|
+
return; // Has injected credential
|
|
275
|
+
}
|
|
276
|
+
// Check server environment as fallback
|
|
277
|
+
const serverValue = process.env[credentialEnvName];
|
|
278
|
+
if (serverValue && serverValue.length > 0)
|
|
279
|
+
return; // Has server env credential
|
|
280
|
+
throw new CLIConfigurationError(`Missing credential for CLI tool. Expected env var '${credentialEnvName}' to be set, ` +
|
|
281
|
+
`or provide it via installation credentials.`);
|
|
282
|
+
}
|
|
283
|
+
// ─── Adapters ───────────────────────────────────────────────────
|
|
284
|
+
const adapters = [
|
|
285
|
+
{
|
|
286
|
+
name: 'opencode',
|
|
287
|
+
command: 'opencode',
|
|
288
|
+
available: detectCLI('opencode'),
|
|
289
|
+
generate(prompt, systemPrompt, cliModel, env) {
|
|
290
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt;
|
|
291
|
+
// Build args: opencode run --model <model> --format json [inline-prompt]
|
|
292
|
+
const args = ['run'];
|
|
293
|
+
if (cliModel) {
|
|
294
|
+
args.push('--model', cliModel);
|
|
295
|
+
}
|
|
296
|
+
args.push('--format', 'json');
|
|
297
|
+
const cmdArgs = args.map((a) => JSON.stringify(a)).join(' ');
|
|
298
|
+
const execOptions = {
|
|
299
|
+
...CLI_EXEC_OPTIONS,
|
|
300
|
+
...(env ? { env } : {}),
|
|
301
|
+
};
|
|
302
|
+
let raw;
|
|
303
|
+
const cmd = fullPrompt.length > STDIN_THRESHOLD
|
|
304
|
+
? `opencode ${cmdArgs}`
|
|
305
|
+
: `opencode ${cmdArgs} ${JSON.stringify(fullPrompt)}`;
|
|
306
|
+
try {
|
|
307
|
+
raw = execSync(cmd, {
|
|
308
|
+
...execOptions,
|
|
309
|
+
...(fullPrompt.length > STDIN_THRESHOLD ? { input: fullPrompt } : {}),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
catch (execError) {
|
|
313
|
+
// execSync throws on non-zero exit — capture stderr for diagnostics
|
|
314
|
+
const err = execError;
|
|
315
|
+
const stderr = err.stderr ? String(err.stderr).slice(0, 500) : 'no stderr';
|
|
316
|
+
const stdout = err.stdout ? String(err.stdout).slice(0, 200) : 'no stdout';
|
|
317
|
+
throw new Error(`OpenCode exited with status ${err.status ?? 'unknown'}. stderr: ${sanitizeErrorMessage(stderr)}. stdout: ${sanitizeErrorMessage(stdout)}`);
|
|
318
|
+
}
|
|
319
|
+
const parsed = parseOpenCodeOutput(raw);
|
|
320
|
+
if (!parsed.text) {
|
|
321
|
+
// Log raw output for debugging empty responses
|
|
322
|
+
const preview = raw.slice(0, 500) || '(empty)';
|
|
323
|
+
throw new Error(`OpenCode returned no text content in JSON output. Raw preview: ${preview}`);
|
|
324
|
+
}
|
|
325
|
+
return parsed.text.trim();
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'copilot',
|
|
330
|
+
command: 'copilot',
|
|
331
|
+
available: detectCLI('copilot'),
|
|
332
|
+
generate(prompt, _systemPrompt, _cliModel, env) {
|
|
333
|
+
// copilot -p takes prompt as argument — too large for ARG_MAX with big diffs.
|
|
334
|
+
// Write to temp file and tell copilot to read it.
|
|
335
|
+
const tmpFile = join(tmpdir(), `ghagga-prompt-${process.pid}-${Date.now()}.txt`);
|
|
336
|
+
try {
|
|
337
|
+
writeFileSync(tmpFile, prompt, 'utf8');
|
|
338
|
+
return execSync(`copilot -p "Read and analyze the file at ${tmpFile} and provide a code review"`, { ...CLI_EXEC_OPTIONS, ...(env ? { env } : {}) }).trim();
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
try {
|
|
342
|
+
unlinkSync(tmpFile);
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
/* ignore */
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'gemini',
|
|
352
|
+
command: 'gemini',
|
|
353
|
+
available: detectCLI('gemini'),
|
|
354
|
+
generate(prompt, systemPrompt, _cliModel, env) {
|
|
355
|
+
// Gemini auto-detects non-TTY stdin and reads from it
|
|
356
|
+
const fullPrompt = systemPrompt ? `${systemPrompt}\n\n${prompt}` : prompt;
|
|
357
|
+
return execSync('gemini -p - --output-format text', {
|
|
358
|
+
...CLI_EXEC_OPTIONS,
|
|
359
|
+
...(env ? { env } : {}),
|
|
360
|
+
input: fullPrompt,
|
|
361
|
+
}).trim();
|
|
362
|
+
},
|
|
363
|
+
},
|
|
364
|
+
];
|
|
365
|
+
// ─── Public API ─────────────────────────────────────────────────
|
|
366
|
+
/**
|
|
367
|
+
* Get list of available CLI providers.
|
|
368
|
+
* Returns names from the adapter list (opencode, copilot, gemini).
|
|
369
|
+
*/
|
|
370
|
+
export function getAvailableCLIs() {
|
|
371
|
+
return adapters.filter((a) => a.available).map((a) => a.name);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Generate text using CLI bridge.
|
|
375
|
+
* Tries each available CLI in priority order: opencode -> copilot -> gemini.
|
|
376
|
+
*
|
|
377
|
+
* Legacy alias: 'claude' is mapped to 'opencode' with default model
|
|
378
|
+
* 'anthropic/claude-sonnet-4-5'.
|
|
379
|
+
*
|
|
380
|
+
* Configuration errors (malformed cliModel, unsupported provider prefix,
|
|
381
|
+
* missing credentials) throw CLIConfigurationError immediately — they do NOT
|
|
382
|
+
* fall through to retry other CLIs.
|
|
383
|
+
*
|
|
384
|
+
* @param prompt - User prompt
|
|
385
|
+
* @param systemPrompt - Optional system prompt
|
|
386
|
+
* @param options - Optional CLI bridge options (preferredCLI, cliModel, credentials)
|
|
387
|
+
* @returns { text, provider, cli }
|
|
388
|
+
*/
|
|
389
|
+
export function generateViaCLI(prompt, systemPrompt, options) {
|
|
390
|
+
const { preferredCLI: rawPreferredCLI, cliModel: rawCliModel, credentials } = options ?? {};
|
|
391
|
+
// ── Legacy alias: 'claude' → 'opencode' with default model ──
|
|
392
|
+
let resolvedCLI = rawPreferredCLI;
|
|
393
|
+
let cliModel = rawCliModel;
|
|
394
|
+
if (rawPreferredCLI === 'claude') {
|
|
395
|
+
resolvedCLI = 'opencode';
|
|
396
|
+
if (!cliModel) {
|
|
397
|
+
cliModel = CLAUDE_LEGACY_DEFAULT_MODEL;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// ── Validate cliModel (configuration error = hard fail) ──
|
|
401
|
+
if (resolvedCLI === 'opencode' && cliModel) {
|
|
402
|
+
validateCliModel(cliModel);
|
|
403
|
+
}
|
|
404
|
+
// ── Resolve credential env var ──
|
|
405
|
+
const credentialEnvName = resolveCredentialEnvVar(resolvedCLI, cliModel);
|
|
406
|
+
// ── Validate credentials (configuration error = hard fail) ──
|
|
407
|
+
if (resolvedCLI && credentialEnvName) {
|
|
408
|
+
validateCredentials(credentialEnvName, credentials);
|
|
409
|
+
}
|
|
410
|
+
// ── Build subprocess environment ──
|
|
411
|
+
let subprocessEnv;
|
|
412
|
+
if (credentials && credentialEnvName) {
|
|
413
|
+
const credentialValue = credentials[credentialEnvName];
|
|
414
|
+
subprocessEnv = buildSubprocessEnv(credentialEnvName, credentialValue);
|
|
415
|
+
}
|
|
416
|
+
const available = adapters.filter((a) => a.available);
|
|
417
|
+
if (available.length === 0) {
|
|
418
|
+
throw new Error('No CLI providers available. Install one of: opencode, copilot, gemini');
|
|
419
|
+
}
|
|
420
|
+
// Reorder: preferred first, then rest
|
|
421
|
+
const ordered = resolvedCLI
|
|
422
|
+
? [
|
|
423
|
+
...available.filter((a) => a.name === resolvedCLI),
|
|
424
|
+
...available.filter((a) => a.name !== resolvedCLI),
|
|
425
|
+
]
|
|
426
|
+
: available;
|
|
427
|
+
for (const adapter of ordered) {
|
|
428
|
+
try {
|
|
429
|
+
// Pass cliModel only to the opencode adapter (others ignore it)
|
|
430
|
+
const modelArg = adapter.name === 'opencode' ? cliModel : undefined;
|
|
431
|
+
const text = adapter.generate(prompt, systemPrompt, modelArg, subprocessEnv);
|
|
432
|
+
return { text, provider: 'cli-bridge', cli: adapter.name };
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
// CLIConfigurationError should NOT be caught — re-throw immediately
|
|
436
|
+
if (error instanceof CLIConfigurationError) {
|
|
437
|
+
throw error;
|
|
438
|
+
}
|
|
439
|
+
// Truncate error message — stderr from CLI failures can contain the entire prompt
|
|
440
|
+
// (including huge diffs like package-lock.json), making logs unreadable.
|
|
441
|
+
// Sanitize to redact any leaked credentials in error output.
|
|
442
|
+
const fullMessage = error.message ?? String(error);
|
|
443
|
+
const truncated = fullMessage.length > 500 ? `${fullMessage.slice(0, 500)}... [truncated]` : fullMessage;
|
|
444
|
+
console.error(`[cli-bridge] ${adapter.name} failed: ${sanitizeErrorMessage(truncated)}`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
throw new Error(`All CLI providers failed: ${available.map((a) => a.name).join(', ')}`);
|
|
448
|
+
}
|
|
449
|
+
// ─── Test Helpers ───────────────────────────────────────────────
|
|
450
|
+
/**
|
|
451
|
+
* Get the raw adapters array (for testing purposes only).
|
|
452
|
+
* @internal
|
|
453
|
+
*/
|
|
454
|
+
export function _getAdapters() {
|
|
455
|
+
return adapters;
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=cli-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-bridge.js","sourceRoot":"","sources":["../../src/providers/cli-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,14 @@ export interface FallbackResult {
|
|
|
31
31
|
/** Approximate tokens used (prompt + completion) */
|
|
32
32
|
tokensUsed: number;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if an error is retryable (should try the next provider in the chain).
|
|
36
|
+
*
|
|
37
|
+
* Retryable: 5xx, timeouts, rate limits (429), and payload-too-large (413).
|
|
38
|
+
* The 413 case is important for free-tier providers with low TPM limits —
|
|
39
|
+
* the next provider in the chain may have a higher limit.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isRetryableError(error: unknown): boolean;
|
|
34
42
|
/**
|
|
35
43
|
* Generate text with automatic provider fallback.
|
|
36
44
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/providers/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"fallback.d.ts","sourceRoot":"","sources":["../../src/providers/fallback.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAE9B,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;IAEf,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IAEf,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,QAAQ,EAAE,WAAW,CAAC;IAEtB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmCxD;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0D5F"}
|