botmux 2.14.0 → 2.15.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/dist/cli.js +56 -11
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +60 -16
- package/dist/daemon.js.map +1 -1
- package/dist/im/lark/client.d.ts +7 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +37 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +3 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +47 -8
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/session-store.d.ts +12 -0
- package/dist/services/session-store.d.ts.map +1 -1
- package/dist/services/session-store.js +19 -2
- package/dist/services/session-store.js.map +1 -1
- package/dist/setup/detect-platform.d.ts +14 -0
- package/dist/setup/detect-platform.d.ts.map +1 -0
- package/dist/setup/detect-platform.js +139 -0
- package/dist/setup/detect-platform.js.map +1 -0
- package/dist/setup/ensure-fonts.d.ts +13 -0
- package/dist/setup/ensure-fonts.d.ts.map +1 -0
- package/dist/setup/ensure-fonts.js +225 -0
- package/dist/setup/ensure-fonts.js.map +1 -0
- package/dist/setup/ensure-tmux.d.ts +11 -0
- package/dist/setup/ensure-tmux.d.ts.map +1 -0
- package/dist/setup/ensure-tmux.js +151 -0
- package/dist/setup/ensure-tmux.js.map +1 -0
- package/dist/setup/index.d.ts +9 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +35 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/utils/bot-mention-dedup.d.ts +26 -0
- package/dist/utils/bot-mention-dedup.d.ts.map +1 -0
- package/dist/utils/bot-mention-dedup.js +56 -0
- package/dist/utils/bot-mention-dedup.js.map +1 -0
- package/dist/utils/screenshot-renderer.d.ts.map +1 -1
- package/dist/utils/screenshot-renderer.js +12 -5
- package/dist/utils/screenshot-renderer.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure tmux is installed before the daemon starts. Strategy (first one
|
|
3
|
+
* that fits wins):
|
|
4
|
+
*
|
|
5
|
+
* 1. Already installed → done.
|
|
6
|
+
* 2. brew available → `brew install tmux` (no sudo)
|
|
7
|
+
* 3. conda/mamba available → `conda install -y -c conda-forge tmux` (no sudo)
|
|
8
|
+
* 4. Linux + system pkg manager:
|
|
9
|
+
* a. NOPASSWD sudo or running as root → run non-interactively
|
|
10
|
+
* b. Has TTY → run interactively (sudo will prompt for password)
|
|
11
|
+
* c. No TTY (autostart / pm2 fork) → skip and throw with manual command
|
|
12
|
+
* 5. Otherwise → throw with manual command.
|
|
13
|
+
*
|
|
14
|
+
* The caller (cli.ts) treats a thrown error as fatal: tmux is non-negotiable
|
|
15
|
+
* for the /adopt + multi-pane Web terminal experience, and the user explicitly
|
|
16
|
+
* opted into hard-fail-on-missing.
|
|
17
|
+
*/
|
|
18
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
19
|
+
import { detectPlatform } from './detect-platform.js';
|
|
20
|
+
function probeTmuxVersion() {
|
|
21
|
+
try {
|
|
22
|
+
const out = execSync('tmux -V', { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 3000 });
|
|
23
|
+
return out.trim();
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Wrap a system command with the appropriate sudo prefix for the current
|
|
30
|
+
* platform context, or return undefined if we cannot escalate (no
|
|
31
|
+
* passwordless sudo and no TTY to prompt on). */
|
|
32
|
+
function sudoPrefix(cmd, info) {
|
|
33
|
+
if (info.isRoot)
|
|
34
|
+
return cmd;
|
|
35
|
+
if (info.passwordlessSudo)
|
|
36
|
+
return ['sudo', '-n', ...cmd];
|
|
37
|
+
if (info.hasTty)
|
|
38
|
+
return ['sudo', ...cmd];
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/** Build the install argv for a given package manager. Pure: returns argv[]
|
|
42
|
+
* ready for spawnSync, no side effects. Returns undefined if escalation
|
|
43
|
+
* isn't possible. */
|
|
44
|
+
function buildInstallArgv(pm, pkg, info) {
|
|
45
|
+
switch (pm) {
|
|
46
|
+
case 'brew': return ['brew', 'install', pkg];
|
|
47
|
+
case 'conda': return ['conda', 'install', '-y', '-c', 'conda-forge', pkg];
|
|
48
|
+
case 'apt': return sudoPrefix(['apt-get', 'install', '-y', pkg], info);
|
|
49
|
+
case 'dnf': return sudoPrefix(['dnf', 'install', '-y', pkg], info);
|
|
50
|
+
case 'yum': return sudoPrefix(['yum', 'install', '-y', pkg], info);
|
|
51
|
+
case 'pacman': return sudoPrefix(['pacman', '-S', '--noconfirm', pkg], info);
|
|
52
|
+
case 'apk': return sudoPrefix(['apk', 'add', pkg], info);
|
|
53
|
+
case 'zypper': return sudoPrefix(['zypper', 'install', '-y', pkg], info);
|
|
54
|
+
case 'unknown': return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** apt-get specifically needs an updated package list on minimal images
|
|
58
|
+
* before the install will find tmux. This is NOT part of buildInstallArgv
|
|
59
|
+
* (which is pure) — it runs once just before the apt install attempt.
|
|
60
|
+
* Failure here is non-fatal; the actual install will fail loudly if it
|
|
61
|
+
* can't find the package. */
|
|
62
|
+
function aptUpdateBeforeInstall(info) {
|
|
63
|
+
const argv = sudoPrefix(['apt-get', 'update'], info);
|
|
64
|
+
if (!argv)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
spawnSync(argv[0], argv.slice(1), { stdio: 'inherit', timeout: 120_000 });
|
|
68
|
+
}
|
|
69
|
+
catch { /* best-effort */ }
|
|
70
|
+
}
|
|
71
|
+
/** Suggest the manual command we'd have run, for the failure message. */
|
|
72
|
+
function suggestManualCommand(pm, pkg) {
|
|
73
|
+
switch (pm) {
|
|
74
|
+
case 'brew': return `brew install ${pkg}`;
|
|
75
|
+
case 'conda': return `conda install -y -c conda-forge ${pkg}`;
|
|
76
|
+
case 'apt': return `sudo apt-get update && sudo apt-get install -y ${pkg}`;
|
|
77
|
+
case 'dnf': return `sudo dnf install -y ${pkg}`;
|
|
78
|
+
case 'yum': return `sudo yum install -y ${pkg}`;
|
|
79
|
+
case 'pacman': return `sudo pacman -S --noconfirm ${pkg}`;
|
|
80
|
+
case 'apk': return `sudo apk add ${pkg}`;
|
|
81
|
+
case 'zypper': return `sudo zypper install -y ${pkg}`;
|
|
82
|
+
default: return `(请手动安装 ${pkg})`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function runInstall(argv) {
|
|
86
|
+
const result = spawnSync(argv[0], argv.slice(1), {
|
|
87
|
+
stdio: 'inherit',
|
|
88
|
+
timeout: 10 * 60_000, // 10 min — apt-get on slow networks
|
|
89
|
+
});
|
|
90
|
+
return result.status === 0;
|
|
91
|
+
}
|
|
92
|
+
export async function ensureTmux(info) {
|
|
93
|
+
const platform = info ?? detectPlatform();
|
|
94
|
+
// Step 1: already installed?
|
|
95
|
+
const existing = probeTmuxVersion();
|
|
96
|
+
if (existing) {
|
|
97
|
+
return { installed: true, version: existing, freshInstall: false };
|
|
98
|
+
}
|
|
99
|
+
console.log('⚠️ tmux 未检测到,正在安装...');
|
|
100
|
+
// Step 2..4: walk the package-manager preference list.
|
|
101
|
+
const tried = [];
|
|
102
|
+
for (const pm of platform.packageManagers) {
|
|
103
|
+
if (pm === 'unknown')
|
|
104
|
+
continue;
|
|
105
|
+
const argv = buildInstallArgv(pm, 'tmux', platform);
|
|
106
|
+
if (!argv) {
|
|
107
|
+
tried.push(`${pm}(跳过:当前用户无 sudo 且无 TTY)`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (pm === 'apt')
|
|
111
|
+
aptUpdateBeforeInstall(platform);
|
|
112
|
+
console.log(` 尝试 ${pm}: ${argv.join(' ')}`);
|
|
113
|
+
if (runInstall(argv)) {
|
|
114
|
+
const v = probeTmuxVersion();
|
|
115
|
+
if (v) {
|
|
116
|
+
console.log(`✅ tmux ${v} 安装完成 (via ${pm})`);
|
|
117
|
+
return { installed: true, version: v, freshInstall: true, strategy: pm };
|
|
118
|
+
}
|
|
119
|
+
tried.push(`${pm}(命令成功但 tmux -V 仍失败)`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
tried.push(`${pm}(命令返回非零)`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Build a useful failure message with the most relevant manual command.
|
|
126
|
+
const preferred = platform.packageManagers.find(p => p !== 'unknown') ?? 'unknown';
|
|
127
|
+
const manual = suggestManualCommand(preferred, 'tmux');
|
|
128
|
+
const lines = [
|
|
129
|
+
'❌ 自动安装 tmux 失败',
|
|
130
|
+
'',
|
|
131
|
+
'已尝试:',
|
|
132
|
+
...tried.map(t => ` - ${t}`),
|
|
133
|
+
'',
|
|
134
|
+
'请手动安装后重试:',
|
|
135
|
+
` ${manual}`,
|
|
136
|
+
];
|
|
137
|
+
// macOS without Homebrew → guide the user to install brew first.
|
|
138
|
+
if (platform.os === 'darwin' && !platform.packageManagers.includes('brew')) {
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('macOS 推荐先安装 Homebrew:');
|
|
141
|
+
lines.push(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
|
|
142
|
+
lines.push('安装完成后重试 `botmux start`,会走 brew 自动装 tmux。');
|
|
143
|
+
}
|
|
144
|
+
if (!platform.hasTty && !platform.isRoot && !platform.passwordlessSudo && platform.os === 'linux') {
|
|
145
|
+
lines.push('');
|
|
146
|
+
lines.push('提示:当前不是交互式 TTY 且 sudo 需要密码,systemd/pm2 自启场景下无法弹密码。');
|
|
147
|
+
lines.push('请在 shell 中手动跑一次 `botmux start`,或配置 NOPASSWD sudoers 后再启用 autostart。');
|
|
148
|
+
}
|
|
149
|
+
throw new Error(lines.join('\n'));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=ensure-tmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-tmux.js","sourceRoot":"","sources":["../../src/setup/ensure-tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type TmuxResult } from './ensure-tmux.js';
|
|
2
|
+
import { type FontResult } from './ensure-fonts.js';
|
|
3
|
+
export interface DependenciesReport {
|
|
4
|
+
tmux: TmuxResult;
|
|
5
|
+
fonts: FontResult;
|
|
6
|
+
}
|
|
7
|
+
export { botmuxFontDir } from './ensure-fonts.js';
|
|
8
|
+
export declare function ensureDependencies(): Promise<DependenciesReport>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAsBtE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency bootstrap. Called from `botmux start` and `botmux restart` so
|
|
3
|
+
* a fresh machine that just `npm i -g botmux`'d gets tmux + screenshot fonts
|
|
4
|
+
* provisioned without manual setup.
|
|
5
|
+
*
|
|
6
|
+
* - tmux is required: a failed install throws so cli.ts can exit non-zero.
|
|
7
|
+
* - fonts are nice-to-have: failures only print a warning.
|
|
8
|
+
*/
|
|
9
|
+
import { detectPlatform } from './detect-platform.js';
|
|
10
|
+
import { ensureTmux } from './ensure-tmux.js';
|
|
11
|
+
import { ensureFonts } from './ensure-fonts.js';
|
|
12
|
+
export { botmuxFontDir } from './ensure-fonts.js';
|
|
13
|
+
export async function ensureDependencies() {
|
|
14
|
+
const platform = detectPlatform();
|
|
15
|
+
// tmux first — it's the load-bearing dep. Throws on failure.
|
|
16
|
+
const tmux = await ensureTmux(platform);
|
|
17
|
+
if (!tmux.freshInstall) {
|
|
18
|
+
console.log(`✓ tmux ${tmux.version} (existing)`);
|
|
19
|
+
}
|
|
20
|
+
// Fonts second — best-effort.
|
|
21
|
+
const fonts = await ensureFonts(platform);
|
|
22
|
+
if (fonts.failed.length === 0) {
|
|
23
|
+
if (platform.os === 'darwin') {
|
|
24
|
+
console.log('✓ 字体: 系统字体已就绪 (macOS)');
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
console.log(`✓ 字体: ${fonts.ready.join(' / ')} 已就绪`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.warn(`⚠️ 字体部分缺失: ${fonts.failed.join(' / ')} —— 飞书截图中相关字符可能渲染为方块`);
|
|
32
|
+
}
|
|
33
|
+
return { tmux, fonts };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAOjE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,6DAA6D;IAC7D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,8BAA8B;IAC9B,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-path dedup for bot-to-bot @mentions.
|
|
3
|
+
*
|
|
4
|
+
* Two routes can deliver the same `botmux send --mention <peer>` to a target
|
|
5
|
+
* daemon:
|
|
6
|
+
* 1. Lark WSClient → event-dispatcher → handleThreadReply
|
|
7
|
+
* 2. signal-file watcher → processBotMentionSignal
|
|
8
|
+
*
|
|
9
|
+
* Whichever fires first records the inbound message_id here; the other side
|
|
10
|
+
* checks before forwarding to the worker so we never enqueue the same turn
|
|
11
|
+
* twice. Keyed by inbound message_id (not session/anchor) so it is robust to
|
|
12
|
+
* reordering and to stale `lastMessageAt` from prior unrelated turns.
|
|
13
|
+
*
|
|
14
|
+
* In-memory only (one instance per daemon process). Entries expire after
|
|
15
|
+
* `TTL_MS` to keep the map bounded; 30s is well past any realistic gap
|
|
16
|
+
* between the two paths.
|
|
17
|
+
*/
|
|
18
|
+
/** Mark this messageId as already routed to the worker by one of the two
|
|
19
|
+
* paths. Calling twice for the same id is a no-op. */
|
|
20
|
+
export declare function markBotMentionMessageHandled(messageId: string | undefined): void;
|
|
21
|
+
/** Did we already route this messageId? Returns true if the other path got
|
|
22
|
+
* there first within the TTL window. */
|
|
23
|
+
export declare function isBotMentionMessageHandled(messageId: string | undefined): boolean;
|
|
24
|
+
/** Test seam — drop everything. */
|
|
25
|
+
export declare function _resetForTest(): void;
|
|
26
|
+
//# sourceMappingURL=bot-mention-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-mention-dedup.d.ts","sourceRoot":"","sources":["../../src/utils/bot-mention-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH;uDACuD;AACvD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAIhF;AAED;yCACyC;AACzC,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CASjF;AAED,mCAAmC;AACnC,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-path dedup for bot-to-bot @mentions.
|
|
3
|
+
*
|
|
4
|
+
* Two routes can deliver the same `botmux send --mention <peer>` to a target
|
|
5
|
+
* daemon:
|
|
6
|
+
* 1. Lark WSClient → event-dispatcher → handleThreadReply
|
|
7
|
+
* 2. signal-file watcher → processBotMentionSignal
|
|
8
|
+
*
|
|
9
|
+
* Whichever fires first records the inbound message_id here; the other side
|
|
10
|
+
* checks before forwarding to the worker so we never enqueue the same turn
|
|
11
|
+
* twice. Keyed by inbound message_id (not session/anchor) so it is robust to
|
|
12
|
+
* reordering and to stale `lastMessageAt` from prior unrelated turns.
|
|
13
|
+
*
|
|
14
|
+
* In-memory only (one instance per daemon process). Entries expire after
|
|
15
|
+
* `TTL_MS` to keep the map bounded; 30s is well past any realistic gap
|
|
16
|
+
* between the two paths.
|
|
17
|
+
*/
|
|
18
|
+
const TTL_MS = 30_000;
|
|
19
|
+
const seen = new Map(); // messageId → expiresAt (epoch ms)
|
|
20
|
+
/** Mark this messageId as already routed to the worker by one of the two
|
|
21
|
+
* paths. Calling twice for the same id is a no-op. */
|
|
22
|
+
export function markBotMentionMessageHandled(messageId) {
|
|
23
|
+
if (!messageId)
|
|
24
|
+
return;
|
|
25
|
+
gc();
|
|
26
|
+
seen.set(messageId, Date.now() + TTL_MS);
|
|
27
|
+
}
|
|
28
|
+
/** Did we already route this messageId? Returns true if the other path got
|
|
29
|
+
* there first within the TTL window. */
|
|
30
|
+
export function isBotMentionMessageHandled(messageId) {
|
|
31
|
+
if (!messageId)
|
|
32
|
+
return false;
|
|
33
|
+
const expiresAt = seen.get(messageId);
|
|
34
|
+
if (expiresAt === undefined)
|
|
35
|
+
return false;
|
|
36
|
+
if (expiresAt < Date.now()) {
|
|
37
|
+
seen.delete(messageId);
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
/** Test seam — drop everything. */
|
|
43
|
+
export function _resetForTest() {
|
|
44
|
+
seen.clear();
|
|
45
|
+
}
|
|
46
|
+
function gc() {
|
|
47
|
+
// Cheap incremental GC: only sweep when we cross a small threshold.
|
|
48
|
+
if (seen.size < 64)
|
|
49
|
+
return;
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
for (const [k, v] of seen) {
|
|
52
|
+
if (v < now)
|
|
53
|
+
seen.delete(k);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=bot-mention-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-mention-dedup.js","sourceRoot":"","sources":["../../src/utils/bot-mention-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,GAAG,MAAM,CAAC;AAEtB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,mCAAmC;AAE3E;uDACuD;AACvD,MAAM,UAAU,4BAA4B,CAAC,SAA6B;IACxE,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,EAAE,EAAE,CAAC;IACL,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;yCACyC;AACzC,MAAM,UAAU,0BAA0B,CAAC,SAA6B;IACtE,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;AACf,CAAC;AAED,SAAS,EAAE;IACT,oEAAoE;IACpE,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE;QAAE,OAAO;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,GAAG;YAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/screenshot-renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"screenshot-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/screenshot-renderer.ts"],"names":[],"mappings":"AAUA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AA4J5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAqE1E"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { createCanvas, GlobalFonts } from '@napi-rs/canvas';
|
|
7
7
|
import { existsSync } from 'node:fs';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
8
9
|
import { dirname, join } from 'node:path';
|
|
9
10
|
import { fileURLToPath } from 'node:url';
|
|
10
11
|
// ─── Font registration ──────────────────────────────────────────────────────
|
|
@@ -39,8 +40,11 @@ function ensureFontRegistered() {
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
// 2. CJK monospace — primary for Latin + Han glyphs.
|
|
42
|
-
// Linux: Noto Sans CJK(需要 fonts-noto-cjk
|
|
43
|
+
// Linux: Noto Sans CJK(需要 fonts-noto-cjk 包,或 botmux setup 自动下载到 ~/.botmux/fonts/);
|
|
44
|
+
// macOS: 系统自带 PingFang/Hiragino。
|
|
45
|
+
const userFontDir = join(homedir(), '.botmux', 'fonts');
|
|
43
46
|
const cjkCandidates = [
|
|
47
|
+
{ regular: join(userFontDir, 'NotoSansMonoCJKsc-Regular.otf'), bold: join(userFontDir, 'NotoSansMonoCJKsc-Bold.otf'), family: 'Noto Sans Mono CJK SC' },
|
|
44
48
|
{ regular: '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc', bold: '/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc', family: 'Noto Sans Mono CJK SC' },
|
|
45
49
|
{ regular: '/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc', bold: '/usr/share/fonts/noto-cjk/NotoSansCJK-Bold.ttc', family: 'Noto Sans Mono CJK SC' },
|
|
46
50
|
{ regular: '/usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc', bold: '/usr/share/fonts/google-noto-cjk/NotoSansCJK-Bold.ttc', family: 'Noto Sans Mono CJK SC' },
|
|
@@ -58,18 +62,20 @@ function ensureFontRegistered() {
|
|
|
58
62
|
break;
|
|
59
63
|
}
|
|
60
64
|
}
|
|
61
|
-
// 3. Latin monospace — DejaVu/Liberation cover dingbats (❯,
|
|
62
|
-
// most box-drawing/geometric symbols not in CJK font.
|
|
65
|
+
// 3. Latin monospace — DejaVu/Liberation/JetBrains Mono cover dingbats (❯,
|
|
66
|
+
// ✓, etc.) and most box-drawing/geometric symbols not in CJK font.
|
|
63
67
|
const latinCandidates = [
|
|
68
|
+
[join(userFontDir, 'JetBrainsMono-Regular.ttf'), 'JetBrains Mono'],
|
|
64
69
|
['/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf', 'DejaVu Sans Mono'],
|
|
65
70
|
['/usr/share/fonts/dejavu/DejaVuSansMono.ttf', 'DejaVu Sans Mono'],
|
|
66
71
|
['/usr/share/fonts/truetype/liberation/LiberationMono-Regular.ttf', 'Liberation Mono'],
|
|
67
72
|
['/usr/share/fonts/liberation/LiberationMono-Regular.ttf', 'Liberation Mono'],
|
|
73
|
+
['/usr/share/fonts/truetype/jetbrains-mono/JetBrainsMono-Regular.ttf', 'JetBrains Mono'],
|
|
68
74
|
];
|
|
69
75
|
for (const [p, name] of latinCandidates) {
|
|
70
76
|
if (tryRegister(p)) {
|
|
71
|
-
// Best-effort bold companion
|
|
72
|
-
tryRegister(p.replace(
|
|
77
|
+
// Best-effort bold companion. Same dir, replace -Regular with -Bold.
|
|
78
|
+
tryRegister(p.replace(/-Regular\.ttf$/, '-Bold.ttf'));
|
|
73
79
|
tryRegister(p.replace(/SansMono\.ttf$/, 'SansMono-Bold.ttf'));
|
|
74
80
|
fontFamilyChain.push(name);
|
|
75
81
|
break;
|
|
@@ -78,6 +84,7 @@ function ensureFontRegistered() {
|
|
|
78
84
|
// 4. Color emoji — Noto Color Emoji on Linux, Apple Color Emoji on macOS.
|
|
79
85
|
// skia handles CBDT/CBLC + COLR/CPAL color formats.
|
|
80
86
|
const emojiCandidates = [
|
|
87
|
+
[join(userFontDir, 'NotoColorEmoji.ttf'), 'Noto Color Emoji'],
|
|
81
88
|
['/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
82
89
|
['/usr/share/fonts/noto/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
83
90
|
['/usr/share/fonts/google-noto-emoji/NotoColorEmoji.ttf', 'Noto Color Emoji'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot-renderer.js","sourceRoot":"","sources":["../../src/utils/screenshot-renderer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,+EAA+E;AAC/E,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,4DAA4D;AAE5D,MAAM,eAAe,GAAa,EAAE,CAAC;AACrC,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,SAAS,WAAW,CAAC,IAAY,EAAE,KAAc;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC;QAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAC/D,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACzB,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,eAAe;QAAE,OAAO;IAC5B,eAAe,GAAG,IAAI,CAAC;IAEvB,yFAAyF;IACzF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACpG,KAAK,MAAM,KAAK,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,wBAAwB,CAAC,EAAE,CAAC;QAC3F,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC;YAC3D,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,EAAE,YAAY,CAAC,CAAC;YACvE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,MAAM;QACR,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,
|
|
1
|
+
{"version":3,"file":"screenshot-renderer.js","sourceRoot":"","sources":["../../src/utils/screenshot-renderer.ts"],"names":[],"mappings":"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"}
|