agent-phonon 0.2.2 → 0.2.4
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/dist/cli.js +105 -21
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +4 -0
- package/dist/daemon.js +30 -10
- package/dist/daemon.js.map +1 -1
- package/package.json +2 -2
package/dist/cli.js
CHANGED
|
@@ -4245,11 +4245,12 @@ var OpenClawGatewayAdapter = class {
|
|
|
4245
4245
|
if (subAgents.length === 0)
|
|
4246
4246
|
subAgents = [{ id: this.defaultAgent }];
|
|
4247
4247
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
4248
|
+
const gatewayModels = await this.listGatewayModels();
|
|
4248
4249
|
return subAgents.map((a) => {
|
|
4249
4250
|
if (a.workspace)
|
|
4250
4251
|
this.workspaceCache.set(`openclaw:${a.id}`, a.workspace);
|
|
4251
4252
|
const primaryModel = typeof a.model === "string" ? a.model : a.model?.primary;
|
|
4252
|
-
const models = primaryModel ? [{ id: primaryModel, available: true }] : [];
|
|
4253
|
+
const models = gatewayModels.length > 0 ? gatewayModels : primaryModel ? [{ id: primaryModel, available: true }] : [];
|
|
4253
4254
|
return {
|
|
4254
4255
|
// 复合 agentId:openclaw:<subAgentId>(design D32)
|
|
4255
4256
|
agentId: `openclaw:${a.id}`,
|
|
@@ -4262,6 +4263,32 @@ var OpenClawGatewayAdapter = class {
|
|
|
4262
4263
|
};
|
|
4263
4264
|
});
|
|
4264
4265
|
}
|
|
4266
|
+
async listGatewayModels() {
|
|
4267
|
+
try {
|
|
4268
|
+
const r = await this.gw.rpc("models.list", { view: "all" }, 8e3);
|
|
4269
|
+
const rows = Array.isArray(r.models) ? r.models : [];
|
|
4270
|
+
const models = [];
|
|
4271
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4272
|
+
for (const row of rows) {
|
|
4273
|
+
const id = typeof row.key === "string" ? row.key : typeof row.id === "string" ? row.id : void 0;
|
|
4274
|
+
if (!id || seen.has(id))
|
|
4275
|
+
continue;
|
|
4276
|
+
if (row.available === false || row.missing === true)
|
|
4277
|
+
continue;
|
|
4278
|
+
seen.add(id);
|
|
4279
|
+
const contextWindow = typeof row.contextWindow === "number" ? row.contextWindow : typeof row.contextTokens === "number" ? row.contextTokens : void 0;
|
|
4280
|
+
models.push({
|
|
4281
|
+
id,
|
|
4282
|
+
...typeof row.name === "string" ? { displayName: row.name } : {},
|
|
4283
|
+
...contextWindow && contextWindow > 0 ? { contextWindow } : {},
|
|
4284
|
+
available: true
|
|
4285
|
+
});
|
|
4286
|
+
}
|
|
4287
|
+
return models;
|
|
4288
|
+
} catch {
|
|
4289
|
+
return [];
|
|
4290
|
+
}
|
|
4291
|
+
}
|
|
4265
4292
|
async createSession(params) {
|
|
4266
4293
|
await this.gw.connect();
|
|
4267
4294
|
const subAgent = params.agentConfig?.openclawAgent ?? (params.agentId.includes(":") ? params.agentId.split(":")[1] : this.defaultAgent);
|
|
@@ -4814,10 +4841,7 @@ var CodexAdapter = class {
|
|
|
4814
4841
|
available,
|
|
4815
4842
|
...available ? {} : { unavailableReason: "codex CLI not found" },
|
|
4816
4843
|
...version ? { version } : {},
|
|
4817
|
-
models: [
|
|
4818
|
-
{ id: "gpt-5.5", displayName: "GPT-5.5", available: true },
|
|
4819
|
-
{ id: "gpt-5.3-codex", displayName: "GPT-5.3 Codex", available: true }
|
|
4820
|
-
],
|
|
4844
|
+
models: this.env.models?.length ? this.env.models : [{ id: this.env.defaultModel, available: true }],
|
|
4821
4845
|
capabilities: CAPABILITIES2,
|
|
4822
4846
|
scannedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
4823
4847
|
}];
|
|
@@ -5685,11 +5709,7 @@ var ClaudeCodeAdapter = class {
|
|
|
5685
5709
|
available,
|
|
5686
5710
|
...available ? {} : { unavailableReason: "claude CLI not found" },
|
|
5687
5711
|
...version ? { version } : {},
|
|
5688
|
-
models: [
|
|
5689
|
-
{ id: "claude-opus-4.6", displayName: "Claude Opus 4.6", available: true },
|
|
5690
|
-
{ id: "claude-opus-4.7", displayName: "Claude Opus 4.7", available: true },
|
|
5691
|
-
{ id: "claude-sonnet-4.6", displayName: "Claude Sonnet 4.6", available: true }
|
|
5692
|
-
],
|
|
5712
|
+
models: this.env.models?.length ? this.env.models : [{ id: this.env.defaultModel, available: true }],
|
|
5693
5713
|
capabilities: CAPABILITIES5,
|
|
5694
5714
|
scannedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
5695
5715
|
}];
|
|
@@ -6383,6 +6403,65 @@ function gatewayReachable(url) {
|
|
|
6383
6403
|
return false;
|
|
6384
6404
|
}
|
|
6385
6405
|
}
|
|
6406
|
+
function openCodeBin() {
|
|
6407
|
+
const bundled = join12(homedir10(), ".opencode", "bin", "opencode");
|
|
6408
|
+
return existsSync12(bundled) ? bundled : "opencode";
|
|
6409
|
+
}
|
|
6410
|
+
function modelInfosFromProvider(provider) {
|
|
6411
|
+
const raw = Array.isArray(provider.models) ? provider.models : [];
|
|
6412
|
+
const out = [];
|
|
6413
|
+
const seen = /* @__PURE__ */ new Set();
|
|
6414
|
+
for (const m of raw) {
|
|
6415
|
+
const row = m;
|
|
6416
|
+
const id = typeof row.id === "string" ? row.id : typeof row.key === "string" ? row.key : void 0;
|
|
6417
|
+
if (!id || seen.has(id)) continue;
|
|
6418
|
+
seen.add(id);
|
|
6419
|
+
const contextWindow = typeof row.contextWindow === "number" ? row.contextWindow : typeof row.contextTokens === "number" ? row.contextTokens : void 0;
|
|
6420
|
+
out.push({
|
|
6421
|
+
id,
|
|
6422
|
+
...typeof row.name === "string" ? { displayName: row.name } : {},
|
|
6423
|
+
...contextWindow && contextWindow > 0 ? { contextWindow } : {},
|
|
6424
|
+
available: true
|
|
6425
|
+
});
|
|
6426
|
+
}
|
|
6427
|
+
return out;
|
|
6428
|
+
}
|
|
6429
|
+
function readDefaultLlmGateway() {
|
|
6430
|
+
try {
|
|
6431
|
+
const p = join12(homedir10(), ".openclaw", "openclaw.json");
|
|
6432
|
+
const j = JSON.parse(readFileSync5(p, "utf8"));
|
|
6433
|
+
const provider = j.models?.providers?.["phgeek-gw"];
|
|
6434
|
+
if (provider?.baseUrl && provider?.apiKey) {
|
|
6435
|
+
const models = modelInfosFromProvider(provider);
|
|
6436
|
+
return { baseUrl: provider.baseUrl.replace(/\/$/, ""), apiKey: provider.apiKey, models, claudeModels: models.filter((m) => m.id.toLowerCase().includes("claude")) };
|
|
6437
|
+
}
|
|
6438
|
+
} catch {
|
|
6439
|
+
}
|
|
6440
|
+
const baseUrl = process.env.PHONON_LLM_BASE_URL;
|
|
6441
|
+
const apiKey = process.env.PHONON_LLM_API_KEY;
|
|
6442
|
+
return baseUrl && apiKey ? { baseUrl: baseUrl.replace(/\/$/, ""), apiKey, models: [], claudeModels: [] } : void 0;
|
|
6443
|
+
}
|
|
6444
|
+
function autoDetectAdapters(adapters) {
|
|
6445
|
+
const out = [...adapters];
|
|
6446
|
+
const has = (type2) => out.some((a) => a.type === type2);
|
|
6447
|
+
if (!has("hermes") && probe("hermes").ok) out.push({ type: "hermes" });
|
|
6448
|
+
const ocBin = openCodeBin();
|
|
6449
|
+
if (!has("opencode") && probe(ocBin).ok) out.push({ type: "opencode", opencodeBinPath: ocBin === "opencode" ? void 0 : ocBin });
|
|
6450
|
+
const gw = readDefaultLlmGateway();
|
|
6451
|
+
if (gw) {
|
|
6452
|
+
for (const a of out) {
|
|
6453
|
+
if (a.type === "claude-code" && !a.claudeModels?.length) a.claudeModels = gw.claudeModels;
|
|
6454
|
+
if (a.type === "codex" && !a.codexModels?.length) a.codexModels = gw.models;
|
|
6455
|
+
}
|
|
6456
|
+
if (!has("claude-code") && probe("claude").ok) {
|
|
6457
|
+
out.push({ type: "claude-code", claudeBaseUrl: gw.baseUrl, claudeAuthToken: gw.apiKey, claudeDefaultModel: "claude-opus-4.8", claudeModels: gw.claudeModels });
|
|
6458
|
+
}
|
|
6459
|
+
if (!has("codex") && probe("codex").ok) {
|
|
6460
|
+
out.push({ type: "codex", codexBaseUrl: `${gw.baseUrl}/v1`, codexApiKey: gw.apiKey, codexDefaultModel: "gpt-5.5", codexWireApi: "responses", codexModels: gw.models });
|
|
6461
|
+
}
|
|
6462
|
+
}
|
|
6463
|
+
return out;
|
|
6464
|
+
}
|
|
6386
6465
|
function cmdDoctor() {
|
|
6387
6466
|
console.log("agent-phonon doctor\n");
|
|
6388
6467
|
const gwToken = readOpenClawGatewayToken();
|
|
@@ -6396,13 +6475,14 @@ function cmdDoctor() {
|
|
|
6396
6475
|
const p = probe(bin);
|
|
6397
6476
|
console.log(` ${name} (${bin}): ${p.ok ? "\u2713 " + p.out : "\u2717 not found"}`);
|
|
6398
6477
|
}
|
|
6399
|
-
const ocBin =
|
|
6478
|
+
const ocBin = openCodeBin();
|
|
6400
6479
|
const oc = probe(ocBin);
|
|
6401
6480
|
console.log(` OpenCode (${ocBin}): ${oc.ok ? "\u2713 " + oc.out : "\u2717 not found"}`);
|
|
6402
6481
|
console.log("");
|
|
6403
6482
|
try {
|
|
6404
6483
|
const cfg = loadConfig();
|
|
6405
|
-
|
|
6484
|
+
const effective = autoDetectAdapters(cfg.adapters);
|
|
6485
|
+
console.log(`config: ${cfg.adapters.length} configured adapter(s), ${effective.length} effective adapter(s), ${cfg.servers.length} server(s)`);
|
|
6406
6486
|
} catch {
|
|
6407
6487
|
console.log("config: not initialized (run: agent-phonon init)");
|
|
6408
6488
|
}
|
|
@@ -6428,14 +6508,14 @@ async function cmdDiscover() {
|
|
|
6428
6508
|
}
|
|
6429
6509
|
function buildRegistry(adapters) {
|
|
6430
6510
|
const reg = new AdapterRegistry();
|
|
6431
|
-
for (const a of adapters) {
|
|
6511
|
+
for (const a of autoDetectAdapters(adapters)) {
|
|
6432
6512
|
if (a.type === "openclaw-gateway") {
|
|
6433
6513
|
const token = a.gatewayToken ?? readOpenClawGatewayToken();
|
|
6434
6514
|
if (token) reg.register(new OpenClawGatewayAdapter({ gateway: { baseUrl: a.gatewayUrl ?? "ws://127.0.0.1:18789", token }, defaultAgent: a.defaultAgent ?? "main" }));
|
|
6435
6515
|
} else if (a.type === "claude-code" && a.claudeBaseUrl && a.claudeAuthToken) {
|
|
6436
|
-
reg.register(new ClaudeCodeAdapter({ env: { baseUrl: a.claudeBaseUrl, authToken: a.claudeAuthToken, defaultModel: a.claudeDefaultModel ?? "claude-opus-4.6" } }));
|
|
6516
|
+
reg.register(new ClaudeCodeAdapter({ env: { baseUrl: a.claudeBaseUrl, authToken: a.claudeAuthToken, defaultModel: a.claudeDefaultModel ?? "claude-opus-4.6", models: a.claudeModels } }));
|
|
6437
6517
|
} else if (a.type === "codex" && a.codexBaseUrl && a.codexApiKey) {
|
|
6438
|
-
reg.register(new CodexAdapter({ env: { baseUrl: a.codexBaseUrl, apiKey: a.codexApiKey, defaultModel: a.codexDefaultModel ?? "gpt-5.5", wireApi: a.codexWireApi ?? "responses" } }));
|
|
6518
|
+
reg.register(new CodexAdapter({ env: { baseUrl: a.codexBaseUrl, apiKey: a.codexApiKey, defaultModel: a.codexDefaultModel ?? "gpt-5.5", models: a.codexModels, wireApi: a.codexWireApi ?? "responses" } }));
|
|
6439
6519
|
} else if (a.type === "hermes") {
|
|
6440
6520
|
reg.register(new HermesAdapter({ env: { defaultModel: a.hermesModel, provider: a.hermesProvider } }));
|
|
6441
6521
|
} else if (a.type === "opencode") {
|
|
@@ -6476,11 +6556,15 @@ function cmdAdapterAdd(type2, opts) {
|
|
|
6476
6556
|
}
|
|
6477
6557
|
function cmdAdapterList() {
|
|
6478
6558
|
const cfg = loadConfig();
|
|
6479
|
-
|
|
6480
|
-
|
|
6559
|
+
const effective = autoDetectAdapters(cfg.adapters);
|
|
6560
|
+
if (effective.length === 0) {
|
|
6561
|
+
console.log("(no adapters available)");
|
|
6481
6562
|
return;
|
|
6482
6563
|
}
|
|
6483
|
-
for (const a of
|
|
6564
|
+
for (const a of effective) {
|
|
6565
|
+
const auto = cfg.adapters.some((x) => x.type === a.type) ? "" : " [auto]";
|
|
6566
|
+
console.log(`- ${a.type}${a.defaultAgent ? ` (agent: ${a.defaultAgent})` : ""}${auto}`);
|
|
6567
|
+
}
|
|
6484
6568
|
}
|
|
6485
6569
|
function cmdPluginInstall(which) {
|
|
6486
6570
|
if (which !== "openclaw") return fail(`plugin install supports: openclaw (got: ${which})`);
|
|
@@ -6576,7 +6660,7 @@ async function main() {
|
|
|
6576
6660
|
break;
|
|
6577
6661
|
case "discover":
|
|
6578
6662
|
await cmdDiscover();
|
|
6579
|
-
|
|
6663
|
+
process.exit(0);
|
|
6580
6664
|
case "adapter": {
|
|
6581
6665
|
const sub = args[0];
|
|
6582
6666
|
if (sub === "add") cmdAdapterAdd(args[1] ?? "", { gatewayUrl: opt("gateway-url"), token: opt("token"), defaultAgent: opt("agent"), baseUrl: opt("base-url"), apiKey: opt("api-key"), model: opt("model"), provider: opt("provider"), wireApi: opt("wire-api"), bin: opt("bin") });
|
|
@@ -6601,8 +6685,8 @@ async function main() {
|
|
|
6601
6685
|
console.log("setup:");
|
|
6602
6686
|
console.log(" init generate default config");
|
|
6603
6687
|
console.log(" doctor check agent availability / Gateway / plugin");
|
|
6604
|
-
console.log(" adapter add <type> [opts] configure an adapter (
|
|
6605
|
-
console.log(" adapter list list configured adapters");
|
|
6688
|
+
console.log(" adapter add <type> [opts] configure an adapter override (auto-detect covers common local agents)");
|
|
6689
|
+
console.log(" adapter list list configured + auto-detected adapters");
|
|
6606
6690
|
console.log(" plugin install openclaw install OpenClaw HITL plugin");
|
|
6607
6691
|
console.log(" server add <url> [--trust-local] [--device-key <k>]");
|
|
6608
6692
|
console.log(" server list");
|