@panorama-ai/gateway 2.24.100

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 (58) hide show
  1. package/README.md +74 -0
  2. package/dist/cli-providers/claude-utils.d.ts +10 -0
  3. package/dist/cli-providers/claude-utils.d.ts.map +1 -0
  4. package/dist/cli-providers/claude-utils.js +73 -0
  5. package/dist/cli-providers/claude-utils.js.map +1 -0
  6. package/dist/cli-providers/claude.d.ts +3 -0
  7. package/dist/cli-providers/claude.d.ts.map +1 -0
  8. package/dist/cli-providers/claude.js +212 -0
  9. package/dist/cli-providers/claude.js.map +1 -0
  10. package/dist/cli-providers/codex-schema.d.ts +10 -0
  11. package/dist/cli-providers/codex-schema.d.ts.map +1 -0
  12. package/dist/cli-providers/codex-schema.js +76 -0
  13. package/dist/cli-providers/codex-schema.js.map +1 -0
  14. package/dist/cli-providers/codex.d.ts +3 -0
  15. package/dist/cli-providers/codex.d.ts.map +1 -0
  16. package/dist/cli-providers/codex.js +271 -0
  17. package/dist/cli-providers/codex.js.map +1 -0
  18. package/dist/cli-providers/gemini.d.ts +3 -0
  19. package/dist/cli-providers/gemini.d.ts.map +1 -0
  20. package/dist/cli-providers/gemini.js +214 -0
  21. package/dist/cli-providers/gemini.js.map +1 -0
  22. package/dist/cli-providers/registry.d.ts +5 -0
  23. package/dist/cli-providers/registry.d.ts.map +1 -0
  24. package/dist/cli-providers/registry.js +25 -0
  25. package/dist/cli-providers/registry.js.map +1 -0
  26. package/dist/cli-providers/types.d.ts +61 -0
  27. package/dist/cli-providers/types.d.ts.map +1 -0
  28. package/dist/cli-providers/types.js +2 -0
  29. package/dist/cli-providers/types.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +2288 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/subagent-adapters/claude-code.d.ts +3 -0
  35. package/dist/subagent-adapters/claude-code.d.ts.map +1 -0
  36. package/dist/subagent-adapters/claude-code.js +565 -0
  37. package/dist/subagent-adapters/claude-code.js.map +1 -0
  38. package/dist/subagent-adapters/claude-support.d.ts +30 -0
  39. package/dist/subagent-adapters/claude-support.d.ts.map +1 -0
  40. package/dist/subagent-adapters/claude-support.js +67 -0
  41. package/dist/subagent-adapters/claude-support.js.map +1 -0
  42. package/dist/subagent-adapters/codex.d.ts +3 -0
  43. package/dist/subagent-adapters/codex.d.ts.map +1 -0
  44. package/dist/subagent-adapters/codex.js +241 -0
  45. package/dist/subagent-adapters/codex.js.map +1 -0
  46. package/dist/subagent-adapters/gemini.d.ts +3 -0
  47. package/dist/subagent-adapters/gemini.d.ts.map +1 -0
  48. package/dist/subagent-adapters/gemini.js +257 -0
  49. package/dist/subagent-adapters/gemini.js.map +1 -0
  50. package/dist/subagent-adapters/registry.d.ts +4 -0
  51. package/dist/subagent-adapters/registry.d.ts.map +1 -0
  52. package/dist/subagent-adapters/registry.js +19 -0
  53. package/dist/subagent-adapters/registry.js.map +1 -0
  54. package/dist/subagent-adapters/types.d.ts +60 -0
  55. package/dist/subagent-adapters/types.d.ts.map +1 -0
  56. package/dist/subagent-adapters/types.js +2 -0
  57. package/dist/subagent-adapters/types.js.map +1 -0
  58. package/package.json +36 -0
