@apholdings/jensen-code 0.0.3 → 0.0.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.
Files changed (116) hide show
  1. package/dist/core/agent-session.d.ts +1 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +15 -0
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/extensions/loader.d.ts.map +1 -1
  6. package/dist/core/extensions/loader.js +1 -1
  7. package/dist/core/extensions/loader.js.map +1 -1
  8. package/dist/core/footer-data-provider.d.ts +4 -1
  9. package/dist/core/footer-data-provider.d.ts.map +1 -1
  10. package/dist/core/footer-data-provider.js +25 -11
  11. package/dist/core/footer-data-provider.js.map +1 -1
  12. package/dist/modes/interactive/components/assistant-message.d.ts +6 -1
  13. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  14. package/dist/modes/interactive/components/assistant-message.js +40 -10
  15. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  16. package/dist/modes/interactive/components/footer.d.ts +0 -2
  17. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  18. package/dist/modes/interactive/components/footer.js +8 -146
  19. package/dist/modes/interactive/components/footer.js.map +1 -1
  20. package/dist/modes/interactive/components/header.d.ts +9 -3
  21. package/dist/modes/interactive/components/header.d.ts.map +1 -1
  22. package/dist/modes/interactive/components/header.js +125 -196
  23. package/dist/modes/interactive/components/header.js.map +1 -1
  24. package/dist/modes/interactive/components/top-bar.d.ts.map +1 -1
  25. package/dist/modes/interactive/components/top-bar.js +1 -1
  26. package/dist/modes/interactive/components/top-bar.js.map +1 -1
  27. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  28. package/dist/modes/interactive/components/user-message.js +1 -1
  29. package/dist/modes/interactive/components/user-message.js.map +1 -1
  30. package/dist/modes/interactive/interactive-mode.d.ts +17 -1
  31. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  32. package/dist/modes/interactive/interactive-mode.js +507 -211
  33. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  34. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  35. package/dist/modes/interactive/theme/theme.js +2 -0
  36. package/dist/modes/interactive/theme/theme.js.map +1 -1
  37. package/examples/extensions/antigravity-image-gen.ts +0 -1
  38. package/examples/extensions/auto-commit-on-exit.ts +0 -1
  39. package/examples/extensions/bash-spawn-hook.ts +0 -1
  40. package/examples/extensions/bookmark.ts +0 -1
  41. package/examples/extensions/built-in-tool-renderer.ts +0 -1
  42. package/examples/extensions/claude-rules.ts +0 -1
  43. package/examples/extensions/commands.ts +0 -1
  44. package/examples/extensions/confirm-destructive.ts +0 -1
  45. package/examples/extensions/custom-compaction.ts +0 -1
  46. package/examples/extensions/custom-footer.ts +0 -1
  47. package/examples/extensions/custom-header.ts +0 -1
  48. package/examples/extensions/custom-provider-anthropic/index.ts +0 -1
  49. package/examples/extensions/custom-provider-gitlab-duo/index.ts +0 -1
  50. package/examples/extensions/custom-provider-qwen-cli/index.ts +0 -1
  51. package/examples/extensions/dirty-repo-guard.ts +0 -1
  52. package/examples/extensions/doom-overlay/index.ts +0 -1
  53. package/examples/extensions/dynamic-resources/index.ts +0 -1
  54. package/examples/extensions/dynamic-tools.ts +0 -1
  55. package/examples/extensions/event-bus.ts +0 -1
  56. package/examples/extensions/file-trigger.ts +0 -1
  57. package/examples/extensions/git-checkpoint.ts +0 -1
  58. package/examples/extensions/handoff.ts +0 -1
  59. package/examples/extensions/hello.ts +0 -1
  60. package/examples/extensions/inline-bash.ts +0 -1
  61. package/examples/extensions/input-transform.ts +0 -1
  62. package/examples/extensions/interactive-shell.ts +0 -1
  63. package/examples/extensions/mac-system-theme.ts +0 -1
  64. package/examples/extensions/message-renderer.ts +0 -1
  65. package/examples/extensions/minimal-mode.ts +0 -1
  66. package/examples/extensions/modal-editor.ts +0 -1
  67. package/examples/extensions/model-status.ts +0 -1
  68. package/examples/extensions/notify.ts +0 -1
  69. package/examples/extensions/overlay-qa-tests.ts +0 -1
  70. package/examples/extensions/overlay-test.ts +0 -1
  71. package/examples/extensions/permission-gate.ts +0 -1
  72. package/examples/extensions/pirate.ts +0 -1
  73. package/examples/extensions/plan-mode/index.ts +0 -1
  74. package/examples/extensions/preset.ts +0 -1
  75. package/examples/extensions/protected-paths.ts +0 -1
  76. package/examples/extensions/provider-payload.ts +0 -1
  77. package/examples/extensions/qna.ts +0 -1
  78. package/examples/extensions/question.ts +0 -1
  79. package/examples/extensions/questionnaire.ts +0 -1
  80. package/examples/extensions/rainbow-editor.ts +0 -1
  81. package/examples/extensions/reload-runtime.ts +0 -1
  82. package/examples/extensions/rpc-demo.ts +0 -1
  83. package/examples/extensions/sandbox/index.ts +0 -1
  84. package/examples/extensions/send-user-message.ts +0 -1
  85. package/examples/extensions/session-name.ts +0 -1
  86. package/examples/extensions/shutdown-command.ts +0 -1
  87. package/examples/extensions/snake.ts +0 -1
  88. package/examples/extensions/space-invaders.ts +0 -1
  89. package/examples/extensions/ssh.ts +0 -1
  90. package/examples/extensions/status-line.ts +0 -1
  91. package/examples/extensions/subagent/agents.ts +0 -1
  92. package/examples/extensions/subagent/index.ts +0 -1
  93. package/examples/extensions/summarize.ts +0 -1
  94. package/examples/extensions/system-prompt-header.ts +0 -1
  95. package/examples/extensions/timed-confirm.ts +0 -1
  96. package/examples/extensions/titlebar-spinner.ts +0 -1
  97. package/examples/extensions/todo.ts +0 -1
  98. package/examples/extensions/tool-override.ts +0 -1
  99. package/examples/extensions/tools.ts +0 -1
  100. package/examples/extensions/trigger-compact.ts +0 -1
  101. package/examples/extensions/truncated-tool.ts +0 -1
  102. package/examples/extensions/widget-placement.ts +0 -1
  103. package/examples/extensions/with-deps/index.ts +0 -1
  104. package/examples/sdk/01-minimal.ts +0 -1
  105. package/examples/sdk/02-custom-model.ts +0 -1
  106. package/examples/sdk/03-custom-prompt.ts +0 -1
  107. package/examples/sdk/04-skills.ts +0 -1
  108. package/examples/sdk/05-tools.ts +0 -1
  109. package/examples/sdk/06-extensions.ts +0 -1
  110. package/examples/sdk/07-context-files.ts +0 -1
  111. package/examples/sdk/08-prompt-templates.ts +0 -1
  112. package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
  113. package/examples/sdk/10-settings.ts +0 -1
  114. package/examples/sdk/11-sessions.ts +0 -1
  115. package/examples/sdk/12-full-control.ts +0 -1
  116. package/package.json +4 -3
