@hasna/switcher 0.1.0 → 0.1.2

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.
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ declare const rule: z.ZodObject<{
3
+ action: z.ZodString;
4
+ resource: z.ZodString;
5
+ effect: z.ZodEnum<["allow", "deny", "ask"]>;
6
+ }, "strict", z.ZodTypeAny, {
7
+ effect: "allow" | "deny" | "ask";
8
+ action: string;
9
+ resource: string;
10
+ }, {
11
+ effect: "allow" | "deny" | "ask";
12
+ action: string;
13
+ resource: string;
14
+ }>;
15
+ type Rule = z.infer<typeof rule>;
16
+ type Agent = {
17
+ system?: string;
18
+ description?: string;
19
+ mode?: "primary" | "subagent" | "all";
20
+ hidden?: boolean;
21
+ color?: string;
22
+ steps?: number;
23
+ disabled?: boolean;
24
+ permissions?: Rule[];
25
+ };
26
+ /** Preserve native policy and prompts as data, without running native plugins or loading provider settings. */
27
+ export declare function isolateOpenCode2(cwd: string, stateDir: string, providerID: string, env?: NodeJS.ProcessEnv): Promise<{
28
+ config: {
29
+ experimental: {
30
+ policies: {
31
+ action: string;
32
+ resource: string;
33
+ effect: string;
34
+ }[];
35
+ };
36
+ default_agent?: string | undefined;
37
+ permissions: {
38
+ effect: "allow" | "deny" | "ask";
39
+ action: string;
40
+ resource: string;
41
+ }[];
42
+ agents: Record<string, Agent>;
43
+ };
44
+ env: {
45
+ HOME: string;
46
+ XDG_CONFIG_HOME: string;
47
+ OPENCODE_CONFIG_DIR: string;
48
+ XDG_CACHE_HOME: string;
49
+ XDG_STATE_HOME: string;
50
+ XDG_DATA_HOME: string;
51
+ OPENCODE_DISABLE_PROJECT_CONFIG: string;
52
+ OPENCODE_CONFIG_PROJECT_DISABLE: string;
53
+ OPENCODE_DISABLE_MODELS_FETCH: string;
54
+ };
55
+ instructionFile: string;
56
+ sourcePaths: string[];
57
+ }>;
58
+ /** Native substitutes variables before parsing JSON; quote literal prompt/model tokens without evaluating them. */
59
+ export declare function openCode2ConfigText(config: Record<string, unknown>, providerID: string, keyEnv: string): string;
60
+ export {};
@@ -0,0 +1,89 @@
1
+ /** The Ori 0.12.1 command name for a Switcher harness. */
2
+ export type OriTarget = "claude" | "codex" | "grok" | "opencode2" | "pi" | "dsh" | "gemini" | "aider" | "kilo";
3
+ export type OriProtocol = "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
4
+ export type OriReasoningEffort = "max" | "xhigh" | "high" | "medium" | "low" | "minimal" | "none";
5
+ export type OriProviderCatalogEntry = {
6
+ id: "openrouter";
7
+ displayName: "OpenRouter";
8
+ credentialEnv: "OPENROUTER_API_KEY";
9
+ publicModelsUrl: "https://openrouter.ai/api/v1/models";
10
+ entitledModelsUrl: "https://openrouter.ai/api/v1/models/user";
11
+ protocols: readonly OriProtocol[];
12
+ };
13
+ /**
14
+ * Ori is an OpenRouter launcher, rather than a general provider adapter.
15
+ * Keep this list immutable so callers cannot accidentally broaden the boundary.
16
+ */
17
+ export declare const oriProviderCatalog: readonly OriProviderCatalogEntry[];
18
+ /** Native Ori flags verified from `ori <target> --help` for 0.12.1. */
19
+ export declare const oriNativeFlags: Readonly<Record<"claude" | "codex" | "grok", readonly string[]>>;
20
+ export type OriCatalogInput = {
21
+ /** IDs from Switcher's OpenRouter catalog; Ori does not own discovery. */
22
+ modelIds: readonly string[];
23
+ source: "switcher-openrouter";
24
+ /** A Switcher-generated Codex catalog, appended after Ori's provider config. */
25
+ codexModelCatalogPath?: string;
26
+ };
27
+ export type OriHarnessAvailability = {
28
+ kind: string;
29
+ displayName?: string;
30
+ installed: boolean;
31
+ path?: string;
32
+ };
33
+ export type OriContract = {
34
+ executable: string;
35
+ version: string;
36
+ harnesses: OriHarnessAvailability[];
37
+ };
38
+ export type OriEnvironment = NodeJS.ProcessEnv & {
39
+ OPENROUTER_API_KEY?: string;
40
+ ORI_FORCE_OPENROUTER_API_KEY?: string;
41
+ ORI_REQUIRE_LOGIN?: string;
42
+ };
43
+ export type OriLaunchRequest = {
44
+ target: OriTarget;
45
+ provider: string;
46
+ providerBaseUrl?: string;
47
+ protocol?: OriProtocol;
48
+ catalog?: OriCatalogInput;
49
+ model: string;
50
+ args?: string[];
51
+ reasoningEffort?: OriReasoningEffort;
52
+ };
53
+ export type OriLaunchPlan = {
54
+ executable: string;
55
+ args: string[];
56
+ env: Record<string, string>;
57
+ target: OriTarget;
58
+ provider: "openrouter";
59
+ model: string;
60
+ warnings: string[];
61
+ };
62
+ export declare class OriBackendError extends Error {
63
+ readonly code: string;
64
+ constructor(code: string, message: string);
65
+ }
66
+ export declare function assertOriLoginAllowed(environment: NodeJS.ProcessEnv): void;
67
+ /** Read Ori version and launchable harness inventory without auth or mutation. */
68
+ export declare function inspectOri(options?: {
69
+ executable?: string;
70
+ environment?: NodeJS.ProcessEnv;
71
+ cwd?: string;
72
+ }): Promise<OriContract>;
73
+ /** Keep the installed 0.12.x contract explicit; newer Ori builds need review. */
74
+ export declare function assertSupportedOriVersion(contract: OriContract): void;
75
+ /** Fail before Ori's interactive installer offer when the native binary is absent. */
76
+ export declare function requireOriHarness(contract: OriContract, target: OriTarget): OriHarnessAvailability;
77
+ /** Assert the exact OpenRouter provider boundary before constructing argv. */
78
+ export declare function oriProvider(id: string): OriProviderCatalogEntry;
79
+ /** Validate target, provider and catalog authority before resolving a key. */
80
+ export declare function validateOriLaunchRequest(request: OriLaunchRequest): void;
81
+ /**
82
+ * Construct an argv-only Ori launch. This function does no process start and
83
+ * does not read credentials; callers hand it the already-authorized environment.
84
+ */
85
+ export declare function prepareOriLaunch(request: OriLaunchRequest & {
86
+ executable?: string;
87
+ environment?: NodeJS.ProcessEnv;
88
+ }): OriLaunchPlan;
89
+ export declare function oriLaunchWarnings(target: OriTarget): string[];
@@ -0,0 +1,64 @@
1
+ import { type ProviderInput, type ProviderPreset, type Profile } from "./domain";
2
+ type Protocol = ProviderInput["protocol"];
3
+ export declare const providerPresets: readonly ProviderPreset[];
4
+ export declare function getProviderPreset(id: string): {
5
+ id: string;
6
+ name: string;
7
+ credentialAliases: string[];
8
+ protocols: {
9
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
10
+ authStyle: "bearer" | "x-api-key" | "api-key";
11
+ catalogFormat: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
12
+ modelsPath: string;
13
+ notes: string[];
14
+ baseUrl?: string | undefined;
15
+ catalogBaseUrl?: string | undefined;
16
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none" | undefined;
17
+ }[];
18
+ sources: string[];
19
+ verification: "documented";
20
+ credentialEnv?: string | undefined;
21
+ };
22
+ export type PresetOptions = {
23
+ id?: string;
24
+ protocol?: Protocol;
25
+ harness?: Profile["harness"];
26
+ baseUrl?: string;
27
+ credentialEnv?: string;
28
+ authStyle?: "bearer" | "x-api-key" | "api-key";
29
+ catalogBaseUrl?: string;
30
+ catalogCredentialEnv?: string;
31
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
32
+ modelsPath?: string;
33
+ catalogFormat?: ProviderInput["catalogFormat"];
34
+ catalogAccountId?: string;
35
+ };
36
+ export declare function providerFromPreset(presetId: string, options?: PresetOptions): {
37
+ id: string;
38
+ name: string;
39
+ baseUrl: string;
40
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
41
+ authStyle: "bearer" | "x-api-key" | "api-key";
42
+ modelsPath: string;
43
+ manualModels: {
44
+ id: string;
45
+ name: string;
46
+ description?: string | undefined;
47
+ available?: boolean | undefined;
48
+ contextWindow?: number | undefined;
49
+ maxOutputTokens?: number | undefined;
50
+ inputModalities?: string[] | undefined;
51
+ outputModalities?: string[] | undefined;
52
+ supportedParameters?: string[] | undefined;
53
+ supportedGenerationMethods?: string[] | undefined;
54
+ }[];
55
+ credentialEnv?: string | undefined;
56
+ catalogBaseUrl?: string | undefined;
57
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none" | undefined;
58
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none" | undefined;
59
+ catalogCredentialEnv?: string | undefined;
60
+ catalogAccountId?: string | undefined;
61
+ };
62
+ /** Resolve an alias only for the preset's exact credential reference and origin. */
63
+ export declare function providerCredential(provider: ProviderInput, env?: NodeJS.ProcessEnv): string | undefined;
64
+ export {};
@@ -0,0 +1,20 @@
1
+ import { SwitcherClient } from "./sdk";
2
+ import type { CatalogCredentialResolver } from "./catalog";
3
+ export declare function switcherHome(env?: NodeJS.ProcessEnv): string;
4
+ export declare function privateDirectory(path: string): Promise<void>;
5
+ /** Data access always uses HTTP, including the per-command owned local service. */
6
+ export declare function openCliRuntime(env?: NodeJS.ProcessEnv, resolveCredential?: CatalogCredentialResolver): Promise<{
7
+ client: SwitcherClient;
8
+ mode: "remote";
9
+ providerEnv: {
10
+ [k: string]: string | undefined;
11
+ };
12
+ close: () => Promise<void>;
13
+ } | {
14
+ client: SwitcherClient;
15
+ mode: "local";
16
+ providerEnv: {
17
+ [k: string]: string | undefined;
18
+ };
19
+ close: () => Promise<void>;
20
+ }>;
package/dist/sdk.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { components } from "./generated/api";
2
+ export { providerFromPreset } from "./presets";
3
+ export type ProviderPreset = components["schemas"]["ProviderPreset"];
2
4
  export type ProviderInput = components["schemas"]["ProviderInput"];
