@oatelauser/crosschat 1.3.2 → 1.4.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.
@@ -0,0 +1,33 @@
1
+ import { spawn } from 'node:child_process';
2
+ import process from 'node:process';
3
+ import { resolveCodexExecutable } from '../codex/transport.js';
4
+ import { splitLauncherKnobs, validateLauncherKnob } from '../limits.js';
5
+ import { otherIdentityKeys, stripOtherFamilies } from '../identity.js';
6
+ export function defaultCodexWrapperDeps() {
7
+ return {
8
+ // 真实解析复用 codex 传输层的现成逻辑(CROSSCHAT_CODEX_BIN 覆盖 > PATH)。
9
+ resolveExe: () => resolveCodexExecutable(),
10
+ spawnInherit: (exe, args, env) => new Promise((resolve, reject) => {
11
+ const child = spawn(exe, args, env === undefined ? { stdio: 'inherit' } : { stdio: 'inherit', env });
12
+ child.on('error', reject);
13
+ child.on('close', (code) => resolve(code ?? 1));
14
+ }),
15
+ };
16
+ }
17
+ export async function runCodexWrapper(args, deps = defaultCodexWrapperDeps()) {
18
+ const { passthrough, maxBodyKb, maxTurn } = splitLauncherKnobs(args);
19
+ const maxBodyKbNum = validateLauncherKnob('crosschat codex', '--max-body-kb', maxBodyKb);
20
+ const maxTurnNum = validateLauncherKnob('crosschat codex', '--max-turn', maxTurn);
21
+ const parentEnv = deps.env ?? process.env;
22
+ const foreignIdentityPresent = otherIdentityKeys('codex').some((key) => parentEnv[key] !== undefined);
23
+ const env = maxBodyKbNum === undefined && maxTurnNum === undefined && !foreignIdentityPresent
24
+ ? undefined // 无旋钮且无对族身份变量 = 干净透传(不传 env,spawn 继承)
25
+ : stripOtherFamilies({
26
+ ...parentEnv,
27
+ ...(maxBodyKbNum !== undefined ? { CROSSCHAT_MAX_BODY_KIB: String(maxBodyKbNum) } : {}),
28
+ ...(maxTurnNum !== undefined ? { CROSSCHAT_MAX_TURN: String(maxTurnNum) } : {}),
29
+ }, 'codex');
30
+ // 无 --settings 类注入:codex 接收靠原生 daemon,参数全部原样转发。
31
+ return deps.spawnInherit(deps.resolveExe(), passthrough, env);
32
+ }
33
+ //# sourceMappingURL=codex-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-wrapper.js","sourceRoot":"","sources":["../../src/commands/codex-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2BvE,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,wDAAwD;QACxD,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;QAC1C,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAC/B,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;YACrG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAuB,EACvB,OAAyB,uBAAuB,EAAE;IAElD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,oBAAoB,CAAC,iBAAiB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC1C,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IACtG,MAAM,GAAG,GACP,YAAY,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,sBAAsB;QAC/E,CAAC,CAAC,SAAS,CAAC,sCAAsC;QAClD,CAAC,CAAC,kBAAkB,CAChB;YACE,GAAG,SAAS;YACZ,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChF,EACD,OAAO,CACR,CAAC;IACR,gDAAgD;IAChD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC"}
@@ -1,23 +1,85 @@
1
1
  import { Buffer } from 'node:buffer';
2
+ import { hostname as osHostname } from 'node:os';
2
3
  import { MultichatError } from '../errors.js';
3
4
  import { checkAndRecord, rateKey } from '../rate-limit.js';
4
5
  import { mailboxFileFor, outboxCount, park } from '../outbox.js';
5
6
  import { endpointOfIdentity, identityKey, identityMatchesEndpoint, resolveCallerIdentity, } from '../identity.js';
6
7
  import { resolveTargetByName } from '../resolve.js';
7
8
  import { composeEnvelope } from '../envelope.js';
9
+ import { bodyTooLargeMessage, CLAUDE_ENDPOINT_MAX_BODY_BYTES, CODEX_ENDPOINT_MAX_BODY_BYTES, MAX_BODY_KIB_CEILING, resolveConfiguredMaxBodyBytes, resolveMaxTurn, } from '../limits.js';
10
+ import { decodeOriginIdentity, isSameMachine, runViaSend } from '../federation.js';
8
11
  import { continueConversation, continueFromRef, recordConversation } from '../conversations.js';
9
12
  import { decodeRef, encodeRef, newConversationRef, nextTurnRef, } from '../ref.js';