@@ -0,0 +1,271 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import path from 'node:path';
4
+ import fsSync from 'node:fs';
5
+ import fs from 'node:fs/promises';
6
+ import { enforceCodexStrictSchema, normalizeCodexArgsPayload, normalizeCodexToolSchema, } from './codex-schema.js';
7
+ const execFileAsync = promisify(execFile);
8
+ const DEFAULT_CODEX_TIMEOUT_MS = 10_000;
9
+ const CODEX_ENV_ALLOWLIST = [
10
+ 'PATH',
11
+ 'HOME',
12
+ 'USER',
13
+ 'LOGNAME',
14
+ 'SHELL',
15
+ 'LANG',
16
+ 'LC_ALL',
17
+ 'LC_CTYPE',
18
+ 'TERM',
19
+ 'TMPDIR',
20
+ 'TMP',
21
+ 'TEMP',
22
+ 'HTTP_PROXY',
23
+ 'HTTPS_PROXY',
24
+ 'NO_PROXY',
25
+ 'http_proxy',
26
+ 'https_proxy',
27
+ 'no_proxy',
28
+ ];
29
+ const DEFAULT_CODEX_PATH = 'codex';
30
+ const CODEX_COMMAND = process.env.PANORAMA_CODEX_CLI || process.env.CODEX_CLI || DEFAULT_CODEX_PATH;
31
+ const CODEX_GATEWAY_HOME = process.env.PANORAMA_CODEX_HOME || null;
32
+ function buildCodexEnv() {
33
+ const env = {};
34
+ for (const key of CODEX_ENV_ALLOWLIST) {
35
+ const value = process.env[key];
36
+ if (value !== undefined) {
37
+ env[key] = value;
38
+ }
39
+ }
40
+ if (CODEX_GATEWAY_HOME) {
41
+ env.HOME = CODEX_GATEWAY_HOME;
42
+ }
43
+ return env;
44
+ }
45
+ async function ensureCodexHome() {
46
+ if (!CODEX_GATEWAY_HOME)
47
+ return;
48
+ await fs.mkdir(CODEX_GATEWAY_HOME, { recursive: true });
49
+ }
50
+ async function execCodexHelp() {
51
+ try {
52
+ const { stdout, stderr } = await execFileAsync(CODEX_COMMAND, ['exec', '--help'], {
53
+ timeout: DEFAULT_CODEX_TIMEOUT_MS,
54
+ });
55
+ return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') };
56
+ }
57
+ catch (error) {
58
+ const err = error;
59
+ return {
60
+ ok: false,
61
+ stdout: err.stdout ? String(err.stdout) : '',
62
+ stderr: err.stderr ? String(err.stderr) : '',
63
+ error: err.message,
64
+ };
65
+ }
66
+ }
67
+ async function execCodexVersion() {
68
+ try {
69
+ const { stdout } = await execFileAsync(CODEX_COMMAND, ['--version'], {
70
+ timeout: DEFAULT_CODEX_TIMEOUT_MS,
71
+ });
72
+ const version = String(stdout ?? '').trim();
73
+ return { ok: true, version: version || null };
74
+ }
75
+ catch (error) {
76
+ const err = error;
77
+ return { ok: false, version: null, error: err.message };
78
+ }
79
+ }
80
+ function parseHelpFlags(helpText) {
81
+ const text = helpText.toLowerCase();
82
+ const has = (flag) => text.includes(flag.toLowerCase());
83
+ return {
84
+ outputSchemaFlag: has('--output-schema'),
85
+ outputLastMessageFlag: has('--output-last-message') || has('-o, --output-last-message'),
86
+ jsonFlag: has('--json'),
87
+ sandboxFlag: has('--sandbox'),
88
+ skipGitRepoCheckFlag: has('--skip-git-repo-check'),
89
+ configFlag: has('-c, --config') || has('--config <key=value>'),
90
+ };
91
+ }
92
+ function stripCodeFence(text) {
93
+ const trimmed = text.trim();
94
+ if (trimmed.startsWith('```')) {
95
+ return trimmed.replace(/^```(?:json)?\n?/i, '').replace(/```$/i, '').trim();
96
+ }
97
+ return trimmed;
98
+ }
99
+ function parseJsonFromText(text) {
100
+ const cleaned = stripCodeFence(text);
101
+ const tryParse = (value) => {
102
+ try {
103
+ return JSON.parse(value);
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ };
109
+ const direct = tryParse(cleaned);
110
+ if (direct)
111
+ return direct;
112
+ const lines = cleaned
113
+ .split(/\r?\n/)
114
+ .map((line) => line.trim())
115
+ .filter(Boolean);
116
+ for (const line of lines) {
117
+ const parsed = tryParse(line);
118
+ if (parsed)
119
+ return parsed;
120
+ }
121
+ const firstBrace = cleaned.indexOf('{');
122
+ const lastBrace = cleaned.lastIndexOf('}');
123
+ if (firstBrace !== -1 && lastBrace > firstBrace) {
124
+ const slice = cleaned.slice(firstBrace, lastBrace + 1);
125
+ const parsed = tryParse(slice);
126
+ if (parsed)
127
+ return parsed;
128
+ }
129
+ throw new Error('Failed to parse JSON output');
130
+ }
131
+ function parseJsonlForOutput(stdout) {
132
+ const lines = stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
133
+ let outputText = null;
134
+ let usage = null;
135
+ for (const line of lines) {
136
+ try {
137
+ const event = JSON.parse(line);
138
+ if (event.type === 'item.completed') {
139
+ const item = event.item;
140
+ if (item?.type === 'agent_message' && typeof item.text === 'string') {
141
+ outputText = item.text;
142
+ }
143
+ }
144
+ if (event.type === 'turn.completed' && event.usage && typeof event.usage === 'object') {
145
+ usage = event.usage;
146
+ }
147
+ }
148
+ catch {
149
+ // ignore
150
+ }
151
+ }
152
+ if (!outputText)
153
+ return {};
154
+ return { output: parseJsonFromText(outputText), usage: usage ?? undefined };
155
+ }
156
+ export function createCodexCliProvider() {
157
+ let cachedFlags = {};
158
+ return {
159
+ id: 'codex',
160
+ label: 'OpenAI Codex',
161
+ normalizeSchema(schema) {
162
+ return normalizeCodexToolSchema(schema);
163
+ },
164
+ async detectCapabilities() {
165
+ await ensureCodexHome();
166
+ const versionInfo = await execCodexVersion();
167
+ const helpInfo = await execCodexHelp();
168
+ if (helpInfo.ok) {
169
+ cachedFlags = parseHelpFlags(`${helpInfo.stdout}\n${helpInfo.stderr}`);
170
+ }
171
+ else {
172
+ cachedFlags = {};
173
+ }
174
+ return {
175
+ available: versionInfo.ok,
176
+ version: versionInfo.version ?? undefined,
177
+ error: versionInfo.ok ? undefined : versionInfo.error,
178
+ supported_flags: cachedFlags,
179
+ supports: {
180
+ output_schema: !!(cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag),
181
+ stream_json: !!cachedFlags.jsonFlag,
182
+ tool_disable: !!cachedFlags.configFlag,
183
+ },
184
+ };
185
+ },
186
+ buildModelRunPlan(context) {
187
+ let prompt = context.prompt;
188
+ const args = [
189
+ 'exec',
190
+ '--sandbox',
191
+ 'read-only',
192
+ '--skip-git-repo-check',
193
+ '--model',
194
+ context.model,
195
+ ];
196
+ const files = [];
197
+ if (cachedFlags.configFlag) {
198
+ args.push('-c', 'model_reasoning_effort="high"');
199
+ args.push('-c', 'features.shell_tool=false');
200
+ args.push('-c', 'features.web_search_request=false');
201
+ args.push('-c', 'mcp_servers.beads.enabled=false');
202
+ }
203
+ let outputMode = 'stdout-json';
204
+ let outputPath;
205
+ if (cachedFlags.outputSchemaFlag && cachedFlags.outputLastMessageFlag) {
206
+ const schemaPath = 'schema.json';
207
+ outputPath = 'output.json';
208
+ const codexSchema = enforceCodexStrictSchema(context.jsonSchema);
209
+ files.push({ path: schemaPath, contents: JSON.stringify(codexSchema) });
210
+ args.push('--output-schema', schemaPath);
211
+ args.push('-o', outputPath);
212
+ outputMode = 'file-json';
213
+ }
214
+ else if (cachedFlags.jsonFlag) {
215
+ args.push('--json');
216
+ outputMode = 'stream-json';
217
+ }
218
+ else {
219
+ // fallback: embed schema in prompt
220
+ const schemaInline = JSON.stringify(enforceCodexStrictSchema(context.jsonSchema));
221
+ prompt = `${prompt}\n\nReturn STRICT JSON matching this schema:\n${schemaInline}`;
222
+ }
223
+ if (context.appendSystemPrompt) {
224
+ prompt = `${prompt}\n\n${context.appendSystemPrompt}`;
225
+ }
226
+ args.push(prompt);
227
+ return {
228
+ command: CODEX_COMMAND,
229
+ args,
230
+ env: buildCodexEnv(),
231
+ outputFormat: outputMode === 'stream-json' ? 'stream-json' : 'text',
232
+ outputMode,
233
+ outputPath,
234
+ files,
235
+ timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,
236
+ };
237
+ },
238
+ normalizeModelRunResult({ stdout, outputMode, outputPath, workDir }) {
239
+ if (outputMode === 'file-json') {
240
+ if (!outputPath) {
241
+ throw new Error('Codex output file path missing');
242
+ }
243
+ const filePath = path.join(workDir, outputPath);
244
+ if (!fsSync.existsSync(filePath)) {
245
+ throw new Error('Codex output file not found');
246
+ }
247
+ const fileContents = fsSync.readFileSync(filePath, 'utf-8');
248
+ const parsed = JSON.parse(fileContents);
249
+ const normalized = normalizeCodexArgsPayload(parsed);
250
+ return { output: normalized.output, raw: normalized.raw, usage: null, model: null };
251
+ }
252
+ if (outputMode === 'stream-json') {
253
+ const parsed = parseJsonlForOutput(stdout);
254
+ if (!parsed.output) {
255
+ throw new Error('Codex JSONL output missing agent message');
256
+ }
257
+ const normalized = normalizeCodexArgsPayload(parsed.output);
258
+ return {
259
+ output: normalized.output,
260
+ raw: normalized.raw,
261
+ usage: parsed.usage ?? null,
262
+ model: null,
263
+ };
264
+ }
265
+ const parsed = parseJsonFromText(stdout);
266
+ const normalized = normalizeCodexArgsPayload(parsed);
267
+ return { output: normalized.output, raw: normalized.raw, usage: null, model: null };
268
+ },
269
+ };
270
+ }
271
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/cli-providers/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { GatewayCliProvider } from './types.js';
2
+ export declare function createGeminiCliProvider(): GatewayCliProvider;
3
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/cli-providers/gemini.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAoD,MAAM,YAAY,CAAA;AA4ItG,wBAAgB,uBAAuB,IAAI,kBAAkB,CAgF5D"}
@@ -0,0 +1,214 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs/promises';
5
+ const execFileAsync = promisify(execFile);
6
+ const DEFAULT_GEMINI_TIMEOUT_MS = 10_000;
7
+ const GEMINI_ENV_ALLOWLIST = [
8
+ 'PATH',
9
+ 'HOME',
10
+ 'USER',
11
+ 'LOGNAME',
12
+ 'SHELL',
13
+ 'LANG',
14
+ 'LC_ALL',
15
+ 'LC_CTYPE',
16
+ 'TERM',
17
+ 'TMPDIR',
18
+ 'TMP',
19
+ 'TEMP',
20
+ 'HTTP_PROXY',
21
+ 'HTTPS_PROXY',
22
+ 'NO_PROXY',
23
+ 'http_proxy',
24
+ 'https_proxy',
25
+ 'no_proxy',
26
+ ];
27
+ const DEFAULT_GEMINI_PATH = 'gemini';
28
+ const GEMINI_COMMAND = process.env.PANORAMA_GEMINI_CLI || process.env.GEMINI_CLI || DEFAULT_GEMINI_PATH;
29
+ const GEMINI_GATEWAY_HOME = process.env.PANORAMA_GEMINI_HOME || null;
30
+ function buildGeminiEnv(systemPromptPath) {
31
+ const env = {};
32
+ for (const key of GEMINI_ENV_ALLOWLIST) {
33
+ const value = process.env[key];
34
+ if (value !== undefined) {
35
+ env[key] = value;
36
+ }
37
+ }
38
+ if (GEMINI_GATEWAY_HOME) {
39
+ env.HOME = GEMINI_GATEWAY_HOME;
40
+ }
41
+ if (systemPromptPath) {
42
+ env.GEMINI_SYSTEM_MD = systemPromptPath;
43
+ }
44
+ return env;
45
+ }
46
+ async function ensureGeminiHome() {
47
+ if (!GEMINI_GATEWAY_HOME)
48
+ return;
49
+ await fs.mkdir(GEMINI_GATEWAY_HOME, { recursive: true });
50
+ }
51
+ async function execGeminiHelp() {
52
+ try {
53
+ const { stdout, stderr } = await execFileAsync(GEMINI_COMMAND, ['--help'], {
54
+ timeout: DEFAULT_GEMINI_TIMEOUT_MS,
55
+ });
56
+ return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') };
57
+ }
58
+ catch (error) {
59
+ const err = error;
60
+ return {
61
+ ok: false,
62
+ stdout: err.stdout ? String(err.stdout) : '',
63
+ stderr: err.stderr ? String(err.stderr) : '',
64
+ error: err.message,
65
+ };
66
+ }
67
+ }
68
+ async function execGeminiVersion() {
69
+ try {
70
+ const { stdout } = await execFileAsync(GEMINI_COMMAND, ['--version'], {
71
+ timeout: DEFAULT_GEMINI_TIMEOUT_MS,
72
+ });
73
+ const version = String(stdout ?? '').trim();
74
+ return { ok: true, version: version || null };
75
+ }
76
+ catch (error) {
77
+ const err = error;
78
+ return { ok: false, version: null, error: err.message };
79
+ }
80
+ }
81
+ async function execGeminiExtensions() {
82
+ try {
83
+ const { stdout } = await execFileAsync(GEMINI_COMMAND, ['--list-extensions'], {
84
+ timeout: DEFAULT_GEMINI_TIMEOUT_MS,
85
+ });
86
+ const lines = String(stdout ?? '')
87
+ .split(/\r?\n/)
88
+ .map((line) => line.trim())
89
+ .filter((line) => line.length > 0 && line.toLowerCase() !== 'installed extensions:');
90
+ return { ok: true, list: lines };
91
+ }
92
+ catch (error) {
93
+ const err = error;
94
+ return { ok: false, list: [], error: err.message };
95
+ }
96
+ }
97
+ function stripCodeFence(text) {
98
+ const trimmed = text.trim();
99
+ if (trimmed.startsWith('```')) {
100
+ return trimmed.replace(/^```(?:json)?\n?/i, '').replace(/```$/i, '').trim();
101
+ }
102
+ return trimmed;
103
+ }
104
+ function parseJsonFromText(text) {
105
+ const trimmed = text.trim();
106
+ const tryParse = (value) => {
107
+ try {
108
+ return JSON.parse(value);
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ };
114
+ const direct = tryParse(trimmed);
115
+ if (direct)
116
+ return direct;
117
+ const lines = trimmed
118
+ .split(/\r?\n/)
119
+ .map((line) => line.trim())
120
+ .filter(Boolean);
121
+ for (const line of lines) {
122
+ const parsed = tryParse(line);
123
+ if (parsed)
124
+ return parsed;
125
+ }
126
+ const firstBrace = trimmed.indexOf('{');
127
+ const lastBrace = trimmed.lastIndexOf('}');
128
+ if (firstBrace !== -1 && lastBrace > firstBrace) {
129
+ const slice = trimmed.slice(firstBrace, lastBrace + 1);
130
+ const parsed = tryParse(slice);
131
+ if (parsed)
132
+ return parsed;
133
+ }
134
+ throw new Error('Failed to parse Gemini JSON output');
135
+ }
136
+ export function createGeminiCliProvider() {
137
+ let outputFormatSupported = true;
138
+ let extensions = [];
139
+ return {
140
+ id: 'gemini',
141
+ label: 'Gemini CLI',
142
+ async detectCapabilities() {
143
+ await ensureGeminiHome();
144
+ const versionInfo = await execGeminiVersion();
145
+ const helpInfo = await execGeminiHelp();
146
+ const extensionInfo = await execGeminiExtensions();
147
+ extensions = extensionInfo.list;
148
+ if (!helpInfo.ok) {
149
+ outputFormatSupported = true;
150
+ }
151
+ else {
152
+ const text = `${helpInfo.stdout}\n${helpInfo.stderr}`.toLowerCase();
153
+ outputFormatSupported = text.includes('--output-format');
154
+ }
155
+ return {
156
+ available: versionInfo.ok,
157
+ version: versionInfo.version ?? undefined,
158
+ error: versionInfo.ok ? undefined : versionInfo.error,
159
+ supported_flags: {
160
+ outputFormatFlag: outputFormatSupported,
161
+ extensionsFlag: true,
162
+ },
163
+ supports: {
164
+ output_schema: false,
165
+ stream_json: outputFormatSupported,
166
+ tool_disable: false,
167
+ },
168
+ extensions,
169
+ };
170
+ },
171
+ buildModelRunPlan(context) {
172
+ const prompt = context.prompt;
173
+ const schemaString = JSON.stringify(context.jsonSchema);
174
+ const systemPrompt = context.appendSystemPrompt && context.appendSystemPrompt.trim().length > 0
175
+ ? `${context.appendSystemPrompt}\nReturn STRICT JSON only. Do not wrap in code fences.\nSchema:\n${schemaString}`
176
+ : `Return STRICT JSON only. Do not wrap in code fences.\nSchema:\n${schemaString}`;
177
+ const files = [
178
+ { path: 'system.md', contents: systemPrompt },
179
+ ];
180
+ const args = [
181
+ '--output-format',
182
+ 'json',
183
+ '--model',
184
+ context.model,
185
+ prompt,
186
+ ];
187
+ return {
188
+ command: GEMINI_COMMAND,
189
+ args,
190
+ env: buildGeminiEnv(path.join('{WORKDIR}', 'system.md')),
191
+ outputFormat: 'json',
192
+ outputMode: 'stdout-json',
193
+ files,
194
+ timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,
195
+ };
196
+ },
197
+ normalizeModelRunResult({ stdout }) {
198
+ const parsed = parseJsonFromText(stdout);
199
+ const response = typeof parsed.response === 'string' ? parsed.response : '';
200
+ const cleaned = stripCodeFence(response);
201
+ const output = JSON.parse(cleaned);
202
+ const stats = parsed.stats && typeof parsed.stats === 'object' ? parsed.stats : null;
203
+ let model = null;
204
+ const models = stats && typeof stats.models === 'object' ? stats.models : null;
205
+ if (models) {
206
+ const first = Object.keys(models)[0];
207
+ if (first)
208
+ model = first;
209
+ }
210
+ return { output, raw: parsed, usage: stats, model };
211
+ },
212
+ };
213
+ }
214
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/cli-providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { GatewayCliProvider, GatewayProviderId } from './types.js';
2
+ export declare function getGatewayCliProvider(id: GatewayProviderId): GatewayCliProvider;
3
+ export declare function listGatewayCliProviders(): GatewayCliProvider[];
4
+ export declare function inferGatewayProviderFromModel(model: string): GatewayProviderId;
5
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli-providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAWvE,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,iBAAiB,GAAG,kBAAkB,CAE/E;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAS9E"}
@@ -0,0 +1,25 @@
1
+ import { createClaudeCliProvider } from './claude.js';
2
+ import { createCodexCliProvider } from './codex.js';
3
+ import { createGeminiCliProvider } from './gemini.js';
4
+ const PROVIDERS = {
5
+ claude_code: createClaudeCliProvider(),
6
+ codex: createCodexCliProvider(),
7
+ gemini: createGeminiCliProvider(),
8
+ };
9
+ export function getGatewayCliProvider(id) {
10
+ return PROVIDERS[id];
11
+ }
12
+ export function listGatewayCliProviders() {
13
+ return Object.values(PROVIDERS);
14
+ }
15
+ export function inferGatewayProviderFromModel(model) {
16
+ const lowered = model.toLowerCase();
17
+ if (lowered.startsWith('openai/') || lowered.startsWith('gpt-') || lowered.includes('codex')) {
18
+ return 'codex';
19
+ }
20
+ if (lowered.startsWith('google/') || lowered.startsWith('gemini')) {
21
+ return 'gemini';
22
+ }
23
+ return 'claude_code';
24
+ }
25
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/cli-providers/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,SAAS,GAAkD;IAC/D,WAAW,EAAE,uBAAuB,EAAE;IACtC,KAAK,EAAE,sBAAsB,EAAE;IAC/B,MAAM,EAAE,uBAAuB,EAAE;CAClC,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAqB;IACzD,OAAO,SAAS,CAAC,EAAE,CAAC,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAa;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IACnC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7F,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClE,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC"}
@@ -0,0 +1,61 @@
1
+ export type GatewayProviderId = 'claude_code' | 'codex' | 'gemini';
2
+ export type GatewayModelOutputMode = 'stdout-json' | 'file-json' | 'stream-json';
3
+ export interface GatewayProviderSupports {
4
+ output_schema: boolean;
5
+ stream_json: boolean;
6
+ tool_disable: boolean;
7
+ }
8
+ export interface GatewayProviderCapabilities {
9
+ available: boolean;
10
+ version?: string;
11
+ error?: string;
12
+ supported_flags?: Record<string, boolean>;
13
+ supports: GatewayProviderSupports;
14
+ extensions?: string[];
15
+ }
16
+ export interface GatewayModelRunContext {
17
+ model: string;
18
+ prompt: string;
19
+ jsonSchema: Record<string, unknown>;
20
+ appendSystemPrompt?: string;
21
+ timeoutMs?: number;
22
+ }
23
+ export interface GatewaySchemaNormalization {
24
+ schema: Record<string, unknown>;
25
+ promptSuffix?: string;
26
+ }
27
+ export interface GatewayModelRunPlan {
28
+ command: string;
29
+ args: string[];
30
+ env?: NodeJS.ProcessEnv;
31
+ outputFormat: 'json' | 'text' | 'stream-json';
32
+ outputMode: GatewayModelOutputMode;
33
+ outputPath?: string;
34
+ files?: Array<{
35
+ path: string;
36
+ contents: string;
37
+ }>;
38
+ timeoutMs: number | null;
39
+ debug?: Record<string, unknown>;
40
+ }
41
+ export interface GatewayModelRunNormalized {
42
+ output: Record<string, unknown>;
43
+ raw: Record<string, unknown>;
44
+ usage: Record<string, unknown> | null;
45
+ model: string | null;
46
+ }
47
+ export interface GatewayCliProvider {
48
+ id: GatewayProviderId;
49
+ label: string;
50
+ detectCapabilities: () => Promise<GatewayProviderCapabilities>;
51
+ normalizeSchema?: (schema: Record<string, unknown>) => GatewaySchemaNormalization;
52
+ buildModelRunPlan: (context: GatewayModelRunContext) => GatewayModelRunPlan;
53
+ normalizeModelRunResult: (params: {
54
+ stdout: string;
55
+ outputFormat: GatewayModelRunPlan['outputFormat'];
56
+ outputMode: GatewayModelRunPlan['outputMode'];
57
+ outputPath?: string;
58
+ workDir: string;
59
+ }) => GatewayModelRunNormalized;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli-providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,CAAA;AAElE,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,WAAW,GAAG,aAAa,CAAA;AAEhF,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,QAAQ,EAAE,uBAAuB,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAA;IAC7C,UAAU,EAAE,sBAAsB,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,iBAAiB,CAAA;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,kBAAkB,EAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,CAAA;IAC9D,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,0BAA0B,CAAA;IACjF,iBAAiB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,mBAAmB,CAAA;IAC3E,uBAAuB,EAAE,CAAC,MAAM,EAAE;QAChC,MAAM,EAAE,MAAM,CAAA;QACd,YAAY,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAA;QACjD,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;QAC7C,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,OAAO,EAAE,MAAM,CAAA;KAChB,KAAK,yBAAyB,CAAA;CAChC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli-providers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}