botmux 2.2.6 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +63 -13
- package/README.md +52 -14
- package/dist/adapters/cli/aiden.d.ts.map +1 -1
- package/dist/adapters/cli/aiden.js +0 -40
- package/dist/adapters/cli/aiden.js.map +1 -1
- package/dist/adapters/cli/claude-code.d.ts.map +1 -1
- package/dist/adapters/cli/claude-code.js +27 -63
- package/dist/adapters/cli/claude-code.js.map +1 -1
- package/dist/adapters/cli/coco.d.ts.map +1 -1
- package/dist/adapters/cli/coco.js +0 -33
- package/dist/adapters/cli/coco.js.map +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +0 -27
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/gemini.d.ts.map +1 -1
- package/dist/adapters/cli/gemini.js +1 -29
- package/dist/adapters/cli/gemini.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +1 -44
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +15 -8
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/cli.js +737 -16
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -0
- package/dist/config.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +8 -4
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/scheduler.d.ts +38 -16
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +335 -149
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-manager.d.ts +13 -2
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +128 -25
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +26 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +15 -3
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +233 -31
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +71 -18
- package/dist/daemon.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +29 -1
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +266 -56
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +1 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +200 -40
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +4 -3
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +44 -6
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/services/schedule-store.d.ts +20 -3
- package/dist/services/schedule-store.d.ts.map +1 -1
- package/dist/services/schedule-store.js +140 -16
- package/dist/services/schedule-store.js.map +1 -1
- package/dist/skills/definitions.d.ts +17 -0
- package/dist/skills/definitions.d.ts.map +1 -0
- package/dist/skills/definitions.js +254 -0
- package/dist/skills/definitions.js.map +1 -0
- package/dist/skills/installer.d.ts +9 -0
- package/dist/skills/installer.d.ts.map +1 -0
- package/dist/skills/installer.js +42 -0
- package/dist/skills/installer.js.map +1 -0
- package/dist/types.d.ts +80 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -5
- package/dist/types.js.map +1 -1
- package/dist/utils/lark-upload.d.ts +2 -0
- package/dist/utils/lark-upload.d.ts.map +1 -0
- package/dist/utils/lark-upload.js +27 -0
- package/dist/utils/lark-upload.js.map +1 -0
- package/dist/utils/screen-analyzer.d.ts +67 -0
- package/dist/utils/screen-analyzer.d.ts.map +1 -0
- package/dist/utils/screen-analyzer.js +256 -0
- package/dist/utils/screen-analyzer.js.map +1 -0
- package/dist/utils/screenshot-renderer.d.ts +11 -0
- package/dist/utils/screenshot-renderer.d.ts.map +1 -0
- package/dist/utils/screenshot-renderer.js +225 -0
- package/dist/utils/screenshot-renderer.js.map +1 -0
- package/dist/utils/terminal-renderer.d.ts +33 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -1
- package/dist/utils/terminal-renderer.js +34 -1
- package/dist/utils/terminal-renderer.js.map +1 -1
- package/dist/utils/user-token.d.ts.map +1 -1
- package/dist/utils/user-token.js +7 -11
- package/dist/utils/user-token.js.map +1 -1
- package/dist/worker.js +286 -15
- package/dist/worker.js.map +1 -1
- package/package.json +2 -5
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/server.d.ts +0 -3
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -115
- package/dist/server.js.map +0 -1
- package/dist/tools/get-thread-messages.d.ts +0 -26
- package/dist/tools/get-thread-messages.d.ts.map +0 -1
- package/dist/tools/get-thread-messages.js +0 -35
- package/dist/tools/get-thread-messages.js.map +0 -1
- package/dist/tools/index.d.ts +0 -9
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -10
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/list-bots.d.ts +0 -40
- package/dist/tools/list-bots.d.ts.map +0 -1
- package/dist/tools/list-bots.js +0 -74
- package/dist/tools/list-bots.js.map +0 -1
- package/dist/tools/send-to-thread.d.ts +0 -46
- package/dist/tools/send-to-thread.d.ts.map +0 -1
- package/dist/tools/send-to-thread.js +0 -242
- package/dist/tools/send-to-thread.js.map +0 -1
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders an xterm-headless buffer to a PNG buffer using @napi-rs/canvas.
|
|
3
|
+
* ANSI 256-color palette + RGB true color, bold weight, inverse, default fg/bg.
|
|
4
|
+
* Tokyo Night theme (matches src/worker.ts web terminal).
|
|
5
|
+
*/
|
|
6
|
+
import { createCanvas, GlobalFonts } from '@napi-rs/canvas';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { dirname, join } from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
// ─── Font registration ──────────────────────────────────────────────────────
|
|
11
|
+
// @napi-rs/canvas does NOT auto-discover system fonts on Linux; we must
|
|
12
|
+
// explicitly register a path. We build an ordered fallback chain so missing
|
|
13
|
+
// glyphs in the primary font (e.g. emoji, dingbats) get picked up by a later
|
|
14
|
+
// font in the chain (skia walks the family list per glyph).
|
|
15
|
+
const fontFamilyChain = [];
|
|
16
|
+
let fontInitialized = false;
|
|
17
|
+
function tryRegister(path, alias) {
|
|
18
|
+
if (!existsSync(path))
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
GlobalFonts.registerFromPath(path, alias);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function ensureFontRegistered() {
|
|
29
|
+
if (fontInitialized)
|
|
30
|
+
return;
|
|
31
|
+
fontInitialized = true;
|
|
32
|
+
// 1. Project-bundled font(s) under assets/fonts/ — drop a TTF here to override defaults.
|
|
33
|
+
const projectFontDir = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'assets', 'fonts');
|
|
34
|
+
for (const fname of ['BotmuxMono-Regular.ttf', 'BotmuxMono.ttf', 'BotmuxMono-Regular.otf']) {
|
|
35
|
+
if (tryRegister(join(projectFontDir, fname), 'BotmuxMono')) {
|
|
36
|
+
tryRegister(join(projectFontDir, 'BotmuxMono-Bold.ttf'), 'BotmuxMono');
|
|
37
|
+
fontFamilyChain.push('BotmuxMono');
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 2. CJK monospace — primary for Latin + Han glyphs.
|
|
42
|
+
const cjkRegular = [
|
|
43
|
+
'/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',
|
|
44
|
+
'/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc',
|
|
45
|
+
'/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc',
|
|
46
|
+
'/usr/share/fonts/opentype/noto/NotoSansMonoCJK-Regular.ttc',
|
|
47
|
+
];
|
|
48
|
+
const cjkBold = [
|
|
49
|
+
'/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc',
|
|
50
|
+
'/usr/share/fonts/noto-cjk/NotoSansCJK-Bold.ttc',
|
|
51
|
+
'/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc',
|
|
52
|
+
'/usr/share/fonts/opentype/noto/NotoSansMonoCJK-Bold.ttc',
|
|
53
|
+
];
|
|
54
|
+
for (const p of cjkRegular) {
|
|
55
|
+
if (tryRegister(p)) {
|
|
56
|
+
for (const bp of cjkBold)
|
|
57
|
+
if (tryRegister(bp))
|
|
58
|
+
break;
|
|
59
|
+
fontFamilyChain.push('Noto Sans Mono CJK SC');
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// 3. Latin monospace — DejaVu/Liberation cover dingbats (❯, ✓, etc.) and
|
|
64
|
+
// most box-drawing/geometric symbols not in CJK font.
|
|
65
|
+
const latinCandidates = [
|
|
66
|
+
['/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf', 'DejaVu Sans Mono'],
|
|
67
|
+
['/usr/share/fonts/dejavu/DejaVuSansMono.ttf', 'DejaVu Sans Mono'],
|
|
68
|
+
['/usr/share/fonts/truetype/liberation/LiberationMono-Regular.ttf', 'Liberation Mono'],
|
|
69
|
+
['/usr/share/fonts/liberation/LiberationMono-Regular.ttf', 'Liberation Mono'],
|
|
70
|
+
];
|
|
71
|
+
for (const [p, name] of latinCandidates) {
|
|
72
|
+
if (tryRegister(p)) {
|
|
73
|
+
// Best-effort bold companion
|
|
74
|
+
tryRegister(p.replace(/Regular\.ttf$/, 'Bold.ttf'));
|
|
75
|
+
tryRegister(p.replace(/SansMono\.ttf$/, 'SansMono-Bold.ttf'));
|
|
76
|
+
fontFamilyChain.push(name);
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 4. Color emoji — Noto Color Emoji on Linux, Apple Color Emoji on macOS.
|
|
81
|
+
// skia handles CBDT/CBLC + COLR/CPAL color formats.
|
|
82
|
+
const emojiCandidates = [
|
|
83
|
+
['/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
84
|
+
['/usr/share/fonts/noto/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
85
|
+
['/usr/share/fonts/google-noto-emoji/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
86
|
+
['/Library/Fonts/Apple Color Emoji.ttc', 'Apple Color Emoji'],
|
|
87
|
+
['/System/Library/Fonts/Apple Color Emoji.ttc', 'Apple Color Emoji'],
|
|
88
|
+
];
|
|
89
|
+
for (const [p, name] of emojiCandidates) {
|
|
90
|
+
if (tryRegister(p)) {
|
|
91
|
+
fontFamilyChain.push(name);
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (fontFamilyChain.length === 0)
|
|
96
|
+
fontFamilyChain.push('monospace');
|
|
97
|
+
}
|
|
98
|
+
function fontSpec(bold) {
|
|
99
|
+
const families = fontFamilyChain.map(f => `"${f}"`).join(', ');
|
|
100
|
+
return `${bold ? 'bold ' : ''}${FONT_SIZE}px ${families}, monospace`;
|
|
101
|
+
}
|
|
102
|
+
/** Detect whether the leading codepoint is an emoji/symbol pictograph that
|
|
103
|
+
* uses bitmap glyph metrics — these need vertical centering, not top-align. */
|
|
104
|
+
function isPictograph(ch) {
|
|
105
|
+
if (!ch)
|
|
106
|
+
return false;
|
|
107
|
+
const cp = ch.codePointAt(0) ?? 0;
|
|
108
|
+
return ((cp >= 0x1F300 && cp <= 0x1FAFF) || // emoji + extended pictographs
|
|
109
|
+
(cp >= 0x1F900 && cp <= 0x1F9FF) || // supplemental symbols
|
|
110
|
+
(cp >= 0x1F1E6 && cp <= 0x1F1FF) || // regional indicators (flags)
|
|
111
|
+
(cp >= 0x2600 && cp <= 0x27BF) || // misc symbols + dingbats (✓✗★⚠ etc.)
|
|
112
|
+
cp === 0x231A || cp === 0x231B || // ⌚ ⌛
|
|
113
|
+
cp === 0x23E9 || cp === 0x23EA || cp === 0x23EB || cp === 0x23EC ||
|
|
114
|
+
cp === 0x23F0 || cp === 0x23F3 || // ⏰ ⏳
|
|
115
|
+
cp === 0x25FD || cp === 0x25FE || // ◽ ◾
|
|
116
|
+
cp === 0x2B50 || cp === 0x2B55 || // ⭐ ⭕
|
|
117
|
+
cp === 0x303D || cp === 0x3297 || cp === 0x3299);
|
|
118
|
+
}
|
|
119
|
+
const BG = '#1a1b26';
|
|
120
|
+
const FG = '#a9b1d6';
|
|
121
|
+
const ANSI16 = [
|
|
122
|
+
'#15161e', '#f7768e', '#9ece6a', '#e0af68', '#7aa2f7', '#bb9af7', '#7dcfff', '#a9b1d6',
|
|
123
|
+
'#414868', '#ff7a93', '#b9f27c', '#ff9e64', '#7da6ff', '#bb9af7', '#0db9d7', '#c0caf5',
|
|
124
|
+
];
|
|
125
|
+
const PALETTE_256 = (() => {
|
|
126
|
+
const p = [...ANSI16];
|
|
127
|
+
const ramp = [0, 95, 135, 175, 215, 255];
|
|
128
|
+
for (let r = 0; r < 6; r++) {
|
|
129
|
+
for (let g = 0; g < 6; g++) {
|
|
130
|
+
for (let b = 0; b < 6; b++) {
|
|
131
|
+
p.push(`#${ramp[r].toString(16).padStart(2, '0')}${ramp[g].toString(16).padStart(2, '0')}${ramp[b].toString(16).padStart(2, '0')}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for (let i = 0; i < 24; i++) {
|
|
136
|
+
const v = (8 + i * 10).toString(16).padStart(2, '0');
|
|
137
|
+
p.push(`#${v}${v}${v}`);
|
|
138
|
+
}
|
|
139
|
+
return p;
|
|
140
|
+
})();
|
|
141
|
+
const FONT_SIZE = 14;
|
|
142
|
+
const CELL_W = 8.4;
|
|
143
|
+
const CELL_H = 18;
|
|
144
|
+
const PADDING = 8;
|
|
145
|
+
function colorOf(cell, isBg) {
|
|
146
|
+
const isDefault = isBg ? cell.isBgDefault() : cell.isFgDefault();
|
|
147
|
+
if (isDefault)
|
|
148
|
+
return null;
|
|
149
|
+
const isRGB = isBg ? cell.isBgRGB() : cell.isFgRGB();
|
|
150
|
+
const isPalette = isBg ? cell.isBgPalette() : cell.isFgPalette();
|
|
151
|
+
const v = isBg ? cell.getBgColor() : cell.getFgColor();
|
|
152
|
+
if (isRGB)
|
|
153
|
+
return `#${v.toString(16).padStart(6, '0')}`;
|
|
154
|
+
if (isPalette)
|
|
155
|
+
return PALETTE_256[v] ?? null;
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/** Capture a section of the terminal buffer to a PNG buffer. */
|
|
159
|
+
export function captureToPng(terminal, opts) {
|
|
160
|
+
ensureFontRegistered();
|
|
161
|
+
const { cols, rows, startY } = opts;
|
|
162
|
+
const buffer = terminal.buffer.active;
|
|
163
|
+
const W = Math.ceil(PADDING * 2 + cols * CELL_W);
|
|
164
|
+
const H = PADDING * 2 + rows * CELL_H;
|
|
165
|
+
const canvas = createCanvas(W, H);
|
|
166
|
+
const ctx = canvas.getContext('2d');
|
|
167
|
+
ctx.fillStyle = BG;
|
|
168
|
+
ctx.fillRect(0, 0, W, H);
|
|
169
|
+
ctx.textBaseline = 'top';
|
|
170
|
+
ctx.font = fontSpec(false);
|
|
171
|
+
let currentBold = false;
|
|
172
|
+
for (let row = 0; row < rows; row++) {
|
|
173
|
+
const line = buffer.getLine(startY + row);
|
|
174
|
+
if (!line)
|
|
175
|
+
continue;
|
|
176
|
+
let col = 0;
|
|
177
|
+
while (col < cols) {
|
|
178
|
+
const cell = line.getCell(col);
|
|
179
|
+
if (!cell) {
|
|
180
|
+
col++;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const w = cell.getWidth();
|
|
184
|
+
if (w === 0) {
|
|
185
|
+
col++;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const ch = cell.getChars();
|
|
189
|
+
const x = PADDING + col * CELL_W;
|
|
190
|
+
const y = PADDING + row * CELL_H;
|
|
191
|
+
let fg = colorOf(cell, false) ?? FG;
|
|
192
|
+
let bg = colorOf(cell, true);
|
|
193
|
+
if (cell.isInverse()) {
|
|
194
|
+
const tmp = bg ?? BG;
|
|
195
|
+
bg = fg;
|
|
196
|
+
fg = tmp;
|
|
197
|
+
}
|
|
198
|
+
if (bg) {
|
|
199
|
+
ctx.fillStyle = bg;
|
|
200
|
+
ctx.fillRect(x, y, CELL_W * w, CELL_H);
|
|
201
|
+
}
|
|
202
|
+
if (ch && ch !== ' ') {
|
|
203
|
+
const bold = !!cell.isBold();
|
|
204
|
+
if (bold !== currentBold) {
|
|
205
|
+
currentBold = bold;
|
|
206
|
+
ctx.font = fontSpec(bold);
|
|
207
|
+
}
|
|
208
|
+
ctx.fillStyle = fg;
|
|
209
|
+
// Pictographs (emoji + dingbats) use bitmap metrics that don't align with
|
|
210
|
+
// text top-baseline — center them vertically in the cell instead.
|
|
211
|
+
if (isPictograph(ch)) {
|
|
212
|
+
ctx.textBaseline = 'middle';
|
|
213
|
+
ctx.fillText(ch, x, y + CELL_H / 2);
|
|
214
|
+
ctx.textBaseline = 'top';
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
ctx.fillText(ch, x, y + 2);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
col += w;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return canvas.toBuffer('image/png');
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=screenshot-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-renderer.js","sourceRoot":"","sources":["../../src/utils/screenshot-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless terminal renderer: feeds PTY data into an xterm-headless instance
|
|
3
|
+
* and periodically snapshots the rendered screen for Feishu card updates.
|
|
4
|
+
*
|
|
5
|
+
* Filters out TUI chrome and preamble (logo, version, prompt echo, system
|
|
6
|
+
* instructions) so only the CLI's actual work output appears in the card.
|
|
7
|
+
*
|
|
8
|
+
* Supports two rendering styles:
|
|
9
|
+
* - CLI-style (Claude Code, Aiden): output appends to scrollback. Baseline
|
|
10
|
+
* tracking isolates current-turn content. Phase 1 (OUTPUT_MARKER_RE) gates
|
|
11
|
+
* content detection.
|
|
12
|
+
* - TUI-style (CoCo, Codex): cursor-positioned full-screen UI. Content can
|
|
13
|
+
* be overwritten when the TUI redraws (e.g. response → idle prompt).
|
|
14
|
+
* Viewport fallback + peak retention ensure response content is captured.
|
|
15
|
+
*
|
|
16
|
+
* Timer overlay avoidance: The PTY is intentionally wider than normal so that
|
|
17
|
+
* right-aligned TUI overlays (elapsed time, timeout counters) are rendered
|
|
18
|
+
* far to the right. Snapshots only read the first `contentCols` columns,
|
|
19
|
+
* cleanly excluding the overlay area — no fragile regex stripping needed.
|
|
20
|
+
*/
|
|
21
|
+
import xtermHeadless from '@xterm/headless';
|
|
22
|
+
declare const Terminal: typeof xtermHeadless.Terminal;
|
|
1
23
|
export declare class TerminalRenderer {
|
|
2
24
|
private terminal;
|
|
3
25
|
private lastHash;
|
|
@@ -48,7 +70,18 @@ export declare class TerminalRenderer {
|
|
|
48
70
|
* Used for TUI viewport fallback where output markers differ.
|
|
49
71
|
*/
|
|
50
72
|
private extractContent;
|
|
73
|
+
/**
|
|
74
|
+
* Raw viewport snapshot — no filtering, no phase gating, no chrome removal.
|
|
75
|
+
* Used by ScreenAnalyzer which needs the full screen including ❯ cursor lines.
|
|
76
|
+
*/
|
|
77
|
+
rawSnapshot(): string;
|
|
51
78
|
resize(cols: number, rows: number): void;
|
|
79
|
+
/** Expose the underlying xterm-headless instance for screenshot rendering. */
|
|
80
|
+
get xterm(): InstanceType<typeof Terminal>;
|
|
81
|
+
/** Resolve a startY (absolute line) given a viewport offset (lines from bottom).
|
|
82
|
+
* offsetLines=0 means current viewport top, positive scrolls toward older content. */
|
|
83
|
+
startYFromOffset(offsetLines: number, displayRows: number): number;
|
|
52
84
|
dispose(): void;
|
|
53
85
|
}
|
|
86
|
+
export {};
|
|
54
87
|
//# sourceMappingURL=terminal-renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terminal-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/terminal-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,QAAA,MAAQ,QAAQ,+BAAkB,CAAC;AA8DnC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,QAAQ,CAAM;IACtB,yDAAyD;IACzD,OAAO,CAAC,aAAa,CAAK;IAC1B,6EAA6E;IAC7E,OAAO,CAAC,WAAW,CAAM;IACzB;;;2DAGuD;IACvD,OAAO,CAAC,gBAAgB,CAAS;IACjC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB,CAAQ;gBAEpB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAItC,mDAAmD;IACnD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzB;;;;OAIG;IACH,WAAW,IAAI,IAAI;IAOnB;;;;;;;;;OASG;IACH,QAAQ,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IA4DjD;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA2CtB;;;OAGG;IACH,WAAW,IAAI,MAAM;IAsBrB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIxC,8EAA8E;IAC9E,IAAI,KAAK,IAAI,YAAY,CAAC,OAAO,QAAQ,CAAC,CAA0B;IAEpE;2FACuF;IACvF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAOlE,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -58,7 +58,7 @@ function shouldSkipLine(line) {
|
|
|
58
58
|
}
|
|
59
59
|
/** CLI output markers — lines starting with these indicate real work output.
|
|
60
60
|
* Includes CoCo spinner chars (❇❋✢) alongside Claude Code's markers. */
|
|
61
|
-
const OUTPUT_MARKER_RE =
|
|
61
|
+
const OUTPUT_MARKER_RE = /^\s*[●·⎿✓⚠★☐☑⏵✽✻❇❋✢]/;
|
|
62
62
|
/**
|
|
63
63
|
* How many columns to read from each line for the Feishu card snapshot.
|
|
64
64
|
* Content beyond this is ignored — this is where TUI overlays (timer, timeout)
|
|
@@ -221,9 +221,42 @@ export class TerminalRenderer {
|
|
|
221
221
|
}
|
|
222
222
|
return filtered.join('\n');
|
|
223
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Raw viewport snapshot — no filtering, no phase gating, no chrome removal.
|
|
226
|
+
* Used by ScreenAnalyzer which needs the full screen including ❯ cursor lines.
|
|
227
|
+
*/
|
|
228
|
+
rawSnapshot() {
|
|
229
|
+
const buffer = this.terminal.buffer.active;
|
|
230
|
+
const baseY = buffer.baseY;
|
|
231
|
+
const rows = this.terminal.rows;
|
|
232
|
+
const readCols = Math.min(SNAPSHOT_COLS, this.terminal.cols);
|
|
233
|
+
const endY = baseY + rows;
|
|
234
|
+
const lines = [];
|
|
235
|
+
for (let y = baseY; y < endY; y++) {
|
|
236
|
+
const line = buffer.getLine(y);
|
|
237
|
+
if (!line)
|
|
238
|
+
continue;
|
|
239
|
+
lines.push(cleanBoxDrawing(line.translateToString(true, 0, readCols)));
|
|
240
|
+
}
|
|
241
|
+
// Trim trailing blank lines only
|
|
242
|
+
while (lines.length > 0 && BLANK_RE.test(lines[lines.length - 1])) {
|
|
243
|
+
lines.pop();
|
|
244
|
+
}
|
|
245
|
+
return lines.join('\n');
|
|
246
|
+
}
|
|
224
247
|
resize(cols, rows) {
|
|
225
248
|
this.terminal.resize(cols, rows);
|
|
226
249
|
}
|
|
250
|
+
/** Expose the underlying xterm-headless instance for screenshot rendering. */
|
|
251
|
+
get xterm() { return this.terminal; }
|
|
252
|
+
/** Resolve a startY (absolute line) given a viewport offset (lines from bottom).
|
|
253
|
+
* offsetLines=0 means current viewport top, positive scrolls toward older content. */
|
|
254
|
+
startYFromOffset(offsetLines, displayRows) {
|
|
255
|
+
const buffer = this.terminal.buffer.active;
|
|
256
|
+
const baseY = buffer.baseY;
|
|
257
|
+
const target = baseY - Math.max(0, offsetLines);
|
|
258
|
+
return Math.max(0, target);
|
|
259
|
+
}
|
|
227
260
|
dispose() {
|
|
228
261
|
this.terminal.dispose();
|
|
229
262
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-renderer.js","sourceRoot":"","sources":["../../src/utils/terminal-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,gFAAgF;AAChF,qEAAqE;AACrE,qEAAqE;AAErE,gFAAgF;AAChF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI;SACR,OAAO,CAAC,qBAAqB,EAAE,GAAG,CAAC;SACnC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,EAAE,CAAC;AACf,CAAC;AAED,gFAAgF;AAEhF,kFAAkF;AAClF,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,+CAA+C;AAC/C,MAAM,aAAa,GAAG,YAAY,CAAC;AAEnC;8CAC8C;AAC9C,MAAM,aAAa,GAAG,gGAAgG,CAAC;AAEvH;mEACmE;AACnE,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,sCAAsC;AACtC,MAAM,UAAU,GAAG,6FAA6F,CAAC;AAEjH,8EAA8E;AAC9E,MAAM,cAAc,GAAG,gJAAgJ,CAAC;AAExK,+BAA+B;AAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,CACL,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACrB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED;yEACyE;AACzE,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"terminal-renderer.js","sourceRoot":"","sources":["../../src/utils/terminal-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-token.d.ts","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-token.d.ts","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AA+FD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB/F;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6BpG;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2D3E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAgBvC"}
|
package/dist/utils/user-token.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* User Access Token — self-contained OAuth token management for botmux.
|
|
3
3
|
*
|
|
4
|
-
* Token storage
|
|
4
|
+
* Token storage:
|
|
5
5
|
* 1. FEISHU_USER_ACCESS_TOKEN env var
|
|
6
|
-
* 2. ~/.botmux/data/user-token.json
|
|
7
|
-
* 3. ~/.feishu-cli/token.json (feishu-cli compatibility)
|
|
6
|
+
* 2. ~/.botmux/data/user-token.json
|
|
8
7
|
*
|
|
9
8
|
* OAuth login via /login command writes to botmux's own token file.
|
|
10
9
|
* Auto-refreshes expired access_token using refresh_token.
|
|
@@ -16,7 +15,6 @@ import { randomBytes } from 'node:crypto';
|
|
|
16
15
|
import { logger } from './logger.js';
|
|
17
16
|
// ─── Token paths ──────────────────────────────────────────────────────────────
|
|
18
17
|
const BOTMUX_TOKEN_PATH = join(homedir(), '.botmux', 'data', 'user-token.json');
|
|
19
|
-
const FEISHU_CLI_TOKEN_PATH = join(homedir(), '.feishu-cli', 'token.json');
|
|
20
18
|
const BUFFER_MS = 60_000; // 60s safety margin before expiry
|
|
21
19
|
const pendingLogins = new Map(); // keyed by state
|
|
22
20
|
// ─── Token I/O ────────────────────────────────────────────────────────────────
|
|
@@ -39,14 +37,11 @@ function isValid(isoDate) {
|
|
|
39
37
|
return false;
|
|
40
38
|
return Date.now() + BUFFER_MS < new Date(isoDate).getTime();
|
|
41
39
|
}
|
|
42
|
-
/** Load token from botmux's own file
|
|
40
|
+
/** Load token from botmux's own file. */
|
|
43
41
|
function loadToken() {
|
|
44
|
-
const
|
|
45
|
-
if (
|
|
46
|
-
return { token
|
|
47
|
-
const cli = loadTokenFromPath(FEISHU_CLI_TOKEN_PATH);
|
|
48
|
-
if (cli)
|
|
49
|
-
return { token: cli, source: 'feishu-cli' };
|
|
42
|
+
const token = loadTokenFromPath(BOTMUX_TOKEN_PATH);
|
|
43
|
+
if (token)
|
|
44
|
+
return { token, source: 'botmux' };
|
|
50
45
|
return null;
|
|
51
46
|
}
|
|
52
47
|
// ─── Token refresh ────────────────────────────────────────────────────────────
|
|
@@ -124,6 +119,7 @@ const DEFAULT_PORT = 9768;
|
|
|
124
119
|
const DEFAULT_SCOPES = [
|
|
125
120
|
'im:message:readonly',
|
|
126
121
|
'im:resource',
|
|
122
|
+
'offline_access',
|
|
127
123
|
].join(' ');
|
|
128
124
|
/**
|
|
129
125
|
* Generate an OAuth authorization URL. Returns the URL and stores pending state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-token.js","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"user-token.js","sourceRoot":"","sources":["../../src/utils/user-token.ts"],"names":[],"mappings":"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"}
|