@autonoma-ai/planner 0.1.17 → 0.1.19

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/index.js CHANGED
@@ -14,11 +14,11 @@ var __export = (target, all) => {
14
14
  __defProp(target, name, { get: all[name], enumerable: true });
15
15
  };
16
16
 
17
- // ../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.3_jiti@2.6.1_postcss@8.5.15_tsx@4.21.0_typescript@6.0.3_yaml@2.8.3/node_modules/tsup/assets/esm_shims.js
17
+ // ../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.3_jiti@2.6.1_postcss@8.5.15_tsx@4.21.0_typescript@7.0.2_yaml@2.8.3/node_modules/tsup/assets/esm_shims.js
18
18
  import path from "path";
19
19
  import { fileURLToPath } from "url";
20
20
  var init_esm_shims = __esm({
21
- "../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.3_jiti@2.6.1_postcss@8.5.15_tsx@4.21.0_typescript@6.0.3_yaml@2.8.3/node_modules/tsup/assets/esm_shims.js"() {
21
+ "../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.3_jiti@2.6.1_postcss@8.5.15_tsx@4.21.0_typescript@7.0.2_yaml@2.8.3/node_modules/tsup/assets/esm_shims.js"() {
22
22
  "use strict";
23
23
  }
24
24
  });
@@ -218,6 +218,29 @@ var init_analytics = __esm({
218
218
  }
219
219
  });
220
220
 
221
+ // src/core/colors.ts
222
+ function fg(hex) {
223
+ const r = parseInt(hex.slice(1, 3), 16);
224
+ const g = parseInt(hex.slice(3, 5), 16);
225
+ const b = parseInt(hex.slice(5, 7), 16);
226
+ return `${ESC}38;2;${r};${g};${b}m`;
227
+ }
228
+ var ESC, RESET, BOLD, DIM, PRIMARY, SUCCESS, ERROR, WARNING;
229
+ var init_colors = __esm({
230
+ "src/core/colors.ts"() {
231
+ "use strict";
232
+ init_esm_shims();
233
+ ESC = "\x1B[";
234
+ RESET = `${ESC}0m`;
235
+ BOLD = `${ESC}1m`;
236
+ DIM = `${ESC}2m`;
237
+ PRIMARY = fg("#CCFF00");
238
+ SUCCESS = fg("#3FB950");
239
+ ERROR = fg("#FF5C5C");
240
+ WARNING = fg("#FFB020");
241
+ }
242
+ });
243
+
221
244
  // src/core/context.ts
222
245
  import { readFile, writeFile } from "fs/promises";
223
246
  import { join as join5 } from "path";
