@moxxy/cli 1.3.0 → 1.3.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moxxy/cli",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "CLI for the Moxxy agentic framework — manage agents, skills, plugins, channels, and vaults from the terminal",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,5 +50,8 @@
50
50
  "marked": "^15.0.0",
51
51
  "react": "^19.0.0",
52
52
  "tsx": "^4.21.0"
53
+ },
54
+ "devDependencies": {
55
+ "react-devtools-core": "file:./stubs/react-devtools-core"
53
56
  }
54
57
  }
package/src/cli.js CHANGED
@@ -137,8 +137,10 @@ async function routeCommand(client, command, rest) {
137
137
  return;
138
138
  }
139
139
 
140
- clearScreen();
141
- console.log(LOGO);
140
+ if (isInteractive()) {
141
+ clearScreen();
142
+ console.log(LOGO);
143
+ }
142
144
 
143
145
  switch (command) {
144
146
  case 'init':
@@ -7,6 +7,7 @@ import { isInteractive, handleCancel, withSpinner, showResult, p } from '../ui.j
7
7
  import { spawn } from 'node:child_process';
8
8
  import { createHash, randomBytes } from 'node:crypto';
9
9
  import { createServer } from 'node:http';
10
+ import { BUILTIN_PROVIDERS } from './providers/index.js';
10
11
 
11
12
  const OPENAI_API_BASE = 'https://api.openai.com/v1';
12
13
  export const OPENAI_CODEX_PROVIDER_ID = 'openai-codex';
@@ -41,12 +42,12 @@ const ANTHROPIC_OAUTH_SESSION_MODE = 'anthropic_oauth_session';
41
42
  const OLLAMA_PROVIDER_ID = 'ollama';
42
43
  const OLLAMA_API_BASE = 'http://127.0.0.1:11434/v1';
43
44
  const OPENAI_CODEX_MODEL_IDS = [
45
+ 'gpt-5.4',
46
+ 'gpt-5.4-mini',
47
+ 'gpt-5.4-nano',
44
48
  'gpt-5.3-codex',
45
- 'gpt-5.2-codex',
46
- 'gpt-5.1-codex',
47
- 'gpt-5.1-codex-mini',
48
- 'gpt-5.1-codex-max',
49
49
  'gpt-5.2',
50
+ 'gpt-5.2-codex',
50
51
  'gpt-4.1',
51
52
  'gpt-4.1-mini',
52
53
  'gpt-4.1-nano',
@@ -813,6 +814,22 @@ async function fetchOllamaModels(apiBase = OLLAMA_API_BASE) {
813
814
  return [];
814
815
  }
815
816
 
817
+ export function getProviderCatalog() {
818
+ return BUILTIN_PROVIDERS.map(bp => ({
819
+ id: bp.id,
820
+ display_name: bp.display_name,
821
+ api_base: bp.api_base ?? null,
822
+ api_key_env: bp.api_key_env ?? null,
823
+ cli_binary: bp.cli_binary ?? null,
824
+ api_key_login: Boolean(bp.api_key_login),
825
+ oauth_login: Boolean(bp.oauth_login),
826
+ models: (bp.models ?? []).map(m => ({
827
+ model_id: m.model_id,
828
+ display_name: m.display_name ?? m.model_id,
829
+ })),
830
+ }));
831
+ }
832
+
816
833
  export async function resolveBuiltinProviderModels(builtin) {
817
834
  const fallbackModels = builtin.models.map(model => ({
818
835
  ...model,
@@ -1500,135 +1517,10 @@ export async function checkProviderCredentials(builtin, client) {
1500
1517
  }
1501
1518
 
1502
1519
  // ── Built-in Provider Catalog ────────────────────────────────────────────────
1520
+ // Each provider lives in its own file under ./providers/ — see providers/index.js.
1521
+ // Re-exported here for back-compat with existing importers.
1503
1522
 
1504
- export const BUILTIN_PROVIDERS = [
1505
- {
1506
- id: 'anthropic',
1507
- display_name: 'Anthropic',
1508
- api_key_env: 'ANTHROPIC_API_KEY',
1509
- api_base: 'https://api.anthropic.com',
1510
- api_key_login: true,
1511
- oauth_login: true,
1512
- models: [
1513
- { model_id: 'claude-sonnet-5-20260203', display_name: 'Claude Sonnet 5 "Fennec"' },
1514
- { model_id: 'claude-opus-4-20250514', display_name: 'Claude Opus 4' },
1515
- { model_id: 'claude-sonnet-4-20250514', display_name: 'Claude Sonnet 4' },
1516
- { model_id: 'claude-haiku-4-20250506', display_name: 'Claude Haiku 4' },
1517
- { model_id: 'claude-3-5-sonnet-20241022', display_name: 'Claude 3.5 Sonnet' },
1518
- { model_id: 'claude-3-5-haiku-20241022', display_name: 'Claude 3.5 Haiku' },
1519
- ],
1520
- },
1521
- {
1522
- id: 'openai',
1523
- display_name: 'OpenAI',
1524
- api_key_env: 'OPENAI_API_KEY',
1525
- api_base: OPENAI_API_BASE,
1526
- models: [
1527
- { model_id: 'gpt-5.2', display_name: 'GPT-5.2' },
1528
- { model_id: 'gpt-4.1', display_name: 'GPT-4.1' },
1529
- { model_id: 'gpt-4.1-mini', display_name: 'GPT-4.1 Mini' },
1530
- { model_id: 'gpt-4.1-nano', display_name: 'GPT-4.1 Nano' },
1531
- { model_id: 'o3', display_name: 'o3' },
1532
- { model_id: 'o4-mini', display_name: 'o4-mini' },
1533
- { model_id: 'gpt-4o', display_name: 'GPT-4o' },
1534
- { model_id: 'gpt-4o-mini', display_name: 'GPT-4o Mini' },
1535
- ],
1536
- },
1537
- {
1538
- id: OPENAI_CODEX_PROVIDER_ID,
1539
- display_name: OPENAI_CODEX_DISPLAY_NAME,
1540
- api_key_env: OPENAI_CODEX_SECRET_KEY_NAME,
1541
- api_base: OPENAI_API_BASE,
1542
- oauth_login: true,
1543
- models: [
1544
- { model_id: 'gpt-5.2', display_name: 'GPT-5.2' },
1545
- { model_id: 'gpt-4.1', display_name: 'GPT-4.1' },
1546
- { model_id: 'gpt-4.1-mini', display_name: 'GPT-4.1 Mini' },
1547
- { model_id: 'gpt-4.1-nano', display_name: 'GPT-4.1 Nano' },
1548
- { model_id: 'o3', display_name: 'o3' },
1549
- { model_id: 'o4-mini', display_name: 'o4-mini' },
1550
- { model_id: 'gpt-4o', display_name: 'GPT-4o' },
1551
- { model_id: 'gpt-4o-mini', display_name: 'GPT-4o Mini' },
1552
- ],
1553
- },
1554
- {
1555
- id: OLLAMA_PROVIDER_ID,
1556
- display_name: 'Ollama',
1557
- api_base: OLLAMA_API_BASE,
1558
- models: [
1559
- { model_id: 'qwen3:8b', display_name: 'Qwen 3 8B' },
1560
- { model_id: 'gemma3', display_name: 'Gemma 3' },
1561
- { model_id: 'gpt-oss:20b', display_name: 'GPT OSS 20B' },
1562
- ],
1563
- },
1564
- {
1565
- id: 'xai',
1566
- display_name: 'xAI',
1567
- api_key_env: 'XAI_API_KEY',
1568
- api_base: 'https://api.x.ai/v1',
1569
- models: [
1570
- { model_id: 'grok-4', display_name: 'Grok 4' },
1571
- { model_id: 'grok-3', display_name: 'Grok 3' },
1572
- { model_id: 'grok-3-mini', display_name: 'Grok 3 Mini' },
1573
- { model_id: 'grok-3-fast', display_name: 'Grok 3 Fast' },
1574
- { model_id: 'grok-2', display_name: 'Grok 2' },
1575
- ],
1576
- },
1577
- {
1578
- id: 'google',
1579
- display_name: 'Google Gemini',
1580
- api_key_env: 'GOOGLE_API_KEY',
1581
- api_base: 'https://generativelanguage.googleapis.com/v1beta',
1582
- models: [
1583
- { model_id: 'gemini-3.1-pro', display_name: 'Gemini 3.1 Pro' },
1584
- { model_id: 'gemini-2.5-pro', display_name: 'Gemini 2.5 Pro' },
1585
- { model_id: 'gemini-2.5-flash', display_name: 'Gemini 2.5 Flash' },
1586
- { model_id: 'gemini-2.0-flash', display_name: 'Gemini 2.0 Flash' },
1587
- ],
1588
- },
1589
- {
1590
- id: 'deepseek',
1591
- display_name: 'DeepSeek',
1592
- api_key_env: 'DEEPSEEK_API_KEY',
1593
- api_base: 'https://api.deepseek.com',
1594
- models: [
1595
- { model_id: 'deepseek-v4', display_name: 'DeepSeek V4' },
1596
- { model_id: 'deepseek-r1', display_name: 'DeepSeek R1' },
1597
- { model_id: 'deepseek-v3', display_name: 'DeepSeek V3' },
1598
- ],
1599
- },
1600
- {
1601
- id: 'zai',
1602
- display_name: 'ZAI',
1603
- api_key_env: 'ZAI_API_KEY',
1604
- api_base: 'https://api.zai.com/v1',
1605
- models: [
1606
- { model_id: 'zai-pro', display_name: 'ZAI Pro' },
1607
- { model_id: 'zai-standard', display_name: 'ZAI Standard' },
1608
- { model_id: 'zai-fast', display_name: 'ZAI Fast' },
1609
- ],
1610
- },
1611
- {
1612
- id: 'zai-plan',
1613
- display_name: 'ZAI Plan',
1614
- api_key_env: 'ZAI_API_KEY',
1615
- api_base: 'https://api.zai.com/v1',
1616
- models: [
1617
- { model_id: 'zai-plan-pro', display_name: 'ZAI Plan Pro' },
1618
- { model_id: 'zai-plan-standard', display_name: 'ZAI Plan Standard' },
1619
- ],
1620
- },
1621
- {
1622
- id: 'claude-cli',
1623
- display_name: 'Claude Code CLI',
1624
- cli_binary: 'claude',
1625
- models: [
1626
- { model_id: 'opus', display_name: 'Claude Opus' },
1627
- { model_id: 'sonnet', display_name: 'Claude Sonnet' },
1628
- { model_id: 'haiku', display_name: 'Claude Haiku' },
1629
- ],
1630
- },
1631
- ];
1523
+ export { BUILTIN_PROVIDERS };
1632
1524
 
1633
1525
  // ── CLI Command ──────────────────────────────────────────────────────────────
1634
1526
 
@@ -1644,6 +1536,7 @@ export async function runProvider(client, args) {
1644
1536
  { value: 'install', label: 'Install provider', hint: 'add a built-in or custom provider' },
1645
1537
  { value: 'login', label: 'Login provider', hint: 'OAuth/subscription login for supported providers' },
1646
1538
  { value: 'list', label: 'List providers', hint: 'show installed providers' },
1539
+ { value: 'catalog', label: 'Catalog', hint: 'list all built-in providers and their known models' },
1647
1540
  ],
1648
1541
  });
1649
1542
  handleCancel(action);
@@ -1670,6 +1563,23 @@ export async function runProvider(client, args) {
1670
1563
  return result;
1671
1564
  }
1672
1565
 
1566
+ case 'catalog': {
1567
+ const catalog = getProviderCatalog();
1568
+ if (isInteractive() && !flags.json) {
1569
+ p.intro('Built-in provider catalog');
1570
+ for (const pr of catalog) {
1571
+ p.log.info(`${pr.display_name} (${pr.id})`);
1572
+ for (const m of pr.models) {
1573
+ console.log(` - ${m.model_id}${m.display_name ? ` (${m.display_name})` : ''}`);
1574
+ }
1575
+ }
1576
+ p.outro(`${catalog.length} provider(s)`);
1577
+ } else {
1578
+ console.log(JSON.stringify(catalog, null, 2));
1579
+ }
1580
+ return catalog;
1581
+ }
1582
+
1673
1583
  case 'install': {
1674
1584
  if (isInteractive()) {
1675
1585
  return await installInteractive(client);
@@ -1683,7 +1593,7 @@ export async function runProvider(client, args) {
1683
1593
 
1684
1594
  default:
1685
1595
  if (!action) {
1686
- console.error('Usage: moxxy provider <install|login|list>');
1596
+ console.error('Usage: moxxy provider <install|login|list|catalog>');
1687
1597
  } else {
1688
1598
  console.error(`Unknown provider action: ${action}`);
1689
1599
  }
@@ -1916,7 +1826,7 @@ async function installNonInteractive(client, flags) {
1916
1826
 
1917
1827
  // Custom provider
1918
1828
  if (!providerId) {
1919
- throw new Error('Required: --id (provider id). Built-in: openai, openai-codex, anthropic, ollama, xai, zai, zai-plan, claude-cli');
1829
+ throw new Error('Required: --id (provider id). Built-in: openai, openai-codex, anthropic, ollama, xai, google, deepseek, zai, zai-coding-plan, claude-cli');
1920
1830
  }
1921
1831
 
1922
1832
  const displayName = flags.name || flags.display_name || providerId;
@@ -0,0 +1,18 @@
1
+ export default {
2
+ id: 'anthropic',
3
+ display_name: 'Anthropic',
4
+ api_key_env: 'ANTHROPIC_API_KEY',
5
+ api_base: 'https://api.anthropic.com',
6
+ api_key_login: true,
7
+ oauth_login: true,
8
+ models: [
9
+ { model_id: 'claude-opus-4-6', display_name: 'Claude Opus 4.6' },
10
+ { model_id: 'claude-sonnet-4-6', display_name: 'Claude Sonnet 4.6' },
11
+ { model_id: 'claude-haiku-4-5-20251001', display_name: 'Claude Haiku 4.5' },
12
+ { model_id: 'claude-opus-4-5-20251101', display_name: 'Claude Opus 4.5' },
13
+ { model_id: 'claude-sonnet-4-5-20250929', display_name: 'Claude Sonnet 4.5' },
14
+ { model_id: 'claude-opus-4-1-20250805', display_name: 'Claude Opus 4.1' },
15
+ { model_id: 'claude-sonnet-4-20250514', display_name: 'Claude Sonnet 4' },
16
+ { model_id: 'claude-opus-4-20250514', display_name: 'Claude Opus 4' },
17
+ ],
18
+ };
@@ -0,0 +1,10 @@
1
+ export default {
2
+ id: 'claude-cli',
3
+ display_name: 'Claude Code CLI',
4
+ cli_binary: 'claude',
5
+ models: [
6
+ { model_id: 'opus', display_name: 'Claude Opus' },
7
+ { model_id: 'sonnet', display_name: 'Claude Sonnet' },
8
+ { model_id: 'haiku', display_name: 'Claude Haiku' },
9
+ ],
10
+ };
@@ -0,0 +1,11 @@
1
+ export default {
2
+ id: 'deepseek',
3
+ display_name: 'DeepSeek',
4
+ api_key_env: 'DEEPSEEK_API_KEY',
5
+ api_base: 'https://api.deepseek.com',
6
+ models: [
7
+ { model_id: 'deepseek-v4', display_name: 'DeepSeek V4' },
8
+ { model_id: 'deepseek-r1', display_name: 'DeepSeek R1' },
9
+ { model_id: 'deepseek-v3', display_name: 'DeepSeek V3' },
10
+ ],
11
+ };
@@ -0,0 +1,12 @@
1
+ export default {
2
+ id: 'google',
3
+ display_name: 'Google Gemini',
4
+ api_key_env: 'GOOGLE_API_KEY',
5
+ api_base: 'https://generativelanguage.googleapis.com/v1beta',
6
+ models: [
7
+ { model_id: 'gemini-3.1-pro', display_name: 'Gemini 3.1 Pro' },
8
+ { model_id: 'gemini-2.5-pro', display_name: 'Gemini 2.5 Pro' },
9
+ { model_id: 'gemini-2.5-flash', display_name: 'Gemini 2.5 Flash' },
10
+ { model_id: 'gemini-2.0-flash', display_name: 'Gemini 2.0 Flash' },
11
+ ],
12
+ };
@@ -0,0 +1,23 @@
1
+ import anthropic from './anthropic.js';
2
+ import openai from './openai.js';
3
+ import openaiCodex from './openai-codex.js';
4
+ import ollama from './ollama.js';
5
+ import xai from './xai.js';
6
+ import google from './google.js';
7
+ import deepseek from './deepseek.js';
8
+ import zai from './zai.js';
9
+ import zaiCodingPlan from './zai-coding-plan.js';
10
+ import claudeCli from './claude-cli.js';
11
+
12
+ export const BUILTIN_PROVIDERS = [
13
+ anthropic,
14
+ openai,
15
+ openaiCodex,
16
+ ollama,
17
+ xai,
18
+ google,
19
+ deepseek,
20
+ zai,
21
+ zaiCodingPlan,
22
+ claudeCli,
23
+ ];
@@ -0,0 +1,10 @@
1
+ export default {
2
+ id: 'ollama',
3
+ display_name: 'Ollama',
4
+ api_base: 'http://127.0.0.1:11434/v1',
5
+ models: [
6
+ { model_id: 'qwen3:8b', display_name: 'Qwen 3 8B' },
7
+ { model_id: 'gemma3', display_name: 'Gemma 3' },
8
+ { model_id: 'gpt-oss:20b', display_name: 'GPT OSS 20B' },
9
+ ],
10
+ };
@@ -0,0 +1,22 @@
1
+ export default {
2
+ id: 'openai-codex',
3
+ display_name: 'OpenAI (Codex OAuth)',
4
+ api_key_env: 'OPENAI_CODEX_API_KEY',
5
+ api_base: 'https://api.openai.com/v1',
6
+ oauth_login: true,
7
+ models: [
8
+ { model_id: 'gpt-5.4', display_name: 'GPT-5.4' },
9
+ { model_id: 'gpt-5.4-mini', display_name: 'GPT-5.4 Mini' },
10
+ { model_id: 'gpt-5.4-nano', display_name: 'GPT-5.4 Nano' },
11
+ { model_id: 'gpt-5.3-codex', display_name: 'GPT-5.3 Codex' },
12
+ { model_id: 'gpt-5.2', display_name: 'GPT-5.2' },
13
+ { model_id: 'gpt-5.2-codex', display_name: 'GPT-5.2 Codex' },
14
+ { model_id: 'gpt-4.1', display_name: 'GPT-4.1' },
15
+ { model_id: 'gpt-4.1-mini', display_name: 'GPT-4.1 Mini' },
16
+ { model_id: 'gpt-4.1-nano', display_name: 'GPT-4.1 Nano' },
17
+ { model_id: 'o3', display_name: 'o3' },
18
+ { model_id: 'o4-mini', display_name: 'o4-mini' },
19
+ { model_id: 'gpt-4o', display_name: 'GPT-4o' },
20
+ { model_id: 'gpt-4o-mini', display_name: 'GPT-4o Mini' },
21
+ ],
22
+ };
@@ -0,0 +1,19 @@
1
+ export default {
2
+ id: 'openai',
3
+ display_name: 'OpenAI',
4
+ api_key_env: 'OPENAI_API_KEY',
5
+ api_base: 'https://api.openai.com/v1',
6
+ models: [
7
+ { model_id: 'gpt-5.4', display_name: 'GPT-5.4' },
8
+ { model_id: 'gpt-5.4-mini', display_name: 'GPT-5.4 Mini' },
9
+ { model_id: 'gpt-5.4-nano', display_name: 'GPT-5.4 Nano' },
10
+ { model_id: 'gpt-5.2', display_name: 'GPT-5.2' },
11
+ { model_id: 'gpt-4.1', display_name: 'GPT-4.1' },
12
+ { model_id: 'gpt-4.1-mini', display_name: 'GPT-4.1 Mini' },
13
+ { model_id: 'gpt-4.1-nano', display_name: 'GPT-4.1 Nano' },
14
+ { model_id: 'o3', display_name: 'o3' },
15
+ { model_id: 'o4-mini', display_name: 'o4-mini' },
16
+ { model_id: 'gpt-4o', display_name: 'GPT-4o' },
17
+ { model_id: 'gpt-4o-mini', display_name: 'GPT-4o Mini' },
18
+ ],
19
+ };
@@ -0,0 +1,13 @@
1
+ export default {
2
+ id: 'xai',
3
+ display_name: 'xAI',
4
+ api_key_env: 'XAI_API_KEY',
5
+ api_base: 'https://api.x.ai/v1',
6
+ models: [
7
+ { model_id: 'grok-4', display_name: 'Grok 4' },
8
+ { model_id: 'grok-3', display_name: 'Grok 3' },
9
+ { model_id: 'grok-3-mini', display_name: 'Grok 3 Mini' },
10
+ { model_id: 'grok-3-fast', display_name: 'Grok 3 Fast' },
11
+ { model_id: 'grok-2', display_name: 'Grok 2' },
12
+ ],
13
+ };
@@ -0,0 +1,13 @@
1
+ export default {
2
+ id: 'zai-coding-plan',
3
+ display_name: 'Z.AI GLM Coding Plan',
4
+ api_key_env: 'ZAI_API_KEY',
5
+ api_base: 'https://api.z.ai/api/coding/paas/v4',
6
+ models: [
7
+ { model_id: 'glm-5.1', display_name: 'GLM-5.1' },
8
+ { model_id: 'glm-4.7', display_name: 'GLM-4.7' },
9
+ { model_id: 'glm-4.6', display_name: 'GLM-4.6' },
10
+ { model_id: 'glm-4.5', display_name: 'GLM-4.5' },
11
+ { model_id: 'glm-4.5-air', display_name: 'GLM-4.5 Air' },
12
+ ],
13
+ };
@@ -0,0 +1,16 @@
1
+ export default {
2
+ id: 'zai',
3
+ display_name: 'Z.AI (GLM)',
4
+ api_key_env: 'ZAI_API_KEY',
5
+ api_base: 'https://api.z.ai/api/paas/v4',
6
+ models: [
7
+ { model_id: 'glm-5.1', display_name: 'GLM-5.1' },
8
+ { model_id: 'glm-4.7', display_name: 'GLM-4.7' },
9
+ { model_id: 'glm-4.6', display_name: 'GLM-4.6' },
10
+ { model_id: 'glm-4.5', display_name: 'GLM-4.5' },
11
+ { model_id: 'glm-4.5-x', display_name: 'GLM-4.5 X' },
12
+ { model_id: 'glm-4.5-air', display_name: 'GLM-4.5 Air' },
13
+ { model_id: 'glm-4.5-airx', display_name: 'GLM-4.5 AirX' },
14
+ { model_id: 'glm-4.5-flash', display_name: 'GLM-4.5 Flash' },
15
+ ],
16
+ };
package/src/help.js CHANGED
@@ -99,6 +99,7 @@ Actions:
99
99
  install Add a built-in or custom provider
100
100
  login OAuth/subscription login (currently openai-codex)
101
101
  list Show installed providers
102
+ catalog Show all built-in providers and their known models (no gateway needed)
102
103
 
103
104
  Options:
104
105
  --id <id> Provider ID for install (e.g. openai, anthropic, xai)
@@ -125,6 +126,8 @@ Built-in providers:
125
126
 
126
127
  Examples:
127
128
  moxxy provider list
129
+ moxxy provider catalog
130
+ moxxy provider catalog --json
128
131
  moxxy provider install --id openai
129
132
  moxxy provider login --id openai-codex --method browser
130
133
  moxxy provider login --id openai-codex --method headless --no-browser