@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.
- package/README.md +74 -0
- package/dist/cli-providers/claude-utils.d.ts +10 -0
- package/dist/cli-providers/claude-utils.d.ts.map +1 -0
- package/dist/cli-providers/claude-utils.js +73 -0
- package/dist/cli-providers/claude-utils.js.map +1 -0
- package/dist/cli-providers/claude.d.ts +3 -0
- package/dist/cli-providers/claude.d.ts.map +1 -0
- package/dist/cli-providers/claude.js +212 -0
- package/dist/cli-providers/claude.js.map +1 -0
- package/dist/cli-providers/codex-schema.d.ts +10 -0
- package/dist/cli-providers/codex-schema.d.ts.map +1 -0
- package/dist/cli-providers/codex-schema.js +76 -0
- package/dist/cli-providers/codex-schema.js.map +1 -0
- package/dist/cli-providers/codex.d.ts +3 -0
- package/dist/cli-providers/codex.d.ts.map +1 -0
- package/dist/cli-providers/codex.js +271 -0
- package/dist/cli-providers/codex.js.map +1 -0
- package/dist/cli-providers/gemini.d.ts +3 -0
- package/dist/cli-providers/gemini.d.ts.map +1 -0
- package/dist/cli-providers/gemini.js +214 -0
- package/dist/cli-providers/gemini.js.map +1 -0
- package/dist/cli-providers/registry.d.ts +5 -0
- package/dist/cli-providers/registry.d.ts.map +1 -0
- package/dist/cli-providers/registry.js +25 -0
- package/dist/cli-providers/registry.js.map +1 -0
- package/dist/cli-providers/types.d.ts +61 -0
- package/dist/cli-providers/types.d.ts.map +1 -0
- package/dist/cli-providers/types.js +2 -0
- package/dist/cli-providers/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2288 -0
- package/dist/index.js.map +1 -0
- package/dist/subagent-adapters/claude-code.d.ts +3 -0
- package/dist/subagent-adapters/claude-code.d.ts.map +1 -0
- package/dist/subagent-adapters/claude-code.js +565 -0
- package/dist/subagent-adapters/claude-code.js.map +1 -0
- package/dist/subagent-adapters/claude-support.d.ts +30 -0
- package/dist/subagent-adapters/claude-support.d.ts.map +1 -0
- package/dist/subagent-adapters/claude-support.js +67 -0
- package/dist/subagent-adapters/claude-support.js.map +1 -0
- package/dist/subagent-adapters/codex.d.ts +3 -0
- package/dist/subagent-adapters/codex.d.ts.map +1 -0
- package/dist/subagent-adapters/codex.js +241 -0
- package/dist/subagent-adapters/codex.js.map +1 -0
- package/dist/subagent-adapters/gemini.d.ts +3 -0
- package/dist/subagent-adapters/gemini.d.ts.map +1 -0
- package/dist/subagent-adapters/gemini.js +257 -0
- package/dist/subagent-adapters/gemini.js.map +1 -0
- package/dist/subagent-adapters/registry.d.ts +4 -0
- package/dist/subagent-adapters/registry.d.ts.map +1 -0
- package/dist/subagent-adapters/registry.js +19 -0
- package/dist/subagent-adapters/registry.js.map +1 -0
- package/dist/subagent-adapters/types.d.ts +60 -0
- package/dist/subagent-adapters/types.d.ts.map +1 -0
- package/dist/subagent-adapters/types.js +2 -0
- package/dist/subagent-adapters/types.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Panorama Gateway
|
|
2
|
+
|
|
3
|
+
Local gateway service for connecting a team to local CLI capabilities.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
Pair the gateway with a team using a pairing code:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
PANORAMA_ENV=dev pnpm --filter @panorama-ai/gateway dev -- pair <PAIRING_CODE>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or pass Supabase credentials directly:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
SUPABASE_URL="https://your-project.supabase.co" \
|
|
17
|
+
SUPABASE_ANON_KEY="your-anon-key" \
|
|
18
|
+
pnpm --filter @panorama-ai/gateway dev -- pair <PAIRING_CODE>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Start the gateway and begin listening for jobs:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm --filter @panorama-ai/gateway dev -- start
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Start the gateway in the background (built binary only):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm --filter @panorama-ai/gateway build
|
|
31
|
+
pnpm --filter @panorama-ai/gateway start -- --daemon
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Stop the gateway:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm --filter @panorama-ai/gateway dev -- stop
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Tail logs:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pnpm --filter @panorama-ai/gateway dev -- logs --lines 200
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Optional flags:
|
|
47
|
+
|
|
48
|
+
- `--device-name "My MacBook"`
|
|
49
|
+
- `--supabase-url "https://..."`
|
|
50
|
+
- `--anon-key "..."`
|
|
51
|
+
- `--env local|dev|test|stage|prod`
|
|
52
|
+
- `--env-file /path/to/.env`
|
|
53
|
+
- `--daemon` (start in background)
|
|
54
|
+
- `--no-follow` (show logs without follow)
|
|
55
|
+
|
|
56
|
+
The gateway stores credentials in `~/.panorama/gateway.json` by default. Override with `PANORAMA_GATEWAY_CONFIG_PATH`.
|
|
57
|
+
|
|
58
|
+
## Environment
|
|
59
|
+
|
|
60
|
+
The gateway expects these values (CLI flags override environment variables):
|
|
61
|
+
|
|
62
|
+
- `SUPABASE_URL` (or `PANORAMA_SUPABASE_URL`)
|
|
63
|
+
- `SUPABASE_ANON_KEY` (or `PANORAMA_SUPABASE_ANON_KEY` / `SUPABASE_PUBLISHABLE_KEY`)
|
|
64
|
+
|
|
65
|
+
When `--env` or `PANORAMA_ENV` is provided, the gateway loads `.env.<env>` from the repo root (falls back to `.env` for `local`).
|
|
66
|
+
You can always point to a specific env file with `--env-file`.
|
|
67
|
+
|
|
68
|
+
## Job Handling
|
|
69
|
+
|
|
70
|
+
The initial implementation processes `diagnostic` jobs by running `claude --version` locally and storing the output in the job result.
|
|
71
|
+
|
|
72
|
+
## CLI Provider Notes
|
|
73
|
+
|
|
74
|
+
See `packages/gateway/CLI_PROVIDERS.md` for current findings on Claude Code, Codex CLI, and Gemini CLI usage patterns.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function parseClaudeJsonOutput(stdout: string): {
|
|
2
|
+
parsed: Record<string, unknown> | null;
|
|
3
|
+
error?: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function normalizeGatewayModelOutput(parsed: Record<string, unknown>): {
|
|
6
|
+
output: Record<string, unknown>;
|
|
7
|
+
usage: Record<string, unknown> | null;
|
|
8
|
+
model: string | null;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=claude-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-utils.d.ts","sourceRoot":"","sources":["../../src/cli-providers/claude-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsChH;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC5E,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,CAsCA"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export function parseClaudeJsonOutput(stdout) {
|
|
2
|
+
if (!stdout)
|
|
3
|
+
return { parsed: null, error: 'Empty Claude output' };
|
|
4
|
+
const trimmed = stdout.trim();
|
|
5
|
+
if (!trimmed)
|
|
6
|
+
return { parsed: null, error: 'Empty Claude output' };
|
|
7
|
+
const tryParse = (value) => {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = JSON.parse(value);
|
|
10
|
+
return parsed;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const direct = tryParse(trimmed);
|
|
17
|
+
if (direct)
|
|
18
|
+
return { parsed: direct };
|
|
19
|
+
const lines = trimmed
|
|
20
|
+
.split(/\r?\n/)
|
|
21
|
+
.map((line) => line.trim())
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
const parsed = tryParse(line);
|
|
25
|
+
if (parsed)
|
|
26
|
+
return { parsed };
|
|
27
|
+
}
|
|
28
|
+
const firstBrace = trimmed.indexOf('{');
|
|
29
|
+
const lastBrace = trimmed.lastIndexOf('}');
|
|
30
|
+
if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {
|
|
31
|
+
const slice = trimmed.slice(firstBrace, lastBrace + 1);
|
|
32
|
+
const parsed = tryParse(slice);
|
|
33
|
+
if (parsed)
|
|
34
|
+
return { parsed };
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
parsed: null,
|
|
38
|
+
error: 'Failed to parse Claude JSON output',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function normalizeGatewayModelOutput(parsed) {
|
|
42
|
+
let outputCandidate = (parsed.structured_output ??
|
|
43
|
+
parsed.structuredOutput ??
|
|
44
|
+
parsed.output ??
|
|
45
|
+
parsed.tool_call ??
|
|
46
|
+
parsed.toolCall) ??
|
|
47
|
+
null;
|
|
48
|
+
if (!outputCandidate && typeof parsed.result === 'string') {
|
|
49
|
+
try {
|
|
50
|
+
outputCandidate = JSON.parse(parsed.result);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
outputCandidate = null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!outputCandidate || typeof outputCandidate !== 'object') {
|
|
57
|
+
throw new Error('Claude output missing structured JSON payload');
|
|
58
|
+
}
|
|
59
|
+
const usage = parsed.usage ??
|
|
60
|
+
parsed.usage_metadata ??
|
|
61
|
+
null;
|
|
62
|
+
const model = typeof parsed.model === 'string'
|
|
63
|
+
? parsed.model
|
|
64
|
+
: typeof parsed.provider_model === 'string'
|
|
65
|
+
? parsed.provider_model
|
|
66
|
+
: null;
|
|
67
|
+
return {
|
|
68
|
+
output: outputCandidate,
|
|
69
|
+
usage,
|
|
70
|
+
model,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=claude-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-utils.js","sourceRoot":"","sources":["../../src/cli-providers/claude-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/cli-providers/claude.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAoD,MAAM,YAAY,CAAA;AAqItG,wBAAgB,uBAAuB,IAAI,kBAAkB,CA2F5D"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import fs from 'node:fs/promises';
|
|
6
|
+
import fsSync from 'node:fs';
|
|
7
|
+
import { DEFAULT_CLAUDE_SUPPORT, parseClaudeSupport, toFlagRecord, } from '../subagent-adapters/claude-support.js';
|
|
8
|
+
import { normalizeGatewayModelOutput, parseClaudeJsonOutput } from './claude-utils.js';
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const DEFAULT_CLAUDE_TIMEOUT_MS = 10_000;
|
|
11
|
+
const CLAUDE_ENV_ALLOWLIST = [
|
|
12
|
+
'PATH',
|
|
13
|
+
'HOME',
|
|
14
|
+
'USER',
|
|
15
|
+
'LOGNAME',
|
|
16
|
+
'SHELL',
|
|
17
|
+
'LANG',
|
|
18
|
+
'LC_ALL',
|
|
19
|
+
'LC_CTYPE',
|
|
20
|
+
'TERM',
|
|
21
|
+
'TMPDIR',
|
|
22
|
+
'TMP',
|
|
23
|
+
'TEMP',
|
|
24
|
+
'HTTP_PROXY',
|
|
25
|
+
'HTTPS_PROXY',
|
|
26
|
+
'NO_PROXY',
|
|
27
|
+
'http_proxy',
|
|
28
|
+
'https_proxy',
|
|
29
|
+
'no_proxy',
|
|
30
|
+
'XDG_CONFIG_HOME',
|
|
31
|
+
'XDG_CACHE_HOME',
|
|
32
|
+
'XDG_DATA_HOME',
|
|
33
|
+
'SSH_AUTH_SOCK',
|
|
34
|
+
'SSH_AGENT_PID',
|
|
35
|
+
];
|
|
36
|
+
const DEFAULT_CLAUDE_PATH = path.join(os.homedir(), '.claude', 'local', 'claude');
|
|
37
|
+
const CLAUDE_COMMAND = process.env.PANORAMA_CLAUDE_CLI ||
|
|
38
|
+
process.env.CLAUDE_CLI ||
|
|
39
|
+
(fsSync.existsSync(DEFAULT_CLAUDE_PATH) ? DEFAULT_CLAUDE_PATH : 'claude');
|
|
40
|
+
const CLAUDE_GATEWAY_HOME = process.env.PANORAMA_CLAUDE_HOME || null;
|
|
41
|
+
async function ensureClaudeGatewayHome() {
|
|
42
|
+
if (!CLAUDE_GATEWAY_HOME)
|
|
43
|
+
return;
|
|
44
|
+
await fs.mkdir(CLAUDE_GATEWAY_HOME, { recursive: true });
|
|
45
|
+
await fs.mkdir(path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'config'), { recursive: true });
|
|
46
|
+
await fs.mkdir(path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'cache'), { recursive: true });
|
|
47
|
+
await fs.mkdir(path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'data'), { recursive: true });
|
|
48
|
+
const sourceSessionEnv = path.join(os.homedir(), '.claude', 'session-env');
|
|
49
|
+
const destSessionEnv = path.join(CLAUDE_GATEWAY_HOME, 'session-env');
|
|
50
|
+
try {
|
|
51
|
+
const srcStat = await fs.stat(sourceSessionEnv);
|
|
52
|
+
if (srcStat.isDirectory()) {
|
|
53
|
+
try {
|
|
54
|
+
await fs.stat(destSessionEnv);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
await fs.cp(sourceSessionEnv, destSessionEnv, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Leave empty; Claude will prompt if needed.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function buildClaudeEnv() {
|
|
66
|
+
const env = {};
|
|
67
|
+
for (const key of CLAUDE_ENV_ALLOWLIST) {
|
|
68
|
+
const value = process.env[key];
|
|
69
|
+
if (value !== undefined) {
|
|
70
|
+
env[key] = value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (CLAUDE_GATEWAY_HOME) {
|
|
74
|
+
env.HOME = CLAUDE_GATEWAY_HOME;
|
|
75
|
+
env.XDG_CONFIG_HOME = path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'config');
|
|
76
|
+
env.XDG_CACHE_HOME = path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'cache');
|
|
77
|
+
env.XDG_DATA_HOME = path.join(CLAUDE_GATEWAY_HOME, 'xdg', 'data');
|
|
78
|
+
}
|
|
79
|
+
return env;
|
|
80
|
+
}
|
|
81
|
+
async function execClaudeHelp() {
|
|
82
|
+
try {
|
|
83
|
+
const { stdout, stderr } = await execFileAsync(CLAUDE_COMMAND, ['--help'], {
|
|
84
|
+
timeout: DEFAULT_CLAUDE_TIMEOUT_MS,
|
|
85
|
+
});
|
|
86
|
+
return { ok: true, stdout: String(stdout ?? ''), stderr: String(stderr ?? '') };
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const err = error;
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
stdout: err.stdout ? String(err.stdout) : '',
|
|
93
|
+
stderr: err.stderr ? String(err.stderr) : '',
|
|
94
|
+
error: err.message,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function execClaudeVersion() {
|
|
99
|
+
try {
|
|
100
|
+
const { stdout } = await execFileAsync(CLAUDE_COMMAND, ['--version'], {
|
|
101
|
+
timeout: DEFAULT_CLAUDE_TIMEOUT_MS,
|
|
102
|
+
});
|
|
103
|
+
const version = String(stdout ?? '').trim();
|
|
104
|
+
return { ok: true, version: version || null };
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
const err = error;
|
|
108
|
+
return { ok: false, version: null, error: err.message };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function detectClaudeSupport() {
|
|
112
|
+
const help = await execClaudeHelp();
|
|
113
|
+
if (!help.ok)
|
|
114
|
+
return DEFAULT_CLAUDE_SUPPORT;
|
|
115
|
+
return parseClaudeSupport(`${help.stdout}\n${help.stderr}`);
|
|
116
|
+
}
|
|
117
|
+
function appendClaudeIsolationArgs(args, support) {
|
|
118
|
+
if (support.settingSourcesFlag) {
|
|
119
|
+
args.push('--setting-sources', 'local');
|
|
120
|
+
}
|
|
121
|
+
if (support.disableSlashCommandsFlag) {
|
|
122
|
+
args.push('--disable-slash-commands');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function createClaudeCliProvider() {
|
|
126
|
+
let cachedSupport = null;
|
|
127
|
+
return {
|
|
128
|
+
id: 'claude_code',
|
|
129
|
+
label: 'Claude Code',
|
|
130
|
+
async detectCapabilities() {
|
|
131
|
+
await ensureClaudeGatewayHome();
|
|
132
|
+
const versionInfo = await execClaudeVersion();
|
|
133
|
+
const support = await detectClaudeSupport();
|
|
134
|
+
cachedSupport = support;
|
|
135
|
+
return {
|
|
136
|
+
available: versionInfo.ok,
|
|
137
|
+
version: versionInfo.version ?? undefined,
|
|
138
|
+
error: versionInfo.ok ? undefined : versionInfo.error,
|
|
139
|
+
supported_flags: toFlagRecord(support),
|
|
140
|
+
supports: {
|
|
141
|
+
output_schema: support.jsonSchemaFlag,
|
|
142
|
+
stream_json: support.outputFormatFlag,
|
|
143
|
+
tool_disable: support.toolsFlag || support.allowedToolsFlag,
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
},
|
|
147
|
+
buildModelRunPlan(context) {
|
|
148
|
+
const support = cachedSupport ?? DEFAULT_CLAUDE_SUPPORT;
|
|
149
|
+
const args = [
|
|
150
|
+
'--print',
|
|
151
|
+
'--model',
|
|
152
|
+
context.model,
|
|
153
|
+
'--output-format',
|
|
154
|
+
'json',
|
|
155
|
+
'--json-schema',
|
|
156
|
+
JSON.stringify(context.jsonSchema),
|
|
157
|
+
];
|
|
158
|
+
if (support.toolsFlag) {
|
|
159
|
+
args.push('--tools', '');
|
|
160
|
+
}
|
|
161
|
+
else if (support.allowedToolsFlag) {
|
|
162
|
+
args.push('--allowedTools', '');
|
|
163
|
+
}
|
|
164
|
+
if (support.inputFormatFlag) {
|
|
165
|
+
args.push('--input-format', 'text');
|
|
166
|
+
}
|
|
167
|
+
if (support.noSessionPersistenceFlag) {
|
|
168
|
+
args.push('--no-session-persistence');
|
|
169
|
+
}
|
|
170
|
+
if (support.permissionModeFlag) {
|
|
171
|
+
args.push('--permission-mode', 'dontAsk');
|
|
172
|
+
}
|
|
173
|
+
appendClaudeIsolationArgs(args, support);
|
|
174
|
+
if (context.appendSystemPrompt) {
|
|
175
|
+
if (support.systemPromptFlag) {
|
|
176
|
+
args.push('--system-prompt', context.appendSystemPrompt);
|
|
177
|
+
}
|
|
178
|
+
else if (support.appendSystemPromptFlag) {
|
|
179
|
+
args.push('--append-system-prompt', context.appendSystemPrompt);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
args.push(context.prompt);
|
|
183
|
+
return {
|
|
184
|
+
command: CLAUDE_COMMAND,
|
|
185
|
+
args,
|
|
186
|
+
env: buildClaudeEnv(),
|
|
187
|
+
outputFormat: 'json',
|
|
188
|
+
outputMode: 'stdout-json',
|
|
189
|
+
timeoutMs: typeof context.timeoutMs === 'number' ? context.timeoutMs : null,
|
|
190
|
+
debug: {
|
|
191
|
+
command: CLAUDE_COMMAND,
|
|
192
|
+
args,
|
|
193
|
+
prompt_chars: context.prompt.length,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
},
|
|
197
|
+
normalizeModelRunResult({ stdout }) {
|
|
198
|
+
const parsed = parseClaudeJsonOutput(stdout);
|
|
199
|
+
if (!parsed.parsed) {
|
|
200
|
+
throw new Error(parsed.error ?? 'Failed to parse Claude output');
|
|
201
|
+
}
|
|
202
|
+
const normalized = normalizeGatewayModelOutput(parsed.parsed);
|
|
203
|
+
return {
|
|
204
|
+
output: normalized.output,
|
|
205
|
+
raw: parsed.parsed,
|
|
206
|
+
usage: normalized.usage,
|
|
207
|
+
model: normalized.model,
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/cli-providers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function enforceCodexStrictSchema<T>(schema: T): T;
|
|
2
|
+
export declare function normalizeCodexToolSchema(schema: Record<string, unknown>): {
|
|
3
|
+
schema: Record<string, unknown>;
|
|
4
|
+
promptSuffix?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function normalizeCodexArgsPayload(payload: Record<string, unknown>): {
|
|
7
|
+
output: Record<string, unknown>;
|
|
8
|
+
raw: Record<string, unknown>;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=codex-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-schema.d.ts","sourceRoot":"","sources":["../../src/cli-providers/codex-schema.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAwCxD;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACzE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CA0BA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAoBnE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function enforceCodexStrictSchema(schema) {
|
|
2
|
+
const seen = new WeakMap();
|
|
3
|
+
const visit = (value) => {
|
|
4
|
+
if (value === null || typeof value !== 'object') {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
if (Array.isArray(value)) {
|
|
8
|
+
return value.map((entry) => visit(entry));
|
|
9
|
+
}
|
|
10
|
+
if (seen.has(value)) {
|
|
11
|
+
return seen.get(value);
|
|
12
|
+
}
|
|
13
|
+
const input = value;
|
|
14
|
+
const output = {};
|
|
15
|
+
seen.set(value, output);
|
|
16
|
+
for (const [key, entry] of Object.entries(input)) {
|
|
17
|
+
output[key] = visit(entry);
|
|
18
|
+
}
|
|
19
|
+
const typeValue = output.type;
|
|
20
|
+
const isObjectType = typeValue === 'object' ||
|
|
21
|
+
(Array.isArray(typeValue) && typeValue.includes('object')) ||
|
|
22
|
+
typeof output.properties === 'object' ||
|
|
23
|
+
typeof output.patternProperties === 'object';
|
|
24
|
+
if (isObjectType) {
|
|
25
|
+
// Codex requires additionalProperties explicitly set to false on object nodes.
|
|
26
|
+
if (output.additionalProperties !== false) {
|
|
27
|
+
output.additionalProperties = false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return output;
|
|
31
|
+
};
|
|
32
|
+
return visit(schema);
|
|
33
|
+
}
|
|
34
|
+
export function normalizeCodexToolSchema(schema) {
|
|
35
|
+
const properties = schema.properties;
|
|
36
|
+
if (!properties || typeof properties !== 'object') {
|
|
37
|
+
return { schema };
|
|
38
|
+
}
|
|
39
|
+
const props = properties;
|
|
40
|
+
if (!props.name || !props.args) {
|
|
41
|
+
return { schema };
|
|
42
|
+
}
|
|
43
|
+
const nameSchema = props.name;
|
|
44
|
+
const codexSchema = {
|
|
45
|
+
type: 'object',
|
|
46
|
+
required: ['name', 'args_json'],
|
|
47
|
+
properties: {
|
|
48
|
+
name: nameSchema,
|
|
49
|
+
args_json: { type: 'string' },
|
|
50
|
+
},
|
|
51
|
+
additionalProperties: false,
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
schema: codexSchema,
|
|
55
|
+
promptSuffix: 'Set args_json to a JSON-encoded string containing the arguments object.',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function normalizeCodexArgsPayload(payload) {
|
|
59
|
+
const raw = payload;
|
|
60
|
+
const argsJson = payload.args_json ?? payload.argsJson;
|
|
61
|
+
if (typeof argsJson === 'string') {
|
|
62
|
+
try {
|
|
63
|
+
const parsedArgs = JSON.parse(argsJson);
|
|
64
|
+
const output = { ...payload };
|
|
65
|
+
output.args = parsedArgs;
|
|
66
|
+
delete output.args_json;
|
|
67
|
+
delete output.argsJson;
|
|
68
|
+
return { output, raw };
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new Error(`Codex args_json is not valid JSON: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { output: payload, raw };
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=codex-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-schema.js","sourceRoot":"","sources":["../../src/cli-providers/codex-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/cli-providers/codex.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAoD,MAAM,YAAY,CAAA;AAmKtG,wBAAgB,sBAAsB,IAAI,kBAAkB,CAwH3D"}
|