@blockrun/franklin 3.2.1 → 3.2.2

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/banner.js +52 -41
  2. package/package.json +1 -1
package/dist/banner.js CHANGED
@@ -6,27 +6,33 @@ import chalk from 'chalk';
6
6
  // Public domain image from Wikimedia Commons:
7
7
  // https://commons.wikimedia.org/wiki/File:BenFranklinDuplessis.jpg
8
8
  //
9
- // Rendered via chafa with:
10
- // chafa --size=20x10 --symbols=block --colors=256 ben-franklin.jpg
9
+ // Pipeline:
10
+ // 1. Crop the 2403×2971 original to a 1400×1400 square centred on the face
11
+ // (sips --cropToHeightWidth 1400 1400 --cropOffset 400 500)
12
+ // 2. Convert via chafa:
13
+ // chafa --size=30x14 --symbols=block --colors=256 ben-face.jpg
14
+ // 3. Strip cursor visibility control codes (\x1b[?25l / \x1b[?25h)
15
+ // 4. Paste here as hex-escaped string array (readable + diff-friendly)
11
16
  //
12
- // The raw ANSI escape codes are hex-encoded below so the TS source stays
13
- // readable and diff-friendly. Each string is one row of the portrait.
14
- // Visible dimensions: ~17 characters wide × 10 rows tall.
17
+ // Visible dimensions: ~28 characters wide × 14 rows tall.
15
18
  //
16
19
  // Rendered best in a 256-color or truecolor terminal. Degrades gracefully
