@idcloudhost/ai-connect 0.1.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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +287 -0
  3. package/dist/adapters/aider.d.ts +11 -0
  4. package/dist/adapters/aider.d.ts.map +1 -0
  5. package/dist/adapters/aider.js +69 -0
  6. package/dist/adapters/aider.js.map +1 -0
  7. package/dist/adapters/claude-code.d.ts +17 -0
  8. package/dist/adapters/claude-code.d.ts.map +1 -0
  9. package/dist/adapters/claude-code.js +73 -0
  10. package/dist/adapters/claude-code.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +11 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +71 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/continue.d.ts +7 -0
  16. package/dist/adapters/continue.d.ts.map +1 -0
  17. package/dist/adapters/continue.js +79 -0
  18. package/dist/adapters/continue.js.map +1 -0
  19. package/dist/adapters/crush.d.ts +4 -0
  20. package/dist/adapters/crush.d.ts.map +1 -0
  21. package/dist/adapters/crush.js +72 -0
  22. package/dist/adapters/crush.js.map +1 -0
  23. package/dist/adapters/goose.d.ts +11 -0
  24. package/dist/adapters/goose.d.ts.map +1 -0
  25. package/dist/adapters/goose.js +68 -0
  26. package/dist/adapters/goose.js.map +1 -0
  27. package/dist/adapters/helpers.d.ts +33 -0
  28. package/dist/adapters/helpers.d.ts.map +1 -0
  29. package/dist/adapters/helpers.js +117 -0
  30. package/dist/adapters/helpers.js.map +1 -0
  31. package/dist/adapters/hermes.d.ts +11 -0
  32. package/dist/adapters/hermes.d.ts.map +1 -0
  33. package/dist/adapters/hermes.js +100 -0
  34. package/dist/adapters/hermes.js.map +1 -0
  35. package/dist/adapters/index.d.ts +20 -0
  36. package/dist/adapters/index.d.ts.map +1 -0
  37. package/dist/adapters/index.js +60 -0
  38. package/dist/adapters/index.js.map +1 -0
  39. package/dist/adapters/manual.d.ts +6 -0
  40. package/dist/adapters/manual.d.ts.map +1 -0
  41. package/dist/adapters/manual.js +87 -0
  42. package/dist/adapters/manual.js.map +1 -0
  43. package/dist/adapters/omp.d.ts +8 -0
  44. package/dist/adapters/omp.d.ts.map +1 -0
  45. package/dist/adapters/omp.js +64 -0
  46. package/dist/adapters/omp.js.map +1 -0
  47. package/dist/adapters/openclaw.d.ts +10 -0
  48. package/dist/adapters/openclaw.d.ts.map +1 -0
  49. package/dist/adapters/openclaw.js +107 -0
  50. package/dist/adapters/openclaw.js.map +1 -0
  51. package/dist/adapters/opencode.d.ts +11 -0
  52. package/dist/adapters/opencode.d.ts.map +1 -0
  53. package/dist/adapters/opencode.js +86 -0
  54. package/dist/adapters/opencode.js.map +1 -0
  55. package/dist/adapters/pi-family.d.ts +14 -0
  56. package/dist/adapters/pi-family.d.ts.map +1 -0
  57. package/dist/adapters/pi-family.js +27 -0
  58. package/dist/adapters/pi-family.js.map +1 -0
  59. package/dist/adapters/pi.d.ts +8 -0
  60. package/dist/adapters/pi.d.ts.map +1 -0
  61. package/dist/adapters/pi.js +56 -0
  62. package/dist/adapters/pi.js.map +1 -0
  63. package/dist/adapters/shell-env.d.ts +12 -0
  64. package/dist/adapters/shell-env.d.ts.map +1 -0
  65. package/dist/adapters/shell-env.js +81 -0
  66. package/dist/adapters/shell-env.js.map +1 -0
  67. package/dist/adapters/zed.d.ts +10 -0
  68. package/dist/adapters/zed.d.ts.map +1 -0
  69. package/dist/adapters/zed.js +91 -0
  70. package/dist/adapters/zed.js.map +1 -0
  71. package/dist/cli.d.ts +3 -0
  72. package/dist/cli.d.ts.map +1 -0
  73. package/dist/cli.js +207 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/commands/connect.d.ts +3 -0
  76. package/dist/commands/connect.d.ts.map +1 -0
  77. package/dist/commands/connect.js +179 -0
  78. package/dist/commands/connect.js.map +1 -0
  79. package/dist/commands/context.d.ts +21 -0
  80. package/dist/commands/context.d.ts.map +1 -0
  81. package/dist/commands/context.js +4 -0
  82. package/dist/commands/context.js.map +1 -0
  83. package/dist/commands/doctor.d.ts +11 -0
  84. package/dist/commands/doctor.d.ts.map +1 -0
  85. package/dist/commands/doctor.js +85 -0
  86. package/dist/commands/doctor.js.map +1 -0
  87. package/dist/commands/env.d.ts +7 -0
  88. package/dist/commands/env.d.ts.map +1 -0
  89. package/dist/commands/env.js +37 -0
  90. package/dist/commands/env.js.map +1 -0
  91. package/dist/commands/list.d.ts +3 -0
  92. package/dist/commands/list.d.ts.map +1 -0
  93. package/dist/commands/list.js +39 -0
  94. package/dist/commands/list.js.map +1 -0
  95. package/dist/commands/login.d.ts +7 -0
  96. package/dist/commands/login.d.ts.map +1 -0
  97. package/dist/commands/login.js +130 -0
  98. package/dist/commands/login.js.map +1 -0
  99. package/dist/commands/models.d.ts +9 -0
  100. package/dist/commands/models.d.ts.map +1 -0
  101. package/dist/commands/models.js +51 -0
  102. package/dist/commands/models.js.map +1 -0
  103. package/dist/commands/remove.d.ts +3 -0
  104. package/dist/commands/remove.d.ts.map +1 -0
  105. package/dist/commands/remove.js +43 -0
  106. package/dist/commands/remove.js.map +1 -0
  107. package/dist/commands/snippet.d.ts +7 -0
  108. package/dist/commands/snippet.d.ts.map +1 -0
  109. package/dist/commands/snippet.js +91 -0
  110. package/dist/commands/snippet.js.map +1 -0
  111. package/dist/core/detect.d.ts +12 -0
  112. package/dist/core/detect.d.ts.map +1 -0
  113. package/dist/core/detect.js +59 -0
  114. package/dist/core/detect.js.map +1 -0
  115. package/dist/core/discovery.d.ts +46 -0
  116. package/dist/core/discovery.d.ts.map +1 -0
  117. package/dist/core/discovery.js +124 -0
  118. package/dist/core/discovery.js.map +1 -0
  119. package/dist/core/gateway.d.ts +59 -0
  120. package/dist/core/gateway.d.ts.map +1 -0
  121. package/dist/core/gateway.js +385 -0
  122. package/dist/core/gateway.js.map +1 -0
  123. package/dist/core/http.d.ts +18 -0
  124. package/dist/core/http.d.ts.map +1 -0
  125. package/dist/core/http.js +73 -0
  126. package/dist/core/http.js.map +1 -0
  127. package/dist/core/management.d.ts +47 -0
  128. package/dist/core/management.d.ts.map +1 -0
  129. package/dist/core/management.js +88 -0
  130. package/dist/core/management.js.map +1 -0
  131. package/dist/core/store.d.ts +25 -0
  132. package/dist/core/store.d.ts.map +1 -0
  133. package/dist/core/store.js +48 -0
  134. package/dist/core/store.js.map +1 -0
  135. package/dist/fsutil/edit.d.ts +18 -0
  136. package/dist/fsutil/edit.d.ts.map +1 -0
  137. package/dist/fsutil/edit.js +102 -0
  138. package/dist/fsutil/edit.js.map +1 -0
  139. package/dist/fsutil/formats.d.ts +32 -0
  140. package/dist/fsutil/formats.d.ts.map +1 -0
  141. package/dist/fsutil/formats.js +154 -0
  142. package/dist/fsutil/formats.js.map +1 -0
  143. package/dist/index.d.ts +23 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +8 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/types.d.ts +134 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +3 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/ui.d.ts +20 -0
  152. package/dist/ui.d.ts.map +1 -0
  153. package/dist/ui.js +69 -0
  154. package/dist/ui.js.map +1 -0
  155. package/package.json +75 -0
