@a5c-ai/agent-mux-adapters 0.2.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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/adapter-install.d.ts +21 -0
  4. package/dist/adapter-install.d.ts.map +1 -0
  5. package/dist/adapter-install.js +114 -0
  6. package/dist/adapter-install.js.map +1 -0
  7. package/dist/agent-mux-remote-adapter.d.ts +66 -0
  8. package/dist/agent-mux-remote-adapter.d.ts.map +1 -0
  9. package/dist/agent-mux-remote-adapter.js +283 -0
  10. package/dist/agent-mux-remote-adapter.js.map +1 -0
  11. package/dist/auth-config.d.ts +14 -0
  12. package/dist/auth-config.d.ts.map +1 -0
  13. package/dist/auth-config.js +52 -0
  14. package/dist/auth-config.js.map +1 -0
  15. package/dist/base-adapter.d.ts +150 -0
  16. package/dist/base-adapter.d.ts.map +1 -0
  17. package/dist/base-adapter.js +458 -0
  18. package/dist/base-adapter.js.map +1 -0
  19. package/dist/claude-adapter.d.ts +52 -0
  20. package/dist/claude-adapter.d.ts.map +1 -0
  21. package/dist/claude-adapter.js +375 -0
  22. package/dist/claude-adapter.js.map +1 -0
  23. package/dist/codex-adapter.d.ts +26 -0
  24. package/dist/codex-adapter.d.ts.map +1 -0
  25. package/dist/codex-adapter.js +243 -0
  26. package/dist/codex-adapter.js.map +1 -0
  27. package/dist/copilot-adapter.d.ts +26 -0
  28. package/dist/copilot-adapter.d.ts.map +1 -0
  29. package/dist/copilot-adapter.js +199 -0
  30. package/dist/copilot-adapter.js.map +1 -0
  31. package/dist/cursor-adapter.d.ts +39 -0
  32. package/dist/cursor-adapter.d.ts.map +1 -0
  33. package/dist/cursor-adapter.js +247 -0
  34. package/dist/cursor-adapter.js.map +1 -0
  35. package/dist/gemini-adapter.d.ts +36 -0
  36. package/dist/gemini-adapter.d.ts.map +1 -0
  37. package/dist/gemini-adapter.js +287 -0
  38. package/dist/gemini-adapter.js.map +1 -0
  39. package/dist/hermes-adapter.d.ts +33 -0
  40. package/dist/hermes-adapter.d.ts.map +1 -0
  41. package/dist/hermes-adapter.js +269 -0
  42. package/dist/hermes-adapter.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +21 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/mcp-plugins.d.ts +13 -0
  48. package/dist/mcp-plugins.d.ts.map +1 -0
  49. package/dist/mcp-plugins.js +63 -0
  50. package/dist/mcp-plugins.js.map +1 -0
  51. package/dist/omp-adapter.d.ts +26 -0
  52. package/dist/omp-adapter.d.ts.map +1 -0
  53. package/dist/omp-adapter.js +195 -0
  54. package/dist/omp-adapter.js.map +1 -0
  55. package/dist/openclaw-adapter.d.ts +30 -0
  56. package/dist/openclaw-adapter.d.ts.map +1 -0
  57. package/dist/openclaw-adapter.js +212 -0
  58. package/dist/openclaw-adapter.js.map +1 -0
  59. package/dist/opencode-adapter.d.ts +30 -0
  60. package/dist/opencode-adapter.d.ts.map +1 -0
  61. package/dist/opencode-adapter.js +231 -0
  62. package/dist/opencode-adapter.js.map +1 -0
  63. package/dist/pi-adapter.d.ts +26 -0
  64. package/dist/pi-adapter.d.ts.map +1 -0
  65. package/dist/pi-adapter.js +196 -0
  66. package/dist/pi-adapter.js.map +1 -0
  67. package/dist/qwen-adapter.d.ts +36 -0
  68. package/dist/qwen-adapter.d.ts.map +1 -0
  69. package/dist/qwen-adapter.js +257 -0
  70. package/dist/qwen-adapter.js.map +1 -0
  71. package/dist/session-fs.d.ts +83 -0
  72. package/dist/session-fs.d.ts.map +1 -0
  73. package/dist/session-fs.js +255 -0
  74. package/dist/session-fs.js.map +1 -0
  75. package/package.json +56 -0
