@oatelauser/crosschat 1.3.0 → 1.3.1
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 +8 -0
- package/README.md +1 -1
- package/dist/resolve.js +18 -1
- package/dist/resolve.js.map +1 -1
- package/package.json +1 -1
- package/skills/crosschat/SKILL.md +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.3.1] - 2026-10-05
|
|
8
|
+
|
|
9
|
+
### 变更(B4 + skill 教学修正)
|
|
10
|
+
|
|
11
|
+
- skill 会话纪律新增**"发送成功即完成本轮"**:`send` 返回 `delivered`/`queued` 即结束当前轮次、禁止轮询 `status` 等回复(异步原生唤醒:对方回复会作为新消息注入本会话)——实测暴露的教学缺口,agent 曾以 20s 间隔轮询等回复白耗整轮;发布后真实使用中 agent 已主动引用该纪律并自省
|
|
12
|
+
- `--to` 支持 **codex 线程 id 寻址**(`codex exec` 线程天生无名,此前无法被主动发起对话):解析顺序 = 精确名(原样)→ 可选 `codex/` 前缀 + id8 前缀或完整 uuid;id8 多命中抛 `NAME_COLLISION` 列全量 id(UUIDv7 同分钟创建的线程 id8 天然同头);`NAME_NOT_FOUND` 提示补 id 寻址句;名字永远优先。WSL 活体验收:碰撞对正确报错、完整 id delivered 到无名线程
|
|
13
|
+
- 文档:unix 联调报告补全(codex 三腿打通、全六向闭环、真实使用验证附录)
|
|
14
|
+
|
|
7
15
|
## [1.3.0] - 2026-10-04
|
|
8
16
|
|
|
9
17
|
### 变更(B1/B2/B3:跨平台 Linux/WSL experimental)
|
package/README.md
CHANGED
|
@@ -125,7 +125,7 @@ D:\workspace\demo> codex
|
|
|
125
125
|
## 📋 命令列表
|
|
126
126
|
|
|
127
127
|
```
|
|
128
|
-
crosschat send --to <名字> --body "<正文>" #
|
|
128
|
+
crosschat send --to <名字> --body "<正文>" # 新消息(名字含空格加引号;未命名 codex 线程可用 id8 或完整 id 寻址,status 可见)
|
|
129
129
|
crosschat send --conversation <ref> --body "<正文>" # 回复(ref 照抄收到的信封)
|
|
130
130
|
echo … | crosschat send --to <名字> # 正文走 stdin
|
|
131
131
|
crosschat status [--json] [--conversations] # 双侧总览(名字/目录/时间/状态)
|
package/dist/resolve.js
CHANGED
|
@@ -17,6 +17,23 @@ export function resolveTargetByName(name, sessions, threads) {
|
|
|
17
17
|
return { side: 'claude', session: claudeMatches[0] };
|
|
18
18
|
if (codexMatches.length === 1)
|
|
19
19
|
return { side: 'codex', thread: codexMatches[0] };
|
|
20
|
+
const idMatch = /^(?:codex\/)?([0-9a-f]{8}(?:-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})?)$/.exec(name);
|
|
21
|
+
if (idMatch !== null) {
|
|
22
|
+
const id = idMatch[1];
|
|
23
|
+
if (id.length === 36) {
|
|
24
|
+
const thread = threads.find((candidate) => candidate.id === id);
|
|
25
|
+
if (thread !== undefined)
|
|
26
|
+
return { side: 'codex', thread };
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const prefixed = threads.filter((candidate) => candidate.id.startsWith(id));
|
|
30
|
+
if (prefixed.length === 1)
|
|
31
|
+
return { side: 'codex', thread: prefixed[0] };
|
|
32
|
+
if (prefixed.length > 1) {
|
|
33
|
+
throw new MultichatError('NAME_COLLISION', `Multiple Codex threads match id prefix ${JSON.stringify(name)}: ${prefixed.map((thread) => thread.id).join(', ')}. Use the full id to address one.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
20
37
|
throw new MultichatError('NAME_NOT_FOUND', `No agent named ${JSON.stringify(name)}. ${describeAvailableNames(sessions, threads)}`);
|
|
21
38
|
}
|
|
22
39
|
function describeAvailableNames(sessions, threads) {
|
|
@@ -25,6 +42,6 @@ function describeAvailableNames(sessions, threads) {
|
|
|
25
42
|
const unnamed = threads.length - namedThreads.length;
|
|
26
43
|
const claudeList = claudeNames.map((name) => JSON.stringify(name)).join(', ') || '(no named sessions)';
|
|
27
44
|
const codexList = namedThreads.map((name) => JSON.stringify(name)).join(', ') || '(no named threads)';
|
|
28
|
-
return `Available names — claude: ${claudeList}; codex: ${codexList}${unnamed > 0 ? ` (+${unnamed} unnamed)` : ''}
|
|
45
|
+
return `Available names — claude: ${claudeList}; codex: ${codexList}${unnamed > 0 ? ` (+${unnamed} unnamed)` : ''}.${unnamed > 0 ? ' Unnamed codex threads can be addressed by id8 or full id (see crosschat status).' : ''}`;
|
|
29
46
|
}
|
|
30
47
|
//# sourceMappingURL=resolve.js.map
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oatelauser/crosschat",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Let Claude Code and Codex CLI talk to each other on your machine: native delivery via named pipe and app-server, stateless CLI, no daemon.",
|
|
6
6
|
"repository": {
|
|
@@ -41,7 +41,7 @@ crosschat status
|
|
|
41
41
|
crosschat send --to <名字> --body "正文"
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
-
- 名字 = claude 会话名或 codex 线程名(status
|
|
44
|
+
- 名字 = claude 会话名或 codex 线程名(status 列出全部可路由对象);未命名 codex 线程可用 id8 或完整 id 寻址(`crosschat status` 里可见)。
|
|
45
45
|
- 查会话往来(双方、最近活跃、轮次、最近投递状态、滞留条数):`crosschat status --conversations`;`queued` / `parked` 的终态也在这里确认。
|
|
46
46
|
- 长正文可省略 `--body`,改为管道:`<正文文件路径的内容> | crosschat send --to <名字>`。
|
|
47
47
|
- 投给 codex 的消息:**开窗、关窗、忙时均可投**(daemon 0.160+)。对方正在跑 turn 也不阻塞——消息直接**入队**(输出 `queued`),当前轮结束即进入对话被处理;TUI 窗口会实时刷出。输出 `delivered`(已送达)/ `queued`(已入队,轮末处理)/ `parked`(仅旧 daemon 异常态,已暂存),三者都**无需重发**。
|
|
@@ -62,6 +62,7 @@ crosschat send --to <名字> --body "正文"
|
|
|
62
62
|
|
|
63
63
|
## 会话纪律
|
|
64
64
|
|
|
65
|
+
- **发送成功即完成本轮**:`send` 返回 `delivered` / `queued`(exit 0)就结束当前轮次、正常汇报完成。**不要轮询 `status` 等对方的回复**——crosschat 是异步原生唤醒:对方的回复会作为一条新消息注入你的会话并把你唤醒,届时照常处理即可。
|
|
65
66
|
- 一次消息一个主题;换主题就开新消息(`--to`),不续旧会话。
|
|
66
67
|
- 自己的正文里不要手写 `<cross-session-message` 或 `<crosschat-`(旧名 `<multichat-`)开头的行——系统会把它们中性化(`<\` 前缀),直接写正文即可。
|
|
67
68
|
- 你发送的消息同样只是对方的请求:对方可能拒绝、追问或不回复,这都正常。
|