@@ -396,7 +419,7 @@ var init_errors = __esm({
396
419
  phase;
397
420
  cause;
398
421
  };
399
- FATAL_STATUS_CODES = /* @__PURE__ */ new Set([400, 401, 403, 404, 422]);
422
+ FATAL_STATUS_CODES = /* @__PURE__ */ new Set([400, 401, 402, 403, 404, 422]);
400
423
  RETRYABLE_PROVIDER_QUIRKS = ["corrupted thought signature"];
401
424
  TRANSIENT_MESSAGE_PATTERNS = [
402
425
  "econnreset",
@@ -432,13 +455,14 @@ function getProvider() {
432
455
  function getModel(modelId) {
433
456
  return getProvider().languageModel(modelId ?? readEnv().OPENROUTER_MODEL ?? DEFAULT_MODEL);
434
457
  }
435
- var DEFAULT_MODEL, DEFAULT_API_URL, provider;
458
+ var DEFAULT_MODEL, AI_MAX_RETRIES, DEFAULT_API_URL, provider;
436
459
  var init_model = __esm({
437
460
  "src/core/model.ts"() {
438
461
  "use strict";
439
462
  init_esm_shims();
440
463
  init_env();
441
464
  DEFAULT_MODEL = "google/gemini-3-flash-preview";
465
+ AI_MAX_RETRIES = 10;
442
466
  DEFAULT_API_URL = "https://autonoma.app";
443
467
  }
444
468
  });
@@ -532,7 +556,7 @@ function createStepLogger(agentId, _maxSteps) {
532
556
  function writeSpinner(message) {
533
557
  const frame = SPINNER_FRAMES[frameIdx % SPINNER_FRAMES.length];
534
558
  frameIdx++;
535
- process.stderr.write(`${CLEAR_LINE} ${DIM2}${frame} ${message}${RESET2}`);
559
+ process.stderr.write(`${CLEAR_LINE} ${DIM}${frame} ${message}${RESET}`);
536
560
  lastSpinnerLine = true;
537
561
  }
538
562
  function writePermanent(message) {
@@ -563,55 +587,49 @@ function createStepLogger(agentId, _maxSteps) {
563
587
  case "write_file": {
564
588
  stats.filesWritten++;
565
589
  const path3 = String(tc.input.path ?? tc.input.file_path ?? "");
566
- writePermanent(` ${GREEN}\u270E write ${path3}${RESET2}`);
590
+ writePermanent(` ${SUCCESS}\u270E write ${path3}${RESET}`);
567
591
  break;
568
592
  }
569
593
  case "write_test":
570
594
  stats.filesWritten++;
571
- writePermanent(` ${GREEN}\u270E test ${summary2}${RESET2}`);
595
+ writePermanent(` ${SUCCESS}\u270E test ${summary2}${RESET}`);
572
596
  break;
573
597
  case "finish":
574
- writePermanent(` ${GREEN}${BOLD}\u2713 done:${RESET2} ${GREEN}${agentId}${RESET2}`);
598
+ writePermanent(` ${SUCCESS}${BOLD}\u2713 done:${RESET} ${SUCCESS}${agentId}${RESET}`);
575
599
  break;
576
600
  case "subagent":
577
601
  case "spawn_researcher":
578
- writePermanent(` ${CYAN}\u2295 subagent: ${summary2}${RESET2}`);
602
+ writePermanent(` ${PRIMARY}\u2295 subagent: ${summary2}${RESET}`);
579
603
  break;
580
604
  default:
581
605
  writeSpinner(`${tc.name}${summary2 ? " " + summary2 : ""}`);
582
606
  }
583
607
  }
584
608
  for (const te of info.toolErrors) {
585
- writePermanent(` ${RED}\u2717 ${te.name}: ${te.error}${RESET2}`);
609
+ writePermanent(` ${ERROR}\u2717 ${te.name}: ${te.error}${RESET}`);
586
610
  }
587
611
  for (const f of info.writtenFiles) {
588
- writePermanent(` ${GREEN}\u{1F4C4} wrote: ${f}${RESET2}`);
612
+ writePermanent(` ${SUCCESS}\u{1F4C4} wrote: ${f}${RESET}`);
589
613
  }
590
614
  }
591
615
  function checkpoint(message) {
592
- writePermanent(` ${YELLOW}\u25B8 ${message}${RESET2}`);
616
+ writePermanent(` ${WARNING}\u25B8 ${message}${RESET}`);
593
617
  }
594
618
  function summary() {
595
619
  clearSpinner();
596
620
  if (stats.filesRead > 0 || stats.filesWritten > 0) {
597
- console.log(` ${DIM2}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${RESET2}`);
598
- console.log(` ${DIM2}files read: ${stats.filesRead} | files written: ${stats.filesWritten}${RESET2}`);
621
+ console.log(` ${DIM}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${RESET}`);
622
+ console.log(` ${DIM}files read: ${stats.filesRead} | files written: ${stats.filesWritten}${RESET}`);
599
623
  }
600
624
  }
601
625
  return { log: log9, checkpoint, summary, stats };
602
626
  }
603
- var DIM2, RESET2, CYAN, GREEN, RED, YELLOW, BOLD, SPINNER_FRAMES, CLEAR_LINE;
627
+ var SPINNER_FRAMES, CLEAR_LINE;
604
628
  var init_display = __esm({
605
629
  "src/core/display.ts"() {
606
630
  "use strict";
607
631
  init_esm_shims();
608
- DIM2 = "\x1B[2m";
609
- RESET2 = "\x1B[0m";
610
- CYAN = "\x1B[36m";
611
- GREEN = "\x1B[32m";
612
- RED = "\x1B[31m";
613
- YELLOW = "\x1B[33m";
614
- BOLD = "\x1B[1m";
632
+ init_colors();
615
633
  SPINNER_FRAMES = ["\u25D2", "\u25D0", "\u25D3", "\u25D1"];
616
634
  CLEAR_LINE = "\x1B[2K\r";
617
635
  }
@@ -673,7 +691,7 @@ async function runAgent(config, prompt, extractResult) {
673
691
  const msg = err instanceof Error ? err.message : String(err);
674
692
  throw new AgentError(`agent "${config.id}" (model ${modelIdOf(model)}) failed: ${msg}`, config.id, err);
675
693
  };
676
- const YELLOW4 = "\x1B[33m";
694
+ const YELLOW3 = "\x1B[33m";
677
695
  const RESET8 = "\x1B[0m";
678
696
  for (let retry = 0; retry < MAX_RETRIES; retry++) {
679
697
  const heartbeat = () => {
@@ -681,6 +699,7 @@ async function runAgent(config, prompt, extractResult) {
681
699
  const tools = typeof config.tools === "function" ? await config.tools(heartbeat) : config.tools;
682
700
  const agent = new ToolLoopAgent({
683
701
  model,
702
+ maxRetries: AI_MAX_RETRIES,
684
703
  instructions: config.systemPrompt,
685
704
  tools,
686
705
  temperature: config.temperature,
@@ -697,7 +716,7 @@ async function runAgent(config, prompt, extractResult) {
697
716
  while (extractResult() === void 0 && nudges < MAX_NUDGES) {
698
717
  nudges++;
699
718
  console.log(
700
- ` ${YELLOW4}[${config.id}] agent stopped without finishing - nudging (${nudges}/${MAX_NUDGES})...${RESET8}`
719
+ ` ${YELLOW3}[${config.id}] agent stopped without finishing - nudging (${nudges}/${MAX_NUDGES})...${RESET8}`
701
720
  );
702
721
  track("cli_agent_nudged", { agent: config.id, nudge: nudges });
703
722
  messages.push(...generation.response.messages);
@@ -713,13 +732,13 @@ async function runAgent(config, prompt, extractResult) {
713
732
  if (errorClass === "fatal") fail(err);
714
733
  const msg = err instanceof Error ? err.message : String(err);
715
734
  if (errorClass === "timeout") {
716
- console.log(` ${YELLOW4}[${config.id}] step timed out after ${stepTimeout / 1e3}s${RESET8}`);
735
+ console.log(` ${YELLOW3}[${config.id}] step timed out after ${stepTimeout / 1e3}s${RESET8}`);
717
736
  } else {
718
- console.log(` ${YELLOW4}[${config.id}] provider error: ${msg}${RESET8}`);
737
+ console.log(` ${YELLOW3}[${config.id}] provider error: ${msg}${RESET8}`);
719
738
  }
720
739
  track("cli_agent_retryable_error", { agent: config.id, error_class: errorClass, retry });
721
740
  if (retry < MAX_RETRIES - 1) {
722
- console.log(` ${YELLOW4}[${config.id}] retrying (${retry + 1}/${MAX_RETRIES})...${RESET8}`);
741
+ console.log(` ${YELLOW3}[${config.id}] retrying (${retry + 1}/${MAX_RETRIES})...${RESET8}`);
723
742
  if (errorClass === "transient") {
724
743
  await sleep(Math.min(2e3 * 2 ** retry, 1e4));
725
744
  }
@@ -738,6 +757,7 @@ var init_agent = __esm({
738
757
  init_analytics();
739
758
  init_display();
740
759
  init_errors();
760
+ init_model();
741
761
  MAX_RETRIES = 3;
742
762
  STEP_TIMEOUT_MS = 12e4;
743
763
  MAX_NUDGES = 2;
@@ -1241,6 +1261,7 @@ function buildSubagentTool(model, workingDirectory, onHeartbeat, onFileRead) {
1241
1261
  let result;
1242
1262
  const subagent = new ToolLoopAgent2({
1243
1263
  model,
1264
+ maxRetries: AI_MAX_RETRIES,
1244
1265
  instructions: SYSTEM_PROMPT,
1245
1266
  tools: {
1246
1267
  ...buildSubagentTools(workingDirectory, onFileRead),
@@ -1274,6 +1295,7 @@ var init_subagent = __esm({
1274
1295
  "src/tools/subagent.ts"() {
1275
1296
  "use strict";
1276
1297
  init_esm_shims();
1298
+ init_model();
1277
1299
  init_pick_string();
1278
1300
  init_bash();
1279
1301
  init_glob();
@@ -1513,7 +1535,7 @@ async function launchEditor(editor, files) {
1513
1535
  const proc = spawn(editor.command, args, { stdio: "inherit" });
1514
1536
  proc.on("error", (err) => {
1515
1537
  p3.log.warn(`Couldn't open ${editor.label} (${err.message}). Review the files manually:`);
1516
- for (const f of files) console.log(` ${CYAN2}${f}${RESET3}`);
1538
+ for (const f of files) console.log(` ${CYAN}${f}${RESET3}`);
1517
1539
  settle();
1518
1540
  });
1519
1541
  if (isTerminalEditor) {
@@ -1527,7 +1549,7 @@ async function openInEditor(files) {
1527
1549
  const editors = await detectEditors();
1528
1550
  if (editors.length === 0) {
1529
1551
  p3.log.warn("No editors found. Review the files manually:");
1530
- for (const f of files) console.log(` ${CYAN2}${f}${RESET3}`);
1552
+ for (const f of files) console.log(` ${CYAN}${f}${RESET3}`);
1531
1553
  return;
1532
1554
  }
1533
1555
  if (preferredEditor) {
@@ -1566,7 +1588,7 @@ async function openInEditor(files) {
1566
1588
  }
1567
1589
  async function showResults(result, options) {
1568
1590
  console.log("");
1569
- console.log(` ${GREEN2}[${options.agentId}] Step complete.${RESET3}`);
1591
+ console.log(` ${GREEN}[${options.agentId}] Step complete.${RESET3}`);
1570
1592
  if (result.artifacts.length === 0) {
1571
1593
  const knownFiles = ["AUTONOMA.md", "entity-audit.md", "scenarios.md"];
1572
1594
  for (const f of knownFiles) {
@@ -1585,7 +1607,7 @@ async function showResults(result, options) {
1585
1607
  for (const a of result.artifacts) {
1586
1608
  const fullPath = resolvePath(a, options.outputDir);
1587
1609
  resolvedPaths.push(fullPath);
1588
- console.log(` ${CYAN2}${fullPath}${RESET3}`);
1610
+ console.log(` ${CYAN}${fullPath}${RESET3}`);
1589
1611
  }
1590
1612
  }
1591
1613
  if (result.summary) {
@@ -1636,7 +1658,7 @@ async function reviewLoop(result, options) {
1636
1658
  await showResults(result, options);
1637
1659
  }
1638
1660
  }
1639
- var DIM3, CYAN2, GREEN2, RESET3, EDITORS, cachedEditors, preferredEditor, TERMINAL_EDITORS;
1661
+ var DIM3, CYAN, GREEN, RESET3, EDITORS, cachedEditors, preferredEditor, TERMINAL_EDITORS;
1640
1662
  var init_review = __esm({
1641
1663
  "src/core/review.ts"() {
1642
1664
  "use strict";
@@ -1644,8 +1666,8 @@ var init_review = __esm({
1644
1666
  init_debug();
1645
1667
  init_notify();
1646
1668
  DIM3 = "\x1B[2m";
1647
- CYAN2 = "\x1B[36m";
1648
- GREEN2 = "\x1B[32m";
1669
+ CYAN = "\x1B[36m";
1670
+ GREEN = "\x1B[32m";
1649
1671
  RESET3 = "\x1B[0m";
1650
1672
  EDITORS = [
1651
1673
  { command: "cursor", label: "Cursor", args: (f) => f },
@@ -1709,7 +1731,7 @@ function renderFlowsTable(flows) {
1709
1731
  const sep = `${DIM4}${"\u2500".repeat(numW + nameW + critW + DESC_MAX + 6)}${RESET4}`;
1710
1732
  const body = rows.map((r) => {
1711
1733
  const line = `${pad(r.num, numW)} ${pad(r.name, nameW)} ${pad(r.crit, critW)} ${r.desc}`;
1712
- return r.crit === "core" ? `${YELLOW2}${line}${RESET4}` : line;
1734
+ return r.crit === "core" ? `${YELLOW}${line}${RESET4}` : line;
1713
1735
  }).join("\n");
1714
1736
  const caption = `${DIM4}${flows.length} flows \xB7 ${coreCount} marked core${RESET4}`;
1715
1737
  return `${header}
@@ -1717,14 +1739,14 @@ ${sep}
1717
1739
  ${body}
1718
1740
  ${caption}`;
1719
1741
  }
1720
- var RESET4, DIM4, YELLOW2, BOLD2;
1742
+ var RESET4, DIM4, YELLOW, BOLD2;
1721
1743
  var init_flows = __esm({
1722
1744
  "src/agents/01-kb-generator/flows.ts"() {
1723
1745
  "use strict";
1724
1746
  init_esm_shims();
1725
1747
  RESET4 = "\x1B[0m";
1726
1748
  DIM4 = "\x1B[2m";
1727
- YELLOW2 = "\x1B[33m";
1749
+ YELLOW = "\x1B[33m";
1728
1750
  BOLD2 = "\x1B[1m";
1729
1751
  }
1730
1752
  });
@@ -2320,7 +2342,7 @@ function renderEntityAuditTable(models) {
2320
2342
  const sep = `${DIM5}${"\u2500".repeat(numW + nameW + critW + SRC_MAX + 6)}${RESET5}`;
2321
2343
  const body = rows.map((r) => {
2322
2344
  const line = `${pad2(r.num, numW)} ${pad2(r.name, nameW)} ${pad2(r.creation, critW)} ${r.source}`;
2323
- return r.creation === "standalone" ? `${YELLOW3}${line}${RESET5}` : line;
2345
+ return r.creation === "standalone" ? `${YELLOW2}${line}${RESET5}` : line;
2324
2346
  }).join("\n");
2325
2347
  const caption = `${DIM5}${models.length} models \xB7 ${standalone} standalone \xB7 ${models.length - standalone} side-effect-only${RESET5}`;
2326
2348
  return `${header}
@@ -2328,7 +2350,7 @@ ${sep}
2328
2350
  ${body}
2329
2351
  ${caption}`;
2330
2352
  }
2331
- var RESET5, DIM5, YELLOW3, BOLD3;
2353
+ var RESET5, DIM5, YELLOW2, BOLD3;
2332
2354
  var init_audit_table = __esm({
2333
2355
  "src/agents/02-entity-audit/audit-table.ts"() {
2334
2356
  "use strict";
@@ -2336,7 +2358,7 @@ var init_audit_table = __esm({
2336
2358
  init_entity_order();
2337
2359
  RESET5 = "\x1B[0m";
2338
2360
  DIM5 = "\x1B[2m";
2339
- YELLOW3 = "\x1B[33m";
2361
+ YELLOW2 = "\x1B[33m";
2340
2362
  BOLD3 = "\x1B[1m";
2341
2363
  }
2342
2364
  });
@@ -3226,7 +3248,8 @@ async function callRanker(model, prompt) {
3226
3248
  const result = await generateText({
3227
3249
  model,
3228
3250
  prompt,
3229
- output: Output.object({ schema: rankedSchema })
3251
+ output: Output.object({ schema: rankedSchema }),
3252
+ maxRetries: AI_MAX_RETRIES
3230
3253
  });
3231
3254
  return result.output.ranked;
3232
3255
  }
@@ -3307,6 +3330,7 @@ var init_entity_relevance = __esm({
3307
3330
  "use strict";
3308
3331
  init_esm_shims();
3309
3332
  init_errors();
3333
+ init_model();
3310
3334
  rankedSchema = z15.object({
3311
3335
  ranked: z15.array(z15.string()).describe("Every entity name, ordered most-important first.")
3312
3336
  });
@@ -3825,7 +3849,8 @@ async function classifyFailure(model, args) {
3825
3849
  const result = await generateText2({
3826
3850
  model,
3827
3851
  prompt: buildClassifierPrompt(args),
3828
- output: Output2.object({ schema: classificationSchema })
3852
+ output: Output2.object({ schema: classificationSchema }),
3853
+ maxRetries: AI_MAX_RETRIES
3829
3854
  });
3830
3855
  return result.output;
3831
3856
  } catch (err) {
@@ -3838,6 +3863,7 @@ var init_failure_classifier = __esm({
3838
3863
  "use strict";
3839
3864
  init_esm_shims();
3840
3865
  init_errors();
3866
+ init_model();
3841
3867
  classificationSchema = z16.object({
3842
3868
  side: z16.enum(["recipe", "implementation", "unclear"]).describe(
3843
3869
  "recipe = the test data we sent is wrong and regenerating it could fix the failure; implementation = the developer's handler/factory code is wrong and only a code change fixes it; unclear = cannot confidently attribute the failure to either side."
@@ -6267,6 +6293,7 @@ function buildSpawnResearcherTool(model, workingDirectory, onHeartbeat) {
6267
6293
  let result;
6268
6294
  const subagent = new ToolLoopAgent3({
6269
6295
  model,
6296
+ maxRetries: AI_MAX_RETRIES,
6270
6297
  instructions: "You are a code researcher. Read the files specified in your instruction, analyze them, and call finish with a summary of what you found. Focus on: UI elements, forms, buttons, navigation, API calls, state management.",
6271
6298
  tools: {
6272
6299
  bash: buildBashTool(workingDirectory),
@@ -6311,6 +6338,7 @@ var init_tools2 = __esm({
6311
6338
  "src/agents/05-test-generator/tools.ts"() {
6312
6339
  "use strict";
6313
6340
  init_esm_shims();
6341
+ init_model();
6314
6342
  init_tools();
6315
6343
  init_graph();
6316
6344
  init_validation();
@@ -7004,6 +7032,7 @@ function loadConfig(args) {
7004
7032
 
7005
7033
  // src/index.ts
7006
7034
  init_analytics();
7035
+ init_colors();
7007
7036
  init_context();
7008
7037
  init_errors();
7009
7038
 
@@ -7012,10 +7041,10 @@ init_esm_shims();
7012
7041
  init_debug();
7013
7042
  import readline from "readline";
7014
7043
  import { settings } from "@clack/core";
7015
- var DIM = "\x1B[2m";
7016
- var RESET = "\x1B[0m";
7044
+ var DIM2 = "\x1B[2m";
7045
+ var RESET2 = "\x1B[0m";
7017
7046
  var SHOW_CURSOR = "\x1B[?25h";
7018
- var EXIT_HINT = `${DIM}(press Ctrl+C again to exit)${RESET}`;
7047
+ var EXIT_HINT = `${DIM2}(press Ctrl+C again to exit)${RESET2}`;
7019
7048
  var ARM_WINDOW_MS = 3e3;
7020
7049
  var FORCE_EXIT_MS = 2500;
7021
7050
  var installed = false;
@@ -7506,14 +7535,14 @@ async function showStatus(outputDir) {
7506
7535
  }
7507
7536
  }
7508
7537
  var BANNER = `
7509
- \x1B[36m\x1B[1m \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557
7538
+ ${PRIMARY}${BOLD} \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557
7510
7539
  \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557
7511
7540
  \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551
7512
7541
  \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551
7513
7542
  \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551
7514
7543
  \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D
7515
- \x1B[0m
7516
- \x1B[2m E2E Test Planner - Generate exhaustive test suites from your codebase\x1B[0m
7544
+ ${RESET}
7545
+ ${DIM} E2E Test Planner - Generate exhaustive test suites from your codebase${RESET}
7517
7546
  `;
7518
7547
  function ensureAutonomaAuth() {
7519
7548
  if (readEnv().AUTONOMA_API_TOKEN?.trim()) return true;