codebot-ai 2.1.2 → 2.1.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/banner.d.ts CHANGED
@@ -30,4 +30,35 @@ export declare function sessionSummaryBanner(stats: {
30
30
  }): string;
31
31
  export declare function compactBanner(version: string, model: string): string;
32
32
  export declare function randomBanner(): typeof BANNER_1;
33
+ export type AnimationWriter = (text: string) => void;
34
+ export type AnimationSpeed = 'fast' | 'normal' | 'slow';
35
+ export interface AnimationOptions {
36
+ speed?: AnimationSpeed;
37
+ writer?: AnimationWriter;
38
+ }
39
+ export declare function animateReveal(bannerFn: typeof BANNER_1, version: string, model: string, provider: string, session: string, autonomous: boolean, speed?: AnimationSpeed, opts?: {
40
+ writer?: AnimationWriter;
41
+ }): Promise<void>;
42
+ export declare function animateVisorScan(sweeps?: number, speed?: AnimationSpeed, opts?: {
43
+ writer?: AnimationWriter;
44
+ }): Promise<void>;
45
+ export declare function animateEyeBoot(speed?: AnimationSpeed, opts?: {
46
+ writer?: AnimationWriter;
47
+ }): Promise<void>;
48
+ export declare function animateBootSequence(bannerFn: typeof BANNER_1, version: string, model: string, provider: string, session: string, autonomous: boolean, speed?: AnimationSpeed, opts?: {
49
+ writer?: AnimationWriter;
50
+ }): Promise<void>;
51
+ export declare function animateTyping(text: string, color?: string, speed?: AnimationSpeed, opts?: {
52
+ writer?: AnimationWriter;
53
+ }): Promise<void>;
54
+ export declare function animateSessionEnd(stats: {
55
+ iterations: number;
56
+ toolCalls: number;
57
+ tokensUsed: number;
58
+ cost?: number;
59
+ duration?: number;
60
+ }, speed?: AnimationSpeed, opts?: {
61
+ writer?: AnimationWriter;
62
+ }): Promise<void>;
63
+ export declare function shouldAnimate(): boolean;
33
64
  //# sourceMappingURL=banner.d.ts.map
package/dist/banner.js CHANGED
@@ -14,6 +14,13 @@ exports.formatReaction = formatReaction;
14
14
  exports.sessionSummaryBanner = sessionSummaryBanner;
15
15
  exports.compactBanner = compactBanner;
16
16
  exports.randomBanner = randomBanner;
