@zhixuan92/multi-model-agent-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/auth/claude-oauth.d.ts +6 -0
  4. package/dist/auth/claude-oauth.d.ts.map +1 -0
  5. package/dist/auth/claude-oauth.js +8 -0
  6. package/dist/auth/claude-oauth.js.map +1 -0
  7. package/dist/auth/codex-oauth.d.ts +6 -0
  8. package/dist/auth/codex-oauth.d.ts.map +1 -0
  9. package/dist/auth/codex-oauth.js +50 -0
  10. package/dist/auth/codex-oauth.js.map +1 -0
  11. package/dist/config/load.d.ts +8 -0
  12. package/dist/config/load.d.ts.map +1 -0
  13. package/dist/config/load.js +49 -0
  14. package/dist/config/load.js.map +1 -0
  15. package/dist/config/schema.d.ts +275 -0
  16. package/dist/config/schema.d.ts.map +1 -0
  17. package/dist/config/schema.js +62 -0
  18. package/dist/config/schema.js.map +1 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +14 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/model-profiles.json +34 -0
  24. package/dist/provider.d.ts +3 -0
  25. package/dist/provider.d.ts.map +1 -0
  26. package/dist/provider.js +50 -0
  27. package/dist/provider.js.map +1 -0
  28. package/dist/routing/capabilities.d.ts +3 -0
  29. package/dist/routing/capabilities.d.ts.map +1 -0
  30. package/dist/routing/capabilities.js +26 -0
  31. package/dist/routing/capabilities.js.map +1 -0
  32. package/dist/routing/get-provider-eligibility.d.ts +8 -0
  33. package/dist/routing/get-provider-eligibility.d.ts.map +1 -0
  34. package/dist/routing/get-provider-eligibility.js +53 -0
  35. package/dist/routing/get-provider-eligibility.js.map +1 -0
  36. package/dist/routing/model-profiles.d.ts +24 -0
  37. package/dist/routing/model-profiles.d.ts.map +1 -0
  38. package/dist/routing/model-profiles.js +41 -0
  39. package/dist/routing/model-profiles.js.map +1 -0
  40. package/dist/routing/resolve-task-capabilities.d.ts +7 -0
  41. package/dist/routing/resolve-task-capabilities.d.ts.map +1 -0
  42. package/dist/routing/resolve-task-capabilities.js +19 -0
  43. package/dist/routing/resolve-task-capabilities.js.map +1 -0
  44. package/dist/routing/select-provider-for-task.d.ts +18 -0
  45. package/dist/routing/select-provider-for-task.d.ts.map +1 -0
  46. package/dist/routing/select-provider-for-task.js +50 -0
  47. package/dist/routing/select-provider-for-task.js.map +1 -0
  48. package/dist/run-tasks.d.ts +7 -0
  49. package/dist/run-tasks.d.ts.map +1 -0
  50. package/dist/run-tasks.js +81 -0
  51. package/dist/run-tasks.js.map +1 -0
  52. package/dist/runners/claude-runner.d.ts +7 -0
  53. package/dist/runners/claude-runner.d.ts.map +1 -0
  54. package/dist/runners/claude-runner.js +118 -0
  55. package/dist/runners/claude-runner.js.map +1 -0
  56. package/dist/runners/codex-runner.d.ts +23 -0
  57. package/dist/runners/codex-runner.d.ts.map +1 -0
  58. package/dist/runners/codex-runner.js +403 -0
  59. package/dist/runners/codex-runner.js.map +1 -0
  60. package/dist/runners/openai-runner.d.ts +22 -0
  61. package/dist/runners/openai-runner.d.ts.map +1 -0
  62. package/dist/runners/openai-runner.js +92 -0
  63. package/dist/runners/openai-runner.js.map +1 -0
  64. package/dist/tools/claude-adapter.d.ts +4 -0
  65. package/dist/tools/claude-adapter.d.ts.map +1 -0
  66. package/dist/tools/claude-adapter.js +42 -0
  67. package/dist/tools/claude-adapter.js.map +1 -0
  68. package/dist/tools/definitions.d.ts +19 -0
  69. package/dist/tools/definitions.d.ts.map +1 -0
  70. package/dist/tools/definitions.js +147 -0
  71. package/dist/tools/definitions.js.map +1 -0
  72. package/dist/tools/openai-adapter.d.ts +13 -0
  73. package/dist/tools/openai-adapter.d.ts.map +1 -0
  74. package/dist/tools/openai-adapter.js +74 -0
  75. package/dist/tools/openai-adapter.js.map +1 -0
  76. package/dist/tools/tracker.d.ts +7 -0
  77. package/dist/tools/tracker.d.ts.map +1 -0
  78. package/dist/tools/tracker.js +13 -0
  79. package/dist/tools/tracker.js.map +1 -0
  80. package/dist/types.d.ts +106 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +23 -0
  83. package/dist/types.js.map +1 -0
  84. package/package.json +97 -0