@@ -0,0 +1,79 @@
1
+ import { readIfExists, shortenHome, writeFileSafely } from '../fsutil/edit.js';
2
+ import { editYaml, parseYaml } from '../fsutil/formats.js';
3
+ import { detectByBinOrConfig } from '../core/detect.js';
4
+ import { envVarsFor, home, modelsToWrite, result, secretValue } from './helpers.js';
5
+ function userConfig() {
6
+ return home('.continue', 'config.yaml');
7
+ }
8
+ /**
9
+ * Continue (VS Code / JetBrains). `models` is a list, not a map, so we replace
10
+ * entries whose `provider` is ours and keep everything else the user added.
11
+ */
12
+ export const continueAdapter = {
13
+ id: 'continue',
14
+ name: 'Continue',
15
+ summary: 'IDE assistant for VS Code and JetBrains. Models live in ~/.continue/config.yaml.',
16
+ docsUrl: 'https://docs.continue.dev/reference',
17
+ bins: ['cn', 'continue'],
18
+ mode: 'auto',
19
+ secretModes: ['inline', 'env'],
20
+ async detect() {
21
+ return detectByBinOrConfig(['cn'], [userConfig(), home('.continue')]);
22
+ },
23
+ configPath({ configPathOverride }) {
24
+ return configPathOverride ?? userConfig();
25
+ },
26
+ async apply(opts) {
27
+ const file = this.configPath(opts);
28
+ const before = await readIfExists(file);
29
+ const existingDoc = parseYaml(before);
30
+ const { target } = opts;
31
+ const tag = `idch:${target.providerId}`;
32
+ const existing = Array.isArray(existingDoc.models) ? existingDoc.models : [];
33
+ const kept = existing.filter((m) => m && m.apiBase !== target.apiBase && !String(m.name ?? '').startsWith(tag));
34
+ const ours = modelsToWrite(target).map((m) => ({
35
+ name: `${tag} ${m.label}`,
36
+ provider: 'openai',
37
+ model: m.id,
38
+ apiBase: target.apiBase,
39
+ apiKey: secretValue(opts, 'raw'),
40
+ roles: ['chat', 'edit', 'apply'],
41
+ }));
42
+ const after = editYaml(before, (doc) => {
43
+ if (existingDoc.name === undefined)
44
+ doc.setIn(['name'], 'Local Assistant');
45
+ if (existingDoc.version === undefined)
46
+ doc.setIn(['version'], '1.0.0');
47
+ if (existingDoc.schema === undefined)
48
+ doc.setIn(['schema'], 'v1');
49
+ doc.setIn(['models'], doc.createNode([...kept, ...ours]));
50
+ });
51
+ const change = await writeFileSafely(file, after, { dryRun: opts.dryRun });
52
+ return result(this.id, [change], {
53
+ envVars: envVarsFor(opts),
54
+ notes: [
55
+ 'Reload the Continue extension window, then pick the model in the chat model dropdown.',
56
+ `Entries are named "${tag} …" so re-running connect replaces exactly those and leaves your other models alone.`,
57
+ ],
58
+ });
59
+ },
60
+ async remove(opts) {
61
+ const file = this.configPath(opts);
62
+ const before = await readIfExists(file);
63
+ if (before === null)
64
+ return result(this.id, []);
65
+ const tag = `idch:${opts.providerId}`;
66
+ const existing = parseYaml(before).models;
67
+ if (!Array.isArray(existing))
68
+ return result(this.id, []);
69
+ const kept = existing.filter((m) => !String(m?.name ?? '').startsWith(tag));
70
+ if (kept.length === existing.length)
71
+ return result(this.id, []);
72
+ const after = editYaml(before, (doc) => {
73
+ doc.setIn(['models'], doc.createNode(kept));
74
+ });
75
+ const change = await writeFileSafely(file, after, { dryRun: opts.dryRun });
76
+ return result(this.id, [change], { notes: [`Removed "${tag} …" models from ${shortenHome(file)}.`] });
77
+ },
78
+ };
79
+ //# sourceMappingURL=continue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.js","sourceRoot":"","sources":["../../src/adapters/continue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Adapter } from '../types.js';
2
+ /** Crush (Charmbracelet). Custom providers use type "openai-compat". */
3
+ export declare const crushAdapter: Adapter;
4
+ //# sourceMappingURL=crush.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crush.d.ts","sourceRoot":"","sources":["../../src/adapters/crush.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,aAAa,CAAC;AAetE,wEAAwE;AACxE,eAAO,MAAM,YAAY,EAAE,OA4D1B,CAAC"}
@@ -0,0 +1,72 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ import { readIfExists, shortenHome, writeFileSafely } from '../fsutil/edit.js';
4
+ import { parseJson, stringifyJson } from '../fsutil/formats.js';
5
+ import { detectByBinOrConfig } from '../core/detect.js';
6
+ import { ctx, deleteIn, envVarsFor, home, maxOut, modelsToWrite, result, secretValue, setIn, xdgConfigHome } from './helpers.js';
7
+ function userConfig() {
8
+ // Crush puts the global file under LocalAppData on Windows, XDG config elsewhere.
9
+ if (process.platform === 'win32') {
10
+ const local = process.env.LOCALAPPDATA ?? path.join(os.homedir(), 'AppData', 'Local');
11
+ return path.join(local, 'crush', 'crush.json');
12
+ }
13
+ return path.join(xdgConfigHome(), 'crush', 'crush.json');
14
+ }
15
+ /** Crush (Charmbracelet). Custom providers use type "openai-compat". */
16
+ export const crushAdapter = {
17
+ id: 'crush',
18
+ name: 'Crush',
19
+ summary: 'Charmbracelet coding agent. Providers live in crush.json.',
20
+ docsUrl: 'https://github.com/charmbracelet/crush#custom-providers',
21
+ bins: ['crush'],
22
+ mode: 'auto',
23
+ supportsProjectScope: true,
24
+ secretModes: ['env', 'inline'],
25
+ async detect() {
26
+ return detectByBinOrConfig(['crush'], [userConfig(), home('.config', 'crush', 'crush.json')]);
27
+ },
28
+ configPath({ scope, cwd, configPathOverride }) {
29
+ if (configPathOverride)
30
+ return configPathOverride;
31
+ return scope === 'project' ? path.join(cwd, 'crush.json') : userConfig();
32
+ },
33
+ async apply(opts) {
34
+ const file = this.configPath(opts);
35
+ const before = await readIfExists(file);
36
+ const doc = parseJson(before);
37
+ const { target } = opts;
38
+ doc.$schema ??= 'https://charm.land/crush.json';
39
+ setIn(doc, ['providers', target.providerId], {
40
+ id: target.providerId,
41
+ name: target.providerLabel,
42
+ base_url: target.apiBase,
43
+ type: 'openai-compat',
44
+ api_key: secretValue(opts, 'dollar'),
45
+ models: modelsToWrite(target).map((m) => ({
46
+ id: m.id,
47
+ name: m.label,
48
+ context_window: ctx(m),
49
+ default_max_tokens: maxOut(m),
50
+ price_input: m.inputUsdPer1M ?? 0,
51
+ price_output: m.outputUsdPer1M ?? 0,
52
+ })),
53
+ });
54
+ const change = await writeFileSafely(file, stringifyJson(doc, before), { dryRun: opts.dryRun });
55
+ return result(this.id, [change], {
56
+ envVars: envVarsFor(opts),
57
+ notes: ['Restart crush, then pick the model from the model switcher.'],
58
+ tryCommand: 'crush',
59
+ });
60
+ },
61
+ async remove(opts) {
62
+ const file = this.configPath(opts);
63
+ const before = await readIfExists(file);
64
+ if (before === null)
65
+ return result(this.id, []);
66
+ const doc = parseJson(before);
67
+ deleteIn(doc, ['providers', opts.providerId]);
68
+ const change = await writeFileSafely(file, stringifyJson(doc, before), { dryRun: opts.dryRun });
69
+ return result(this.id, [change], { notes: [`Removed provider "${opts.providerId}" from ${shortenHome(file)}.`] });
70
+ },
71
+ };
72
+ //# sourceMappingURL=crush.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crush.js","sourceRoot":"","sources":["../../src/adapters/crush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Adapter } from '../types.js';
2
+ /**
3
+ * Goose (Block) treats an OpenAI-compatible endpoint as the built-in `openai`
4
+ * provider pointed elsewhere: OPENAI_HOST carries the origin and OPENAI_BASE_PATH
5
+ * carries the route, so the two are configured separately rather than as one URL.
6
+ *
7
+ * Goose stores the key in the OS keyring, not in config.yaml, so this adapter is
8
+ * env-only and prints the export the user needs.
9
+ */
10
+ export declare const gooseAdapter: Adapter;
11
+ //# sourceMappingURL=goose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goose.d.ts","sourceRoot":"","sources":["../../src/adapters/goose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,aAAa,CAAC;AAUtE;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,OAqD1B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import path from 'node:path';
2
+ import { readIfExists, shortenHome, writeFileSafely } from '../fsutil/edit.js';
3
+ import { editYaml, editYamlPruned } from '../fsutil/formats.js';
4
+ import { detectByBinOrConfig } from '../core/detect.js';
5
+ import { result, xdgConfigHome } from './helpers.js';
6
+ function userConfig() {
7
+ return path.join(xdgConfigHome(), 'goose', 'config.yaml');
8
+ }
9
+ /**
10
+ * Goose (Block) treats an OpenAI-compatible endpoint as the built-in `openai`
11
+ * provider pointed elsewhere: OPENAI_HOST carries the origin and OPENAI_BASE_PATH
12
+ * carries the route, so the two are configured separately rather than as one URL.
13
+ *
14
+ * Goose stores the key in the OS keyring, not in config.yaml, so this adapter is
15
+ * env-only and prints the export the user needs.
16
+ */
17
+ export const gooseAdapter = {
18
+ id: 'goose',
19
+ name: 'Goose',
20
+ summary: "Block's open-source agent. Configured via ~/.config/goose/config.yaml.",
21
+ docsUrl: 'https://block.github.io/goose/docs/getting-started/providers/',
22
+ bins: ['goose'],
23
+ mode: 'auto',
24
+ secretModes: ['env'],
25
+ async detect() {
26
+ return detectByBinOrConfig(['goose'], [userConfig()]);
27
+ },
28
+ configPath({ configPathOverride }) {
29
+ return configPathOverride ?? userConfig();
30
+ },
31
+ async apply(opts) {
32
+ const file = this.configPath(opts);
33
+ const before = await readIfExists(file);
34
+ const { target } = opts;
35
+ const basePath = `${target.basePath.replace(/^\/+/, '')}/chat/completions`.replace(/^\/+/, '');
36
+ const after = editYaml(before, (doc) => {
37
+ doc.setIn(['GOOSE_PROVIDER'], 'openai');
38
+ doc.setIn(['OPENAI_HOST'], target.origin);
39
+ doc.setIn(['OPENAI_BASE_PATH'], basePath);
40
+ if (target.defaultModel)
41
+ doc.setIn(['GOOSE_MODEL'], target.defaultModel);
42
+ });
43
+ const change = await writeFileSafely(file, after, { dryRun: opts.dryRun });
44
+ return result(this.id, [change], {
45
+ envVars: { OPENAI_API_KEY: target.apiKey },
46
+ notes: [
47
+ 'Goose keeps the key in your OS keyring. Either export OPENAI_API_KEY, or run `goose configure` and paste it when asked.',
48
+ `OPENAI_HOST is the origin and OPENAI_BASE_PATH is "${basePath}" — Goose joins them itself.`,
49
+ ],
50
+ tryCommand: 'goose session',
51
+ });
52
+ },
53
+ async remove(opts) {
54
+ const file = this.configPath(opts);
55
+ const before = await readIfExists(file);
56
+ if (before === null)
57
+ return result(this.id, []);
58
+ const after = editYamlPruned(before, (doc) => {
59
+ for (const key of ['OPENAI_HOST', 'OPENAI_BASE_PATH', 'GOOSE_MODEL'])
60
+ doc.deleteIn([key]);
61
+ });
62
+ const change = await writeFileSafely(file, after, { dryRun: opts.dryRun });
63
+ return result(this.id, [change], {
64
+ notes: [`Cleared the gateway keys from ${shortenHome(file)}. GOOSE_PROVIDER was left alone.`],
65
+ });
66
+ },
67
+ };
68
+ //# sourceMappingURL=goose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goose.js","sourceRoot":"","sources":["../../src/adapters/goose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { ApplyOptions, ApplyResult, ConnectionTarget, FileChange, GatewayModel } from '../types.js';
2
+ /** Env var every adapter uses when `--secret env` is chosen. */
3
+ export declare const KEY_ENV = "IDCH_AI_API_KEY";
4
+ export declare const BASE_ENV = "IDCH_AI_BASE_URL";
5
+ export declare function xdgConfigHome(): string;
6
+ export declare function home(...segments: string[]): string;
7
+ /** The literal an adapter should put in an `apiKey` field. */
8
+ export declare function secretValue(opts: ApplyOptions, style: 'raw' | 'dollar' | 'braced-env' | 'name'): string;
9
+ export declare function envVarsFor(opts: ApplyOptions): Record<string, string>;
10
+ /** Sensible fallbacks so adapters never write `undefined` into a required field. */
11
+ export declare const DEFAULT_CONTEXT = 128000;
12
+ export declare const DEFAULT_MAX_OUTPUT = 16384;
13
+ export declare function ctx(m: GatewayModel): number;
14
+ export declare function maxOut(m: GatewayModel): number;
15
+ export declare function costOf(m: GatewayModel): {
16
+ input: number;
17
+ output: number;
18
+ };
19
+ export declare function inputKinds(m: GatewayModel): string[];
20
+ /** Models to write, guarding against an empty registration that would confuse the agent. */
21
+ export declare function modelsToWrite(target: ConnectionTarget): GatewayModel[];
22
+ export declare function result(adapterId: string, changes: FileChange[], opts?: {
23
+ envVars?: Record<string, string>;
24
+ notes?: string[];
25
+ tryCommand?: string;
26
+ }): ApplyResult;
27
+ /** Deep-get with a string path, returning undefined instead of throwing. */
28
+ export declare function getIn(obj: unknown, keys: string[]): unknown;
29
+ /** Deep-set, creating plain objects along the way. */
30
+ export declare function setIn(obj: Record<string, unknown>, keys: string[], value: unknown): void;
31
+ /** Deep-delete, pruning empty parents we created. */
32
+ export declare function deleteIn(obj: Record<string, unknown>, keys: string[]): boolean;
33
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/adapters/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzG,gEAAgE;AAChE,eAAO,MAAM,OAAO,oBAAoB,CAAC;AACzC,eAAO,MAAM,QAAQ,qBAAqB,CAAC;AAE3C,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED,wBAAgB,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,GAAG,MAAM,CAYvG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAErE;AAED,oFAAoF;AACpF,eAAO,MAAM,eAAe,SAAU,CAAC;AACvC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,wBAAgB,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAE3C;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAI9C;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAEzE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAEpD;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAItE;AAED,wBAAgB,MAAM,CACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,UAAU,EAAE,EACrB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACrF,WAAW,CASb;AAED,4EAA4E;AAC5E,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAO3D;AAED,sDAAsD;AACtD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAQxF;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAmB9E"}
@@ -0,0 +1,117 @@
1
+ import path from 'node:path';
2
+ import os from 'node:os';
3
+ /** Env var every adapter uses when `--secret env` is chosen. */
4
+ export const KEY_ENV = 'IDCH_AI_API_KEY';
5
+ export const BASE_ENV = 'IDCH_AI_BASE_URL';
6
+ export function xdgConfigHome() {
7
+ const xdg = process.env.XDG_CONFIG_HOME;
8
+ if (xdg && xdg.trim())
9
+ return xdg;
10
+ if (process.platform === 'win32')
11
+ return process.env.APPDATA ?? path.join(os.homedir(), 'AppData', 'Roaming');
12
+ return path.join(os.homedir(), '.config');
13
+ }
14
+ export function home(...segments) {
15
+ return path.join(os.homedir(), ...segments);
16
+ }
17
+ /** The literal an adapter should put in an `apiKey` field. */
18
+ export function secretValue(opts, style) {
19
+ if (opts.secretMode === 'inline')
20
+ return opts.target.apiKey;
21
+ switch (style) {
22
+ case 'dollar':
23
+ return `$${KEY_ENV}`;
24
+ case 'braced-env':
25
+ return `{env:${KEY_ENV}}`;
26
+ case 'name':
27
+ return KEY_ENV;
28
+ case 'raw':
29
+ return `\${${KEY_ENV}}`;
30
+ }
31
+ }
32
+ export function envVarsFor(opts) {
33
+ return opts.secretMode === 'env' ? { [KEY_ENV]: opts.target.apiKey } : {};
34
+ }
35
+ /** Sensible fallbacks so adapters never write `undefined` into a required field. */
36
+ export const DEFAULT_CONTEXT = 128_000;
37
+ export const DEFAULT_MAX_OUTPUT = 16_384;
38
+ export function ctx(m) {
39
+ return m.contextWindow ?? DEFAULT_CONTEXT;
40
+ }
41
+ export function maxOut(m) {
42
+ const cap = m.maxOutputTokens ?? DEFAULT_MAX_OUTPUT;
43
+ // Never advertise more output than the context window can hold.
44
+ return Math.min(cap, ctx(m));
45
+ }
46
+ export function costOf(m) {
47
+ return { input: m.inputUsdPer1M ?? 0, output: m.outputUsdPer1M ?? 0 };
48
+ }
49
+ export function inputKinds(m) {
50
+ return m.supportsVision ? ['text', 'image'] : ['text'];
51
+ }
52
+ /** Models to write, guarding against an empty registration that would confuse the agent. */
53
+ export function modelsToWrite(target) {
54
+ if (target.models.length)
55
+ return target.models;
56
+ if (target.defaultModel)
57
+ return [{ id: target.defaultModel, label: target.defaultModel }];
58
+ return [];
59
+ }
60
+ export function result(adapterId, changes, opts = {}) {
61
+ const r = {
62
+ adapterId,
63
+ changes,
64
+ envVars: opts.envVars ?? {},
65
+ notes: opts.notes ?? [],
66
+ };
67
+ if (opts.tryCommand)
68
+ r.tryCommand = opts.tryCommand;
69
+ return r;
70
+ }
71
+ /** Deep-get with a string path, returning undefined instead of throwing. */
72
+ export function getIn(obj, keys) {
73
+ let cur = obj;
74
+ for (const k of keys) {
75
+ if (cur === null || typeof cur !== 'object')
76
+ return undefined;
77
+ cur = cur[k];
78
+ }
79
+ return cur;
80
+ }
81
+ /** Deep-set, creating plain objects along the way. */
82
+ export function setIn(obj, keys, value) {
83
+ let cur = obj;
84
+ for (const k of keys.slice(0, -1)) {
85
+ const next = cur[k];
86
+ if (next === null || typeof next !== 'object' || Array.isArray(next))
87
+ cur[k] = {};
88
+ cur = cur[k];
89
+ }
90
+ cur[keys[keys.length - 1]] = value;
91
+ }
92
+ /** Deep-delete, pruning empty parents we created. */
93
+ export function deleteIn(obj, keys) {
94
+ const parents = [obj];
95
+ let cur = obj;
96
+ for (const k of keys.slice(0, -1)) {
97
+ const next = cur[k];
98
+ if (next === null || typeof next !== 'object' || Array.isArray(next))
99
+ return false;
100
+ cur = next;
101
+ parents.push(cur);
102
+ }
103
+ const last = keys[keys.length - 1];
104
+ if (!(last in cur))
105
+ return false;
106
+ delete cur[last];
107
+ // Prune containers that only existed to hold our block.
108
+ for (let i = parents.length - 1; i > 0; i--) {
109
+ const node = parents[i];
110
+ if (Object.keys(node).length === 0)
111
+ delete parents[i - 1][keys[i - 1]];
112
+ else
113
+ break;
114
+ }
115
+ return true;
116
+ }
117
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/adapters/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Adapter } from '../types.js';
2
+ /**
3
+ * Hermes Agent (Nous Research) keeps one `model` block in ~/.hermes/config.yaml.
4
+ *
5
+ * Unlike the pi-family agents it holds a single active model rather than a
6
+ * provider catalogue, so we set the default and list the rest in the notes.
7
+ * Secrets go to ~/.hermes/.env when `--secret env` is used, which is where
8
+ * Hermes itself prefers to read them from.
9
+ */
10
+ export declare const hermesAdapter: Adapter;
11
+ //# sourceMappingURL=hermes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,aAAa,CAAC;AAetE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,OA6F3B,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { readIfExists, shortenHome, writeFileSafely } from '../fsutil/edit.js';
2
+ import { editYaml, editYamlPruned, parseYaml, upsertEnvFile, removeEnvKeys } from '../fsutil/formats.js';
3
+ import { detectByBinOrConfig } from '../core/detect.js';
4
+ import { KEY_ENV, home, result } from './helpers.js';
5
+ function userConfig() {
6
+ return home('.hermes', 'config.yaml');
7
+ }
8
+ function envFile() {
9
+ return home('.hermes', '.env');
10
+ }
11
+ /**
12
+ * Hermes Agent (Nous Research) keeps one `model` block in ~/.hermes/config.yaml.
13
+ *
14
+ * Unlike the pi-family agents it holds a single active model rather than a
15
+ * provider catalogue, so we set the default and list the rest in the notes.
16
+ * Secrets go to ~/.hermes/.env when `--secret env` is used, which is where
17
+ * Hermes itself prefers to read them from.
18
+ */
19
+ export const hermesAdapter = {
20
+ id: 'hermes',
21
+ name: 'Hermes Agent',
22
+ summary: 'Autonomous agent by Nous Research. Single model block in ~/.hermes/config.yaml.',
23
+ docsUrl: 'https://github.com/NousResearch/hermes-agent',
24
+ bins: ['hermes'],
25
+ mode: 'auto',
26
+ secretModes: ['inline', 'env'],
27
+ async detect() {
28
+ return detectByBinOrConfig(['hermes'], [userConfig(), home('.hermes')]);
29
+ },
30
+ configPath({ configPathOverride }) {
31
+ return configPathOverride ?? userConfig();
32
+ },
33
+ async apply(opts) {
34
+ const file = this.configPath(opts);
35
+ const before = await readIfExists(file);
36
+ const { target } = opts;
37
+ const model = target.defaultModel ?? target.models[0]?.id;
38
+ if (!model) {
39
+ throw new Error('Hermes needs one model to activate. Pass --model, or let the gateway list its catalogue.');
40
+ }
41
+ const after = editYaml(before, (doc) => {
42
+ doc.setIn(['model', 'provider'], 'custom');
43
+ doc.setIn(['model', 'base_url'], target.apiBase);
44
+ doc.setIn(['model', 'default'], model);
45
+ if (opts.secretMode === 'inline')
46
+ doc.setIn(['model', 'api_key'], target.apiKey);
47
+ else
48
+ doc.deleteIn(['model', 'api_key']);
49
+ });
50
+ const changes = [await writeFileSafely(file, after, { dryRun: opts.dryRun })];
51
+ if (opts.secretMode === 'env') {
52
+ const envPath = envFile();
53
+ const envBefore = await readIfExists(envPath);
54
+ changes.push(await writeFileSafely(envPath, upsertEnvFile(envBefore, { [KEY_ENV]: target.apiKey, HERMES_API_KEY: target.apiKey }), {
55
+ dryRun: opts.dryRun,
56
+ }));
57
+ }
58
+ const others = target.models.filter((m) => m.id !== model).map((m) => m.id);
59
+ return result(this.id, changes, {
60
+ notes: [
61
+ `Active model set to ${model}.`,
62
+ others.length
63
+ ? `Switch later with: hermes config set model.default <id> (also available: ${others.slice(0, 8).join(', ')}${others.length > 8 ? ', …' : ''})`
64
+ : 'Switch later with: hermes config set model.default <id>',
65
+ 'Verify with: hermes config show',
66
+ 'Hermes holds one active model at a time, so re-running connect replaces it rather than adding to a list.',
67
+ ],
68
+ tryCommand: 'hermes',
69
+ });
70
+ },
71
+ async remove(opts) {
72
+ const file = this.configPath(opts);
73
+ const before = await readIfExists(file);
74
+ const changes = [];
75
+ if (before !== null) {
76
+ const model = parseYaml(before).model;
77
+ // Only touch the block if it is still the one we wrote — a user who has since
78
+ // pointed Hermes somewhere else should keep their settings.
79
+ if (model?.provider === 'custom' && typeof model.base_url === 'string') {
80
+ const after = editYamlPruned(before, (doc) => {
81
+ for (const key of ['provider', 'base_url', 'api_key', 'default'])
82
+ doc.deleteIn(['model', key]);
83
+ });
84
+ changes.push(await writeFileSafely(file, after, { dryRun: opts.dryRun }));
85
+ }
86
+ }
87
+ const envPath = envFile();
88
+ const envBefore = await readIfExists(envPath);
89
+ if (envBefore !== null) {
90
+ changes.push(await writeFileSafely(envPath, removeEnvKeys(envBefore, [KEY_ENV, 'HERMES_API_KEY']), { dryRun: opts.dryRun }));
91
+ }
92
+ return result(this.id, changes, {
93
+ notes: [
94
+ `Cleared the custom model block from ${shortenHome(file)}, including model.default.`,
95
+ 'Re-run `hermes setup` to pick a different provider, or restore the backup listed above.',
96
+ ],
97
+ });
98
+ },
99
+ };
100
+ //# sourceMappingURL=hermes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes.js","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Adapter } from '../types.js';
2
+ import { opencodeAdapter } from './opencode.js';
3
+ import { piAdapter } from './pi.js';
4
+ import { ompAdapter } from './omp.js';
5
+ import { hermesAdapter } from './hermes.js';
6
+ import { openclawAdapter } from './openclaw.js';
7
+ import { codexAdapter } from './codex.js';
8
+ import { claudeCodeAdapter } from './claude-code.js';
9
+ import { gooseAdapter } from './goose.js';
10
+ import { crushAdapter } from './crush.js';
11
+ import { continueAdapter } from './continue.js';
12
+ import { aiderAdapter } from './aider.js';
13
+ import { zedAdapter } from './zed.js';
14
+ import { shellEnvAdapter } from './shell-env.js';
15
+ /** Every adapter, in the order `idch-ai list` shows them. */
16
+ export declare const adapters: Adapter[];
17
+ export declare function getAdapter(id: string): Adapter | undefined;
18
+ export declare function adapterIds(): string[];
19
+ export { opencodeAdapter, piAdapter, ompAdapter, hermesAdapter, openclawAdapter, codexAdapter, claudeCodeAdapter, gooseAdapter, crushAdapter, continueAdapter, aiderAdapter, zedAdapter, shellEnvAdapter, };
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,6DAA6D;AAC7D,eAAO,MAAM,QAAQ,EAAE,OAAO,EAe7B,CAAC;AAwBF,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAG1D;AAED,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,OAAO,EACL,eAAe,EACf,SAAS,EACT,UAAU,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,UAAU,EACV,eAAe,GAChB,CAAC"}