@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.
- package/CHANGELOG.md +46 -0
- package/README.md +119 -138
- package/dist/cli.js +40 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/claude-wrapper.js +31 -3
- package/dist/commands/claude-wrapper.js.map +1 -1
- package/dist/commands/codex-wrapper.js +33 -0
- package/dist/commands/codex-wrapper.js.map +1 -0
- package/dist/commands/send.js +133 -15
- package/dist/commands/send.js.map +1 -1
- package/dist/envelope.js +11 -2
- package/dist/envelope.js.map +1 -1
- package/dist/federation.js +242 -0
- package/dist/federation.js.map +1 -0
- package/dist/identity.js +25 -0
- package/dist/identity.js.map +1 -1
- package/dist/limits.js +122 -0
- package/dist/limits.js.map +1 -0
- package/dist/platform/machine-id.js +38 -0
- package/dist/platform/machine-id.js.map +1 -0
- package/dist/ref.js +188 -7
- package/dist/ref.js.map +1 -1
- package/package.json +1 -1
- package/skills/crosschat/SKILL.md +6 -3
|
@@ -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"}
|
package/dist/commands/send.js
CHANGED
|
@@ -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
|
-
/**
|
|
11
|
-
export
|
|
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
|
-
|
|
17
|
-
|
|
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
|
|
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
|
-
'
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,uBAAuB,EACvB,qBAAqB,GAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,mBAAmB,EACnB,8BAA8B,EAC9B,6BAA6B,EAC7B,oBAAoB,EACpB,6BAA6B,EAC7B,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,WAAW,GAGZ,MAAM,WAAW,CAAC;AAEnB,yDAAyD;AACzD,OAAO,EAAE,sBAAsB,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AA8CxE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc,EAAE,IAAc;IAC1D,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,gEAAgE;IAChE,6CAA6C;IAC7C,mDAAmD;IACnD,6CAA6C;IAC7C,wBAAwB;IACxB,MAAM,aAAa,GAAG,6BAA6B,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,aAAa,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,aAAa,KAAK,oBAAoB,GAAG,KAAK,CAAC;QACjE,gDAAgD;QAChD,qCAAqC;QACrC,0BAA0B;QAC1B,MAAM,IAAI,cAAc,CACtB,mBAAmB,EACnB,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAClH,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,sEAAsE;IACtE,qEAAqE;IACrE,sCAAsC;IACtC,wEAAwE;IACxE,4EAA4E;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,MAAM,GACV,SAAS,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAClD,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC;gBACnC,CAAC,CAAC,SAAS,CAAC;YAChB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAChC,CAAC,EAAE,EAA0D,EAAE,CAC7D,CAAC,uBAAuB,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,EAAE,CAAC,CAAC,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CACzF,CAAC;YACF,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,mEAAmE;IACnE,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,8CAA8C;QAC9C,2CAA2C;QAC3C,oCAAoC;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC;QACxE,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxD,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpH,MAAM,MAAM,GAAmB,MAAM,IAAI,SAAS,CAAC;IAEnD,IAAI,MAAmB,CAAC;IACxB,IAAI,MAAuB,CAAC;IAC5B,IAAI,IAAY,CAAC;IACjB,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,cAAc,CACtB,4BAA4B,EAC5B,WAAW,WAAW,CAAC,MAAM,CAAC,6CAA6C;gBACzE,6CAA6C,CAChD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,cAAc,CACtB,uBAAuB,EACvB,4FAA4F,CAC7F,CAAC;QACJ,CAAC;QACD,sEAAsE;QACtE,oEAAoE;QACpE,yEAAyE;QACzE,6DAA6D;QAC7D,MAAM,SAAS,GACb,IAAI,CAAC,qBAAqB,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;YAC5C,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;QACvB,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,wEAAwE;QACxE,oEAAoE;QACpE,oEAAoE;QACpE,mEAAmE;QACnE,iDAAiD;QACjD,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,uFAAuF;QACzF,CAAC;QACD,2EAA2E;QAC3E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM;YACJ,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBACxB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjD,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAC7C,yEAAyE;QACzE,yEAAyE;QACzE,wDAAwD;QACxD,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GACb,IAAI,CAAC,qBAAqB,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE,GAAG,EAAE,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;YAC9D,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,qBAAqB,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC;QACvB,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,6CAA6C;IAC7C,sCAAsC;IACtC,iDAAiD;IACjD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,6BAA6B,CAAC;IAC3G,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC;QACxB,oCAAoC;QACpC,mCAAmC;QACnC,MAAM,IAAI,cAAc,CACtB,mBAAmB,EACnB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CACvF,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,6EAA6E;IAC7E,wEAAwE;IACxE,8EAA8E;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,CAAC,EAAe,EAAE,CAAS,EAAE,GAAuB,EAAe,EAAE,CACjF,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAC9E,MAAM,GAAG;YACP,GAAG,MAAM;YACT,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YACrF,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACtF,CAAC;IACJ,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,GACX,QAAQ,CAAC,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC;QAC5G,CAAC,CAAC,QAAQ,CAAC,CAAC;QACZ,CAAC,CAAC,SAAS,CAAC;IAChB,qEAAqE;IACrE,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,SAAS,GACb,MAAM,KAAK,SAAS;QACpB,MAAM,CAAC,IAAI,KAAK,IAAI;QACpB,MAAM,CAAC,GAAG,KAAK,SAAS;QACxB,QAAQ,KAAK,SAAS;QACtB,MAAM,CAAC,GAAG,KAAK,QAAQ;QACrB,CAAC,CAAC,aAAa,IAAI,mCAAmC;QACtD,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,MAAM,GAAG,CAAC,GAAW,EAAU,EAAE;QACrC,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACxC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/F,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,GAAG,GAAG,KAAK,SAAS,EAAE,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,wFAAwF;IACxF,MAAM,MAAM,GAAG,CAAC,MAAgC,EAAQ,EAAE;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC;IAEF,IAAI,MAAM,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QACvF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,cAAc,CACtB,kBAAkB,EAClB,kBAAkB,MAAM,CAAC,EAAE,+DAA+D;gBACxF,sDAAsD;gBACtD,kDAAkD,CACrD,CAAC;QACJ,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtG,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CACtB,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,EAAE,EAClF,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC9G,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS;YAAE,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjH,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,kFAAkF;IAClF,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;IAC3E,MAAM,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,GAAW,EAAE;QAC3B,IAAI,CACF,IAAI,CAAC,SAAS,EACd,MAAM,CAAC,EAAE,EACT,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,EAC7D,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QACF,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,0EAA0E;IAC1E,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC;QACzC,wEAAwE;QACxE,wEAAwE;QACxE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtF,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACvH,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS;YAAE,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACjH,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,GAAG,GAAG,2DAA2D,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,GAAG,GAAG,0DAA0D,CAAC,CAAC;QAClF,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,qEAAqE;QACrE,IACE,GAAG,YAAY,cAAc;YAC7B,CAAC,GAAG,CAAC,IAAI,KAAK,2BAA2B,IAAI,GAAG,CAAC,IAAI,KAAK,qBAAqB,CAAC,EAChF,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,qBAAqB,KAAK,SAAS;gBAAE,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACjH,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7G,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CACf,IAAc,EACd,MAAgC;IAEhC,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,2DAA2D,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,wDAAwD,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,IAAc;IACjD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,6DAA6D,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CACtB,eAAe,EACf,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,QAAwB;IAC3C,IAAI,QAAQ,CAAC,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,QAAQ,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAE,EAAU;IACzC,OAAO,GAAG,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CAAC,IAAa,EAAE,MAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,MAAe;IACpG,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,aAAa,MAAM,UAAU,IAAI,mCAAmC,QAAQ,EAAE,CAAC;IACxF,CAAC;IACD,OAAO,gBAAgB,MAAM,UAAU,IAAI,iBAAiB,QAAQ,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CACnB,IAAa,EACb,MAAc,EACd,IAAY,EACZ,QAAgB,EAChB,KAAa,EACb,WAAmB;IAEnB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,OAAO;QACL,QAAQ,MAAM,iBAAiB,KAAK,mCAAmC;QACvE,eAAe,WAAW,EAAE;QAC5B,cAAc,QAAQ,EAAE;KACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
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
|
-
|
|
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>`);
|
package/dist/envelope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA
|
|
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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"}
|