17
+ exports.animateReveal = animateReveal;
18
+ exports.animateVisorScan = animateVisorScan;
19
+ exports.animateEyeBoot = animateEyeBoot;
20
+ exports.animateBootSequence = animateBootSequence;
21
+ exports.animateTyping = animateTyping;
22
+ exports.animateSessionEnd = animateSessionEnd;
23
+ exports.shouldAnimate = shouldAnimate;
17
24
  const C = {
18
25
  reset: '\x1b[0m',
19
26
  bold: '\x1b[1m',
@@ -300,4 +307,294 @@ function randomBanner() {
300
307
  const banners = [exports.BANNER_1, exports.BANNER_2, exports.BANNER_3];
301
308
  return banners[Math.floor(Math.random() * banners.length)];
302
309
  }
310
+ // ─────────────────────────────────────────────────────────────
311
+ // Terminal Animation System
312
+ // ─────────────────────────────────────────────────────────────
313
+ const ANSI = {
314
+ hideCursor: '\x1b[?25l',
315
+ showCursor: '\x1b[?25h',
316
+ clearLine: '\x1b[2K',
317
+ moveUp: (n) => `\x1b[${n}A`,
318
+ moveDown: (n) => `\x1b[${n}B`,
319
+ moveToCol: (n) => `\x1b[${n}G`,
320
+ saveCursor: '\x1b7',
321
+ restoreCursor: '\x1b8',
322
+ };
323
+ function sleep(ms) {
324
+ return new Promise(resolve => setTimeout(resolve, ms));
325
+ }
326
+ function defaultWriter(text) {
327
+ process.stdout.write(text);
328
+ }
329
+ function getDelay(speed) {
330
+ switch (speed) {
331
+ case 'fast': return { line: 40, char: 15, pause: 200, frame: 50 };
332
+ case 'normal': return { line: 70, char: 25, pause: 300, frame: 80 };
333
+ case 'slow': return { line: 100, char: 40, pause: 400, frame: 120 };
334
+ }
335
+ }
336
+ /**
337
+ * Strip ANSI escape codes from a string.
338
+ */
339
+ function stripAnsi(s) {
340
+ return s.replace(/\x1b\[[0-9;]*m/g, '');
341
+ }
342
+ // ─────────────────────────────────────────────────────────────
343
+ // Animation 1: Line-by-line reveal
344
+ // Renders the banner one line at a time with a delay.
345
+ // ─────────────────────────────────────────────────────────────
346
+ async function animateReveal(bannerFn, version, model, provider, session, autonomous, speed = 'normal', opts) {
347
+ const w = opts?.writer ?? defaultWriter;
348
+ const delay = getDelay(speed);
349
+ const output = bannerFn(version, model, provider, session, autonomous);
350
+ const lines = output.split('\n');
351
+ w(ANSI.hideCursor);
352
+ try {
353
+ for (const line of lines) {
354
+ w(line + '\n');
355
+ if (stripAnsi(line).trim().length > 0) {
356
+ await sleep(delay.line);
357
+ }
358
+ }
359
+ }
360
+ finally {
361
+ w(ANSI.showCursor);
362
+ }
363
+ }
364
+ // ─────────────────────────────────────────────────────────────
365
+ // Animation 2: Sentinel visor scan
366
+ // The gradient highlight sweeps across the visor bar.
367
+ // ─────────────────────────────────────────────────────────────
368
+ const VISOR_WIDTH = 14; // character width of the visor zone
369
+ function renderVisorFrame(position) {
370
+ const chars = [];
371
+ for (let i = 0; i < VISOR_WIDTH; i++) {
372
+ const dist = Math.abs(i - position);
373
+ if (dist === 0)
374
+ chars.push(`${C.brightGreen}██${C.reset}`);
375
+ else if (dist === 1)
376
+ chars.push(`${C.brightCyan}▓▓${C.reset}`);
377
+ else if (dist === 2)
378
+ chars.push(`${C.cyan}▒▒${C.reset}`);
379
+ else if (dist === 3)
380
+ chars.push(`${C.dim}░░${C.reset}`);
381
+ else
382
+ chars.push(`${C.dim}░░${C.reset}`);
383
+ }
384
+ return chars.join('').replace(/(░░)+$/, m => `${C.dim}${m}${C.reset}`);
385
+ }
386
+ async function animateVisorScan(sweeps = 2, speed = 'normal', opts) {
387
+ const w = opts?.writer ?? defaultWriter;
388
+ const delay = getDelay(speed);
389
+ const f = C.cyan;
390
+ const r = C.reset;
391
+ // Render the static sentinel frame first
392
+ const staticLines = [
393
+ '',
394
+ `${f} ▄████████████▄${r}`,
395
+ `${f} ▄█▀${r} ${f}▀█▄${r}`,
396
+ '', // visor line — will be animated
397
+ `${f} █▄${r} ${C.dim}░░░░░░░░░░░░░░${r} ${f}▄█${r}`,
398
+ `${f} ▀█▄${r} ${f}▄█▀${r}`,
399
+ `${f} ▀████████████▀${r}`,
400
+ '',
401
+ ];
402
+ w(ANSI.hideCursor);
403
+ try {
404
+ // Print static lines, inserting placeholder for visor
405
+ for (let i = 0; i < staticLines.length; i++) {
406
+ if (i === 3) {
407
+ w(`${f} █▀${r} ${C.dim}░░░░░░░░░░░░░░░░░░░░░░░░░░░░${r} ${f}▀█${r}\n`);
408
+ }
409
+ else {
410
+ w(staticLines[i] + '\n');
411
+ }
412
+ }
413
+ // Now animate the visor line (line index 3, which is 5 lines up from bottom)
414
+ const linesBelow = staticLines.length - 3 - 1; // lines printed after the visor line
415
+ for (let sweep = 0; sweep < sweeps; sweep++) {
416
+ // Sweep right
417
+ for (let pos = 0; pos <= 6; pos++) {
418
+ w(ANSI.moveUp(linesBelow + 1));
419
+ w('\r' + ANSI.clearLine);
420
+ const visor = renderVisorFrame(pos);
421
+ w(`${f} █▀${r} ${visor} ${f}▀█${r}`);
422
+ w('\n' + ANSI.moveDown(linesBelow));
423
+ await sleep(delay.frame);
424
+ }
425
+ // Sweep left
426
+ for (let pos = 6; pos >= 0; pos--) {
427
+ w(ANSI.moveUp(linesBelow + 1));
428
+ w('\r' + ANSI.clearLine);
429
+ const visor = renderVisorFrame(pos);
430
+ w(`${f} █▀${r} ${visor} ${f}▀█${r}`);
431
+ w('\n' + ANSI.moveDown(linesBelow));
432
+ await sleep(delay.frame);
433
+ }
434
+ }
435
+ // Final state — render the standard visor
436
+ w(ANSI.moveUp(linesBelow + 1));
437
+ w('\r' + ANSI.clearLine);
438
+ const v = C.brightCyan;
439
+ const g = C.brightGreen;
440
+ w(`${f} █▀${r} ${v}░░▒▓${g}██████${v}▓▒░░${r} ${f}▀█${r}`);
441
+ w('\n' + ANSI.moveDown(linesBelow));
442
+ }
443
+ finally {
444
+ w(ANSI.showCursor);
445
+ }
446
+ }
447
+ // ─────────────────────────────────────────────────────────────
448
+ // Animation 3: Core eye boot sequence
449
+ // Eyes power on: dim → medium → bright
450
+ // ─────────────────────────────────────────────────────────────
451
+ async function animateEyeBoot(speed = 'normal', opts) {
452
+ const w = opts?.writer ?? defaultWriter;
453
+ const delay = getDelay(speed);
454
+ const f = C.cyan;
455
+ const r = C.reset;
456
+ // Phase frames for the eyes powering on
457
+ const eyeFrames = [
458
+ // Phase 0: Dark — no eyes
459
+ { top: `${C.dim}· ·${r} ${C.dim}· ·${r}`, bot: `${C.dim}· ·${r} ${C.dim}· ·${r}` },
460
+ // Phase 1: Dim blocks
461
+ { top: `${C.dim}▄██▄${r} ${C.dim}▄██▄${r}`, bot: `${C.dim}▀██▀${r} ${C.dim}▀██▀${r}` },
462
+ // Phase 2: Cyan glow
463
+ { top: `${C.cyan}▄██▄${r} ${C.cyan}▄██▄${r}`, bot: `${C.cyan}▀██▀${r} ${C.cyan}▀██▀${r}` },
464
+ // Phase 3: Bright green — fully online
465
+ { top: `${C.brightGreen}▄██▄${r} ${C.brightGreen}▄██▄${r}`, bot: `${C.brightGreen}▀██▀${r} ${C.brightGreen}▀██▀${r}` },
466
+ ];
467
+ // Print the Core mascot with blank eyes first
468
+ const lines = [
469
+ '',
470
+ `${f} ▄██████████████████▄${r}`,
471
+ `${f} ██${r} ${f}██${r}`,
472
+ `${f} ██${r} ${eyeFrames[0].top} ${f}██${r}`,
473
+ `${f} ██${r} ${eyeFrames[0].bot} ${f}██${r}`,
474
+ `${f} ██${r} ${f}██${r}`,
475
+ `${f} ██${r} ${C.dim}· · · ·${r} ${f}██${r}`,
476
+ `${f} ▀██████████████████▀${r}`,
477
+ '',
478
+ ];
479
+ w(ANSI.hideCursor);
480
+ try {
481
+ for (const line of lines) {
482
+ w(line + '\n');
483
+ }
484
+ await sleep(delay.pause * 2);
485
+ // Animate eye phases
486
+ for (let phase = 1; phase < eyeFrames.length; phase++) {
487
+ const frame = eyeFrames[phase];
488
+ w(ANSI.moveUp(6));
489
+ w('\r' + ANSI.clearLine);
490
+ w(`${f} ██${r} ${frame.top} ${f}██${r}`);
491
+ w('\n' + ANSI.clearLine);
492
+ w(`${f} ██${r} ${frame.bot} ${f}██${r}`);
493
+ w('\n' + ANSI.moveDown(4));
494
+ if (phase === eyeFrames.length - 1) {
495
+ // Also light up the mouth
496
+ w(ANSI.moveUp(3));
497
+ w('\r' + ANSI.clearLine);
498
+ w(`${f} ██${r} ${C.brightCyan}▀██████▀${r} ${f}██${r}`);
499
+ w('\n' + ANSI.moveDown(2));
500
+ }
501
+ await sleep(delay.pause);
502
+ }
503
+ }
504
+ finally {
505
+ w(ANSI.showCursor);
506
+ }
507
+ }
508
+ // ─────────────────────────────────────────────────────────────
509
+ // Animation 4: Full boot sequence
510
+ // Combines: scanline effect → mascot build → info fade-in
511
+ // ─────────────────────────────────────────────────────────────
512
+ async function animateBootSequence(bannerFn, version, model, provider, session, autonomous, speed = 'normal', opts) {
513
+ const w = opts?.writer ?? defaultWriter;
514
+ const delay = getDelay(speed);
515
+ const output = bannerFn(version, model, provider, session, autonomous);
516
+ const lines = output.split('\n');
517
+ const r = C.reset;
518
+ w(ANSI.hideCursor);
519
+ try {
520
+ // Brief settle before animation starts
521
+ await sleep(150);
522
+ // Phase 1: Scanline — print each line dim first, then brighten
523
+ let artDone = false;
524
+ for (const line of lines) {
525
+ const stripped = stripAnsi(line).trim();
526
+ if (stripped.length === 0) {
527
+ w('\n');
528
+ continue;
529
+ }
530
+ // Detect transition from mascot art to info lines (Model/Provider/Session)
531
+ if (!artDone && stripped.startsWith('Model:')) {
532
+ artDone = true;
533
+ await sleep(delay.pause / 2); // pause between art and info
534
+ }
535
+ // Print dim version first — hold long enough to see
536
+ w(`${C.dim}${stripAnsi(line)}${r}`);
537
+ await sleep(delay.line);
538
+ // Overwrite with full color
539
+ w('\r' + ANSI.clearLine + line + '\n');
540
+ await sleep(delay.line / 3);
541
+ }
542
+ await sleep(delay.pause);
543
+ // Phase 2: Greeting — type character by character
544
+ const greeting = randomGreeting('confident');
545
+ w(' ' + exports.CODI_FACE.ready + ' ' + C.dim);
546
+ for (const ch of greeting) {
547
+ w(ch);
548
+ await sleep(delay.char);
549
+ }
550
+ w(r + '\n');
551
+ // Hold the completed banner visible briefly
552
+ await sleep(200);
553
+ }
554
+ finally {
555
+ w(ANSI.showCursor);
556
+ }
557
+ }
558
+ // ─────────────────────────────────────────────────────────────
559
+ // Animation 5: Terminal typing effect
560
+ // Types out text character by character.
561
+ // ─────────────────────────────────────────────────────────────
562
+ async function animateTyping(text, color = C.dim, speed = 'normal', opts) {
563
+ const w = opts?.writer ?? defaultWriter;
564
+ const delay = getDelay(speed);
565
+ w(color);
566
+ for (const ch of text) {
567
+ w(ch);
568
+ await sleep(delay.char);
569
+ }
570
+ w(C.reset);
571
+ }
572
+ // ─────────────────────────────────────────────────────────────
573
+ // Animation 6: Session end — fade out with status
574
+ // ─────────────────────────────────────────────────────────────
575
+ async function animateSessionEnd(stats, speed = 'normal', opts) {
576
+ const w = opts?.writer ?? defaultWriter;
577
+ const delay = getDelay(speed);
578
+ const summaryText = sessionSummaryBanner(stats);
579
+ const lines = summaryText.split('\n');
580
+ w(ANSI.hideCursor);
581
+ try {
582
+ for (const line of lines) {
583
+ w(line + '\n');
584
+ if (stripAnsi(line).trim().length > 0) {
585
+ await sleep(delay.line);
586
+ }
587
+ }
588
+ }
589
+ finally {
590
+ w(ANSI.showCursor);
591
+ }
592
+ }
593
+ // ─────────────────────────────────────────────────────────────
594
+ // Utility: Check if animations should run
595
+ // Only animate in interactive TTY terminals.
596
+ // ─────────────────────────────────────────────────────────────
597
+ function shouldAnimate() {
598
+ return !!(process.stdout.isTTY) && process.env.TERM !== 'dumb' && !process.env.CI;
599
+ }
303
600
  //# sourceMappingURL=banner.js.map
package/dist/cli.js CHANGED
@@ -52,7 +52,7 @@ const sandbox_1 = require("./sandbox");
52
52
  const replay_1 = require("./replay");
53
53
  const risk_1 = require("./risk");
54
54
  const sarif_1 = require("./sarif");
55
- const VERSION = '2.1.2';
55
+ const VERSION = '2.1.4';
56
56
  const C = {
57
57
  reset: '\x1b[0m',
58
58
  bold: '\x1b[1m',
@@ -270,16 +270,30 @@ async function main() {
270
270
  }
271
271
  const session = new history_1.SessionManager(config.model, resumeId);
272
272
  const sessionShort = session.getId().substring(0, 8);
273
- console.log((0, banner_1.banner)(VERSION, config.model, `${config.provider} @ ${config.baseUrl}`, `${sessionShort}...`, !!config.autoApprove));
274
- if (resumeId) {
275
- console.log(c(` ${(0, banner_1.randomGreeting)('resuming')}`, 'green'));
276
- }
277
- else if (config.autoApprove) {
278
- console.log(c(` ${(0, banner_1.randomGreeting)('confident')}`, 'dim'));
279
- console.log((0, banner_1.formatReaction)('autonomous_start'));
273
+ const providerLabel = `${config.provider} @ ${config.baseUrl}`;
274
+ const isAuto = !!config.autoApprove;
275
+ const noAnimate = args['no-animate'] === true || args['no-animation'] === true;
276
+ if ((0, banner_1.shouldAnimate)() && !noAnimate) {
277
+ await (0, banner_1.animateBootSequence)(banner_1.banner, VERSION, config.model, providerLabel, `${sessionShort}...`, isAuto, 'normal');
278
+ if (resumeId) {
279
+ console.log(c(` ${(0, banner_1.randomGreeting)('resuming')}`, 'green'));
280
+ }
281
+ else if (isAuto) {
282
+ console.log((0, banner_1.formatReaction)('autonomous_start'));
283
+ }
280
284
  }
281
285
  else {
282
- console.log(c(` ${(0, banner_1.randomGreeting)()}\n`, 'dim'));
286
+ console.log((0, banner_1.banner)(VERSION, config.model, providerLabel, `${sessionShort}...`, isAuto));
287
+ if (resumeId) {
288
+ console.log(c(` ${(0, banner_1.randomGreeting)('resuming')}`, 'green'));
289
+ }
290
+ else if (isAuto) {
291
+ console.log(c(` ${(0, banner_1.randomGreeting)('confident')}`, 'dim'));
292
+ console.log((0, banner_1.formatReaction)('autonomous_start'));
293
+ }
294
+ else {
295
+ console.log(c(` ${(0, banner_1.randomGreeting)()}\n`, 'dim'));
296
+ }
283
297
  }
284
298
  const agent = new agent_1.Agent({
285
299
  provider,
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const VERSION = "2.1.2";
1
+ export declare const VERSION = "2.1.4";
2
2
  export { Agent } from './agent';
3
3
  export { OpenAIProvider } from './providers/openai';
4
4
  export { AnthropicProvider } from './providers/anthropic';
@@ -28,7 +28,7 @@ export { PolicyEnforcer, loadPolicy, generateDefaultPolicyFile } from './policy'
28
28
  export type { Policy, PolicyRbac, PolicyRole } from './policy';
29
29
  export { encrypt, decrypt, encryptLine, decryptLine, encryptContent, decryptContent, isEncryptionEnabled, deriveKey, getPassphrase } from './encryption';
30
30
  export type { EncryptionConfig } from './encryption';
31
- export { banner, randomGreeting, compactBanner, formatReaction, codiReact, sessionSummaryBanner, randomBanner, CODI_FACE, BANNER_1, BANNER_2, BANNER_3 } from './banner';
32
- export type { CodiMood, CodiReaction } from './banner';
31
+ export { banner, randomGreeting, compactBanner, formatReaction, codiReact, sessionSummaryBanner, randomBanner, CODI_FACE, BANNER_1, BANNER_2, BANNER_3, animateReveal, animateVisorScan, animateEyeBoot, animateBootSequence, animateTyping, animateSessionEnd, shouldAnimate } from './banner';
32
+ export type { CodiMood, CodiReaction, AnimationSpeed, AnimationWriter, AnimationOptions } from './banner';
33
33
  export * from './types';
34
34
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -15,8 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.BANNER_1 = exports.CODI_FACE = exports.randomBanner = exports.sessionSummaryBanner = exports.codiReact = exports.formatReaction = exports.compactBanner = exports.randomGreeting = exports.banner = exports.getPassphrase = exports.deriveKey = exports.isEncryptionEnabled = exports.decryptContent = exports.encryptContent = exports.decryptLine = exports.encryptLine = exports.decrypt = exports.encrypt = exports.generateDefaultPolicyFile = exports.loadPolicy = exports.PolicyEnforcer = exports.sarifToString = exports.exportSarif = exports.RiskScorer = exports.MetricsCollector = exports.listReplayableSessions = exports.compareOutputs = exports.loadSessionForReplay = exports.ReplayProvider = exports.verifyMessages = exports.verifyMessage = exports.signMessage = exports.deriveSessionKey = exports.CapabilityChecker = exports.detectProvider = exports.getModelInfo = exports.PROVIDER_DEFAULTS = exports.MODEL_REGISTRY = exports.loadMCPTools = exports.loadPlugins = exports.parseToolCalls = exports.MemoryManager = exports.SessionManager = exports.buildRepoMap = exports.ContextManager = exports.ToolRegistry = exports.AnthropicProvider = exports.OpenAIProvider = exports.Agent = exports.VERSION = void 0;
18
- exports.BANNER_3 = exports.BANNER_2 = void 0;
19
- exports.VERSION = '2.1.2';
18
+ exports.shouldAnimate = exports.animateSessionEnd = exports.animateTyping = exports.animateBootSequence = exports.animateEyeBoot = exports.animateVisorScan = exports.animateReveal = exports.BANNER_3 = exports.BANNER_2 = void 0;
19
+ exports.VERSION = '2.1.4';
20
20
  var agent_1 = require("./agent");
21
21
  Object.defineProperty(exports, "Agent", { enumerable: true, get: function () { return agent_1.Agent; } });
22
22
  var openai_1 = require("./providers/openai");
@@ -89,5 +89,12 @@ Object.defineProperty(exports, "CODI_FACE", { enumerable: true, get: function ()
89
89
  Object.defineProperty(exports, "BANNER_1", { enumerable: true, get: function () { return banner_1.BANNER_1; } });
90
90
  Object.defineProperty(exports, "BANNER_2", { enumerable: true, get: function () { return banner_1.BANNER_2; } });
91
91
  Object.defineProperty(exports, "BANNER_3", { enumerable: true, get: function () { return banner_1.BANNER_3; } });
92
+ Object.defineProperty(exports, "animateReveal", { enumerable: true, get: function () { return banner_1.animateReveal; } });
93
+ Object.defineProperty(exports, "animateVisorScan", { enumerable: true, get: function () { return banner_1.animateVisorScan; } });
94
+ Object.defineProperty(exports, "animateEyeBoot", { enumerable: true, get: function () { return banner_1.animateEyeBoot; } });
95
+ Object.defineProperty(exports, "animateBootSequence", { enumerable: true, get: function () { return banner_1.animateBootSequence; } });
96
+ Object.defineProperty(exports, "animateTyping", { enumerable: true, get: function () { return banner_1.animateTyping; } });
97
+ Object.defineProperty(exports, "animateSessionEnd", { enumerable: true, get: function () { return banner_1.animateSessionEnd; } });
98
+ Object.defineProperty(exports, "shouldAnimate", { enumerable: true, get: function () { return banner_1.shouldAnimate; } });
92
99
  __exportStar(require("./types"), exports);
93
100
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebot-ai",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "description": "Zero-dependency autonomous AI agent. Code, browse, search, automate. Works with any LLM — Ollama, Claude, GPT, Gemini, DeepSeek, Groq, Mistral, Grok.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",