@intrect/openswarm 0.4.4 → 0.8.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/README.md +46 -26
- package/config.example.yaml +22 -10
- package/dist/adapters/agenticLoop.d.ts +45 -2
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +209 -61
- 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 +7 -0
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +67 -6
- 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 +20 -120
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/index.d.ts +10 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +19 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/lmstudio.d.ts +8 -0
- package/dist/adapters/lmstudio.d.ts.map +1 -0
- package/dist/adapters/lmstudio.js +41 -0
- package/dist/adapters/lmstudio.js.map +1 -0
- package/dist/adapters/local.d.ts +16 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +51 -127
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts +37 -0
- package/dist/adapters/openrouter.d.ts.map +1 -0
- package/dist/adapters/openrouter.js +193 -0
- package/dist/adapters/openrouter.js.map +1 -0
- 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 +21 -2
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +153 -12
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +40 -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/draftAnalyzer.d.ts +1 -1
- package/dist/agents/draftAnalyzer.d.ts.map +1 -1
- package/dist/agents/draftAnalyzer.js +3 -3
- package/dist/agents/draftAnalyzer.js.map +1 -1
- package/dist/agents/pairPipeline.d.ts +26 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +184 -17
- 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 +8 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +23 -2
- package/dist/agents/worker.js.map +1 -1
- package/dist/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- 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 +4 -3
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +39 -12
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts +11 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +14 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/auth/openrouterPkce.d.ts +29 -0
- package/dist/auth/openrouterPkce.d.ts.map +1 -0
- package/dist/auth/openrouterPkce.js +222 -0
- package/dist/auth/openrouterPkce.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +17 -7
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +69 -70
- 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 +14 -5
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +131 -36
- 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 +314 -0
- package/dist/cli/initWizard.js.map +1 -0
- package/dist/cli.js +112 -38
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +89 -15
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +100 -23
- 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/eventHub.d.ts +22 -0
- package/dist/core/eventHub.d.ts.map +1 -1
- package/dist/core/eventHub.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 +43 -20
- 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/discordCore.d.ts.map +1 -1
- package/dist/discord/discordCore.js +16 -103
- package/dist/discord/discordCore.js.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 +40 -20
- 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 +39 -20
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/locale/types.d.ts +6 -0
- package/dist/locale/types.d.ts.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/memory/repoKnowledge.d.ts +33 -0
- package/dist/memory/repoKnowledge.d.ts.map +1 -0
- package/dist/memory/repoKnowledge.js +97 -0
- package/dist/memory/repoKnowledge.js.map +1 -0
- 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 +36 -27
- 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 +105 -83
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +217 -27
- 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/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +318 -65
- package/dist/support/dashboardHtml.js.map +1 -1
- 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/projectMapper.d.ts.map +1 -1
- package/dist/support/projectMapper.js +29 -1
- package/dist/support/projectMapper.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 +51 -0
- package/dist/support/repoMetadata.d.ts.map +1 -0
- package/dist/support/repoMetadata.js +91 -0
- package/dist/support/repoMetadata.js.map +1 -0
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +196 -71
- 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 +3 -1
|
@@ -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,7 +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,
|
|
65
|
+
nudgeMaxOnNoEdit: options.nudgeMaxOnNoEdit,
|
|
66
|
+
protectedFiles: options.protectedFiles,
|
|
67
|
+
bashTimeoutMs: options.bashTimeoutMs,
|
|
68
|
+
webTools: options.webTools,
|
|
69
|
+
mcpTools: options.mcpTools,
|
|
70
|
+
signal: options.signal,
|
|
64
71
|
};
|
|
65
72
|
try {
|
|
66
73
|
const result = await runAgenticLoop(loopOptions);
|
|
@@ -82,7 +89,7 @@ export class GptCliAdapter {
|
|
|
82
89
|
* OpenAI API 호출 함수 생성 (에이전틱 루프에 주입)
|
|
83
90
|
* 401 시 토큰 갱신 + 1회 재시도 포함
|
|
84
91
|
*/
|
|
85
|
-
createApiCaller(initialToken, store, model) {
|
|
92
|
+
createApiCaller(initialToken, store, model, onToken, signal) {
|
|
86
93
|
let token = initialToken;
|
|
87
94
|
let retried = false;
|
|
88
95
|
return async (messages, tools) => {
|
|
@@ -91,6 +98,8 @@ export class GptCliAdapter {
|
|
|
91
98
|
messages,
|
|
92
99
|
temperature: 0.2,
|
|
93
100
|
max_tokens: 16384,
|
|
101
|
+
stream: true,
|
|
102
|
+
stream_options: { include_usage: true },
|
|
94
103
|
};
|
|
95
104
|
if (tools.length > 0) {
|
|
96
105
|
body.tools = tools;
|
|
@@ -103,6 +112,7 @@ export class GptCliAdapter {
|
|
|
103
112
|
'Content-Type': 'application/json',
|
|
104
113
|
},
|
|
105
114
|
body: JSON.stringify(body),
|
|
115
|
+
signal,
|
|
106
116
|
});
|
|
107
117
|
if (!res.ok) {
|
|
108
118
|
const errText = await res.text().catch(() => '');
|
|
@@ -114,20 +124,19 @@ export class GptCliAdapter {
|
|
|
114
124
|
}
|
|
115
125
|
throw new Error(`OpenAI API error (${res.status}): ${errText.slice(0, 500)}`);
|
|
116
126
|
}
|
|
117
|
-
return (
|
|
127
|
+
return consumeChatCompletionsStream(res, onToken);
|
|
118
128
|
};
|
|
119
129
|
return doCall(token);
|
|
120
130
|
};
|
|
121
131
|
}
|
|
122
132
|
parseWorkerOutput(raw) {
|
|
123
|
-
|
|
124
|
-
return extractWorkerResultJson(text) ?? extractWorkerFromText(text);
|
|
133
|
+
return parseWorkerResult(raw.stdout);
|
|
125
134
|
}
|
|
126
135
|
parseReviewerOutput(raw) {
|
|
127
|
-
|
|
128
|
-
return extractReviewerResultJson(text) ?? extractReviewerFromText(text);
|
|
136
|
+
return parseReviewerResult(raw.stdout);
|
|
129
137
|
}
|
|
130
138
|
}
|
|
139
|
+
// Streamed chat/completions responses are parsed by consumeChatCompletionsStream.
|
|
131
140
|
async function refreshAndRetry(store) {
|
|
132
141
|
const profile = store.getProfile(PROFILE_KEY);
|
|
133
142
|
if (!profile) {
|
|
@@ -138,115 +147,6 @@ async function refreshAndRetry(store) {
|
|
|
138
147
|
store.setProfile(PROFILE_KEY, profile);
|
|
139
148
|
return ensureValidToken(store, PROFILE_KEY);
|
|
140
149
|
}
|
|
141
|
-
// Worker/Reviewer output parsing (
|
|
142
|
-
|
|
143
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
144
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"success"');
|
|
145
|
-
if (!jsonStr)
|
|
146
|
-
return null;
|
|
147
|
-
try {
|
|
148
|
-
const parsed = JSON.parse(jsonStr);
|
|
149
|
-
return {
|
|
150
|
-
success: Boolean(parsed.success),
|
|
151
|
-
summary: parsed.summary || t('common.fallback.noSummary'),
|
|
152
|
-
filesChanged: Array.isArray(parsed.filesChanged) ? parsed.filesChanged : [],
|
|
153
|
-
commands: Array.isArray(parsed.commands) ? parsed.commands : [],
|
|
154
|
-
output: text,
|
|
155
|
-
error: parsed.error,
|
|
156
|
-
confidencePercent: typeof parsed.confidencePercent === 'number'
|
|
157
|
-
? parsed.confidencePercent : undefined,
|
|
158
|
-
haltReason: parsed.haltReason || undefined,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
function extractWorkerFromText(text) {
|
|
166
|
-
const hasError = /error|fail|exception|cannot/i.test(text);
|
|
167
|
-
const hasSuccess = /success|completed|done|finished/i.test(text);
|
|
168
|
-
return {
|
|
169
|
-
success: !hasError || hasSuccess,
|
|
170
|
-
summary: extractSummary(text),
|
|
171
|
-
filesChanged: [],
|
|
172
|
-
commands: [],
|
|
173
|
-
output: text,
|
|
174
|
-
error: hasError ? extractErrorMessage(text) : undefined,
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
function extractReviewerResultJson(text) {
|
|
178
|
-
const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/);
|
|
179
|
-
const jsonStr = jsonMatch?.[1] ?? findJsonObject(text, '"decision"');
|
|
180
|
-
if (!jsonStr)
|
|
181
|
-
return null;
|
|
182
|
-
try {
|
|
183
|
-
const parsed = JSON.parse(jsonStr);
|
|
184
|
-
const decision = parsed.decision === 'approve' || parsed.decision === 'reject'
|
|
185
|
-
? parsed.decision
|
|
186
|
-
: 'revise';
|
|
187
|
-
return {
|
|
188
|
-
decision,
|
|
189
|
-
feedback: typeof parsed.feedback === 'string' ? parsed.feedback : t('common.fallback.noSummary'),
|
|
190
|
-
issues: Array.isArray(parsed.issues)
|
|
191
|
-
? parsed.issues.filter((v) => typeof v === 'string')
|
|
192
|
-
: [],
|
|
193
|
-
suggestions: Array.isArray(parsed.suggestions)
|
|
194
|
-
? parsed.suggestions.filter((v) => typeof v === 'string')
|
|
195
|
-
: [],
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
catch {
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
function extractReviewerFromText(text) {
|
|
203
|
-
const lower = text.toLowerCase();
|
|
204
|
-
const decision = lower.includes('approve')
|
|
205
|
-
? 'approve'
|
|
206
|
-
: lower.includes('reject')
|
|
207
|
-
? 'reject'
|
|
208
|
-
: 'revise';
|
|
209
|
-
return {
|
|
210
|
-
decision,
|
|
211
|
-
feedback: extractSummary(text),
|
|
212
|
-
issues: [],
|
|
213
|
-
suggestions: [],
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
// Helpers
|
|
217
|
-
function findJsonObject(text, marker) {
|
|
218
|
-
const idx = text.indexOf(marker);
|
|
219
|
-
if (idx < 0)
|
|
220
|
-
return null;
|
|
221
|
-
// marker 앞의 '{' 찾기
|
|
222
|
-
let start = text.lastIndexOf('{', idx);
|
|
223
|
-
if (start < 0)
|
|
224
|
-
return null;
|
|
225
|
-
let depth = 0;
|
|
226
|
-
for (let i = start; i < text.length; i++) {
|
|
227
|
-
if (text[i] === '{')
|
|
228
|
-
depth++;
|
|
229
|
-
if (text[i] === '}') {
|
|
230
|
-
depth--;
|
|
231
|
-
if (depth === 0) {
|
|
232
|
-
return text.slice(start, i + 1);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
function extractSummary(text) {
|
|
239
|
-
const lines = text.split('\n').filter((l) => l.trim().length > 10);
|
|
240
|
-
if (lines.length === 0)
|
|
241
|
-
return t('common.fallback.noSummary');
|
|
242
|
-
const summary = lines[0].trim();
|
|
243
|
-
return summary.length > 200 ? `${summary.slice(0, 200)}...` : summary;
|
|
244
|
-
}
|
|
245
|
-
function extractErrorMessage(text) {
|
|
246
|
-
const errorMatch = text.match(/(?:error|exception|failed?):\s*(.+)/i);
|
|
247
|
-
if (errorMatch)
|
|
248
|
-
return errorMatch[1].slice(0, 200);
|
|
249
|
-
const lines = text.split('\n').filter((l) => /error|fail/i.test(l));
|
|
250
|
-
return lines.length > 0 ? lines[0].slice(0, 200) : 'Unknown error';
|
|
251
|
-
}
|
|
150
|
+
// Worker/Reviewer output parsing lives in ./resultParsing.ts (shared with the
|
|
151
|
+
// local, openrouter, and codex adapters — INT-1441).
|
|
252
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,17 +1,25 @@
|
|
|
1
1
|
export type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, AdapterName, WorkerResult, ReviewResult, ProcessContext, } from './types.js';
|
|
2
2
|
export { spawnCli } from './base.js';
|
|
3
|
-
export { ClaudeCliAdapter } from './claude.js';
|
|
4
3
|
export { CodexCliAdapter } from './codex.js';
|
|
4
|
+
export { CodexResponsesAdapter } from './codexResponses.js';
|
|
5
5
|
export { GptCliAdapter } from './gpt.js';
|
|
6
6
|
export { LocalModelAdapter } from './local.js';
|
|
7
|
+
export { LmStudioAdapter } from './lmstudio.js';
|
|
8
|
+
export { OpenRouterCliAdapter } from './openrouter.js';
|
|
7
9
|
export { registerProcess, getProcess, getAllProcesses, killProcess, startHealthChecker, stopHealthChecker } from './processRegistry.js';
|
|
8
10
|
import type { AdapterName, CliAdapter } from './types.js';
|
|
9
11
|
/**
|
|
10
|
-
* Get an adapter by name. Defaults to '
|
|
12
|
+
* Get an adapter by name. Defaults to 'codex'.
|
|
11
13
|
*/
|
|
12
14
|
export declare function getAdapter(name?: string): CliAdapter;
|
|
13
15
|
export declare function setDefaultAdapter(name: AdapterName): void;
|
|
14
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;
|
|
15
23
|
/**
|
|
16
24
|
* List adapters that are currently installed and available.
|
|
17
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,
|
|
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
|
@@ -3,24 +3,30 @@
|
|
|
3
3
|
// Barrel exports + adapter lookup
|
|
4
4
|
// ============================================
|
|
5
5
|
export { spawnCli } from './base.js';
|
|
6
|
-
export { ClaudeCliAdapter } from './claude.js';
|
|
7
6
|
export { CodexCliAdapter } from './codex.js';
|
|
7
|
+
export { CodexResponsesAdapter } from './codexResponses.js';
|
|
8
8
|
export { GptCliAdapter } from './gpt.js';
|
|
9
9
|
export { LocalModelAdapter } from './local.js';
|
|
10
|
+
export { LmStudioAdapter } from './lmstudio.js';
|
|
11
|
+
export { OpenRouterCliAdapter } from './openrouter.js';
|
|
10
12
|
export { registerProcess, getProcess, getAllProcesses, killProcess, startHealthChecker, stopHealthChecker } from './processRegistry.js';
|
|
11
|
-
import { ClaudeCliAdapter } from './claude.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';
|
|
17
|
+
import { LmStudioAdapter } from './lmstudio.js';
|
|
18
|
+
import { OpenRouterCliAdapter } from './openrouter.js';
|
|
15
19
|
const adapters = {
|
|
16
|
-
claude: new ClaudeCliAdapter(),
|
|
17
20
|
codex: new CodexCliAdapter(),
|
|
21
|
+
'codex-responses': new CodexResponsesAdapter(),
|
|
18
22
|
gpt: new GptCliAdapter(),
|
|
19
23
|
local: new LocalModelAdapter(),
|
|
24
|
+
lmstudio: new LmStudioAdapter(),
|
|
25
|
+
openrouter: new OpenRouterCliAdapter(),
|
|
20
26
|
};
|
|
21
|
-
let defaultAdapter = '
|
|
27
|
+
let defaultAdapter = 'codex';
|
|
22
28
|
/**
|
|
23
|
-
* Get an adapter by name. Defaults to '
|
|
29
|
+
* Get an adapter by name. Defaults to 'codex'.
|
|
24
30
|
*/
|
|
25
31
|
export function getAdapter(name = defaultAdapter) {
|
|
26
32
|
const adapter = adapters[name];
|
|
@@ -38,6 +44,14 @@ export function setDefaultAdapter(name) {
|
|
|
38
44
|
export function getDefaultAdapterName() {
|
|
39
45
|
return defaultAdapter;
|
|
40
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
|
+
}
|
|
41
55
|
/**
|
|
42
56
|
* List adapters that are currently installed and available.
|
|
43
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,
|
|
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"}
|