@inferhub/helper 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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/adapters/claude.d.ts +3 -0
  4. package/dist/adapters/claude.d.ts.map +1 -0
  5. package/dist/adapters/claude.js +127 -0
  6. package/dist/adapters/claude.js.map +1 -0
  7. package/dist/adapters/cline.d.ts +3 -0
  8. package/dist/adapters/cline.d.ts.map +1 -0
  9. package/dist/adapters/cline.js +114 -0
  10. package/dist/adapters/cline.js.map +1 -0
  11. package/dist/adapters/codex.d.ts +3 -0
  12. package/dist/adapters/codex.d.ts.map +1 -0
  13. package/dist/adapters/codex.js +126 -0
  14. package/dist/adapters/codex.js.map +1 -0
  15. package/dist/adapters/hermes.d.ts +3 -0
  16. package/dist/adapters/hermes.d.ts.map +1 -0
  17. package/dist/adapters/hermes.js +143 -0
  18. package/dist/adapters/hermes.js.map +1 -0
  19. package/dist/adapters/index.d.ts +13 -0
  20. package/dist/adapters/index.d.ts.map +1 -0
  21. package/dist/adapters/index.js +30 -0
  22. package/dist/adapters/index.js.map +1 -0
  23. package/dist/adapters/openclaw.d.ts +3 -0
  24. package/dist/adapters/openclaw.d.ts.map +1 -0
  25. package/dist/adapters/openclaw.js +195 -0
  26. package/dist/adapters/openclaw.js.map +1 -0
  27. package/dist/adapters/opencode.d.ts +3 -0
  28. package/dist/adapters/opencode.d.ts.map +1 -0
  29. package/dist/adapters/opencode.js +143 -0
  30. package/dist/adapters/opencode.js.map +1 -0
  31. package/dist/cli.d.ts +3 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +368 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/constants.d.ts +14 -0
  36. package/dist/constants.d.ts.map +1 -0
  37. package/dist/constants.js +24 -0
  38. package/dist/constants.js.map +1 -0
  39. package/dist/fsutil.d.ts +41 -0
  40. package/dist/fsutil.d.ts.map +1 -0
  41. package/dist/fsutil.js +174 -0
  42. package/dist/fsutil.js.map +1 -0
  43. package/dist/index.d.ts +18 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +38 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/paths.d.ts +15 -0
  48. package/dist/paths.d.ts.map +1 -0
  49. package/dist/paths.js +58 -0
  50. package/dist/paths.js.map +1 -0
  51. package/dist/types.d.ts +79 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/validate.d.ts +15 -0
  56. package/dist/validate.d.ts.map +1 -0
  57. package/dist/validate.js +68 -0
  58. package/dist/validate.js.map +1 -0
  59. package/package.json +58 -0
