@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,269 @@
1
+ /**
2
+ * HermesAdapter — Hermes agent (NousResearch) CLI adapter.
3
+ */
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import * as fs from 'node:fs/promises';
7
+ import { BaseAgentAdapter } from './base-adapter.js';
8
+ import { listJsonlFiles, parseJsonlSessionFile, parseFlatYaml, stringifyFlatYaml, writeTextFileAtomic, } from './session-fs.js';
9
+ export class HermesAdapter extends BaseAgentAdapter {
10
+ agent = 'hermes';
11
+ displayName = 'Hermes';
12
+ cliCommand = 'hermes';
13
+ minVersion = '0.1.0';
14
+ hostEnvSignals = ['HERMES_SESSION', 'HERMES_RUN_ID'];
15
+ capabilities = {
16
+ agent: 'hermes',
17
+ canResume: true,
18
+ canFork: false,
19
+ supportsMultiTurn: true,
20
+ sessionPersistence: 'sqlite',
21
+ supportsTextStreaming: true,
22
+ supportsToolCallStreaming: true,
23
+ supportsThinkingStreaming: false,
24
+ supportsNativeTools: true,
25
+ supportsMCP: true,
26
+ supportsParallelToolCalls: true,
27
+ requiresToolApproval: true,
28
+ approvalModes: ['yolo', 'prompt'],
29
+ supportsThinking: false,
30
+ thinkingEffortLevels: [],
31
+ supportsThinkingBudgetTokens: false,
32
+ supportsJsonMode: false,
33
+ supportsStructuredOutput: false,
34
+ supportsSkills: false,
35
+ supportsAgentsMd: false,
36
+ skillsFormat: null,
37
+ supportsSubagentDispatch: false,
38
+ supportsParallelExecution: false,
39
+ supportsInteractiveMode: true,
40
+ supportsStdinInjection: true,
41
+ supportsImageInput: false,
42
+ supportsImageOutput: false,
43
+ supportsFileAttachments: false,
44
+ supportsPlugins: false,
45
+ pluginFormats: [],
46
+ pluginRegistries: [],
47
+ supportedPlatforms: ['darwin', 'linux', 'win32'],
48
+ requiresGitRepo: false,
49
+ requiresPty: false,
50
+ authMethods: [
51
+ { type: 'api_key', name: 'OpenRouter API Key', description: 'OPENROUTER_API_KEY environment variable' },
52
+ { type: 'api_key', name: 'Anthropic API Key', description: 'ANTHROPIC_API_KEY environment variable' },
53
+ { type: 'api_key', name: 'OpenAI API Key', description: 'OPENAI_API_KEY environment variable' },
54
+ { type: 'api_key', name: 'Nous API Key', description: 'NOUS_API_KEY environment variable' },
55
+ { type: 'github_token', name: 'GitHub Token', description: 'GITHUB_TOKEN environment variable' },
56
+ { type: 'api_key', name: 'Google API Key', description: 'GOOGLE_API_KEY environment variable' },
57
+ ],
58
+ authFiles: ['.hermes/cli-config.yaml'],
59
+ installMethods: [
60
+ { platform: 'all', type: 'npm', command: 'npm install -g hermes-agent' },
61
+ ],
62
+ };
63
+ models = [
64
+ {
65
+ agent: 'hermes',
66
+ modelId: 'hermes-3-llama-3.1-405b',
67
+ displayName: 'Hermes 3 Llama 3.1 405B',
68
+ deprecated: false,
69
+ contextWindow: 128000,
70
+ maxOutputTokens: 8192,
71
+ supportsThinking: false,
72
+ supportsToolCalling: true,
73
+ supportsParallelToolCalls: true,
74
+ supportsToolCallStreaming: true,
75
+ supportsJsonMode: false,
76
+ supportsStructuredOutput: false,
77
+ supportsTextStreaming: true,
78
+ supportsThinkingStreaming: false,
79
+ supportsImageInput: false,
80
+ supportsImageOutput: false,
81
+ supportsFileInput: false,
82
+ cliArgKey: '--model',
83
+ cliArgValue: 'hermes-3-llama-3.1-405b',
84
+ lastUpdated: '2025-01-01',
85
+ source: 'bundled',
86
+ },
87
+ ];
88
+ defaultModelId = 'hermes-3-llama-3.1-405b';
89
+ configSchema = {
90
+ agent: 'hermes',
91
+ version: 1,
92
+ fields: [],
93
+ configFilePaths: [path.join(os.homedir(), '.hermes', 'cli-config.yaml')],
94
+ configFormat: 'yaml',
95
+ supportsProjectConfig: false,
96
+ };
97
+ buildSpawnArgs(options) {
98
+ const args = [];
99
+ if (options.model) {
100
+ args.push('--model', options.model);
101
+ }
102
+ if (options.approvalMode === 'yolo') {
103
+ args.push('--auto-approve');
104
+ }
105
+ const prompt = Array.isArray(options.prompt) ? options.prompt.join('\n') : options.prompt;
106
+ args.push('--prompt', prompt);
107
+ return {
108
+ command: this.cliCommand,
109
+ args,
110
+ env: this.buildEnvFromOptions(options),
111
+ cwd: options.cwd ?? process.cwd(),
112
+ usePty: false,
113
+ timeout: options.timeout,
114
+ inactivityTimeout: options.inactivityTimeout,
115
+ };
116
+ }
117
+ parseEvent(line, context) {
118
+ const parsed = this.parseJsonLine(line);
119
+ if (parsed == null || typeof parsed !== 'object')
120
+ return null;
121
+ const obj = parsed;
122
+ const ts = Date.now();
123
+ const base = { runId: context.runId, agent: this.agent, timestamp: ts };
124
+ const type = obj['type'];
125
+ if (type === 'text' || type === 'message') {
126
+ const content = (obj['content'] ?? obj['text'] ?? '');
127
+ if (content) {
128
+ return { ...base, type: 'text_delta', delta: content, accumulated: content };
129
+ }
130
+ }
131
+ if (type === 'tool_call') {
132
+ return {
133
+ ...base,
134
+ type: 'tool_call_start',
135
+ toolCallId: (obj['id'] ?? ''),
136
+ toolName: (obj['name'] ?? ''),
137
+ inputAccumulated: JSON.stringify(obj['input'] ?? {}),
138
+ };
139
+ }
140
+ if (type === 'error') {
141
+ return {
142
+ ...base,
143
+ type: 'error',
144
+ code: 'INTERNAL',
145
+ message: (obj['message'] ?? 'Unknown error'),
146
+ recoverable: false,
147
+ };
148
+ }
149
+ return null;
150
+ }
151
+ async detectAuth() {
152
+ const envVars = [
153
+ 'OPENROUTER_API_KEY',
154
+ 'ANTHROPIC_API_KEY',
155
+ 'OPENAI_API_KEY',
156
+ 'NOUS_API_KEY',
157
+ 'GITHUB_TOKEN',
158
+ 'GOOGLE_API_KEY',
159
+ ];
160
+ for (const envVar of envVars) {
161
+ if (process.env[envVar]) {
162
+ const method = envVar === 'GITHUB_TOKEN' ? 'github_token' : 'api_key';
163
+ return {
164
+ status: 'authenticated',
165
+ method,
166
+ identity: `${envVar.toLowerCase().replace('_api_key', '').replace('_token', '')}`,
167
+ };
168
+ }
169
+ }
170
+ return { status: 'unauthenticated' };
171
+ }
172
+ getAuthGuidance() {
173
+ return {
174
+ agent: 'hermes',
175
+ providerName: 'NousResearch / Hermes',
176
+ steps: [
177
+ { step: 1, description: 'Set one or more provider API key environment variables' },
178
+ { step: 2, description: 'OpenRouter: export OPENROUTER_API_KEY=sk-or-...', command: 'export OPENROUTER_API_KEY=sk-or-...' },
179
+ { step: 3, description: 'Or use Anthropic, OpenAI, Nous, GitHub, or Google API keys' },
180
+ ],
181
+ envVars: [
182
+ { name: 'OPENROUTER_API_KEY', description: 'OpenRouter API key', required: false, exampleFormat: 'sk-or-...' },
183
+ { name: 'ANTHROPIC_API_KEY', description: 'Anthropic API key', required: false },
184
+ { name: 'OPENAI_API_KEY', description: 'OpenAI API key', required: false },
185
+ { name: 'NOUS_API_KEY', description: 'Nous API key', required: false },
186
+ { name: 'GITHUB_TOKEN', description: 'GitHub token', required: false },
187
+ { name: 'GOOGLE_API_KEY', description: 'Google API key', required: false },
188
+ ],
189
+ documentationUrls: ['https://github.com/NousResearch/hermes'],
190
+ verifyCommand: 'hermes --version',
191
+ };
192
+ }
193
+ sessionDir(_cwd) {
194
+ return path.join(os.homedir(), '.hermes', 'sessions');
195
+ }
196
+ async parseSessionFile(filePath) {
197
+ const parsed = await parseJsonlSessionFile(filePath, 'hermes');
198
+ return { ...parsed, agent: 'hermes' };
199
+ }
200
+ async listSessionFiles(_cwd) {
201
+ return listJsonlFiles(this.sessionDir());
202
+ }
203
+ async readConfig(_cwd) {
204
+ const filePath = this.configSchema.configFilePaths?.[0];
205
+ if (!filePath)
206
+ return { agent: 'hermes', source: 'global' };
207
+ let text;
208
+ try {
209
+ text = await fs.readFile(filePath, 'utf8');
210
+ }
211
+ catch {
212
+ return { agent: 'hermes', source: 'global', filePaths: [filePath] };
213
+ }
214
+ const data = parseFlatYaml(text);
215
+ return { agent: 'hermes', source: 'global', filePaths: [filePath], ...data };
216
+ }
217
+ async writeConfig(config, _cwd) {
218
+ const filePath = this.configSchema.configFilePaths?.[0];
219
+ if (!filePath)
220
+ return;
221
+ let existing = {};
222
+ try {
223
+ existing = parseFlatYaml(await fs.readFile(filePath, 'utf8'));
224
+ }
225
+ catch {
226
+ existing = {};
227
+ }
228
+ const { agent: _a, source: _s, filePaths: _fp, ...rest } = config;
229
+ void _a;
230
+ void _s;
231
+ void _fp;
232
+ const merged = { ...existing, ...rest };
233
+ await writeTextFileAtomic(filePath, stringifyFlatYaml(merged));
234
+ }
235
+ /**
236
+ * Hermes stores config as flat YAML. We encode hooks as a nested
237
+ * `hooks:` block with one `<hookType>: <command>` entry per line.
238
+ * Multiple commands per hookType are joined with `&&` since flat YAML
239
+ * allows only one value per key.
240
+ */
241
+ async writeNativeHook(hookType, command) {
242
+ const filePath = this.configSchema.configFilePaths?.[0];
243
+ if (!filePath)
244
+ return;
245
+ try {
246
+ let existing = {};
247
+ try {
248
+ existing = parseFlatYaml(await fs.readFile(filePath, 'utf8'));
249
+ }
250
+ catch {
251
+ existing = {};
252
+ }
253
+ const hooks = (existing['hooks'] && typeof existing['hooks'] === 'object'
254
+ ? existing['hooks']
255
+ : {});
256
+ const prior = typeof hooks[hookType] === 'string' ? hooks[hookType] : '';
257
+ hooks[hookType] = prior ? `${prior} && ${command}` : command;
258
+ const merged = { ...existing, hooks };
259
+ const fsp = await import('node:fs/promises');
260
+ const pathMod = await import('node:path');
261
+ await fsp.mkdir(pathMod.dirname(filePath), { recursive: true });
262
+ await writeTextFileAtomic(filePath, stringifyFlatYaml(merged));
263
+ }
264
+ catch {
265
+ // swallow
266
+ }
267
+ }
268
+ }
269
+ //# sourceMappingURL=hermes-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-adapter.js","sourceRoot":"","sources":["../src/hermes-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @a5c-ai/agent-mux-adapters
3
+ *
4
+ * Built-in adapter implementations for all supported agents.
5
+ */
6
+ export { type AgentName, type BuiltInAgentName } from '@a5c-ai/agent-mux-core';
7
+ export { BaseAgentAdapter, defaultSpawner } from './base-adapter.js';
8
+ export { ClaudeAdapter } from './claude-adapter.js';
9
+ export { CodexAdapter } from './codex-adapter.js';
10
+ export { GeminiAdapter } from './gemini-adapter.js';
11
+ export { CopilotAdapter } from './copilot-adapter.js';
12
+ export { CursorAdapter } from './cursor-adapter.js';
13
+ export { OpenCodeAdapter } from './opencode-adapter.js';
14
+ export { PiAdapter } from './pi-adapter.js';
15
+ export { OmpAdapter } from './omp-adapter.js';
16
+ export { OpenClawAdapter } from './openclaw-adapter.js';
17
+ export { HermesAdapter } from './hermes-adapter.js';
18
+ export { AgentMuxRemoteAdapter } from './agent-mux-remote-adapter.js';
19
+ export { QwenAdapter } from './qwen-adapter.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @a5c-ai/agent-mux-adapters
3
+ *
4
+ * Built-in adapter implementations for all supported agents.
5
+ */
6
+ // Base adapter class
7
+ export { BaseAgentAdapter, defaultSpawner } from './base-adapter.js';
8
+ // Built-in adapters
9
+ export { ClaudeAdapter } from './claude-adapter.js';
10
+ export { CodexAdapter } from './codex-adapter.js';
11
+ export { GeminiAdapter } from './gemini-adapter.js';
12
+ export { CopilotAdapter } from './copilot-adapter.js';
13
+ export { CursorAdapter } from './cursor-adapter.js';
14
+ export { OpenCodeAdapter } from './opencode-adapter.js';
15
+ export { PiAdapter } from './pi-adapter.js';
16
+ export { OmpAdapter } from './omp-adapter.js';
17
+ export { OpenClawAdapter } from './openclaw-adapter.js';
18
+ export { HermesAdapter } from './hermes-adapter.js';
19
+ export { AgentMuxRemoteAdapter } from './agent-mux-remote-adapter.js';
20
+ export { QwenAdapter } from './qwen-adapter.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,qBAAqB;AACrB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErE,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared MCP-server plugin helpers.
3
+ *
4
+ * Adapters whose native config stores MCP servers under `mcpServers`
5
+ * (claude, cursor, gemini, opencode, openclaw) delegate list/install/
6
+ * uninstall to these helpers instead of reimplementing JSON read-modify-
7
+ * write per adapter.
8
+ */
9
+ import type { InstalledPlugin, PluginInstallOptions } from '@a5c-ai/agent-mux-core';
10
+ export declare function mcpListPlugins(configPath: string): Promise<InstalledPlugin[]>;
11
+ export declare function mcpInstallPlugin(configPath: string, pluginId: string, options?: PluginInstallOptions): Promise<InstalledPlugin>;
12
+ export declare function mcpUninstallPlugin(configPath: string, pluginId: string): Promise<void>;
13
+ //# sourceMappingURL=mcp-plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-plugins.d.ts","sourceRoot":"","sources":["../src/mcp-plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAehC,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAWnF;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAe1B;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5F"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Shared MCP-server plugin helpers.
3
+ *
4
+ * Adapters whose native config stores MCP servers under `mcpServers`
5
+ * (claude, cursor, gemini, opencode, openclaw) delegate list/install/
6
+ * uninstall to these helpers instead of reimplementing JSON read-modify-
7
+ * write per adapter.
8
+ */
9
+ import * as fsp from 'node:fs/promises';
10
+ import * as pathMod from 'node:path';
11
+ async function readConfig(configPath) {
12
+ try {
13
+ return JSON.parse(await fsp.readFile(configPath, 'utf8'));
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ async function writeConfig(configPath, doc) {
20
+ await fsp.mkdir(pathMod.dirname(configPath), { recursive: true });
21
+ await fsp.writeFile(configPath, JSON.stringify(doc, null, 2) + '\n', 'utf8');
22
+ }
23
+ export async function mcpListPlugins(configPath) {
24
+ const doc = await readConfig(configPath);
25
+ const servers = (doc['mcpServers'] && typeof doc['mcpServers'] === 'object'
26
+ ? doc['mcpServers']
27
+ : {});
28
+ return Object.keys(servers).map((id) => ({
29
+ pluginId: id,
30
+ name: id,
31
+ version: '0.0.0',
32
+ enabled: true,
33
+ }));
34
+ }
35
+ export async function mcpInstallPlugin(configPath, pluginId, options) {
36
+ if (!pluginId)
37
+ throw new Error('pluginId is required');
38
+ const doc = await readConfig(configPath);
39
+ const servers = (doc['mcpServers'] && typeof doc['mcpServers'] === 'object'
40
+ ? { ...doc['mcpServers'] }
41
+ : {});
42
+ servers[pluginId] = { command: pluginId };
43
+ doc['mcpServers'] = servers;
44
+ await writeConfig(configPath, doc);
45
+ return {
46
+ pluginId,
47
+ name: pluginId,
48
+ version: options?.version ?? '0.0.0',
49
+ enabled: true,
50
+ };
51
+ }
52
+ export async function mcpUninstallPlugin(configPath, pluginId) {
53
+ const doc = await readConfig(configPath);
54
+ const servers = (doc['mcpServers'] && typeof doc['mcpServers'] === 'object'
55
+ ? { ...doc['mcpServers'] }
56
+ : {});
57
+ if (!(pluginId in servers))
58
+ return;
59
+ delete servers[pluginId];
60
+ doc['mcpServers'] = servers;
61
+ await writeConfig(configPath, doc);
62
+ }
63
+ //# sourceMappingURL=mcp-plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-plugins.js","sourceRoot":"","sources":["../src/mcp-plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * OmpAdapter — OMP agent CLI adapter.
3
+ */
4
+ import type { AgentCapabilities, ModelCapabilities, AgentConfigSchema, AuthState, AuthSetupGuidance, Session, SpawnArgs, ParseContext, RunOptions, AgentEvent, AgentConfig } from '@a5c-ai/agent-mux-core';
5
+ import { BaseAgentAdapter } from './base-adapter.js';
6
+ export declare class OmpAdapter extends BaseAgentAdapter {
7
+ readonly agent: "omp";
8
+ readonly displayName = "OMP";
9
+ readonly cliCommand = "omp";
10
+ readonly minVersion = "0.1.0";
11
+ readonly hostEnvSignals: readonly ["OMP_RUN_ID", "OMP_SESSION_ID"];
12
+ readonly capabilities: AgentCapabilities;
13
+ readonly models: ModelCapabilities[];
14
+ readonly defaultModelId = "default";
15
+ readonly configSchema: AgentConfigSchema;
16
+ buildSpawnArgs(options: RunOptions): SpawnArgs;
17
+ parseEvent(line: string, context: ParseContext): AgentEvent | AgentEvent[] | null;
18
+ detectAuth(): Promise<AuthState>;
19
+ getAuthGuidance(): AuthSetupGuidance;
20
+ sessionDir(_cwd?: string): string;
21
+ parseSessionFile(filePath: string): Promise<Session>;
22
+ listSessionFiles(_cwd?: string): Promise<string[]>;
23
+ readConfig(_cwd?: string): Promise<AgentConfig>;
24
+ writeConfig(config: Partial<AgentConfig>, _cwd?: string): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=omp-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omp-adapter.d.ts","sourceRoot":"","sources":["../src/omp-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAQrD,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,QAAQ,CAAC,KAAK,EAAG,KAAK,CAAU;IAChC,QAAQ,CAAC,WAAW,SAAS;IAC7B,QAAQ,CAAC,UAAU,SAAS;IAC5B,QAAQ,CAAC,UAAU,WAAW;IAC9B,QAAQ,CAAC,cAAc,4CAA6C;IAEpE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CA0CtC;IAEF,QAAQ,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAwBlC;IAEF,QAAQ,CAAC,cAAc,aAAa;IAEpC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAOtC;IAEF,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS;IAqB9C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI;IAwC3E,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAUtC,eAAe,IAAI,iBAAiB;IAgBpC,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;CAQ9E"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * OmpAdapter — OMP 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 OmpAdapter extends BaseAgentAdapter {
9
+ agent = 'omp';
10
+ displayName = 'OMP';
11
+ cliCommand = 'omp';
12
+ minVersion = '0.1.0';
13
+ hostEnvSignals = ['OMP_RUN_ID', 'OMP_SESSION_ID'];
14
+ capabilities = {
15
+ agent: 'omp',
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: ['.omp/agent/settings.json'],
53
+ installMethods: [
54
+ { platform: 'all', type: 'npm', command: 'npm install -g omp-cli' },
55
+ ],
56
+ };
57
+ models = [
58
+ {
59
+ agent: 'omp',
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: 'omp',
85
+ version: 1,
86
+ fields: [],
87
+ configFilePaths: [path.join(os.homedir(), '.omp', '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
+ if (process.env['ANTHROPIC_API_KEY']) {
144
+ return { status: 'authenticated', method: 'api_key', identity: 'anthropic' };
145
+ }
146
+ if (process.env['OPENAI_API_KEY']) {
147
+ return { status: 'authenticated', method: 'api_key', identity: 'openai' };
148
+ }
149
+ return { status: 'unauthenticated' };
150
+ }
151
+ getAuthGuidance() {
152
+ return {
153
+ agent: 'omp',
154
+ providerName: 'OMP',
155
+ steps: [
156
+ { step: 1, description: 'Set a provider-specific API key environment variable' },
157
+ { step: 2, description: 'For example: export ANTHROPIC_API_KEY=sk-ant-...', command: 'export ANTHROPIC_API_KEY=sk-ant-...' },
158
+ ],
159
+ envVars: [
160
+ { name: 'ANTHROPIC_API_KEY', description: 'Anthropic API key', required: false },
161
+ { name: 'OPENAI_API_KEY', description: 'OpenAI API key', required: false },
162
+ ],
163
+ verifyCommand: 'omp --version',
164
+ };
165
+ }
166
+ sessionDir(_cwd) {
167
+ return path.join(os.homedir(), '.omp', 'agent', 'sessions');
168
+ }
169
+ async parseSessionFile(filePath) {
170
+ const parsed = await parseJsonlSessionFile(filePath, 'omp');
171
+ return { ...parsed, agent: 'omp' };
172
+ }
173
+ async listSessionFiles(_cwd) {
174
+ return listJsonlFiles(this.sessionDir());
175
+ }
176
+ async readConfig(_cwd) {
177
+ const filePath = this.configSchema.configFilePaths?.[0];
178
+ if (!filePath)
179
+ return { agent: 'omp', source: 'global' };
180
+ const data = (await readJsonFile(filePath)) ?? {};
181
+ return { agent: 'omp', source: 'global', filePaths: [filePath], ...data };
182
+ }
183
+ async writeConfig(config, _cwd) {
184
+ const filePath = this.configSchema.configFilePaths?.[0];
185
+ if (!filePath)
186
+ return;
187
+ const existing = (await readJsonFile(filePath)) ?? {};
188
+ const { agent: _a, source: _s, filePaths: _fp, ...rest } = config;
189
+ void _a;
190
+ void _s;
191
+ void _fp;
192
+ await writeJsonFileAtomic(filePath, { ...existing, ...rest });
193
+ }
194
+ }
195
+ //# sourceMappingURL=omp-adapter.js.map