@@ -0,0 +1,92 @@
1
+ import { Agent, run as agentRun, setTracingDisabled, OpenAIChatCompletionsModel, MaxTurnsExceededError } from '@openai/agents';
2
+ import { withTimeout } from '../types.js';
3
+ import { FileTracker } from '../tools/tracker.js';
4
+ import { createToolImplementations } from '../tools/definitions.js';
5
+ import { createOpenAITools } from '../tools/openai-adapter.js';
6
+ // Disable tracing — not all OpenAI-compatible providers support it
7
+ setTracingDisabled(true);
8
+ /**
9
+ * Remove `<think>...</think>` reasoning blocks from model output.
10
+ *
11
+ * Several reasoning models (MiniMax, DeepSeek, Qwen variants) emit their
12
+ * chain-of-thought inline wrapped in `<think>...</think>` tags. These are
13
+ * scratch-pad content and should not surface to the caller. Stripping is
14
+ * non-greedy, multi-line, and handles multiple blocks.
15
+ */
16
+ export function stripThinkingTags(text) {
17
+ return text.replace(/<think>[\s\S]*?<\/think>\s*/gi, '').trimStart();
18
+ }
19
+ export async function runOpenAI(prompt, options, runner) {
20
+ const maxTurns = options.maxTurns ?? runner.providerConfig.maxTurns ?? runner.defaults.maxTurns;
21
+ const timeoutMs = options.timeoutMs ?? runner.providerConfig.timeoutMs ?? runner.defaults.timeoutMs;
22
+ const toolMode = options.tools ?? runner.defaults.tools;
23
+ const cwd = options.cwd ?? process.cwd();
24
+ const effort = options.effort ?? runner.providerConfig.effort;
25
+ const sandboxPolicy = options.sandboxPolicy ?? runner.providerConfig.sandboxPolicy ?? 'cwd-only';
26
+ const abortController = new AbortController();
27
+ const tracker = new FileTracker();
28
+ const toolImpls = createToolImplementations(tracker, cwd, sandboxPolicy, abortController.signal);
29
+ const fileTools = toolMode === 'full' ? createOpenAITools(toolImpls, sandboxPolicy) : [];
30
+ // Add hosted tools (web_search, image_generation, etc.) if configured — only when tools are enabled
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ const hostedTools = toolMode === 'full'
33
+ ? (runner.providerConfig.hostedTools ?? []).map(t => ({ type: t }))
34
+ : [];
35
+ const tools = [...fileTools, ...hostedTools];
36
+ const model = new OpenAIChatCompletionsModel(runner.client, runner.providerConfig.model);
37
+ const agent = new Agent({
38
+ name: 'sub-agent',
39
+ model,
40
+ instructions: 'You are a helpful assistant. Complete the task given to you. Use the provided tools when needed.',
41
+ tools,
42
+ ...(effort && effort !== 'none' && {
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ modelSettings: { reasoning: { effort: effort } },
45
+ }),
46
+ });
47
+ const run = async () => {
48
+ try {
49
+ const result = await agentRun(agent, prompt, { maxTurns, signal: abortController.signal });
50
+ const usage = result.state.usage;
51
+ return {
52
+ output: stripThinkingTags(result.finalOutput ?? ''),
53
+ status: 'ok',
54
+ usage: {
55
+ inputTokens: usage.inputTokens,
56
+ outputTokens: usage.outputTokens,
57
+ totalTokens: usage.totalTokens,
58
+ costUSD: null,
59
+ },
60
+ turns: usage.requests,
61
+ files: tracker.getFiles(),
62
+ };
63
+ }
64
+ catch (err) {
65
+ if (err instanceof MaxTurnsExceededError) {
66
+ return {
67
+ output: `Agent exceeded max turns (${maxTurns}).`,
68
+ status: 'max_turns',
69
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
70
+ turns: maxTurns,
71
+ files: tracker.getFiles(),
72
+ };
73
+ }
74
+ return {
75
+ output: `Sub-agent error: ${err instanceof Error ? err.message : String(err)}`,
76
+ status: 'error',
77
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
78
+ turns: 0,
79
+ files: tracker.getFiles(),
80
+ error: err instanceof Error ? err.message : String(err),
81
+ };
82
+ }
83
+ };
84
+ return withTimeout(run(), timeoutMs, () => ({
85
+ output: `Agent timed out after ${timeoutMs}ms.`,
86
+ status: 'timeout',
87
+ files: tracker.getFiles(),
88
+ usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUSD: null },
89
+ turns: maxTurns,
90
+ }), abortController);
91
+ }
92
+ //# sourceMappingURL=openai-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-runner.js","sourceRoot":"","sources":["../../src/runners/openai-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ToolImplementations } from './definitions.js';
2
+ import type { SandboxPolicy } from '../types.js';
3
+ export declare function createClaudeToolServer(impl: ToolImplementations, sandboxPolicy?: SandboxPolicy): import("@anthropic-ai/claude-agent-sdk").McpSdkServerConfigWithInstance;
4
+ //# sourceMappingURL=claude-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.d.ts","sourceRoot":"","sources":["../../src/tools/claude-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,GAAE,aAA0B,2EA0E1G"}
@@ -0,0 +1,42 @@
1
+ import { tool, createSdkMcpServer } from '@anthropic-ai/claude-agent-sdk';
2
+ import { z } from 'zod';
3
+ export function createClaudeToolServer(impl, sandboxPolicy = 'cwd-only') {
4
+ const readFile = tool('read_file', 'Read the contents of a file at the given path. Returns the full file content as a string.', { path: z.string().describe('Absolute or relative file path') }, async ({ path }) => ({
5
+ content: [{ type: 'text', text: await impl.readFile(path) }],
6
+ }));
7
+ const writeFile = tool('write_file', 'Write content to a file, creating parent directories if needed. Overwrites existing files.', {
8
+ path: z.string().describe('File path to write to'),
9
+ content: z.string().describe('Content to write'),
10
+ }, async ({ path, content }) => {
11
+ await impl.writeFile(path, content);
12
+ return { content: [{ type: 'text', text: `File written: ${path}` }] };
13
+ });
14
+ const runShell = tool('run_shell', 'Execute a shell command and return stdout, stderr, and exit code. Use for running tests, installing packages, etc.', { command: z.string().describe('Shell command to execute') }, async ({ command }) => {
15
+ const result = await impl.runShell(command);
16
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
17
+ });
18
+ const globTool = tool('glob', 'Find files matching a glob pattern in the working directory.', { pattern: z.string().describe('Glob pattern (e.g., "*.ts", "src/**/*.js")') }, async ({ pattern }) => {
19
+ const files = await impl.glob(pattern);
20
+ return { content: [{ type: 'text', text: files.join('\n') || 'No files found.' }] };
21
+ });
22
+ const grepTool = tool('grep', 'Search for a pattern in a file. Returns matching lines with line numbers.', {
23
+ pattern: z.string().describe('Search pattern (regex)'),
24
+ path: z.string().describe('File path to search in'),
25
+ }, async ({ pattern, path }) => {
26
+ const result = await impl.grep(pattern, path);
27
+ return { content: [{ type: 'text', text: result || 'No matches found.' }] };
28
+ });
29
+ const listFiles = tool('list_files', 'List files and directories at the given path. Directories have a trailing "/".', { path: z.string().describe('Directory path to list').default('.') }, async ({ path }) => {
30
+ const entries = await impl.listFiles(path);
31
+ return { content: [{ type: 'text', text: entries.join('\n') || 'Empty directory.' }] };
32
+ });
33
+ return createSdkMcpServer({
34
+ name: 'code-tools',
35
+ version: '1.0.0',
36
+ tools: [
37
+ readFile, writeFile, globTool, grepTool, listFiles,
38
+ ...(sandboxPolicy !== 'cwd-only' ? [runShell] : []),
39
+ ],
40
+ });
41
+ }
42
+ //# sourceMappingURL=claude-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-adapter.js","sourceRoot":"","sources":["../../src/tools/claude-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FileTracker } from './tracker.js';
2
+ import type { SandboxPolicy } from '../types.js';
3
+ export declare const MAX_READ_FILE_BYTES: number;
4
+ export declare const MAX_WRITE_FILE_BYTES: number;
5
+ export interface ShellResult {
6
+ stdout: string;
7
+ stderr: string;
8
+ exitCode: number;
9
+ }
10
+ export interface ToolImplementations {
11
+ readFile(filePath: string): Promise<string>;
12
+ writeFile(filePath: string, content: string): Promise<void>;
13
+ runShell(command: string): Promise<ShellResult>;
14
+ glob(pattern: string): Promise<string[]>;
15
+ grep(pattern: string, filePath: string): Promise<string>;
16
+ listFiles(dirPath: string): Promise<string[]>;
17
+ }
18
+ export declare function createToolImplementations(tracker: FileTracker, cwd: string, sandboxPolicy?: SandboxPolicy, signal?: AbortSignal): ToolImplementations;
19
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD,eAAO,MAAM,mBAAmB,QAAmB,CAAC;AACpD,eAAO,MAAM,oBAAoB,QAAoB,CAAC;AA6BtD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC/C;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,aAAa,GAAE,aAA0B,EACzC,MAAM,CAAC,EAAE,WAAW,GACnB,mBAAmB,CAyGrB"}
@@ -0,0 +1,147 @@
1
+ import fs from 'fs/promises';
2
+ import { glob as fsGlob } from 'node:fs/promises';
3
+ import path from 'path';
4
+ import { exec } from 'child_process';
5
+ import { promisify } from 'util';
6
+ const execAsync = promisify(exec);
7
+ // Hard caps to keep an LLM sub-agent from exhausting host memory or disk by
8
+ // asking the file tools to read or write absurdly large blobs. The values are
9
+ // generous for normal coding work and intentionally well below the memory
10
+ // budget of a typical Node process (~1.5 GB default heap). They can be tuned
11
+ // per-deployment by editing the constants.
12
+ //
13
+ // readFile: 50 MB. Larger than any sensible source file.
14
+ // writeFile: 100 MB. Generous enough for build artefacts but caps disk-fill
15
+ // attacks where the model is told to write a multi-gigabyte file.
16
+ export const MAX_READ_FILE_BYTES = 50 * 1024 * 1024;
17
+ export const MAX_WRITE_FILE_BYTES = 100 * 1024 * 1024;
18
+ function isWithin(parent, child) {
19
+ return child === parent || child.startsWith(parent + path.sep);
20
+ }
21
+ async function resolveReal(target) {
22
+ try {
23
+ return await fs.realpath(target);
24
+ }
25
+ catch {
26
+ // File doesn't exist — resolve the nearest existing ancestor and
27
+ // append the remaining path components so symlinks in ancestors
28
+ // are still caught.
29
+ const parent = path.dirname(target);
30
+ if (parent === target)
31
+ return target; // filesystem root
32
+ const realParent = await resolveReal(parent);
33
+ return path.join(realParent, path.basename(target));
34
+ }
35
+ }
36
+ async function assertWithinCwd(cwd, resolved) {
37
+ const realCwd = await fs.realpath(cwd);
38
+ const realResolved = await resolveReal(resolved);
39
+ if (!isWithin(realCwd, realResolved)) {
40
+ throw new Error(`Path traversal denied: "${resolved}" is outside working directory "${cwd}"`);
41
+ }
42
+ }
43
+ export function createToolImplementations(tracker, cwd, sandboxPolicy = 'cwd-only', signal) {
44
+ const confine = sandboxPolicy === 'cwd-only';
45
+ return {
46
+ async readFile(filePath) {
47
+ const resolved = path.resolve(cwd, filePath);
48
+ if (confine)
49
+ await assertWithinCwd(cwd, resolved);
50
+ // Reject oversized files BEFORE reading them into memory. stat is
51
+ // cheap; reading a 10 GB file would OOM the host.
52
+ const stats = await fs.stat(resolved);
53
+ if (stats.size > MAX_READ_FILE_BYTES) {
54
+ throw new Error(`File too large: ${filePath} is ${stats.size} bytes (max ${MAX_READ_FILE_BYTES})`);
55
+ }
56
+ return fs.readFile(resolved, 'utf-8');
57
+ },
58
+ async writeFile(filePath, content) {
59
+ const resolved = path.resolve(cwd, filePath);
60
+ if (confine)
61
+ await assertWithinCwd(cwd, resolved);
62
+ // Reject oversized writes BEFORE touching the disk. content.length is
63
+ // a UTF-16 code-unit count, but it's a reasonable upper bound on the
64
+ // byte size after UTF-8 encoding for the purpose of capping abuse.
65
+ if (content.length > MAX_WRITE_FILE_BYTES) {
66
+ throw new Error(`Content too large: ${content.length} bytes (max ${MAX_WRITE_FILE_BYTES})`);
67
+ }
68
+ await fs.mkdir(path.dirname(resolved), { recursive: true });
69
+ await fs.writeFile(resolved, content, 'utf-8');
70
+ tracker.trackWrite(resolved);
71
+ },
72
+ async runShell(command) {
73
+ if (confine) {
74
+ throw new Error('runShell is disabled under sandboxPolicy "cwd-only". Use readFile, writeFile, grep, glob, or listFiles instead.');
75
+ }
76
+ try {
77
+ const { stdout, stderr } = await execAsync(command, {
78
+ cwd,
79
+ timeout: 120_000,
80
+ maxBuffer: 10 * 1024 * 1024,
81
+ signal,
82
+ });
83
+ return { stdout, stderr, exitCode: 0 };
84
+ }
85
+ catch (err) {
86
+ if (err.name === 'AbortError') {
87
+ return { stdout: '', stderr: 'Aborted', exitCode: 130 };
88
+ }
89
+ return {
90
+ stdout: err.stdout ?? '',
91
+ stderr: err.stderr ?? '',
92
+ exitCode: typeof err.code === 'number' ? err.code : 1,
93
+ };
94
+ }
95
+ },
96
+ async glob(pattern) {
97
+ try {
98
+ const results = [];
99
+ const realCwd = confine ? await fs.realpath(cwd) : null;
100
+ for await (const entry of fsGlob(pattern, { cwd })) {
101
+ if (realCwd) {
102
+ const abs = path.resolve(cwd, entry);
103
+ let real;
104
+ try {
105
+ real = await fs.realpath(abs);
106
+ }
107
+ catch {
108
+ real = abs;
109
+ }
110
+ if (!isWithin(realCwd, real))
111
+ continue;
112
+ }
113
+ results.push(entry);
114
+ }
115
+ return results.sort();
116
+ }
117
+ catch {
118
+ return [];
119
+ }
120
+ },
121
+ async grep(pattern, filePath) {
122
+ const resolved = path.resolve(cwd, filePath);
123
+ if (confine)
124
+ await assertWithinCwd(cwd, resolved);
125
+ try {
126
+ const { stdout } = await execAsync(`grep -n -e '${pattern.replace(/'/g, "'\\''")}' '${resolved.replace(/'/g, "'\\''")}'`, { signal });
127
+ return stdout.trim();
128
+ }
129
+ catch (err) {
130
+ if (err.name === 'AbortError')
131
+ throw err;
132
+ // grep exit 1 = no matches (normal), exit 2+ = real error
133
+ if (err.code === 1)
134
+ return '';
135
+ throw new Error(err.stderr?.trim() || `grep failed with exit code ${err.code}`);
136
+ }
137
+ },
138
+ async listFiles(dirPath) {
139
+ const resolved = path.resolve(cwd, dirPath);
140
+ if (confine)
141
+ await assertWithinCwd(cwd, resolved);
142
+ const entries = await fs.readdir(resolved, { withFileTypes: true });
143
+ return entries.map(e => e.isDirectory() ? `${e.name}/` : e.name).sort();
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAIjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,2CAA2C;AAC3C,EAAE;AACF,yDAAyD;AACzD,4EAA4E;AAC5E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAa;IAC7C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAc;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;QACjE,gEAAgE;QAChE,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC,CAAC,kBAAkB;QACxD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,QAAgB;IAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,mCAAmC,GAAG,GAAG,CAAC,CAAC;IAChG,CAAC;AACH,CAAC;AAiBD,MAAM,UAAU,yBAAyB,CACvC,OAAoB,EACpB,GAAW,EACX,gBAA+B,UAAU,EACzC,MAAoB;IAEpB,MAAM,OAAO,GAAG,aAAa,KAAK,UAAU,CAAC;IAE7C,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,QAAgB;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,OAAO;gBAAE,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,kEAAkE;YAClE,kDAAkD;YAClD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,KAAK,CAAC,IAAI,GAAG,mBAAmB,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,OAAO,KAAK,CAAC,IAAI,eAAe,mBAAmB,GAAG,CAClF,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAe;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,OAAO;gBAAE,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,sEAAsE;YACtE,qEAAqE;YACrE,mEAAmE;YACnE,IAAI,OAAO,CAAC,MAAM,GAAG,oBAAoB,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,sBAAsB,OAAO,CAAC,MAAM,eAAe,oBAAoB,GAAG,CAC3E,CAAC;YACJ,CAAC;YACD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,OAAe;YAC5B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,iHAAiH,CAAC,CAAC;YACrI,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;oBAClD,GAAG;oBACH,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;oBAC3B,MAAM;iBACP,CAAC,CAAC;gBACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACzC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC9B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;gBAC1D,CAAC;gBACD,OAAO;oBACL,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;oBACxB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;oBACxB,QAAQ,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBACtD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAe;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;oBACnD,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBACrC,IAAI,IAAY,CAAC;wBACjB,IAAI,CAAC;4BACH,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAChC,CAAC;wBAAC,MAAM,CAAC;4BACP,IAAI,GAAG,GAAG,CAAC;wBACb,CAAC;wBACD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;4BAAE,SAAS;oBACzC,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;gBACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,QAAgB;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,OAAO;gBAAE,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,eAAe,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EACtF,EAAE,MAAM,EAAE,CACX,CAAC;gBACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY;oBAAE,MAAM,GAAG,CAAC;gBACzC,0DAA0D;gBAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;oBAAE,OAAO,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,8BAA8B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,OAAe;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5C,IAAI,OAAO;gBAAE,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from 'zod';
2
+ import type { ToolImplementations } from './definitions.js';
3
+ import type { SandboxPolicy } from '../types.js';
4
+ export declare function createOpenAITools(impl: ToolImplementations, sandboxPolicy?: SandboxPolicy): (import("@openai/agents").FunctionTool<unknown, z.ZodObject<{
5
+ path: z.ZodString;
6
+ }, z.core.$strip>, string> | import("@openai/agents").FunctionTool<unknown, z.ZodObject<{
7
+ command: z.ZodString;
8
+ }, z.core.$strip>, string> | import("@openai/agents").FunctionTool<unknown, z.ZodObject<{
9
+ pattern: z.ZodString;
10
+ }, z.core.$strip>, string> | import("@openai/agents").FunctionTool<unknown, z.ZodObject<{
11
+ path: z.ZodDefault<z.ZodString>;
12
+ }, z.core.$strip>, string>)[];
13
+ //# sourceMappingURL=openai-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,EAAE,aAAa,GAAE,aAA0B;;;;;;;;8BA4ErG"}
@@ -0,0 +1,74 @@
1
+ import { tool } from '@openai/agents';
2
+ import { z } from 'zod';
3
+ export function createOpenAITools(impl, sandboxPolicy = 'cwd-only') {
4
+ const readFile = tool({
5
+ name: 'read_file',
6
+ description: 'Read the contents of a file at the given path. Returns the full file content as a string.',
7
+ parameters: z.object({
8
+ path: z.string().describe('Absolute or relative file path'),
9
+ }),
10
+ execute: async ({ path }) => impl.readFile(path),
11
+ });
12
+ const writeFile = tool({
13
+ name: 'write_file',
14
+ description: 'Write content to a file, creating parent directories if needed. Overwrites existing files.',
15
+ parameters: z.object({
16
+ path: z.string().describe('File path to write to'),
17
+ content: z.string().describe('Content to write'),
18
+ }),
19
+ execute: async ({ path, content }) => {
20
+ await impl.writeFile(path, content);
21
+ return `File written: ${path}`;
22
+ },
23
+ });
24
+ const runShell = tool({
25
+ name: 'run_shell',
26
+ description: 'Execute a shell command and return stdout, stderr, and exit code. Use for running tests, installing packages, etc.',
27
+ parameters: z.object({
28
+ command: z.string().describe('Shell command to execute'),
29
+ }),
30
+ execute: async ({ command }) => {
31
+ const result = await impl.runShell(command);
32
+ return JSON.stringify(result);
33
+ },
34
+ });
35
+ const globTool = tool({
36
+ name: 'glob',
37
+ description: 'Find files matching a glob pattern in the working directory.',
38
+ parameters: z.object({
39
+ pattern: z.string().describe('Glob pattern (e.g., "*.ts", "src/**/*.js")'),
40
+ }),
41
+ execute: async ({ pattern }) => {
42
+ const files = await impl.glob(pattern);
43
+ return files.join('\n') || 'No files found.';
44
+ },
45
+ });
46
+ const grepTool = tool({
47
+ name: 'grep',
48
+ description: 'Search for a pattern in a file. Returns matching lines with line numbers.',
49
+ parameters: z.object({
50
+ pattern: z.string().describe('Search pattern (regex)'),
51
+ path: z.string().describe('File path to search in'),
52
+ }),
53
+ execute: async ({ pattern, path }) => {
54
+ const result = await impl.grep(pattern, path);
55
+ return result || 'No matches found.';
56
+ },
57
+ });
58
+ const listFiles = tool({
59
+ name: 'list_files',
60
+ description: 'List files and directories at the given path. Directories have a trailing "/".',
61
+ parameters: z.object({
62
+ path: z.string().describe('Directory path to list').default('.'),
63
+ }),
64
+ execute: async ({ path }) => {
65
+ const entries = await impl.listFiles(path);
66
+ return entries.join('\n') || 'Empty directory.';
67
+ },
68
+ });
69
+ return [
70
+ readFile, writeFile, globTool, grepTool, listFiles,
71
+ ...(sandboxPolicy !== 'cwd-only' ? [runShell] : []),
72
+ ];
73
+ }
74
+ //# sourceMappingURL=openai-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/tools/openai-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare class FileTracker {
2
+ private files;
3
+ trackWrite(filePath: string): void;
4
+ getFiles(): string[];
5
+ reset(): void;
6
+ }
7
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAqB;IAElC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIlC,QAAQ,IAAI,MAAM,EAAE;IAIpB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,13 @@
1
+ export class FileTracker {
2
+ files = new Set();
3
+ trackWrite(filePath) {
4
+ this.files.add(filePath);
5
+ }
6
+ getFiles() {
7
+ return [...this.files].sort();
8
+ }
9
+ reset() {
10
+ this.files.clear();
11
+ }
12
+ }
13
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/tools/tracker.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,106 @@
1
+ export type Tier = 'trivial' | 'standard' | 'reasoning';
2
+ export type Capability = 'file_read' | 'file_write' | 'grep' | 'glob' | 'shell' | 'web_search' | 'web_fetch';
3
+ export type ToolMode = 'none' | 'full';
4
+ export type SandboxPolicy = 'none' | 'cwd-only';
5
+ export type Effort = 'none' | 'low' | 'medium' | 'high';
6
+ export type CostTier = 'free' | 'low' | 'medium' | 'high';
7
+ export type RunStatus = 'ok' | 'error' | 'timeout' | 'max_turns';
8
+ export interface TaskSpec {
9
+ prompt: string;
10
+ /** Provider name. If omitted, core auto-selects. */
11
+ provider?: string;
12
+ tier: Tier;
13
+ requiredCapabilities: Capability[];
14
+ tools?: ToolMode;
15
+ maxTurns?: number;
16
+ timeoutMs?: number;
17
+ cwd?: string;
18
+ effort?: Effort;
19
+ sandboxPolicy?: SandboxPolicy;
20
+ }
21
+ export interface CodexProviderConfig {
22
+ type: 'codex';
23
+ model: string;
24
+ effort?: Effort;
25
+ maxTurns?: number;
26
+ timeoutMs?: number;
27
+ sandboxPolicy?: SandboxPolicy;
28
+ hostedTools?: ('web_search' | 'image_generation' | 'code_interpreter')[];
29
+ costTier?: CostTier;
30
+ }
31
+ export interface ClaudeProviderConfig {
32
+ type: 'claude';
33
+ model: string;
34
+ effort?: Effort;
35
+ maxTurns?: number;
36
+ timeoutMs?: number;
37
+ sandboxPolicy?: SandboxPolicy;
38
+ hostedTools?: ('web_search' | 'image_generation' | 'code_interpreter')[];
39
+ costTier?: CostTier;
40
+ }
41
+ export interface OpenAICompatibleProviderConfig {
42
+ type: 'openai-compatible';
43
+ model: string;
44
+ /** Required — must be specified. No default. */
45
+ baseUrl: string;
46
+ apiKey?: string;
47
+ apiKeyEnv?: string;
48
+ effort?: Effort;
49
+ maxTurns?: number;
50
+ timeoutMs?: number;
51
+ sandboxPolicy?: SandboxPolicy;
52
+ hostedTools?: ('web_search' | 'image_generation' | 'code_interpreter')[];
53
+ costTier?: CostTier;
54
+ }
55
+ /** Discriminated union — each provider type has distinct required fields. */
56
+ export type ProviderConfig = CodexProviderConfig | ClaudeProviderConfig | OpenAICompatibleProviderConfig;
57
+ export interface MultiModelConfig {
58
+ providers: Record<string, ProviderConfig>;
59
+ defaults: {
60
+ maxTurns: number;
61
+ timeoutMs: number;
62
+ tools: ToolMode;
63
+ };
64
+ }
65
+ export interface TokenUsage {
66
+ inputTokens: number;
67
+ outputTokens: number;
68
+ totalTokens: number;
69
+ costUSD: number | null;
70
+ }
71
+ export interface RunResult {
72
+ output: string;
73
+ status: RunStatus;
74
+ usage: TokenUsage;
75
+ turns: number;
76
+ files: string[];
77
+ error?: string;
78
+ }
79
+ export interface Provider {
80
+ name: string;
81
+ config: ProviderConfig;
82
+ run(prompt: string, options?: RunOptions): Promise<RunResult>;
83
+ }
84
+ export interface RunOptions {
85
+ tools?: ToolMode;
86
+ maxTurns?: number;
87
+ timeoutMs?: number;
88
+ cwd?: string;
89
+ effort?: Effort;
90
+ sandboxPolicy?: SandboxPolicy;
91
+ }
92
+ export type EligibilityFailureCheck = 'capability' | 'tier' | 'tool_mode' | 'provider_not_found' | 'unsupported_provider_type' | 'missing_required_field' | string;
93
+ export interface EligibilityFailure {
94
+ check: EligibilityFailureCheck;
95
+ detail: string;
96
+ message: string;
97
+ }
98
+ export interface ProviderEligibility {
99
+ name: string;
100
+ config: ProviderConfig;
101
+ eligible: boolean;
102
+ /** Reasons only present when eligible === false. */
103
+ reasons: EligibilityFailure[];
104
+ }
105
+ export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, onTimeout: () => T, abort?: AbortController): Promise<T>;
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,23 @@
1
+ // === Tier & Capability ===
2
+ // === Utilities ===
3
+ export function withTimeout(promise, timeoutMs, onTimeout, abort) {
4
+ let timeoutId;
5
+ const timeoutPromise = new Promise((resolve) => {
6
+ timeoutId = setTimeout(() => {
7
+ abort?.abort();
8
+ resolve(onTimeout());
9
+ }, timeoutMs);
10
+ });
11
+ return promise
12
+ .then((result) => {
13
+ if (timeoutId !== undefined)
14
+ clearTimeout(timeoutId);
15
+ return result;
16
+ })
17
+ .catch((error) => {
18
+ if (timeoutId !== undefined)
19
+ clearTimeout(timeoutId);
20
+ throw error;
21
+ });
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4BAA4B;AA8I5B,oBAAoB;AAEpB,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,SAAiB,EACjB,SAAkB,EAClB,KAAuB;IAEvB,IAAI,SAAoD,CAAC;IAEzD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,EAAE;QAChD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,KAAK,EAAE,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACvB,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO;SACX,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACf,IAAI,SAAS,KAAK,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,SAAS,KAAK,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC"}