package/dist/cli.js ADDED
@@ -0,0 +1,368 @@
1
+ #!/usr/bin/env node
2
+ import readline from "node:readline/promises";
3
+ import { stdin as input, stdout as output } from "node:process";
4
+ import { DEFAULT_BASE_URL, PROVIDER_NAME, } from "./constants.js";
5
+ import { applyToAgents, listAdapters, resetAgents, statusAll, } from "./index.js";
6
+ import { validateApiKey } from "./validate.js";
7
+ import { normalizeBaseUrl } from "./fsutil.js";
8
+ const VERSION = "0.1.0";
9
+ function printHelp() {
10
+ console.log(`
11
+ ${PROVIDER_NAME} Helper v${VERSION}
12
+ Point coding agents at ${DEFAULT_BASE_URL}
13
+
14
+ Usage:
15
+ inferhub-helper Interactive setup (enter API key)
16
+ inferhub-helper apply [opts] Non-interactive apply
17
+ inferhub-helper status Show agent config status
18
+ inferhub-helper reset [opts] Remove InferHub settings
19
+ inferhub-helper validate --key K Check key via GET /v1/models
20
+ inferhub-helper list List supported agents
21
+ inferhub-helper help This help
22
+
23
+ Options:
24
+ --key, -k <key> InferHub API key (sk-airo-…)
25
+ --base-url <url> Default: ${DEFAULT_BASE_URL}
26
+ --model, -m <id> Primary model id from /v1/models
27
+ --subagent-model <id> Secondary model (Codex/OpenCode subagent)
28
+ --agents <list> Comma list or "all" / "installed" (default: installed)
29
+ --models <list> Extra model ids (OpenCode/OpenClaw)
30
+ --dry-run Print actions without writing
31
+ --yes, -y Skip confirmation prompts
32
+ --json Machine-readable output
33
+
34
+ Examples:
35
+ npx @inferhub/helper
36
+ inferhub-helper apply -k sk-airo-… -m grok-4.5 --agents claude,codex
37
+ inferhub-helper status
38
+ inferhub-helper reset --agents all
39
+ `.trim());
40
+ }
41
+ function parseArgs(argv) {
42
+ const flags = { _: [] };
43
+ for (let i = 0; i < argv.length; i++) {
44
+ const a = argv[i];
45
+ const next = () => argv[++i];
46
+ switch (a) {
47
+ case "--key":
48
+ case "-k":
49
+ flags.key = next();
50
+ break;
51
+ case "--base-url":
52
+ flags.baseUrl = next();
53
+ break;
54
+ case "--model":
55
+ case "-m":
56
+ flags.model = next();
57
+ break;
58
+ case "--subagent-model":
59
+ flags.subagentModel = next();
60
+ break;
61
+ case "--agents":
62
+ flags.agents = next();
63
+ break;
64
+ case "--models":
65
+ flags.models = next();
66
+ break;
67
+ case "--dry-run":
68
+ flags.dryRun = true;
69
+ break;
70
+ case "--yes":
71
+ case "-y":
72
+ flags.yes = true;
73
+ break;
74
+ case "--json":
75
+ flags.json = true;
76
+ break;
77
+ case "--help":
78
+ case "-h":
79
+ flags.help = true;
80
+ break;
81
+ case "--version":
82
+ case "-V":
83
+ flags.version = true;
84
+ break;
85
+ default:
86
+ if (a.startsWith("-")) {
87
+ console.error(`Unknown flag: ${a}`);
88
+ process.exitCode = 2;
89
+ }
90
+ else {
91
+ flags._.push(a);
92
+ }
93
+ }
94
+ }
95
+ return flags;
96
+ }
97
+ function parseAgentList(raw, fallback) {
98
+ if (!raw || raw === "installed")
99
+ return fallback === "all" ? "all" : "installed";
100
+ if (raw === "all")
101
+ return "all";
102
+ return raw
103
+ .split(",")
104
+ .map((s) => s.trim().toLowerCase())
105
+ .filter(Boolean);
106
+ }
107
+ async function cmdStatus(flags) {
108
+ const rows = await statusAll();
109
+ if (flags.json) {
110
+ console.log(JSON.stringify(rows, null, 2));
111
+ return;
112
+ }
113
+ console.log(`\n${PROVIDER_NAME} — agent status\n`);
114
+ for (const r of rows) {
115
+ const mark = r.configured ? "✓" : r.installed ? "·" : " ";
116
+ const state = r.configured
117
+ ? "configured"
118
+ : r.installed
119
+ ? "installed"
120
+ : "not found";
121
+ console.log(` [${mark}] ${r.name.padEnd(16)} ${state.padEnd(12)} ${r.configPath ?? ""}`);
122
+ if (r.message)
123
+ console.log(` ${r.message}`);
124
+ }
125
+ console.log();
126
+ }
127
+ async function cmdList(flags) {
128
+ const list = listAdapters().map((a) => ({
129
+ id: a.id,
130
+ name: a.name,
131
+ description: a.description,
132
+ }));
133
+ if (flags.json) {
134
+ console.log(JSON.stringify(list, null, 2));
135
+ return;
136
+ }
137
+ console.log(`\nSupported agents:\n`);
138
+ for (const a of list) {
139
+ console.log(` ${a.id.padEnd(12)} ${a.name}`);
140
+ console.log(` ${a.description}`);
141
+ }
142
+ console.log();
143
+ }
144
+ async function cmdValidate(flags) {
145
+ const key = flags.key ?? process.env.INFERHUB_API_KEY;
146
+ if (!key) {
147
+ console.error("Pass --key or set INFERHUB_API_KEY");
148
+ process.exitCode = 1;
149
+ return;
150
+ }
151
+ const result = await validateApiKey({
152
+ apiKey: key,
153
+ baseUrl: flags.baseUrl,
154
+ });
155
+ if (flags.json) {
156
+ console.log(JSON.stringify(result, null, 2));
157
+ return;
158
+ }
159
+ if (!result.ok) {
160
+ console.error(`✗ ${result.error}`);
161
+ process.exitCode = 1;
162
+ return;
163
+ }
164
+ console.log(`✓ key valid — ${result.models.length} model(s) at ${result.baseUrl}`);
165
+ for (const m of result.models.slice(0, 30)) {
166
+ console.log(` - ${m.id}${m.ownedBy ? ` (${m.ownedBy})` : ""}`);
167
+ }
168
+ if (result.models.length > 30) {
169
+ console.log(` … +${result.models.length - 30} more`);
170
+ }
171
+ }
172
+ async function cmdApply(flags, interactive) {
173
+ const rl = interactive && !flags.key
174
+ ? readline.createInterface({ input, output })
175
+ : null;
176
+ try {
177
+ let key = flags.key ?? process.env.INFERHUB_API_KEY ?? "";
178
+ if (!key && rl) {
179
+ key = (await rl.question("InferHub API key (sk-airo-…): ")).trim();
180
+ }
181
+ if (!key) {
182
+ console.error("API key required (--key or INFERHUB_API_KEY)");
183
+ process.exitCode = 1;
184
+ return;
185
+ }
186
+ const baseUrl = normalizeBaseUrl(flags.baseUrl ?? DEFAULT_BASE_URL);
187
+ process.stdout.write(`Validating key against ${baseUrl}/models … `);
188
+ const validation = await validateApiKey({ apiKey: key, baseUrl });
189
+ if (!validation.ok) {
190
+ console.log("failed");
191
+ console.error(`✗ ${validation.error}`);
192
+ process.exitCode = 1;
193
+ return;
194
+ }
195
+ console.log(`ok (${validation.models.length} models)`);
196
+ let model = flags.model;
197
+ if (!model && rl) {
198
+ const preferred = pickDefaultModel(validation.models.map((m) => m.id));
199
+ console.log("\nAvailable models (first 40):");
200
+ const shown = validation.models.slice(0, 40);
201
+ shown.forEach((m, i) => {
202
+ const star = m.id === preferred ? " *" : "";
203
+ console.log(` ${String(i + 1).padStart(2)}. ${m.id}${star}`);
204
+ });
205
+ const ans = (await rl.question(`\nModel id or number [${preferred ?? shown[0]?.id ?? ""}]: `)).trim();
206
+ if (!ans) {
207
+ model = preferred ?? shown[0]?.id;
208
+ }
209
+ else if (/^\d+$/.test(ans)) {
210
+ const idx = Number(ans) - 1;
211
+ model = shown[idx]?.id ?? preferred;
212
+ }
213
+ else {
214
+ model = ans;
215
+ }
216
+ }
217
+ if (!model) {
218
+ model = pickDefaultModel(validation.models.map((m) => m.id));
219
+ }
220
+ if (!model) {
221
+ console.error("No model selected and /v1/models was empty of usable ids");
222
+ process.exitCode = 1;
223
+ return;
224
+ }
225
+ console.log(`Using model: ${model}`);
226
+ const agentsArg = parseAgentList(flags.agents, "installed");
227
+ let targetLabel = agentsArg === "all"
228
+ ? "all agents"
229
+ : agentsArg === "installed"
230
+ ? "installed agents"
231
+ : agentsArg.join(", ");
232
+ if (interactive && rl && !flags.agents) {
233
+ const statuses = await statusAll();
234
+ console.log("\nAgents:");
235
+ for (const s of statuses) {
236
+ console.log(` ${s.installed ? "●" : "○"} ${s.id.padEnd(10)} ${s.installed ? "installed" : "not found"}${s.configured ? " (already InferHub)" : ""}`);
237
+ }
238
+ const ans = (await rl.question('Apply to [installed] (or "all", or comma list e.g. claude,codex): ')).trim();
239
+ if (ans) {
240
+ const parsed = parseAgentList(ans, "installed");
241
+ // reassign via local
242
+ Object.assign(flags, { agents: ans });
243
+ targetLabel =
244
+ parsed === "all"
245
+ ? "all agents"
246
+ : parsed === "installed"
247
+ ? "installed agents"
248
+ : parsed.join(", ");
249
+ }
250
+ }
251
+ const extraModels = flags.models
252
+ ? flags.models.split(",").map((s) => s.trim()).filter(Boolean)
253
+ : undefined;
254
+ if (!flags.yes && rl && !flags.dryRun) {
255
+ const ok = (await rl.question(`\nWrite ${PROVIDER_NAME} settings for ${targetLabel}? [Y/n] `))
256
+ .trim()
257
+ .toLowerCase();
258
+ if (ok === "n" || ok === "no") {
259
+ console.log("Aborted.");
260
+ return;
261
+ }
262
+ }
263
+ const agentSel = parseAgentList(flags.agents, "installed");
264
+ const results = await applyToAgents(agentSel, {
265
+ apiKey: key,
266
+ baseUrl,
267
+ model,
268
+ subagentModel: flags.subagentModel,
269
+ models: extraModels,
270
+ dryRun: flags.dryRun,
271
+ });
272
+ if (flags.json) {
273
+ console.log(JSON.stringify({ model, baseUrl, results }, null, 2));
274
+ return;
275
+ }
276
+ console.log("");
277
+ for (const r of results) {
278
+ const mark = r.success ? "✓" : "✗";
279
+ console.log(` ${mark} ${r.name}: ${r.message}`);
280
+ if (r.configPath)
281
+ console.log(` ${r.configPath}`);
282
+ }
283
+ if (results.length === 0) {
284
+ console.log(" (no matching agents — install Claude/Codex/… or pass --agents all)");
285
+ }
286
+ console.log("");
287
+ }
288
+ finally {
289
+ rl?.close();
290
+ }
291
+ }
292
+ async function cmdReset(flags) {
293
+ const agentSel = parseAgentList(flags.agents, "all");
294
+ const results = await resetAgents(agentSel === "installed" ? "all" : agentSel, {
295
+ dryRun: flags.dryRun,
296
+ });
297
+ if (flags.json) {
298
+ console.log(JSON.stringify(results, null, 2));
299
+ return;
300
+ }
301
+ for (const r of results) {
302
+ console.log(` ${r.success ? "✓" : "✗"} ${r.name}: ${r.message}`);
303
+ }
304
+ }
305
+ function pickDefaultModel(ids) {
306
+ const prefer = [
307
+ "grok-4.5",
308
+ "deepseek-v4-pro",
309
+ "deepseek-v4-flash",
310
+ "claude-sonnet-4-6",
311
+ "gpt-4o",
312
+ ];
313
+ for (const p of prefer) {
314
+ const hit = ids.find((id) => id === p || id.endsWith(`/${p}`));
315
+ if (hit)
316
+ return hit;
317
+ }
318
+ // Prefer non-free marketplace-looking ids
319
+ const nonFree = ids.find((id) => !id.startsWith("free/"));
320
+ return nonFree ?? ids[0];
321
+ }
322
+ async function main() {
323
+ const flags = parseArgs(process.argv.slice(2));
324
+ if (flags.version) {
325
+ console.log(VERSION);
326
+ return;
327
+ }
328
+ if (flags.help) {
329
+ printHelp();
330
+ return;
331
+ }
332
+ const cmd = flags._[0];
333
+ if (!cmd) {
334
+ // Interactive default
335
+ await cmdApply(flags, true);
336
+ return;
337
+ }
338
+ switch (cmd) {
339
+ case "help":
340
+ printHelp();
341
+ break;
342
+ case "status":
343
+ await cmdStatus(flags);
344
+ break;
345
+ case "list":
346
+ await cmdList(flags);
347
+ break;
348
+ case "validate":
349
+ await cmdValidate(flags);
350
+ break;
351
+ case "apply":
352
+ case "setup":
353
+ await cmdApply(flags, !flags.yes && !flags.key);
354
+ break;
355
+ case "reset":
356
+ await cmdReset(flags);
357
+ break;
358
+ default:
359
+ console.error(`Unknown command: ${cmd}`);
360
+ printHelp();
361
+ process.exitCode = 2;
362
+ }
363
+ }
364
+ main().catch((err) => {
365
+ console.error(err instanceof Error ? err.message : err);
366
+ process.exitCode = 1;
367
+ });
368
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Public OpenAI/Anthropic-compatible API root (includes /v1). */
2
+ export declare const DEFAULT_BASE_URL = "https://api.inferhub.dev/v1";
3
+ /** Provider id written into agent configs. */
4
+ export declare const PROVIDER_ID = "inferhub";
5
+ /** Display name for UIs that show a provider label. */
6
+ export declare const PROVIDER_NAME = "InferHub";
7
+ /** Env var Codex auth.json uses for the bearer token. */
8
+ export declare const CODEX_API_KEY_FIELD = "OPENAI_API_KEY";
9
+ /** Env var Hermes .env uses for the bearer token. */
10
+ export declare const HERMES_API_KEY_ENV = "OPENAI_API_KEY";
11
+ /** Claude Code env keys we manage. */
12
+ export declare const CLAUDE_ENV_KEYS: readonly ["ANTHROPIC_BASE_URL", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_API_KEY", "ANTHROPIC_DEFAULT_OPUS_MODEL", "ANTHROPIC_DEFAULT_SONNET_MODEL", "ANTHROPIC_DEFAULT_HAIKU_MODEL", "ANTHROPIC_DEFAULT_FABLE_MODEL", "ANTHROPIC_MODEL", "API_TIMEOUT_MS"];
13
+ export declare const DEFAULT_API_TIMEOUT_MS = "600000";
14
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,gCAAgC,CAAC;AAE9D,8CAA8C;AAC9C,eAAO,MAAM,WAAW,aAAa,CAAC;AAEtC,uDAAuD;AACvD,eAAO,MAAM,aAAa,aAAa,CAAC;AAExC,yDAAyD;AACzD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAEnD,sCAAsC;AACtC,eAAO,MAAM,eAAe,uPAUlB,CAAC;AAEX,eAAO,MAAM,sBAAsB,WAAW,CAAC"}
@@ -0,0 +1,24 @@
1
+ /** Public OpenAI/Anthropic-compatible API root (includes /v1). */
2
+ export const DEFAULT_BASE_URL = "https://api.inferhub.dev/v1";
3
+ /** Provider id written into agent configs. */
4
+ export const PROVIDER_ID = "inferhub";
5
+ /** Display name for UIs that show a provider label. */
6
+ export const PROVIDER_NAME = "InferHub";
7
+ /** Env var Codex auth.json uses for the bearer token. */
8
+ export const CODEX_API_KEY_FIELD = "OPENAI_API_KEY";
9
+ /** Env var Hermes .env uses for the bearer token. */
10
+ export const HERMES_API_KEY_ENV = "OPENAI_API_KEY";
11
+ /** Claude Code env keys we manage. */
12
+ export const CLAUDE_ENV_KEYS = [
13
+ "ANTHROPIC_BASE_URL",
14
+ "ANTHROPIC_AUTH_TOKEN",
15
+ "ANTHROPIC_API_KEY",
16
+ "ANTHROPIC_DEFAULT_OPUS_MODEL",
17
+ "ANTHROPIC_DEFAULT_SONNET_MODEL",
18
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL",
19
+ "ANTHROPIC_DEFAULT_FABLE_MODEL",
20
+ "ANTHROPIC_MODEL",
21
+ "API_TIMEOUT_MS",
22
+ ];
23
+ export const DEFAULT_API_TIMEOUT_MS = "600000";
24
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAE9D,8CAA8C;AAC9C,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AAEtC,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAExC,yDAAyD;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,qDAAqD;AACrD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAEnD,sCAAsC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,oBAAoB;IACpB,sBAAsB;IACtB,mBAAmB;IACnB,8BAA8B;IAC9B,gCAAgC;IAChC,+BAA+B;IAC/B,+BAA+B;IAC/B,iBAAiB;IACjB,gBAAgB;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /** Read a UTF-8 file; return null if missing. */
2
+ export declare function readText(filePath: string): Promise<string | null>;
3
+ /** Parse JSON, tolerating trailing commas (JSONC-ish). */
4
+ export declare function parseJsonLoose<T = unknown>(text: string): T;
5
+ export declare function readJsonFile<T = unknown>(filePath: string): Promise<T | null>;
6
+ export declare function ensureDir(dir: string): Promise<void>;
7
+ /** Write file atomically-ish: backup existing, then write. */
8
+ export declare function writeText(filePath: string, content: string, opts?: {
9
+ dryRun?: boolean;
10
+ backup?: boolean;
11
+ }): Promise<{
12
+ backedUp?: string;
13
+ }>;
14
+ export declare function fileExists(filePath: string): Promise<boolean>;
15
+ /**
16
+ * True if a CLI binary is on PATH (where/which), or if `fallbackPaths` exist.
17
+ * On Windows, also injects %APPDATA%\npm into PATH for global npm bins.
18
+ */
19
+ export declare function commandExists(bin: string, fallbackPaths?: string[]): Promise<boolean>;
20
+ /** Ensure base URL ends with /v1 (no trailing slash beyond that). */
21
+ export declare function normalizeBaseUrl(baseUrl: string): string;
22
+ /** Upsert KEY=VALUE in a .env body. */
23
+ export declare function upsertEnvVar(envText: string, key: string, value: string): string;
24
+ export declare function removeEnvVar(envText: string, key: string): string;
25
+ /** Minimal TOML helpers — enough for Codex config merge without a dependency. */
26
+ export declare function tomlQuote(s: string): string;
27
+ /**
28
+ * Set top-level `key = "value"` (string). Replaces existing assignment.
29
+ * Does not handle nested tables for the key itself.
30
+ */
31
+ export declare function upsertTomlString(toml: string, key: string, value: string): string;
32
+ export declare function removeTomlKey(toml: string, key: string): string;
33
+ /**
34
+ * Upsert a TOML table block `[section]` with string key/values.
35
+ * Replaces the entire table body if present.
36
+ */
37
+ export declare function upsertTomlTable(toml: string, section: string, fields: Record<string, string>): string;
38
+ export declare function removeTomlTable(toml: string, section: string): string;
39
+ export declare function tomlHasTable(toml: string, section: string): boolean;
40
+ export declare function tomlGetString(toml: string, key: string): string | null;
41
+ //# sourceMappingURL=fsutil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fsutil.d.ts","sourceRoot":"","sources":["../src/fsutil.ts"],"names":[],"mappings":"AAOA,iDAAiD;AACjD,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvE;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAG3D;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAQnF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D;AAED,8DAA8D;AAC9D,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAahC;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,aAAa,GAAE,MAAM,EAAO,GAC3B,OAAO,CAAC,OAAO,CAAC,CAoBlB;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjE;AAMD,iFAAiF;AAEjF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAcjF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAiBR;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE"}
package/dist/fsutil.js ADDED
@@ -0,0 +1,174 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { execFile } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ const execFileAsync = promisify(execFile);
6
+ /** Read a UTF-8 file; return null if missing. */
7
+ export async function readText(filePath) {
8
+ try {
9
+ return await fs.readFile(filePath, "utf8");
10
+ }
11
+ catch (err) {
12
+ const e = err;
13
+ if (e.code === "ENOENT")
14
+ return null;
15
+ throw err;
16
+ }
17
+ }
18
+ /** Parse JSON, tolerating trailing commas (JSONC-ish). */
19
+ export function parseJsonLoose(text) {
20
+ const stripped = text.replace(/,(\s*[}\]])/g, "$1");
21
+ return JSON.parse(stripped);
22
+ }
23
+ export async function readJsonFile(filePath) {
24
+ const text = await readText(filePath);
25
+ if (text == null)
26
+ return null;
27
+ try {
28
+ return parseJsonLoose(text);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ export async function ensureDir(dir) {
35
+ await fs.mkdir(dir, { recursive: true });
36
+ }
37
+ /** Write file atomically-ish: backup existing, then write. */
38
+ export async function writeText(filePath, content, opts) {
39
+ if (opts?.dryRun)
40
+ return {};
41
+ await ensureDir(path.dirname(filePath));
42
+ let backedUp;
43
+ if (opts?.backup !== false) {
44
+ const existing = await readText(filePath);
45
+ if (existing != null) {
46
+ backedUp = `${filePath}.inferhub-backup`;
47
+ await fs.writeFile(backedUp, existing, "utf8");
48
+ }
49
+ }
50
+ await fs.writeFile(filePath, content, "utf8");
51
+ return { backedUp };
52
+ }
53
+ export async function fileExists(filePath) {
54
+ try {
55
+ await fs.access(filePath);
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ /**
63
+ * True if a CLI binary is on PATH (where/which), or if `fallbackPaths` exist.
64
+ * On Windows, also injects %APPDATA%\npm into PATH for global npm bins.
65
+ */
66
+ export async function commandExists(bin, fallbackPaths = []) {
67
+ const isWin = process.platform === "win32";
68
+ const cmd = isWin ? "where" : "which";
69
+ const env = { ...process.env };
70
+ if (isWin && process.env.APPDATA) {
71
+ env.PATH = `${process.env.APPDATA}\\npm;${env.PATH ?? ""}`;
72
+ }
73
+ try {
74
+ await execFileAsync(cmd, [bin], {
75
+ env,
76
+ windowsHide: true,
77
+ timeout: 5000,
78
+ });
79
+ return true;
80
+ }
81
+ catch {
82
+ for (const p of fallbackPaths) {
83
+ if (await fileExists(p))
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ }
89
+ /** Ensure base URL ends with /v1 (no trailing slash beyond that). */
90
+ export function normalizeBaseUrl(baseUrl) {
91
+ let u = baseUrl.trim().replace(/\/+$/, "");
92
+ if (!u.endsWith("/v1")) {
93
+ u = `${u}/v1`;
94
+ }
95
+ return u;
96
+ }
97
+ /** Upsert KEY=VALUE in a .env body. */
98
+ export function upsertEnvVar(envText, key, value) {
99
+ const re = new RegExp(`^${escapeRegExp(key)}=.*$`, "m");
100
+ const line = `${key}=${value}`;
101
+ if (re.test(envText))
102
+ return envText.replace(re, line);
103
+ if (envText.length === 0)
104
+ return `${line}\n`;
105
+ const needsNl = !envText.endsWith("\n");
106
+ return `${envText}${needsNl ? "\n" : ""}${line}\n`;
107
+ }
108
+ export function removeEnvVar(envText, key) {
109
+ const re = new RegExp(`^${escapeRegExp(key)}=.*\\r?\\n?`, "m");
110
+ return envText.replace(re, "");
111
+ }
112
+ function escapeRegExp(s) {
113
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
114
+ }
115
+ /** Minimal TOML helpers — enough for Codex config merge without a dependency. */
116
+ export function tomlQuote(s) {
117
+ return `"${s.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
118
+ }
119
+ /**
120
+ * Set top-level `key = "value"` (string). Replaces existing assignment.
121
+ * Does not handle nested tables for the key itself.
122
+ */
123
+ export function upsertTomlString(toml, key, value) {
124
+ const re = new RegExp(`^${escapeRegExp(key)}\\s*=\\s*.*$`, "m");
125
+ const line = `${key} = ${tomlQuote(value)}`;
126
+ if (re.test(toml))
127
+ return toml.replace(re, line);
128
+ if (toml.length === 0)
129
+ return `${line}\n`;
130
+ // Insert before first [table] if possible
131
+ const tableIdx = toml.search(/^\[/m);
132
+ if (tableIdx >= 0) {
133
+ const before = toml.slice(0, tableIdx).replace(/\s*$/, "\n");
134
+ const after = toml.slice(tableIdx);
135
+ return `${before}${line}\n\n${after}`;
136
+ }
137
+ const needsNl = !toml.endsWith("\n");
138
+ return `${toml}${needsNl ? "\n" : ""}${line}\n`;
139
+ }
140
+ export function removeTomlKey(toml, key) {
141
+ const re = new RegExp(`^${escapeRegExp(key)}\\s*=\\s*.*\\r?\\n?`, "m");
142
+ return toml.replace(re, "");
143
+ }
144
+ /**
145
+ * Upsert a TOML table block `[section]` with string key/values.
146
+ * Replaces the entire table body if present.
147
+ */
148
+ export function upsertTomlTable(toml, section, fields) {
149
+ const header = `[${section}]`;
150
+ const body = Object.entries(fields)
151
+ .map(([k, v]) => `${k} = ${tomlQuote(v)}`)
152
+ .join("\n");
153
+ const block = `${header}\n${body}\n`;
154
+ // Match [section] until next top-level [table] or end of string.
155
+ // Use [\s\S] + $ (with m-free $ via (?:$)) — JS has no \Z.
156
+ const re = new RegExp(`^\\[${escapeRegExp(section)}\\][^\\[]*(?=^\\[|$)`, "ms");
157
+ if (re.test(toml)) {
158
+ return toml.replace(re, `${block}\n`);
159
+ }
160
+ const needsNl = toml.length > 0 && !toml.endsWith("\n");
161
+ return `${toml}${needsNl ? "\n" : ""}\n${block}`;
162
+ }
163
+ export function removeTomlTable(toml, section) {
164
+ const re = new RegExp(`^\\[${escapeRegExp(section)}\\][^\\[]*(?=^\\[|$)`, "ms");
165
+ return toml.replace(re, "").replace(/\n{3,}/g, "\n\n");
166
+ }
167
+ export function tomlHasTable(toml, section) {
168
+ return new RegExp(`^\\[${escapeRegExp(section)}\\]`, "m").test(toml);
169
+ }
170
+ export function tomlGetString(toml, key) {
171
+ const m = toml.match(new RegExp(`^${escapeRegExp(key)}\\s*=\\s*"([^"]*)"`, "m"));
172
+ return m ? m[1] : null;
173
+ }
174
+ //# sourceMappingURL=fsutil.js.map