@kernel.chat/kbot 3.99.26 → 3.99.28

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.
Files changed (2) hide show
  1. package/dist/agent.js +35 -8
  2. package/package.json +1 -1
package/dist/agent.js CHANGED
@@ -112,14 +112,16 @@ let weakModelWarningShown = false;
112
112
  // ── Local-first execution ──
113
113
  async function tryLocalFirst(message) {
114
114
  const lower = message.toLowerCase().trim();
115
- // Pure-arithmetic short-circuit. When the whole message reduces to a single
116
- // "what is a op b" / bare "a op b" / "compute a op b" query, return the
117
- // computed answer directly never involve an LLM. Eval on 2026-04-20
118
- // showed gemma4:latest ignoring an injected MATH GUARD block ("123 % 7 = 4"
119
- // prepended to the message, answer still "2"). If we already have the
120
- // answer deterministically, there is no reason to ask the model.
121
- if (/^(?:what\s+is|what['']s|compute|calculate|evaluate)\s+[-\d.\s+*×/÷%]+\??$/i.test(lower)
122
- || /^[-\d.\s+*×/÷%]+\??$/.test(lower)) {
115
+ // Pure-arithmetic short-circuit. If the message contains exactly one
116
+ // arithmetic expression and reads as a request for the numeric answer
117
+ // ("what is X", "calculate X", or bare X), return the JS-computed answer
118
+ // directly never involve an LLM. Eval on 2026-04-20 showed gemma4:latest
119
+ // ignoring an injected MATH GUARD ("123 % 7 = 4" prepended to the user
120
+ // message, answer still "2"). If the answer is deterministic, do not ask
121
+ // the model.
122
+ const looksArithmetic = /\b(?:what\s+is|what['']s|compute|calculate|evaluate)\b/i.test(lower)
123
+ || /^[-\d.\s+*×/÷%()?]+$/.test(lower);
124
+ if (looksArithmetic && message.length < 200) {
123
125
  const { extractArithmetic } = await import('./math-guard.js');
124
126
  const exprs = extractArithmetic(message);
125
127
  if (exprs.length === 1) {
@@ -170,6 +172,31 @@ async function tryLocalFirst(message) {
170
172
  if (lower === 'pwd' || lower === 'where am i') {
171
173
  return process.cwd();
172
174
  }
175
+ // Identity short-circuit — deterministic answers for self-queries that
176
+ // small models confabulate on. Eval 2026-04-20 showed gemma4:latest
177
+ // answering "v3.99.14" for "what version are you" even with the IDENTITY
178
+ // GUARD block prepended to the user message. If the answer is derivable
179
+ // from package.json + config, return it directly.
180
+ if (message.length < 120) {
181
+ const { detectIdentityQuery } = await import('./identity-guard.js');
182
+ const kinds = detectIdentityQuery(message);
183
+ if (kinds.size > 0) {
184
+ try {
185
+ const { readFileSync } = await import('node:fs');
186
+ const { fileURLToPath } = await import('node:url');
187
+ const { dirname, join } = await import('node:path');
188
+ const here = dirname(fileURLToPath(import.meta.url));
189
+ const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf-8'));
190
+ if (kinds.has('version') && !kinds.has('product') && !kinds.has('model') && !kinds.has('provider')) {
191
+ return `v${pkg.version}`;
192
+ }
193
+ if (kinds.has('product') || kinds.has('version')) {
194
+ return `@kernel.chat/kbot v${pkg.version} — an open-source terminal AI agent.`;
195
+ }
196
+ }
197
+ catch { /* fall through to LLM */ }
198
+ }
199
+ }
173
200
  return null;
174
201
  }
175
202
  /** Anthropic Messages API (Claude) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kernel.chat/kbot",
3
- "version": "3.99.26",
3
+ "version": "3.99.28",
4
4
  "description": "Open-source terminal AI agent. 787+ tools, 35 agents, 20 providers. Dreams, learns, watches your system. Controls your phone. Fully local, fully sovereign. MIT.",
5
5
  "type": "module",
6
6
  "repository": {