agenticmail 0.4.0 → 0.5.0

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/cli.js +57 -9
  2. package/package.json +3 -3
package/dist/cli.js CHANGED
@@ -4215,6 +4215,8 @@ var c2 = {
4215
4215
  yellow: (s) => `\x1B[33m${s}\x1B[0m`,
4216
4216
  cyan: (s) => `\x1B[36m${s}\x1B[0m`,
4217
4217
  magenta: (s) => `\x1B[35m${s}\x1B[0m`,
4218
+ pink: (s) => `\x1B[38;5;205m${s}\x1B[0m`,
4219
+ pinkBg: (s) => `\x1B[48;5;205m\x1B[97m${s}\x1B[0m`,
4218
4220
  dim: (s) => `\x1B[90m${s}\x1B[0m`,
4219
4221
  bold: (s) => `\x1B[1m${s}\x1B[0m`,
4220
4222
  bgGreen: (s) => `\x1B[42m\x1B[30m${s}\x1B[0m`,
@@ -4299,6 +4301,8 @@ var Spinner = class {
4299
4301
  msgChangeCounter = 0;
4300
4302
  category;
4301
4303
  currentMsg;
4304
+ progressPct = -1;
4305
+ // -1 = no progress bar
4302
4306
  constructor(category, initialMsg) {
4303
4307
  this.category = category;
4304
4308
  const msgs = LOADING_MESSAGES[category] ?? LOADING_MESSAGES.general;
@@ -4308,13 +4312,23 @@ var Spinner = class {
4308
4312
  this.frameIdx = 0;
4309
4313
  this.msgIdx = 0;
4310
4314
  this.msgChangeCounter = 0;
4315
+ this.progressPct = -1;
4311
4316
  const msgs = LOADING_MESSAGES[this.category] ?? LOADING_MESSAGES.general;
4312
4317
  this.interval = setInterval(() => {
4313
4318
  const frame = SPINNER_FRAMES[this.frameIdx % SPINNER_FRAMES.length];
4314
- process.stdout.write(`\r ${c2.cyan(frame)} ${c2.yellow(this.currentMsg)}\x1B[K`);
4319
+ if (this.progressPct >= 0) {
4320
+ const barWidth = 20;
4321
+ const filled = Math.round(this.progressPct / 100 * barWidth);
4322
+ const empty = barWidth - filled;
4323
+ const bar = c2.pink("\u2588".repeat(filled)) + c2.dim("\u2591".repeat(empty));
4324
+ const pctStr = c2.pink(`${this.progressPct}%`);
4325
+ process.stdout.write(`\r ${c2.pink(frame)} ${bar} ${pctStr} ${c2.dim(this.currentMsg)}\x1B[K`);
4326
+ } else {
4327
+ process.stdout.write(`\r ${c2.cyan(frame)} ${c2.yellow(this.currentMsg)}\x1B[K`);
4328
+ }
4315
4329
  this.frameIdx++;
4316
4330
  this.msgChangeCounter++;
4317
- if (this.msgChangeCounter >= 30) {
4331
+ if (this.msgChangeCounter >= 30 && this.progressPct < 0) {
4318
4332
  this.msgChangeCounter = 0;
4319
4333
  this.msgIdx = (this.msgIdx + 1) % msgs.length;
4320
4334
  this.currentMsg = msgs[this.msgIdx];
@@ -4322,7 +4336,13 @@ var Spinner = class {
4322
4336
  }, 100);
4323
4337
  }
4324
4338
  update(msg) {
4325
- this.currentMsg = msg;
4339
+ const match = msg.match(/^__progress__:(\d+):(.*)$/);
4340
+ if (match) {
4341
+ this.progressPct = Math.min(100, parseInt(match[1], 10));
4342
+ this.currentMsg = match[2];
4343
+ } else {
4344
+ this.currentMsg = msg;
4345
+ }
4326
4346
  this.msgChangeCounter = 0;
4327
4347
  }
4328
4348
  succeed(msg) {
@@ -4542,14 +4562,41 @@ async function cmdSetup() {
4542
4562
  {
4543
4563
  const spinner = new Spinner("docker");
4544
4564
  spinner.start();
4565
+ const dockerSetup = new SetupManager((msg) => spinner.update(msg));
4545
4566
  try {
4546
- await setup.ensureDocker();
4567
+ await dockerSetup.ensureDocker();
4547
4568
  spinner.succeed(`${c2.bold("Docker")} \u2014 engine running`);
4548
4569
  } catch (err) {
4549
- spinner.fail(`Couldn't start Docker: ${err.message}`);
4550
- log2("");
4551
- log2(` ${c2.yellow("Tip:")} Install Docker manually from ${c2.cyan("https://docker.com/get-docker")}`);
4552
- log2(` ${c2.dim("Then run")} ${c2.green("agenticmail setup")} ${c2.dim("again.")}`);
4570
+ const msg = err.message;
4571
+ if (msg === "DOCKER_MANUAL_START") {
4572
+ spinner.fail(`Docker installed but couldn't start automatically`);
4573
+ log2("");
4574
+ log2(` ${c2.pink(c2.bold("Don't worry! Here's how to fix this:"))}`);
4575
+ log2("");
4576
+ log2(` ${c2.pink("Step 1:")} Open a ${c2.bold("new terminal window")}`);
4577
+ log2(` ${c2.dim("(Command + T on Mac, or open Terminal from your dock)")}`);
4578
+ log2("");
4579
+ log2(` ${c2.pink("Step 2:")} Run this command:`);
4580
+ log2(` ${c2.cyan("open -a Docker")}`);
4581
+ log2("");
4582
+ log2(` ${c2.pink("Step 3:")} Wait for Docker Desktop to fully load`);
4583
+ log2(` ${c2.dim("You'll see a whale icon in your menu bar (top of screen).")}`);
4584
+ log2(` ${c2.dim("Wait until it stops animating \u2014 that means it's ready.")}`);
4585
+ log2("");
4586
+ log2(` ${c2.pink("Step 4:")} Close that terminal window`);
4587
+ log2(` ${c2.dim("Just close the window normally (Command + W). Don't press Ctrl+C.")}`);
4588
+ log2("");
4589
+ log2(` ${c2.pink("Step 5:")} Come back here and run:`);
4590
+ log2(` ${c2.green("npx agenticmail@latest")}`);
4591
+ log2("");
4592
+ log2(` ${c2.dim("That's it! Docker only needs this manual start the first time.")}`);
4593
+ log2(` ${c2.dim("After that, it starts automatically.")}`);
4594
+ } else {
4595
+ spinner.fail(`Couldn't start Docker: ${msg}`);
4596
+ log2("");
4597
+ log2(` ${c2.yellow("Tip:")} Install Docker manually from ${c2.cyan("https://docker.com/get-docker")}`);
4598
+ log2(` ${c2.dim("Then run")} ${c2.green("agenticmail setup")} ${c2.dim("again.")}`);
4599
+ }
4553
4600
  process.exit(1);
4554
4601
  }
4555
4602
  await new Promise((r) => setTimeout(r, 300));
@@ -4558,8 +4605,9 @@ async function cmdSetup() {
4558
4605
  if (!stalwart?.installed) {
4559
4606
  const spinner = new Spinner("stalwart");
4560
4607
  spinner.start();
4608
+ const stalwartSetup = new SetupManager((msg) => spinner.update(msg));
4561
4609
  try {
4562
- await setup.ensureStalwart();
4610
+ await stalwartSetup.ensureStalwart();
4563
4611
  spinner.succeed(`${c2.bold("Mail Server")} \u2014 up and running!`);
4564
4612
  } catch (err) {
4565
4613
  spinner.fail(`Couldn't start the mail server: ${err.message}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agenticmail",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Email infrastructure for AI agents — send and receive real email programmatically",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,8 +26,8 @@
26
26
  "prepublishOnly": "npm run build"
27
27
  },
28
28
  "dependencies": {
29
- "@agenticmail/api": "^0.3.0",
30
- "@agenticmail/core": "^0.3.0",
29
+ "@agenticmail/api": "^0.5.0",
30
+ "@agenticmail/core": "^0.5.0",
31
31
  "json5": "^2.2.3"
32
32
  },
33
33
  "devDependencies": {