@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,91 @@
1
+ import { buildTarget, resolveSource } from '../core/discovery.js';
2
+ import { c, ui } from '../ui.js';
3
+ const LANGS = ['curl', 'node', 'python', 'vercel-ai', 'langchain'];
4
+ /** Copy-pasteable starter code for people wiring the gateway into their own app. */
5
+ export async function snippetCommand(langArg, flags) {
6
+ const lang = (langArg ?? 'curl').toLowerCase();
7
+ if (!LANGS.includes(lang))
8
+ throw new Error(`unknown snippet "${lang}". One of: ${LANGS.join(', ')}`);
9
+ const source = await resolveSource(flags);
10
+ const target = await buildTarget(source, { ...flags, offline: true });
11
+ const model = target.defaultModel ?? 'MODEL_ID';
12
+ const base = target.apiBase;
13
+ const body = build(lang, base, model);
14
+ if (flags.json) {
15
+ ui.plain(JSON.stringify({ lang, apiBase: base, model, snippet: body }, null, 2));
16
+ return 0;
17
+ }
18
+ ui.plain(body);
19
+ ui.plain();
20
+ ui.info(`The key is read from $OPENAI_API_KEY — run \`eval "$(idch-ai env)"\` first, or paste it in.`);
21
+ if (!target.defaultModel)
22
+ ui.info(`Replace MODEL_ID with one from ${c.bold('idch-ai models')}.`);
23
+ return 0;
24
+ }
25
+ function build(lang, base, model) {
26
+ switch (lang) {
27
+ case 'curl':
28
+ return `curl ${base}/chat/completions \\
29
+ -H "Content-Type: application/json" \\
30
+ -H "Authorization: Bearer $OPENAI_API_KEY" \\
31
+ -d '{
32
+ "model": "${model}",
33
+ "messages": [{ "role": "user", "content": "Hello!" }]
34
+ }'`;
35
+ case 'node':
36
+ return `import OpenAI from "openai";
37
+
38
+ const client = new OpenAI({
39
+ apiKey: process.env.OPENAI_API_KEY,
40
+ baseURL: "${base}",
41
+ });
42
+
43
+ const res = await client.chat.completions.create({
44
+ model: "${model}",
45
+ messages: [{ role: "user", content: "Hello!" }],
46
+ });
47
+
48
+ console.log(res.choices[0].message.content);`;
49
+ case 'python':
50
+ return `from openai import OpenAI
51
+
52
+ client = OpenAI(
53
+ api_key=os.environ["OPENAI_API_KEY"],
54
+ base_url="${base}",
55
+ )
56
+
57
+ res = client.chat.completions.create(
58
+ model="${model}",
59
+ messages=[{"role": "user", "content": "Hello!"}],
60
+ )
61
+
62
+ print(res.choices[0].message.content)`;
63
+ case 'vercel-ai':
64
+ return `import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
65
+ import { generateText } from "ai";
66
+
67
+ const idch = createOpenAICompatible({
68
+ name: "idcloudhost",
69
+ baseURL: "${base}",
70
+ apiKey: process.env.OPENAI_API_KEY,
71
+ });
72
+
73
+ const { text } = await generateText({
74
+ model: idch("${model}"),
75
+ prompt: "Hello!",
76
+ });
77
+
78
+ console.log(text);`;
79
+ case 'langchain':
80
+ return `from langchain_openai import ChatOpenAI
81
+
82
+ llm = ChatOpenAI(
83
+ model="${model}",
84
+ base_url="${base}",
85
+ api_key=os.environ["OPENAI_API_KEY"],
86
+ )
87
+
88
+ print(llm.invoke("Hello!").content)`;
89
+ }
90
+ }
91
+ //# sourceMappingURL=snippet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snippet.js","sourceRoot":"","sources":["../../src/commands/snippet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAGjC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAG5E,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B,EAAE,KAAkB;IAClF,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,WAAW,EAAiB,CAAC;IAC9D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAErG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,IAAI,UAAU,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAE5B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACf,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,EAAE,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;IACvG,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACjG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,KAAK,CAAC,IAAiB,EAAE,IAAY,EAAE,KAAa;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,QAAQ,IAAI;;;;gBAIT,KAAK;;KAEhB,CAAC;QAEF,KAAK,MAAM;YACT,OAAO;;;;cAIC,IAAI;;;;YAIN,KAAK;;;;6CAI4B,CAAC;QAE1C,KAAK,QAAQ;YACX,OAAO;;;;gBAIG,IAAI;;;;aAIP,KAAK;;;;sCAIoB,CAAC;QAEnC,KAAK,WAAW;YACd,OAAO;;;;;cAKC,IAAI;;;;;iBAKD,KAAK;;;;mBAIH,CAAC;QAEhB,KAAK,WAAW;YACd,OAAO;;;aAGA,KAAK;gBACF,IAAI;;;;oCAIgB,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DetectResult } from '../types.js';
2
+ /** Locate an executable on PATH without shelling out to `which`. */
3
+ export declare function whichBin(name: string): Promise<string | null>;
4
+ /** Best-effort `<bin> --version`. Never throws; agents that hang are given 3s. */
5
+ export declare function binVersion(bin: string, args?: string[]): Promise<string | undefined>;
6
+ /**
7
+ * An agent counts as installed when its binary is on PATH *or* it has already
8
+ * left a config behind — a user may have it installed via an IDE extension or a
9
+ * shell alias we cannot see.
10
+ */
11
+ export declare function detectByBinOrConfig(bins: string[], configPaths: string[]): Promise<DetectResult>;
12
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,oEAAoE;AACpE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBnE;AAED,kFAAkF;AAClF,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,WAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ/F;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CActG"}
@@ -0,0 +1,59 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFile } from 'node:child_process';
4
+ import { promisify } from 'node:util';
5
+ import { pathExists, shortenHome } from '../fsutil/edit.js';
6
+ const exec = promisify(execFile);
7
+ /** Locate an executable on PATH without shelling out to `which`. */
8
+ export async function whichBin(name) {
9
+ const isWin = process.platform === 'win32';
10
+ const dirs = (process.env.PATH ?? '').split(isWin ? ';' : ':').filter(Boolean);
11
+ const exts = isWin ? (process.env.PATHEXT ?? '.EXE;.CMD;.BAT').split(';') : [''];
12
+ for (const dir of dirs) {
13
+ for (const ext of exts) {
14
+ const candidate = path.join(dir, name + ext.toLowerCase());
15
+ try {
16
+ await fs.access(candidate, isWin ? fs.constants.F_OK : fs.constants.X_OK);
17
+ return candidate;
18
+ }
19
+ catch {
20
+ /* keep looking */
21
+ }
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ /** Best-effort `<bin> --version`. Never throws; agents that hang are given 3s. */
27
+ export async function binVersion(bin, args = ['--version']) {
28
+ try {
29
+ const { stdout } = await exec(bin, args, { timeout: 3000, windowsHide: true });
30
+ const first = stdout.trim().split('\n')[0]?.trim();
31
+ return first || undefined;
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ }
37
+ /**
38
+ * An agent counts as installed when its binary is on PATH *or* it has already
39
+ * left a config behind — a user may have it installed via an IDE extension or a
40
+ * shell alias we cannot see.
41
+ */
42
+ export async function detectByBinOrConfig(bins, configPaths) {
43
+ for (const bin of bins) {
44
+ const found = await whichBin(bin);
45
+ if (found) {
46
+ const version = await binVersion(found);
47
+ const result = { installed: true, evidence: `binary: ${shortenHome(found)}` };
48
+ if (version)
49
+ result.version = version;
50
+ return result;
51
+ }
52
+ }
53
+ for (const file of configPaths) {
54
+ if (await pathExists(file))
55
+ return { installed: true, evidence: `config: ${shortenHome(file)}` };
56
+ }
57
+ return { installed: false };
58
+ }
59
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEjC,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC1E,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,IAAI,GAAG,CAAC,WAAW,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACnD,OAAO,KAAK,IAAI,SAAS,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAc,EAAE,WAAqB;IAC7E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,MAAM,GAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YAC5F,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACnG,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { ConnectionTarget, GatewayModel } from '../types.js';
2
+ import { type Discrimination } from './gateway.js';
3
+ export interface ResolveInput {
4
+ baseUrl?: string;
5
+ apiKey?: string;
6
+ /** Discover the gateway URL through the dashboard API instead. */
7
+ dashboardUrl?: string;
8
+ token?: string;
9
+ org?: string;
10
+ profile?: string;
11
+ providerId?: string;
12
+ providerLabel?: string;
13
+ /** Restrict which models get registered. Empty means all chat-capable models. */
14
+ onlyModels?: string[];
15
+ defaultModel?: string;
16
+ /** Skip the live /models call. Adapters then register only --model. */
17
+ offline?: boolean;
18
+ }
19
+ export interface ResolvedSource {
20
+ baseUrl: string;
21
+ apiKey: string;
22
+ /** Where each value came from, for the CLI to report honestly. */
23
+ from: {
24
+ baseUrl: string;
25
+ apiKey: string;
26
+ };
27
+ }
28
+ /**
29
+ * Work out the gateway URL and key from, in order: explicit flags, environment,
30
+ * a saved profile, then the dashboard API. Nothing is hard-coded — the gateway
31
+ * URL is per-environment and is published by the dashboard at runtime.
32
+ */
33
+ export declare function resolveSource(input: ResolveInput): Promise<ResolvedSource>;
34
+ /** Turn a resolved source into the full target adapters consume. */
35
+ export declare function buildTarget(source: ResolvedSource, input: ResolveInput): Promise<ConnectionTarget>;
36
+ /**
37
+ * Two different failures hide behind "we could not resolve the base URL", and
38
+ * they need different fixes — so say which one happened.
39
+ */
40
+ export declare function explainUnresolvedBase(baseUrl: string, discrimination: Discrimination): string;
41
+ /**
42
+ * Pick a sensible default: the largest-context model, preferring one that can
43
+ * call tools, because every agent in our matrix needs tool calling to be useful.
44
+ */
45
+ export declare function pickDefaultModel(models: GatewayModel[]): string | undefined;
46
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAI3F,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoDhF;AAED,oEAAoE;AACpE,wBAAsB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsCxG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAmB7F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,SAAS,CAI3E"}
@@ -0,0 +1,124 @@
1
+ import { chatModels, listModels, resolveApiBase } from './gateway.js';
2
+ import { ManagementClient, explainManagementError } from './management.js';
3
+ import { getProfile } from './store.js';
4
+ /**
5
+ * Work out the gateway URL and key from, in order: explicit flags, environment,
6
+ * a saved profile, then the dashboard API. Nothing is hard-coded — the gateway
7
+ * URL is per-environment and is published by the dashboard at runtime.
8
+ */
9
+ export async function resolveSource(input) {
10
+ let baseUrl = input.baseUrl?.trim();
11
+ let apiKey = input.apiKey?.trim();
12
+ const from = { baseUrl: 'flag --base-url', apiKey: 'flag --api-key' };
13
+ if (!baseUrl && process.env.IDCH_AI_BASE_URL) {
14
+ baseUrl = process.env.IDCH_AI_BASE_URL.trim();
15
+ from.baseUrl = 'env IDCH_AI_BASE_URL';
16
+ }
17
+ if (!apiKey && process.env.IDCH_AI_API_KEY) {
18
+ apiKey = process.env.IDCH_AI_API_KEY.trim();
19
+ from.apiKey = 'env IDCH_AI_API_KEY';
20
+ }
21
+ if ((!baseUrl || !apiKey) && !input.dashboardUrl) {
22
+ const saved = await getProfile(input.profile);
23
+ if (saved) {
24
+ if (!baseUrl) {
25
+ baseUrl = saved.profile.apiBase;
26
+ from.baseUrl = `profile "${saved.name}"`;
27
+ }
28
+ if (!apiKey) {
29
+ apiKey = saved.profile.apiKey;
30
+ from.apiKey = `profile "${saved.name}"`;
31
+ }
32
+ }
33
+ }
34
+ if (!baseUrl && input.dashboardUrl && input.token && input.org) {
35
+ const client = new ManagementClient(input.dashboardUrl, input.token, input.org);
36
+ try {
37
+ const status = await client.status();
38
+ if (!status.integration_available) {
39
+ throw new Error('the AI gateway is not configured on this environment');
40
+ }
41
+ if (!status.enabled) {
42
+ throw new Error('AI is not enabled for this organization yet — an admin must enable it in the dashboard first');
43
+ }
44
+ if (!status.public_base_url) {
45
+ throw new Error('the dashboard did not publish a gateway URL for this organization');
46
+ }
47
+ baseUrl = status.public_base_url;
48
+ from.baseUrl = 'dashboard GET /ai/status';
49
+ }
50
+ catch (err) {
51
+ throw new Error(`could not discover the gateway from the dashboard: ${explainManagementError(err)}`);
52
+ }
53
+ }
54
+ if (!baseUrl)
55
+ throw new Error('no gateway URL. Pass --base-url, set IDCH_AI_BASE_URL, or run `idch-ai login`.');
56
+ if (!apiKey)
57
+ throw new Error('no API key. Pass --api-key, set IDCH_AI_API_KEY, or run `idch-ai login`.');
58
+ return { baseUrl, apiKey, from };
59
+ }
60
+ /** Turn a resolved source into the full target adapters consume. */
61
+ export async function buildTarget(source, input) {
62
+ const { apiBase, origin, basePath, probed, discrimination } = await resolveApiBase(source.baseUrl, source.apiKey);
63
+ let models = [];
64
+ if (!input.offline) {
65
+ if (!probed)
66
+ throw new Error(explainUnresolvedBase(source.baseUrl, discrimination));
67
+ models = chatModels(await listModels(apiBase, source.apiKey));
68
+ }
69
+ if (input.onlyModels?.length) {
70
+ const wanted = new Set(input.onlyModels);
71
+ const missing = input.onlyModels.filter((m) => models.length > 0 && !models.some((x) => x.id === m));
72
+ if (missing.length && !input.offline) {
73
+ throw new Error(`these models are not available to your key: ${missing.join(', ')}. ` +
74
+ `Run \`idch-ai models\` to see what is. An organization admin controls the allowlist.`);
75
+ }
76
+ const filtered = models.filter((m) => wanted.has(m.id));
77
+ // Offline, or a model the catalog did not describe: register it bare.
78
+ models = filtered.length ? filtered : input.onlyModels.map((id) => ({ id, label: id }));
79
+ }
80
+ if (!models.length && input.defaultModel)
81
+ models = [{ id: input.defaultModel, label: input.defaultModel }];
82
+ const defaultModel = input.defaultModel ?? pickDefaultModel(models);
83
+ const target = {
84
+ apiBase,
85
+ origin,
86
+ basePath,
87
+ apiKey: source.apiKey,
88
+ providerId: input.providerId ?? 'idcloudhost',
89
+ providerLabel: input.providerLabel ?? 'IDCloudHost AI',
90
+ models,
91
+ };
92
+ if (defaultModel)
93
+ target.defaultModel = defaultModel;
94
+ return target;
95
+ }
96
+ /**
97
+ * Two different failures hide behind "we could not resolve the base URL", and
98
+ * they need different fixes — so say which one happened.
99
+ */
100
+ export function explainUnresolvedBase(baseUrl, discrimination) {
101
+ if (discrimination === 'collapsed') {
102
+ return (`could not verify ${baseUrl}: this host answers the same way for paths that do not exist, ` +
103
+ `so an auth error proves nothing about whether the OpenAI routes are there. ` +
104
+ `Something is likely replying before routing (a proxy, WAF, or login page). ` +
105
+ `Check the URL and that the key reaches the gateway itself, or pass --offline to write configs anyway.`);
106
+ }
107
+ if (discrimination === 'unknown') {
108
+ return (`could not verify ${baseUrl}: it answered, but the check that would confirm the answer is meaningful ` +
109
+ `could not be completed. Re-run, or pass --offline to write configs without contacting the gateway.`);
110
+ }
111
+ return (`nothing answered at ${baseUrl} (tried it with and without a /v1 suffix). ` +
112
+ `Check the URL, or pass --offline to write configs without contacting the gateway.`);
113
+ }
114
+ /**
115
+ * Pick a sensible default: the largest-context model, preferring one that can
116
+ * call tools, because every agent in our matrix needs tool calling to be useful.
117
+ */
118
+ export function pickDefaultModel(models) {
119
+ if (!models.length)
120
+ return undefined;
121
+ const score = (m) => (m.supportsTools === false ? 0 : 1) * 1e12 + (m.contextWindow ?? 0);
122
+ return [...models].sort((a, b) => score(b) - score(a))[0].id;
123
+ }
124
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/core/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { GatewayModel, CapabilityCheck, CapabilityReport } from '../types.js';
2
+ /** Split a base URL into an origin and the path prefix the OpenAI routes hang off. */
3
+ export declare function splitBase(apiBase: string): {
4
+ origin: string;
5
+ basePath: string;
6
+ apiBase: string;
7
+ };
8
+ /**
9
+ * Work out which URL actually serves the OpenAI routes.
10
+ *
11
+ * Our gateway URL is configured per environment (LITELLM_PUBLIC_BASE_URL) and may
12
+ * or may not already carry the `/v1` suffix, so we probe instead of assuming.
13
+ * Ordered by likelihood; the first candidate whose `/models` answers wins.
14
+ */
15
+ /** Why a probe reached its verdict, so callers can report honestly. */
16
+ export type Discrimination =
17
+ /** A 200 settled it; no inference from status codes was needed. */
18
+ 'not-needed'
19
+ /** A control path 404'd, so an auth error really does mean "route exists". */
20
+ | 'live'
21
+ /** Something answers every path identically — we cannot tell routes apart. */
22
+ | 'collapsed'
23
+ /** The control request itself failed, so the signal could not be checked. */
24
+ | 'unknown';
25
+ export interface ResolvedBase {
26
+ apiBase: string;
27
+ origin: string;
28
+ basePath: string;
29
+ probed: boolean;
30
+ discrimination: Discrimination;
31
+ }
32
+ export declare function resolveApiBase(input: string, apiKey: string | undefined, opts?: {
33
+ timeoutMs?: number;
34
+ }): Promise<ResolvedBase>;
35
+ export declare function normalizeUrl(input: string): string;
36
+ /**
37
+ * List the models this key may use.
38
+ *
39
+ * `/models` is the OpenAI-standard, always-present source of truth for ids.
40
+ * `/model/info` is a LiteLLM extension that adds context windows, pricing and
41
+ * capability flags — nice to have, so a failure there is not fatal.
42
+ */
43
+ export declare function listModels(apiBase: string, apiKey: string, opts?: {
44
+ timeoutMs?: number;
45
+ }): Promise<GatewayModel[]>;
46
+ /** Models that make sense to register with a coding agent. */
47
+ export declare function chatModels(models: GatewayModel[]): GatewayModel[];
48
+ /**
49
+ * Ask the running gateway what it actually supports rather than trusting a
50
+ * static compatibility table. Every adapter's README section is generated from
51
+ * this, so users never get told a feature works when it does not.
52
+ */
53
+ export declare function probeCapabilities(apiBase: string, apiKey: string, model: string, opts?: {
54
+ timeoutMs?: number;
55
+ include?: CapabilityCheck['id'][];
56
+ }): Promise<CapabilityReport>;
57
+ /** Single non-streaming chat call. Used by `connect --verify` and `doctor`. */
58
+ export declare function testChat(apiBase: string, apiKey: string, model: string, prompt?: string): Promise<string>;
59
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/core/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGnF,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAKhG;AAMD;;;;;;GAMG;AACH,uEAAuE;AACvE,MAAM,MAAM,cAAc;AACxB,mEAAmE;AACjE,YAAY;AACd,8EAA8E;GAC5E,MAAM;AACR,8EAA8E;GAC5E,WAAW;AACb,6EAA6E;GAC3E,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,YAAY,CAAC,CAiDvB;AAqBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD;AAoBD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB;AAkED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAEjE;AAMD;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAA;CAAO,GACnE,OAAO,CAAC,gBAAgB,CAAC,CAmM3B;AAOD,+EAA+E;AAC/E,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,SAAmC,GACxC,OAAO,CAAC,MAAM,CAAC,CAWjB"}