3
5
  export type Provider = components["schemas"]["Provider"];
4
6
  export type ProfileInput = components["schemas"]["ProfileInput"];
@@ -34,23 +36,63 @@ export declare class SwitcherClient {
34
36
  idempotencyKey?: string;
35
37
  }): Promise<T>;
36
38
  private query;
39
+ health(): Promise<{
40
+ status: "ok" | "degraded" | "unavailable";
41
+ version: string;
42
+ backend: "sqlite" | "postgresql";
43
+ }>;
44
+ ready(): Promise<{
45
+ ready: boolean;
46
+ reason?: string;
47
+ }>;
48
+ version(): Promise<{
49
+ version: string;
50
+ }>;
51
+ listProviderPresets(): Promise<{
52
+ data: ProviderPreset[];
53
+ }>;
54
+ getProviderPreset(id: string): Promise<{
55
+ id: string;
56
+ name: string;
57
+ credentialEnv?: string;
58
+ credentialAliases: string[];
59
+ protocols: {
60
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
61
+ baseUrl?: string;
62
+ authStyle: "bearer" | "x-api-key" | "api-key";
63
+ catalogBaseUrl?: string;
64
+ catalogFormat: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
65
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
66
+ modelsPath: string;
67
+ notes: string[];
68
+ }[];
69
+ sources: string[];
70
+ verification: "documented";
71
+ }>;
37
72
  listProviders(options?: {}): Promise<Page<{
38
73
  id: string;
39
74
  name: string;
40
75
  baseUrl: string;
41
- protocol: "anthropic-messages" | "openai-responses" | "openai-chat";
76
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
42
77
  credentialEnv?: string;
43
- authStyle: "bearer" | "x-api-key";
78
+ authStyle: "bearer" | "x-api-key" | "api-key";
79
+ catalogBaseUrl?: string;
80
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
81
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
82
+ catalogCredentialEnv?: string;
83
+ catalogAccountId?: string;
44
84
  modelsPath: string;
45
85
  manualModels: {
46
86
  id: string;
47
87
  name: string;
48
88
  description?: string;
89
+ available?: boolean;
49
90
  contextWindow?: number;
50
91
  maxOutputTokens?: number;
51
92
  inputModalities?: string[];
52
93
  outputModalities?: string[];
53
94
  supportedParameters?: string[];
95
+ supportedGenerationMethods?: string[];
54
96
  }[];
55
97
  version: number;
56
98
  updatedAt: string;
@@ -59,19 +101,26 @@ export declare class SwitcherClient {
59
101
  id: string;
60
102
  name: string;
61
103
  baseUrl: string;
62
- protocol: "anthropic-messages" | "openai-responses" | "openai-chat";
104
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
63
105
  credentialEnv?: string;
64
- authStyle: "bearer" | "x-api-key";
106
+ authStyle: "bearer" | "x-api-key" | "api-key";
107
+ catalogBaseUrl?: string;
108
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
109
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
110
+ catalogCredentialEnv?: string;
111
+ catalogAccountId?: string;
65
112
  modelsPath: string;
66
113
  manualModels: {
67
114
  id: string;
68
115
  name: string;
69
116
  description?: string;
117
+ available?: boolean;
70
118
  contextWindow?: number;
71
119
  maxOutputTokens?: number;
72
120
  inputModalities?: string[];
73
121
  outputModalities?: string[];
74
122
  supportedParameters?: string[];
123
+ supportedGenerationMethods?: string[];
75
124
  }[];
76
125
  version: number;
77
126
  updatedAt: string;
@@ -80,19 +129,26 @@ export declare class SwitcherClient {
80
129
  id: string;
81
130
  name: string;
82
131
  baseUrl: string;
83
- protocol: "anthropic-messages" | "openai-responses" | "openai-chat";
132
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
84
133
  credentialEnv?: string;
85
- authStyle: "bearer" | "x-api-key";
134
+ authStyle: "bearer" | "x-api-key" | "api-key";
135
+ catalogBaseUrl?: string;
136
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
137
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
138
+ catalogCredentialEnv?: string;
139
+ catalogAccountId?: string;
86
140
  modelsPath: string;
87
141
  manualModels: {
88
142
  id: string;
89
143
  name: string;
90
144
  description?: string;
145
+ available?: boolean;
91
146
  contextWindow?: number;
92
147
  maxOutputTokens?: number;
93
148
  inputModalities?: string[];
94
149
  outputModalities?: string[];
95
150
  supportedParameters?: string[];
151
+ supportedGenerationMethods?: string[];
96
152
  }[];
97
153
  version: number;
98
154
  updatedAt: string;
@@ -101,19 +157,26 @@ export declare class SwitcherClient {
101
157
  id: string;
102
158
  name: string;
103
159
  baseUrl: string;
104
- protocol: "anthropic-messages" | "openai-responses" | "openai-chat";
160
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
105
161
  credentialEnv?: string;
106
- authStyle: "bearer" | "x-api-key";
162
+ authStyle: "bearer" | "x-api-key" | "api-key";
163
+ catalogBaseUrl?: string;
164
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
165
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
166
+ catalogCredentialEnv?: string;
167
+ catalogAccountId?: string;
107
168
  modelsPath: string;
108
169
  manualModels: {
109
170
  id: string;
110
171
  name: string;
111
172
  description?: string;
173
+ available?: boolean;
112
174
  contextWindow?: number;
113
175
  maxOutputTokens?: number;
114
176
  inputModalities?: string[];
115
177
  outputModalities?: string[];
116
178
  supportedParameters?: string[];
179
+ supportedGenerationMethods?: string[];
117
180
  }[];
118
181
  version: number;
119
182
  updatedAt: string;
@@ -126,11 +189,13 @@ export declare class SwitcherClient {
126
189
  id: string;
127
190
  name: string;
128
191
  description?: string;
192
+ available?: boolean;
129
193
  contextWindow?: number;
130
194
  maxOutputTokens?: number;
131
195
  inputModalities?: string[];
132
196
  outputModalities?: string[];
133
197
  supportedParameters?: string[];
198
+ supportedGenerationMethods?: string[];
134
199
  }[];
135
200
  refreshedAt: string;
136
201
  source: "remote" | "manual";
@@ -140,11 +205,13 @@ export declare class SwitcherClient {
140
205
  id: string;
141
206
  name: string;
142
207
  description?: string;
208
+ available?: boolean;
143
209
  contextWindow?: number;
144
210
  maxOutputTokens?: number;
145
211
  inputModalities?: string[];
146
212
  outputModalities?: string[];
147
213
  supportedParameters?: string[];
214
+ supportedGenerationMethods?: string[];
148
215
  codingEligible: boolean;
149
216
  }[];
150
217
  total: number;
@@ -157,7 +224,7 @@ export declare class SwitcherClient {
157
224
  id: string;
158
225
  name: string;
159
226
  providerId: string;
160
- harness: "claude" | "codex" | "grok" | "opencode2";
227
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
161
228
  model: string;
162
229
  version: number;
163
230
  updatedAt: string;
@@ -166,7 +233,7 @@ export declare class SwitcherClient {
166
233
  id: string;
167
234
  name: string;
168
235
  providerId: string;
169
- harness: "claude" | "codex" | "grok" | "opencode2";
236
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
170
237
  model: string;
171
238
  version: number;
172
239
  updatedAt: string;
@@ -175,7 +242,7 @@ export declare class SwitcherClient {
175
242
  id: string;
176
243
  name: string;
177
244
  providerId: string;
178
- harness: "claude" | "codex" | "grok" | "opencode2";
245
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
179
246
  model: string;
180
247
  version: number;
181
248
  updatedAt: string;
@@ -184,7 +251,7 @@ export declare class SwitcherClient {
184
251
  id: string;
185
252
  name: string;
186
253
  providerId: string;
187
- harness: "claude" | "codex" | "grok" | "opencode2";
254
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
188
255
  model: string;
189
256
  version: number;
190
257
  updatedAt: string;
@@ -197,19 +264,26 @@ export declare class SwitcherClient {
197
264
  id: string;
198
265
  name: string;
199
266
  baseUrl: string;
200
- protocol: "anthropic-messages" | "openai-responses" | "openai-chat";
267
+ protocol: "anthropic-messages" | "openai-responses" | "openai-chat" | "gemini-generate-content";
201
268
  credentialEnv?: string;
202
- authStyle: "bearer" | "x-api-key";
269
+ authStyle: "bearer" | "x-api-key" | "api-key";
270
+ catalogBaseUrl?: string;
271
+ catalogFormat?: "openai" | "ollama" | "mistral" | "together" | "fireworks" | "dashscope" | "gemini" | "none";
272
+ catalogAuthStyle?: "bearer" | "x-api-key" | "api-key" | "none";
273
+ catalogCredentialEnv?: string;
274
+ catalogAccountId?: string;
203
275
  modelsPath: string;
204
276
  manualModels: {
205
277
  id: string;
206
278
  name: string;
207
279
  description?: string;
280
+ available?: boolean;
208
281
  contextWindow?: number;
209
282
  maxOutputTokens?: number;
210
283
  inputModalities?: string[];
211
284
  outputModalities?: string[];
212
285
  supportedParameters?: string[];
286
+ supportedGenerationMethods?: string[];
213
287
  }[];
214
288
  version: number;
215
289
  updatedAt: string;
@@ -218,7 +292,7 @@ export declare class SwitcherClient {
218
292
  id: string;
219
293
  name: string;
220
294
  providerId: string;
221
- harness: "claude" | "codex" | "grok" | "opencode2";
295
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
222
296
  model: string;
223
297
  version: number;
224
298
  updatedAt: string;
@@ -228,11 +302,13 @@ export declare class SwitcherClient {
228
302
  id: string;
229
303
  name: string;
230
304
  description?: string;
305
+ available?: boolean;
231
306
  contextWindow?: number;
232
307
  maxOutputTokens?: number;
233
308
  inputModalities?: string[];
234
309
  outputModalities?: string[];
235
310
  supportedParameters?: string[];
311
+ supportedGenerationMethods?: string[];
236
312
  }[];
237
313
  refreshedAt: string;
238
314
  source: "remote" | "manual";
@@ -242,7 +318,7 @@ export declare class SwitcherClient {
242
318
  }>;
243
319
  listRuns(options?: {}): Promise<Page<{
244
320
  profileId: string;
245
- harness: "claude" | "codex" | "grok" | "opencode2";
321
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
246
322
  model: string;
247
323
  planToken: string;
248
324
  version: number;
@@ -258,7 +334,7 @@ export declare class SwitcherClient {
258
334
  }>>;
259
335
  getRun(id: string): Promise<{
260
336
  profileId: string;
261
- harness: "claude" | "codex" | "grok" | "opencode2";
337
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
262
338
  model: string;
263
339
  planToken: string;
264
340
  version: number;
@@ -274,7 +350,7 @@ export declare class SwitcherClient {
274
350
  }>;
275
351
  createRun(input: components["schemas"]["RunInput"], idempotencyKey?: string): Promise<{
276
352
  profileId: string;
277
- harness: "claude" | "codex" | "grok" | "opencode2";
353
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
278
354
  model: string;
279
355
  planToken: string;
280
356
  version: number;
@@ -293,7 +369,7 @@ export declare class SwitcherClient {
293
369
  exitCode: number;
294
370
  }, idempotencyKey?: string): Promise<{
295
371
  profileId: string;
296
- harness: "claude" | "codex" | "grok" | "opencode2";
372
+ harness: "claude" | "codex" | "grok" | "opencode" | "opencode2" | "pi" | "omp" | "dsh" | "cline" | "hermes" | "prime-agent" | "gemini" | "aider" | "kilo";
297
373
  model: string;
298
374
  planToken: string;
299
375
  version: number;