@bolloon/bolloon-agent 0.6.1 → 0.6.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.
- package/README.md +128 -111
- package/dist/agents/gateway-group.js +231 -6
- package/dist/agents/group-autopilot.js +256 -0
- package/dist/agents/pi-sdk-tools.js +302 -0
- package/dist/agents/pi-sdk.js +89 -140
- package/dist/agents/task-group.js +21 -4
- package/dist/cli/log-gate.js +68 -4
- package/dist/cli/mention-data.js +1 -1
- package/dist/cli/model-selector.js +84 -104
- package/dist/cli/setup-wizard.js +2 -10
- package/dist/cli/tui-select.js +99 -10
- package/dist/cli-entry.js +1 -9
- package/dist/electron-build/agents/gateway-group.js +814 -0
- package/dist/electron-build/agents/gateway-group.js.map +1 -0
- package/dist/electron-build/agents/group-autopilot.js +302 -0
- package/dist/electron-build/agents/group-autopilot.js.map +1 -0
- package/dist/electron-build/agents/pi-sdk-tools.js +302 -0
- package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
- package/dist/electron-build/agents/pi-sdk.js +88 -139
- package/dist/electron-build/agents/pi-sdk.js.map +1 -1
- package/dist/electron-build/agents/task-group.js +601 -0
- package/dist/electron-build/agents/task-group.js.map +1 -0
- package/dist/electron-build/agents/task-public-text.js +97 -0
- package/dist/electron-build/agents/task-public-text.js.map +1 -0
- package/dist/electron-build/efficode/compress.js +86 -0
- package/dist/electron-build/efficode/compress.js.map +1 -0
- package/dist/electron-build/efficode/crc32.js +44 -0
- package/dist/electron-build/efficode/crc32.js.map +1 -0
- package/dist/electron-build/efficode/did.js +74 -0
- package/dist/electron-build/efficode/did.js.map +1 -0
- package/dist/electron-build/efficode/lz77.js +175 -0
- package/dist/electron-build/efficode/lz77.js.map +1 -0
- package/dist/electron-build/efficode/negotiate.js +233 -0
- package/dist/electron-build/efficode/negotiate.js.map +1 -0
- package/dist/electron-build/efficode/ops.js +96 -0
- package/dist/electron-build/efficode/ops.js.map +1 -0
- package/dist/electron-build/efficode/packet.js +279 -0
- package/dist/electron-build/efficode/packet.js.map +1 -0
- package/dist/electron-build/efficode/types.js +50 -0
- package/dist/electron-build/efficode/types.js.map +1 -0
- package/dist/electron-build/kernel/code-write-gate.js +55 -0
- package/dist/electron-build/kernel/code-write-gate.js.map +1 -0
- package/dist/electron-build/kernel/run-lifecycle.js +23 -0
- package/dist/electron-build/kernel/run-lifecycle.js.map +1 -1
- package/dist/electron-build/kernel/run-resume.js +62 -0
- package/dist/electron-build/kernel/run-resume.js.map +1 -0
- package/dist/electron-build/kernel/session-lifecycle.js +223 -0
- package/dist/electron-build/kernel/session-lifecycle.js.map +1 -0
- package/dist/electron-build/kernel/turn-selfcheck.js +65 -0
- package/dist/electron-build/kernel/turn-selfcheck.js.map +1 -0
- package/dist/electron-build/llm/config-store.js +2 -2
- package/dist/electron-build/llm/config-store.js.map +1 -1
- package/dist/electron-build/llm/model-selection.js +16 -2
- package/dist/electron-build/llm/model-selection.js.map +1 -1
- package/dist/electron-build/llm/pi-ai.js +2 -2
- package/dist/electron-build/llm/pi-ai.js.map +1 -1
- package/dist/electron-build/orbitdb/cid-database.js +98 -19
- package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
- package/dist/electron-build/orbitdb/group-access.js +399 -0
- package/dist/electron-build/orbitdb/group-access.js.map +1 -0
- package/dist/index.js +143 -10
- package/dist/ios/bolloon-web.json +3 -3
- package/dist/ios/sw.js +1 -1
- package/dist/kernel/code-write-gate.js +47 -0
- package/dist/kernel/gate-scan.js +5 -1
- package/dist/kernel/plan-harness.js +3 -2
- package/dist/kernel/roster.js +6 -6
- package/dist/kernel/run-lifecycle.js +21 -0
- package/dist/kernel/run-resume.js +58 -0
- package/dist/kernel/session-lifecycle.js +210 -0
- package/dist/kernel/turn-selfcheck.js +60 -0
- package/dist/llm/config-store.js +2 -2
- package/dist/llm/model-selection.js +16 -2
- package/dist/llm/pi-ai.js +2 -2
- package/dist/orbitdb/cid-database.js +95 -19
- package/dist/web/bolloon-web.json +3 -3
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* task-group.ts — 群聊通道 (C7) 桥接: 让任务的「发布 → 接单 → 交付 → 初筛 → 终审」
|
|
4
|
+
* 在 Bolloon 群聊里留下**过程痕迹**, 同时**不把私有内容塞进群里**。(2026-09-23)
|
|
5
|
+
*
|
|
6
|
+
* 为什么需要这一层: 任务公告板 (task-board.ts) 只解决「把待接单任务放出去 / 被认领」,
|
|
7
|
+
* 但协作过程 (谁宣布了、谁接了、交付了哪个哈希、初筛逐条结果、终审结论) 没有共同的发生地 ——
|
|
8
|
+
* 群聊 (gateway-group.ts) 才是人和 agent 都看得见的那个发生地。
|
|
9
|
+
*
|
|
10
|
+
* 本模块做的三件事 (只加不减弱; **不改群聊核心语义**):
|
|
11
|
+
* 1. 公告入群: 把板上的**一条**待接单公告压成一行极短事实发进群 (announce)
|
|
12
|
+
* 2. 留痕回看: 从群消息里读回本期时间线 (announce/claim/deliver/screen/final), 带时间与发送者标记 (trail)
|
|
13
|
+
* 3. 接单/交付/初筛/终审的群消息桥接 (claim / post)
|
|
14
|
+
*
|
|
15
|
+
* 三条硬纪律:
|
|
16
|
+
* · **隐私红线**: 群里只许出现短引用 (公告 id / 内容哈希 / capability / 预算 / 时间)。
|
|
17
|
+
* 发送前 `scanPublicText()` 逐条规则把关, 命中就**拒发** (不静默脱敏, 不猜用户本意)。
|
|
18
|
+
* 覆盖: 钱包地址 · DID · peerId · multiaddr · IPv4/IPv6 · 私钥/助记词形态 · PEM ·
|
|
19
|
+
* orbitdb 群链接本身 · http(s) URL · 邮箱 (后三条属「只加不减」的更严档: 群消息是机器生成的事实行,
|
|
20
|
+
* 任何端点/联系方式都是泄漏面)。
|
|
21
|
+
* · **发送者标记**: 群里只出现稳定假名 `agent-<8位>` (sha256(DID) 前 8 位), 原始 DID 永不入群。
|
|
22
|
+
* · **缺群 / 群非法 / 群不存在 → 拒跑**: 绝不静默降级成「只写本地」。群聊通道就是留痕的地方,
|
|
23
|
+
* 没有群就没有留痕, 假造一个本地痕迹等于骗人。
|
|
24
|
+
*
|
|
25
|
+
* 衔接点 (与并行实现的边界, 只读不耦合):
|
|
26
|
+
* · 公告数据源 = 任务公告板落盘 `~/.bolloon/tasks/board/<announcementId>.json`
|
|
27
|
+
* (task-board.ts 的 `boardDir()` / `announcementFile()` 同一目录同一形状)。
|
|
28
|
+
* 这里**直接读 JSON** 而不是 import 它的 API: 板的 API 还在演进, 直读文件让本模块不跟着抖;
|
|
29
|
+
* 哪天 board API 定型, 把 `readBoardAnnouncement` / `listOpenBoardAnnouncements` 换成
|
|
30
|
+
* `readAnnouncement` / `listBoard` 即可, **群消息格式不变**。
|
|
31
|
+
* · 群接口 = gateway-group.ts 的 `parseGroupLink` / `listGroups` / `groupSend` / `groupMessages` (只读用)。
|
|
32
|
+
* · 消息格式自描述 (`[bolloon-task] v=1 kind=… k=v …`), 解析失败的行一律**跳过** (不猜、不糊)。
|
|
33
|
+
*
|
|
34
|
+
* 未做 (如实, 不假装):
|
|
35
|
+
* · 不做跨机群同步验收 (那是 OrbitDB 复制本身的事; 本模块只保证「发进群 / 从群读回」这条链路)。
|
|
36
|
+
* · 不代发终审结论之外的任何裁决 (release 仍只在链上; 群里的话不替代 `releaseV2`)。
|
|
37
|
+
* · 不做消息加密 (群是公开可读的 store, 所以本模块只放**公开事实**: 短引用 + 哈希 + 预算)。
|
|
38
|
+
*/
|
|
39
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
40
|
+
if (k2 === undefined) k2 = k;
|
|
41
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
42
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
43
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
44
|
+
}
|
|
45
|
+
Object.defineProperty(o, k2, desc);
|
|
46
|
+
}) : (function(o, m, k, k2) {
|
|
47
|
+
if (k2 === undefined) k2 = k;
|
|
48
|
+
o[k2] = m[k];
|
|
49
|
+
}));
|
|
50
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
51
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
52
|
+
}) : function(o, v) {
|
|
53
|
+
o["default"] = v;
|
|
54
|
+
});
|
|
55
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
56
|
+
var ownKeys = function(o) {
|
|
57
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
58
|
+
var ar = [];
|
|
59
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
60
|
+
return ar;
|
|
61
|
+
};
|
|
62
|
+
return ownKeys(o);
|
|
63
|
+
};
|
|
64
|
+
return function (mod) {
|
|
65
|
+
if (mod && mod.__esModule) return mod;
|
|
66
|
+
var result = {};
|
|
67
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
68
|
+
__setModuleDefault(result, mod);
|
|
69
|
+
return result;
|
|
70
|
+
};
|
|
71
|
+
})();
|
|
72
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
73
|
+
exports.boardDirOf = exports.VERDICTS = exports.TRAIL_KIND_LABEL = exports.TRAIL_KINDS = exports.TRAIL_VERSION = exports.TRAIL_TAG = exports.mask = exports.scanNodeIdentity = exports.requirePublicText = exports.scanPublicText = exports.NODE_IDENTITY_RULES = exports.PRIVACY_RULES = void 0;
|
|
74
|
+
exports.senderTag = senderTag;
|
|
75
|
+
exports.maskSender = maskSender;
|
|
76
|
+
exports.resolveSenderTag = resolveSenderTag;
|
|
77
|
+
exports.resolveGroupRef = resolveGroupRef;
|
|
78
|
+
exports.isAnnouncementId = isAnnouncementId;
|
|
79
|
+
exports.readBoardAnnouncement = readBoardAnnouncement;
|
|
80
|
+
exports.listOpenBoardAnnouncements = listOpenBoardAnnouncements;
|
|
81
|
+
exports.pickAnnouncement = pickAnnouncement;
|
|
82
|
+
exports.buildAnnounceMessage = buildAnnounceMessage;
|
|
83
|
+
exports.normalizeContentHash = normalizeContentHash;
|
|
84
|
+
exports.parseChecks = parseChecks;
|
|
85
|
+
exports.buildPostMessage = buildPostMessage;
|
|
86
|
+
exports.sendTrailMessage = sendTrailMessage;
|
|
87
|
+
exports.parseTrailLine = parseTrailLine;
|
|
88
|
+
exports.redactFields = redactFields;
|
|
89
|
+
exports.summarizeTrail = summarizeTrail;
|
|
90
|
+
exports.readTrail = readTrail;
|
|
91
|
+
exports.formatTrailLine = formatTrailLine;
|
|
92
|
+
const fs = __importStar(require("fs"));
|
|
93
|
+
const os = __importStar(require("os"));
|
|
94
|
+
const path = __importStar(require("path"));
|
|
95
|
+
const crypto = __importStar(require("crypto"));
|
|
96
|
+
const gateway_group_js_1 = require("./gateway-group.js");
|
|
97
|
+
// 2026-09-25: 隐私红线规则表抽到 task-public-text.ts (手机端与桌面端**同一份**)
|
|
98
|
+
const task_public_text_js_1 = require("./task-public-text.js");
|
|
99
|
+
Object.defineProperty(exports, "PRIVACY_RULES", { enumerable: true, get: function () { return task_public_text_js_1.PRIVACY_RULES; } });
|
|
100
|
+
Object.defineProperty(exports, "NODE_IDENTITY_RULES", { enumerable: true, get: function () { return task_public_text_js_1.NODE_IDENTITY_RULES; } });
|
|
101
|
+
Object.defineProperty(exports, "scanPublicText", { enumerable: true, get: function () { return task_public_text_js_1.scanPublicText; } });
|
|
102
|
+
Object.defineProperty(exports, "requirePublicText", { enumerable: true, get: function () { return task_public_text_js_1.requirePublicText; } });
|
|
103
|
+
Object.defineProperty(exports, "scanNodeIdentity", { enumerable: true, get: function () { return task_public_text_js_1.scanNodeIdentity; } });
|
|
104
|
+
Object.defineProperty(exports, "mask", { enumerable: true, get: function () { return task_public_text_js_1.mask; } });
|
|
105
|
+
// ── 常量 ────────────────────────────────────────────────────────────────────
|
|
106
|
+
/** 消息标记 (一行一条; 解析只认这一行) */
|
|
107
|
+
exports.TRAIL_TAG = '[bolloon-task]';
|
|
108
|
+
/** 消息版本 (格式变了就 bump; 解析器按 `v=` 分流, 老版本照旧可读) */
|
|
109
|
+
exports.TRAIL_VERSION = '1';
|
|
110
|
+
exports.TRAIL_KINDS = ['announce', 'claim', 'deliver', 'screen', 'final'];
|
|
111
|
+
/** 人能看懂的中文名 (人类输出用) */
|
|
112
|
+
exports.TRAIL_KIND_LABEL = {
|
|
113
|
+
announce: '公告',
|
|
114
|
+
claim: '接单声明',
|
|
115
|
+
deliver: '交付',
|
|
116
|
+
screen: '初筛结果',
|
|
117
|
+
final: '终审结论',
|
|
118
|
+
};
|
|
119
|
+
exports.VERDICTS = ['accept', 'reject', 'unknown'];
|
|
120
|
+
// ── 隐私守卫 ────────────────────────────────────────────────────────────────
|
|
121
|
+
// 规则表与扫描函数本身在 `task-public-text.ts` (单一来源, 手机/桌面共用);
|
|
122
|
+
// 本文件只负责**发送前调用它** (见 sendTrailMessage) 与在群管理输出上再过一遍 (scanNodeIdentity)。
|
|
123
|
+
// ── 发送者标记 (稳定假名, 原始 DID 不入群) ──────────────────────────────────
|
|
124
|
+
const sha256Hex = (s) => crypto.createHash('sha256').update(s, 'utf8').digest('hex');
|
|
125
|
+
/** DID → 稳定假名 `agent-<8位>` (同一个人每次都是同一个标记, 但看不出是谁) */
|
|
126
|
+
function senderTag(did) {
|
|
127
|
+
return `agent-${sha256Hex(String(did || '')).slice(0, 8)}`;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 群消息里的 from → 对外展示的发送者标记。
|
|
131
|
+
* 短显示名 (无隐私形态, 1..24 个字母/数字/汉字/._-) 原样保留 (可读); 其余一律打码成 `#<8位>`。
|
|
132
|
+
*/
|
|
133
|
+
function maskSender(from) {
|
|
134
|
+
const s = String(from || '').trim();
|
|
135
|
+
if (!s)
|
|
136
|
+
return 'unknown';
|
|
137
|
+
if ((0, task_public_text_js_1.scanPublicText)(s).length === 0 && /^[\p{L}\p{N}._-]{1,24}$/u.test(s))
|
|
138
|
+
return s;
|
|
139
|
+
return `#${sha256Hex(s).slice(0, 8)}`;
|
|
140
|
+
}
|
|
141
|
+
/** 解析本次发送用哪个标记: 显式 `--from` 优先 (要过隐私闸), 否则用本机身份派生假名 */
|
|
142
|
+
async function resolveSenderTag(explicit) {
|
|
143
|
+
const e = String(explicit ?? '').trim();
|
|
144
|
+
if (e) {
|
|
145
|
+
const v = (0, task_public_text_js_1.scanPublicText)(e);
|
|
146
|
+
if (v.length) {
|
|
147
|
+
return {
|
|
148
|
+
ok: false, code: 'POLICY_DENIED',
|
|
149
|
+
message: `--from 含隐私形态 → 拒 (${v.map((x) => x.rule).join(', ')})`,
|
|
150
|
+
detail: { violations: v, acceptedHint: '用短显示名, 例如 --from 委托方' },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (!/^[\p{L}\p{N}._-]{1,32}$/u.test(e)) {
|
|
154
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: '--from 只能是短显示名 (字母/数字/汉字/._-, ≤32 字)', detail: { from: e } };
|
|
155
|
+
}
|
|
156
|
+
return { ok: true, tag: e, source: 'flag' };
|
|
157
|
+
}
|
|
158
|
+
const { loadLocalSigner } = await Promise.resolve().then(() => __importStar(require('./local-signer.js')));
|
|
159
|
+
const signer = await loadLocalSigner().catch(() => null);
|
|
160
|
+
if (signer?.did)
|
|
161
|
+
return { ok: true, tag: senderTag(signer.did), source: 'identity' };
|
|
162
|
+
return {
|
|
163
|
+
ok: false, code: 'INVALID_ARGUMENT',
|
|
164
|
+
message: '没有本机身份 (~/.bolloon/identity.json) 也没有 --from → 给不出诚实的发送者标记 (拒, 不假造一个)',
|
|
165
|
+
detail: { identityFile: '~/.bolloon/identity.json', accepted: ['--from 委托方', 'bolloon identity init', 'bolloon setup'] },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/** 与 gateway-group 内部 `groupIdOf` 同款派生 (它没导出; 这里只作地址比不中时的兜底) */
|
|
169
|
+
function groupIdOfAddress(address) {
|
|
170
|
+
const m = /\/orbitdb\/(.{8,})/.exec(String(address || ''));
|
|
171
|
+
return m ? m[1] : String(address || '');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* `--group <群链接|groupId>` → 本机已知的群。
|
|
175
|
+
* 三件事一律拒 (并说清原因 + 已加入的群有哪些): 缺 --group · 链接非法 · 本机没这个群。
|
|
176
|
+
*/
|
|
177
|
+
async function resolveGroupRef(ref) {
|
|
178
|
+
const raw = String(ref ?? '').trim();
|
|
179
|
+
const groups = await (0, gateway_group_js_1.listGroups)();
|
|
180
|
+
const joined = groups.map((g) => ({ id: g.id, name: g.name }));
|
|
181
|
+
if (!raw) {
|
|
182
|
+
return {
|
|
183
|
+
ok: false, code: 'INVALID_ARGUMENT',
|
|
184
|
+
message: '缺少 --group (群链接 orbitdb://…?type=group&name=… 或已加入群的 groupId)',
|
|
185
|
+
detail: {
|
|
186
|
+
joined, accepted: ['--group orbitdb:///orbitdb/<store>?type=group&name=<群名>', '--group <groupId>'],
|
|
187
|
+
why: '没有群就没有留痕的落点: 本命令**不**降级成只写本地',
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (/^orbitdb:\/\//i.test(raw)) {
|
|
192
|
+
const parsed = (0, gateway_group_js_1.parseGroupLink)(raw);
|
|
193
|
+
if (!parsed) {
|
|
194
|
+
return {
|
|
195
|
+
ok: false, code: 'INVALID_ARGUMENT',
|
|
196
|
+
message: `--group 不是合法的群链接 (需要 orbitdb://<store 地址>?type=group&name=<群名>): ${(0, task_public_text_js_1.mask)(raw)}`,
|
|
197
|
+
detail: { refChars: raw.length, parsed: null, joined, why: '链接解析失败 → 拒 (不猜你想发到哪个群)' },
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
const hit = groups.find((g) => g.address === parsed.address)
|
|
201
|
+
|| groups.find((g) => g.id === groupIdOfAddress(parsed.address))
|
|
202
|
+
|| null;
|
|
203
|
+
if (!hit) {
|
|
204
|
+
return {
|
|
205
|
+
ok: false, code: 'NETWORK_NOT_JOINED',
|
|
206
|
+
message: '本机还没加入这个群 (链接指向的群不在本地群列表里) → 先入群, 再发过程痕迹',
|
|
207
|
+
detail: {
|
|
208
|
+
joined,
|
|
209
|
+
howTo: 'bolloon gateway list 看已加入的群; 用群链接加入后在群里发 (本命令不替你静默入群/也不静默改发本地)',
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return { ok: true, group: { ref: raw, groupId: hit.id, name: hit.name, via: 'link' } };
|
|
214
|
+
}
|
|
215
|
+
const hit = groups.find((g) => g.id === raw) || groups.find((g) => g.name === raw) || null;
|
|
216
|
+
if (hit)
|
|
217
|
+
return { ok: true, group: { ref: raw, groupId: hit.id, name: hit.name, via: 'id' } };
|
|
218
|
+
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(raw)) {
|
|
219
|
+
return {
|
|
220
|
+
ok: false, code: 'INVALID_ARGUMENT',
|
|
221
|
+
message: `--group 不是群链接 (${raw.slice(0, 12)}…) — 群聊链接形如 orbitdb://…?type=group&name=…`,
|
|
222
|
+
detail: { scheme: raw.split(':')[0], joined },
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
ok: false, code: 'NOT_FOUND',
|
|
227
|
+
message: `本机没有这个群: ${(0, task_public_text_js_1.mask)(raw)} (既不是已加入群的 groupId, 也不是群名)`,
|
|
228
|
+
detail: { joined, howTo: 'bolloon gateway list / 用群链接加入后重试' },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const boardDirOf = (home) => path.join(home || process.env.HOME || os.homedir(), '.bolloon', 'tasks', 'board');
|
|
232
|
+
exports.boardDirOf = boardDirOf;
|
|
233
|
+
/** 公告 id 形状闸 (防目录穿越): 与 task-board 的 safeId 同形 */
|
|
234
|
+
function isAnnouncementId(id) {
|
|
235
|
+
return /^ann-[A-Za-z0-9._-]{4,96}$/.test(String(id || '').trim());
|
|
236
|
+
}
|
|
237
|
+
/** 读一条公告 (不存在/坏 JSON → null, 不猜) */
|
|
238
|
+
function readBoardAnnouncement(announcementId, home) {
|
|
239
|
+
const id = String(announcementId || '').trim();
|
|
240
|
+
if (!isAnnouncementId(id))
|
|
241
|
+
return null;
|
|
242
|
+
const file = path.join((0, exports.boardDirOf)(home), `${id}.json`);
|
|
243
|
+
try {
|
|
244
|
+
if (!fs.existsSync(file))
|
|
245
|
+
return null;
|
|
246
|
+
const j = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
247
|
+
if (!j || String(j.announcementId || '') !== id)
|
|
248
|
+
return null;
|
|
249
|
+
return {
|
|
250
|
+
announcementId: id,
|
|
251
|
+
capability: String(j.capability || ''),
|
|
252
|
+
status: String(j.status || 'unknown'),
|
|
253
|
+
budget: j.budget && typeof j.budget === 'object'
|
|
254
|
+
? { maxAmount: String(j.budget.maxAmount), currency: String(j.budget.currency || ''), network: String(j.budget.network || '') }
|
|
255
|
+
: null,
|
|
256
|
+
deadline: j.deadline === null || j.deadline === undefined || j.deadline === '' ? null : (Number.isFinite(Number(j.deadline)) ? Number(j.deadline) : null),
|
|
257
|
+
instructionDigest: j.instructionDigest ? String(j.instructionDigest) : null,
|
|
258
|
+
instructionPreview: j.instructionPreview ? String(j.instructionPreview) : null,
|
|
259
|
+
createdAt: j.createdAt === null || j.createdAt === undefined || j.createdAt === '' ? null : (Number.isFinite(Number(j.createdAt)) ? Number(j.createdAt) : null),
|
|
260
|
+
signed: !!j.signature,
|
|
261
|
+
claimCount: Array.isArray(j.claims) ? j.claims.length : 0,
|
|
262
|
+
source: 'board-file',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** 板上**可接单**的公告 (status=open), 新的在前 */
|
|
270
|
+
function listOpenBoardAnnouncements(home) {
|
|
271
|
+
const dir = (0, exports.boardDirOf)(home);
|
|
272
|
+
try {
|
|
273
|
+
if (!fs.existsSync(dir))
|
|
274
|
+
return [];
|
|
275
|
+
return fs.readdirSync(dir)
|
|
276
|
+
.filter((f) => f.startsWith('ann-') && f.endsWith('.json'))
|
|
277
|
+
.map((f) => readBoardAnnouncement(f.replace(/\.json$/, ''), home))
|
|
278
|
+
.filter((a) => !!a && a.status === 'open')
|
|
279
|
+
.sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0));
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return [];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 选一条要发进群的公告:
|
|
287
|
+
* `--announcement-id` 显式指定 > (可选 `--capability` 过滤后的) 板上最新的 open 公告。
|
|
288
|
+
* 板上有多条且没给能力/公告号 → 也拒 (不替人选一条发出去)。
|
|
289
|
+
*/
|
|
290
|
+
function pickAnnouncement(opts) {
|
|
291
|
+
const explicit = String(opts.announcementId ?? '').trim();
|
|
292
|
+
if (explicit) {
|
|
293
|
+
if (!isAnnouncementId(explicit)) {
|
|
294
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: `announcementId 不合法: ${(0, task_public_text_js_1.mask)(explicit)} (形如 ann-xxxxxxxxxxxxxxxx)`, detail: { accepted: ['ann-<16 位>'] } };
|
|
295
|
+
}
|
|
296
|
+
const a = readBoardAnnouncement(explicit, opts.home);
|
|
297
|
+
if (!a) {
|
|
298
|
+
return {
|
|
299
|
+
ok: false, code: 'NOT_FOUND',
|
|
300
|
+
message: `板上没有这条公告: ${explicit}`,
|
|
301
|
+
detail: { dir: '~/.bolloon/tasks/board', howTo: 'bolloon task board 看板上有什么; 先 bolloon task publish 发一条' },
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
return { ok: true, announcement: a };
|
|
305
|
+
}
|
|
306
|
+
const open = listOpenBoardAnnouncements(opts.home);
|
|
307
|
+
const cap = String(opts.capability ?? '').trim().toLowerCase();
|
|
308
|
+
const pool = cap ? open.filter((a) => a.capability.trim().toLowerCase() === cap) : open;
|
|
309
|
+
if (pool.length === 0) {
|
|
310
|
+
return {
|
|
311
|
+
ok: false, code: 'NOT_FOUND',
|
|
312
|
+
message: open.length === 0
|
|
313
|
+
? '板上没有可接单的公告 (status=open) → 没有可发进群的东西'
|
|
314
|
+
: `板上 ${open.length} 条 open 公告里没有 capability='${cap}' 的`,
|
|
315
|
+
detail: { dir: '~/.bolloon/tasks/board', openCount: open.length, capability: cap || null, howTo: 'bolloon task publish --capability … --instruction "…" --budget 0.05' },
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
if (pool.length > 1) {
|
|
319
|
+
return {
|
|
320
|
+
ok: false, code: 'INVALID_ARGUMENT',
|
|
321
|
+
message: `板上有多条 open 公告 (${pool.length} 条) → 用 --announcement-id 指定要发哪一条 (不替人选)`,
|
|
322
|
+
detail: { candidates: pool.slice(0, 10).map((a) => ({ announcementId: a.announcementId, capability: a.capability })) },
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return { ok: true, announcement: pool[0] };
|
|
326
|
+
}
|
|
327
|
+
// ── 消息构造 (一行极短事实; 无正文, 无标识符) ─────────────────────────────────
|
|
328
|
+
/** token 值里不能有空白 (格式靠空格切); 空白一律折成 `_` */
|
|
329
|
+
function tok(v) {
|
|
330
|
+
const s = String(v ?? '').trim().replace(/\s+/g, '_');
|
|
331
|
+
return s || '-';
|
|
332
|
+
}
|
|
333
|
+
function short(s, n = 96) {
|
|
334
|
+
const p = String(s || '').trim().replace(/\s+/g, '_');
|
|
335
|
+
return p.length > n ? `${p.slice(0, n)}…` : p;
|
|
336
|
+
}
|
|
337
|
+
function budgetTok(b) {
|
|
338
|
+
if (!b)
|
|
339
|
+
return '-';
|
|
340
|
+
return short(`${b.maxAmount}${b.currency ? b.currency.toUpperCase() : ''}${b.network ? `@${b.network}` : ''}`, 64);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* 公告入群的那一行: 期号 · capability · 预算 · 验收判据摘要 · 公告 id (只有这些公开事实)。
|
|
344
|
+
* 任务正文 (instruction) 与其预览都**不进**消息 —— 群里只有摘要引用, 正文私下发给已入群的人。
|
|
345
|
+
*/
|
|
346
|
+
function buildAnnounceMessage(a, input = {}) {
|
|
347
|
+
const round = String(input.round ?? '').trim();
|
|
348
|
+
const criteria = String(input.criteria ?? '').trim();
|
|
349
|
+
const digest = a.instructionDigest ? a.instructionDigest.slice(0, 16) : null;
|
|
350
|
+
const judge = criteria
|
|
351
|
+
? short(criteria, 80)
|
|
352
|
+
: (digest ? `unstated;sha256=${digest}` : 'unstated');
|
|
353
|
+
return [
|
|
354
|
+
exports.TRAIL_TAG,
|
|
355
|
+
`v=${exports.TRAIL_VERSION}`,
|
|
356
|
+
'kind=announce',
|
|
357
|
+
`id=${a.announcementId}`,
|
|
358
|
+
`cap=${short(a.capability, 48)}`,
|
|
359
|
+
`budget=${budgetTok(a.budget)}`,
|
|
360
|
+
`deadline=${a.deadline ? new Date(a.deadline).toISOString() : '-'}`,
|
|
361
|
+
`round=${round ? short(round, 24) : '-'}`,
|
|
362
|
+
`judge=${judge}`,
|
|
363
|
+
].join(' ');
|
|
364
|
+
}
|
|
365
|
+
/** 哈希闸: 只收内容哈希形状 (sha256 64 位 / CIDv1); 地址/Qm 形状一律拒 (防把钱包地址或 peerId 同形物贴进群) */
|
|
366
|
+
function normalizeContentHash(raw) {
|
|
367
|
+
const s = String(raw ?? '').trim();
|
|
368
|
+
if (!s)
|
|
369
|
+
return { ok: false, error: '缺少 --hash (交付只贴哈希: 内容哈希是这份交付的公开承诺)' };
|
|
370
|
+
if (/^sha256:[0-9a-f]{16,64}$/i.test(s))
|
|
371
|
+
return { ok: true, token: `sha256:${s.slice(7).toLowerCase()}` };
|
|
372
|
+
if (/^[0-9a-f]{16,64}$/i.test(s))
|
|
373
|
+
return { ok: true, token: `hex:${s.toLowerCase()}` };
|
|
374
|
+
if (/^bafy[a-z0-9]{20,}$/i.test(s))
|
|
375
|
+
return { ok: true, token: `cid:${s}` };
|
|
376
|
+
if (/^0x[0-9a-f]{40}$/i.test(s))
|
|
377
|
+
return { ok: false, error: '--hash 是**钱包地址**形状 (0x + 40 hex) — 交付哈希不是地址 (拒, 别把地址贴进群)' };
|
|
378
|
+
if (/^Qm[1-9A-HJ-NP-Za-km-z]{30,}$/.test(s)) {
|
|
379
|
+
return { ok: false, error: '--hash 是 CIDv0 (Qm…) 形状, 它与 libp2p peerId **同形** —— 群里无法区分两者 → 拒 (用 sha256/<内容哈希> 或 CIDv1 bafy… 表达交付)' };
|
|
380
|
+
}
|
|
381
|
+
return { ok: false, error: `--hash 形状不认识: ${(0, task_public_text_js_1.mask)(s)} (要 sha256:<hex> / 裸 hex(16..64) / CIDv1(bafy…) )` };
|
|
382
|
+
}
|
|
383
|
+
/** `--checks "渠道结构=pass,价格带=fail"` 或 `a:pass,b:fail` → 逐条结果 (名字与结果都闸过) */
|
|
384
|
+
function parseChecks(raw) {
|
|
385
|
+
const items = String(raw ?? '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
386
|
+
if (items.length === 0)
|
|
387
|
+
return { ok: false, error: '缺少 --checks (初筛要逐条结果: --checks "渠道结构=pass,价格带=fail")' };
|
|
388
|
+
const out = [];
|
|
389
|
+
for (const it of items) {
|
|
390
|
+
const m = /^(.+?)\s*[=:]\s*(pass|fail|unknown)$/i.exec(it);
|
|
391
|
+
if (!m)
|
|
392
|
+
return { ok: false, error: `--checks 里的条目不认识: ${(0, task_public_text_js_1.mask)(it)} (每条形如 名字=pass|fail|unknown)` };
|
|
393
|
+
const name = m[1].trim();
|
|
394
|
+
if (!/^[\p{L}\p{N}._-]{1,32}$/u.test(name))
|
|
395
|
+
return { ok: false, error: `--checks 的名字只能是短词 (字母/数字/汉字/._-, ≤32): ${(0, task_public_text_js_1.mask)(name)}` };
|
|
396
|
+
out.push({ name, result: m[2].toLowerCase() });
|
|
397
|
+
}
|
|
398
|
+
return { ok: true, checks: out };
|
|
399
|
+
}
|
|
400
|
+
/** 接单 / 交付 / 初筛 / 终审的群消息 (同样只有极短事实) */
|
|
401
|
+
function buildPostMessage(input) {
|
|
402
|
+
const id = String(input.announcementId ?? '').trim();
|
|
403
|
+
if (!id)
|
|
404
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: '缺少 --announcement-id (过程痕迹要挂在某一条公告上)', detail: { accepted: ['--announcement-id ann-…'] } };
|
|
405
|
+
if (!isAnnouncementId(id))
|
|
406
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: `announcementId 不合法: ${(0, task_public_text_js_1.mask)(id)}`, detail: { accepted: ['ann-<16 位>'] } };
|
|
407
|
+
const base = [exports.TRAIL_TAG, `v=${exports.TRAIL_VERSION}`, `kind=${input.kind}`, `id=${id}`];
|
|
408
|
+
const round = String(input.round ?? '').trim();
|
|
409
|
+
if (round)
|
|
410
|
+
base.push(`round=${short(round, 24)}`);
|
|
411
|
+
if (input.kind === 'claim') {
|
|
412
|
+
const price = String(input.price ?? '').trim();
|
|
413
|
+
return { ok: true, text: [...base, `price=${price ? short(price, 32) : 'unstated'}`].join(' ') };
|
|
414
|
+
}
|
|
415
|
+
if (input.kind === 'deliver') {
|
|
416
|
+
const h = normalizeContentHash(String(input.hash ?? ''));
|
|
417
|
+
if (!h.ok)
|
|
418
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: h.error, detail: { hashChars: String(input.hash ?? '').length } };
|
|
419
|
+
const bytes = input.bytes === null || input.bytes === undefined
|
|
420
|
+
? null
|
|
421
|
+
: (Number.isFinite(Number(input.bytes)) ? Math.max(0, Math.floor(Number(input.bytes))) : null);
|
|
422
|
+
// 没给字节数 → 写 `-`(未声明); **不许**写成 0 (0 是一个事实断言, 会谎报"零字节交付")
|
|
423
|
+
return { ok: true, text: [...base, `hash=${h.token}`, `bytes=${bytes === null ? '-' : bytes}`].join(' ') };
|
|
424
|
+
}
|
|
425
|
+
if (input.kind === 'screen') {
|
|
426
|
+
const c = parseChecks(String(input.checksRaw ?? ''));
|
|
427
|
+
if (!c.ok)
|
|
428
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: c.error, detail: { sample: '--checks "渠道结构=pass,价格带=fail"' } };
|
|
429
|
+
const pass = c.checks.filter((x) => x.result === 'pass').length;
|
|
430
|
+
const fail = c.checks.filter((x) => x.result === 'fail').length;
|
|
431
|
+
const unknown = c.checks.filter((x) => x.result === 'unknown').length;
|
|
432
|
+
return {
|
|
433
|
+
ok: true,
|
|
434
|
+
checks: c.checks,
|
|
435
|
+
text: [...base, `screened=${c.checks.length}`, `pass=${pass}`, `fail=${fail}`, `unknown=${unknown}`,
|
|
436
|
+
`checks=${c.checks.map((x) => `${tok(x.name)}${x.result === 'pass' ? '✓' : x.result === 'fail' ? '✗' : '?'}`).join(',')}`].join(' '),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
// final
|
|
440
|
+
const v = String(input.verdict ?? '').trim().toLowerCase();
|
|
441
|
+
if (!exports.VERDICTS.includes(v)) {
|
|
442
|
+
return { ok: false, code: 'INVALID_ARGUMENT', message: `--verdict 必须是 ${exports.VERDICTS.join('|')} (拿到 ${(0, task_public_text_js_1.mask)(v)})`, detail: { verdict: v || null } };
|
|
443
|
+
}
|
|
444
|
+
return { ok: true, text: [...base, `verdict=${v}`].join(' ') };
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* 2026-10-02: 富字段版 (leo: 「@成员 / 回复某条 / 图片音频 / 建分支」)。
|
|
448
|
+
* **text 与 mentions 都过隐私闸** —— @ 的内容可能被写成 DID/地址形态, 一样不许出网。
|
|
449
|
+
* 附件只带 CID (字节在内容寻址层), CID 本身不是隐私形态。
|
|
450
|
+
*/
|
|
451
|
+
async function sendTrailMessage(groupId, text, from, rich = {}) {
|
|
452
|
+
const gate = (0, task_public_text_js_1.requirePublicText)(text);
|
|
453
|
+
if (!gate.ok) {
|
|
454
|
+
return {
|
|
455
|
+
ok: false, sent: false, text,
|
|
456
|
+
error: `群消息命中隐私红线, 拒绝发送: ${gate.violations.map((v) => `${v.rule}(${v.why})`).join('; ')}`,
|
|
457
|
+
violations: gate.violations, localFallback: false,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
const g = (0, task_public_text_js_1.requirePublicText)(String(from || ''));
|
|
461
|
+
if (!g.ok) {
|
|
462
|
+
return { ok: false, sent: false, text, error: `发送者标记命中隐私红线: ${g.violations.map((v) => v.rule).join(', ')}`, violations: g.violations, localFallback: false };
|
|
463
|
+
}
|
|
464
|
+
const mentionList = Array.isArray(rich.mentions) ? rich.mentions.map((x) => String(x ?? '').trim()).filter(Boolean) : [];
|
|
465
|
+
for (const m of mentionList) {
|
|
466
|
+
const mg = (0, task_public_text_js_1.requirePublicText)(m);
|
|
467
|
+
if (!mg.ok) {
|
|
468
|
+
return { ok: false, sent: false, text, error: `@ 的内容命中隐私红线, 拒绝发送: ${mg.violations.map((v) => v.rule).join(', ')}`, violations: mg.violations, localFallback: false };
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
const r = await (0, gateway_group_js_1.groupSend)(groupId, text, from, {
|
|
472
|
+
...(mentionList.length ? { mentions: mentionList } : {}),
|
|
473
|
+
...(rich.replyTo ? { replyTo: rich.replyTo } : {}),
|
|
474
|
+
...(rich.attachments?.length ? { attachments: rich.attachments } : {}),
|
|
475
|
+
...(rich.branch ? { branch: rich.branch } : {}),
|
|
476
|
+
...(rich.kind ? { kind: rich.kind } : {}),
|
|
477
|
+
});
|
|
478
|
+
if (!r.ok)
|
|
479
|
+
return { ok: false, sent: false, text, error: r.error || '群消息没发出去', localFallback: false };
|
|
480
|
+
return { ok: true, sent: true, text, ...(r.id ? { id: r.id } : {}), localFallback: false };
|
|
481
|
+
}
|
|
482
|
+
/** 解析一行群消息 (不是本模块发的 / 格式不认识 → null, 不猜) */
|
|
483
|
+
function parseTrailLine(text) {
|
|
484
|
+
const line = String(text ?? '').trim();
|
|
485
|
+
const tagAt = line.indexOf(exports.TRAIL_TAG);
|
|
486
|
+
if (tagAt < 0)
|
|
487
|
+
return null;
|
|
488
|
+
const body = line.slice(tagAt + exports.TRAIL_TAG.length).trim();
|
|
489
|
+
const tokens = body.split(/\s+/).filter(Boolean);
|
|
490
|
+
const fields = {};
|
|
491
|
+
let kind = null;
|
|
492
|
+
for (const t of tokens) {
|
|
493
|
+
const i = t.indexOf('=');
|
|
494
|
+
if (i <= 0)
|
|
495
|
+
continue;
|
|
496
|
+
const k = t.slice(0, i);
|
|
497
|
+
const v = t.slice(i + 1);
|
|
498
|
+
if (!/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/.test(k))
|
|
499
|
+
continue;
|
|
500
|
+
fields[k] = v;
|
|
501
|
+
if (k === 'kind')
|
|
502
|
+
kind = v;
|
|
503
|
+
}
|
|
504
|
+
if (!kind || !exports.TRAIL_KINDS.includes(kind))
|
|
505
|
+
return null;
|
|
506
|
+
return { kind: kind, fields };
|
|
507
|
+
}
|
|
508
|
+
/** 字段值过隐私闸: 命中 → 换成 `[已遮蔽:<规则>]` 并记下规则 (绝不回显标识符) */
|
|
509
|
+
function redactFields(kind, fields) {
|
|
510
|
+
const out = {};
|
|
511
|
+
const redacted = [];
|
|
512
|
+
for (const [k, v] of Object.entries(fields)) {
|
|
513
|
+
const hit = (0, task_public_text_js_1.scanPublicText)(String(v));
|
|
514
|
+
if (hit.length) {
|
|
515
|
+
out[k] = `[已遮蔽:${hit[0].rule}]`;
|
|
516
|
+
redacted.push(`${hit[0].rule}@${kind}`);
|
|
517
|
+
}
|
|
518
|
+
else
|
|
519
|
+
out[k] = String(v);
|
|
520
|
+
}
|
|
521
|
+
return { fields: out, redacted };
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* 群消息 → 时间线汇总 (按 ts 升序)。
|
|
525
|
+
* **只汇总真的发过的事实**: 没发过「交付」就不会凭空出现「已交付」条目;
|
|
526
|
+
* 反而会把这些矛盾显式列出来 (终审说 accept 但没有交付痕迹 → `final-accept-without-delivery`)。
|
|
527
|
+
* 每个字段值都再过一次隐私闸 (命中 → 遮蔽 + 记录), 所以时间线本身也不是泄漏面。
|
|
528
|
+
*/
|
|
529
|
+
function summarizeTrail(msgs, opts = {}) {
|
|
530
|
+
const only = String(opts.announcementId ?? '').trim();
|
|
531
|
+
const byKind = { announce: 0, claim: 0, deliver: 0, screen: 0, final: 0 };
|
|
532
|
+
const entries = [];
|
|
533
|
+
const redacted = [];
|
|
534
|
+
let ignored = 0;
|
|
535
|
+
for (const m of msgs || []) {
|
|
536
|
+
const parsed = parseTrailLine(m?.text);
|
|
537
|
+
if (!parsed) {
|
|
538
|
+
ignored++;
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
const id = parsed.fields.id || null;
|
|
542
|
+
if (only && id !== only)
|
|
543
|
+
continue;
|
|
544
|
+
const safe = redactFields(parsed.kind, parsed.fields);
|
|
545
|
+
for (const r of safe.redacted)
|
|
546
|
+
if (!redacted.includes(r))
|
|
547
|
+
redacted.push(r);
|
|
548
|
+
// id 也会被遮蔽: 别人写 `id=did:…` 时, 这一条不留 id 出来 (遮蔽过的不当引用)
|
|
549
|
+
const safeId = safe.fields.id && !safe.fields.id.startsWith('[已遮蔽') ? id : null;
|
|
550
|
+
byKind[parsed.kind]++;
|
|
551
|
+
entries.push({
|
|
552
|
+
kind: parsed.kind, at: Number(m.ts) || 0, sender: maskSender(String(m.from || '')),
|
|
553
|
+
announcementId: safeId, fields: safe.fields, text: String(m.text || ''),
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
entries.sort((a, b) => (a.at - b.at) || (exports.TRAIL_KINDS.indexOf(a.kind) - exports.TRAIL_KINDS.indexOf(b.kind)));
|
|
557
|
+
const announcements = [];
|
|
558
|
+
for (const e of entries)
|
|
559
|
+
if (e.announcementId && !announcements.includes(e.announcementId))
|
|
560
|
+
announcements.push(e.announcementId);
|
|
561
|
+
const finalVerdicts = entries.filter((e) => e.kind === 'final').map((e) => e.fields.verdict);
|
|
562
|
+
const flags = {
|
|
563
|
+
announced: byKind.announce > 0,
|
|
564
|
+
claimed: byKind.claim > 0,
|
|
565
|
+
delivered: byKind.deliver > 0,
|
|
566
|
+
screened: byKind.screen > 0,
|
|
567
|
+
finalized: byKind.final > 0,
|
|
568
|
+
accepted: finalVerdicts.includes('accept'),
|
|
569
|
+
rejected: finalVerdicts.includes('reject'),
|
|
570
|
+
};
|
|
571
|
+
const inconsistencies = [];
|
|
572
|
+
if (flags.finalized && flags.accepted && !flags.delivered)
|
|
573
|
+
inconsistencies.push('final-accept-without-delivery');
|
|
574
|
+
if (flags.screened && !flags.delivered)
|
|
575
|
+
inconsistencies.push('screen-without-delivery');
|
|
576
|
+
if (flags.claimed && !flags.announced)
|
|
577
|
+
inconsistencies.push('claim-without-announce');
|
|
578
|
+
if (flags.delivered && !flags.claimed)
|
|
579
|
+
inconsistencies.push('deliver-without-claim');
|
|
580
|
+
if (flags.rejected && flags.accepted)
|
|
581
|
+
inconsistencies.push('both-accept-and-reject');
|
|
582
|
+
if (redacted.length)
|
|
583
|
+
inconsistencies.push('group-message-hit-privacy-rule');
|
|
584
|
+
return { count: entries.length, byKind, entries, announcements, flags, inconsistencies, ignoredMessages: ignored, redacted };
|
|
585
|
+
}
|
|
586
|
+
/** 读群里的过程痕迹并汇总 (群必须已加入; 读不到 → 由调用方如实报错) */
|
|
587
|
+
async function readTrail(groupId, opts = {}) {
|
|
588
|
+
const limit = Math.max(1, Math.min(1000, Math.floor(Number(opts.limit) || 300)));
|
|
589
|
+
const msgs = await (0, gateway_group_js_1.groupMessages)(groupId, limit);
|
|
590
|
+
return summarizeTrail(msgs, { announcementId: opts.announcementId ?? null });
|
|
591
|
+
}
|
|
592
|
+
/** 时间线的一行 (人类输出) */
|
|
593
|
+
function formatTrailLine(e) {
|
|
594
|
+
const t = e.at ? new Date(e.at).toISOString().replace('T', ' ').slice(0, 19) : '(无时间)';
|
|
595
|
+
const facts = Object.entries(e.fields)
|
|
596
|
+
.filter(([k]) => k !== 'kind')
|
|
597
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
598
|
+
.join(' ');
|
|
599
|
+
return `${t} ${exports.TRAIL_KIND_LABEL[e.kind].padEnd(4, ' ')} ${e.sender.padEnd(14)} ${facts}`;
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=task-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-group.js","sourceRoot":"","sources":["../../../src/agents/task-group.ts"],"names":[],"mappings":"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"}
|