10
- /** Hard body limit (ticket 004): 16KiB, enforced synchronously, never truncated. */
11
- export const MAX_BODY_BYTES = 16_384;
13
+ /** 票A:上限解析移入 limits.ts;此名保留(004 时代的外部引用面,= 默认 16384)。 */
14
+ export { DEFAULT_MAX_BODY_BYTES as MAX_BODY_BYTES } from '../limits.js';
12
15
  export async function runSend(args, deps) {
13
16
  resolveTargetArgs(args);
14
17
  const body = resolveBody(args, deps);
15
18
  const size = Buffer.byteLength(body, 'utf8');
16
- if (size > MAX_BODY_BYTES) {
17
- throw new MultichatError('MESSAGE_TOO_LARGE', `Body is ${size} bytes; the limit is ${MAX_BODY_BYTES}. Write the content to a file and send the path instead.`);
19
+ // 票A:上限三层来源(--max-body-kb > CROSSCHAT_MAX_BODY_KIB > 16384 兜底)。
20
+ // 这里只做配置值的早期快速失败(默认 16384 时与 004 现状逐字节同序同码);
21
+ // 端点封顶(claude 64KiB / codex 1MiB)要等目标解析出来才能补检——生效值
22
+ // = min(配置值, 目标端点封顶)。来源值自身有 16MiB 绝对上界,到顶时教学
23
+ // 直接说"提额无效",不再指一条走不通的路。
24
+ const configuredMax = resolveConfiguredMaxBodyBytes(args.maxBodyKb, deps.env);
25
+ const turnBudget = resolveMaxTurn(args.maxTurn, deps.env);
26
+ if (size > configuredMax) {
27
+ const atCeiling = configuredMax === MAX_BODY_KIB_CEILING * 1_024;
28
+ // 远端来件(008 D5:--origin 只在 --via 的接收腿出现)拒绝大正文时,读
29
+ // 报错的是发送方——单机教学(本机提额/落盘路径)对它全是误导,换远端
30
+ // 变体(scp 旁路 + 上限属接收方操作者)。
31
+ throw new MultichatError('MESSAGE_TOO_LARGE', bodyTooLargeMessage(size, configuredMax, args.via, atCeiling ? 'absolute' : undefined, args.origin !== undefined));
32
+ }
33
+ // Federation (008 B2, design §5 C): a cross-machine --conversation ref names
34
+ // the remote machine in its endpoints — fill a missing --via from it so a
35
+ // hand-typed reply without the flag still routes (the envelope's copy
36
+ // already carries it; this is typo insurance). Undecodable refs fall
37
+ // through to the normal path's error.
38
+ // B11 fix: only the CALLER'S COUNTERPART may become the via target. The
39
+ // previous form scanned both endpoints and picked the first non-local one —
40
+ // on a cross-machine reply the sender's own endpoint lives on the OTHER
41
+ // machine, so the remote leg auto-filled a via back to the sender's machine
42
+ // and the two machines bounced the send at each other over ssh until the
43
+ // 120s timeout, with zero output at either end.
44
+ if (args.via === undefined && args.conversation !== undefined) {
45
+ const here = deps.hostname?.() ?? osHostname();
46
+ const localMid = deps.machineId?.();
47
+ try {
48
+ const ref = decodeRef(args.conversation);
49
+ const envScan = deps.listClaudeSessions();
50
+ const envCaller = resolveCallerIdentity(deps.env, envScan);
51
+ const caller = envCaller.p === 'human' && args.origin !== undefined
52
+ ? decodeOriginIdentity(args.origin)
53
+ : envCaller;
54
+ const remote = [ref.f, ref.t].find((ep) => !identityMatchesEndpoint(caller, ep) &&
55
+ ep.p !== 'human' && ep.m !== undefined && !isSameMachine(ep.mid, ep.m, localMid, here));
56
+ if (remote !== undefined)
57
+ args = { ...args, via: `ssh:${remote.m}` };
58
+ }
59
+ catch {
60
+ // invalid ref: the main path reports it
61
+ }
62
+ }
63
+ // Federation (008/B1): everything via lives behind this early branch — the
64
+ // configured-cap check above applies to cross-machine sends too (D6), and the
65
+ // local path below stays byte-identical when --via is absent (D9).
66
+ if (args.via !== undefined) {
67
+ // 票A:--via 本地无法解析远端目标——按最宽端点(codex 1MiB)预检,远端
68
+ // 自行复检(现状语义)。--max-body-kb 不透传远端:远程命令面保持固定
69
+ // 白名单(buildSshArgv),远端用自己的两层来源决定上限。
70
+ const viaLimit = Math.min(configuredMax, CODEX_ENDPOINT_MAX_BODY_BYTES);
71
+ if (size > viaLimit) {
72
+ throw new MultichatError('MESSAGE_TOO_LARGE', bodyTooLargeMessage(size, viaLimit, args.via, 'ssh-precheck'));
73
+ }
74
+ return runViaSend(args, body, deps);
18
75
  }
19
76
  const scan = deps.listClaudeSessions();
20
- const caller = resolveCallerIdentity(deps.env, scan);
77
+ const envCaller = resolveCallerIdentity(deps.env, scan);
78
+ // Federation (008 D5): an ssh shell has no agent env, so the remote caller
79
+ // would collapse to human (unreplyable). --origin — injected by the sending
80
+ // machine's CLI — is the identity fallback; a real env identity always wins.
81
+ const origin = envCaller.p === 'human' && args.origin !== undefined ? decodeOriginIdentity(args.origin) : undefined;
82
+ const caller = origin ?? envCaller;
21
83
  let target;
22
84
  let newRef;
23
85
  let turn;
@@ -26,7 +88,8 @@ export async function runSend(args, deps) {
26
88
  const asFrom = identityMatchesEndpoint(caller, ref.f);
27
89
  const asTo = identityMatchesEndpoint(caller, ref.t);
28
90
  if (!asFrom && !asTo) {
29
- throw new MultichatError('CALLER_NOT_IN_CONVERSATION', `Caller (${identityKey(caller)}) is not an endpoint of this conversation.`);
91
+ throw new MultichatError('CALLER_NOT_IN_CONVERSATION', `Caller (${identityKey(caller)}) is not an endpoint of this conversation. ` +
92
+ '手里的 ref 可能抄漏或已过期——改用 --to <名字> 自动接续该端对最新对话。');
30
93
  }
31
94
  target = asFrom ? ref.t : ref.f;
32
95
  if (target.p === 'human') {
@@ -71,6 +134,60 @@ export async function runSend(args, deps) {
71
134
  newRef = continued.ref;
72
135
  turn = continued.turn;
73
136
  }
137
+ // 票A:端点封顶——早期检查只查了配置值,claude 端点 64KiB 更严,解析出
138
+ // 目标后必须补检(配置再大也送不进端点)。到端点硬顶 = 提额无效,教学
139
+ // 直接指向落盘。(信封教学行永远静态 16KiB——第六单政策,见 envelope.ts。)
140
+ const endpointCap = target.p === 'claude' ? CLAUDE_ENDPOINT_MAX_BODY_BYTES : CODEX_ENDPOINT_MAX_BODY_BYTES;
141
+ const effectiveMax = Math.min(configuredMax, endpointCap);
142
+ if (size > effectiveMax) {
143
+ // 远端来件同样换远端教学(第八单):硬顶事实保留(提额无效),尾巴换
144
+ // scp 旁路——接收方提额也过不了端点硬顶,scp 是唯一出路。
145
+ throw new MultichatError('MESSAGE_TOO_LARGE', bodyTooLargeMessage(size, effectiveMax, args.via, target.p, args.origin !== undefined));
146
+ }
147
+ // Federation (008 B2 + B10): a remote-origin send (ssh shell + --origin)
148
+ // stamps both endpoints with their machines — m (hostname) routes the return
149
+ // --via, mid (machine-id) decides "same machine" so hostname collisions
150
+ // cannot fake a local conversation. Local sends stamp nothing (no m = local).
151
+ const here = deps.hostname?.() ?? osHostname();
152
+ const localMid = deps.machineId?.();
153
+ if (origin !== undefined) {
154
+ const fIsCaller = identityMatchesEndpoint(caller, newRef.f);
155
+ const stamp = (ep, m, mid) => ep.p === 'human' ? ep : { ...ep, m, ...(mid === undefined ? {} : { mid }) };
156
+ newRef = {
157
+ ...newRef,
158
+ f: stamp(newRef.f, fIsCaller ? origin.host : here, fIsCaller ? origin.mid : localMid),
159
+ t: stamp(newRef.t, fIsCaller ? here : origin.host, fIsCaller ? localMid : origin.mid),
160
+ };
161
+ }
162
+ // The reply-hint's --via points at the machine of the endpoint reading this
163
+ // envelope would reply to — the sender's own endpoint (D5: no --to needed).
164
+ const senderEp = identityMatchesEndpoint(caller, newRef.f) ? newRef.f : newRef.t;
165
+ const viaHost = senderEp.p !== 'human' && senderEp.m !== undefined && !isSameMachine(senderEp.mid, senderEp.m, localMid, here)
166
+ ? senderEp.m
167
+ : undefined;
168
+ // B10 collision warning: the ssh peer's hostname equals ours but its
169
+ // machine-id differs — routing is still correct (per-machine ssh alias
170
+ // namespaces resolve it), the name ambiguity is worth telling the human.
171
+ const collision = origin !== undefined &&
172
+ origin.host === here &&
173
+ origin.mid !== undefined &&
174
+ localMid !== undefined &&
175
+ origin.mid !== localMid
176
+ ? `⚠ 两台机器同名 (${here}):已按跨机路由(machine-id 不同)。建议改名避免混淆。`
177
+ : undefined;
178
+ const finish = (out) => {
179
+ if (collision === undefined)
180
+ return out;
181
+ if (args.json === true) {
182
+ try {
183
+ return JSON.stringify({ ...JSON.parse(out), warning: collision });
184
+ }
185
+ catch {
186
+ return out;
187
+ }
188
+ }
189
+ return `${out}\n${collision}`;
190
+ };
74
191
  const replyRef = encodeRef(newRef);
75
192
  const fromName = displayName(caller);
76
193
  /** Every exit path logs who sent what to whom (B14, +from in B16, +fromName in B21). */
@@ -81,11 +198,12 @@ export async function runSend(args, deps) {
81
198
  const claudeSession = scan.sessions.find((session) => session.sessionId === target.id);
82
199
  if (claudeSession === undefined) {
83
200
  throw new MultichatError('TARGET_NOT_FOUND', `Claude session ${target.id} is not currently routable (process exited or unregistered). ` +
84
- '对端会话可能已退出:跑 crosschat status 查在线会话,用 --to <新名字> 重新寻址。');
201
+ '对端会话可能已重启——改用 --to <名字> 自动接续该端对最新对话(--to 同名即续,无需换名)。' +
202
+ 'status 只列本机会话;跨机对端用 ssh <对端> crosschat status 查。');
85
203
  }
86
204
  checkAndRecord(deps.rateDir, rateKey(identityKey(caller), `claude:${target.id}`), deps.now());
87
205
  const toName = claudeSession.name ?? shortId('claude', claudeSession.sessionId);
88
- const content = composeEnvelope({ fromName, toName, turn, ref: replyRef, body });
206
+ const content = composeEnvelope({ fromName, toName, turn, ref: replyRef, body, viaHost, turnBudget });
89
207
  try {
90
208
  await deps.deliverClaude({ pid: claudeSession.pid, messagingSocketPath: claudeSession.messagingSocketPath }, content);
91
209
  }
@@ -96,14 +214,14 @@ export async function runSend(args, deps) {
96
214
  logNow({ to: toName, target: `claude:${target.id}`, status: 'delivered', turn, replyRef });
97
215
  if (deps.conversationStateFile !== undefined)
98
216
  recordConversation(deps.conversationStateFile, newRef, deps.now());
99
- return formatDelivery(args.json === true, toName, turn, replyRef, false);
217
+ return finish(formatDelivery(args.json === true, toName, turn, replyRef, false));
100
218
  }
101
219
  // Codex delivers by threadId; a missing thread surfaces as a codex adapter error.
102
220
  checkAndRecord(deps.rateDir, rateKey(identityKey(caller), `codex:${target.id}`), deps.now());
103
221
  const threads = await deps.listCodexThreads();
104
222
  const threadName = threads.find((thread) => thread.id === target.id)?.name;
105
223
  const toName = threadName ?? shortId('codex', target.id);
106
- const content = composeEnvelope({ fromName, toName, turn, ref: replyRef, body });
224
+ const content = composeEnvelope({ fromName, toName, turn, ref: replyRef, body, viaHost, turnBudget });
107
225
  const parkNow = () => {
108
226
  park(deps.outboxDir, target.id, { envelope: content, toName, callerKey: identityKey(caller) }, deps.now());
109
227
  deps.spawnWatchdog?.();
@@ -116,7 +234,7 @@ export async function runSend(args, deps) {
116
234
  const queuedBefore = outboxCount(deps.outboxDir, target.id);
117
235
  if (queuedBefore > 0) {
118
236
  const queue = parkNow();
119
- return formatParked(args.json === true, toName, turn, replyRef, queue, mailboxPath);
237
+ return finish(formatParked(args.json === true, toName, turn, replyRef, queue, mailboxPath));
120
238
  }
121
239
  try {
122
240
  const delivered = await deps.deliverCodex(target.id, content);
@@ -129,12 +247,12 @@ export async function runSend(args, deps) {
129
247
  if (deps.conversationStateFile !== undefined)
130
248
  recordConversation(deps.conversationStateFile, newRef, deps.now());
131
249
  if (queued) {
132
- return `${out}\n已入对方服务端队列,本轮结束即处理;终态可查 crosschat status --conversations`;
250
+ return finish(`${out}\n已入对方服务端队列,本轮结束即处理;终态可查 crosschat status --conversations`);
133
251
  }
134
252
  if (receipt === 'unconfirmed') {
135
- return `${out}\n回执: 暂未在对方会话记录中确认(可能仍在落盘);稍后查 send-log.jsonl 或重跑 status`;
253
+ return finish(`${out}\n回执: 暂未在对方会话记录中确认(可能仍在落盘);稍后查 send-log.jsonl 或重跑 status`);
136
254
  }
137
- return out;
255
+ return finish(out);
138
256
  }
139
257
  catch (err) {
140
258
  // Busy/locked = definitively not delivered (deliver.ts polls before giving
@@ -145,7 +263,7 @@ export async function runSend(args, deps) {
145
263
  logNow({ to: toName, target: `codex:${target.id}`, status: 'parked', turn, replyRef });
146
264
  if (deps.conversationStateFile !== undefined)
147
265
  recordConversation(deps.conversationStateFile, newRef, deps.now());
148
- return formatParked(args.json === true, toName, turn, replyRef, queue, mailboxPath);
266
+ return finish(formatParked(args.json === true, toName, turn, replyRef, queue, mailboxPath));
149
267
  }
150
268
  logNow({ to: toName, target: `codex:${target.id}`, status: 'failed', code: errorCode(err), turn, replyRef });
151
269
  throw err;
@@ -1 +1 @@
1
- {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/commands/send.ts"],"names":[],"mappings":"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"}
package/dist/envelope.js CHANGED
@@ -2,6 +2,11 @@
2
2
  * Broker-owned message envelope (tickets 003/004): structural provenance
3
3
  * framing plus an inline reply tutorial, so the protocol teaches itself
4
4
  * without depending on prompt wording (low-invasion constraint).
5
+ *
6
+ * 票A 第六单政策:上限教学行永远静态"超 16KiB"——信封的读者是收方,数字
7
+ * 是发方的,动态值教错人(收方会误当自己的上限);宁可少报不会错(提额
8
+ * 世界里大内容要么直接发成功、要么报错报出本机准确值)。准确数字只住各侧
9
+ * 自己的报错里,信封只教方向不教数字。
5
10
  */
6
11
  /** Claude trims very long from-names; keep ours within 64 codepoints. */
7
12
  export const FROM_NAME_MAX_CODEPOINTS = 64;
@@ -24,9 +29,13 @@ export function composeEnvelope(input) {
24
29
  const fromName = shortened ? codepoints.slice(0, FROM_NAME_MAX_CODEPOINTS).join('') : input.fromName;
25
30
  const aliasAttr = shortened ? ` from-alias="${escapeAttr(input.fromName)}"` : '';
26
31
  const body = neutralizeReservedTags(input.body);
27
- return (`<cross-session-message from-name="${escapeAttr(fromName)}" turn="${input.turn}"${aliasAttr}>\n` +
32
+ const via = input.viaHost === undefined ? '' : ` --via ssh:${input.viaHost}`;
33
+ // 轮次预算合并进 turn 属性(turn="13/40",斜杠后为预算轮数)——软提醒不
34
+ // 硬拦(41/40 照发照显),未设预算时 turn 保持纯数字(字节零回归锚点)。
35
+ const turnAttr = input.turnBudget === undefined ? `${input.turn}` : `${input.turn}/${input.turnBudget}`;
36
+ return (`<cross-session-message from-name="${escapeAttr(fromName)}" turn="${turnAttr}"${aliasAttr}>\n` +
28
37
  `<crosschat-reply-hint conversation="${input.ref}" reply-as="${escapeAttr(input.toName)}">` +
29
- `回复请运行: crosschat send --conversation ${input.ref} --body "<你的回复>"</crosschat-reply-hint>\n` +
38
+ `回复请运行: crosschat send${via} --conversation ${input.ref} --body "<你的回复>"</crosschat-reply-hint>\n` +
30
39
  `新话题或对话已推进时: crosschat send --to <名字> --body "..."(--to 自动接续该端对最近对话);超 16KiB 请写文件后只发路径\n` +
31
40
  `${body}\n` +
32
41
  `</cross-session-message>`);
@@ -1 +1 @@
1
- {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,4FAA4F,CAAC;AAc1H,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,wBAAwB,CAAC;IAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IACrG,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,CACL,qCAAqC,UAAU,CAAC,QAAQ,CAAC,WAAW,KAAK,CAAC,IAAI,IAAI,SAAS,KAAK;QAChG,uCAAuC,KAAK,CAAC,GAAG,eAAe,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAC3F,wCAAwC,KAAK,CAAC,GAAG,2CAA2C;QAC5F,yFAAyF;QACzF,GAAG,IAAI,IAAI;QACX,0BAA0B,CAC3B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,4FAA4F,CAAC;AAuB1H,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB;IAClD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,wBAAwB,CAAC;IAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IACrG,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC;IAC7E,+CAA+C;IAC/C,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;IACxG,OAAO,CACL,qCAAqC,UAAU,CAAC,QAAQ,CAAC,WAAW,QAAQ,IAAI,SAAS,KAAK;QAC9F,uCAAuC,KAAK,CAAC,GAAG,eAAe,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;QAC3F,wBAAwB,GAAG,mBAAmB,KAAK,CAAC,GAAG,2CAA2C;QAClG,yFAAyF;QACzF,GAAG,IAAI,IAAI;QACX,0BAA0B,CAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,242 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { hostname as osHostname } from 'node:os';
3
+ import { Buffer } from 'node:buffer';
4
+ import { MultichatError } from './errors.js';
5
+ import { recordConversation } from './conversations.js';
6
+ import { decodeRef } from './ref.js';
7
+ import { identityKey, resolveCallerIdentity, } from './identity.js';
8
+ export function parseViaValue(value) {
9
+ const idx = value.indexOf(':');
10
+ const usage = new MultichatError('USAGE', `--via expects <transport>:<host>, e.g. ssh:build01(host 为 ~/.ssh/config 里的 Host 别名)`);
11
+ if (idx <= 0)
12
+ throw usage;
13
+ const transport = value.slice(0, idx);
14
+ const host = value.slice(idx + 1);
15
+ if (transport !== 'ssh') {
16
+ const note = transport === 'tcp' || transport === 'broker'
17
+ ? `${transport}: 传输二期支持,当前仅 ssh`
18
+ : `未知传输 ${transport},当前仅支持 ssh:`;
19
+ throw new MultichatError('USAGE', `--via ${note}`);
20
+ }
21
+ // Injection guard (design §2): the host reaches the ssh command line, so it
22
+ // is limited to alias-safe characters — spaces and cmd metachars are out.
23
+ if (!/^[A-Za-z0-9._-]+$/.test(host)) {
24
+ throw new MultichatError('USAGE', `--via ssh: host 别名仅限字母/数字/./_/-(防命令行注入),收到: ${host}`);
25
+ }
26
+ return { transport: 'ssh', host };
27
+ }
28
+ /** Values that will become part of the remote command line (design §2 whitelist). */
29
+ export function validateRemoteFlagValues(args) {
30
+ if (args.to !== undefined) {
31
+ // No whitespace, no cmd/PowerShell metachars, no leading dash. Names with
32
+ // spaces stay single-machine; cross-machine addressing uses id8/ref.
33
+ if (/[\s&|<>^%"']/.test(args.to) || args.to.startsWith('-')) {
34
+ throw new MultichatError('USAGE', `跨机 --to 值不能含空格或特殊字符(${args.to})——请改用 id8 或 --conversation 寻址`);
35
+ }
36
+ }
37
+ if (args.conversation !== undefined && !/^mc[12]_[A-Za-z0-9_-]+$/.test(args.conversation)) {
38
+ throw new MultichatError('USAGE', `跨机 --conversation 值非法: ${args.conversation}`);
39
+ }
40
+ }
41
+ /**
42
+ * `<p>/<full id>[/<display name>]@<hostname>[:<mid-b64u>]`, base64url-whole.
43
+ * The FULL id is what makes the origin endpoint routable in refs (B2.1);
44
+ * the display name is optional and may contain spaces/unicode/@/'/' (F1 —
45
+ * never parsed beyond its slot). The optional mid (B10 machine-id) rides
46
+ * along so the receiving side can tell same-hostname machines apart —
47
+ * hostnames never contain ':' so the tail split is unambiguous.
48
+ */
49
+ export function encodeOrigin(identity, host, mid) {
50
+ const who = identity.p === 'claude'
51
+ ? identity.name === undefined
52
+ ? `claude/${identity.id}`
53
+ : `claude/${identity.id}/${identity.name}`
54
+ : identity.p === 'codex'
55
+ ? `codex/${identity.id}`
56
+ : 'human';
57
+ const tail = mid === undefined ? host : `${host}:${Buffer.from(mid, 'utf8').toString('base64url')}`;
58
+ return Buffer.from(`${who}@${tail}`, 'utf8').toString('base64url');
59
+ }
60
+ /**
61
+ * B10 same-machine rule: when both machine-ids are known they decide (unique
62
+ * per install — hostname collisions cannot fake a match); otherwise fall back
63
+ * to hostname equality (the pre-B10 semantics, still correct when mids are
64
+ * unreadable on either side).
65
+ */
66
+ export function isSameMachine(epMid, epHost, localMid, localHost) {
67
+ if (epMid !== undefined && localMid !== undefined)
68
+ return epMid === localMid;
69
+ return epHost === localHost;
70
+ }
71
+ /** Remote-side identity fallback for ssh shells without agent env (design D5). */
72
+ export function decodeOriginIdentity(encoded) {
73
+ let text;
74
+ try {
75
+ text = Buffer.from(encoded, 'base64url').toString('utf8');
76
+ }
77
+ catch {
78
+ throw new MultichatError('USAGE', '--origin 不是合法的 base64url');
79
+ }
80
+ const at = text.lastIndexOf('@');
81
+ if (at <= 0)
82
+ throw new MultichatError('USAGE', `--origin 格式非法: ${text}`);
83
+ const head = text.slice(0, at);
84
+ const tail = text.slice(at + 1);
85
+ const colon = tail.lastIndexOf(':');
86
+ const host = colon === -1 ? tail : tail.slice(0, colon);
87
+ const mid = colon === -1 ? undefined : Buffer.from(tail.slice(colon + 1), 'base64url').toString('utf8');
88
+ if (host === '' || mid === '')
89
+ throw new MultichatError('USAGE', `--origin 格式非法: ${text}`);
90
+ const slash = head.indexOf('/');
91
+ if (slash <= 0) {
92
+ if (head === 'human')
93
+ return mid === undefined ? { p: 'human', host } : { p: 'human', host, mid };
94
+ throw new MultichatError('USAGE', `--origin 格式非法: ${text}`);
95
+ }
96
+ const p = head.slice(0, slash);
97
+ const rest = head.slice(slash + 1);
98
+ // First '/' after the endpoint type separates the full id from the optional
99
+ // display name; a name may itself contain '/' (B2.1 spec). Ids are
100
+ // hex/uuid-ish and never contain '/'.
101
+ const nameSlash = rest.indexOf('/');
102
+ const id = nameSlash === -1 ? rest : rest.slice(0, nameSlash);
103
+ const name = nameSlash === -1 ? undefined : rest.slice(nameSlash + 1);
104
+ if (id === '' || name === '')
105
+ throw new MultichatError('USAGE', `--origin 格式非法: ${text}`);
106
+ const midField = mid === undefined ? {} : { mid };
107
+ if (p === 'claude')
108
+ return name === undefined ? { p: 'claude', id, host, ...midField } : { p: 'claude', id, name, host, ...midField };
109
+ if (p === 'codex')
110
+ return { p: 'codex', id, host, ...midField };
111
+ throw new MultichatError('USAGE', `--origin 端点类型非法: ${p}`);
112
+ }
113
+ /** The exact remote command (fixed face, design D2 — configurable = injectable). */
114
+ export function buildSshArgv(host, args, originB64) {
115
+ const target = args.to !== undefined
116
+ ? ['--to', args.to]
117
+ : ['--conversation', args.conversation];
118
+ return [
119
+ 'ssh',
120
+ host,
121
+ '-o',
122
+ 'BatchMode=yes', // F2: any interactive prompt becomes a fast failure, not a 120s hang
123
+ '-o',
124
+ 'ConnectTimeout=10',
125
+ 'crosschat',
126
+ 'send',
127
+ ...target,
128
+ '--json',
129
+ '--origin',
130
+ originB64,
131
+ ];
132
+ }
133
+ /** Real transport: spawn ssh, feed the body on stdin, close it (EOF), cap output. */
134
+ export function defaultSshExec(argv, input, timeoutMs) {
135
+ return new Promise((resolve) => {
136
+ const child = spawn(argv[0], argv.slice(1), { stdio: ['pipe', 'pipe', 'pipe'] });
137
+ let stdout = '';
138
+ let stderr = '';
139
+ let timedOut = false;
140
+ const cap = (prev, chunk) => (prev.length > 262_144 ? prev : prev + chunk.toString('utf8'));
141
+ child.stdout.on('data', (chunk) => { stdout = cap(stdout, chunk); });
142
+ child.stderr.on('data', (chunk) => { stderr = cap(stderr, chunk); });
143
+ const timer = setTimeout(() => {
144
+ timedOut = true;
145
+ child.kill();
146
+ }, timeoutMs);
147
+ child.on('error', (err) => {
148
+ clearTimeout(timer);
149
+ resolve({ code: null, stdout, stderr: `${stderr}${err.message}`, timedOut });
150
+ });
151
+ child.on('close', (code) => {
152
+ clearTimeout(timer);
153
+ resolve({ code, stdout, stderr, timedOut });
154
+ });
155
+ child.stdin.on('error', () => { });
156
+ child.stdin.end(input, 'utf8');
157
+ });
158
+ }
159
+ /** Entry point of the via branch — everything federation lives behind this (D9). */
160
+ export async function runViaSend(args, body, deps) {
161
+ const { host } = parseViaValue(args.via);
162
+ validateRemoteFlagValues(args);
163
+ const scan = deps.listClaudeSessions();
164
+ const caller = resolveCallerIdentity(deps.env, scan);
165
+ const origin = encodeOrigin(caller, deps.hostname?.() ?? osHostname(), deps.machineId?.());
166
+ const argv = buildSshArgv(host, args, origin);
167
+ const envTimeout = Number(deps.env.CROSSCHAT_SSH_TIMEOUT_MS);
168
+ const timeoutMs = Number.isFinite(envTimeout) && envTimeout > 0 ? envTimeout : 120_000;
169
+ const fromName = originDisplayName(caller);
170
+ const logNow = (fields) => {
171
+ deps.appendLog?.({ ...fields, ts: new Date(deps.now()).toISOString() });
172
+ };
173
+ const res = await (deps.sshExec ?? defaultSshExec)(argv, body, timeoutMs);
174
+ if (res.timedOut || res.code === null) {
175
+ logNow({ from: identityKey(caller), fromName, to: `${args.to ?? args.conversation}@${host}`, target: `via:${host}`, status: 'failed', code: 'SSH_TRANSPORT_TIMEOUT' });
176
+ throw new MultichatError('SSH_TRANSPORT_TIMEOUT', `本地等待 ${Math.round(timeoutMs / 1000)}s 超时,远端状态不明——勿盲目重发(可能与首次投递叠加)。先在对端查 send-log 或 status --conversations 核实后再决定。`);
177
+ }
178
+ if (res.code === 255) {
179
+ logNow({ from: identityKey(caller), fromName, to: `${args.to ?? args.conversation}@${host}`, target: `via:${host}`, status: 'failed', code: 'SSH_TRANSPORT_FAILED' });
180
+ throw new MultichatError('SSH_TRANSPORT_FAILED', `ssh 无法到达 ${host}(不通/密钥/known_hosts)。自证: ssh ${host} crosschat --version(顺带核对版本);检查 ~/.ssh/config 与网络。`);
181
+ }
182
+ if (res.code !== 0) {
183
+ // Remote business error: rethrow the SAME code so self-correction guidance
184
+ // (MESSAGE_TOO_LARGE etc.) stays verbatim (D3); prefix marks the hop.
185
+ const m = res.stderr.match(/crosschat: ([A-Z_]+): (.+)/);
186
+ const err = m !== null
187
+ ? new MultichatError(m[1], `[via ${host}] ${m[2]}`)
188
+ : new MultichatError('REMOTE_FAILED', `[via ${host}] 远端异常退出(${res.code}): ${res.stderr.slice(-400)}`);
189
+ logNow({ from: identityKey(caller), fromName, to: `${args.to ?? args.conversation}@${host}`, target: `via:${host}`, status: 'failed', code: err.code });
190
+ throw err;
191
+ }
192
+ let receipt;
193
+ try {
194
+ receipt = JSON.parse(res.stdout.trim());
195
+ }
196
+ catch {
197
+ logNow({ from: identityKey(caller), fromName, to: `${args.to ?? args.conversation}@${host}`, target: `via:${host}`, status: 'failed', code: 'REMOTE_FAILED' });
198
+ throw new MultichatError('REMOTE_FAILED', `[via ${host}] 远端回执不是 JSON: ${res.stdout.slice(0, 200)}`);
199
+ }
200
+ const displayTo = `${receipt.to}@${host}`;
201
+ logNow({
202
+ from: identityKey(caller),
203
+ fromName,
204
+ to: displayTo,
205
+ target: `via:${host}`,
206
+ status: receipt.status,
207
+ turn: receipt.turn,
208
+ replyRef: receipt.replyRef,
209
+ });
210
+ // Own-side pair continuity: the remote issued the ref, recording it locally
211
+ // makes the cross-machine pair show up in `status --conversations` (patch B).
212
+ if (deps.conversationStateFile !== undefined) {
213
+ try {
214
+ recordConversation(deps.conversationStateFile, decodeRef(receipt.replyRef), deps.now());
215
+ }
216
+ catch {
217
+ // a non-decodable ref must never fail the already-delivered send
218
+ }
219
+ }
220
+ if (args.json === true) {
221
+ return JSON.stringify({ ...receipt, via: `ssh:${host}` });
222
+ }
223
+ if (receipt.status === 'parked') {
224
+ return [
225
+ `已寄存给 ${displayTo}(对方忙,未送达)。队列共 ${receipt.queue ?? 1} 条,看门狗每 0.5–5 分钟自动重试,无需手动 status。`,
226
+ `人工随时可读滞留内容: ${receipt.mailbox ?? ''}(位于 ${host})`,
227
+ `reply-ref: ${receipt.replyRef}`,
228
+ ].join('\n');
229
+ }
230
+ if (receipt.status === 'queued') {
231
+ return `queued to ${displayTo} (turn ${receipt.turn}; 对方正忙,已入队,本轮结束即处理)\nreply-ref: ${receipt.replyRef}`;
232
+ }
233
+ return `delivered to ${displayTo} (turn ${receipt.turn})\nreply-ref: ${receipt.replyRef}`;
234
+ }
235
+ function originDisplayName(identity) {
236
+ if (identity.p === 'claude')
237
+ return identity.name ?? `claude/${identity.id.slice(0, 8)}`;
238
+ if (identity.p === 'codex')
239
+ return `codex/${identity.id.slice(0, 8)}`;
240
+ return 'human';
241
+ }
242
+ //# sourceMappingURL=federation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../src/federation.ts"],"names":[],"mappings":"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"}