@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.
- package/LICENSE +21 -0
- package/README.md +112 -0
- package/dist/adapters/claude.d.ts +3 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +127 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/cline.d.ts +3 -0
- package/dist/adapters/cline.d.ts.map +1 -0
- package/dist/adapters/cline.js +114 -0
- package/dist/adapters/cline.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +126 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/hermes.d.ts +3 -0
- package/dist/adapters/hermes.d.ts.map +1 -0
- package/dist/adapters/hermes.js +143 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +30 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +3 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +195 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/opencode.d.ts +3 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +143 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +368 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/fsutil.d.ts +41 -0
- package/dist/fsutil.d.ts.map +1 -0
- package/dist/fsutil.js +174 -0
- package/dist/fsutil.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +15 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +58 -0
- package/dist/paths.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate.d.ts +15 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +68 -0
- package/dist/validate.js.map +1 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 InferHub
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# @inferhub/helper
|
|
2
|
+
|
|
3
|
+
Point coding agents and IDEs at **[InferHub](https://inferhub.dev)** with one command.
|
|
4
|
+
|
|
5
|
+
You only enter your InferHub API key. The helper validates it against
|
|
6
|
+
`GET https://api.inferhub.dev/v1/models`, then writes the right config files for each agent.
|
|
7
|
+
|
|
8
|
+
Works on **Windows, macOS, and Linux** (Node.js ≥ 18).
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
# one-shot
|
|
14
|
+
npx @inferhub/helper
|
|
15
|
+
|
|
16
|
+
# or global
|
|
17
|
+
npm install -g @inferhub/helper
|
|
18
|
+
inferhub-helper
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Also available as `ih-helper`.
|
|
22
|
+
|
|
23
|
+
## Quick start
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
inferhub-helper
|
|
27
|
+
# → paste sk-airo-…
|
|
28
|
+
# → pick a model from /v1/models
|
|
29
|
+
# → applies to every installed agent
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Non-interactive:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
inferhub-helper apply \
|
|
36
|
+
--key sk-airo-… \
|
|
37
|
+
--model grok-4.5 \
|
|
38
|
+
--agents claude,codex,opencode \
|
|
39
|
+
--yes
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Commands
|
|
43
|
+
|
|
44
|
+
| Command | Description |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `inferhub-helper` / `apply` | Validate key + write agent configs |
|
|
47
|
+
| `status` | Show which agents are installed / configured |
|
|
48
|
+
| `reset` | Remove InferHub settings only |
|
|
49
|
+
| `validate --key …` | Call `/v1/models` and print models |
|
|
50
|
+
| `list` | Supported agents |
|
|
51
|
+
|
|
52
|
+
### Flags
|
|
53
|
+
|
|
54
|
+
| Flag | Meaning |
|
|
55
|
+
|---|---|
|
|
56
|
+
| `--key, -k` | InferHub API key (`INFERHUB_API_KEY` env also works) |
|
|
57
|
+
| `--base-url` | Default `https://api.inferhub.dev/v1` |
|
|
58
|
+
| `--model, -m` | Primary model id |
|
|
59
|
+
| `--subagent-model` | Codex / OpenCode subagent model |
|
|
60
|
+
| `--models` | Extra model ids (OpenCode, OpenClaw) |
|
|
61
|
+
| `--agents` | `installed` (default), `all`, or `claude,codex,…` |
|
|
62
|
+
| `--dry-run` | Don’t write files |
|
|
63
|
+
| `--yes, -y` | Skip prompts |
|
|
64
|
+
| `--json` | Machine-readable output |
|
|
65
|
+
|
|
66
|
+
## Supported agents
|
|
67
|
+
|
|
68
|
+
| Id | Tool | Config written |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `claude` | Claude Code | `~/.claude/settings.json` → `env.ANTHROPIC_BASE_URL` + `ANTHROPIC_AUTH_TOKEN` |
|
|
71
|
+
| `codex` | OpenAI Codex CLI | `~/.codex/config.toml` provider `inferhub` (`wire_api = "responses"`) + `auth.json` |
|
|
72
|
+
| `opencode` | OpenCode | `~/.config/opencode/opencode.json` provider `inferhub` (`@ai-sdk/openai-compatible`) |
|
|
73
|
+
| `hermes` | Hermes Agent | `~/.hermes/config.yaml` `model.provider: custom` + `.env` `OPENAI_API_KEY` |
|
|
74
|
+
| `openclaw` | OpenClaw | `~/.openclaw/openclaw.json` `models.providers.inferhub` |
|
|
75
|
+
| `cline` | Cline | `~/.cline/data/globalState.json` + `secrets.json` (OpenAI-compatible) |
|
|
76
|
+
|
|
77
|
+
Existing settings are **merged**, not replaced. A `.inferhub-backup` copy is written next to each modified file.
|
|
78
|
+
|
|
79
|
+
## Programmatic API
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import {
|
|
83
|
+
validateApiKey,
|
|
84
|
+
applyToAgents,
|
|
85
|
+
statusAll,
|
|
86
|
+
DEFAULT_BASE_URL,
|
|
87
|
+
} from "@inferhub/helper";
|
|
88
|
+
|
|
89
|
+
const v = await validateApiKey({ apiKey: process.env.INFERHUB_API_KEY! });
|
|
90
|
+
if (!v.ok) throw new Error(v.error);
|
|
91
|
+
|
|
92
|
+
await applyToAgents("installed", {
|
|
93
|
+
apiKey: process.env.INFERHUB_API_KEY!,
|
|
94
|
+
model: v.models[0]!.id,
|
|
95
|
+
baseUrl: DEFAULT_BASE_URL,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
console.log(await statusAll());
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Endpoint
|
|
102
|
+
|
|
103
|
+
InferHub public API:
|
|
104
|
+
|
|
105
|
+
- OpenAI-compatible: `https://api.inferhub.dev/v1/chat/completions`, `/v1/responses`, `/v1/models`
|
|
106
|
+
- Anthropic-compatible: `https://api.inferhub.dev/v1/messages`
|
|
107
|
+
|
|
108
|
+
Create a key at [inferhub.dev](https://inferhub.dev) → Dashboard → API Keys.
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,aAAa,CAAC;AAYrB,eAAO,MAAM,aAAa,EAAE,YA4H3B,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { CLAUDE_ENV_KEYS, DEFAULT_API_TIMEOUT_MS, DEFAULT_BASE_URL, PROVIDER_NAME, } from "../constants.js";
|
|
2
|
+
import { commandExists, normalizeBaseUrl, readJsonFile, writeText, } from "../fsutil.js";
|
|
3
|
+
import { claudeSettingsPath } from "../paths.js";
|
|
4
|
+
async function isInstalled(homeDir) {
|
|
5
|
+
return commandExists("claude", [claudeSettingsPath(homeDir)]);
|
|
6
|
+
}
|
|
7
|
+
export const claudeAdapter = {
|
|
8
|
+
id: "claude",
|
|
9
|
+
name: "Claude Code",
|
|
10
|
+
description: "Anthropic Claude Code CLI (~/.claude/settings.json env)",
|
|
11
|
+
async status(opts = {}) {
|
|
12
|
+
const configPath = claudeSettingsPath(opts.homeDir);
|
|
13
|
+
const installed = await isInstalled(opts.homeDir);
|
|
14
|
+
const settings = (await readJsonFile(configPath)) ?? null;
|
|
15
|
+
const base = settings?.env?.ANTHROPIC_BASE_URL;
|
|
16
|
+
const configured = !!(base && /inferhub/i.test(base));
|
|
17
|
+
return {
|
|
18
|
+
id: "claude",
|
|
19
|
+
name: this.name,
|
|
20
|
+
installed,
|
|
21
|
+
configured,
|
|
22
|
+
configPath: installed || settings ? configPath : null,
|
|
23
|
+
details: {
|
|
24
|
+
baseUrl: base ?? null,
|
|
25
|
+
hasAuthToken: !!(settings?.env?.ANTHROPIC_AUTH_TOKEN || settings?.env?.ANTHROPIC_API_KEY),
|
|
26
|
+
sonnet: settings?.env?.ANTHROPIC_DEFAULT_SONNET_MODEL ?? null,
|
|
27
|
+
opus: settings?.env?.ANTHROPIC_DEFAULT_OPUS_MODEL ?? null,
|
|
28
|
+
haiku: settings?.env?.ANTHROPIC_DEFAULT_HAIKU_MODEL ?? null,
|
|
29
|
+
fable: settings?.env?.ANTHROPIC_DEFAULT_FABLE_MODEL ?? null,
|
|
30
|
+
},
|
|
31
|
+
message: installed
|
|
32
|
+
? configured
|
|
33
|
+
? "pointed at InferHub"
|
|
34
|
+
: base
|
|
35
|
+
? "configured for another endpoint"
|
|
36
|
+
: "installed, not configured"
|
|
37
|
+
: "Claude Code not detected",
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
async apply(opts) {
|
|
41
|
+
const configPath = claudeSettingsPath(opts.homeDir);
|
|
42
|
+
const baseUrl = normalizeBaseUrl(opts.baseUrl ?? DEFAULT_BASE_URL);
|
|
43
|
+
const existing = (await readJsonFile(configPath)) ?? {};
|
|
44
|
+
const env = {
|
|
45
|
+
...(existing.env ?? {}),
|
|
46
|
+
ANTHROPIC_BASE_URL: baseUrl,
|
|
47
|
+
ANTHROPIC_AUTH_TOKEN: opts.apiKey,
|
|
48
|
+
API_TIMEOUT_MS: DEFAULT_API_TIMEOUT_MS,
|
|
49
|
+
};
|
|
50
|
+
// Prefer AUTH_TOKEN; clear API_KEY so both aren't fighting.
|
|
51
|
+
delete env.ANTHROPIC_API_KEY;
|
|
52
|
+
const cm = opts.claudeModels ?? {};
|
|
53
|
+
if (cm.sonnet)
|
|
54
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = cm.sonnet;
|
|
55
|
+
if (cm.opus)
|
|
56
|
+
env.ANTHROPIC_DEFAULT_OPUS_MODEL = cm.opus;
|
|
57
|
+
if (cm.haiku)
|
|
58
|
+
env.ANTHROPIC_DEFAULT_HAIKU_MODEL = cm.haiku;
|
|
59
|
+
if (cm.fable)
|
|
60
|
+
env.ANTHROPIC_DEFAULT_FABLE_MODEL = cm.fable;
|
|
61
|
+
if (opts.model) {
|
|
62
|
+
env.ANTHROPIC_MODEL = opts.model;
|
|
63
|
+
// Fill role defaults if not set
|
|
64
|
+
if (!env.ANTHROPIC_DEFAULT_SONNET_MODEL) {
|
|
65
|
+
env.ANTHROPIC_DEFAULT_SONNET_MODEL = opts.model;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const next = {
|
|
69
|
+
...existing,
|
|
70
|
+
hasCompletedOnboarding: true,
|
|
71
|
+
env,
|
|
72
|
+
};
|
|
73
|
+
if (opts.dryRun) {
|
|
74
|
+
return {
|
|
75
|
+
id: "claude",
|
|
76
|
+
name: this.name,
|
|
77
|
+
success: true,
|
|
78
|
+
dryRun: true,
|
|
79
|
+
configPath,
|
|
80
|
+
message: `would write ${configPath}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
await writeText(configPath, `${JSON.stringify(next, null, 2)}\n`);
|
|
84
|
+
return {
|
|
85
|
+
id: "claude",
|
|
86
|
+
name: this.name,
|
|
87
|
+
success: true,
|
|
88
|
+
configPath,
|
|
89
|
+
message: `${PROVIDER_NAME} applied to Claude Code`,
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
async reset(opts = {}) {
|
|
93
|
+
const configPath = claudeSettingsPath(opts.homeDir);
|
|
94
|
+
const existing = await readJsonFile(configPath);
|
|
95
|
+
if (!existing) {
|
|
96
|
+
return {
|
|
97
|
+
id: "claude",
|
|
98
|
+
name: this.name,
|
|
99
|
+
success: true,
|
|
100
|
+
message: "no settings file",
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (existing.env) {
|
|
104
|
+
for (const k of CLAUDE_ENV_KEYS) {
|
|
105
|
+
delete existing.env[k];
|
|
106
|
+
}
|
|
107
|
+
if (Object.keys(existing.env).length === 0)
|
|
108
|
+
delete existing.env;
|
|
109
|
+
}
|
|
110
|
+
if (opts.dryRun) {
|
|
111
|
+
return {
|
|
112
|
+
id: "claude",
|
|
113
|
+
name: this.name,
|
|
114
|
+
success: true,
|
|
115
|
+
message: `would reset ${configPath}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
await writeText(configPath, `${JSON.stringify(existing, null, 2)}\n`);
|
|
119
|
+
return {
|
|
120
|
+
id: "claude",
|
|
121
|
+
name: this.name,
|
|
122
|
+
success: true,
|
|
123
|
+
message: "InferHub env keys removed from Claude Code settings",
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../src/adapters/cline.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,aAAa,CAAC;AA4BrB,eAAO,MAAM,YAAY,EAAE,YAyG1B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { DEFAULT_BASE_URL, PROVIDER_NAME, } from "../constants.js";
|
|
2
|
+
import { commandExists, normalizeBaseUrl, readJsonFile, writeText, } from "../fsutil.js";
|
|
3
|
+
import { clineGlobalStatePath, clineSecretsPath, } from "../paths.js";
|
|
4
|
+
async function isInstalled(homeDir) {
|
|
5
|
+
return commandExists("cline", [clineGlobalStatePath(homeDir)]);
|
|
6
|
+
}
|
|
7
|
+
function isInferhub(state) {
|
|
8
|
+
if (!state)
|
|
9
|
+
return false;
|
|
10
|
+
const url = state.openAiBaseUrl || "";
|
|
11
|
+
const openai = state.actModeApiProvider === "openai" ||
|
|
12
|
+
state.planModeApiProvider === "openai";
|
|
13
|
+
return openai && /inferhub/i.test(url);
|
|
14
|
+
}
|
|
15
|
+
export const clineAdapter = {
|
|
16
|
+
id: "cline",
|
|
17
|
+
name: "Cline",
|
|
18
|
+
description: "Cline CLI (~/.cline/data/globalState.json + secrets.json)",
|
|
19
|
+
async status(opts = {}) {
|
|
20
|
+
const configPath = clineGlobalStatePath(opts.homeDir);
|
|
21
|
+
const installed = await isInstalled(opts.homeDir);
|
|
22
|
+
const state = await readJsonFile(configPath);
|
|
23
|
+
const configured = isInferhub(state);
|
|
24
|
+
return {
|
|
25
|
+
id: "cline",
|
|
26
|
+
name: this.name,
|
|
27
|
+
installed,
|
|
28
|
+
configured,
|
|
29
|
+
configPath: installed || state ? configPath : null,
|
|
30
|
+
details: {
|
|
31
|
+
actModeApiProvider: state?.actModeApiProvider ?? null,
|
|
32
|
+
planModeApiProvider: state?.planModeApiProvider ?? null,
|
|
33
|
+
openAiBaseUrl: state?.openAiBaseUrl ?? null,
|
|
34
|
+
openAiModelId: state?.openAiModelId ?? null,
|
|
35
|
+
},
|
|
36
|
+
message: installed
|
|
37
|
+
? configured
|
|
38
|
+
? "pointed at InferHub"
|
|
39
|
+
: "installed, InferHub not set"
|
|
40
|
+
: "Cline not detected",
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
async apply(opts) {
|
|
44
|
+
if (!opts.model) {
|
|
45
|
+
return {
|
|
46
|
+
id: "cline",
|
|
47
|
+
name: this.name,
|
|
48
|
+
success: false,
|
|
49
|
+
message: "model is required for Cline",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const statePath = clineGlobalStatePath(opts.homeDir);
|
|
53
|
+
const secretsPath = clineSecretsPath(opts.homeDir);
|
|
54
|
+
const baseUrl = normalizeBaseUrl(opts.baseUrl ?? DEFAULT_BASE_URL);
|
|
55
|
+
const state = (await readJsonFile(statePath)) ??
|
|
56
|
+
{};
|
|
57
|
+
const secrets = (await readJsonFile(secretsPath)) ?? {};
|
|
58
|
+
state.actModeApiProvider = "openai";
|
|
59
|
+
state.planModeApiProvider = "openai";
|
|
60
|
+
state.openAiBaseUrl = baseUrl;
|
|
61
|
+
state.openAiModelId = opts.model;
|
|
62
|
+
secrets.openAiApiKey = opts.apiKey;
|
|
63
|
+
if (opts.dryRun) {
|
|
64
|
+
return {
|
|
65
|
+
id: "cline",
|
|
66
|
+
name: this.name,
|
|
67
|
+
success: true,
|
|
68
|
+
dryRun: true,
|
|
69
|
+
configPath: statePath,
|
|
70
|
+
message: `would write ${statePath} and ${secretsPath}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
await writeText(statePath, `${JSON.stringify(state, null, 2)}\n`);
|
|
74
|
+
await writeText(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`);
|
|
75
|
+
return {
|
|
76
|
+
id: "cline",
|
|
77
|
+
name: this.name,
|
|
78
|
+
success: true,
|
|
79
|
+
configPath: statePath,
|
|
80
|
+
message: `${PROVIDER_NAME} applied to Cline (OpenAI-compatible)`,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
async reset(opts = {}) {
|
|
84
|
+
const statePath = clineGlobalStatePath(opts.homeDir);
|
|
85
|
+
const secretsPath = clineSecretsPath(opts.homeDir);
|
|
86
|
+
const state = await readJsonFile(statePath);
|
|
87
|
+
if (!state || !isInferhub(state)) {
|
|
88
|
+
return {
|
|
89
|
+
id: "cline",
|
|
90
|
+
name: this.name,
|
|
91
|
+
success: true,
|
|
92
|
+
message: "no InferHub config on Cline",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
delete state.openAiBaseUrl;
|
|
96
|
+
delete state.openAiModelId;
|
|
97
|
+
// leave provider as openai — user can re-point; only clear our URL
|
|
98
|
+
if (!opts.dryRun) {
|
|
99
|
+
await writeText(statePath, `${JSON.stringify(state, null, 2)}\n`);
|
|
100
|
+
const secrets = await readJsonFile(secretsPath);
|
|
101
|
+
if (secrets?.openAiApiKey) {
|
|
102
|
+
delete secrets.openAiApiKey;
|
|
103
|
+
await writeText(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
id: "cline",
|
|
108
|
+
name: this.name,
|
|
109
|
+
success: true,
|
|
110
|
+
message: "InferHub settings cleared from Cline",
|
|
111
|
+
};
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=cline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cline.js","sourceRoot":"","sources":["../../src/adapters/cline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,aAAa,CAAC;AASrB,eAAO,MAAM,YAAY,EAAE,YA6H1B,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { CODEX_API_KEY_FIELD, DEFAULT_BASE_URL, PROVIDER_ID, PROVIDER_NAME, } from "../constants.js";
|
|
2
|
+
import { commandExists, normalizeBaseUrl, readJsonFile, readText, removeTomlKey, removeTomlTable, tomlGetString, tomlHasTable, upsertTomlString, upsertTomlTable, writeText, } from "../fsutil.js";
|
|
3
|
+
import { codexAuthPath, codexConfigPath } from "../paths.js";
|
|
4
|
+
const PROVIDER_SECTION = `model_providers.${PROVIDER_ID}`;
|
|
5
|
+
const SUBAGENT_SECTION = "agents.subagent";
|
|
6
|
+
async function isInstalled(homeDir) {
|
|
7
|
+
return commandExists("codex", [codexConfigPath(homeDir)]);
|
|
8
|
+
}
|
|
9
|
+
export const codexAdapter = {
|
|
10
|
+
id: "codex",
|
|
11
|
+
name: "OpenAI Codex",
|
|
12
|
+
description: "Codex CLI (~/.codex/config.toml + auth.json)",
|
|
13
|
+
async status(opts = {}) {
|
|
14
|
+
const configPath = codexConfigPath(opts.homeDir);
|
|
15
|
+
const installed = await isInstalled(opts.homeDir);
|
|
16
|
+
const toml = await readText(configPath);
|
|
17
|
+
const provider = tomlGetString(toml ?? "", "model_provider");
|
|
18
|
+
const configured = !!toml &&
|
|
19
|
+
(provider === PROVIDER_ID || tomlHasTable(toml, PROVIDER_SECTION));
|
|
20
|
+
return {
|
|
21
|
+
id: "codex",
|
|
22
|
+
name: this.name,
|
|
23
|
+
installed,
|
|
24
|
+
configured,
|
|
25
|
+
configPath: installed || toml ? configPath : null,
|
|
26
|
+
details: {
|
|
27
|
+
modelProvider: provider,
|
|
28
|
+
model: toml ? tomlGetString(toml, "model") : null,
|
|
29
|
+
hasProviderTable: toml ? tomlHasTable(toml, PROVIDER_SECTION) : false,
|
|
30
|
+
authPath: codexAuthPath(opts.homeDir),
|
|
31
|
+
},
|
|
32
|
+
message: installed
|
|
33
|
+
? configured
|
|
34
|
+
? "pointed at InferHub"
|
|
35
|
+
: "installed, not configured for InferHub"
|
|
36
|
+
: "Codex CLI not detected",
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
async apply(opts) {
|
|
40
|
+
if (!opts.model) {
|
|
41
|
+
return {
|
|
42
|
+
id: "codex",
|
|
43
|
+
name: this.name,
|
|
44
|
+
success: false,
|
|
45
|
+
message: "model is required for Codex",
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const configPath = codexConfigPath(opts.homeDir);
|
|
49
|
+
const authPath = codexAuthPath(opts.homeDir);
|
|
50
|
+
const baseUrl = normalizeBaseUrl(opts.baseUrl ?? DEFAULT_BASE_URL);
|
|
51
|
+
let toml = (await readText(configPath)) ?? "";
|
|
52
|
+
toml = upsertTomlString(toml, "model", opts.model);
|
|
53
|
+
toml = upsertTomlString(toml, "model_provider", PROVIDER_ID);
|
|
54
|
+
toml = upsertTomlTable(toml, PROVIDER_SECTION, {
|
|
55
|
+
name: PROVIDER_NAME,
|
|
56
|
+
base_url: baseUrl,
|
|
57
|
+
wire_api: "responses",
|
|
58
|
+
});
|
|
59
|
+
toml = upsertTomlTable(toml, SUBAGENT_SECTION, {
|
|
60
|
+
model: opts.subagentModel || opts.model,
|
|
61
|
+
});
|
|
62
|
+
const auth = (await readJsonFile(authPath)) ?? {};
|
|
63
|
+
auth[CODEX_API_KEY_FIELD] = opts.apiKey;
|
|
64
|
+
auth.auth_mode = "apikey";
|
|
65
|
+
if (opts.dryRun) {
|
|
66
|
+
return {
|
|
67
|
+
id: "codex",
|
|
68
|
+
name: this.name,
|
|
69
|
+
success: true,
|
|
70
|
+
dryRun: true,
|
|
71
|
+
configPath,
|
|
72
|
+
message: `would write ${configPath} and ${authPath}`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
await writeText(configPath, toml.endsWith("\n") ? toml : `${toml}\n`);
|
|
76
|
+
await writeText(authPath, `${JSON.stringify(auth, null, 2)}\n`);
|
|
77
|
+
return {
|
|
78
|
+
id: "codex",
|
|
79
|
+
name: this.name,
|
|
80
|
+
success: true,
|
|
81
|
+
configPath,
|
|
82
|
+
message: `${PROVIDER_NAME} applied to Codex (provider=${PROVIDER_ID}, wire_api=responses)`,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
async reset(opts = {}) {
|
|
86
|
+
const configPath = codexConfigPath(opts.homeDir);
|
|
87
|
+
const authPath = codexAuthPath(opts.homeDir);
|
|
88
|
+
let toml = await readText(configPath);
|
|
89
|
+
if (toml == null) {
|
|
90
|
+
return {
|
|
91
|
+
id: "codex",
|
|
92
|
+
name: this.name,
|
|
93
|
+
success: true,
|
|
94
|
+
message: "no config file",
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (tomlGetString(toml, "model_provider") === PROVIDER_ID) {
|
|
98
|
+
toml = removeTomlKey(toml, "model");
|
|
99
|
+
toml = removeTomlKey(toml, "model_provider");
|
|
100
|
+
}
|
|
101
|
+
toml = removeTomlTable(toml, PROVIDER_SECTION);
|
|
102
|
+
toml = removeTomlTable(toml, SUBAGENT_SECTION);
|
|
103
|
+
if (!opts.dryRun) {
|
|
104
|
+
await writeText(configPath, toml);
|
|
105
|
+
const auth = await readJsonFile(authPath);
|
|
106
|
+
if (auth) {
|
|
107
|
+
delete auth[CODEX_API_KEY_FIELD];
|
|
108
|
+
delete auth.auth_mode;
|
|
109
|
+
if (Object.keys(auth).length === 0) {
|
|
110
|
+
// leave empty object rather than deleting — safer on Windows locks
|
|
111
|
+
await writeText(authPath, "{}\n");
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
await writeText(authPath, `${JSON.stringify(auth, null, 2)}\n`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
id: "codex",
|
|
120
|
+
name: this.name,
|
|
121
|
+
success: true,
|
|
122
|
+
message: "InferHub provider removed from Codex config",
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hermes.d.ts","sourceRoot":"","sources":["../../src/adapters/hermes.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,aAAa,CAAC;AAoDrB,eAAO,MAAM,aAAa,EAAE,YA2G3B,CAAC"}
|