@oatelauser/crosschat 1.5.1 → 1.5.3

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.
@@ -4,7 +4,7 @@
4
4
  * runSend,fileInbox 落盘本机收件)。
5
5
  */
6
6
  import { execSync, spawn } from 'node:child_process';
7
- import { appendFileSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';
7
+ import { appendFileSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs';
8
8
  import { randomBytes } from 'node:crypto';
9
9
  import { homedir, hostname, networkInterfaces } from 'node:os';
10
10
  import { fileURLToPath } from 'node:url';
@@ -13,7 +13,7 @@ import process from 'node:process';
13
13
  import { MultichatError } from '../errors.js';
14
14
  import { machineId } from '../platform/machine-id.js';
15
15
  import { Broker, DEFAULT_PORT, defaultDeliverLocal } from '../serve/broker.js';
16
- import { genKeys, listNodes, readRegistry, registryFileOf, removeNode, setPort, tcpDir, writeRegistry } from '../serve/registry.js';
16
+ import { ensureStarId, genKeys, listNodes, readRegistry, registryFileOf, removeNode, setPort, tcpDir, writeRegistry } from '../serve/registry.js';
17
17
  import { deliverViaRunSend, NodeClient, readNodeConfig } from '../serve/node.js';
18
18
  import { FileInbox } from '../serve/file-channel.js';
19
19
  export function realServeDeps() {
@@ -46,16 +46,24 @@ export async function runServe(args, deps) {
46
46
  return runList(deps, registryFile);
47
47
  if (args.remove !== undefined)
48
48
  return runRemove(args.remove, deps, registryFile);
49
+ if (args.stopSelector !== undefined)
50
+ return runStopSelector(args.stopSelector, deps);
49
51
  if (args.stopTarget !== undefined)
50
52
  return runStop(args.stopTarget, deps, registryFile);
51
53
  const detachedChild = deps.env.CROSSCHAT_SERVE_DETACHED === '1';
52
54
  if (args.connect !== undefined) {
53
- if (args.detach && !detachedChild)
54
- return runDetach(deps, ['--connect', ...(args.connect === '' ? [] : [args.connect])], 'node.log');
55
+ if (args.detach && !detachedChild) {
56
+ const logName = args.connect === '' ? 'node.log' : `node-${args.connect}.log`;
57
+ return runDetach(deps, ['--connect', ...(args.connect === '' ? [] : [args.connect])], logName);
58
+ }
55
59
  return runForegroundNode(args.connect, deps);
56
60
  }
57
- if (args.detach && !detachedChild)
58
- return runDetach(deps, [], 'broker.log');
61
+ if (args.detach && !detachedChild) {
62
+ // 父进程先自登记并出声(子进程里再跑是幂等空转)——后台模式控制台不留黑盒
63
+ const effectivePort = port ?? readRegistry(registryFile).port ?? DEFAULT_PORT;
64
+ announceSelfEntry(deps, ensureSelfEntry(deps, registryFile, effectivePort));
65
+ return runDetach(deps, [], 'broker.log', effectivePort);
66
+ }
59
67
  return runForegroundBroker(deps, port);
60
68
  }
61
69
  function runGenKey(genKeyArg, deps, registryFile, port) {
@@ -65,13 +73,19 @@ function runGenKey(genKeyArg, deps, registryFile, port) {
65
73
  }
66
74
  const host = firstNonInternalIPv4(deps.networkInterfaces());
67
75
  const portNum = port ?? readRegistry(registryFile).port ?? DEFAULT_PORT;
68
- const results = genKeys(registryFile, n, { host, port: portNum, alias: deps.hostname() });
69
- deps.stdout(`自动探测 broker 地址:${host}(只取第一个网卡,可能不对——请人工核对,不保证正确)`);
70
- deps.stdout('分发前把每份 node.json 的 name 改成目标机器名(人读用,回信不依赖它——寻址走 machine-id 前缀)');
76
+ const results = genKeys(registryFile, n, { host, port: portNum, alias: deps.hostname(), starId: ensureStarId(registryFile) });
77
+ deps.stdout(`自动探测 broker 地址:${host}:${portNum}(多网卡/NAT 常探错——按下述规则人工核对改写 node.json 的 host 与 port):`);
78
+ deps.stdout(' · broker 机自身 → 无需分发(首次 serve 已自动写好 127.0.0.1 的自用 node.json)');
79
+ deps.stdout(' · broker 是云主机/NAT 内网机 → host 填对外公网 IP(探测常拿内网 IP,必核对)');
80
+ deps.stdout(' · 普通局域网 → broker 机的局域网 IP;broker 用非默认端口时 port 一并改');
81
+ deps.stdout('分发前把每份 node.json 的 name 改成「贴这份配置的机器」的自报名字(建议=其 hostname;纯显示用——roster 怎么称呼它,寻址/回信不依赖,走 machine-id 前缀)');
71
82
  for (const result of results) {
72
83
  deps.stdout('--------------------------------');
73
84
  deps.stdout(result.nodeJsonContent.trimEnd());
74
85
  }
86
+ deps.stdout('放置路径(目标机器):~/.crosschat/tcp/node.json(win 写法 C:\\Users\\<用户>\\.crosschat\\tcp\\node.json)');
87
+ deps.stdout('多星:一台机入多个 broker 时,把各星钥匙的条目合并进同一份 brokers 数组即可;本配置为数组形状,目标机 crosschat 需 ≥1.5.2');
88
+ deps.stdout('本命令须在 broker 机上执行(钥匙登记进本机 broker.json);broker 机自己的 node.json 已由首次 serve 自动写好,勿用上面的钥匙覆盖');
75
89
  deps.stdout('钥匙已进入终端回滚缓冲,分发完建议清屏');
76
90
  return 0;
77
91
  }
@@ -99,8 +113,8 @@ function runRemove(label, deps, registryFile) {
99
113
  deps.stdout(removed ? `已移除 ${label}` : `未找到 ${label}`);
100
114
  return removed ? 0 : 1;
101
115
  }
102
- /** 后台化:spawn 自身 detached + env 标记防循环;日志写 tcp/<name>。 */
103
- function runDetach(deps, extraArgs, logName) {
116
+ /** 后台化:spawn 自身 detached + env 标记防循环;日志写 tcp/<name>(B2 节点命名条目=node-<选择器>.log)。broker 传端口(节点客户端外连无监听口)。 */
117
+ function runDetach(deps, extraArgs, logName, portNum) {
104
118
  const logFile = join(tcpDir(deps.baseDir), logName);
105
119
  mkdirSync(tcpDir(deps.baseDir), { recursive: true });
106
120
  const fd = openSync(logFile, 'a');
@@ -111,18 +125,13 @@ function runDetach(deps, extraArgs, logName) {
111
125
  env: { ...deps.env, CROSSCHAT_SERVE_DETACHED: '1' },
112
126
  });
113
127
  child.unref();
114
- deps.stdout(`${logName === 'node.log' ? '节点客户端' : 'broker'} 后台运行中 pid=${child.pid}(日志:${logFile})`);
128
+ deps.stdout(`${logName.startsWith('node') ? '节点客户端' : 'broker'} 后台运行中 pid=${child.pid}${portNum !== undefined ? ` 端口 ${portNum}` : ''}(日志:${logFile})`);
115
129
  return 0;
116
130
  }
117
- /**
118
- * B2.1:broker 首启自登记——本机条目直接落注册表(machineId=本机、name=hostname),
119
- * 并自动写本机 node.json(host=127.0.0.1)。broker 机与其他节点完全同构:
120
- * 其他机器可立即用 mid8/名字寻址本机,本机 send --via tcp: 也有凭证,零管理员动作。
121
- */
122
131
  export function ensureSelfEntry(deps, registryFile, port) {
123
132
  const mid = deps.machineId();
124
133
  if (mid === undefined || mid === '')
125
- return;
134
+ return undefined;
126
135
  const registry = readRegistry(registryFile);
127
136
  let self = registry.nodes.find((node) => node.machineId === mid);
128
137
  if (self === undefined) {
@@ -133,7 +142,73 @@ export function ensureSelfEntry(deps, registryFile, port) {
133
142
  const nodeJson = join(tcpDir(deps.baseDir), 'node.json');
134
143
  if (!existsSync(nodeJson)) {
135
144
  mkdirSync(tcpDir(deps.baseDir), { recursive: true });
136
- writeFileSync(nodeJson, `${JSON.stringify({ broker: { host: '127.0.0.1', port, alias: deps.hostname() }, key: self.key, name: deps.hostname() }, null, 2)}\n`, 'utf8');
145
+ // B0:自用 node.json 同带 starId(与 gen-key 分发的钥匙同构);
146
+ // 新写一律数组形状(单星=一项,多星=多项——只产出一种形状)
147
+ const starId = ensureStarId(registryFile);
148
+ writeFileSync(nodeJson, `${JSON.stringify({ brokers: [{ host: '127.0.0.1', port, alias: deps.hostname(), starId, key: self.key }], name: deps.hostname() }, null, 2)}\n`, 'utf8');
149
+ return { status: 'written' };
150
+ }
151
+ // 已存在:宽松解析判状态(双形状;坏文件交给上层教学报错)
152
+ let entries;
153
+ try {
154
+ entries = readNodeConfig(nodeJson).entries;
155
+ }
156
+ catch {
157
+ return { status: 'stale' };
158
+ }
159
+ // 找本 broker 的钥匙条目(多星机上自用条目可与外星条目共存于同一数组)
160
+ const mine = entries.find((e) => e.key === self.key);
161
+ if (mine === undefined) {
162
+ const first = entries[0];
163
+ return { status: 'foreign', host: first?.host, port: first?.port };
164
+ }
165
+ if (mine.host !== '127.0.0.1' || mine.port !== port)
166
+ return { status: 'stale' };
167
+ // B1:钥匙/host/port 匹配但条目缺 starId(B0 之前写下的自用 node.json)→
168
+ // 原子补写注册表 starId,其余字段不碰
169
+ if (mine.starId === undefined)
170
+ backfillSelfStarId(nodeJson, self.key, ensureStarId(registryFile));
171
+ return { status: 'ok' };
172
+ }
173
+ /** B1:自用条目补 starId(双形状:数组元素/旧 broker 对象;tmp+rename 原子写);失败不倒 serve。 */
174
+ function backfillSelfStarId(nodeJson, selfKey, starId) {
175
+ try {
176
+ const raw = JSON.parse(readFileSync(nodeJson, 'utf8'));
177
+ if (raw === null || typeof raw !== 'object')
178
+ return;
179
+ if (Array.isArray(raw.brokers)) {
180
+ const mine = raw.brokers.find((e) => e !== null && typeof e === 'object' && e.key === selfKey && e.starId === undefined);
181
+ if (mine === undefined)
182
+ return;
183
+ mine.starId = starId;
184
+ }
185
+ else if (raw.broker !== null && typeof raw.broker === 'object' && raw.broker.starId === undefined && raw.key === selfKey) {
186
+ raw.broker.starId = starId;
187
+ }
188
+ else {
189
+ return;
190
+ }
191
+ const tmp = `${nodeJson}.tmp`;
192
+ writeFileSync(tmp, `${JSON.stringify(raw, null, 2)}\n`, 'utf8');
193
+ renameSync(tmp, nodeJson);
194
+ }
195
+ catch {
196
+ // 补写失败不倒 serve(下次启动再试)
197
+ }
198
+ }
199
+ /** 自登记结局出声(written/foreign/stale 三种;ok 静默——状态没变不刷屏)。 */
200
+ function announceSelfEntry(deps, result) {
201
+ if (result === undefined)
202
+ return;
203
+ const path = join(tcpDir(deps.baseDir), 'node.json');
204
+ if (result.status === 'written') {
205
+ deps.stdout(`已自动生成本机 node.json(${path},host=127.0.0.1——本机 send --via tcp: 凭证)`);
206
+ }
207
+ else if (result.status === 'foreign') {
208
+ deps.stdout(`检测到已有 node.json(指向 ${result.host}:${result.port})——本机 tcp 发送将走它;若本机现在是 broker 要自连,移走该文件后重启 serve`);
209
+ }
210
+ else if (result.status === 'stale') {
211
+ deps.stdout(`检测到已有 node.json 但钥匙/端口与当前 broker 不符(陈旧或损坏)——本地发送会失败;删除该文件重启 serve 可重建(${path})`);
137
212
  }
138
213
  }
139
214
  async function runForegroundBroker(deps, port) {
@@ -149,6 +224,9 @@ async function runForegroundBroker(deps, port) {
149
224
  }
150
225
  }
151
226
  : (line) => deps.stdout(line);
227
+ // B1 多星:broker 自投递签发的 ref 盖注册表星标识(与 gen-key 分发的钥匙同源)
228
+ const registryFile = registryFileOf(deps.baseDir);
229
+ const registryStarId = ensureStarId(registryFile);
152
230
  // B2:broker 机自己也是全权节点——deliverLocal 接 runSend、file 落本机收件。
153
231
  const deliverLocal = deps.makeSendDeps === undefined
154
232
  ? defaultDeliverLocal
@@ -162,7 +240,7 @@ async function runForegroundBroker(deps, port) {
162
240
  conversation: frame.conversation,
163
241
  origin: frame.origin,
164
242
  };
165
- const r = await deliverViaRunSend(deliver, deps.makeSendDeps());
243
+ const r = await deliverViaRunSend(deliver, { ...deps.makeSendDeps(), refStarId: registryStarId });
166
244
  // deliverViaRunSend 的失败即 ResultFrame{status:'error'}——规整为
167
245
  // ErrorFrame,broker 本地分支的失败语义(op:'error')保持 B1 不变。
168
246
  return r.status === 'error'
@@ -170,7 +248,10 @@ async function runForegroundBroker(deps, port) {
170
248
  : r;
171
249
  };
172
250
  // B2.1:起服务前自登记(本机=全权成员,mid8/名字可寻址 + 本机 node.json)。
173
- ensureSelfEntry(deps, registryFileOf(deps.baseDir), port ?? readRegistry(registryFileOf(deps.baseDir)).port ?? DEFAULT_PORT);
251
+ // 后台子进程不重复出声——父进程 spawn 前已向控制台播报过。
252
+ const self = ensureSelfEntry(deps, registryFile, port ?? readRegistry(registryFile).port ?? DEFAULT_PORT);
253
+ if (!detached)
254
+ announceSelfEntry(deps, self);
174
255
  const broker = new Broker({
175
256
  registryFile: registryFileOf(deps.baseDir),
176
257
  statusFile: join(tcpDir(deps.baseDir), 'status-broker.json'),
@@ -198,11 +279,42 @@ async function runForegroundBroker(deps, port) {
198
279
  });
199
280
  return 0;
200
281
  }
201
- /** B2:--connect 节点客户端前台跑(Ctrl+C 退出)。 */
282
+ /**
283
+ * B2:--connect 选择器解析(限定器风格对齐 via-tcp 的 selectBrokerEntry):
284
+ * 别名精确匹配 → starId 前缀唯一匹配(歧义教加长);无命中时单条目走旧
285
+ * "别名不符拒绝"校验路径(旧形状兼容),多条目列条目并给示例。'' = entries[0]。
286
+ */
287
+ export function selectConnectEntry(selector, config) {
288
+ const entries = config.entries;
289
+ if (selector === '')
290
+ return { entry: entries[0], selector };
291
+ const byAlias = entries.find((e) => e.alias === selector);
292
+ if (byAlias !== undefined)
293
+ return { entry: byAlias, selector };
294
+ const byPrefix = entries.filter((e) => e.starId !== undefined && e.starId.startsWith(selector));
295
+ if (byPrefix.length === 1)
296
+ return { entry: byPrefix[0], selector };
297
+ if (byPrefix.length > 1) {
298
+ throw new MultichatError('USAGE', `--connect 选择器 ${selector} 的 starId 前缀命中多个星(${byPrefix.map((e) => e.alias ?? e.starId).join('、')})——加长前缀使其唯一`);
299
+ }
300
+ if (entries.length === 1) {
301
+ // 旧校验路径:单条目(旧形状)别名不符拒绝;无别名则容忍直连(B2 前行为)
302
+ const alias = entries[0].alias;
303
+ if (alias !== undefined) {
304
+ throw new MultichatError('USAGE', `--connect ${selector} 与 node.json 的 broker 别名 ${alias} 不符——省略别名直连,或向管理员核对 node.json`);
305
+ }
306
+ return { entry: entries[0], selector };
307
+ }
308
+ const list = entries.map((e) => `${e.alias ?? '(无别名)'}(starId ${e.starId ?? '未登记'})`).join('、');
309
+ throw new MultichatError('USAGE', `--connect 选择器 ${selector} 不匹配任何条目——本机 node.json 现有:${list};示例:--connect ${entries[0].alias ?? entries[0].starId}`);
310
+ }
311
+ /** B2:--connect 节点客户端前台跑(Ctrl+C 退出)。守护只连选中条目(config.entries 收窄为单元素)。 */
202
312
  async function runForegroundNode(aliasArg, deps) {
203
- const config = loadNodeConfigChecked(aliasArg, deps);
313
+ const config = readNodeConfig(join(tcpDir(deps.baseDir), 'node.json'));
314
+ const { entry, selector } = selectConnectEntry(aliasArg, config);
315
+ const suffix = selector === '' ? '' : `-${selector}`;
204
316
  const detached = deps.env.CROSSCHAT_SERVE_DETACHED === '1';
205
- const logFile = join(tcpDir(deps.baseDir), 'node.log');
317
+ const logFile = join(tcpDir(deps.baseDir), `node${suffix}.log`);
206
318
  const logLine = detached
207
319
  ? (line) => {
208
320
  try {
@@ -214,9 +326,10 @@ async function runForegroundNode(aliasArg, deps) {
214
326
  }
215
327
  : (line) => deps.stdout(line);
216
328
  const client = new NodeClient({
217
- config,
329
+ config: { ...config, entries: [entry] },
330
+ configFile: join(tcpDir(deps.baseDir), 'node.json'),
218
331
  machineId: deps.machineId,
219
- statusFile: join(tcpDir(deps.baseDir), 'status-node.json'),
332
+ statusFile: join(tcpDir(deps.baseDir), `status-node${suffix}.json`),
220
333
  fileInbox: new FileInbox({
221
334
  inboxDir: join(tcpDir(deps.baseDir), 'inbox'),
222
335
  partsDir: join(tcpDir(deps.baseDir), 'parts'),
@@ -231,18 +344,10 @@ async function runForegroundNode(aliasArg, deps) {
231
344
  log: logLine,
232
345
  onSignal: deps.onSignal,
233
346
  });
234
- logLine(`节点客户端启动:目标 broker ${config.broker.alias ?? `${config.broker.host}:${config.broker.port}`}(Ctrl+C 退出)`);
347
+ logLine(`节点客户端启动:目标 broker ${entry.alias ?? `${entry.host}:${entry.port}`}(Ctrl+C 退出)`);
235
348
  await client.run();
236
349
  return 0;
237
350
  }
238
- /** 读 node.json(教学报错);--connect 显式给的别名与凭证不符时拒绝。 */
239
- function loadNodeConfigChecked(aliasArg, deps) {
240
- const config = readNodeConfig(join(tcpDir(deps.baseDir), 'node.json'));
241
- if (aliasArg !== '' && config.broker.alias !== undefined && aliasArg !== config.broker.alias) {
242
- throw new MultichatError('USAGE', `--connect ${aliasArg} 与 node.json 的 broker 别名 ${config.broker.alias} 不符——省略别名直连,或向管理员核对 node.json`);
243
- }
244
- return config;
245
- }
246
351
  function readResultTimeoutMs(env) {
247
352
  const raw = env.CROSSCHAT_TCP_TIMEOUT_MS;
248
353
  if (raw === undefined || raw === '')
@@ -331,22 +436,64 @@ function pidsOnPort(port) {
331
436
  }
332
437
  return pids;
333
438
  }
439
+ /** 命令行里 --connect 的取值(空串=裸 --connect 默认守护;undefined=非节点进程)。 */
440
+ export function connectValueOf(cmdline) {
441
+ const m = cmdline.match(/--connect(?:=|\s+)([^\s]*)/);
442
+ return m === null ? undefined : m[1] ?? '';
443
+ }
444
+ /**
445
+ * B2:--stop <选择器>——只停该选择器的节点守护(精确匹配 --connect 的取值,
446
+ * 身份校验沿用 matchServeProcesses 的 exe/脚本特征闸门)。
447
+ */
448
+ function runStopSelector(selector, deps) {
449
+ const procs = (deps.listServeProcesses ?? listServeProcesses)();
450
+ const kill = deps.killPid ?? killPid;
451
+ const targets = procs.filter((p) => p.cmdline.includes('--connect') && connectValueOf(p.cmdline) === selector);
452
+ if (targets.length === 0) {
453
+ deps.stdout(`stop node: 未找到 ${selector}`);
454
+ return 1;
455
+ }
456
+ let rc = 0;
457
+ for (const n of targets) {
458
+ if (kill(n.pid))
459
+ deps.stdout(`stop node: pid ${n.pid} 已终止(--connect ${selector})`);
460
+ else {
461
+ deps.stdout(`stop node: pid ${n.pid} 终止失败`);
462
+ rc = 1;
463
+ }
464
+ }
465
+ return rc;
466
+ }
334
467
  function runStop(target, deps, registryFile) {
335
- const procs = listServeProcesses();
468
+ const procs = (deps.listServeProcesses ?? listServeProcesses)();
469
+ const kill = deps.killPid ?? killPid;
336
470
  const brokers = procs.filter((p) => !p.cmdline.includes('--connect'));
337
471
  const nodes = procs.filter((p) => p.cmdline.includes('--connect'));
338
472
  let rc = 0;
473
+ // B2:both 时先停全部节点守护再停 broker——节点腿断流在前,broker 关闭在后
474
+ if (target === 'node' || target === 'both') {
475
+ if (nodes.length === 0)
476
+ deps.stdout('stop node: 未发现运行中的节点');
477
+ for (const n of nodes) {
478
+ if (kill(n.pid))
479
+ deps.stdout(`stop node: pid ${n.pid} 已终止`);
480
+ else {
481
+ deps.stdout(`stop node: pid ${n.pid} 终止失败`);
482
+ rc = 1;
483
+ }
484
+ }
485
+ }
339
486
  if (target === 'broker' || target === 'both') {
340
487
  if (brokers.length === 0)
341
488
  deps.stdout('stop broker: 未发现运行中的 broker');
342
489
  const port = readRegistry(registryFile).port ?? DEFAULT_PORT;
343
- const confirmed = pidsOnPort(port);
490
+ const confirmed = (deps.pidsOnPort ?? pidsOnPort)(port);
344
491
  for (const b of brokers) {
345
492
  if (!confirmed.has(b.pid)) {
346
493
  deps.stdout(`stop broker: pid ${b.pid} 命令行匹配但未持有端口 ${port},未确认跳过`);
347
494
  continue;
348
495
  }
349
- if (killPid(b.pid))
496
+ if (kill(b.pid))
350
497
  deps.stdout(`stop broker: pid ${b.pid} 已终止(端口 ${port} 双重确认)`);
351
498
  else {
352
499
  deps.stdout(`stop broker: pid ${b.pid} 终止失败`);
@@ -354,18 +501,6 @@ function runStop(target, deps, registryFile) {
354
501
  }
355
502
  }
356
503
  }
357
- if (target === 'node' || target === 'both') {
358
- if (nodes.length === 0)
359
- deps.stdout('stop node: 未发现运行中的节点');
360
- for (const n of nodes) {
361
- if (killPid(n.pid))
362
- deps.stdout(`stop node: pid ${n.pid} 已终止`);
363
- else {
364
- deps.stdout(`stop node: pid ${n.pid} 终止失败`);
365
- rc = 1;
366
- }
367
- }
368
- }
369
504
  return rc;
370
505
  }
371
506
  function killPid(pid) {
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { readFileSync } from 'node:fs';
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { MultichatError } from '../errors.js';
4
+ import { readNodeConfig } from '../serve/node.js';
4
5
  /** B2 freshness bound: a status file older than this reads as "没在跑". */
5
6
  export const TCP_STATUS_FRESH_MS = 90_000;
6
7
  function readStatusJson(file) {
@@ -11,26 +12,62 @@ function readStatusJson(file) {
11
12
  return undefined;
12
13
  }
13
14
  }
14
- /** 转发器区块(节点行 + broker 行 + 在线机器表);dir=undefined → 空数组。 */
15
+ /** B2:tcp 目录下的节点守护状态文件(默认在前,其余按选择器名排序)。 */
16
+ function listNodeStatusFiles(tcpDir) {
17
+ try {
18
+ return readdirSync(tcpDir)
19
+ .filter((f) => /^status-node(-.*)?\.json$/.test(f))
20
+ .sort((a, b) => (a === 'status-node.json' ? -1 : b === 'status-node.json' ? 1 : a.localeCompare(b)));
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ /** 文件名 → 选择器(status-node.json='';status-node-work.json='work')。 */
27
+ function nodeStatusSelector(file) {
28
+ return file === 'status-node.json' ? '' : file.replace(/^status-node-/, '').replace(/\.json$/, '');
29
+ }
30
+ /** 单守护状态行(prefix='转发器:' 单条目 / '转发器[<选择器>]:' 多条目)。 */
31
+ function nodeStateLine(prefix, st) {
32
+ if (st.state === 'online')
33
+ return `${prefix} online tcp:${st.brokerAlias} (since ${formatCreatedAt(st.since)})`;
34
+ if (st.state === 'reconnect-wait') {
35
+ const next = st.nextAttemptAt === undefined ? '-' : formatHms(st.nextAttemptAt);
36
+ return `${prefix} 重连等待中,下次尝试 ${next}`;
37
+ }
38
+ return `${prefix} 连接中 tcp:${st.brokerAlias}`;
39
+ }
40
+ /**
41
+ * 转发器区块(节点行 + broker 行 + 在线机器表);dir=undefined → 空数组。
42
+ * B2 多守护:逐个 status-node*.json 出行(多条目时带 [选择器] 标签);
43
+ * 单条目(仅默认文件/无文件)输出与 B2 之前逐字节同形。
44
+ */
15
45
  async function tcpForwarderLines(tcpDir, nowMs, roster) {
16
46
  if (tcpDir === undefined)
17
47
  return [];
18
48
  const lines = [];
19
- const node = readStatusJson(join(tcpDir, 'status-node.json'));
20
- const nodeFresh = node !== undefined && nowMs - Date.parse(node.lastUpdated) < TCP_STATUS_FRESH_MS;
21
- if (!nodeFresh) {
22
- lines.push('转发器: 未运行');
23
- }
24
- else if (node.state === 'online') {
25
- lines.push(`转发器: online tcp:${node.brokerAlias} (since ${formatCreatedAt(node.since)})`);
26
- }
27
- else if (node.state === 'reconnect-wait') {
28
- const next = node.nextAttemptAt === undefined ? '-' : formatHms(node.nextAttemptAt);
29
- lines.push(`转发器: 重连等待中,下次尝试 ${next}`);
30
- }
31
- else {
32
- lines.push(`转发器: 连接中 tcp:${node.brokerAlias}`);
49
+ const files = listNodeStatusFiles(tcpDir);
50
+ const multi = files.length > 1;
51
+ let anyFresh = false;
52
+ for (const file of files) {
53
+ const node = readStatusJson(join(tcpDir, file));
54
+ const fresh = node !== undefined && nowMs - Date.parse(node.lastUpdated) < TCP_STATUS_FRESH_MS;
55
+ if (multi) {
56
+ const tag = nodeStatusSelector(file) || '默认';
57
+ if (!fresh) {
58
+ lines.push(`转发器[${tag}]: 未运行`);
59
+ continue;
60
+ }
61
+ anyFresh = true;
62
+ lines.push(nodeStateLine(`转发器[${tag}]:`, node));
63
+ }
64
+ else if (fresh) {
65
+ anyFresh = true;
66
+ lines.push(nodeStateLine('转发器:', node));
67
+ }
33
68
  }
69
+ if (!multi && !anyFresh)
70
+ lines.push('转发器: 未运行');
34
71
  const broker = readStatusJson(join(tcpDir, 'status-broker.json'));
35
72
  if (broker !== undefined && broker.state === 'running' && nowMs - Date.parse(broker.lastUpdated) < TCP_STATUS_FRESH_MS) {
36
73
  const nodes = broker.onlineNodes ?? [];
@@ -40,25 +77,44 @@ async function tcpForwarderLines(tcpDir, nowMs, roster) {
40
77
  return lines;
41
78
  }
42
79
  // B2.1:非 broker 机(本机 status-broker.json 不新鲜)且有 roster 接线 → 瞬态拉在线表;
43
- // 失败静默降级为一行"不可达"。
80
+ // 失败静默降级为一行"不可达"。B2:node.json 多条目时逐条目探各自 broker。
44
81
  if (roster !== undefined) {
45
- const machines = await roster();
46
- if (machines === undefined) {
47
- lines.push('转发器: 不可达');
82
+ let entries;
83
+ try {
84
+ entries = readNodeConfig(join(tcpDir, 'node.json')).entries;
85
+ }
86
+ catch {
87
+ // 无 node.json/损坏 → 走单条目路径(roster 自行降级)
88
+ }
89
+ if (entries === undefined || entries.length <= 1) {
90
+ const machines = await roster();
91
+ pushRosterLines(lines, '', machines);
48
92
  }
49
93
  else {
50
- const disp = (m) => `${m.name ?? '?'} (${m.mid8})`;
51
- const online = machines.filter((m) => m.online);
52
- const offline = machines.filter((m) => !m.online);
53
- lines.push(`转发器: broker 可达,${online.length} 机器在线`);
54
- if (online.length > 0)
55
- lines.push(`在线机器: ${online.map(disp).join('、')}`);
56
- if (offline.length > 0)
57
- lines.push(`离线机器: ${offline.map(disp).join('、')}`);
94
+ for (const entry of entries) {
95
+ const label = entry.alias ?? `${entry.host}:${entry.port}`;
96
+ const machines = await roster(entry);
97
+ pushRosterLines(lines, label, machines);
98
+ }
58
99
  }
59
100
  }
60
101
  return lines;
61
102
  }
103
+ /** 在线表行(label='' 时与 B2.1 单条目格式逐字节一致)。 */
104
+ function pushRosterLines(lines, label, machines) {
105
+ if (machines === undefined) {
106
+ lines.push(label === '' ? '转发器: 不可达' : `转发器: broker ${label} 不可达`);
107
+ return;
108
+ }
109
+ const disp = (m) => `${m.name ?? '?'} (${m.mid8})`;
110
+ const online = machines.filter((m) => m.online);
111
+ const offline = machines.filter((m) => !m.online);
112
+ lines.push(label === '' ? `转发器: broker 可达,${online.length} 机器在线` : `转发器: broker ${label} 可达,${online.length} 机器在线`);
113
+ if (online.length > 0)
114
+ lines.push(label === '' ? `在线机器: ${online.map(disp).join('、')}` : `在线机器[${label}]: ${online.map(disp).join('、')}`);
115
+ if (offline.length > 0)
116
+ lines.push(label === '' ? `离线机器: ${offline.map(disp).join('、')}` : `离线机器[${label}]: ${offline.map(disp).join('、')}`);
117
+ }
62
118
  /** `hh:mm:ss` (local time); `-` when unknown/invalid. */
63
119
  function formatHms(iso) {
64
120
  const date = new Date(iso);
@@ -104,10 +160,14 @@ export async function runStatus(deps, json, conversations = false) {
104
160
  const held = deps.listWriterLocks?.() ?? new Set();
105
161
  if (json) {
106
162
  // B2:tcp 小节仅在 tcpDir 接线时出现——嵌入方(无该 dep)的 json 键集
107
- // 保持 {claude, codex} 冻结契约不变。
108
- const tcp = deps.tcpDir === undefined ? {} : { tcp: tcpJson(deps.tcpDir, deps.now?.() ?? Date.now()) };
163
+ // 保持 {claude, codex} 冻结契约不变。B2 多星新增 tcpProfiles(逐守护
164
+ // status-node*.json);tcp.node/tcp.broker 既有形状不动。
165
+ const nowMs = deps.now?.() ?? Date.now();
166
+ const tcp = deps.tcpDir === undefined ? {} : { tcp: tcpJson(deps.tcpDir, nowMs) };
167
+ const tcpProfiles = deps.tcpDir === undefined ? {} : { tcpProfiles: nodeProfilesJson(deps.tcpDir, nowMs) };
109
168
  return JSON.stringify({
110
169
  ...tcp,
170
+ ...tcpProfiles,
111
171
  claude: scan.sessions.map((session) => ({
112
172
  name: session.name ?? null,
113
173
  kind: session.kind,
@@ -183,8 +243,15 @@ function tcpJson(tcpDir, nowMs) {
183
243
  broker: brokerFresh ? { port: broker.port ?? null, onlineNodes: broker.onlineNodes ?? [] } : null,
184
244
  };
185
245
  }
186
- /** Locks whose thread id is not in the thread/list result (empty when listing failed). */
187
- function unlistedLocks(held, threads) {
246
+ /** B2:--json 的多守护小节——逐 status-node*.json(选择器 + 新鲜状态,陈旧为 null)。 */
247
+ function nodeProfilesJson(tcpDir, nowMs) {
248
+ return listNodeStatusFiles(tcpDir).map((file) => {
249
+ const st = readStatusJson(join(tcpDir, file));
250
+ const fresh = st !== undefined && nowMs - Date.parse(st.lastUpdated) < TCP_STATUS_FRESH_MS;
251
+ return { selector: nodeStatusSelector(file), status: fresh ? st : null };
252
+ });
253
+ }
254
+ /** Locks whose thread id is not in the thread/list result (empty when listing failed). */ function unlistedLocks(held, threads) {
188
255
  if (threads === undefined)
189
256
  return [];
190
257
  const listed = new Set(threads.map((thread) => thread.id));
@@ -214,6 +281,7 @@ async function conversationsView(deps, json) {
214
281
  const receipt = row.receipt === 'confirmed' ? ' 已确认' : row.receipt === 'unconfirmed' ? ' 回执未确认' : '';
215
282
  lines.push(` ${pairArrow(row).padEnd(30)}${formatRelativeTime(row.updatedAt, now).padEnd(12)}` +
216
283
  `turn ${String(row.turn ?? '?').padEnd(4)}${row.lastStatus ?? '未知'}` +
284
+ `${row.lastStatus === 'queued' ? '(已交对端队列待消费——对方回信即证明已处理)' : ''}` +
217
285
  `${row.parked > 0 ? ` 滞留 ${row.parked}` : ''}${receipt}`);
218
286
  }
219
287
  return lines.join('\n');