17
- // (shows as block-character garbage) on ancient terminals — but those
18
- // are long gone and we don't support them.
20
+ // on ancient terminals — but those are long gone and we don't support them.
19
21
  const BEN_PORTRAIT_ROWS = [
20
- '\x1b[0m\x1b[38;5;232;48;5;16m\x1b[48;5;232m \x1b[48;5;16m▂\x1b[48;5;232m \x1b[38;5;233m▃▃\x1b[48;5;233m \x1b[0m',
21
- '\x1b[38;5;232;48;5;16m\x1b[38;5;234m▂\x1b[38;5;95;48;5;232m▄\x1b[38;5;137;48;5;233m▅\x1b[38;5;173m▅\x1b[38;5;137;48;5;234m▃\x1b[38;5;235;48;5;233m▁ \x1b[38;5;234m▄ \x1b[0m',
22
- '\x1b[38;5;232;48;5;16m▏▕ \x1b[38;5;234;48;5;232m▁\x1b[38;5;235;48;5;237m▎\x1b[38;5;58;48;5;179m▌\x1b[38;5;131m▄\x1b[38;5;94m▖\x1b[38;5;58;48;5;137m▗\x1b[48;5;235m▍\x1b[38;5;235;48;5;234m▆▆▄▅ \x1b[0m',
23
- '\x1b[38;5;233;48;5;232m▏\x1b[38;5;232;48;5;16m▏\x1b[38;5;16;48;5;232m▏\x1b[38;5;233m▗\x1b[38;5;236;48;5;240m▎\x1b[38;5;235;48;5;238m▄\x1b[38;5;95;48;5;173m▎\x1b[38;5;173;48;5;179m▖\x1b[38;5;137m▁\x1b[48;5;94m▍\x1b[38;5;94;48;5;233m▋\x1b[38;5;233;48;5;235m▖\x1b[38;5;236m▄ \x1b[38;5;235;48;5;234m▌ \x1b[0m',
24
- '\x1b[38;5;233;48;5;232m▏ \x1b[38;5;232;48;5;234m▌\x1b[38;5;240;48;5;236m▁\x1b[38;5;95;48;5;235m▁\x1b[38;5;186;48;5;137m▗ \x1b[38;5;95;48;5;173m▃\x1b[38;5;137;48;5;94m▘\x1b[38;5;58;48;5;234m▍\x1b[38;5;234;48;5;236m▘ \x1b[38;5;236;48;5;235m▏ \x1b[38;5;232;48;5;234m▄\x1b[0m',
25
- '\x1b[38;5;233;48;5;232m▏\x1b[38;5;235m▁\x1b[38;5;95;48;5;234m▄\x1b[38;5;137;48;5;236m▆\x1b[48;5;95m \x1b[38;5;101m▁\x1b[38;5;137m▔\x1b[48;5;186m▄\x1b[48;5;95m▍\x1b[48;5;236m▃\x1b[38;5;143;48;5;235m▃\x1b[38;5;236m▏\x1b[38;5;235;48;5;236m▃\x1b[48;5;235m \x1b[38;5;234m▁\x1b[38;5;235;48;5;232m▘\x1b[38;5;232;48;5;16m▔\x1b[0m',
26
- '\x1b[38;5;238;48;5;233m▗\x1b[38;5;8;48;5;137m▘\x1b[38;5;138m▘ \x1b[38;5;137;48;5;95m▊\x1b[38;5;95;48;5;101m▎\x1b[38;5;137;48;5;95m▎\x1b[48;5;101m▌\x1b[48;5;95m \x1b[38;5;95;48;5;101m▏\x1b[38;5;143m▔\x1b[38;5;101;48;5;236m▅\x1b[38;5;240;48;5;234m▖\x1b[38;5;235m▞\x1b[38;5;234;48;5;232m▘\x1b[38;5;232;48;5;16m▔ \x1b[0m',
27
- '\x1b[38;5;52;48;5;95m▋\x1b[48;5;137m \x1b[38;5;95;48;5;101m▕\x1b[38;5;240;48;5;137m▌\x1b[38;5;101m▂ \x1b[48;5;95m▏\x1b[38;5;239m▖▂\x1b[38;5;237m▄\x1b[38;5;101;48;5;234m▘\x1b[38;5;234;48;5;233m▝\x1b[48;5;232m▖\x1b[48;5;16m \x1b[0m',
28
- '\x1b[38;5;235;48;5;95m▌\x1b[38;5;95;48;5;137m▄\x1b[38;5;101m▁ \x1b[48;5;95m▌\x1b[38;5;238m▋\x1b[38;5;240;48;5;101m▃ \x1b[38;5;95;48;5;240m▎\x1b[38;5;236;48;5;239m▝\x1b[38;5;95;48;5;235m▆\x1b[38;5;240m▆\x1b[38;5;237;48;5;233m▆\x1b[48;5;234m▃\x1b[38;5;235;48;5;233m▎\x1b[38;5;233;48;5;232m▖\x1b[48;5;16m \x1b[0m',
29
- '\x1b[38;5;234;48;5;95m▌ \x1b[38;5;95;48;5;101m▃\x1b[38;5;239;48;5;95m▗\x1b[38;5;238;48;5;234m▋\x1b[38;5;236;48;5;101m▎\x1b[38;5;101;48;5;95m▋\x1b[38;5;239m▂▎ \x1b[48;5;240m▃\x1b[38;5;8;48;5;236m▍\x1b[38;5;235;48;5;233m▋\x1b[38;5;232m▅\x1b[38;5;233;48;5;232m▖\x1b[0m',
22
+ '\x1b[0m\x1b[38;5;16;48;5;16m \x1b[38;5;232m▁\x1b[38;5;235;48;5;232m▂\x1b[38;5;58;48;5;233m▄\x1b[38;5;95;48;5;234m▆\x1b[38;5;137;48;5;58m▄\x1b[38;5;173m▅\x1b[48;5;94m▅\x1b[48;5;58m▆▅\x1b[48;5;237m▄\x1b[38;5;137;48;5;234m▃\x1b[38;5;235;48;5;233m▂ \x1b[38;5;233;48;5;232m▂▅\x1b[48;5;233m \x1b[0m',
23
+ '\x1b[38;5;16;48;5;16m \x1b[38;5;235;48;5;232m▗\x1b[38;5;233;48;5;236m▘\x1b[38;5;8;48;5;239m▌\x1b[38;5;95;48;5;137m▋\x1b[38;5;137;48;5;179m▘ \x1b[38;5;179;48;5;173m▃\x1b[48;5;179m \x1b[48;5;173m▊\x1b[38;5;58;48;5;137m▝\x1b[38;5;94;48;5;235m▖\x1b[38;5;234;48;5;233m▅▄▂ ▂▗▄▃\x1b[0m',
24
+ '\x1b[38;5;16;48;5;16m \x1b[38;5;235;48;5;232m▗\x1b[38;5;236;48;5;237m▍ \x1b[38;5;58;48;5;94m▋\x1b[38;5;95;48;5;173m▌\x1b[48;5;179m \x1b[38;5;179;48;5;215m▍\x1b[48;5;221m▔\x1b[38;5;222;48;5;180m▍\x1b[48;5;179m \x1b[38;5;173m▕\x1b[38;5;179;48;5;173m▅\x1b[38;5;137m▕\x1b[38;5;95;48;5;58m▍\x1b[38;5;58;48;5;235m▖\x1b[38;5;235;48;5;234m▖▃▄ \x1b[0m',
25
+ '\x1b[38;5;16;48;5;16m \x1b[38;5;233m▗\x1b[48;5;235m▏\x1b[38;5;237;48;5;238m▊\x1b[38;5;238;48;5;236m▌\x1b[38;5;236;48;5;58m▖\x1b[38;5;95;48;5;179m▌ \x1b[38;5;137m▗\x1b[38;5;94m▄\x1b[38;5;58m▄\x1b[38;5;94m▄\x1b[38;5;137m▖\x1b[38;5;173m▗\x1b[38;5;131m▗\x1b[38;5;58;48;5;137m▃\x1b[38;5;131;48;5;58m▘\x1b[38;5;234m▕\x1b[48;5;236m▖\x1b[38;5;236;48;5;235m▃ \x1b[38;5;234m▝\x1b[38;5;235;48;5;234m▃\x1b[0m',
26
+ '\x1b[38;5;16;48;5;16m \x1b[38;5;235;48;5;232m▂\x1b[38;5;236;48;5;234m▄\x1b[38;5;237;48;5;236m▗\x1b[38;5;8;48;5;239m▖\x1b[38;5;240;48;5;8m▎\x1b[38;5;94;48;5;236m▕\x1b[38;5;137;48;5;179m▍ \x1b[38;5;94;48;5;137m▝\x1b[38;5;173;48;5;94m▂\x1b[38;5;137;48;5;58m▂\x1b[48;5;94m▃\x1b[48;5;179m▘\x1b[38;5;173m▝\x1b[38;5;137;48;5;235m▍\x1b[38;5;94;48;5;236m▝\x1b[38;5;235;48;5;94m▖\x1b[38;5;52;48;5;58m▖\x1b[38;5;235;48;5;233m▝\x1b[48;5;236m▁\x1b[48;5;235m \x1b[0m',
27
+ '\x1b[38;5;232;48;5;16m▗\x1b[38;5;233;48;5;236m▌\x1b[38;5;95;48;5;239m▅\x1b[48;5;240m▃\x1b[38;5;94;48;5;238m▖\x1b[38;5;240;48;5;8m▝\x1b[38;5;95;48;5;236m▘\x1b[38;5;236;48;5;95m▘\x1b[38;5;173;48;5;179m▏ \x1b[38;5;215m▄ \x1b[38;5;179;48;5;137m▅\x1b[38;5;137;48;5;179m▘\x1b[38;5;216m▘\x1b[38;5;179;48;5;216m▃\x1b[48;5;94m▌\x1b[38;5;94;48;5;131m▘\x1b[38;5;95;48;5;94m▋\x1b[38;5;94;48;5;52m▃\x1b[38;5;52;48;5;233m▎\x1b[38;5;233;48;5;235m▅\x1b[38;5;234m▂ \x1b[0m',
28
+ '\x1b[38;5;233;48;5;232m▕\x1b[38;5;234;48;5;236m▘\x1b[38;5;8;48;5;95m▌ \x1b[38;5;236m▃\x1b[38;5;58;48;5;234m▘\x1b[38;5;94m▝\x1b[48;5;137m▎\x1b[38;5;179;48;5;173m▍\x1b[38;5;173;48;5;179m▌▆▖▃▞\x1b[38;5;94;48;5;173m▗\x1b[48;5;179m▄\x1b[38;5;179;48;5;58m▘\x1b[38;5;94;48;5;52m▝\x1b[38;5;130;48;5;131m▃\x1b[38;5;94;48;5;58m▍\x1b[38;5;52;48;5;232m▎\x1b[38;5;232;48;5;233m▌\x1b[38;5;233;48;5;234m▏\x1b[38;5;234;48;5;235m▎\x1b[38;5;236m▌▅▄ \x1b[0m',
29
+ '\x1b[38;5;232;48;5;235m▋\x1b[38;5;58;48;5;236m▝\x1b[48;5;58m \x1b[38;5;239;48;5;94m▅\x1b[38;5;237;48;5;235m▂\x1b[38;5;235;48;5;233m▂\x1b[38;5;234;48;5;94m▄\x1b[38;5;94;48;5;137m▖\x1b[48;5;173m \x1b[38;5;173;48;5;179m▃ \x1b[38;5;137m▂▃▂\x1b[38;5;131;48;5;137m▃\x1b[38;5;58;48;5;131m▝\x1b[38;5;94;48;5;52m▅\x1b[48;5;94m \x1b[48;5;58m▍\x1b[38;5;235;48;5;232m▎\x1b[38;5;232;48;5;233m▋\x1b[38;5;233;48;5;234m▍\x1b[38;5;235;48;5;236m▏ \x1b[38;5;236;48;5;235m▎ \x1b[0m',
30
+ '\x1b[38;5;234;48;5;235m▏\x1b[38;5;236;48;5;237m▋\x1b[38;5;237;48;5;8m▃\x1b[38;5;235;48;5;238m▗\x1b[38;5;237m▖\x1b[38;5;58;48;5;234m▌\x1b[38;5;234;48;5;233m▎\x1b[38;5;236;48;5;137m▎\x1b[38;5;137;48;5;173m▄ \x1b[38;5;173;48;5;179m▄▃ \x1b[38;5;179;48;5;215m▅\x1b[38;5;173;48;5;179m▄\x1b[38;5;179;48;5;137m▘\x1b[38;5;137;48;5;131m▌\x1b[48;5;94m \x1b[38;5;58m▗\x1b[38;5;233;48;5;58m▗\x1b[48;5;233m \x1b[38;5;234;48;5;236m▘ \x1b[38;5;236;48;5;235m▃▞\x1b[38;5;235;48;5;236m▄\x1b[48;5;235m \x1b[0m',
31
+ '\x1b[38;5;234;48;5;235m▏▆\x1b[38;5;235;48;5;237m▌\x1b[38;5;236m▝\x1b[38;5;237;48;5;234m▍\x1b[38;5;234;48;5;233m▖\x1b[38;5;240;48;5;234m▗\x1b[38;5;101;48;5;186m▌\x1b[38;5;137m▝\x1b[48;5;137m \x1b[48;5;173m▆▄▃\x1b[38;5;131m▂\x1b[38;5;130;48;5;137m▂\x1b[38;5;58;48;5;94m▃\x1b[48;5;58m \x1b[38;5;234;48;5;233m▏\x1b[38;5;235;48;5;234m▅\x1b[48;5;236m▌ ▝ \x1b[48;5;235m \x1b[0m',
32
+ '\x1b[38;5;234;48;5;233m▕\x1b[38;5;239;48;5;235m▂\x1b[38;5;95m▃\x1b[48;5;237m▄\x1b[48;5;236m▄\x1b[48;5;235m▄\x1b[38;5;236;48;5;240m▘\x1b[38;5;101;48;5;95m▕\x1b[48;5;186m▖\x1b[38;5;179;48;5;229m▝\x1b[38;5;223;48;5;137m▃\x1b[38;5;137;48;5;131m▁\x1b[38;5;95m▅\x1b[38;5;94m▂\x1b[48;5;94m \x1b[38;5;58m▗\x1b[38;5;94;48;5;58m▔\x1b[38;5;236m▁ \x1b[48;5;235m▆\x1b[38;5;235;48;5;236m▍\x1b[38;5;236;48;5;235m▆\x1b[48;5;236m \x1b[38;5;235m▅\x1b[48;5;235m \x1b[0m',
33
+ '\x1b[38;5;237;48;5;95m▔ \x1b[38;5;137;48;5;101m▝\x1b[48;5;187m▅\x1b[38;5;180;48;5;229m▂\x1b[38;5;143;48;5;222m▔\x1b[38;5;186;48;5;58m▅\x1b[38;5;179m▂\x1b[38;5;95m▁\x1b[38;5;235m▂\x1b[38;5;236m▄\x1b[48;5;233m▌\x1b[38;5;235m▔\x1b[38;5;233;48;5;236m▅\x1b[38;5;234m▃\x1b[38;5;235m▁ ▔\x1b[48;5;235m \x1b[0m',
34
+ '\x1b[38;5;101;48;5;137m▔\x1b[38;5;95;48;5;101m▄▔\x1b[38;5;101;48;5;95m▄ ▗ \x1b[38;5;240m▖\x1b[38;5;95;48;5;101m▘\x1b[38;5;137m▔\x1b[48;5;222m▅\x1b[48;5;186m▃\x1b[48;5;179m▂\x1b[38;5;101;48;5;95m▌\x1b[48;5;58m \x1b[38;5;238;48;5;236m▁\x1b[38;5;180;48;5;234m▃\x1b[48;5;235m▄\x1b[38;5;179;48;5;234m▃\x1b[38;5;95m▁\x1b[38;5;234;48;5;235m▊\x1b[48;5;236m▆\x1b[38;5;235m▃\x1b[38;5;234m▂\x1b[38;5;235m▁ \x1b[38;5;236;48;5;235m▎\x1b[0m',
35
+ '\x1b[38;5;137;48;5;137m \x1b[48;5;95m▄ \x1b[38;5;95;48;5;101m▖\x1b[48;5;137m▝\x1b[48;5;95m \x1b[38;5;101m▅\x1b[48;5;239m▋\x1b[48;5;95m \x1b[38;5;95;48;5;137m▋\x1b[38;5;101;48;5;95m▍\x1b[38;5;95;48;5;101m▖\x1b[38;5;101;48;5;95m▆\x1b[38;5;239m▗\x1b[38;5;101m▄ \x1b[38;5;95;48;5;137m▅\x1b[38;5;137;48;5;180m▅\x1b[38;5;180;48;5;186m▃\x1b[48;5;143m▆\x1b[38;5;95m▔\x1b[38;5;143;48;5;235m▖\x1b[48;5;234m \x1b[38;5;235m▆\x1b[38;5;234;48;5;235m▝\x1b[38;5;235;48;5;234m▞\x1b[38;5;234;48;5;235m▄ \x1b[0m',
30
36
  ];
