@kibibot/cli 1.0.1 → 1.0.3

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.
@@ -111,8 +111,8 @@ export function registerLlm(program) {
111
111
  // ── llm setup ─────────────────────────────────────────
112
112
  llmCmd
113
113
  .command('setup <target>')
114
- .description('Generate config for coding tools (cursor, claude, openclaw)')
115
- .option('--install', 'Write config directly (openclaw only)')
114
+ .description('Generate config for OpenClaw')
115
+ .option('--install', 'Write config directly to ~/.openclaw/openclaw.json')
116
116
  .action(async (target, opts, cmd) => {
117
117
  const config = readConfig();
118
118
  const apiKey = config.apiKey || process.env['KIBI_API_KEY'];
@@ -122,57 +122,41 @@ export function registerLlm(program) {
122
122
  process.exit(1);
123
123
  }
124
124
  switch (target.toLowerCase()) {
125
- case 'cursor': {
126
- console.log();
127
- console.log(chalk.bold.cyan('Cursor IDE Configuration'));
128
- console.log(chalk.dim('─'.repeat(40)));
129
- console.log();
130
- console.log('Add this to your Cursor settings (Settings → Models → OpenAI API Key):');
131
- console.log();
132
- console.log(` ${chalk.bold('API Base URL:')} ${llmUrl}`);
133
- console.log(` ${chalk.bold('API Key:')} ${apiKey}`);
134
- console.log();
135
- console.log(chalk.yellow('⚠ Your API key is shown above. Do not share this output.'));
136
- console.log(chalk.dim('Then select a Kibi model from the model dropdown.'));
137
- console.log();
138
- break;
139
- }
140
- case 'claude': {
141
- console.log();
142
- console.log(chalk.bold.cyan('Claude Code Configuration'));
143
- console.log(chalk.dim('─'.repeat(40)));
144
- console.log();
145
- console.log('Set these environment variables:');
146
- console.log();
147
- console.log(` export ANTHROPIC_BASE_URL="${llmUrl}"`);
148
- console.log(` export ANTHROPIC_API_KEY="${apiKey}"`);
149
- console.log();
150
- console.log(chalk.yellow('⚠ Your API key is shown above. Do not share this output.'));
151
- console.log(chalk.dim('Then run `claude` as usual.'));
152
- console.log();
153
- break;
154
- }
155
125
  case 'openclaw': {
126
+ const baseUrl = llmUrl.replace(/\/v1\/?$/, '');
156
127
  const openclawConfig = {
157
128
  models: {
158
129
  mode: 'merge',
159
130
  providers: {
160
131
  kibi: {
161
- baseUrl: llmUrl.replace('/v1', ''),
132
+ baseUrl,
162
133
  apiKey: apiKey,
163
134
  api: 'openai-completions',
164
135
  models: [
165
- { id: 'claude-haiku-4-5', name: 'Claude Haiku (KibiBot)', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 4096 },
166
- { id: 'claude-sonnet-4-6', name: 'Claude Sonnet (KibiBot)', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 8192 },
167
- { id: 'claude-opus-4-6', name: 'Claude Opus (KibiBot)', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 8192 },
168
- { id: 'gpt-4o', name: 'GPT-4o (KibiBot)', contextWindow: 128000, maxTokens: 16384 },
169
- { id: 'gpt-4o-mini', name: 'GPT-4o Mini (KibiBot)', contextWindow: 128000, maxTokens: 16384 },
170
- { id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash (KibiBot)', contextWindow: 1048576, maxTokens: 8192 },
171
- { id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro (KibiBot)', contextWindow: 1048576, maxTokens: 8192 },
136
+ { id: 'kibi-haiku', name: 'Claude Haiku · Kibi', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 4096 },
137
+ { id: 'kibi-sonnet', name: 'Claude Sonnet · Kibi', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 8192 },
138
+ { id: 'kibi-opus', name: 'Claude Opus · Kibi', api: 'anthropic-messages', contextWindow: 200000, maxTokens: 32000 },
139
+ { id: 'kibi-gpt4o', name: 'GPT-4o · Kibi', contextWindow: 128000, maxTokens: 16384 },
140
+ { id: 'kibi-gpt4o-mini', name: 'GPT-4o Mini · Kibi', contextWindow: 128000, maxTokens: 16384 },
141
+ { id: 'kibi-gemini-flash', name: 'Gemini Flash · Kibi', contextWindow: 1048576, maxTokens: 8192 },
142
+ { id: 'kibi-gemini-pro', name: 'Gemini Pro · Kibi', contextWindow: 2097152, maxTokens: 8192 },
172
143
  ],
173
144
  },
174
145
  },
175
146
  },
147
+ agents: {
148
+ defaults: {
149
+ models: {
150
+ 'kibi/kibi-haiku': { alias: 'kibi-haiku' },
151
+ 'kibi/kibi-sonnet': { alias: 'kibi-sonnet' },
152
+ 'kibi/kibi-opus': { alias: 'kibi-opus' },
153
+ 'kibi/kibi-gpt4o': { alias: 'kibi-gpt4o' },
154
+ 'kibi/kibi-gpt4o-mini': { alias: 'kibi-gpt4o-mini' },
155
+ 'kibi/kibi-gemini-flash': { alias: 'kibi-gemini-flash' },
156
+ 'kibi/kibi-gemini-pro': { alias: 'kibi-gemini-pro' },
157
+ },
158
+ },
159
+ },
176
160
  };
177
161
  if (opts.install) {
178
162
  try {
@@ -193,11 +177,26 @@ export function registerLlm(program) {
193
177
  else {
194
178
  mkdirSync(configDir, { recursive: true });
195
179
  }
196
- // Deep merge into models.providers
180
+ // Deep merge providers
197
181
  existing.models = existing.models || {};
198
182
  existing.models.mode = 'merge';
199
183
  existing.models.providers = existing.models.providers || {};
200
184
  existing.models.providers.kibi = openclawConfig.models.providers.kibi;
185
+ // Remove old kibi-oai provider if present (migrating from v1.3.0)
186
+ if (existing.models.providers['kibi-oai']) {
187
+ delete existing.models.providers['kibi-oai'];
188
+ }
189
+ // Deep merge agents.defaults.models (allowlist + aliases)
190
+ existing.agents = existing.agents || {};
191
+ existing.agents.defaults = existing.agents.defaults || {};
192
+ existing.agents.defaults.models = existing.agents.defaults.models || {};
193
+ Object.assign(existing.agents.defaults.models, openclawConfig.agents.defaults.models);
194
+ // Clean up old kibi-oai/* allowlist entries
195
+ for (const key of Object.keys(existing.agents.defaults.models)) {
196
+ if (key.startsWith('kibi-oai/')) {
197
+ delete existing.agents.defaults.models[key];
198
+ }
199
+ }
201
200
  writeFileSync(configPath, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
202
201
  success(`Kibi provider added to ${configPath}`);
203
202
  console.log(chalk.dim(' Restart OpenClaw: openclaw gateway restart'));
@@ -222,7 +221,7 @@ export function registerLlm(program) {
222
221
  break;
223
222
  }
224
223
  default:
225
- console.error(`Error: Unknown target '${target}'. Supported: cursor, claude, openclaw`);
224
+ console.error(`Error: Unknown target '${target}'. Supported: openclaw`);
226
225
  process.exit(1);
227
226
  }
228
227
  });
@@ -67,11 +67,18 @@ export function fmtBalance(value, symbol) {
67
67
  */
68
68
  export function fmtUsd(value) {
69
69
  if (!value)
70
- return chalk.dim('$0.00');
70
+ return chalk.dim('');
71
71
  const num = parseFloat(value);
72
- if (isNaN(num))
73
- return chalk.dim('$0.00');
74
- return `$${num.toFixed(2)}`;
72
+ if (isNaN(num) || num === 0)
73
+ return chalk.dim('');
74
+ if (num >= 1)
75
+ return `$${num.toFixed(2)}`;
76
+ // For small numbers, show enough significant digits
77
+ const str = num.toFixed(10);
78
+ const match = str.match(/^0\.(0*)/);
79
+ const leadingZeros = match ? match[1].length : 0;
80
+ const sigFigs = Math.max(leadingZeros + 4, 2);
81
+ return `$${num.toFixed(sigFigs)}`;
75
82
  }
76
83
  /**
77
84
  * Format a date string.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kibibot/cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "KibiBot CLI — deploy tokens, check balances, and manage your AI agent from the terminal",
5
5
  "type": "module",
6
6
  "bin": {