@@ -1,36 +1,25 @@
1
- const ANSI_ESCAPE_GLOBAL = /\x1b\[[0-9;]*m/g;
1
+ import { createRequire } from "node:module";
2
+ import os from "node:os";
3
+ import { truncateToWidth, visibleWidth } from "@apholdings/jensen-tui";
4
+ const require = createRequire(import.meta.url);
5
+ const packageJson = require("../../../../package.json");
2
6
  const ANSI_ESCAPE_AT_START = /^\x1b\[[0-9;]*m/;
3
- const TITLE = "[JENSEN]";
4
- const MINI_TITLE = "[J]";
5
- const faceStops = [
7
+ const TITLE = packageJson.displayTitle ?? packageJson.productTitle ?? packageJson.title ?? "Jensen Code";
8
+ const VERSION = packageJson.version ? `v${packageJson.version}` : "v0.0.0";
9
+ const LOGO = [" █████████ ", "██▓░░░░░▓██", "█░░░█░█░░░█", "█░░░░░░░░░█", " █████████ "];
10
+ const GRADIENT_STOPS = [
6
11
  { r: 0x1a, g: 0xf5, b: 0x8a },
7
12
  { r: 0x57, g: 0xe3, b: 0xf7 },
8
13
  { r: 0x8c, g: 0xb6, b: 0xff },
9
14
  { r: 0xc0, g: 0x7b, b: 0xff },
10
15
  ];
11
- const detailStops = [
12
- { r: 0x0e, g: 0x8a, b: 0x53 },
13
- { r: 0x2c, g: 0x86, b: 0xa2 },
14
- { r: 0x5a, g: 0x6d, b: 0xb8 },
15
- { r: 0x7f, g: 0x4b, b: 0xb6 },
16
- ];
17
- const shadowStops = [
18
- { r: 0x05, g: 0x2a, b: 0x19 },
19
- { r: 0x0b, g: 0x22, b: 0x3a },
20
- { r: 0x19, g: 0x12, b: 0x33 },
21
- ];
22
- function g7(...rows) {
23
- return rows;
24
- }
25
- function g5(...rows) {
26
- return rows;
27
- }
28
- function stripAnsi(input) {
29
- return input.replace(ANSI_ESCAPE_GLOBAL, "");
30
- }
31
- function visibleWidth(input) {
32
- return Array.from(stripAnsi(input)).length;
33
- }
16
+ const COLORS = {
17
+ border: { r: 0x72, g: 0x7c, b: 0xb0 },
18
+ title: { r: 0xd5, g: 0xd6, b: 0xdb },
19
+ muted: { r: 0x7a, g: 0x84, b: 0xb2 },
20
+ subtle: { r: 0x56, g: 0x5f, b: 0x89 },
21
+ accent: { r: 0xa1, g: 0x88, b: 0xf1 },
22
+ };
34
23
  function truncatePlain(input, maxWidth) {
35
24
  if (maxWidth <= 0)
36
25
  return "";
@@ -44,7 +33,7 @@ function truncatePlain(input, maxWidth) {
44
33
  }
45
34
  return out;
46
35
  }
47
- function truncateToWidth(input, maxWidth, ellipsis = "") {
36
+ function truncateAnsi(input, maxWidth, ellipsis = "") {
48
37
  if (maxWidth <= 0)
49
38
  return "";
50
39
  if (visibleWidth(input) <= maxWidth)
@@ -85,7 +74,18 @@ function truncateToWidth(input, maxWidth, ellipsis = "") {
85
74
  function color(rgb, text) {
86
75
  return `\x1b[38;2;${rgb.r};${rgb.g};${rgb.b}m${text}\x1b[0m`;
87
76
  }
77
+ function bold(text) {
78
+ return `\x1b[1m${text}\x1b[0m`;
79
+ }
80
+ function dim(text) {
81
+ return `\x1b[38;2;${COLORS.muted.r};${COLORS.muted.g};${COLORS.muted.b}m${text}\x1b[0m`;
82
+ }
83
+ function subtle(text) {
84
+ return `\x1b[38;2;${COLORS.subtle.r};${COLORS.subtle.g};${COLORS.subtle.b}m${text}\x1b[0m`;
85
+ }
88
86
  function interpolateStops(stops, t) {
87
+ if (stops.length === 0)
88
+ return { r: 0, g: 0, b: 0 };
89
89
  if (stops.length === 1)
90
90
  return stops[0];
91
91
  const clamped = Math.max(0, Math.min(1, t));
@@ -98,185 +98,114 @@ function interpolateStops(stops, t) {
98
98
  b: Math.round(stops[i].b + (stops[i + 1].b - stops[i].b) * f),
99
99
  };
100
100
  }
101
- function brighten(rgb, amount) {
102
- return {
103
- r: Math.min(255, rgb.r + amount),
104
- g: Math.min(255, rgb.g + amount),
105
- b: Math.min(255, rgb.b + amount),
106
- };
107
- }
108
- function glyphWidth(glyph) {
109
- return Math.max(...glyph.map((row) => row.length));
110
- }
111
- function classifyPixel(ch) {
112
- if (ch === " ")
113
- return "empty";
114
- if (ch === "█")
115
- return "face";
116
- if (ch === "░")
117
- return "detail";
118
- if (ch === "▓")
119
- return "highlight";
120
- return "face";
121
- }
122
- const LARGE_GLYPHS = {
123
- // UFO
124
- "[": g7(" ▓███████▓ ", " ███████████ ", " ███░░░░░░░███ ", "███████████████", "░░▓██▓░▓░▓██▓░░", "░░▓██▓░▓░▓██▓░░", "░▓█▓▓░▓▓▓░▓▓█▓░"),
125
- // ALIEN
126
- "]": g7(" ████████████ ", " ███░▓░░░░░▓░███ ", "██░░░░█░░░█░░░░██", "██░░░░░░░░░░░░░██", "██░░░░█▓█▓█░░░░██", " ███░░░░░░░░░███ ", " ████████████ "),
127
- " ": g7(" ", " ", " ", " ", " ", " ", " "),
128
- J: g7("████████", "░░░░██░ ", " ░░██ ", " ░░██ ", "██░░██ ", "██░░██ ", "░█████ "),
129
- E: g7("█████████", "███░░░░██", "███ ░█ ", "██████ ", "███░░█ ", "███░░ ██", "█████████"),
130
- N: g7("████░░░████", " ████░░░░██", " ██░██░░░██", " ██░░██░░██", " ██ ░░██░██", " ██ ░░████", "███ ░░███"),
131
- S: g7(" ████████ ", "███░░░░███", "░███ ", " ░██████ ", " ░░░███ ", "███░░░░███", " ████████ "),
132
- };
133
- const COMPACT_GLYPHS = {
134
- // Tiny UFO
135
- "[": [" ▓█████▓ ", " █████████ ", "███░░░░░███", "░░██▓░▓██░░", " ░█▓▓░▓▓█░ "],
136
- // ALIEN - Scaled down to 5 rows
137
- "]": [" █████████ ", "██░▓░░░▓░██", "█░░░█░█░░░█", "█░░░░░░░░░█", " █████████ "],
138
- " ": g5(" ", " ", " ", " ", " "),
139
- J: ["███████", " ░░██ ", " ░░██ ", "██░░██ ", "░█████ "],
140
- E: ["████████", "███░░░█ ", "██████ ", "███░░ █ ", "████████"],
141
- N: ["███░░░██", "██░█░░██", "██░░█░██", "██ ░░███", "███ ░░██"],
142
- S: [" ██████ ", "███░░░░ ", " ░█████ ", " ░░░░███", " ██████ "],
143
- };
144
- function buildBitmap(text, glyphs, rows, gap) {
145
- const chars = Array.from(text).map((ch) => glyphs[ch] ?? glyphs[" "]);
146
- let totalWidth = 0;
147
- chars.forEach((glyph, index) => {
148
- totalWidth += glyphWidth(glyph);
149
- if (index < chars.length - 1)
150
- totalWidth += gap;
151
- });
152
- const pixels = Array.from({ length: rows }, () => Array(totalWidth).fill("empty"));
153
- let cursorX = 0;
154
- chars.forEach((glyph, index) => {
155
- const width = glyphWidth(glyph);
156
- for (let y = 0; y < rows; y++) {
157
- const row = glyph[y].padEnd(width, " ");
158
- for (let x = 0; x < width; x++) {
159
- pixels[y][cursorX + x] = classifyPixel(row[x]);
160
- }
161
- }
162
- cursorX += width;
163
- if (index < chars.length - 1)
164
- cursorX += gap;
165
- });
166
- return { pixels, width: totalWidth, height: rows };
167
- }
168
- function renderBitmapLogo(options) {
169
- const { width, pixels, bitmapWidth, bitmapHeight, indent = 1, shadowOffsetX = 2, shadowOffsetY = 1 } = options;
170
- if (width <= 0)
171
- return [""];
172
- // Face is shifted right inside the render canvas so the cast shadow can live on the left.
173
- const renderWidth = bitmapWidth + shadowOffsetX;
174
- const renderHeight = bitmapHeight + shadowOffsetY;
175
- const lines = [""];
176
- for (let y = 0; y < renderHeight; y++) {
177
- let line = " ".repeat(Math.max(0, indent));
178
- for (let x = 0; x < renderWidth; x++) {
179
- const faceSourceX = x - shadowOffsetX;
180
- const facePixel = y >= 0 && y < bitmapHeight && faceSourceX >= 0 && faceSourceX < bitmapWidth
181
- ? pixels[y][faceSourceX]
182
- : "empty";
183
- const shadowSourceX = x;
184
- const shadowSourceY = y - shadowOffsetY;
185
- const shadowPixel = shadowSourceX >= 0 && shadowSourceX < bitmapWidth && shadowSourceY >= 0 && shadowSourceY < bitmapHeight
186
- ? pixels[shadowSourceY][shadowSourceX]
187
- : "empty";
188
- const shadowOn = facePixel === "empty" && shadowPixel !== "empty";
189
- if (facePixel === "face") {
190
- const t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;
191
- line += color(interpolateStops(faceStops, t), "█");
192
- }
193
- else if (facePixel === "detail") {
194
- const t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;
195
- line += color(interpolateStops(detailStops, t), "█");
196
- }
197
- else if (facePixel === "highlight") {
198
- const t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;
199
- line += color(brighten(interpolateStops(faceStops, t), 28), "█");
200
- }
201
- else if (shadowOn) {
202
- const t = bitmapWidth > 1 ? shadowSourceX / (bitmapWidth - 1) : 0;
203
- line += color(interpolateStops(shadowStops, t), "█");
204
- }
205
- else {
206
- line += " ";
207
- }
208
- }
209
- lines.push(truncateToWidth(line, width));
210
- }
211
- return lines.map((line) => truncateToWidth(line, width));
212
- }
213
- function renderMicroFallback(width) {
214
- if (width <= 0)
215
- return [""];
216
- let line = "";
217
- const chars = Array.from(MINI_TITLE);
218
- const plainWidth = chars.length;
101
+ function renderColoredLogoLine(line) {
102
+ const chars = Array.from(line);
103
+ const width = chars.length;
104
+ let out = "";
219
105
  chars.forEach((ch, i) => {
220
106
  if (ch === " ") {
221
- line += " ";
107
+ out += " ";
222
108
  return;
223
109
  }
224
- const t = plainWidth > 1 ? i / (plainWidth - 1) : 0;
225
- line += color(interpolateStops(faceStops, t), ch);
110
+ const t = width > 1 ? i / (width - 1) : 0;
111
+ out += color(interpolateStops(GRADIENT_STOPS, t), ch);
226
112
  });
227
- return ["", truncateToWidth(line, width, "")];
113
+ return out;
114
+ }
115
+ function compactPath(input, maxWidth = 44) {
116
+ const normalized = input.replaceAll("/", process.platform === "win32" ? "\\" : "/");
117
+ if (normalized.length <= maxWidth)
118
+ return normalized;
119
+ const separator = normalized.includes("\\") ? "\\" : "/";
120
+ const parts = normalized.split(separator).filter(Boolean);
121
+ if (parts.length <= 2)
122
+ return normalized;
123
+ const first = normalized.startsWith(separator) ? separator : "";
124
+ const driveMatch = parts[0]?.match(/^[A-Za-z]:$/);
125
+ const head = driveMatch ? `${parts[0]}${separator}` : first;
126
+ const tail = parts.slice(-2).join(separator);
127
+ return `${head}…${separator}${tail}`;
128
+ }
129
+ function padAnsi(input, width) {
130
+ const remaining = Math.max(0, width - visibleWidth(input));
131
+ return input + " ".repeat(remaining);
132
+ }
133
+ function bulletJoin(parts) {
134
+ return parts.filter((part) => Boolean(part && part.trim().length > 0)).join(` ${subtle("•")} `);
135
+ }
136
+ function maybePrefix(label, value) {
137
+ if (!value)
138
+ return undefined;
139
+ return `${dim(label)} ${value}`;
228
140
  }
229
- function renderResponsiveLogo(width) {
230
- const large = buildBitmap(TITLE, LARGE_GLYPHS, 7, 1);
231
- const largeNeeded = 1 + large.width + 1;
232
- const compact = buildBitmap(TITLE, COMPACT_GLYPHS, 5, 1);
233
- const compactNeeded = 1 + compact.width + 1;
234
- const mini = buildBitmap(MINI_TITLE, COMPACT_GLYPHS, 5, 1);
235
- const miniNeeded = 1 + mini.width + 1;
236
- if (width >= largeNeeded) {
237
- return renderBitmapLogo({
238
- width,
239
- pixels: large.pixels,
240
- bitmapWidth: large.width,
241
- bitmapHeight: large.height,
242
- indent: 1,
243
- shadowOffsetX: 2,
244
- shadowOffsetY: 1,
245
- });
141
+ export class Header {
142
+ agentSession;
143
+ footerDataProvider;
144
+ constructor(agentSession, footerDataProvider) {
145
+ this.agentSession = agentSession;
146
+ this.footerDataProvider = footerDataProvider;
246
147
  }
247
- if (width >= compactNeeded) {
248
- return renderBitmapLogo({
249
- width,
250
- pixels: compact.pixels,
251
- bitmapWidth: compact.width,
252
- bitmapHeight: compact.height,
253
- indent: 1,
254
- shadowOffsetX: 1,
255
- shadowOffsetY: 1,
256
- });
148
+ getData() {
149
+ const host = `${os.userInfo().username}@${os.hostname()}`;
150
+ const cwd = process.cwd();
151
+ const repo = this.footerDataProvider?.getGitRepoName() ?? undefined;
152
+ const branch = this.footerDataProvider?.getGitBranch() ?? undefined;
153
+ const workspace = this.agentSession?.sessionName;
154
+ return {
155
+ branch,
156
+ cwd,
157
+ host,
158
+ repo,
159
+ workspace,
160
+ };
257
161
  }
258
- if (width >= miniNeeded) {
259
- return renderBitmapLogo({
260
- width,
261
- pixels: mini.pixels,
262
- bitmapWidth: mini.width,
263
- bitmapHeight: mini.height,
264
- indent: 1,
265
- shadowOffsetX: 1,
266
- shadowOffsetY: 1,
267
- });
162
+ renderCompact(width) {
163
+ const { branch, cwd, host, repo, workspace } = this.getData();
164
+ const line1 = truncateAnsi(`${bold(color(COLORS.title, TITLE))} ${dim(VERSION)}`, width);
165
+ const line2 = subtle(truncateAnsi(bulletJoin([maybePrefix("repo", repo), maybePrefix("branch", branch)]), width));
166
+ const line3 = subtle(truncateAnsi(bulletJoin([maybePrefix("workspace", workspace), maybePrefix("host", host)]), width));
167
+ const line4 = subtle(truncateAnsi(maybePrefix("cwd", compactPath(cwd, Math.max(16, width - 8))) ?? "", width));
168
+ return [line1, line2, line3, line4];
268
169
  }
269
- return renderMicroFallback(width);
270
- }
271
- export class Header {
272
170
  render(width) {
273
- return renderResponsiveLogo(width);
171
+ if (width <= 0)
172
+ return [""];
173
+ if (width < 72)
174
+ return this.renderCompact(width);
175
+ const { branch, cwd, host, repo, workspace } = this.getData();
176
+ const logoWidth = visibleWidth(LOGO[0]);
177
+ const gap = 2;
178
+ const sidePadding = 1;
179
+ const minTextWidth = 12;
180
+ const maxTextWidth = Math.max(minTextWidth, width - logoWidth - gap - sidePadding * 2 - 2);
181
+ const baseRows = [
182
+ `${bold(color(COLORS.title, TITLE))} ${dim(VERSION)}`,
183
+ color(COLORS.title, bulletJoin([maybePrefix("repo", repo), maybePrefix("branch", branch)])),
184
+ color(COLORS.title, bulletJoin([maybePrefix("workspace", workspace), maybePrefix("host", host)])),
185
+ "",
186
+ ];
187
+ const textRows = [
188
+ ...baseRows,
189
+ color(COLORS.title, maybePrefix("cwd", compactPath(cwd, Math.max(18, maxTextWidth - 10))) ?? ""),
190
+ "",
191
+ ];
192
+ const textWidth = Math.max(minTextWidth, Math.min(maxTextWidth, textRows.reduce((max, row) => Math.max(max, visibleWidth(row)), 0)));
193
+ const innerWidth = logoWidth + gap + textWidth + sidePadding * 2;
194
+ const topBorder = color(COLORS.border, "╭") + color(COLORS.border, "─".repeat(innerWidth)) + color(COLORS.border, "╮");
195
+ const bottomBorder = color(COLORS.border, "╰") + color(COLORS.border, "─".repeat(innerWidth)) + color(COLORS.border, "╯");
196
+ const lines = [];
197
+ // lines.push("");
198
+ lines.push(topBorder);
199
+ for (let i = 0; i < LOGO.length; i += 1) {
200
+ const logo = renderColoredLogoLine(LOGO[i]);
201
+ const text = padAnsi(truncateAnsi(textRows[i] ?? "", textWidth), textWidth);
202
+ lines.push(`${color(COLORS.border, "│")} ${logo}${" ".repeat(gap)}${text} ${color(COLORS.border, "│")}`);
203
+ }
204
+ lines.push(bottomBorder);
205
+ // lines.push("");
206
+ return lines.map((line) => truncateToWidth(line, width));
274
207
  }
275
208
  invalidate() { }
276
209
  }
277
- export default function jensenHeader(pi) {
278
- pi.on("session_start", async (_event, ctx) => {
279
- ctx.ui.setHeader((_tui, _theme) => new Header());
280
- });
281
- }
210
+ export default Header;
282
211
  //# sourceMappingURL=header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/header.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@apholdings/jensen-tui\";\nimport type { ExtensionAPI } from \"../../../core/extensions/index.js\";\n\ntype RGB = { r: number; g: number; b: number };\ntype Glyph7 = [string, string, string, string, string, string, string];\ntype Glyph5 = [string, string, string, string, string];\ntype PixelKind = \"empty\" | \"face\" | \"detail\" | \"highlight\";\n\nconst ANSI_ESCAPE_GLOBAL = /\\x1b\\[[0-9;]*m/g;\nconst ANSI_ESCAPE_AT_START = /^\\x1b\\[[0-9;]*m/;\n\nconst TITLE = \"[JENSEN]\";\nconst MINI_TITLE = \"[J]\";\n\nconst faceStops: RGB[] = [\n\t{ r: 0x1a, g: 0xf5, b: 0x8a },\n\t{ r: 0x57, g: 0xe3, b: 0xf7 },\n\t{ r: 0x8c, g: 0xb6, b: 0xff },\n\t{ r: 0xc0, g: 0x7b, b: 0xff },\n];\n\nconst detailStops: RGB[] = [\n\t{ r: 0x0e, g: 0x8a, b: 0x53 },\n\t{ r: 0x2c, g: 0x86, b: 0xa2 },\n\t{ r: 0x5a, g: 0x6d, b: 0xb8 },\n\t{ r: 0x7f, g: 0x4b, b: 0xb6 },\n];\n\nconst shadowStops: RGB[] = [\n\t{ r: 0x05, g: 0x2a, b: 0x19 },\n\t{ r: 0x0b, g: 0x22, b: 0x3a },\n\t{ r: 0x19, g: 0x12, b: 0x33 },\n];\n\nfunction g7(...rows: string[]): Glyph7 {\n\treturn rows as Glyph7;\n}\n\nfunction g5(...rows: string[]): Glyph5 {\n\treturn rows as Glyph5;\n}\n\nfunction stripAnsi(input: string): string {\n\treturn input.replace(ANSI_ESCAPE_GLOBAL, \"\");\n}\n\nfunction visibleWidth(input: string): number {\n\treturn Array.from(stripAnsi(input)).length;\n}\n\nfunction truncatePlain(input: string, maxWidth: number): string {\n\tif (maxWidth <= 0) return \"\";\n\n\tlet out = \"\";\n\tlet width = 0;\n\n\tfor (const ch of Array.from(input)) {\n\t\tif (width >= maxWidth) break;\n\t\tout += ch;\n\t\twidth += 1;\n\t}\n\n\treturn out;\n}\n\nfunction truncateToWidth(input: string, maxWidth: number, ellipsis = \"\"): string {\n\tif (maxWidth <= 0) return \"\";\n\tif (visibleWidth(input) <= maxWidth) return input;\n\n\tconst ellipsisWidth = visibleWidth(ellipsis);\n\tif (ellipsisWidth >= maxWidth) return truncatePlain(ellipsis, maxWidth);\n\n\tconst targetWidth = maxWidth - ellipsisWidth;\n\tlet i = 0;\n\tlet width = 0;\n\tlet out = \"\";\n\tlet sawAnsi = false;\n\n\twhile (i < input.length && width < targetWidth) {\n\t\tconst rest = input.slice(i);\n\t\tconst ansi = rest.match(ANSI_ESCAPE_AT_START);\n\t\tif (ansi) {\n\t\t\tout += ansi[0];\n\t\t\tsawAnsi = true;\n\t\t\ti += ansi[0].length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst cp = input.codePointAt(i);\n\t\tif (cp == null) break;\n\n\t\tconst ch = String.fromCodePoint(cp);\n\t\tif (width + 1 > targetWidth) break;\n\n\t\tout += ch;\n\t\twidth += 1;\n\t\ti += ch.length;\n\t}\n\n\tif (ellipsis) out += ellipsis;\n\tif (sawAnsi) out += \"\\x1b[0m\";\n\n\treturn out;\n}\n\nfunction color(rgb: RGB, text: string): string {\n\treturn `\\x1b[38;2;${rgb.r};${rgb.g};${rgb.b}m${text}\\x1b[0m`;\n}\n\nfunction interpolateStops(stops: RGB[], t: number): RGB {\n\tif (stops.length === 1) return stops[0];\n\n\tconst clamped = Math.max(0, Math.min(1, t));\n\tconst scaled = clamped * (stops.length - 1);\n\tconst i = Math.min(Math.floor(scaled), stops.length - 2);\n\tconst f = scaled - i;\n\n\treturn {\n\t\tr: Math.round(stops[i].r + (stops[i + 1].r - stops[i].r) * f),\n\t\tg: Math.round(stops[i].g + (stops[i + 1].g - stops[i].g) * f),\n\t\tb: Math.round(stops[i].b + (stops[i + 1].b - stops[i].b) * f),\n\t};\n}\n\nfunction brighten(rgb: RGB, amount: number): RGB {\n\treturn {\n\t\tr: Math.min(255, rgb.r + amount),\n\t\tg: Math.min(255, rgb.g + amount),\n\t\tb: Math.min(255, rgb.b + amount),\n\t};\n}\n\nfunction glyphWidth<T extends readonly string[]>(glyph: T): number {\n\treturn Math.max(...glyph.map((row) => row.length));\n}\n\nfunction classifyPixel(ch: string): PixelKind {\n\tif (ch === \" \") return \"empty\";\n\tif (ch === \"█\") return \"face\";\n\tif (ch === \"░\") return \"detail\";\n\tif (ch === \"▓\") return \"highlight\";\n\treturn \"face\";\n}\n\nconst LARGE_GLYPHS: Record<string, Glyph7> = {\n\t// UFO\n\t\"[\": g7(\n\t\t\" ▓███████▓ \",\n\t\t\" ███████████ \",\n\t\t\" ███░░░░░░░███ \",\n\t\t\"███████████████\",\n\t\t\"░░▓██▓░▓░▓██▓░░\",\n\t\t\"░░▓██▓░▓░▓██▓░░\",\n\t\t\"░▓█▓▓░▓▓▓░▓▓█▓░\",\n\t),\n\n\t// ALIEN\n\t\"]\": g7(\n\t\t\" ████████████ \",\n\t\t\" ███░▓░░░░░▓░███ \",\n\t\t\"██░░░░█░░░█░░░░██\",\n\t\t\"██░░░░░░░░░░░░░██\",\n\t\t\"██░░░░█▓█▓█░░░░██\",\n\t\t\" ███░░░░░░░░░███ \",\n\t\t\" ████████████ \",\n\t),\n\n\t\" \": g7(\" \", \" \", \" \", \" \", \" \", \" \", \" \"),\n\n\tJ: g7(\"████████\", \"░░░░██░ \", \" ░░██ \", \" ░░██ \", \"██░░██ \", \"██░░██ \", \"░█████ \"),\n\n\tE: g7(\"█████████\", \"███░░░░██\", \"███ ░█ \", \"██████ \", \"███░░█ \", \"███░░ ██\", \"█████████\"),\n\n\tN: g7(\"████░░░████\", \" ████░░░░██\", \" ██░██░░░██\", \" ██░░██░░██\", \" ██ ░░██░██\", \" ██ ░░████\", \"███ ░░███\"),\n\n\tS: g7(\" ████████ \", \"███░░░░███\", \"░███ \", \" ░██████ \", \" ░░░███ \", \"███░░░░███\", \" ████████ \"),\n};\n\nconst COMPACT_GLYPHS: Record<string, Glyph5> = {\n\t// Tiny UFO\n\t\"[\": [\" ▓█████▓ \", \" █████████ \", \"███░░░░░███\", \"░░██▓░▓██░░\", \" ░█▓▓░▓▓█░ \"],\n\n\t// ALIEN - Scaled down to 5 rows\n\t\"]\": [\" █████████ \", \"██░▓░░░▓░██\", \"█░░░█░█░░░█\", \"█░░░░░░░░░█\", \" █████████ \"],\n\n\t\" \": g5(\" \", \" \", \" \", \" \", \" \"),\n\n\tJ: [\"███████\", \" ░░██ \", \" ░░██ \", \"██░░██ \", \"░█████ \"],\n\n\tE: [\"████████\", \"███░░░█ \", \"██████ \", \"███░░ █ \", \"████████\"],\n\n\tN: [\"███░░░██\", \"██░█░░██\", \"██░░█░██\", \"██ ░░███\", \"███ ░░██\"],\n\n\tS: [\" ██████ \", \"███░░░░ \", \" ░█████ \", \" ░░░░███\", \" ██████ \"],\n};\n\nfunction buildBitmap<T extends readonly string[]>(\n\ttext: string,\n\tglyphs: Record<string, T>,\n\trows: number,\n\tgap: number,\n): { pixels: PixelKind[][]; width: number; height: number } {\n\tconst chars = Array.from(text).map((ch) => glyphs[ch] ?? glyphs[\" \"]);\n\n\tlet totalWidth = 0;\n\tchars.forEach((glyph, index) => {\n\t\ttotalWidth += glyphWidth(glyph);\n\t\tif (index < chars.length - 1) totalWidth += gap;\n\t});\n\n\tconst pixels = Array.from({ length: rows }, () => Array<PixelKind>(totalWidth).fill(\"empty\"));\n\n\tlet cursorX = 0;\n\tchars.forEach((glyph, index) => {\n\t\tconst width = glyphWidth(glyph);\n\n\t\tfor (let y = 0; y < rows; y++) {\n\t\t\tconst row = glyph[y].padEnd(width, \" \");\n\t\t\tfor (let x = 0; x < width; x++) {\n\t\t\t\tpixels[y][cursorX + x] = classifyPixel(row[x]);\n\t\t\t}\n\t\t}\n\n\t\tcursorX += width;\n\t\tif (index < chars.length - 1) cursorX += gap;\n\t});\n\n\treturn { pixels, width: totalWidth, height: rows };\n}\n\nfunction renderBitmapLogo(options: {\n\twidth: number;\n\tpixels: PixelKind[][];\n\tbitmapWidth: number;\n\tbitmapHeight: number;\n\tindent?: number;\n\tshadowOffsetX?: number;\n\tshadowOffsetY?: number;\n}): string[] {\n\tconst { width, pixels, bitmapWidth, bitmapHeight, indent = 1, shadowOffsetX = 2, shadowOffsetY = 1 } = options;\n\n\tif (width <= 0) return [\"\"];\n\n\t// Face is shifted right inside the render canvas so the cast shadow can live on the left.\n\tconst renderWidth = bitmapWidth + shadowOffsetX;\n\tconst renderHeight = bitmapHeight + shadowOffsetY;\n\tconst lines: string[] = [\"\"];\n\n\tfor (let y = 0; y < renderHeight; y++) {\n\t\tlet line = \" \".repeat(Math.max(0, indent));\n\n\t\tfor (let x = 0; x < renderWidth; x++) {\n\t\t\tconst faceSourceX = x - shadowOffsetX;\n\t\t\tconst facePixel =\n\t\t\t\ty >= 0 && y < bitmapHeight && faceSourceX >= 0 && faceSourceX < bitmapWidth\n\t\t\t\t\t? pixels[y][faceSourceX]\n\t\t\t\t\t: \"empty\";\n\n\t\t\tconst shadowSourceX = x;\n\t\t\tconst shadowSourceY = y - shadowOffsetY;\n\t\t\tconst shadowPixel =\n\t\t\t\tshadowSourceX >= 0 && shadowSourceX < bitmapWidth && shadowSourceY >= 0 && shadowSourceY < bitmapHeight\n\t\t\t\t\t? pixels[shadowSourceY][shadowSourceX]\n\t\t\t\t\t: \"empty\";\n\n\t\t\tconst shadowOn = facePixel === \"empty\" && shadowPixel !== \"empty\";\n\n\t\t\tif (facePixel === \"face\") {\n\t\t\t\tconst t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;\n\t\t\t\tline += color(interpolateStops(faceStops, t), \"█\");\n\t\t\t} else if (facePixel === \"detail\") {\n\t\t\t\tconst t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;\n\t\t\t\tline += color(interpolateStops(detailStops, t), \"█\");\n\t\t\t} else if (facePixel === \"highlight\") {\n\t\t\t\tconst t = bitmapWidth > 1 ? faceSourceX / (bitmapWidth - 1) : 0;\n\t\t\t\tline += color(brighten(interpolateStops(faceStops, t), 28), \"█\");\n\t\t\t} else if (shadowOn) {\n\t\t\t\tconst t = bitmapWidth > 1 ? shadowSourceX / (bitmapWidth - 1) : 0;\n\t\t\t\tline += color(interpolateStops(shadowStops, t), \"█\");\n\t\t\t} else {\n\t\t\t\tline += \" \";\n\t\t\t}\n\t\t}\n\n\t\tlines.push(truncateToWidth(line, width));\n\t}\n\n\treturn lines.map((line) => truncateToWidth(line, width));\n}\n\nfunction renderMicroFallback(width: number): string[] {\n\tif (width <= 0) return [\"\"];\n\n\tlet line = \"\";\n\tconst chars = Array.from(MINI_TITLE);\n\tconst plainWidth = chars.length;\n\n\tchars.forEach((ch, i) => {\n\t\tif (ch === \" \") {\n\t\t\tline += \" \";\n\t\t\treturn;\n\t\t}\n\n\t\tconst t = plainWidth > 1 ? i / (plainWidth - 1) : 0;\n\t\tline += color(interpolateStops(faceStops, t), ch);\n\t});\n\n\treturn [\"\", truncateToWidth(line, width, \"\")];\n}\n\nfunction renderResponsiveLogo(width: number): string[] {\n\tconst large = buildBitmap(TITLE, LARGE_GLYPHS, 7, 1);\n\tconst largeNeeded = 1 + large.width + 1;\n\n\tconst compact = buildBitmap(TITLE, COMPACT_GLYPHS, 5, 1);\n\tconst compactNeeded = 1 + compact.width + 1;\n\n\tconst mini = buildBitmap(MINI_TITLE, COMPACT_GLYPHS, 5, 1);\n\tconst miniNeeded = 1 + mini.width + 1;\n\n\tif (width >= largeNeeded) {\n\t\treturn renderBitmapLogo({\n\t\t\twidth,\n\t\t\tpixels: large.pixels,\n\t\t\tbitmapWidth: large.width,\n\t\t\tbitmapHeight: large.height,\n\t\t\tindent: 1,\n\t\t\tshadowOffsetX: 2,\n\t\t\tshadowOffsetY: 1,\n\t\t});\n\t}\n\n\tif (width >= compactNeeded) {\n\t\treturn renderBitmapLogo({\n\t\t\twidth,\n\t\t\tpixels: compact.pixels,\n\t\t\tbitmapWidth: compact.width,\n\t\t\tbitmapHeight: compact.height,\n\t\t\tindent: 1,\n\t\t\tshadowOffsetX: 1,\n\t\t\tshadowOffsetY: 1,\n\t\t});\n\t}\n\n\tif (width >= miniNeeded) {\n\t\treturn renderBitmapLogo({\n\t\t\twidth,\n\t\t\tpixels: mini.pixels,\n\t\t\tbitmapWidth: mini.width,\n\t\t\tbitmapHeight: mini.height,\n\t\t\tindent: 1,\n\t\t\tshadowOffsetX: 1,\n\t\t\tshadowOffsetY: 1,\n\t\t});\n\t}\n\n\treturn renderMicroFallback(width);\n}\n\nexport class Header implements Component {\n\trender(width: number): string[] {\n\t\treturn renderResponsiveLogo(width);\n\t}\n\n\tinvalidate(): void {}\n}\n\nexport default function jensenHeader(pi: ExtensionAPI) {\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tctx.ui.setHeader((_tui, _theme) => new Header());\n\t});\n}\n"]}
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/header.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport { type Component, truncateToWidth, visibleWidth } from \"@apholdings/jensen-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require(\"../../../../package.json\") as {\n\ttitle?: string;\n\tversion?: string;\n\tdisplayTitle?: string;\n\tproductTitle?: string;\n};\n\ntype RGB = { r: number; g: number; b: number };\nconst ANSI_ESCAPE_AT_START = /^\\x1b\\[[0-9;]*m/;\n\nconst TITLE = packageJson.displayTitle ?? packageJson.productTitle ?? packageJson.title ?? \"Jensen Code\";\n\nconst VERSION = packageJson.version ? `v${packageJson.version}` : \"v0.0.0\";\n\nconst LOGO = [\" █████████ \", \"██▓░░░░░▓██\", \"█░░░█░█░░░█\", \"█░░░░░░░░░█\", \" █████████ \"];\n\nconst GRADIENT_STOPS: RGB[] = [\n\t{ r: 0x1a, g: 0xf5, b: 0x8a },\n\t{ r: 0x57, g: 0xe3, b: 0xf7 },\n\t{ r: 0x8c, g: 0xb6, b: 0xff },\n\t{ r: 0xc0, g: 0x7b, b: 0xff },\n];\n\nconst COLORS = {\n\tborder: { r: 0x72, g: 0x7c, b: 0xb0 },\n\ttitle: { r: 0xd5, g: 0xd6, b: 0xdb },\n\tmuted: { r: 0x7a, g: 0x84, b: 0xb2 },\n\tsubtle: { r: 0x56, g: 0x5f, b: 0x89 },\n\taccent: { r: 0xa1, g: 0x88, b: 0xf1 },\n};\n\nfunction truncatePlain(input: string, maxWidth: number): string {\n\tif (maxWidth <= 0) return \"\";\n\n\tlet out = \"\";\n\tlet width = 0;\n\n\tfor (const ch of Array.from(input)) {\n\t\tif (width >= maxWidth) break;\n\t\tout += ch;\n\t\twidth += 1;\n\t}\n\n\treturn out;\n}\n\nfunction truncateAnsi(input: string, maxWidth: number, ellipsis = \"\"): string {\n\tif (maxWidth <= 0) return \"\";\n\tif (visibleWidth(input) <= maxWidth) return input;\n\n\tconst ellipsisWidth = visibleWidth(ellipsis);\n\tif (ellipsisWidth >= maxWidth) return truncatePlain(ellipsis, maxWidth);\n\n\tconst targetWidth = maxWidth - ellipsisWidth;\n\tlet i = 0;\n\tlet width = 0;\n\tlet out = \"\";\n\tlet sawAnsi = false;\n\n\twhile (i < input.length && width < targetWidth) {\n\t\tconst rest = input.slice(i);\n\t\tconst ansi = rest.match(ANSI_ESCAPE_AT_START);\n\t\tif (ansi) {\n\t\t\tout += ansi[0];\n\t\t\tsawAnsi = true;\n\t\t\ti += ansi[0].length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst cp = input.codePointAt(i);\n\t\tif (cp == null) break;\n\n\t\tconst ch = String.fromCodePoint(cp);\n\t\tif (width + 1 > targetWidth) break;\n\n\t\tout += ch;\n\t\twidth += 1;\n\t\ti += ch.length;\n\t}\n\n\tif (ellipsis) out += ellipsis;\n\tif (sawAnsi) out += \"\\x1b[0m\";\n\n\treturn out;\n}\n\nfunction color(rgb: RGB, text: string): string {\n\treturn `\\x1b[38;2;${rgb.r};${rgb.g};${rgb.b}m${text}\\x1b[0m`;\n}\n\nfunction bold(text: string): string {\n\treturn `\\x1b[1m${text}\\x1b[0m`;\n}\n\nfunction dim(text: string): string {\n\treturn `\\x1b[38;2;${COLORS.muted.r};${COLORS.muted.g};${COLORS.muted.b}m${text}\\x1b[0m`;\n}\n\nfunction subtle(text: string): string {\n\treturn `\\x1b[38;2;${COLORS.subtle.r};${COLORS.subtle.g};${COLORS.subtle.b}m${text}\\x1b[0m`;\n}\n\nfunction interpolateStops(stops: RGB[], t: number): RGB {\n\tif (stops.length === 0) return { r: 0, g: 0, b: 0 };\n\tif (stops.length === 1) return stops[0];\n\n\tconst clamped = Math.max(0, Math.min(1, t));\n\tconst scaled = clamped * (stops.length - 1);\n\tconst i = Math.min(Math.floor(scaled), stops.length - 2);\n\tconst f = scaled - i;\n\n\treturn {\n\t\tr: Math.round(stops[i].r + (stops[i + 1].r - stops[i].r) * f),\n\t\tg: Math.round(stops[i].g + (stops[i + 1].g - stops[i].g) * f),\n\t\tb: Math.round(stops[i].b + (stops[i + 1].b - stops[i].b) * f),\n\t};\n}\n\nfunction renderColoredLogoLine(line: string): string {\n\tconst chars = Array.from(line);\n\tconst width = chars.length;\n\n\tlet out = \"\";\n\tchars.forEach((ch, i) => {\n\t\tif (ch === \" \") {\n\t\t\tout += \" \";\n\t\t\treturn;\n\t\t}\n\t\tconst t = width > 1 ? i / (width - 1) : 0;\n\t\tout += color(interpolateStops(GRADIENT_STOPS, t), ch);\n\t});\n\n\treturn out;\n}\n\nfunction compactPath(input: string, maxWidth = 44): string {\n\tconst normalized = input.replaceAll(\"/\", process.platform === \"win32\" ? \"\\\\\" : \"/\");\n\tif (normalized.length <= maxWidth) return normalized;\n\n\tconst separator = normalized.includes(\"\\\\\") ? \"\\\\\" : \"/\";\n\tconst parts = normalized.split(separator).filter(Boolean);\n\tif (parts.length <= 2) return normalized;\n\n\tconst first = normalized.startsWith(separator) ? separator : \"\";\n\tconst driveMatch = parts[0]?.match(/^[A-Za-z]:$/);\n\tconst head = driveMatch ? `${parts[0]}${separator}` : first;\n\tconst tail = parts.slice(-2).join(separator);\n\treturn `${head}…${separator}${tail}`;\n}\n\nfunction padAnsi(input: string, width: number): string {\n\tconst remaining = Math.max(0, width - visibleWidth(input));\n\treturn input + \" \".repeat(remaining);\n}\n\nfunction bulletJoin(parts: Array<string | undefined>): string {\n\treturn parts.filter((part) => Boolean(part && part.trim().length > 0)).join(` ${subtle(\"•\")} `);\n}\n\nfunction maybePrefix(label: string, value: string | undefined): string | undefined {\n\tif (!value) return undefined;\n\treturn `${dim(label)} ${value}`;\n}\n\nexport class Header implements Component {\n\tconstructor(\n\t\tprivate readonly agentSession?: AgentSession,\n\t\tprivate readonly footerDataProvider?: ReadonlyFooterDataProvider,\n\t) {}\n\n\tprivate getData() {\n\t\tconst host = `${os.userInfo().username}@${os.hostname()}`;\n\t\tconst cwd = process.cwd();\n\t\tconst repo = this.footerDataProvider?.getGitRepoName() ?? undefined;\n\t\tconst branch = this.footerDataProvider?.getGitBranch() ?? undefined;\n\t\tconst workspace = this.agentSession?.sessionName;\n\n\t\treturn {\n\t\t\tbranch,\n\t\t\tcwd,\n\t\t\thost,\n\t\t\trepo,\n\t\t\tworkspace,\n\t\t};\n\t}\n\n\tprivate renderCompact(width: number): string[] {\n\t\tconst { branch, cwd, host, repo, workspace } = this.getData();\n\n\t\tconst line1 = truncateAnsi(`${bold(color(COLORS.title, TITLE))} ${dim(VERSION)}`, width);\n\t\tconst line2 = subtle(truncateAnsi(bulletJoin([maybePrefix(\"repo\", repo), maybePrefix(\"branch\", branch)]), width));\n\t\tconst line3 = subtle(\n\t\t\ttruncateAnsi(bulletJoin([maybePrefix(\"workspace\", workspace), maybePrefix(\"host\", host)]), width),\n\t\t);\n\t\tconst line4 = subtle(truncateAnsi(maybePrefix(\"cwd\", compactPath(cwd, Math.max(16, width - 8))) ?? \"\", width));\n\n\t\treturn [line1, line2, line3, line4];\n\t}\n\n\trender(width: number): string[] {\n\t\tif (width <= 0) return [\"\"];\n\t\tif (width < 72) return this.renderCompact(width);\n\n\t\tconst { branch, cwd, host, repo, workspace } = this.getData();\n\t\tconst logoWidth = visibleWidth(LOGO[0]);\n\t\tconst gap = 2;\n\t\tconst sidePadding = 1;\n\t\tconst minTextWidth = 12;\n\t\tconst maxTextWidth = Math.max(minTextWidth, width - logoWidth - gap - sidePadding * 2 - 2);\n\n\t\tconst baseRows = [\n\t\t\t`${bold(color(COLORS.title, TITLE))} ${dim(VERSION)}`,\n\t\t\tcolor(COLORS.title, bulletJoin([maybePrefix(\"repo\", repo), maybePrefix(\"branch\", branch)])),\n\t\t\tcolor(COLORS.title, bulletJoin([maybePrefix(\"workspace\", workspace), maybePrefix(\"host\", host)])),\n\t\t\t\"\",\n\t\t];\n\n\t\tconst textRows = [\n\t\t\t...baseRows,\n\t\t\tcolor(COLORS.title, maybePrefix(\"cwd\", compactPath(cwd, Math.max(18, maxTextWidth - 10))) ?? \"\"),\n\t\t\t\"\",\n\t\t];\n\t\tconst textWidth = Math.max(\n\t\t\tminTextWidth,\n\t\t\tMath.min(\n\t\t\t\tmaxTextWidth,\n\t\t\t\ttextRows.reduce((max, row) => Math.max(max, visibleWidth(row)), 0),\n\t\t\t),\n\t\t);\n\t\tconst innerWidth = logoWidth + gap + textWidth + sidePadding * 2;\n\n\t\tconst topBorder =\n\t\t\tcolor(COLORS.border, \"╭\") + color(COLORS.border, \"─\".repeat(innerWidth)) + color(COLORS.border, \"╮\");\n\n\t\tconst bottomBorder =\n\t\t\tcolor(COLORS.border, \"╰\") + color(COLORS.border, \"─\".repeat(innerWidth)) + color(COLORS.border, \"╯\");\n\n\t\tconst lines: string[] = [];\n\n\t\t// lines.push(\"\");\n\t\tlines.push(topBorder);\n\t\tfor (let i = 0; i < LOGO.length; i += 1) {\n\t\t\tconst logo = renderColoredLogoLine(LOGO[i]);\n\t\t\tconst text = padAnsi(truncateAnsi(textRows[i] ?? \"\", textWidth), textWidth);\n\n\t\t\tlines.push(`${color(COLORS.border, \"│\")} ${logo}${\" \".repeat(gap)}${text} ${color(COLORS.border, \"│\")}`);\n\t\t}\n\t\tlines.push(bottomBorder);\n\t\t// lines.push(\"\");\n\t\treturn lines.map((line) => truncateToWidth(line, width));\n\t}\n\n\tinvalidate(): void {}\n}\n\nexport default Header;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"top-bar.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/top-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlF,KAAK,SAAS,GACX;IACA,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACnB,GACD,SAAS,CAAC;AAEb,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,WAAW,EAAE,kBAAkB,CAAC;CAChC;AAkCD,qBAAa,MAAO,YAAW,SAAS;IAC3B,OAAO,CAAC,OAAO;IAA3B,YAAoB,OAAO,EAAE,aAAa,EAAI;IAE9C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;IAexB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B9B;IAED,UAAU,IAAI,IAAI,CAAG;CACrB","sourcesContent":["import type { Component } from \"@apholdings/jensen-tui\";\nimport { visibleWidth } from \"@apholdings/jensen-tui\";\nimport type { AppAction, KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\nimport { appKey } from \"./keybinding-hints.js\";\n\ntype ModelLike =\n\t| {\n\t\t\tprovider?: string;\n\t\t\tapiProvider?: string;\n\t\t\tid?: string;\n\t\t\tmodelId?: string;\n\t\t\tname?: string;\n\t\t\treasoning?: boolean;\n\t }\n\t| undefined;\n\nexport interface TopBarOptions {\n\tgetModel: () => ModelLike;\n\tgetThinkingLevel: () => string;\n\tkeybindings: KeybindingsManager;\n}\n\nfunction shortenProvider(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic$/i, \"claude\")\n\t\t.replace(/^openai$/i, \"openai\")\n\t\t.replace(/^google$/i, \"google\")\n\t\t.replace(/^zai$/i, \"z.ai\")\n\t\t.replace(/^openrouter$/i, \"orouter\");\n}\n\nfunction shortenModelName(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic\\//, \"\")\n\t\t.replace(/^openai\\//, \"\")\n\t\t.replace(/^google\\//, \"\")\n\t\t.replace(/^zai\\//, \"\")\n\t\t.replace(/^openrouter\\//, \"\")\n\t\t.replace(/^claude-/, \"\")\n\t\t.replace(/^models\\//, \"\");\n}\n\nfunction capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport class TopBar implements Component {\n\tconstructor(private options: TopBarOptions) {}\n\n\tprivate getAppKeyDisplay(action: AppAction): string {\n\t\treturn capitalizeKey(appKey(this.options.keybindings, action));\n\t}\n\n\tprivate getProviderModel(): { provider: string; model: string } {\n\t\tconst model = this.options.getModel();\n\t\tif (!model) {\n\t\t\treturn { provider: \"no-provider\", model: \"no-model\" };\n\t\t}\n\n\t\tconst provider = model.provider ?? model.apiProvider ?? \"unknown\";\n\t\tconst rawModel = model.id ?? model.modelId ?? model.name ?? \"unknown-model\";\n\n\t\treturn {\n\t\t\tprovider: shortenProvider(String(provider)),\n\t\t\tmodel: shortenModelName(String(rawModel)),\n\t\t};\n\t}\n\n\trender(width: number): string[] {\n\t\tconst model = this.options.getModel();\n\t\tconst parts: string[] = [];\n\n\t\tif (model?.reasoning) {\n\t\t\tconst level = this.options.getThinkingLevel();\n\t\t\tconst colorKey = `thinking${level.charAt(0).toUpperCase()}${level.slice(1)}` as ThemeColor;\n\n\t\t\tparts.push(\n\t\t\t\ttheme.fg(\"muted\", this.getAppKeyDisplay(\"cycleThinkingLevel\")) +\n\t\t\t\t\ttheme.fg(\"dim\", \" Thinking: \") +\n\t\t\t\t\ttheme.fg(colorKey, level),\n\t\t\t);\n\t\t}\n\n\t\tparts.push(theme.fg(\"muted\", this.getAppKeyDisplay(\"selectModel\")) + theme.fg(\"dim\", \" Model\"));\n\n\t\tconst leftString = ` ${parts.join(theme.fg(\"dim\", \" · \"))}`;\n\t\tconst pm = this.getProviderModel();\n\n\t\tconst rightCandidates = [theme.fg(\"dim\", `${pm.provider}/${pm.model} `), theme.fg(\"dim\", `${pm.model} `), \"\"];\n\n\t\tconst maxRightWidth = Math.max(0, width - visibleWidth(leftString));\n\t\tconst rightString = rightCandidates.find((candidate) => visibleWidth(candidate) <= maxRightWidth) ?? \"\";\n\n\t\tconst leftWidth = visibleWidth(leftString);\n\t\tconst rightWidth = visibleWidth(rightString);\n\t\tconst spaces = Math.max(0, width - leftWidth - rightWidth);\n\n\t\treturn [leftString + \" \".repeat(spaces) + rightString];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
1
+ {"version":3,"file":"top-bar.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/top-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAa,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlF,KAAK,SAAS,GACX;IACA,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACnB,GACD,SAAS,CAAC;AAEb,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,WAAW,EAAE,kBAAkB,CAAC;CAChC;AAkCD,qBAAa,MAAO,YAAW,SAAS;IAC3B,OAAO,CAAC,OAAO;IAA3B,YAAoB,OAAO,EAAE,aAAa,EAAI;IAE9C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;IAexB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B9B;IAED,UAAU,IAAI,IAAI,CAAG;CACrB","sourcesContent":["import type { Component } from \"@apholdings/jensen-tui\";\nimport { visibleWidth } from \"@apholdings/jensen-tui\";\nimport type { AppAction, KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\nimport { appKey } from \"./keybinding-hints.js\";\n\ntype ModelLike =\n\t| {\n\t\t\tprovider?: string;\n\t\t\tapiProvider?: string;\n\t\t\tid?: string;\n\t\t\tmodelId?: string;\n\t\t\tname?: string;\n\t\t\treasoning?: boolean;\n\t }\n\t| undefined;\n\nexport interface TopBarOptions {\n\tgetModel: () => ModelLike;\n\tgetThinkingLevel: () => string;\n\tkeybindings: KeybindingsManager;\n}\n\nfunction shortenProvider(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic$/i, \"claude\")\n\t\t.replace(/^openai$/i, \"openai\")\n\t\t.replace(/^google$/i, \"google\")\n\t\t.replace(/^zai$/i, \"z.ai\")\n\t\t.replace(/^openrouter$/i, \"orouter\");\n}\n\nfunction shortenModelName(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic\\//, \"\")\n\t\t.replace(/^openai\\//, \"\")\n\t\t.replace(/^google\\//, \"\")\n\t\t.replace(/^zai\\//, \"\")\n\t\t.replace(/^openrouter\\//, \"\")\n\t\t.replace(/^claude-/, \"\")\n\t\t.replace(/^models\\//, \"\");\n}\n\nfunction capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport class TopBar implements Component {\n\tconstructor(private options: TopBarOptions) {}\n\n\tprivate getAppKeyDisplay(action: AppAction): string {\n\t\treturn capitalizeKey(appKey(this.options.keybindings, action));\n\t}\n\n\tprivate getProviderModel(): { provider: string; model: string } {\n\t\tconst model = this.options.getModel();\n\t\tif (!model) {\n\t\t\treturn { provider: \"no-provider\", model: \"no-model\" };\n\t\t}\n\n\t\tconst provider = model.provider ?? model.apiProvider ?? \"unknown\";\n\t\tconst rawModel = model.id ?? model.modelId ?? model.name ?? \"unknown-model\";\n\n\t\treturn {\n\t\t\tprovider: shortenProvider(String(provider)),\n\t\t\tmodel: shortenModelName(String(rawModel)),\n\t\t};\n\t}\n\n\trender(width: number): string[] {\n\t\tconst model = this.options.getModel();\n\t\tconst parts: string[] = [];\n\n\t\tif (model?.reasoning) {\n\t\t\tconst level = this.options.getThinkingLevel();\n\t\t\tconst colorKey = `thinking${level.charAt(0).toUpperCase()}${level.slice(1)}` as ThemeColor;\n\n\t\t\tparts.push(\n\t\t\t\ttheme.fg(\"muted\", this.getAppKeyDisplay(\"cycleThinkingLevel\")) +\n\t\t\t\t\ttheme.fg(\"dim\", \" Thinking: \") +\n\t\t\t\t\ttheme.fg(colorKey, level),\n\t\t\t);\n\t\t}\n\n\t\tparts.push(theme.fg(\"muted\", this.getAppKeyDisplay(\"selectModel\")) + theme.fg(\"dim\", \" Model\"));\n\n\t\tconst leftString = ` ${parts.join(theme.fg(\"dim\", \" · \"))}`;\n\t\tconst pm = this.getProviderModel();\n\n\t\tconst rightCandidates = [theme.fg(\"dim\", `${pm.provider}/${pm.model} `), theme.fg(\"dim\", `${pm.model} `), \"\"];\n\n\t\tconst maxRightWidth = Math.max(0, width - visibleWidth(leftString));\n\t\tconst rightString = rightCandidates.find((candidate) => visibleWidth(candidate) <= maxRightWidth) ?? \"\";\n\n\t\tconst leftWidth = visibleWidth(leftString);\n\t\tconst rightWidth = visibleWidth(rightString);\n\t\tconst spaces = Math.max(0, width - leftWidth - rightWidth);\n\n\t\treturn [\"\", leftString + \" \".repeat(spaces) + rightString];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
@@ -67,7 +67,7 @@ export class TopBar {
67
67
  const leftWidth = visibleWidth(leftString);
68
68
  const rightWidth = visibleWidth(rightString);
69
69
  const spaces = Math.max(0, width - leftWidth - rightWidth);
70
- return [leftString + " ".repeat(spaces) + rightString];
70
+ return ["", leftString + " ".repeat(spaces) + rightString];
71
71
  }
72
72
  invalidate() { }
73
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"top-bar.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/top-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@apholdings/jensen-tui\";\nimport { visibleWidth } from \"@apholdings/jensen-tui\";\nimport type { AppAction, KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\nimport { appKey } from \"./keybinding-hints.js\";\n\ntype ModelLike =\n\t| {\n\t\t\tprovider?: string;\n\t\t\tapiProvider?: string;\n\t\t\tid?: string;\n\t\t\tmodelId?: string;\n\t\t\tname?: string;\n\t\t\treasoning?: boolean;\n\t }\n\t| undefined;\n\nexport interface TopBarOptions {\n\tgetModel: () => ModelLike;\n\tgetThinkingLevel: () => string;\n\tkeybindings: KeybindingsManager;\n}\n\nfunction shortenProvider(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic$/i, \"claude\")\n\t\t.replace(/^openai$/i, \"openai\")\n\t\t.replace(/^google$/i, \"google\")\n\t\t.replace(/^zai$/i, \"z.ai\")\n\t\t.replace(/^openrouter$/i, \"orouter\");\n}\n\nfunction shortenModelName(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic\\//, \"\")\n\t\t.replace(/^openai\\//, \"\")\n\t\t.replace(/^google\\//, \"\")\n\t\t.replace(/^zai\\//, \"\")\n\t\t.replace(/^openrouter\\//, \"\")\n\t\t.replace(/^claude-/, \"\")\n\t\t.replace(/^models\\//, \"\");\n}\n\nfunction capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport class TopBar implements Component {\n\tconstructor(private options: TopBarOptions) {}\n\n\tprivate getAppKeyDisplay(action: AppAction): string {\n\t\treturn capitalizeKey(appKey(this.options.keybindings, action));\n\t}\n\n\tprivate getProviderModel(): { provider: string; model: string } {\n\t\tconst model = this.options.getModel();\n\t\tif (!model) {\n\t\t\treturn { provider: \"no-provider\", model: \"no-model\" };\n\t\t}\n\n\t\tconst provider = model.provider ?? model.apiProvider ?? \"unknown\";\n\t\tconst rawModel = model.id ?? model.modelId ?? model.name ?? \"unknown-model\";\n\n\t\treturn {\n\t\t\tprovider: shortenProvider(String(provider)),\n\t\t\tmodel: shortenModelName(String(rawModel)),\n\t\t};\n\t}\n\n\trender(width: number): string[] {\n\t\tconst model = this.options.getModel();\n\t\tconst parts: string[] = [];\n\n\t\tif (model?.reasoning) {\n\t\t\tconst level = this.options.getThinkingLevel();\n\t\t\tconst colorKey = `thinking${level.charAt(0).toUpperCase()}${level.slice(1)}` as ThemeColor;\n\n\t\t\tparts.push(\n\t\t\t\ttheme.fg(\"muted\", this.getAppKeyDisplay(\"cycleThinkingLevel\")) +\n\t\t\t\t\ttheme.fg(\"dim\", \" Thinking: \") +\n\t\t\t\t\ttheme.fg(colorKey, level),\n\t\t\t);\n\t\t}\n\n\t\tparts.push(theme.fg(\"muted\", this.getAppKeyDisplay(\"selectModel\")) + theme.fg(\"dim\", \" Model\"));\n\n\t\tconst leftString = ` ${parts.join(theme.fg(\"dim\", \" · \"))}`;\n\t\tconst pm = this.getProviderModel();\n\n\t\tconst rightCandidates = [theme.fg(\"dim\", `${pm.provider}/${pm.model} `), theme.fg(\"dim\", `${pm.model} `), \"\"];\n\n\t\tconst maxRightWidth = Math.max(0, width - visibleWidth(leftString));\n\t\tconst rightString = rightCandidates.find((candidate) => visibleWidth(candidate) <= maxRightWidth) ?? \"\";\n\n\t\tconst leftWidth = visibleWidth(leftString);\n\t\tconst rightWidth = visibleWidth(rightString);\n\t\tconst spaces = Math.max(0, width - leftWidth - rightWidth);\n\n\t\treturn [leftString + \" \".repeat(spaces) + rightString];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
1
+ {"version":3,"file":"top-bar.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/top-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"@apholdings/jensen-tui\";\nimport { visibleWidth } from \"@apholdings/jensen-tui\";\nimport type { AppAction, KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { type ThemeColor, theme } from \"../theme/theme.js\";\nimport { appKey } from \"./keybinding-hints.js\";\n\ntype ModelLike =\n\t| {\n\t\t\tprovider?: string;\n\t\t\tapiProvider?: string;\n\t\t\tid?: string;\n\t\t\tmodelId?: string;\n\t\t\tname?: string;\n\t\t\treasoning?: boolean;\n\t }\n\t| undefined;\n\nexport interface TopBarOptions {\n\tgetModel: () => ModelLike;\n\tgetThinkingLevel: () => string;\n\tkeybindings: KeybindingsManager;\n}\n\nfunction shortenProvider(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic$/i, \"claude\")\n\t\t.replace(/^openai$/i, \"openai\")\n\t\t.replace(/^google$/i, \"google\")\n\t\t.replace(/^zai$/i, \"z.ai\")\n\t\t.replace(/^openrouter$/i, \"orouter\");\n}\n\nfunction shortenModelName(input: string): string {\n\treturn input\n\t\t.replace(/^anthropic\\//, \"\")\n\t\t.replace(/^openai\\//, \"\")\n\t\t.replace(/^google\\//, \"\")\n\t\t.replace(/^zai\\//, \"\")\n\t\t.replace(/^openrouter\\//, \"\")\n\t\t.replace(/^claude-/, \"\")\n\t\t.replace(/^models\\//, \"\");\n}\n\nfunction capitalizeKey(key: string): string {\n\treturn key\n\t\t.split(\"/\")\n\t\t.map((k) =>\n\t\t\tk\n\t\t\t\t.split(\"+\")\n\t\t\t\t.map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n\t\t\t\t.join(\"+\"),\n\t\t)\n\t\t.join(\"/\");\n}\n\nexport class TopBar implements Component {\n\tconstructor(private options: TopBarOptions) {}\n\n\tprivate getAppKeyDisplay(action: AppAction): string {\n\t\treturn capitalizeKey(appKey(this.options.keybindings, action));\n\t}\n\n\tprivate getProviderModel(): { provider: string; model: string } {\n\t\tconst model = this.options.getModel();\n\t\tif (!model) {\n\t\t\treturn { provider: \"no-provider\", model: \"no-model\" };\n\t\t}\n\n\t\tconst provider = model.provider ?? model.apiProvider ?? \"unknown\";\n\t\tconst rawModel = model.id ?? model.modelId ?? model.name ?? \"unknown-model\";\n\n\t\treturn {\n\t\t\tprovider: shortenProvider(String(provider)),\n\t\t\tmodel: shortenModelName(String(rawModel)),\n\t\t};\n\t}\n\n\trender(width: number): string[] {\n\t\tconst model = this.options.getModel();\n\t\tconst parts: string[] = [];\n\n\t\tif (model?.reasoning) {\n\t\t\tconst level = this.options.getThinkingLevel();\n\t\t\tconst colorKey = `thinking${level.charAt(0).toUpperCase()}${level.slice(1)}` as ThemeColor;\n\n\t\t\tparts.push(\n\t\t\t\ttheme.fg(\"muted\", this.getAppKeyDisplay(\"cycleThinkingLevel\")) +\n\t\t\t\t\ttheme.fg(\"dim\", \" Thinking: \") +\n\t\t\t\t\ttheme.fg(colorKey, level),\n\t\t\t);\n\t\t}\n\n\t\tparts.push(theme.fg(\"muted\", this.getAppKeyDisplay(\"selectModel\")) + theme.fg(\"dim\", \" Model\"));\n\n\t\tconst leftString = ` ${parts.join(theme.fg(\"dim\", \" · \"))}`;\n\t\tconst pm = this.getProviderModel();\n\n\t\tconst rightCandidates = [theme.fg(\"dim\", `${pm.provider}/${pm.model} `), theme.fg(\"dim\", `${pm.model} `), \"\"];\n\n\t\tconst maxRightWidth = Math.max(0, width - visibleWidth(leftString));\n\t\tconst rightString = rightCandidates.find((candidate) => visibleWidth(candidate) <= maxRightWidth) ?? \"\";\n\n\t\tconst leftWidth = visibleWidth(leftString);\n\t\tconst rightWidth = visibleWidth(rightString);\n\t\tconst spaces = Math.max(0, width - leftWidth - rightWidth);\n\n\t\treturn [\"\", leftString + \" \".repeat(spaces) + rightString];\n\t}\n\n\tinvalidate(): void {}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAU,MAAM,wBAAwB,CAAC;AAMzF;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,YAAY,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,aAAkC,EAS1E;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASvC;CACD","sourcesContent":["import { Container, Markdown, type MarkdownTheme, Spacer } from \"@apholdings/jensen-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\n/**\n * Component that renders a user message\n */\nexport class UserMessageComponent extends Container {\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Markdown(text, 1, 1, markdownTheme, {\n\t\t\t\tbgColor: (text: string) => theme.bg(\"userMessageBg\", text),\n\t\t\t\tcolor: (text: string) => theme.fg(\"userMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = lines[lines.length - 1] + OSC133_ZONE_END;\n\t\treturn lines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAU,MAAM,wBAAwB,CAAC;AAMzF;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,YAAY,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,aAAkC,EAW1E;IAEQ,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASvC;CACD","sourcesContent":["import { Container, Markdown, type MarkdownTheme, Spacer } from \"@apholdings/jensen-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\n/**\n * Component that renders a user message\n */\nexport class UserMessageComponent extends Container {\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\n\t\tthis.addChild(\n\t\t\tnew Markdown(text, 1, 1, markdownTheme, {\n\t\t\t\tbgColor: (text: string) => theme.bg(\"userMessageBg\", text),\n\t\t\t\tcolor: (text: string) => theme.fg(\"userMessageText\", text),\n\t\t\t}),\n\t\t);\n\n\t\tthis.addChild(new Spacer(1));\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = lines[lines.length - 1] + OSC133_ZONE_END;\n\t\treturn lines;\n\t}\n}\n"]}
@@ -8,11 +8,11 @@ const OSC133_ZONE_END = "\x1b]133;B\x07";
8
8
  export class UserMessageComponent extends Container {
9
9
  constructor(text, markdownTheme = getMarkdownTheme()) {
10
10
  super();
11
- this.addChild(new Spacer(1));
12
11
  this.addChild(new Markdown(text, 1, 1, markdownTheme, {
13
12
  bgColor: (text) => theme.bg("userMessageBg", text),
14
13
  color: (text) => theme.fg("userMessageText", text),
15
14
  }));
15
+ this.addChild(new Spacer(1));
16
16
  }
17
17
  render(width) {
18
18
  const lines = super.render(width);
@@ -1 +1 @@
1
- {"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAClD,YAAY,IAAY,EAAE,aAAa,GAAkB,gBAAgB,EAAE,EAAE;QAC5E,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CACZ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE;YACvC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC;YAC1D,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAC1D,CAAC,CACF,CAAC;IAAA,CACF;IAEQ,MAAM,CAAC,KAAa,EAAY;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;QACpE,OAAO,KAAK,CAAC;IAAA,CACb;CACD","sourcesContent":["import { Container, Markdown, type MarkdownTheme, Spacer } from \"@apholdings/jensen-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\n/**\n * Component that renders a user message\n */\nexport class UserMessageComponent extends Container {\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Markdown(text, 1, 1, markdownTheme, {\n\t\t\t\tbgColor: (text: string) => theme.bg(\"userMessageBg\", text),\n\t\t\t\tcolor: (text: string) => theme.fg(\"userMessageText\", text),\n\t\t\t}),\n\t\t);\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = lines[lines.length - 1] + OSC133_ZONE_END;\n\t\treturn lines;\n\t}\n}\n"]}
1
+ {"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAClD,YAAY,IAAY,EAAE,aAAa,GAAkB,gBAAgB,EAAE,EAAE;QAC5E,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,QAAQ,CACZ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE;YACvC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC;YAC1D,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC;SAC1D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAC7B;IAEQ,MAAM,CAAC,KAAa,EAAY;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACd,CAAC;QAED,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC;QACpE,OAAO,KAAK,CAAC;IAAA,CACb;CACD","sourcesContent":["import { Container, Markdown, type MarkdownTheme, Spacer } from \"@apholdings/jensen-tui\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\n/**\n * Component that renders a user message\n */\nexport class UserMessageComponent extends Container {\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\n\t\tthis.addChild(\n\t\t\tnew Markdown(text, 1, 1, markdownTheme, {\n\t\t\t\tbgColor: (text: string) => theme.bg(\"userMessageBg\", text),\n\t\t\t\tcolor: (text: string) => theme.fg(\"userMessageText\", text),\n\t\t\t}),\n\t\t);\n\n\t\tthis.addChild(new Spacer(1));\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\tif (lines.length === 0) {\n\t\t\treturn lines;\n\t\t}\n\n\t\tlines[0] = OSC133_ZONE_START + lines[0];\n\t\tlines[lines.length - 1] = lines[lines.length - 1] + OSC133_ZONE_END;\n\t\treturn lines;\n\t}\n}\n"]}