31
37
  // ─── FRANKLIN text banner (gold → emerald gradient) ────────────────────────
32
38
  //
@@ -63,9 +69,9 @@ function interpolateHex(start, end, t) {
63
69
  }
64
70
  // ─── Banner layout ─────────────────────────────────────────────────────────
65
71
  // Minimum terminal width to show the side-by-side portrait + text layout.
66
- // The portrait is ~17 chars, the FRANKLIN text is ~65 chars, plus a 4-char
67
- // gap = 86 chars. We add a small margin so ~90 cols is the threshold.
68
- const MIN_WIDTH_FOR_PORTRAIT = 90;
72
+ // The portrait is ~28 chars, the FRANKLIN text is ~65 chars, plus a 3-char
73
+ // gap = 96 chars. We add a small margin so 100 cols is the threshold.
74
+ const MIN_WIDTH_FOR_PORTRAIT = 100;
69
75
  /**
70
76
  * Pad a line to an exact visual width, ignoring ANSI escape codes when
71
77
  * measuring. Used to align the portrait's right edge before the text block.
@@ -93,27 +99,28 @@ export function printBanner(version) {
93
99
  }
94
100
  /**
95
101
  * Full layout: Ben Franklin portrait on the left, FRANKLIN text block on the
96
- * right. Portrait is 10 rows, text is 6 rows — portrait extends 4 rows below
97
- * the text, so the 2-row tagline sits under the text and the last 2 rows
98
- * below the portrait are just the bottom of the portrait.
102
+ * right. Portrait is 14 rows × ~28 chars, text is 6 rows — text is vertically
103
+ * centred inside the portrait with 4 rows of padding above and 4 below,
104
+ * tagline sitting right under the FRANKLIN block.
99
105
  *
100
- * [portrait row 1] [empty]
101
- * [portrait row 2] [empty]
102
- * [portrait row 3] ███████╗██████╗ █████╗ ...
103
- * [portrait row 4] ██╔════╝██╔══██╗██╔══██╗...
104
- * [portrait row 5] █████╗ ██████╔╝███████║...
105
- * [portrait row 6] ██╔══╝ ██╔══██╗██╔══██║...
106
- * [portrait row 7] ██║ ██║ ██║██║ ██║...
107
- * [portrait row 8] ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝...
108
- * [portrait row 9] Franklin · The AI agent with a wallet · vX
109
- * [portrait row 10] (empty)
110
- *
111
- * The text is vertically centered within the portrait its top edge sits
112
- * at portrait row 3 so there's a 2-row header padding above.
106
+ * [portrait row 1] (empty)
107
+ * [portrait row 2] (empty)
108
+ * [portrait row 3] (empty)
109
+ * [portrait row 4] (empty)
110
+ * [portrait row 5] ███████╗██████╗ █████╗ ...
111
+ * [portrait row 6] ██╔════╝██╔══██╗██╔══██╗...
112
+ * [portrait row 7] █████╗ ██████╔╝███████║...
113
+ * [portrait row 8] ██╔══╝ ██╔══██╗██╔══██║...
114
+ * [portrait row 9] ██║ ██║ ██║██║ ██║...
115
+ * [portrait row 10] ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝...
116
+ * [portrait row 11] blockrun.ai · The AI agent with a wallet · vX
117
+ * [portrait row 12] (empty)
118
+ * [portrait row 13] (empty)
119
+ * [portrait row 14] (empty)
113
120
  */
