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 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 = existsSync12(join12(homedir10(), ".opencode", "bin", "opencode")) ? join12(homedir10(), ".opencode", "bin", "opencode") : "opencode";
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
- console.log(`config: ${cfg.adapters.length} adapter(s), ${cfg.servers.length} server(s)`);
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
- if (cfg.adapters.length === 0) {
6480
- console.log("(no adapters configured)");
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 cfg.adapters) console.log(`- ${a.type}${a.defaultAgent ? ` (agent: ${a.defaultAgent})` : ""}`);
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
- break;
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 (openclaw|claude-code|codex|hermes|opencode)");
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");