@felan-ai/ext-codex 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ import {} from '@felan-ai/agent-core';
2
+ import { readCodexConfig } from './config.js';
3
+ import { ExecSessionManager } from './exec-session-manager.js';
4
+ import { supportsCodexModel, supportsImageInput } from './model-policy.js';
5
+ import { applyCodexRequestOptions } from './request-options.js';
6
+ import { CODEX_TOOL_NAMES, createCodexTools, registerPatchResultEvent } from './tools.js';
7
+ const REPLACED_TOOL_NAMES = new Set(['read', 'bash', 'edit', 'write']);
8
+ const CODEX_TOOL_NAME_SET = new Set(CODEX_TOOL_NAMES);
9
+ const codexExtension = async (pi) => {
10
+ const config = await readCodexConfig(pi.runtime, pi.agentDir);
11
+ const sessions = new ExecSessionManager(pi.runtime);
12
+ for (const tool of createCodexTools(pi.runtime, sessions))
13
+ pi.registerTool(tool);
14
+ registerPatchResultEvent(pi);
15
+ let ordinaryTools;
16
+ const synchronizeTools = (model) => {
17
+ const current = pi.getActiveTools();
18
+ ordinaryTools ??= current.filter((name) => !CODEX_TOOL_NAME_SET.has(name));
19
+ if (supportsCodexModel(model) && pi.runtime.processes) {
20
+ pi.setActiveTools([
21
+ ...current.filter((name) => !REPLACED_TOOL_NAMES.has(name) && !CODEX_TOOL_NAME_SET.has(name)),
22
+ ...CODEX_TOOL_NAMES.filter((name) => name !== 'view_image' || supportsImageInput(model)),
23
+ ]);
24
+ return;
25
+ }
26
+ const restored = current.filter((name) => !CODEX_TOOL_NAME_SET.has(name));
27
+ for (const name of ordinaryTools) {
28
+ if (REPLACED_TOOL_NAMES.has(name) && !restored.includes(name))
29
+ restored.push(name);
30
+ }
31
+ pi.setActiveTools(restored);
32
+ };
33
+ pi.on('session_start', (_event, ctx) => synchronizeTools(ctx.model));
34
+ pi.on('model_select', (event) => synchronizeTools(event.model));
35
+ pi.on('before_provider_request', (event, ctx) => (applyCodexRequestOptions(event.payload, ctx, config)));
36
+ pi.on('session_shutdown', async () => {
37
+ await sessions.shutdown();
38
+ });
39
+ };
40
+ export { DEFAULT_CODEX_CONFIG, readCodexConfig, validateCodexConfig } from './config.js';
41
+ export { ExecSessionManager, formatExecResult } from './exec-session-manager.js';
42
+ export { supportsCodexModel, supportsCodexResponsesRequest } from './model-policy.js';
43
+ export { applyCodexRequestOptions } from './request-options.js';
44
+ export { CODEX_TOOL_NAMES, MAX_VIEW_IMAGE_INPUT_BYTES, createCodexTools } from './tools.js';
45
+ export { createCodexStreamFunctionWrapper, resolveCodexStreamOptions, resolveCodexTransport, } from './transport.js';
46
+ export default codexExtension;
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Api, Model } from '@felan-ai/agent-core';
2
+ export declare function supportsCodexModel(model: Model<Api> | undefined): boolean;
3
+ export declare function supportsCodexResponsesRequest(model: Model<Api> | undefined): boolean;
4
+ export declare function supportsImageInput(model: Model<Api> | undefined): boolean;
5
+ //# sourceMappingURL=model-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-policy.d.ts","sourceRoot":"","sources":["../src/model-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIvD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAGzE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAGpF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,OAAO,CAEzE"}
@@ -0,0 +1,14 @@
1
+ const CODEX_PROVIDERS = new Set(['openai', 'openai-codex']);
2
+ export function supportsCodexModel(model) {
3
+ if (!model || !CODEX_PROVIDERS.has(model.provider))
4
+ return false;
5
+ return /^gpt(?:-|$)/iu.test(model.id);
6
+ }
7
+ export function supportsCodexResponsesRequest(model) {
8
+ return supportsCodexModel(model)
9
+ && (model.api === 'openai-responses' || model.api === 'openai-codex-responses');
10
+ }
11
+ export function supportsImageInput(model) {
12
+ return supportsCodexModel(model) && Array.isArray(model.input) && model.input.includes('image');
13
+ }
14
+ //# sourceMappingURL=model-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-policy.js","sourceRoot":"","sources":["../src/model-policy.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;AAEjF,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,IAAI,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAA6B;IACzE,OAAO,kBAAkB,CAAC,KAAK,CAAC;WAC3B,CAAC,KAAM,CAAC,GAAG,KAAK,kBAAkB,IAAI,KAAM,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,KAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpG,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type AgentRuntime } from '@felan-ai/agent-core';
2
+ export interface ApplyPatchResult {
3
+ changedFiles: string[];
4
+ createdFiles: string[];
5
+ deletedFiles: string[];
6
+ movedFiles: string[];
7
+ fuzz: number;
8
+ }
9
+ export declare function applyPatch(runtime: AgentRuntime, patchText: string, signal?: AbortSignal): Promise<ApplyPatchResult>;
10
+ export declare class ApplyPatchError extends Error {
11
+ readonly result: ApplyPatchResult;
12
+ readonly failedPath: string;
13
+ constructor(message: string, result: ApplyPatchResult, failedPath: string);
14
+ }
15
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAgBhF,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAWD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAqGD,qBAAa,eAAgB,SAAQ,KAAK;IAGtC,QAAQ,CAAC,MAAM,EAAE,gBAAgB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAF3B,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM;CAK9B"}
package/dist/patch.js ADDED
@@ -0,0 +1,350 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { withFileMutationQueue } from '@felan-ai/agent-core';
3
+ const decoder = new TextDecoder();
4
+ const encoder = new TextEncoder();
5
+ export async function applyPatch(runtime, patchText, signal) {
6
+ const actions = parsePatchActions(patchText);
7
+ const touchedPaths = actions.flatMap((action) => (action.movePath ? [action.path, action.movePath] : [action.path]));
8
+ return withMutationQueues(runtime, touchedPaths, async () => {
9
+ const result = {
10
+ changedFiles: [],
11
+ createdFiles: [],
12
+ deletedFiles: [],
13
+ movedFiles: [],
14
+ fuzz: 0,
15
+ };
16
+ for (const action of actions) {
17
+ if (signal?.aborted)
18
+ throw new Error('apply_patch aborted');
19
+ try {
20
+ await applyAction(runtime, action, result);
21
+ }
22
+ catch (error) {
23
+ const partial = result.changedFiles.length > 0;
24
+ const message = `apply_patch ${partial ? 'partially failed' : 'failed'} while patching ${action.path}: ${errorMessage(error)}`;
25
+ throw new ApplyPatchError(message, result, action.path);
26
+ }
27
+ }
28
+ return result;
29
+ });
30
+ }
31
+ async function applyAction(runtime, action, result) {
32
+ if (action.type === 'add') {
33
+ await runtime.mkdir(dirname(action.path), { recursive: true });
34
+ await runtime.writeFile(action.path, encoder.encode(action.newFile ?? ''), { exclusive: true });
35
+ result.createdFiles.push(action.path);
36
+ result.changedFiles.push(action.path);
37
+ return;
38
+ }
39
+ if (action.type === 'delete') {
40
+ await requireFile(runtime, action.path);
41
+ await runtime.remove(action.path);
42
+ result.deletedFiles.push(action.path);
43
+ result.changedFiles.push(action.path);
44
+ return;
45
+ }
46
+ const originalBytes = await requireFile(runtime, action.path);
47
+ const original = decoder.decode(originalBytes);
48
+ const state = { lines: action.lines, index: 0, fuzz: 0 };
49
+ const chunks = parseUpdateChunks(state, original, action.path);
50
+ const updated = applyChunks(original, chunks);
51
+ const destination = action.movePath ?? action.path;
52
+ await runtime.mkdir(dirname(destination), { recursive: true });
53
+ if (!action.movePath) {
54
+ await runtime.writeFile(destination, encoder.encode(updated));
55
+ result.changedFiles.push(destination);
56
+ result.fuzz += state.fuzz;
57
+ return;
58
+ }
59
+ await runtime.writeFile(destination, encoder.encode(updated), { exclusive: true });
60
+ try {
61
+ await runtime.remove(action.path);
62
+ }
63
+ catch (removeError) {
64
+ const rollbackErrors = [];
65
+ try {
66
+ await runtime.remove(destination);
67
+ }
68
+ catch (error) {
69
+ rollbackErrors.push(error);
70
+ }
71
+ try {
72
+ if (!await pathExists(runtime, action.path)) {
73
+ await runtime.writeFile(action.path, originalBytes, { exclusive: true });
74
+ }
75
+ }
76
+ catch (error) {
77
+ rollbackErrors.push(error);
78
+ }
79
+ if (rollbackErrors.length > 0) {
80
+ await recordPartialMove(runtime, action.path, destination, result);
81
+ throw new AggregateError([removeError, ...rollbackErrors], `Failed to remove ${action.path} and rollback ${destination}`);
82
+ }
83
+ throw new Error(`Failed to remove move source ${action.path}: ${errorMessage(removeError)}`, {
84
+ cause: removeError,
85
+ });
86
+ }
87
+ result.movedFiles.push(`${action.path} -> ${destination}`);
88
+ result.changedFiles.push(destination);
89
+ result.fuzz += state.fuzz;
90
+ }
91
+ async function withMutationQueues(runtime, paths, operation) {
92
+ const absolutePaths = [...new Set(paths.map((path) => resolve(runtime.cwd, path)))].sort();
93
+ const acquire = (index) => index === absolutePaths.length
94
+ ? operation()
95
+ : withFileMutationQueue(absolutePaths[index], () => acquire(index + 1));
96
+ return acquire(0);
97
+ }
98
+ async function recordPartialMove(runtime, source, destination, result) {
99
+ if (await pathExists(runtime, destination)) {
100
+ pushUnique(result.createdFiles, destination);
101
+ pushUnique(result.changedFiles, destination);
102
+ }
103
+ if (!await pathExists(runtime, source)) {
104
+ pushUnique(result.deletedFiles, source);
105
+ pushUnique(result.changedFiles, source);
106
+ }
107
+ }
108
+ function pushUnique(values, value) {
109
+ if (!values.includes(value))
110
+ values.push(value);
111
+ }
112
+ export class ApplyPatchError extends Error {
113
+ result;
114
+ failedPath;
115
+ constructor(message, result, failedPath) {
116
+ super(message);
117
+ this.result = result;
118
+ this.failedPath = failedPath;
119
+ this.name = 'ApplyPatchError';
120
+ }
121
+ }
122
+ function parsePatchActions(text) {
123
+ const lines = text.trim().split('\n');
124
+ if (lines[0] !== '*** Begin Patch' || lines.at(-1) !== '*** End Patch') {
125
+ throw new Error('Invalid patch text');
126
+ }
127
+ const actions = [];
128
+ const seen = new Set();
129
+ let index = 1;
130
+ while (index < lines.length - 1) {
131
+ const header = lines[index];
132
+ const match = /^\*\*\* (Add|Delete|Update) File: (.+)$/u.exec(header);
133
+ if (!match)
134
+ throw new Error(`Invalid patch hunk on line ${index + 1}: ${header}`);
135
+ const type = match[1].toLowerCase();
136
+ const path = normalizePatchPath(match[2]);
137
+ if (!path)
138
+ throw new Error('Patch path cannot be empty');
139
+ if (seen.has(path))
140
+ throw new Error(`Duplicate patch path: ${path}`);
141
+ seen.add(path);
142
+ index += 1;
143
+ if (type === 'delete') {
144
+ actions.push({ type, path });
145
+ continue;
146
+ }
147
+ let movePath;
148
+ if (type === 'update' && lines[index]?.startsWith('*** Move to: ')) {
149
+ movePath = normalizePatchPath(lines[index].slice('*** Move to: '.length));
150
+ if (!movePath)
151
+ throw new Error('Move destination cannot be empty');
152
+ if (seen.has(movePath))
153
+ throw new Error(`Duplicate patch path: ${movePath}`);
154
+ seen.add(movePath);
155
+ index += 1;
156
+ }
157
+ const body = [];
158
+ while (index < lines.length - 1 && !/^\*\*\* (?:Add|Delete|Update) File: /u.test(lines[index])) {
159
+ body.push(lines[index++]);
160
+ }
161
+ if (body.length === 0)
162
+ throw new Error(`Patch body for ${path} is empty`);
163
+ if (type === 'add') {
164
+ for (const line of body) {
165
+ if (!line.startsWith('+'))
166
+ throw new Error(`Invalid Add File line: ${line}`);
167
+ }
168
+ actions.push({ type, path, newFile: `${body.map((line) => line.slice(1)).join('\n')}\n` });
169
+ }
170
+ else {
171
+ actions.push({ type, path, lines: body, ...(movePath ? { movePath } : {}) });
172
+ }
173
+ }
174
+ if (actions.length === 0)
175
+ throw new Error('No files were modified');
176
+ return actions;
177
+ }
178
+ function parseUpdateChunks(state, text, path) {
179
+ const fileLines = splitFileLines(text);
180
+ const chunks = [];
181
+ let fileIndex = 0;
182
+ while (state.index < state.lines.length) {
183
+ let section = '';
184
+ const header = state.lines[state.index];
185
+ if (header === '@@')
186
+ state.index += 1;
187
+ else if (header?.startsWith('@@ ')) {
188
+ section = header.slice(3);
189
+ state.index += 1;
190
+ }
191
+ else if (fileIndex !== 0) {
192
+ throw new Error(`Invalid patch line: ${header ?? ''}`);
193
+ }
194
+ if (section) {
195
+ const anchor = findLine(fileLines, section, fileIndex);
196
+ if (anchor.index >= 0) {
197
+ fileIndex = anchor.index + 1;
198
+ state.fuzz += anchor.fuzz;
199
+ }
200
+ }
201
+ const parsed = readSection(state);
202
+ const match = findContext(fileLines, parsed.context, fileIndex, parsed.eof);
203
+ if (match.index < 0) {
204
+ throw new Error(`Failed to find expected lines in ${path}:\n${parsed.context.join('\n')}`);
205
+ }
206
+ state.fuzz += match.fuzz;
207
+ for (const chunk of parsed.chunks) {
208
+ chunks.push({ ...chunk, origIndex: chunk.origIndex + match.index });
209
+ }
210
+ fileIndex = match.index + parsed.context.length;
211
+ }
212
+ return chunks;
213
+ }
214
+ function readSection(state) {
215
+ const context = [];
216
+ const chunks = [];
217
+ let delLines = [];
218
+ let insLines = [];
219
+ let lastMode = 'keep';
220
+ const start = state.index;
221
+ while (state.index < state.lines.length) {
222
+ const raw = state.lines[state.index];
223
+ if (raw.startsWith('@@') || raw === '*** End of File')
224
+ break;
225
+ if (!raw || ![' ', '+', '-'].includes(raw[0]))
226
+ throw new Error(`Invalid patch line: ${raw}`);
227
+ state.index += 1;
228
+ const mode = raw[0] === '+' ? 'add' : raw[0] === '-' ? 'delete' : 'keep';
229
+ const value = raw.slice(1);
230
+ if (mode === 'keep' && lastMode !== 'keep' && (delLines.length || insLines.length)) {
231
+ chunks.push({ origIndex: context.length - delLines.length, delLines, insLines });
232
+ delLines = [];
233
+ insLines = [];
234
+ }
235
+ if (mode === 'delete') {
236
+ delLines.push(value);
237
+ context.push(value);
238
+ }
239
+ else if (mode === 'add')
240
+ insLines.push(value);
241
+ else
242
+ context.push(value);
243
+ lastMode = mode;
244
+ }
245
+ if (delLines.length || insLines.length) {
246
+ chunks.push({ origIndex: context.length - delLines.length, delLines, insLines });
247
+ }
248
+ const eof = state.lines[state.index] === '*** End of File';
249
+ if (eof)
250
+ state.index += 1;
251
+ if (state.index === start)
252
+ throw new Error('Patch section is empty');
253
+ return { context, chunks, eof };
254
+ }
255
+ function findContext(lines, context, start, eof) {
256
+ const first = eof ? Math.max(0, lines.length - context.length) : start;
257
+ const preferred = findLines(lines, context, first);
258
+ if (preferred.index >= 0 || !eof)
259
+ return preferred;
260
+ const fallback = findLines(lines, context, start);
261
+ return { index: fallback.index, fuzz: fallback.fuzz + 10_000 };
262
+ }
263
+ function findLines(lines, context, start) {
264
+ for (const tier of [0, 1, 100]) {
265
+ for (let index = start; index <= lines.length - context.length; index += 1) {
266
+ let fuzz = 0;
267
+ let worst = 0;
268
+ for (let offset = 0; offset < context.length; offset += 1) {
269
+ const quality = lineFuzz(lines[index + offset], context[offset]);
270
+ if (quality === undefined) {
271
+ worst = -1;
272
+ break;
273
+ }
274
+ fuzz += quality;
275
+ worst = Math.max(worst, quality);
276
+ }
277
+ if (worst === tier)
278
+ return { index, fuzz };
279
+ }
280
+ }
281
+ return { index: -1, fuzz: 0 };
282
+ }
283
+ function findLine(lines, target, start) {
284
+ for (const tier of [0, 1, 100]) {
285
+ if (lines.slice(0, start).some((line) => lineFuzz(line, target) === tier))
286
+ continue;
287
+ for (let index = start; index < lines.length; index += 1) {
288
+ const fuzz = lineFuzz(lines[index], target);
289
+ if (fuzz === tier)
290
+ return { index, fuzz };
291
+ }
292
+ }
293
+ return { index: -1, fuzz: 0 };
294
+ }
295
+ function lineFuzz(left, right) {
296
+ if (left === right)
297
+ return 0;
298
+ if (left.trimEnd() === right.trimEnd())
299
+ return 1;
300
+ if (left.trim() === right.trim())
301
+ return 100;
302
+ return undefined;
303
+ }
304
+ function applyChunks(text, chunks) {
305
+ const lines = splitFileLines(text);
306
+ let delta = 0;
307
+ for (const chunk of chunks) {
308
+ const index = chunk.origIndex + delta;
309
+ lines.splice(index, chunk.delLines.length, ...chunk.insLines);
310
+ delta += chunk.insLines.length - chunk.delLines.length;
311
+ }
312
+ return lines.length === 0 ? '' : `${lines.join('\n')}\n`;
313
+ }
314
+ function splitFileLines(text) {
315
+ const lines = text.split('\n');
316
+ if (lines.at(-1) === '')
317
+ lines.pop();
318
+ return lines;
319
+ }
320
+ function normalizePatchPath(path) {
321
+ const trimmed = path.trim();
322
+ const withoutAt = trimmed.startsWith('@') ? trimmed.slice(1) : trimmed;
323
+ return withoutAt.replace(/^['"]|['"]$/gu, '');
324
+ }
325
+ async function requireFile(runtime, path) {
326
+ try {
327
+ return await runtime.readFile(path);
328
+ }
329
+ catch (error) {
330
+ throw new Error(`File not found: ${path}`, { cause: error });
331
+ }
332
+ }
333
+ async function pathExists(runtime, path) {
334
+ try {
335
+ await runtime.readFile(path);
336
+ return true;
337
+ }
338
+ catch (error) {
339
+ if (isMissingFile(error))
340
+ return false;
341
+ throw error;
342
+ }
343
+ }
344
+ function isMissingFile(error) {
345
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
346
+ }
347
+ function errorMessage(error) {
348
+ return error instanceof Error ? error.message : String(error);
349
+ }
350
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ExtensionContext } from '@felan-ai/agent-core';
2
+ import type { CodexConfig } from './config.js';
3
+ export declare function applyCodexRequestOptions(payload: unknown, ctx: Pick<ExtensionContext, 'model'>, config: CodexConfig): unknown | undefined;
4
+ //# sourceMappingURL=request-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-options.d.ts","sourceRoot":"","sources":["../src/request-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,EACpC,MAAM,EAAE,WAAW,GAClB,OAAO,GAAG,SAAS,CAQrB"}
@@ -0,0 +1,15 @@
1
+ import { supportsCodexResponsesRequest } from './model-policy.js';
2
+ export function applyCodexRequestOptions(payload, ctx, config) {
3
+ if (!supportsCodexResponsesRequest(ctx.model) || !isRecord(payload))
4
+ return undefined;
5
+ const text = isRecord(payload.text) ? payload.text : {};
6
+ return {
7
+ ...payload,
8
+ ...(config.fast ? { service_tier: 'priority' } : {}),
9
+ text: { ...text, verbosity: config.verbosity },
10
+ };
11
+ }
12
+ function isRecord(value) {
13
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
14
+ }
15
+ //# sourceMappingURL=request-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-options.js","sourceRoot":"","sources":["../src/request-options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,UAAU,wBAAwB,CACtC,OAAgB,EAChB,GAAoC,EACpC,MAAmB;IAEnB,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACtF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO;QACL,GAAG,OAAO;QACV,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type AgentRuntime, type ExtensionAPI, type ToolDefinition } from '@felan-ai/agent-core';
2
+ import { ExecSessionManager } from './exec-session-manager.js';
3
+ export declare const CODEX_TOOL_NAMES: readonly ["exec_command", "write_stdin", "apply_patch", "view_image"];
4
+ export declare const MAX_VIEW_IMAGE_INPUT_BYTES: number;
5
+ export declare function createCodexTools(runtime: AgentRuntime, sessions: ExecSessionManager): ToolDefinition<any, any, any>[];
6
+ export declare function registerPatchResultEvent(pi: ExtensionAPI): void;
7
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAoB,MAAM,2BAA2B,CAAC;AAoCjF,eAAO,MAAM,gBAAgB,uEAKnB,CAAC;AAEX,eAAO,MAAM,0BAA0B,QAAmB,CAAC;AAI3D,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,kBAAkB,GAC3B,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CA4GjC;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAW/D"}