@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.
Files changed (78) hide show
  1. package/README.md +128 -111
  2. package/dist/agents/gateway-group.js +231 -6
  3. package/dist/agents/group-autopilot.js +256 -0
  4. package/dist/agents/pi-sdk-tools.js +302 -0
  5. package/dist/agents/pi-sdk.js +89 -140
  6. package/dist/agents/task-group.js +21 -4
  7. package/dist/cli/log-gate.js +68 -4
  8. package/dist/cli/mention-data.js +1 -1
  9. package/dist/cli/model-selector.js +84 -104
  10. package/dist/cli/setup-wizard.js +2 -10
  11. package/dist/cli/tui-select.js +99 -10
  12. package/dist/cli-entry.js +1 -9
  13. package/dist/electron-build/agents/gateway-group.js +814 -0
  14. package/dist/electron-build/agents/gateway-group.js.map +1 -0
  15. package/dist/electron-build/agents/group-autopilot.js +302 -0
  16. package/dist/electron-build/agents/group-autopilot.js.map +1 -0
  17. package/dist/electron-build/agents/pi-sdk-tools.js +302 -0
  18. package/dist/electron-build/agents/pi-sdk-tools.js.map +1 -1
  19. package/dist/electron-build/agents/pi-sdk.js +88 -139
  20. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  21. package/dist/electron-build/agents/task-group.js +601 -0
  22. package/dist/electron-build/agents/task-group.js.map +1 -0
  23. package/dist/electron-build/agents/task-public-text.js +97 -0
  24. package/dist/electron-build/agents/task-public-text.js.map +1 -0
  25. package/dist/electron-build/efficode/compress.js +86 -0
  26. package/dist/electron-build/efficode/compress.js.map +1 -0
  27. package/dist/electron-build/efficode/crc32.js +44 -0
  28. package/dist/electron-build/efficode/crc32.js.map +1 -0
  29. package/dist/electron-build/efficode/did.js +74 -0
  30. package/dist/electron-build/efficode/did.js.map +1 -0
  31. package/dist/electron-build/efficode/lz77.js +175 -0
  32. package/dist/electron-build/efficode/lz77.js.map +1 -0
  33. package/dist/electron-build/efficode/negotiate.js +233 -0
  34. package/dist/electron-build/efficode/negotiate.js.map +1 -0
  35. package/dist/electron-build/efficode/ops.js +96 -0
  36. package/dist/electron-build/efficode/ops.js.map +1 -0
  37. package/dist/electron-build/efficode/packet.js +279 -0
  38. package/dist/electron-build/efficode/packet.js.map +1 -0
  39. package/dist/electron-build/efficode/types.js +50 -0
  40. package/dist/electron-build/efficode/types.js.map +1 -0
  41. package/dist/electron-build/kernel/code-write-gate.js +55 -0
  42. package/dist/electron-build/kernel/code-write-gate.js.map +1 -0
  43. package/dist/electron-build/kernel/run-lifecycle.js +23 -0
  44. package/dist/electron-build/kernel/run-lifecycle.js.map +1 -1
  45. package/dist/electron-build/kernel/run-resume.js +62 -0
  46. package/dist/electron-build/kernel/run-resume.js.map +1 -0
  47. package/dist/electron-build/kernel/session-lifecycle.js +223 -0
  48. package/dist/electron-build/kernel/session-lifecycle.js.map +1 -0
  49. package/dist/electron-build/kernel/turn-selfcheck.js +65 -0
  50. package/dist/electron-build/kernel/turn-selfcheck.js.map +1 -0
  51. package/dist/electron-build/llm/config-store.js +2 -2
  52. package/dist/electron-build/llm/config-store.js.map +1 -1
  53. package/dist/electron-build/llm/model-selection.js +16 -2
  54. package/dist/electron-build/llm/model-selection.js.map +1 -1
  55. package/dist/electron-build/llm/pi-ai.js +2 -2
  56. package/dist/electron-build/llm/pi-ai.js.map +1 -1
  57. package/dist/electron-build/orbitdb/cid-database.js +98 -19
  58. package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
  59. package/dist/electron-build/orbitdb/group-access.js +399 -0
  60. package/dist/electron-build/orbitdb/group-access.js.map +1 -0
  61. package/dist/index.js +143 -10
  62. package/dist/ios/bolloon-web.json +3 -3
  63. package/dist/ios/sw.js +1 -1
  64. package/dist/kernel/code-write-gate.js +47 -0
  65. package/dist/kernel/gate-scan.js +5 -1
  66. package/dist/kernel/plan-harness.js +3 -2
  67. package/dist/kernel/roster.js +6 -6
  68. package/dist/kernel/run-lifecycle.js +21 -0
  69. package/dist/kernel/run-resume.js +58 -0
  70. package/dist/kernel/session-lifecycle.js +210 -0
  71. package/dist/kernel/turn-selfcheck.js +60 -0
  72. package/dist/llm/config-store.js +2 -2
  73. package/dist/llm/model-selection.js +16 -2
  74. package/dist/llm/pi-ai.js +2 -2
  75. package/dist/orbitdb/cid-database.js +95 -19
  76. package/dist/web/bolloon-web.json +3 -3
  77. package/dist/web/sw.js +1 -1
  78. 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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"}