114
121
  function printSideBySide(version) {
115
- const TEXT_TOP_OFFSET = 2; // rows of portrait above the text
116
- const PORTRAIT_WIDTH = 18; // columns (char width) of the portrait + 1 pad
122
+ const TEXT_TOP_OFFSET = 4; // rows of portrait above the text
123
+ const PORTRAIT_WIDTH = 29; // columns (char width) of the portrait + 1 pad
117
124
  const GAP = ' '; // gap between portrait and text
118
125
  const portraitRows = BEN_PORTRAIT_ROWS;
119
126
  const textRows = FRANKLIN_ART.length;
@@ -132,9 +139,13 @@ function printSideBySide(version) {
132
139
  textCol = chalk.hex(color)(FRANKLIN_ART[textIdx]);
133
140
  }
134
141
  else if (textIdx === textRows) {
135
- // Tagline row sits right under the FRANKLIN block
142
+ // Tagline row sits right under the FRANKLIN block.
143
+ // The big block-letter "FRANKLIN" above already says the product
144
+ // name — the tagline uses that real estate for the parent brand URL
145
+ // (blockrun.ai, which is a real live domain — unlike franklin.run
146
+ // which we own but haven't deployed yet, see v3.1.0 changelog).
136
147
  textCol =
137
- chalk.bold.hex(GOLD_START)(' Franklin') +
148
+ chalk.bold.hex(GOLD_START)(' blockrun.ai') +
138
149
  chalk.dim(' · The AI agent with a wallet · v' + version);
139
150
  }
140
151
  // Write with a reset at the very start to prevent stray bg from the
@@ -155,7 +166,7 @@ function printTextOnly(version) {
155
166
  const color = interpolateHex(GOLD_START, EMERALD_END, t);
156
167
  console.log(chalk.hex(color)(FRANKLIN_ART[i]));
157
168
  }
158
- console.log(chalk.bold.hex(GOLD_START)(' Franklin') +
169
+ console.log(chalk.bold.hex(GOLD_START)(' blockrun.ai') +
159
170
  chalk.dim(' · The AI agent with a wallet · v' + version) +
160
171
  '\n');
161
172
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockrun/franklin",
3
- "version": "3.2.1",
3
+ "version": "3.2.2",
4
4
  "description": "Franklin — The AI agent with a wallet. Spends USDC autonomously to get real work done. Pay per action, no subscriptions.",
5
5
  "type": "module",
6
6
  "exports": {