@@ -0,0 +1,196 @@
1
+ /**
2
+ * PiAdapter — Pi agent CLI adapter.
3
+ */
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { BaseAgentAdapter } from './base-adapter.js';
7
+ import { listJsonlFiles, parseJsonlSessionFile, readJsonFile, writeJsonFileAtomic, } from './session-fs.js';
8
+ export class PiAdapter extends BaseAgentAdapter {
9
+ agent = 'pi';
10
+ displayName = 'Pi';
11
+ cliCommand = 'pi';
12
+ minVersion = '0.1.0';
13
+ hostEnvSignals = ['PI_RUN_ID', 'PI_SESSION_ID'];
14
+ capabilities = {
15
+ agent: 'pi',
16
+ canResume: true,
17
+ canFork: false,
18
+ supportsMultiTurn: true,
19
+ sessionPersistence: 'file',
20
+ supportsTextStreaming: true,
21
+ supportsToolCallStreaming: true,
22
+ supportsThinkingStreaming: false,
23
+ supportsNativeTools: true,
24
+ supportsMCP: false,
25
+ supportsParallelToolCalls: false,
26
+ requiresToolApproval: true,
27
+ approvalModes: ['yolo', 'prompt'],
28
+ supportsThinking: false,
29
+ thinkingEffortLevels: [],
30
+ supportsThinkingBudgetTokens: false,
31
+ supportsJsonMode: false,
32
+ supportsStructuredOutput: false,
33
+ supportsSkills: false,
34
+ supportsAgentsMd: false,
35
+ skillsFormat: null,
36
+ supportsSubagentDispatch: false,
37
+ supportsParallelExecution: false,
38
+ supportsInteractiveMode: true,
39
+ supportsStdinInjection: true,
40
+ supportsImageInput: false,
41
+ supportsImageOutput: false,
42
+ supportsFileAttachments: false,
43
+ supportsPlugins: false,
44
+ pluginFormats: [],
45
+ pluginRegistries: [],
46
+ supportedPlatforms: ['darwin', 'linux', 'win32'],
47
+ requiresGitRepo: false,
48
+ requiresPty: false,
49
+ authMethods: [
50
+ { type: 'api_key', name: 'Provider API Key', description: 'Provider-specific API key env vars' },
51
+ ],
52
+ authFiles: ['.pi/agent/settings.json'],
53
+ installMethods: [
54
+ { platform: 'all', type: 'npm', command: 'npm install -g pi-cli' },
55
+ ],
56
+ };
57
+ models = [
58
+ {
59
+ agent: 'pi',
60
+ modelId: 'default',
61
+ displayName: 'Default Model',
62
+ deprecated: false,
63
+ contextWindow: 128000,
64
+ maxOutputTokens: 8192,
65
+ supportsThinking: false,
66
+ supportsToolCalling: true,
67
+ supportsParallelToolCalls: false,
68
+ supportsToolCallStreaming: true,
69
+ supportsJsonMode: false,
70
+ supportsStructuredOutput: false,
71
+ supportsTextStreaming: true,
72
+ supportsThinkingStreaming: false,
73
+ supportsImageInput: false,
74
+ supportsImageOutput: false,
75
+ supportsFileInput: false,
76
+ cliArgKey: '--model',
77
+ cliArgValue: 'default',
78
+ lastUpdated: '2025-01-01',
79
+ source: 'bundled',
80
+ },
81
+ ];
82
+ defaultModelId = 'default';
83
+ configSchema = {
84
+ agent: 'pi',
85
+ version: 1,
86
+ fields: [],
87
+ configFilePaths: [path.join(os.homedir(), '.pi', 'agent', 'settings.json')],
88
+ configFormat: 'json',
89
+ supportsProjectConfig: false,
90
+ };
91
+ buildSpawnArgs(options) {
92
+ const args = [];
93
+ if (options.model) {
94
+ args.push('--model', options.model);
95
+ }
96
+ const prompt = Array.isArray(options.prompt) ? options.prompt.join('\n') : options.prompt;
97
+ args.push('--prompt', prompt);
98
+ return {
99
+ command: this.cliCommand,
100
+ args,
101
+ env: this.buildEnvFromOptions(options),
102
+ cwd: options.cwd ?? process.cwd(),
103
+ usePty: false,
104
+ timeout: options.timeout,
105
+ inactivityTimeout: options.inactivityTimeout,
106
+ };
107
+ }
108
+ parseEvent(line, context) {
109
+ const parsed = this.parseJsonLine(line);
110
+ if (parsed == null || typeof parsed !== 'object')
111
+ return null;
112
+ const obj = parsed;
113
+ const ts = Date.now();
114
+ const base = { runId: context.runId, agent: this.agent, timestamp: ts };
115
+ const type = obj['type'];
116
+ if (type === 'text' || type === 'message') {
117
+ const content = (obj['content'] ?? obj['text'] ?? '');
118
+ if (content) {
119
+ return { ...base, type: 'text_delta', delta: content, accumulated: content };
120
+ }
121
+ }
122
+ if (type === 'tool_call') {
123
+ return {
124
+ ...base,
125
+ type: 'tool_call_start',
126
+ toolCallId: (obj['id'] ?? ''),
127
+ toolName: (obj['name'] ?? ''),
128
+ inputAccumulated: JSON.stringify(obj['input'] ?? {}),
129
+ };
130
+ }
131
+ if (type === 'error') {
132
+ return {
133
+ ...base,
134
+ type: 'error',
135
+ code: 'INTERNAL',
136
+ message: (obj['message'] ?? 'Unknown error'),
137
+ recoverable: false,
138
+ };
139
+ }
140
+ return null;
141
+ }
142
+ async detectAuth() {
143
+ // Check common provider keys
144
+ if (process.env['ANTHROPIC_API_KEY']) {
145
+ return { status: 'authenticated', method: 'api_key', identity: 'anthropic' };
146
+ }
147
+ if (process.env['OPENAI_API_KEY']) {
148
+ return { status: 'authenticated', method: 'api_key', identity: 'openai' };
149
+ }
150
+ return { status: 'unauthenticated' };
151
+ }
152
+ getAuthGuidance() {
153
+ return {
154
+ agent: 'pi',
155
+ providerName: 'Pi',
156
+ steps: [
157
+ { step: 1, description: 'Set a provider-specific API key environment variable' },
158
+ { step: 2, description: 'For example: export ANTHROPIC_API_KEY=sk-ant-...', command: 'export ANTHROPIC_API_KEY=sk-ant-...' },
159
+ ],
160
+ envVars: [
161
+ { name: 'ANTHROPIC_API_KEY', description: 'Anthropic API key', required: false },
162
+ { name: 'OPENAI_API_KEY', description: 'OpenAI API key', required: false },
163
+ ],
164
+ verifyCommand: 'pi --version',
165
+ };
166
+ }
167
+ sessionDir(_cwd) {
168
+ return path.join(os.homedir(), '.pi', 'agent', 'sessions');
169
+ }
170
+ async parseSessionFile(filePath) {
171
+ const parsed = await parseJsonlSessionFile(filePath, 'pi');
172
+ return { ...parsed, agent: 'pi' };
173
+ }
174
+ async listSessionFiles(_cwd) {
175
+ return listJsonlFiles(this.sessionDir());
176
+ }
177
+ async readConfig(_cwd) {
178
+ const filePath = this.configSchema.configFilePaths?.[0];
179
+ if (!filePath)
180
+ return { agent: 'pi', source: 'global' };
181
+ const data = (await readJsonFile(filePath)) ?? {};
182
+ return { agent: 'pi', source: 'global', filePaths: [filePath], ...data };
183
+ }
184
+ async writeConfig(config, _cwd) {
185
+ const filePath = this.configSchema.configFilePaths?.[0];
186
+ if (!filePath)
187
+ return;
188
+ const existing = (await readJsonFile(filePath)) ?? {};
189
+ const { agent: _a, source: _s, filePaths: _fp, ...rest } = config;
190
+ void _a;
191
+ void _s;
192
+ void _fp;
193
+ await writeJsonFileAtomic(filePath, { ...existing, ...rest });
194
+ }
195
+ }
196
+ //# sourceMappingURL=pi-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-adapter.js","sourceRoot":"","sources":["../src/pi-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * QwenAdapter — Alibaba Qwen Code CLI adapter.
3
+ *
4
+ * Qwen Code is a fork of Google's Gemini CLI, adapted for Qwen3-Coder models.
5
+ * It speaks an OpenAI-compatible API (DashScope or self-hosted), stores config
6
+ * under ~/.qwen/settings.json, and supports MCP servers via `mcpServers`.
7
+ *
8
+ * Upstream: https://github.com/QwenLM/qwen-code
9
+ */
10
+ import type { AgentCapabilities, ModelCapabilities, AgentConfigSchema, AuthState, AuthSetupGuidance, Session, SpawnArgs, ParseContext, RunOptions, AgentEvent, InstalledPlugin, PluginInstallOptions, AgentConfig } from '@a5c-ai/agent-mux-core';
11
+ import { BaseAgentAdapter } from './base-adapter.js';
12
+ export declare class QwenAdapter extends BaseAgentAdapter {
13
+ readonly agent = "qwen";
14
+ readonly displayName = "Qwen Code";
15
+ readonly cliCommand = "qwen";
16
+ readonly minVersion = "0.0.1";
17
+ readonly hostEnvSignals: readonly ["QWEN_CODE", "QWEN_SESSION_ID"];
18
+ readonly capabilities: AgentCapabilities;
19
+ readonly models: ModelCapabilities[];
20
+ readonly defaultModelId = "qwen3-coder-plus";
21
+ readonly configSchema: AgentConfigSchema;
22
+ buildSpawnArgs(options: RunOptions): SpawnArgs;
23
+ parseEvent(line: string, context: ParseContext): AgentEvent | AgentEvent[] | null;
24
+ detectAuth(): Promise<AuthState>;
25
+ getAuthGuidance(): AuthSetupGuidance;
26
+ sessionDir(_cwd?: string): string;
27
+ parseSessionFile(filePath: string): Promise<Session>;
28
+ listSessionFiles(_cwd?: string): Promise<string[]>;
29
+ readConfig(_cwd?: string): Promise<AgentConfig>;
30
+ writeConfig(config: Partial<AgentConfig>, _cwd?: string): Promise<void>;
31
+ private pluginsPath;
32
+ listPlugins(): Promise<InstalledPlugin[]>;
33
+ installPlugin(pluginId: string, options?: PluginInstallOptions): Promise<InstalledPlugin>;
34
+ uninstallPlugin(pluginId: string): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=qwen-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-adapter.d.ts","sourceRoot":"","sources":["../src/qwen-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AASrD,qBAAa,WAAY,SAAQ,gBAAgB;IAC/C,QAAQ,CAAC,KAAK,UAAU;IACxB,QAAQ,CAAC,WAAW,eAAe;IACnC,QAAQ,CAAC,UAAU,UAAU;IAC7B,QAAQ,CAAC,UAAU,WAAW;IAC9B,QAAQ,CAAC,cAAc,4CAA6C;IAEpE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CA0CtC;IAEF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,EAAE,CA+ClC;IAEF,QAAQ,CAAC,cAAc,sBAAsB;IAE7C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAQtC;IAEF,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS;IAyB9C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI;IAmD3E,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAYtC,eAAe,IAAI,iBAAiB;IAoBpC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAI3B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlD,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAO/C,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7E,OAAO,CAAC,WAAW;IAIJ,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIzC,aAAa,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAIZ,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhE"}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * QwenAdapter — Alibaba Qwen Code CLI adapter.
3
+ *
4
+ * Qwen Code is a fork of Google's Gemini CLI, adapted for Qwen3-Coder models.
5
+ * It speaks an OpenAI-compatible API (DashScope or self-hosted), stores config
6
+ * under ~/.qwen/settings.json, and supports MCP servers via `mcpServers`.
7
+ *
8
+ * Upstream: https://github.com/QwenLM/qwen-code
9
+ */
10
+ import * as os from 'node:os';
11
+ import * as path from 'node:path';
12
+ import { BaseAgentAdapter } from './base-adapter.js';
13
+ import { mcpListPlugins, mcpInstallPlugin, mcpUninstallPlugin } from './mcp-plugins.js';
14
+ import { listJsonlFiles, parseJsonlSessionFile, readJsonFile, writeJsonFileAtomic, } from './session-fs.js';
15
+ export class QwenAdapter extends BaseAgentAdapter {
16
+ agent = 'qwen';
17
+ displayName = 'Qwen Code';
18
+ cliCommand = 'qwen';
19
+ minVersion = '0.0.1';
20
+ hostEnvSignals = ['QWEN_CODE', 'QWEN_SESSION_ID'];
21
+ capabilities = {
22
+ agent: 'qwen',
23
+ canResume: true,
24
+ canFork: false,
25
+ supportsMultiTurn: true,
26
+ sessionPersistence: 'file',
27
+ supportsTextStreaming: true,
28
+ supportsToolCallStreaming: true,
29
+ supportsThinkingStreaming: false,
30
+ supportsNativeTools: true,
31
+ supportsMCP: true,
32
+ supportsParallelToolCalls: true,
33
+ requiresToolApproval: true,
34
+ approvalModes: ['yolo', 'prompt'],
35
+ supportsThinking: false,
36
+ thinkingEffortLevels: [],
37
+ supportsThinkingBudgetTokens: false,
38
+ supportsJsonMode: false,
39
+ supportsStructuredOutput: false,
40
+ supportsSkills: false,
41
+ supportsAgentsMd: true,
42
+ skillsFormat: null,
43
+ supportsSubagentDispatch: false,
44
+ supportsParallelExecution: false,
45
+ supportsInteractiveMode: true,
46
+ supportsStdinInjection: true,
47
+ supportsImageInput: false,
48
+ supportsImageOutput: false,
49
+ supportsFileAttachments: true,
50
+ supportsPlugins: true,
51
+ pluginFormats: ['mcp-server'],
52
+ pluginRegistries: [{ name: 'mcp', url: 'https://modelcontextprotocol.io', searchable: false }],
53
+ supportedPlatforms: ['darwin', 'linux', 'win32'],
54
+ requiresGitRepo: false,
55
+ requiresPty: false,
56
+ authMethods: [
57
+ { type: 'api_key', name: 'OpenAI-compatible API Key', description: 'OPENAI_API_KEY (DashScope or compatible endpoint)' },
58
+ ],
59
+ authFiles: ['.qwen/settings.json'],
60
+ installMethods: [
61
+ { platform: 'all', type: 'npm', command: 'npm install -g @qwen-code/qwen-code' },
62
+ ],
63
+ };
64
+ models = [
65
+ {
66
+ agent: 'qwen',
67
+ modelId: 'qwen3-coder-plus',
68
+ displayName: 'Qwen3 Coder Plus',
69
+ deprecated: false,
70
+ contextWindow: 1000000,
71
+ maxOutputTokens: 65536,
72
+ supportsThinking: false,
73
+ supportsToolCalling: true,
74
+ supportsParallelToolCalls: true,
75
+ supportsToolCallStreaming: true,
76
+ supportsJsonMode: false,
77
+ supportsStructuredOutput: false,
78
+ supportsTextStreaming: true,
79
+ supportsThinkingStreaming: false,
80
+ supportsImageInput: false,
81
+ supportsImageOutput: false,
82
+ supportsFileInput: true,
83
+ cliArgKey: '--model',
84
+ cliArgValue: 'qwen3-coder-plus',
85
+ lastUpdated: '2025-09-01',
86
+ source: 'bundled',
87
+ },
88
+ {
89
+ agent: 'qwen',
90
+ modelId: 'qwen3-coder-flash',
91
+ displayName: 'Qwen3 Coder Flash',
92
+ deprecated: false,
93
+ contextWindow: 1000000,
94
+ maxOutputTokens: 65536,
95
+ supportsThinking: false,
96
+ supportsToolCalling: true,
97
+ supportsParallelToolCalls: true,
98
+ supportsToolCallStreaming: true,
99
+ supportsJsonMode: false,
100
+ supportsStructuredOutput: false,
101
+ supportsTextStreaming: true,
102
+ supportsThinkingStreaming: false,
103
+ supportsImageInput: false,
104
+ supportsImageOutput: false,
105
+ supportsFileInput: true,
106
+ cliArgKey: '--model',
107
+ cliArgValue: 'qwen3-coder-flash',
108
+ lastUpdated: '2025-09-01',
109
+ source: 'bundled',
110
+ },
111
+ ];
112
+ defaultModelId = 'qwen3-coder-plus';
113
+ configSchema = {
114
+ agent: 'qwen',
115
+ version: 1,
116
+ fields: [],
117
+ configFilePaths: [path.join(os.homedir(), '.qwen', 'settings.json')],
118
+ projectConfigFilePaths: ['.qwen/settings.json'],
119
+ configFormat: 'json',
120
+ supportsProjectConfig: true,
121
+ };
122
+ buildSpawnArgs(options) {
123
+ const args = [];
124
+ if (options.model) {
125
+ args.push('--model', options.model);
126
+ }
127
+ if (options.approvalMode === 'yolo') {
128
+ args.push('--yolo');
129
+ }
130
+ const prompt = Array.isArray(options.prompt) ? options.prompt.join('\n') : options.prompt;
131
+ args.push('--prompt', prompt);
132
+ return {
133
+ command: this.cliCommand,
134
+ args,
135
+ env: this.buildEnvFromOptions(options),
136
+ cwd: options.cwd ?? process.cwd(),
137
+ usePty: false,
138
+ timeout: options.timeout,
139
+ inactivityTimeout: options.inactivityTimeout,
140
+ };
141
+ }
142
+ parseEvent(line, context) {
143
+ const parsed = this.parseJsonLine(line);
144
+ if (parsed == null || typeof parsed !== 'object')
145
+ return null;
146
+ const obj = parsed;
147
+ const ts = Date.now();
148
+ const base = { runId: context.runId, agent: this.agent, timestamp: ts };
149
+ const type = obj['type'];
150
+ if (type === 'text' || type === 'message') {
151
+ const content = (obj['content'] ?? obj['text'] ?? '');
152
+ if (content) {
153
+ return { ...base, type: 'text_delta', delta: content, accumulated: content };
154
+ }
155
+ }
156
+ if (type === 'tool_call') {
157
+ return {
158
+ ...base,
159
+ type: 'tool_call_start',
160
+ toolCallId: (obj['id'] ?? ''),
161
+ toolName: (obj['name'] ?? ''),
162
+ inputAccumulated: JSON.stringify(obj['args'] ?? obj['input'] ?? {}),
163
+ };
164
+ }
165
+ if (type === 'tool_result') {
166
+ return {
167
+ ...base,
168
+ type: 'tool_result',
169
+ toolCallId: (obj['id'] ?? ''),
170
+ toolName: (obj['name'] ?? ''),
171
+ output: obj['output'] ?? '',
172
+ durationMs: 0,
173
+ };
174
+ }
175
+ if (type === 'error') {
176
+ return {
177
+ ...base,
178
+ type: 'error',
179
+ code: 'INTERNAL',
180
+ message: (obj['message'] ?? 'Unknown error'),
181
+ recoverable: false,
182
+ };
183
+ }
184
+ return null;
185
+ }
186
+ async detectAuth() {
187
+ const apiKey = process.env['OPENAI_API_KEY'];
188
+ if (apiKey) {
189
+ return {
190
+ status: 'authenticated',
191
+ method: 'api_key',
192
+ identity: `...${apiKey.slice(-4)}`,
193
+ };
194
+ }
195
+ return { status: 'unauthenticated' };
196
+ }
197
+ getAuthGuidance() {
198
+ return {
199
+ agent: 'qwen',
200
+ providerName: 'Alibaba Cloud (DashScope)',
201
+ steps: [
202
+ { step: 1, description: 'Create a DashScope API key at https://dashscope.console.aliyun.com/', url: 'https://dashscope.console.aliyun.com/' },
203
+ { step: 2, description: 'Export OpenAI-compatible env vars', command: 'export OPENAI_API_KEY=sk-... OPENAI_BASE_URL=https://dashscope-intl.aliyuncs.com/compatible-mode/v1 OPENAI_MODEL=qwen3-coder-plus' },
204
+ { step: 3, description: 'Alternatively run `qwen` interactively and follow the OAuth login flow', command: 'qwen' },
205
+ ],
206
+ envVars: [
207
+ { name: 'OPENAI_API_KEY', description: 'DashScope or OpenAI-compatible API key', required: true, exampleFormat: 'sk-...' },
208
+ { name: 'OPENAI_BASE_URL', description: 'Compatible-mode endpoint', required: false },
209
+ { name: 'OPENAI_MODEL', description: 'Default model id', required: false },
210
+ ],
211
+ documentationUrls: ['https://github.com/QwenLM/qwen-code'],
212
+ loginCommand: 'qwen',
213
+ verifyCommand: 'qwen --version',
214
+ };
215
+ }
216
+ sessionDir(_cwd) {
217
+ return path.join(os.homedir(), '.qwen', 'sessions');
218
+ }
219
+ async parseSessionFile(filePath) {
220
+ const parsed = await parseJsonlSessionFile(filePath, 'qwen');
221
+ return { ...parsed, agent: 'qwen' };
222
+ }
223
+ async listSessionFiles(_cwd) {
224
+ return listJsonlFiles(this.sessionDir());
225
+ }
226
+ async readConfig(_cwd) {
227
+ const filePath = this.configSchema.configFilePaths?.[0];
228
+ if (!filePath)
229
+ return { agent: 'qwen', source: 'global' };
230
+ const data = (await readJsonFile(filePath)) ?? {};
231
+ return { agent: 'qwen', source: 'global', filePaths: [filePath], ...data };
232
+ }
233
+ async writeConfig(config, _cwd) {
234
+ const filePath = this.configSchema.configFilePaths?.[0];
235
+ if (!filePath)
236
+ return;
237
+ const existing = (await readJsonFile(filePath)) ?? {};
238
+ const { agent: _a, source: _s, filePaths: _fp, ...rest } = config;
239
+ void _a;
240
+ void _s;
241
+ void _fp;
242
+ await writeJsonFileAtomic(filePath, { ...existing, ...rest });
243
+ }
244
+ pluginsPath() {
245
+ return this.configSchema.configFilePaths?.[0] ?? '';
246
+ }
247
+ async listPlugins() {
248
+ return mcpListPlugins(this.pluginsPath());
249
+ }
250
+ async installPlugin(pluginId, options) {
251
+ return mcpInstallPlugin(this.pluginsPath(), pluginId, options);
252
+ }
253
+ async uninstallPlugin(pluginId) {
254
+ return mcpUninstallPlugin(this.pluginsPath(), pluginId);
255
+ }
256
+ }
257
+ //# sourceMappingURL=qwen-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-adapter.js","sourceRoot":"","sources":["../src/qwen-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Shared filesystem helpers for adapter session and config I/O.
3
+ *
4
+ * Kept intentionally dependency-free — only uses `node:fs/promises`
5
+ * and `node:path` with forward-slash-safe joins.
6
+ */
7
+ /**
8
+ * Recursively list all files matching `predicate` under `dir`.
9
+ * Returns absolute paths with forward slashes.
10
+ * If `dir` does not exist, returns an empty array.
11
+ */
12
+ export declare function listFilesRecursive(dir: string, predicate: (entryName: string, fullPath: string) => boolean): Promise<string[]>;
13
+ /** List *.jsonl files recursively under `dir`. */
14
+ export declare function listJsonlFiles(dir: string): Promise<string[]>;
15
+ /** List *.json files recursively under `dir`. */
16
+ export declare function listJsonFiles(dir: string): Promise<string[]>;
17
+ /**
18
+ * Parse a JSONL file into an array of record objects (ignores blank lines
19
+ * and lines that fail to parse). Returns empty array if file missing.
20
+ */
21
+ export declare function parseJsonlFile(filePath: string): Promise<Record<string, unknown>[]>;
22
+ /** Read + parse a JSON file. Returns null if missing or invalid. */
23
+ export declare function readJsonFile<T = unknown>(filePath: string): Promise<T | null>;
24
+ /**
25
+ * Atomically write JSON via the unified core helper (tmp + fsync + rename
26
+ * with advisory lockfile). Creates parent directories as needed.
27
+ */
28
+ export declare function writeJsonFileAtomic(filePath: string, data: unknown): Promise<void>;
29
+ /**
30
+ * Minimal flat-YAML parser for simple `key: value` files.
31
+ * Supports:
32
+ * - comments (# ...)
33
+ * - scalar values (strings, numbers, booleans, null)
34
+ * - quoted strings ("..." or '...')
35
+ * - simple nested blocks via two-space indentation (one level deep)
36
+ * Does NOT support lists, anchors, multi-line strings.
37
+ */
38
+ export declare function parseFlatYaml(text: string): Record<string, unknown>;
39
+ /** Serialize a flat object to simple YAML (top-level + one level of nesting). */
40
+ export declare function stringifyFlatYaml(obj: Record<string, unknown>): string;
41
+ /** Atomically write arbitrary text via the unified core helper. */
42
+ export declare function writeTextFileAtomic(filePath: string, text: string): Promise<void>;
43
+ /** fs.stat safely: returns null on ENOENT. */
44
+ export declare function statSafe(filePath: string): Promise<{
45
+ mtimeMs: number;
46
+ birthtimeMs: number;
47
+ size: number;
48
+ } | null>;
49
+ /**
50
+ * Normalize a path to forward slashes (Windows-safe, cross-platform).
51
+ */
52
+ export declare function toPosix(p: string): string;
53
+ /**
54
+ * Home-directory-relative join with forward slashes.
55
+ */
56
+ export declare function homeJoin(...segments: string[]): string;
57
+ /**
58
+ * Shared `parseSessionFile` logic: read JSONL, derive createdAt from
59
+ * file stat birthtime, updatedAt from mtime, and build SessionMessage[]
60
+ * from rows via `rowToMessage` heuristics.
61
+ * The caller supplies the agent name.
62
+ */
63
+ export declare function parseJsonlSessionFile(filePath: string, agent: string): Promise<{
64
+ sessionId: string;
65
+ agent: string;
66
+ turnCount: number;
67
+ createdAt: string;
68
+ updatedAt: string;
69
+ messages: Array<{
70
+ role: 'user' | 'assistant' | 'system' | 'tool';
71
+ content: string;
72
+ }>;
73
+ raw: unknown;
74
+ }>;
75
+ /**
76
+ * Derive a SessionMessage-like representation from an arbitrary JSONL row.
77
+ * Used by adapters that don't have a more precise schema.
78
+ */
79
+ export declare function rowToMessage(row: Record<string, unknown>): {
80
+ role: 'user' | 'assistant' | 'system' | 'tool';
81
+ content: string;
82
+ } | null;
83
+ //# sourceMappingURL=session-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-fs.d.ts","sourceRoot":"","sources":["../src/session-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,GAC1D,OAAO,CAAC,MAAM,EAAE,CAAC,CAoBnB;AAED,kDAAkD;AAClD,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnE;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAElE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAqBzF;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAOnF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8BnE;AAcD,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAatE;AAcD,mEAAmE;AACnE,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,8CAA8C;AAC9C,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAOxE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF,GAAG,EAAE,OAAO,CAAC;CACd,CAAC,CAiBD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC1D,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,IAAI,CAcP"}