@intrect/openswarm 0.5.0 → 0.8.1
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/LICENSE +21 -674
- package/README.md +97 -35
- package/config.example.yaml +8 -2
- package/dist/adapters/agenticLoop.d.ts +15 -1
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +62 -4
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/chatStream.d.ts +55 -0
- package/dist/adapters/chatStream.d.ts.map +1 -0
- package/dist/adapters/chatStream.js +116 -0
- package/dist/adapters/chatStream.js.map +1 -0
- package/dist/adapters/codex.d.ts +6 -0
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +27 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexModels.d.ts +20 -0
- package/dist/adapters/codexModels.d.ts.map +1 -0
- package/dist/adapters/codexModels.js +195 -0
- package/dist/adapters/codexModels.js.map +1 -0
- package/dist/adapters/codexResponses.d.ts +97 -0
- package/dist/adapters/codexResponses.d.ts.map +1 -0
- package/dist/adapters/codexResponses.js +302 -0
- package/dist/adapters/codexResponses.js.map +1 -0
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +17 -131
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +11 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +17 -125
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts +5 -24
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +20 -121
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/resultParsing.d.ts +6 -0
- package/dist/adapters/resultParsing.d.ts.map +1 -0
- package/dist/adapters/resultParsing.js +139 -0
- package/dist/adapters/resultParsing.js.map +1 -0
- package/dist/adapters/tools.d.ts +0 -6
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +57 -3
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +21 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/webTools.d.ts +9 -0
- package/dist/adapters/webTools.d.ts.map +1 -0
- package/dist/adapters/webTools.js +195 -0
- package/dist/adapters/webTools.js.map +1 -0
- package/dist/agents/pairPipeline.d.ts +26 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +82 -14
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/reflection.d.ts +56 -0
- package/dist/agents/reflection.d.ts.map +1 -0
- package/dist/agents/reflection.js +120 -0
- package/dist/agents/reflection.js.map +1 -0
- package/dist/agents/worker.d.ts +2 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +1 -0
- package/dist/agents/worker.js.map +1 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/linearPkce.d.ts +22 -0
- package/dist/auth/linearPkce.d.ts.map +1 -0
- package/dist/auth/linearPkce.js +208 -0
- package/dist/auth/linearPkce.js.map +1 -0
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +18 -5
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +10 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/automation/autonomousRunner.d.ts +6 -6
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +15 -13
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +21 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +80 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/localCI.d.ts +24 -0
- package/dist/automation/localCI.d.ts.map +1 -0
- package/dist/automation/localCI.js +84 -0
- package/dist/automation/localCI.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +33 -7
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +202 -154
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +5 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +101 -0
- package/dist/automation/taskSource.d.ts.map +1 -0
- package/dist/automation/taskSource.js +136 -0
- package/dist/automation/taskSource.js.map +1 -0
- package/dist/automation/workerAuditLog.d.ts +29 -0
- package/dist/automation/workerAuditLog.d.ts.map +1 -0
- package/dist/automation/workerAuditLog.js +82 -0
- package/dist/automation/workerAuditLog.js.map +1 -0
- package/dist/cli/authHandler.d.ts +6 -0
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +37 -2
- package/dist/cli/authHandler.js.map +1 -1
- package/dist/cli/daemon.d.ts +5 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +13 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctorHandler.d.ts +2 -0
- package/dist/cli/doctorHandler.d.ts.map +1 -0
- package/dist/cli/doctorHandler.js +114 -0
- package/dist/cli/doctorHandler.js.map +1 -0
- package/dist/cli/initWizard.d.ts +13 -0
- package/dist/cli/initWizard.d.ts.map +1 -0
- package/dist/cli/initWizard.js +334 -0
- package/dist/cli/initWizard.js.map +1 -0
- package/dist/cli.js +110 -37
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +50 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +69 -10
- package/dist/core/config.js.map +1 -1
- package/dist/core/envFile.d.ts +6 -0
- package/dist/core/envFile.d.ts.map +1 -1
- package/dist/core/envFile.js +39 -1
- package/dist/core/envFile.js.map +1 -1
- package/dist/core/providerOverride.d.ts +6 -0
- package/dist/core/providerOverride.d.ts.map +1 -0
- package/dist/core/providerOverride.js +37 -0
- package/dist/core/providerOverride.js.map +1 -0
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +41 -18
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +16 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/discord/discordHandlers.d.ts.map +1 -1
- package/dist/discord/discordHandlers.js +15 -12
- package/dist/discord/discordHandlers.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/issues/sqliteStore.d.ts.map +1 -1
- package/dist/issues/sqliteStore.js +7 -2
- package/dist/issues/sqliteStore.js.map +1 -1
- package/dist/knowledge/scanner.d.ts.map +1 -1
- package/dist/knowledge/scanner.js +5 -0
- package/dist/knowledge/scanner.js.map +1 -1
- package/dist/linear/linear.d.ts +45 -2
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +154 -3
- package/dist/linear/linear.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +14 -2
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +14 -2
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/mcp/mcpClient.d.ts +27 -0
- package/dist/mcp/mcpClient.d.ts.map +1 -0
- package/dist/mcp/mcpClient.js +145 -0
- package/dist/mcp/mcpClient.js.map +1 -0
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +8 -2
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/notify/notifier.d.ts +26 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +131 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/orchestration/conflictDetector.d.ts +5 -2
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +35 -6
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +20 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +45 -0
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/support/banner.d.ts +7 -0
- package/dist/support/banner.d.ts.map +1 -0
- package/dist/support/banner.js +32 -0
- package/dist/support/banner.js.map +1 -0
- package/dist/support/chat.js +28 -5
- package/dist/support/chat.js.map +1 -1
- package/dist/support/chatBackend.d.ts +6 -0
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +68 -0
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +202 -9
- package/dist/support/chatTui.js.map +1 -1
- package/dist/support/colors.d.ts +15 -0
- package/dist/support/colors.d.ts.map +1 -0
- package/dist/support/colors.js +23 -0
- package/dist/support/colors.js.map +1 -0
- package/dist/support/planCommand.d.ts +17 -0
- package/dist/support/planCommand.d.ts.map +1 -0
- package/dist/support/planCommand.js +114 -0
- package/dist/support/planCommand.js.map +1 -0
- package/dist/support/planner.d.ts +9 -2
- package/dist/support/planner.d.ts.map +1 -1
- package/dist/support/planner.js +43 -111
- package/dist/support/planner.js.map +1 -1
- package/dist/support/promptHelper.d.ts +24 -0
- package/dist/support/promptHelper.d.ts.map +1 -0
- package/dist/support/promptHelper.js +94 -0
- package/dist/support/promptHelper.js.map +1 -0
- package/dist/support/rateLimiter.d.ts.map +1 -1
- package/dist/support/rateLimiter.js +6 -0
- package/dist/support/rateLimiter.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +7 -0
- package/dist/support/repoMetadata.d.ts.map +1 -1
- package/dist/support/repoMetadata.js +13 -1
- package/dist/support/repoMetadata.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +143 -65
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +6 -1
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +23 -1
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts +1 -0
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +22 -1
- package/dist/taskState/store.js.map +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - Codex Responses-API Adapter
|
|
3
|
+
// Calls chatgpt.com/backend-api/codex/responses via ChatGPT OAuth — no codex CLI.
|
|
4
|
+
// Runs on OpenSwarm's OWN agentic loop so tools/verification stay under our control
|
|
5
|
+
// (unlike the codex `exec` CLI, which is a black box). INT-1586.
|
|
6
|
+
// ============================================
|
|
7
|
+
import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
|
|
8
|
+
import { runAgenticLoop, loopResultToCliResult } from './agenticLoop.js';
|
|
9
|
+
import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
|
|
10
|
+
const CODEX_RESPONSES_URL = 'https://chatgpt.com/backend-api/codex/responses';
|
|
11
|
+
const DEFAULT_MODEL = 'gpt-5.5';
|
|
12
|
+
const PROFILE_KEY = 'openai-gpt:default';
|
|
13
|
+
// ---- Transforms (exported for unit tests) ----
|
|
14
|
+
/** ChatMessage[] → Responses `{ instructions, input[] }`. system → instructions. */
|
|
15
|
+
export function chatToResponsesInput(messages) {
|
|
16
|
+
const systemParts = [];
|
|
17
|
+
const input = [];
|
|
18
|
+
for (const m of messages) {
|
|
19
|
+
if (m.role === 'system') {
|
|
20
|
+
if (m.content)
|
|
21
|
+
systemParts.push(m.content);
|
|
22
|
+
}
|
|
23
|
+
else if (m.role === 'user') {
|
|
24
|
+
input.push({ role: 'user', content: m.content });
|
|
25
|
+
}
|
|
26
|
+
else if (m.role === 'assistant') {
|
|
27
|
+
if (m.content)
|
|
28
|
+
input.push({ role: 'assistant', content: m.content });
|
|
29
|
+
for (const tc of m.tool_calls ?? []) {
|
|
30
|
+
input.push({ type: 'function_call', call_id: tc.id, name: tc.function.name, arguments: tc.function.arguments });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (m.role === 'tool') {
|
|
34
|
+
input.push({ type: 'function_call_output', call_id: m.tool_call_id, output: m.content });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { instructions: systemParts.join('\n\n'), input };
|
|
38
|
+
}
|
|
39
|
+
/** OpenSwarm ToolDefinition (nested `function:{}`) → Responses flat tool. */
|
|
40
|
+
export function toolsToResponsesTools(tools) {
|
|
41
|
+
return tools.map((t) => ({
|
|
42
|
+
type: 'function',
|
|
43
|
+
name: t.function.name,
|
|
44
|
+
description: t.function.description,
|
|
45
|
+
parameters: t.function.parameters,
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Reduce parsed Responses SSE events → a chat-completions-shaped response.
|
|
50
|
+
* Exported so the SSE→chat mapping is unit-testable without a live stream.
|
|
51
|
+
*/
|
|
52
|
+
export function reduceResponsesEvents(events) {
|
|
53
|
+
let text = '';
|
|
54
|
+
// Keyed by the streaming item id; the emitted tool-call id is the call_id so it
|
|
55
|
+
// round-trips back as `function_call_output.call_id` on the next turn.
|
|
56
|
+
const calls = new Map();
|
|
57
|
+
let usage;
|
|
58
|
+
for (const ev of events) {
|
|
59
|
+
switch (ev.type) {
|
|
60
|
+
case 'response.output_text.delta':
|
|
61
|
+
if (ev.delta)
|
|
62
|
+
text += ev.delta;
|
|
63
|
+
break;
|
|
64
|
+
case 'response.output_item.added':
|
|
65
|
+
if (ev.item?.type === 'function_call' && ev.item.id) {
|
|
66
|
+
calls.set(ev.item.id, {
|
|
67
|
+
callId: ev.item.call_id || ev.item.id,
|
|
68
|
+
name: ev.item.name ?? '',
|
|
69
|
+
args: ev.item.arguments ?? '',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case 'response.function_call_arguments.delta': {
|
|
74
|
+
const c = ev.item_id ? calls.get(ev.item_id) : undefined;
|
|
75
|
+
if (c && ev.delta)
|
|
76
|
+
c.args += ev.delta;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'response.function_call_arguments.done': {
|
|
80
|
+
const c = ev.item_id ? calls.get(ev.item_id) : undefined;
|
|
81
|
+
if (c && typeof ev.arguments === 'string')
|
|
82
|
+
c.args = ev.arguments;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'response.completed': {
|
|
86
|
+
const u = ev.response?.usage;
|
|
87
|
+
if (u) {
|
|
88
|
+
const pt = u.input_tokens ?? 0;
|
|
89
|
+
const ct = u.output_tokens ?? 0;
|
|
90
|
+
usage = { prompt_tokens: pt, completion_tokens: ct, total_tokens: pt + ct };
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const toolCalls = [...calls.values()].map((c) => ({
|
|
97
|
+
id: c.callId,
|
|
98
|
+
type: 'function',
|
|
99
|
+
function: { name: c.name, arguments: c.args },
|
|
100
|
+
}));
|
|
101
|
+
return {
|
|
102
|
+
choices: [
|
|
103
|
+
{
|
|
104
|
+
message: {
|
|
105
|
+
role: 'assistant',
|
|
106
|
+
content: text || null,
|
|
107
|
+
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
|
|
108
|
+
},
|
|
109
|
+
finish_reason: toolCalls.length > 0 ? 'tool_calls' : 'stop',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
usage,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Parse a `data: {json}` SSE line into an event, or null for keep-alives/[DONE]. */
|
|
116
|
+
function parseSseLine(line) {
|
|
117
|
+
const trimmed = line.trim();
|
|
118
|
+
if (!trimmed.startsWith('data:'))
|
|
119
|
+
return null;
|
|
120
|
+
const data = trimmed.slice(5).trim();
|
|
121
|
+
if (!data || data === '[DONE]')
|
|
122
|
+
return null;
|
|
123
|
+
try {
|
|
124
|
+
return JSON.parse(data);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Read the whole SSE body and reduce it to a chat-shaped response. When
|
|
132
|
+
* `onToken` is provided, each `response.output_text.delta` is emitted live so
|
|
133
|
+
* the chat TUI can stream tokens as they arrive.
|
|
134
|
+
*/
|
|
135
|
+
async function consumeResponsesStream(res, onToken) {
|
|
136
|
+
const events = [];
|
|
137
|
+
const reader = res.body?.getReader();
|
|
138
|
+
if (!reader)
|
|
139
|
+
throw new Error('Codex responses: empty stream body');
|
|
140
|
+
const decoder = new TextDecoder();
|
|
141
|
+
let buffer = '';
|
|
142
|
+
const handle = (ev) => {
|
|
143
|
+
if (!ev)
|
|
144
|
+
return;
|
|
145
|
+
events.push(ev);
|
|
146
|
+
if (onToken && ev.type === 'response.output_text.delta' && ev.delta)
|
|
147
|
+
onToken(ev.delta);
|
|
148
|
+
};
|
|
149
|
+
for (;;) {
|
|
150
|
+
const { done, value } = await reader.read();
|
|
151
|
+
if (done)
|
|
152
|
+
break;
|
|
153
|
+
buffer += decoder.decode(value, { stream: true });
|
|
154
|
+
const lines = buffer.split('\n');
|
|
155
|
+
buffer = lines.pop() ?? '';
|
|
156
|
+
for (const line of lines)
|
|
157
|
+
handle(parseSseLine(line));
|
|
158
|
+
}
|
|
159
|
+
handle(parseSseLine(buffer));
|
|
160
|
+
return reduceResponsesEvents(events);
|
|
161
|
+
}
|
|
162
|
+
// ---- Adapter ----
|
|
163
|
+
export class CodexResponsesAdapter {
|
|
164
|
+
name = 'codex-responses';
|
|
165
|
+
capabilities = {
|
|
166
|
+
supportsStreaming: false, // the loop sees a single aggregated response per call
|
|
167
|
+
supportsJsonOutput: true,
|
|
168
|
+
supportsModelSelection: true,
|
|
169
|
+
managedGit: false,
|
|
170
|
+
supportedSkills: [],
|
|
171
|
+
};
|
|
172
|
+
async isAvailable() {
|
|
173
|
+
try {
|
|
174
|
+
const store = new AuthProfileStore();
|
|
175
|
+
const profile = store.getProfile(PROFILE_KEY);
|
|
176
|
+
// Needs a ChatGPT OAuth profile carrying the codex account_id.
|
|
177
|
+
return profile !== null && Boolean(profile.accountId);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
buildCommand(_options) {
|
|
184
|
+
return { command: 'echo', args: ['"codex-responses adapter uses run() — not shell spawn"'] };
|
|
185
|
+
}
|
|
186
|
+
async run(options) {
|
|
187
|
+
const store = new AuthProfileStore();
|
|
188
|
+
const startTime = Date.now();
|
|
189
|
+
let accessToken;
|
|
190
|
+
let accountId;
|
|
191
|
+
try {
|
|
192
|
+
accessToken = await ensureValidToken(store, PROFILE_KEY);
|
|
193
|
+
accountId = store.getProfile(PROFILE_KEY)?.accountId ?? '';
|
|
194
|
+
if (!accountId) {
|
|
195
|
+
throw new Error('No chatgpt-account-id on the OAuth profile. Re-run: openswarm auth login --provider gpt');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return {
|
|
200
|
+
exitCode: 1,
|
|
201
|
+
stdout: '',
|
|
202
|
+
stderr: `Auth error: ${err instanceof Error ? err.message : String(err)}`,
|
|
203
|
+
durationMs: Date.now() - startTime,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const model = options.model ?? DEFAULT_MODEL;
|
|
207
|
+
const callApi = this.createApiCaller(accessToken, accountId, store, model, options.onToken, options.signal);
|
|
208
|
+
const loopOptions = {
|
|
209
|
+
systemPrompt: options.systemPrompt,
|
|
210
|
+
prompt: options.prompt,
|
|
211
|
+
cwd: options.cwd ?? process.cwd(),
|
|
212
|
+
model,
|
|
213
|
+
callApi,
|
|
214
|
+
maxTurns: options.maxTurns ?? 15,
|
|
215
|
+
timeoutMs: options.timeoutMs || 300000,
|
|
216
|
+
onLog: options.onLog,
|
|
217
|
+
enableTools: options.enableTools ?? true,
|
|
218
|
+
nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
|
|
219
|
+
protectedFiles: options.protectedFiles,
|
|
220
|
+
bashTimeoutMs: options.bashTimeoutMs,
|
|
221
|
+
webTools: options.webTools,
|
|
222
|
+
mcpTools: options.mcpTools,
|
|
223
|
+
signal: options.signal,
|
|
224
|
+
};
|
|
225
|
+
try {
|
|
226
|
+
const result = await runAgenticLoop(loopOptions);
|
|
227
|
+
if (options.onLog) {
|
|
228
|
+
options.onLog(`[Codex ${model}] ${result.apiCallCount} API calls, ${result.toolCallCount} tool uses, ${result.totalTokens} tokens`);
|
|
229
|
+
}
|
|
230
|
+
return loopResultToCliResult(result);
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
return {
|
|
234
|
+
exitCode: 1,
|
|
235
|
+
stdout: '',
|
|
236
|
+
stderr: `Codex responses loop failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
237
|
+
durationMs: Date.now() - startTime,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** Build the agentic-loop callApi: POST /responses + chat↔Responses conversion. */
|
|
242
|
+
createApiCaller(initialToken, accountId, store, model, onToken, signal) {
|
|
243
|
+
let token = initialToken;
|
|
244
|
+
let retried = false;
|
|
245
|
+
return async (messages, tools) => {
|
|
246
|
+
const { instructions, input } = chatToResponsesInput(messages);
|
|
247
|
+
const body = {
|
|
248
|
+
model,
|
|
249
|
+
input,
|
|
250
|
+
store: false,
|
|
251
|
+
stream: true,
|
|
252
|
+
};
|
|
253
|
+
if (instructions)
|
|
254
|
+
body.instructions = instructions;
|
|
255
|
+
if (tools.length > 0)
|
|
256
|
+
body.tools = toolsToResponsesTools(tools);
|
|
257
|
+
// NOTE: never set max_output_tokens — the Codex backend rejects it with HTTP 400.
|
|
258
|
+
const doCall = async (accessToken) => {
|
|
259
|
+
const res = await fetch(CODEX_RESPONSES_URL, {
|
|
260
|
+
method: 'POST',
|
|
261
|
+
headers: {
|
|
262
|
+
'Content-Type': 'application/json',
|
|
263
|
+
'Accept': 'text/event-stream',
|
|
264
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
265
|
+
'chatgpt-account-id': accountId,
|
|
266
|
+
'originator': 'openswarm',
|
|
267
|
+
'OpenAI-Beta': 'responses=experimental',
|
|
268
|
+
},
|
|
269
|
+
body: JSON.stringify(body),
|
|
270
|
+
signal,
|
|
271
|
+
});
|
|
272
|
+
if (!res.ok) {
|
|
273
|
+
const errText = await res.text().catch(() => '');
|
|
274
|
+
// 401 → refresh once and retry.
|
|
275
|
+
if (res.status === 401 && !retried) {
|
|
276
|
+
retried = true;
|
|
277
|
+
token = await refreshAndRetry(store);
|
|
278
|
+
return doCall(token);
|
|
279
|
+
}
|
|
280
|
+
throw new Error(`Codex responses error (${res.status}): ${errText.slice(0, 500)}`);
|
|
281
|
+
}
|
|
282
|
+
return consumeResponsesStream(res, onToken);
|
|
283
|
+
};
|
|
284
|
+
return doCall(token);
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
parseWorkerOutput(raw) {
|
|
288
|
+
return parseWorkerResult(raw.stdout);
|
|
289
|
+
}
|
|
290
|
+
parseReviewerOutput(raw) {
|
|
291
|
+
return parseReviewerResult(raw.stdout);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function refreshAndRetry(store) {
|
|
295
|
+
const profile = store.getProfile(PROFILE_KEY);
|
|
296
|
+
if (!profile)
|
|
297
|
+
throw new Error('No auth profile found');
|
|
298
|
+
profile.expires = 0; // force refresh
|
|
299
|
+
store.setProfile(PROFILE_KEY, profile);
|
|
300
|
+
return ensureValidToken(store, PROFILE_KEY);
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=codexResponses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexResponses.js","sourceRoot":"","sources":["../../src/adapters/codexResponses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpt.d.ts","sourceRoot":"","sources":["../../src/adapters/gpt.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"gpt.d.ts","sourceRoot":"","sources":["../../src/adapters/gpt.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AAWpB,qBAAa,aAAc,YAAW,UAAU;IAC9C,QAAQ,CAAC,IAAI,SAAS;IAEtB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAMxC;IAEI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAUrC,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAKpE,GAAG,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAwDxD;;;OAGG;IACH,OAAO,CAAC,eAAe;IAsDvB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAIlD,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;CAIrD"}
|
package/dist/adapters/gpt.js
CHANGED
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
// Agentic tool loop 지원 (read/write/edit/search/bash)
|
|
5
5
|
// ============================================
|
|
6
6
|
import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
|
|
7
|
-
import { t } from '../locale/index.js';
|
|
8
7
|
import { runAgenticLoop, loopResultToCliResult } from './agenticLoop.js';
|
|
8
|
+
import { parseWorkerResult, parseReviewerResult } from './resultParsing.js';
|
|
9
|
+
import { consumeChatCompletionsStream } from './chatStream.js';
|
|
9
10
|
const OPENAI_API_BASE = 'https://api.openai.com/v1';
|
|
10
11
|
const DEFAULT_MODEL = 'gpt-4o';
|
|
11
12
|
const PROFILE_KEY = 'openai-gpt:default';
|
|
@@ -50,7 +51,7 @@ export class GptCliAdapter {
|
|
|
50
51
|
}
|
|
51
52
|
const model = options.model ?? DEFAULT_MODEL;
|
|
52
53
|
// 2. 에이전틱 루프로 실행 (도구 사용 가능)
|
|
53
|
-
const callApi = this.createApiCaller(accessToken, store, model);
|
|
54
|
+
const callApi = this.createApiCaller(accessToken, store, model, options.onToken, options.signal);
|
|
54
55
|
const loopOptions = {
|
|
55
56
|
systemPrompt: options.systemPrompt,
|
|
56
57
|
prompt: options.prompt,
|
|
@@ -60,10 +61,13 @@ export class GptCliAdapter {
|
|
|
60
61
|
maxTurns: options.maxTurns ?? 15,
|
|
61
62
|
timeoutMs: options.timeoutMs || 300000,
|
|
62
63
|
onLog: options.onLog,
|
|
63
|
-
enableTools: true,
|
|
64
|
+
enableTools: options.enableTools ?? true,
|
|
64
65
|
nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
|
|
65
66
|
protectedFiles: options.protectedFiles,
|
|
66
67
|
bashTimeoutMs: options.bashTimeoutMs,
|
|
68
|
+
webTools: options.webTools,
|
|
69
|
+
mcpTools: options.mcpTools,
|
|
70
|
+
signal: options.signal,
|
|
67
71
|
};
|
|
68
72
|
try {
|
|
69
73
|
const result = await runAgenticLoop(loopOptions);
|
|
@@ -85,7 +89,7 @@ export class GptCliAdapter {
|
|
|
85
89
|
* OpenAI API 호출 함수 생성 (에이전틱 루프에 주입)
|
|
86
90
|
* 401 시 토큰 갱신 + 1회 재시도 포함
|
|
87
91
|
*/
|
|
88
|
-
createApiCaller(initialToken, store, model) {
|
|
92
|
+
createApiCaller(initialToken, store, model, onToken, signal) {
|
|
89
93
|
let token = initialToken;
|
|
90
94
|
let retried = false;
|
|
91
95
|
return async (messages, tools) => {
|
|
@@ -94,6 +98,8 @@ export class GptCliAdapter {
|
|
|
94
98
|
messages,
|
|
95
99
|
temperature: 0.2,
|
|
96
100
|
max_tokens: 16384,
|
|
101
|
+
stream: true,
|
|
102
|
+
stream_options: { include_usage: true },
|
|
97
103
|
};
|
|
98
104
|
if (tools.length > 0) {
|
|
99
105
|
body.tools = tools;
|
|
@@ -106,6 +112,7 @@ export class GptCliAdapter {
|
|
|
106
112
|
'Content-Type': 'application/json',
|
|
107
113
|
},
|
|
108
114
|
body: JSON.stringify(body),
|
|
115
|
+
signal,
|
|
109
116
|
});
|
|
110
117
|
if (!res.ok) {
|
|
111
118
|
const errText = await res.text().catch(() => '');
|
|
@@ -117,20 +124,19 @@ export class GptCliAdapter {
|
|
|
117
124
|
}
|
|
118
125
|
throw new Error(`OpenAI API error (${res.status}): ${errText.slice(0, 500)}`);
|
|
119
126
|
}
|
|
120
|
-
return (
|
|
127
|
+
return consumeChatCompletionsStream(res, onToken);
|
|
121
128
|
};
|
|
122
129
|
return doCall(token);
|
|
123
130
|
};
|
|
124
131
|
}
|
|
125
132
|
parseWorkerOutput(raw) {
|
|
126
|
-
|
|
127
|
-
return extractWorkerResultJson(text) ?? extractWorkerFromText(text);
|
|
133
|
+
return parseWorkerResult(raw.stdout);
|
|
128
134
|
}
|
|
129
135
|
parseReviewerOutput(raw) {
|
|
130
|
-
|
|
131
|
-
return extractReviewerResultJson(text) ?? extractReviewerFromText(text);
|
|
136
|
+
return parseReviewerResult(raw.stdout);
|
|
132
137
|
}
|
|
133
138
|
}
|
|
139
|
+
// Streamed chat/completions responses are parsed by consumeChatCompletionsStream.
|
|
134
140
|
async function refreshAndRetry(store) {
|
|
135
141
|
const profile = store.getProfile(PROFILE_KEY);
|
|
136
142
|
if (!profile) {
|
|
@@ -141,126 +147,6 @@ async function refreshAndRetry(store) {
|
|
|
141
147
|
store.setProfile(PROFILE_KEY, profile);
|
|
142
148
|
return ensureValidToken(store, PROFILE_KEY);
|
|
143
149
|
}
|
|
144
|
-
// Worker/Reviewer output parsing (
|
|
145
|
-
|
|
146
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
147
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"success"');
|
|
148
|
-
if (!jsonStr)
|
|
149
|
-
return null;
|
|
150
|
-
try {
|
|
151
|
-
const parsed = JSON.parse(jsonStr);
|
|
152
|
-
return {
|
|
153
|
-
success: Boolean(parsed.success),
|
|
154
|
-
summary: parsed.summary || t('common.fallback.noSummary'),
|
|
155
|
-
filesChanged: Array.isArray(parsed.filesChanged) ? parsed.filesChanged : [],
|
|
156
|
-
commands: Array.isArray(parsed.commands) ? parsed.commands : [],
|
|
157
|
-
output: text,
|
|
158
|
-
error: parsed.error,
|
|
159
|
-
confidencePercent: typeof parsed.confidencePercent === 'number'
|
|
160
|
-
? parsed.confidencePercent : undefined,
|
|
161
|
-
haltReason: parsed.haltReason || undefined,
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
catch {
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
function extractWorkerFromText(text) {
|
|
169
|
-
// Only an explicit failure phrase marks the run as failed. Loose words like
|
|
170
|
-
// "error" or "fail" appear in normal coding prose ("error handling", "the
|
|
171
|
-
// failing test") and used to cause false negatives. git-diff promotion in
|
|
172
|
-
// worker.ts is the real success signal; this is just the non-repo fallback.
|
|
173
|
-
const failed = isExplicitFailure(text);
|
|
174
|
-
return {
|
|
175
|
-
success: !failed,
|
|
176
|
-
summary: extractSummary(text),
|
|
177
|
-
filesChanged: [],
|
|
178
|
-
commands: [],
|
|
179
|
-
output: text,
|
|
180
|
-
error: failed ? extractErrorMessage(text) : undefined,
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
function extractReviewerResultJson(text) {
|
|
184
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
185
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"decision"');
|
|
186
|
-
if (!jsonStr)
|
|
187
|
-
return null;
|
|
188
|
-
try {
|
|
189
|
-
const parsed = JSON.parse(jsonStr);
|
|
190
|
-
const decision = parsed.decision === 'approve' || parsed.decision === 'reject'
|
|
191
|
-
? parsed.decision
|
|
192
|
-
: 'revise';
|
|
193
|
-
return {
|
|
194
|
-
decision,
|
|
195
|
-
feedback: typeof parsed.feedback === 'string' ? parsed.feedback : t('common.fallback.noSummary'),
|
|
196
|
-
issues: Array.isArray(parsed.issues)
|
|
197
|
-
? parsed.issues.filter((v) => typeof v === 'string')
|
|
198
|
-
: [],
|
|
199
|
-
suggestions: Array.isArray(parsed.suggestions)
|
|
200
|
-
? parsed.suggestions.filter((v) => typeof v === 'string')
|
|
201
|
-
: [],
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
catch {
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
function extractReviewerFromText(text) {
|
|
209
|
-
const lower = text.toLowerCase();
|
|
210
|
-
const decision = lower.includes('approve')
|
|
211
|
-
? 'approve'
|
|
212
|
-
: lower.includes('reject')
|
|
213
|
-
? 'reject'
|
|
214
|
-
: 'revise';
|
|
215
|
-
return {
|
|
216
|
-
decision,
|
|
217
|
-
feedback: extractSummary(text),
|
|
218
|
-
issues: [],
|
|
219
|
-
suggestions: [],
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
// Helpers
|
|
223
|
-
function findJsonObject(text, marker) {
|
|
224
|
-
const idx = text.indexOf(marker);
|
|
225
|
-
if (idx < 0)
|
|
226
|
-
return null;
|
|
227
|
-
// marker 앞의 '{' 찾기
|
|
228
|
-
let start = text.lastIndexOf('{', idx);
|
|
229
|
-
if (start < 0)
|
|
230
|
-
return null;
|
|
231
|
-
let depth = 0;
|
|
232
|
-
for (let i = start; i < text.length; i++) {
|
|
233
|
-
if (text[i] === '{')
|
|
234
|
-
depth++;
|
|
235
|
-
if (text[i] === '}') {
|
|
236
|
-
depth--;
|
|
237
|
-
if (depth === 0) {
|
|
238
|
-
return text.slice(start, i + 1);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
// Detect a real failure declaration, not incidental "error"/"fail" prose.
|
|
245
|
-
// Matches explicit statements like "failed to", "unable to", "could not",
|
|
246
|
-
// "cannot complete", or an explicit JSON success:false.
|
|
247
|
-
function isExplicitFailure(text) {
|
|
248
|
-
if (/"success"\s*:\s*false/i.test(text))
|
|
249
|
-
return true;
|
|
250
|
-
return /\b(failed to|unable to|could not|couldn['’]t|cannot (?:complete|finish|proceed|continue)|giving up|abort(?:ed|ing))\b/i.test(text);
|
|
251
|
-
}
|
|
252
|
-
function extractSummary(text) {
|
|
253
|
-
const lines = text.split('\n').filter((l) => l.trim().length > 10);
|
|
254
|
-
if (lines.length === 0)
|
|
255
|
-
return t('common.fallback.noSummary');
|
|
256
|
-
const summary = lines[0].trim();
|
|
257
|
-
return summary.length > 200 ? `${summary.slice(0, 200)}...` : summary;
|
|
258
|
-
}
|
|
259
|
-
function extractErrorMessage(text) {
|
|
260
|
-
const errorMatch = text.match(/(?:error|exception|failed?):\s*(.+)/i);
|
|
261
|
-
if (errorMatch)
|
|
262
|
-
return errorMatch[1].slice(0, 200);
|
|
263
|
-
const lines = text.split('\n').filter((l) => /error|fail/i.test(l));
|
|
264
|
-
return lines.length > 0 ? lines[0].slice(0, 200) : 'Unknown error';
|
|
265
|
-
}
|
|
150
|
+
// Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
|
|
151
|
+
// local, openrouter, and codex adapters — INT-1441).
|
|
266
152
|
//# sourceMappingURL=gpt.js.map
|
package/dist/adapters/gpt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gpt.js","sourceRoot":"","sources":["../../src/adapters/gpt.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,8BAA8B;AAC9B,oDAAoD;AACpD,qDAAqD;AACrD,+CAA+C;AAU/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gpt.js","sourceRoot":"","sources":["../../src/adapters/gpt.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, AdapterName, WorkerResult, ReviewResult, ProcessContext, } from './types.js';
|
|
2
2
|
export { spawnCli } from './base.js';
|
|
3
3
|
export { CodexCliAdapter } from './codex.js';
|
|
4
|
+
export { CodexResponsesAdapter } from './codexResponses.js';
|
|
4
5
|
export { GptCliAdapter } from './gpt.js';
|
|
5
6
|
export { LocalModelAdapter } from './local.js';
|
|
6
7
|
export { LmStudioAdapter } from './lmstudio.js';
|
|
@@ -13,6 +14,12 @@ import type { AdapterName, CliAdapter } from './types.js';
|
|
|
13
14
|
export declare function getAdapter(name?: string): CliAdapter;
|
|
14
15
|
export declare function setDefaultAdapter(name: AdapterName): void;
|
|
15
16
|
export declare function getDefaultAdapterName(): AdapterName;
|
|
17
|
+
/**
|
|
18
|
+
* True if `name` is a currently-registered adapter. Used to reject stale
|
|
19
|
+
* persisted provider names (e.g. an old chat session saved `claude` before the
|
|
20
|
+
* adapter was removed) instead of crashing downstream.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isKnownAdapter(name: string): name is AdapterName;
|
|
16
23
|
/**
|
|
17
24
|
* List adapters that are currently installed and available.
|
|
18
25
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAQxI,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa1D;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAuB,GAAG,UAAU,CAMpE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKzD;AAED,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,WAAW,CAEhE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ/D"}
|
package/dist/adapters/index.js
CHANGED
|
@@ -4,18 +4,21 @@
|
|
|
4
4
|
// ============================================
|
|
5
5
|
export { spawnCli } from './base.js';
|
|
6
6
|
export { CodexCliAdapter } from './codex.js';
|
|
7
|
+
export { CodexResponsesAdapter } from './codexResponses.js';
|
|
7
8
|
export { GptCliAdapter } from './gpt.js';
|
|
8
9
|
export { LocalModelAdapter } from './local.js';
|
|
9
10
|
export { LmStudioAdapter } from './lmstudio.js';
|
|
10
11
|
export { OpenRouterCliAdapter } from './openrouter.js';
|
|
11
12
|
export { registerProcess, getProcess, getAllProcesses, killProcess, startHealthChecker, stopHealthChecker } from './processRegistry.js';
|
|
12
13
|
import { CodexCliAdapter } from './codex.js';
|
|
14
|
+
import { CodexResponsesAdapter } from './codexResponses.js';
|
|
13
15
|
import { GptCliAdapter } from './gpt.js';
|
|
14
16
|
import { LocalModelAdapter } from './local.js';
|
|
15
17
|
import { LmStudioAdapter } from './lmstudio.js';
|
|
16
18
|
import { OpenRouterCliAdapter } from './openrouter.js';
|
|
17
19
|
const adapters = {
|
|
18
20
|
codex: new CodexCliAdapter(),
|
|
21
|
+
'codex-responses': new CodexResponsesAdapter(),
|
|
19
22
|
gpt: new GptCliAdapter(),
|
|
20
23
|
local: new LocalModelAdapter(),
|
|
21
24
|
lmstudio: new LmStudioAdapter(),
|
|
@@ -41,6 +44,14 @@ export function setDefaultAdapter(name) {
|
|
|
41
44
|
export function getDefaultAdapterName() {
|
|
42
45
|
return defaultAdapter;
|
|
43
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* True if `name` is a currently-registered adapter. Used to reject stale
|
|
49
|
+
* persisted provider names (e.g. an old chat session saved `claude` before the
|
|
50
|
+
* adapter was removed) instead of crashing downstream.
|
|
51
|
+
*/
|
|
52
|
+
export function isKnownAdapter(name) {
|
|
53
|
+
return Object.prototype.hasOwnProperty.call(adapters, name);
|
|
54
|
+
}
|
|
44
55
|
/**
|
|
45
56
|
* List adapters that are currently installed and available.
|
|
46
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mCAAmC;AACnC,kCAAkC;AAClC,+CAA+C;AAa/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAExI,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,QAAQ,GAA+B;IAC3C,KAAK,EAAE,IAAI,eAAe,EAAE;IAC5B,GAAG,EAAE,IAAI,aAAa,EAAE;IACxB,KAAK,EAAE,IAAI,iBAAiB,EAAE;IAC9B,QAAQ,EAAE,IAAI,eAAe,EAAE;IAC/B,UAAU,EAAE,IAAI,oBAAoB,EAAE;CACvC,CAAC;AAEF,IAAI,cAAc,GAAgB,OAAO,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,cAAc;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mCAAmC;AACnC,kCAAkC;AAClC,+CAA+C;AAa/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAExI,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,MAAM,QAAQ,GAA+B;IAC3C,KAAK,EAAE,IAAI,eAAe,EAAE;IAC5B,iBAAiB,EAAE,IAAI,qBAAqB,EAAE;IAC9C,GAAG,EAAE,IAAI,aAAa,EAAE;IACxB,KAAK,EAAE,IAAI,iBAAiB,EAAE;IAC9B,QAAQ,EAAE,IAAI,eAAe,EAAE;IAC/B,UAAU,EAAE,IAAI,oBAAoB,EAAE;CACvC,CAAC;AAEF,IAAI,cAAc,GAAgB,OAAO,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,cAAc;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|