@bolloon/bolloon-agent 0.4.29 → 0.4.31

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 (83) hide show
  1. package/dist/agents/agent-gateway.js +5 -0
  2. package/dist/agents/agent-manifest-protocol.js +29 -0
  3. package/dist/agents/contacts/chain.js +579 -0
  4. package/dist/agents/contacts/cli.js +158 -0
  5. package/dist/agents/contacts/consent.js +124 -0
  6. package/dist/agents/contacts/grant-payload.js +45 -0
  7. package/dist/agents/contacts/grants.js +451 -0
  8. package/dist/agents/contacts/policy.js +264 -0
  9. package/dist/agents/contacts/preview-types.js +6 -0
  10. package/dist/agents/contacts/providers.js +341 -0
  11. package/dist/agents/contacts/store.js +326 -0
  12. package/dist/agents/contacts/tools.js +154 -0
  13. package/dist/agents/contacts/types.js +148 -0
  14. package/dist/agents/economic-policy.js +7 -0
  15. package/dist/agents/gateway-network.js +6 -0
  16. package/dist/agents/local-signer.js +59 -0
  17. package/dist/agents/network-pulse.js +450 -0
  18. package/dist/agents/pi-sdk.js +10 -0
  19. package/dist/agents/task-contract.js +322 -0
  20. package/dist/agents/task-inbox.js +267 -0
  21. package/dist/agents/task-transport.js +280 -0
  22. package/dist/agents/x402/transaction-store.js +8 -1
  23. package/dist/cli/commands/agent.js +230 -0
  24. package/dist/cli/commands/index.js +61 -0
  25. package/dist/cli/commands/mcp.js +98 -0
  26. package/dist/cli/commands/network.js +334 -0
  27. package/dist/cli/commands/payment.js +125 -0
  28. package/dist/cli/commands/tasks.js +1236 -0
  29. package/dist/cli/commands/trade.js +229 -0
  30. package/dist/cli/commands/wallet.js +450 -0
  31. package/dist/cli/mcp/bridge.js +105 -0
  32. package/dist/cli/mcp/server.js +185 -0
  33. package/dist/cli/mcp/tools.js +612 -0
  34. package/dist/cli/protocol-envelope.js +346 -0
  35. package/dist/cli-entry.js +141 -17
  36. package/dist/electron-build/agents/agent-gateway.js +5 -0
  37. package/dist/electron-build/agents/agent-gateway.js.map +1 -1
  38. package/dist/electron-build/agents/agent-manifest-protocol.js +62 -0
  39. package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -1
  40. package/dist/electron-build/agents/contacts/chain.js +619 -0
  41. package/dist/electron-build/agents/contacts/chain.js.map +1 -0
  42. package/dist/electron-build/agents/contacts/consent.js +163 -0
  43. package/dist/electron-build/agents/contacts/consent.js.map +1 -0
  44. package/dist/electron-build/agents/contacts/grant-payload.js +52 -0
  45. package/dist/electron-build/agents/contacts/grant-payload.js.map +1 -0
  46. package/dist/electron-build/agents/contacts/grants.js +500 -0
  47. package/dist/electron-build/agents/contacts/grants.js.map +1 -0
  48. package/dist/electron-build/agents/contacts/policy.js +271 -0
  49. package/dist/electron-build/agents/contacts/policy.js.map +1 -0
  50. package/dist/electron-build/agents/contacts/preview-types.js +8 -0
  51. package/dist/electron-build/agents/contacts/preview-types.js.map +1 -0
  52. package/dist/electron-build/agents/contacts/providers.js +384 -0
  53. package/dist/electron-build/agents/contacts/providers.js.map +1 -0
  54. package/dist/electron-build/agents/contacts/store.js +370 -0
  55. package/dist/electron-build/agents/contacts/store.js.map +1 -0
  56. package/dist/electron-build/agents/contacts/tools.js +159 -0
  57. package/dist/electron-build/agents/contacts/tools.js.map +1 -0
  58. package/dist/electron-build/agents/contacts/types.js +166 -0
  59. package/dist/electron-build/agents/contacts/types.js.map +1 -0
  60. package/dist/electron-build/agents/economic-policy.js +7 -0
  61. package/dist/electron-build/agents/economic-policy.js.map +1 -1
  62. package/dist/electron-build/agents/external-events.js.map +1 -1
  63. package/dist/electron-build/agents/gateway-network.js +6 -0
  64. package/dist/electron-build/agents/gateway-network.js.map +1 -1
  65. package/dist/electron-build/agents/goal-store.js.map +1 -1
  66. package/dist/electron-build/agents/network-pulse.js +504 -0
  67. package/dist/electron-build/agents/network-pulse.js.map +1 -0
  68. package/dist/electron-build/agents/pi-sdk.js +10 -0
  69. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  70. package/dist/electron-build/agents/x402/transaction-store.js +8 -1
  71. package/dist/electron-build/agents/x402/transaction-store.js.map +1 -1
  72. package/dist/electron-build/security/tool-gate.js +4 -0
  73. package/dist/electron-build/security/tool-gate.js.map +1 -1
  74. package/dist/index.js +30 -0
  75. package/dist/security/tool-gate.js +4 -0
  76. package/dist/web/mobile-contacts.js +329 -0
  77. package/dist/web/mobile-core.js +481 -15
  78. package/dist/web/mobile.html +32 -0
  79. package/dist/web/mobile.js +139 -0
  80. package/dist/web/routes-contacts.js +420 -0
  81. package/dist/web/server.js +34 -0
  82. package/dist/web/task-frame-server.js +211 -0
  83. package/package.json +1 -1
@@ -0,0 +1,504 @@
1
+ "use strict";
2
+ /**
3
+ * network-pulse.ts — 网络脉冲 (Network Pulse): 把已有 P2P 生命周期投影成
4
+ * **匿名、可验证、可降级**的公开统计, 供 bolloon-UI 网关页动态展示。
5
+ *
6
+ * 设计约束 (leo 2026-09-18 计划):
7
+ * · 只对**公开统计**有用的事实留档: 不存任务正文、不存私有 payload
8
+ * · 浏览器**永远不接触原始事件** —— 对外只有聚合快照
9
+ * · 不暴露 DID / peerId / IP / 钱包地址 / Agent 私有内容
10
+ * · 单节点看到的数据**不许说成全网精确总量**: scope=observed / verified 明确写在快照里
11
+ * · 快照过期 → `stale` (不许伪装实时); 观察层不可用 → `unavailable`
12
+ * · 类别小于隐私阈值 → 合并进 other
13
+ * · 事件数 / 时间窗 / capability 数都有上限
14
+ *
15
+ * 借鉴 (只借产品与工程思想, 不借 Go/Postgres/API 项目):
16
+ * EigenFlux 的 "注册总量 / 当前活跃 / 最近出现" 时间窗统计、服务端生成匿名活动文本、
17
+ * live/stale/unavailable 状态、短缓存与时间边界、隐私阈值、白名单投影。
18
+ */
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
32
+ }) : function(o, v) {
33
+ o["default"] = v;
34
+ });
35
+ var __importStar = (this && this.__importStar) || (function () {
36
+ var ownKeys = function(o) {
37
+ ownKeys = Object.getOwnPropertyNames || function (o) {
38
+ var ar = [];
39
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
+ return ar;
41
+ };
42
+ return ownKeys(o);
43
+ };
44
+ return function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ })();
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.FORBIDDEN_PUBLIC_KEYS = exports.MAX_AGENT_SITES = exports.pulseDir = exports.NETWORK_EVENT_TYPES = exports.PULSE_LIMITS = void 0;
54
+ exports.nodeDigest = nodeDigest;
55
+ exports.capabilityGroup = capabilityGroup;
56
+ exports.bucketOf = bucketOf;
57
+ exports.recordNetworkEvent = recordNetworkEvent;
58
+ exports.renderActivityText = renderActivityText;
59
+ exports.normalizeIpns = normalizeIpns;
60
+ exports.readAgentSites = readAgentSites;
61
+ exports.emitTradePulse = emitTradePulse;
62
+ exports.computeSnapshot = computeSnapshot;
63
+ exports.getNetworkPulse = getNetworkPulse;
64
+ exports.snapshotStatus = snapshotStatus;
65
+ exports.canonicalize = canonicalize;
66
+ exports.lastSnapshotSignError = lastSnapshotSignError;
67
+ exports.signSnapshot = signSnapshot;
68
+ exports.verifySnapshotSignature = verifySnapshotSignature;
69
+ exports.assertNoPrivateFields = assertNoPrivateFields;
70
+ const fs = __importStar(require("fs"));
71
+ const os = __importStar(require("os"));
72
+ const path = __importStar(require("path"));
73
+ const crypto = __importStar(require("crypto"));
74
+ // ── 常量 (上限 + 时间边界) ─────────────────────────────────────────────────
75
+ exports.PULSE_LIMITS = {
76
+ /** 最多留多少条事件 (超出丢最旧) */
77
+ maxEvents: 5000,
78
+ /** 统计窗口 */
79
+ windowMs: 24 * 60 * 60 * 1000,
80
+ /** "活跃"的定义: 最近 5 分钟出现过 */
81
+ activeWindowMs: 5 * 60 * 1000,
82
+ /** 时间桶 (小时) */
83
+ bucketMs: 60 * 60 * 1000,
84
+ /** 对外最多列多少个 capability 类别 */
85
+ maxCapabilities: 12,
86
+ /** 隐私阈值: 少于这个数的类别合并进 other */
87
+ privacyThreshold: 3,
88
+ /** 快照新鲜期 (秒) → 之后 stale */
89
+ snapshotTtlMs: 30 * 1000,
90
+ /** 活动流最多几条 */
91
+ maxActivity: 8,
92
+ };
93
+ /** 事件类型白名单 —— 只允许这些进统计 (其余一律丢弃) */
94
+ exports.NETWORK_EVENT_TYPES = [
95
+ 'node_joined',
96
+ 'manifest_published',
97
+ 'capability_announced',
98
+ 'peer_connected',
99
+ 'delegation_completed',
100
+ // 经济事件 (P6 扩展; 原五类保持兼容, 老节点发来的事件仍被接受)
101
+ 'task_posted', 'task_accepted', 'task_completed', 'trade_settled', 'trade_verified',
102
+ 'wallet_signed',
103
+ ];
104
+ // ── 存储 ────────────────────────────────────────────────────────────────────
105
+ const home = (h) => h || process.env.HOME || os.homedir() || '/tmp';
106
+ const pulseDir = (h) => path.join(home(h), '.bolloon', 'network-pulse');
107
+ exports.pulseDir = pulseDir;
108
+ const eventsFile = (h) => path.join((0, exports.pulseDir)(h), 'events.json');
109
+ const snapshotFile = (h) => path.join((0, exports.pulseDir)(h), 'snapshot.json');
110
+ /** 是否是一条结构合法的事件 (坏数据一律丢弃, 不让快照崩) */
111
+ function isValidEvent(e) {
112
+ return !!e && typeof e === 'object'
113
+ && exports.NETWORK_EVENT_TYPES.includes(e.type)
114
+ && typeof e.sourceProof === 'string' && e.sourceProof.length > 0
115
+ && Number.isFinite(e.occurredAt);
116
+ }
117
+ function readEvents(h) {
118
+ try {
119
+ const raw = JSON.parse(fs.readFileSync(eventsFile(h), 'utf-8'));
120
+ return Array.isArray(raw) ? raw.filter(isValidEvent) : [];
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ function writeEvents(list, h) {
127
+ try {
128
+ fs.mkdirSync((0, exports.pulseDir)(h), { recursive: true });
129
+ fs.writeFileSync(eventsFile(h), JSON.stringify(list.slice(-exports.PULSE_LIMITS.maxEvents)), 'utf8');
130
+ }
131
+ catch {
132
+ /* 统计失败绝不影响主路径 */
133
+ }
134
+ }
135
+ // ── 匿名化 ──────────────────────────────────────────────────────────────────
136
+ /** 节点摘要: sha256(值) 前 16 位。不可逆, 不暴露原值。 */
137
+ function nodeDigest(value) {
138
+ return crypto.createHash('sha256').update(`bolloon-pulse|${String(value)}`).digest('hex').slice(0, 16);
139
+ }
140
+ const CAPABILITY_GROUPS = [
141
+ [/research|market|调研|分析|survey|search/i, 'research'],
142
+ [/code|review|refactor|debug|编程|代码/i, 'coding'],
143
+ [/data|dataset|etl|metric|数据/i, 'data'],
144
+ [/write|content|doc|translat|写作|文档|翻译/i, 'writing'],
145
+ [/automation|workflow|deploy|ops|自动化/i, 'automation'],
146
+ [/vision|image|audio|speech|视觉|图像|语音/i, 'multimodal'],
147
+ ];
148
+ /** 把原始能力名归并成粗类别 (不外泄原始能力名) */
149
+ function capabilityGroup(raw) {
150
+ const s = String(raw || '').trim();
151
+ if (!s)
152
+ return 'other';
153
+ for (const [re, g] of CAPABILITY_GROUPS)
154
+ if (re.test(s))
155
+ return g;
156
+ return 'other';
157
+ }
158
+ function bucketOf(at) {
159
+ return String(Math.floor(at / exports.PULSE_LIMITS.bucketMs));
160
+ }
161
+ /** 完整性标记 (本地校验用; 不含任何可逆信息) */
162
+ function integrityOf(ev) {
163
+ return nodeDigest(`${ev.type}|${ev.bucket}|${ev.sourceProof}|${ev.occurredAt}`);
164
+ }
165
+ /**
166
+ * 记一条网络事件。**永不影响主路径**: 非法类型/写失败/异常一律静默丢弃。
167
+ * 幂等: 同一节点同一桶内的 `node_joined` 只记一次 (重复 join 不虚增节点数)。
168
+ */
169
+ async function recordNetworkEvent(input, h) {
170
+ try {
171
+ const type = String(input?.type || '');
172
+ if (!exports.NETWORK_EVENT_TYPES.includes(type))
173
+ return { ok: false, reason: `非白名单事件类型: ${type}` };
174
+ const at = Number(input.at ?? Date.now());
175
+ if (!Number.isFinite(at) || at <= 0)
176
+ return { ok: false, reason: 'occurredAt 非法' };
177
+ const sourceProof = nodeDigest(String(input.did || 'unknown-node'));
178
+ const bucket = bucketOf(at);
179
+ const agentProof = input.agentId ? nodeDigest(`${String(input.did || 'unknown-node')}:${String(input.agentId)}`) : undefined;
180
+ const taskProof = input.taskId ? nodeDigest(`task:${String(input.taskId)}`) : undefined;
181
+ const list = readEvents(h);
182
+ if (type === 'node_joined' && list.some((e) => e.type === 'node_joined' && e.sourceProof === sourceProof && e.bucket === bucket)) {
183
+ return { ok: true, reason: 'already' }; // 同桶重复入网不虚增
184
+ }
185
+ const ev = {
186
+ type,
187
+ bucket,
188
+ occurredAt: at,
189
+ sourceProof,
190
+ ...(input.capability ? { capabilityGroup: capabilityGroup(input.capability) } : {}),
191
+ ...(agentProof ? { agentProof } : {}),
192
+ ...(taskProof ? { taskProof } : {}),
193
+ ...(input.signed ? { signed: true } : {}),
194
+ };
195
+ ev.integrity = integrityOf(ev);
196
+ list.push(ev);
197
+ // 只保留窗口内 + 上限
198
+ const cutoff = at - exports.PULSE_LIMITS.windowMs;
199
+ writeEvents(list.filter((e) => e.occurredAt >= cutoff), h);
200
+ return { ok: true };
201
+ }
202
+ catch (e) {
203
+ return { ok: false, reason: String(e?.message || e) };
204
+ }
205
+ }
206
+ // ── 快照 ────────────────────────────────────────────────────────────────────
207
+ /** 服务端固定模板生成匿名活动文本 (不让前端拼字符串) */
208
+ function renderActivityText(kind) {
209
+ switch (kind) {
210
+ case 'node_joined': return { zh: '有新节点加入网络', en: 'A node joined the network' };
211
+ case 'manifest_published': return { zh: '有节点发布/更新了能力声明', en: 'A node published or updated its manifest' };
212
+ case 'capability_announced': return { zh: '有节点公开声明了新能力', en: 'A node announced a capability' };
213
+ case 'peer_connected': return { zh: '两个节点建立了连接', en: 'Two nodes connected' };
214
+ case 'delegation_completed': return { zh: '一次能力委派完成', en: 'A delegation completed' };
215
+ default: return { zh: '网络有活动', en: 'Network activity' };
216
+ }
217
+ }
218
+ exports.MAX_AGENT_SITES = 5;
219
+ /** 归一化 IPNS 标识: 只接受裸 k51…/12D3… · ipns://… · /ipns/… —— 其它一律拒绝 (不猜、不放行) */
220
+ function normalizeIpns(raw) {
221
+ const s = String(raw || '').trim();
222
+ if (!s)
223
+ return null;
224
+ let v = s;
225
+ if (/^ipns:\/\//i.test(v))
226
+ v = v.replace(/^ipns:\/\//i, '');
227
+ else if (/^\/ipns\//i.test(v))
228
+ v = v.replace(/^\/ipns\//i, '');
229
+ else if (/https?:\/\//i.test(v))
230
+ return null; // 不接受 http(s) 直链
231
+ v = v.split(/[/?#]/)[0].trim();
232
+ if (/^(k51|12D3)[a-zA-Z0-9]{20,}$/.test(v) || /^[a-zA-Z0-9]{46,}$/.test(v))
233
+ return v;
234
+ return null;
235
+ }
236
+ /** 读本节点显式发布的私有站清单 (~/.bolloon/agent-sites.json); 不存在/坏数据 → 空数组 */
237
+ function readAgentSites(h) {
238
+ try {
239
+ const file = path.join(home(h), '.bolloon', 'agent-sites.json');
240
+ const raw = JSON.parse(fs.readFileSync(file, 'utf-8'));
241
+ if (!Array.isArray(raw))
242
+ return [];
243
+ const out = [];
244
+ const seen = new Set();
245
+ for (const item of raw) {
246
+ const ipns = normalizeIpns(item?.ipns);
247
+ if (!ipns || seen.has(ipns))
248
+ continue;
249
+ seen.add(ipns);
250
+ out.push({
251
+ label: String(item?.label || 'agent').slice(0, 40),
252
+ ipns,
253
+ added_at: Number(item?.added_at) || 0,
254
+ });
255
+ if (out.length >= exports.MAX_AGENT_SITES)
256
+ break;
257
+ }
258
+ return out;
259
+ }
260
+ catch {
261
+ return [];
262
+ }
263
+ }
264
+ /**
265
+ * 把**真实交易活动**投影成脉冲事件 (由交易写路径调用, fire-and-forget)。
266
+ * 只按事实发: 交付 → task_completed · 真验真 → trade_verified · **链上口径**结算 → trade_settled。
267
+ * local-dev 上限是 payment_submitted, 永远进不了 trade_settled 那一支 —— 不冒充链上。
268
+ */
269
+ async function emitTradePulse(before, after, h) {
270
+ try {
271
+ if (!after)
272
+ return;
273
+ const taskId = String(after.requestId || after.transactionId || '');
274
+ if (!taskId)
275
+ return;
276
+ const did = String(after.buyerDid || after.providerDid || after.payTo || after.paymentMode || 'unknown-node');
277
+ const agentId = String(after.agentId || after.runId || after.goalId || '') || undefined;
278
+ const base = { did, agentId, taskId, signed: true };
279
+ if (after.status === 'delivered' && before?.status !== 'delivered') {
280
+ await recordNetworkEvent({ type: 'task_completed', ...base }, h);
281
+ }
282
+ if (after.status === 'verified' && before?.status !== 'verified') {
283
+ await recordNetworkEvent({ type: 'trade_verified', ...base }, h);
284
+ }
285
+ if (after.settlementFact === 'fully_settled' && before?.settlementFact !== 'fully_settled') {
286
+ await recordNetworkEvent({ type: 'trade_settled', ...base }, h);
287
+ }
288
+ }
289
+ catch {
290
+ /* 统计失败绝不影响交易主路径 */
291
+ }
292
+ }
293
+ function computeSnapshot(events, opts) {
294
+ const now = opts.now;
295
+ const fresh_until = now + exports.PULSE_LIMITS.snapshotTtlMs;
296
+ if (opts.unavailable) {
297
+ return {
298
+ status: 'unavailable',
299
+ generated_at: now,
300
+ fresh_until,
301
+ scope: 'observed',
302
+ scope_label: { zh: '当前节点观察到', en: 'Observed by this node' },
303
+ totals: { nodes: 0, agents: 0, active_agents: 0, seen_last_24h: 0, tasks: 0, tasks_completed: 0, tasks_verified: 0, signatures: 0 },
304
+ capabilities: [],
305
+ recent_activity: [],
306
+ notes: ['观察层暂不可用 — 这不是"网络为空"'],
307
+ };
308
+ }
309
+ const window = (Array.isArray(events) ? events : []).filter((e) => isValidEvent(e) && e.occurredAt >= now - exports.PULSE_LIMITS.windowMs);
310
+ const nodes = new Set(window.map((e) => e.sourceProof).filter(Boolean));
311
+ const agents = new Set(window.map((e) => e.agentProof).filter(Boolean));
312
+ const active = new Set(window.filter((e) => e.occurredAt >= now - exports.PULSE_LIMITS.activeWindowMs).map((e) => e.agentProof).filter(Boolean));
313
+ // capability 分布 (按粗类别计数, 每个类别按**不同的 agent**去重, 避免单节点刷高)
314
+ const capMap = new Map();
315
+ for (const e of window) {
316
+ if (e.type !== 'capability_announced' || !e.capabilityGroup)
317
+ continue;
318
+ const key = e.capabilityGroup;
319
+ if (!capMap.has(key))
320
+ capMap.set(key, new Set());
321
+ capMap.get(key).add(e.agentProof || e.sourceProof);
322
+ }
323
+ let capabilities = Array.from(capMap.entries())
324
+ .map(([key, set]) => ({ key, count: set.size }))
325
+ .sort((a, b) => b.count - a.count || (a.key < b.key ? -1 : 1))
326
+ .slice(0, exports.PULSE_LIMITS.maxCapabilities);
327
+ // 隐私阈值: 少于阈值的类别合并进 other (other 本身也按阈值判断是否保留)
328
+ const small = capabilities.filter((c) => c.count < exports.PULSE_LIMITS.privacyThreshold && c.key !== 'other');
329
+ if (small.length > 0) {
330
+ capabilities = capabilities.filter((c) => !small.includes(c));
331
+ const otherCount = new Set();
332
+ for (const c of small)
333
+ otherCount.add(c.key);
334
+ capabilities.push({ key: 'other', count: otherCount.size });
335
+ capabilities.sort((a, b) => b.count - a.count || (a.key < b.key ? -1 : 1));
336
+ }
337
+ // 经济计数: 按**不同任务**去重 (同一任务重复事件不虚增), 且只给聚合数不给内容
338
+ const tasks = new Set();
339
+ const tasksCompleted = new Set();
340
+ const tasksVerified = new Set();
341
+ for (const e of window) {
342
+ const t = e.taskProof;
343
+ if (!t)
344
+ continue;
345
+ if (e.type === 'task_posted' || e.type === 'task_accepted')
346
+ tasks.add(t);
347
+ if (e.type === 'task_completed' || e.type === 'trade_settled')
348
+ tasksCompleted.add(t);
349
+ if (e.type === 'trade_verified')
350
+ tasksVerified.add(t);
351
+ }
352
+ // 钱包签名计数: 按 (来源, 时刻) 去重 —— 同一次签名重复上报不虚增
353
+ const signatureKeys = new Set();
354
+ for (const e of window)
355
+ if (e.type === 'wallet_signed')
356
+ signatureKeys.add(`${e.sourceProof}|${e.occurredAt}`);
357
+ const recent = [...window]
358
+ .sort((a, b) => b.occurredAt - a.occurredAt)
359
+ .slice(0, exports.PULSE_LIMITS.maxActivity)
360
+ .map((e) => ({ kind: e.type, at: e.occurredAt, text: renderActivityText(e.type) }));
361
+ const signedNodes = opts.signedNodes ?? new Set(window.filter((e) => e.signed).map((e) => e.sourceProof)).size;
362
+ const scope = signedNodes >= 2 ? 'verified' : 'observed';
363
+ const notes = [];
364
+ if (scope === 'observed')
365
+ notes.push('单节点观察: 这是本节点能看到的部分网络, 不是全网精确总量');
366
+ else
367
+ notes.push(`多签名来源汇总 (${signedNodes} 个签名节点)`);
368
+ return {
369
+ status: 'live',
370
+ generated_at: now,
371
+ fresh_until,
372
+ scope,
373
+ scope_label: scope === 'verified'
374
+ ? { zh: '网络观察快照 (多签名来源)', en: 'Verified network snapshot' }
375
+ : { zh: '当前节点观察到', en: 'Observed by this node' },
376
+ totals: {
377
+ nodes: nodes.size,
378
+ agents: agents.size,
379
+ active_agents: active.size,
380
+ seen_last_24h: agents.size, // 24h 窗口内的不同 Agent
381
+ tasks: tasks.size, // 观察到发起的任务数 (聚合, 无内容)
382
+ tasks_completed: tasksCompleted.size,
383
+ tasks_verified: tasksVerified.size,
384
+ signatures: signatureKeys.size, // 真实签名次数 (只计数)
385
+ },
386
+ capabilities,
387
+ recent_activity: recent,
388
+ notes,
389
+ };
390
+ }
391
+ /** 读快照 (带 30s 短缓存; 过期 → 重算; 重算失败 → unavailable) */
392
+ async function getNetworkPulse(opts = {}) {
393
+ const now = opts.now ?? Date.now();
394
+ if (opts.unavailable)
395
+ return computeSnapshot([], { now, unavailable: true });
396
+ if (!opts.force) {
397
+ try {
398
+ const cached = JSON.parse(fs.readFileSync(snapshotFile(opts.home), 'utf-8'));
399
+ if (cached && Number.isFinite(cached.generated_at) && cached.generated_at + exports.PULSE_LIMITS.snapshotTtlMs > now)
400
+ return cached;
401
+ }
402
+ catch { /* 无缓存 */ }
403
+ }
404
+ let events = [];
405
+ try {
406
+ events = readEvents(opts.home);
407
+ }
408
+ catch (e) {
409
+ return computeSnapshot([], { now, unavailable: true });
410
+ }
411
+ const snap = computeSnapshot(events, { now });
412
+ try {
413
+ fs.mkdirSync((0, exports.pulseDir)(opts.home), { recursive: true });
414
+ fs.writeFileSync(snapshotFile(opts.home), JSON.stringify(snap), 'utf8');
415
+ }
416
+ catch { /* 写不进就算了, 返回值仍然有效 */ }
417
+ return snap;
418
+ }
419
+ /** 快照是否仍是 live (给前端/观察入口判断; 过期即 stale) */
420
+ function snapshotStatus(snap, now = Date.now()) {
421
+ if (snap.status === 'unavailable')
422
+ return 'unavailable';
423
+ return now <= snap.fresh_until ? 'live' : 'stale';
424
+ }
425
+ // ── 签名 (可验证快照) ───────────────────────────────────────────────────────
426
+ /** 规范化 JSON (键排序), 用于签名覆盖 */
427
+ function canonicalize(value) {
428
+ const walk = (v) => {
429
+ if (Array.isArray(v))
430
+ return v.map(walk);
431
+ if (v && typeof v === 'object') {
432
+ const out = {};
433
+ for (const k of Object.keys(v).sort())
434
+ out[k] = walk(v[k]);
435
+ return out;
436
+ }
437
+ return v;
438
+ };
439
+ return JSON.stringify(walk(value));
440
+ }
441
+ /** 用本机 DID 身份给快照签名 (公开入口可校验; 只暴露签名与指纹, 不暴露 DID) */
442
+ /** 上一次快照签名失败的原因 (给调用方诊断用; 绝不出现在公开输出里) */
443
+ let lastSignErr = null;
444
+ function lastSnapshotSignError() { return lastSignErr; }
445
+ /** 快照签名输入是 Uint8Array (ed25519), 存 base64 —— 不能直接把字符串喂给 KeyManager.sign */
446
+ function snapBytes(snap) {
447
+ const payload = { ...snap, signature: undefined, signer_fingerprint: undefined };
448
+ return new TextEncoder().encode(canonicalize(payload));
449
+ }
450
+ function decodeSnapSig(sig) {
451
+ if (/^[0-9a-f]{128}$/i.test(sig))
452
+ return new Uint8Array(Buffer.from(sig, 'hex'));
453
+ return new Uint8Array(Buffer.from(sig, 'base64'));
454
+ }
455
+ async function signSnapshot(snap, h) {
456
+ lastSignErr = null;
457
+ try {
458
+ const { KeyManager } = await Promise.resolve().then(() => __importStar(require('@diap/sdk')));
459
+ const file = path.join(home(h), '.bolloon', 'identity.json');
460
+ const kp = await KeyManager.fromFile(file);
461
+ if (!kp?.privateKey) {
462
+ lastSignErr = `没有可用身份 (${file}) → 未签名`;
463
+ return snap;
464
+ }
465
+ const sig = await KeyManager.sign(kp, snapBytes(snap));
466
+ const sigStr = typeof sig === 'string' ? sig : Buffer.from(sig).toString('base64');
467
+ return { ...snap, signature: sigStr, signer_fingerprint: nodeDigest(String(kp.did || '')) };
468
+ }
469
+ catch (e) {
470
+ lastSignErr = String(e?.message || e);
471
+ return snap; // 没身份/签名失败 → 就返回未签名快照 (绝不假装签过)
472
+ }
473
+ }
474
+ /** 校验快照签名 (需要显式传入公钥方; 内部/测试用) */
475
+ async function verifySnapshotSignature(snap, publicKey) {
476
+ try {
477
+ if (!snap.signature)
478
+ return false;
479
+ const { KeyManager } = await Promise.resolve().then(() => __importStar(require('@diap/sdk')));
480
+ return await KeyManager.verify(publicKey, snapBytes(snap), decodeSnapSig(snap.signature));
481
+ }
482
+ catch {
483
+ return false;
484
+ }
485
+ }
486
+ /** 公开投影的"禁止出现"字段检查 (测试与调用方共用) */
487
+ exports.FORBIDDEN_PUBLIC_KEYS = ['did', 'peerId', 'peer_id', 'multiaddrs', 'ip', 'wallet', 'address', 'privateKey', 'content', 'instruction', 'payload'];
488
+ function assertNoPrivateFields(value, at = '$') {
489
+ const issues = [];
490
+ const walk = (v, p) => {
491
+ if (Array.isArray(v))
492
+ return v.forEach((x, i) => walk(x, `${p}[${i}]`));
493
+ if (v && typeof v === 'object') {
494
+ for (const [k, val] of Object.entries(v)) {
495
+ if (exports.FORBIDDEN_PUBLIC_KEYS.includes(k))
496
+ issues.push(`${p}.${k} 不该出现在公开投影里`);
497
+ walk(val, `${p}.${k}`);
498
+ }
499
+ }
500
+ };
501
+ walk(value, at);
502
+ return issues;
503
+ }
504
+ //# sourceMappingURL=network-pulse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-pulse.js","sourceRoot":"","sources":["../../../src/agents/network-pulse.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,8 @@ var pi_sdk_session_manager_js_1 = require("./pi-sdk-session-manager.js");
84
84
  Object.defineProperty(exports, "PiSessionManager", { enumerable: true, get: function () { return pi_sdk_session_manager_js_1.PiSessionManager; } });
85
85
  const pi_sdk_session_manager_js_2 = require("./pi-sdk-session-manager.js");
86
86
  const pi_sdk_tools_js_1 = require("./pi-sdk-tools.js");
87
+ const tools_js_1 = require("./contacts/tools.js");
88
+ const chain_js_1 = require("./contacts/chain.js");
87
89
  var pi_sdk_session_factory_js_1 = require("./pi-sdk-session-factory.js");
88
90
  Object.defineProperty(exports, "createAgentSession", { enumerable: true, get: function () { return pi_sdk_session_factory_js_1.createAgentSession; } });
89
91
  Object.defineProperty(exports, "getAgentSession", { enumerable: true, get: function () { return pi_sdk_session_factory_js_1.getAgentSession; } });
@@ -618,6 +620,14 @@ class PiAgentSession {
618
620
  },
619
621
  };
620
622
  (0, pi_sdk_tools_js_1.registerBuiltinTools)(toolCtx);
623
+ // 2026-09-19: 联系方式工具 (手机/邮箱) —— Agent 拿不到明文, 只能给 contactId;
624
+ // 所有调用都要过 contacts/policy (首次联系/敏感内容需人工批准, 批量永远禁止)。
625
+ try {
626
+ (0, tools_js_1.registerContactTools)(toolCtx, new chain_js_1.ContactChain({ ownerDid: this.identity?.did || 'did:bolln:local' }));
627
+ }
628
+ catch (err) {
629
+ console.warn('[contacts] 注册联系工具失败 (非致命, 该能力不可用):', err?.message || err);
630
+ }
621
631
  (0, pi_sdk_tools_js_1.registerWalletTools)(toolCtx);
622
632
  (0, pi_sdk_tools_js_1.setupInboxListener)(toolCtx);
623
633
  // 镜像到 ToolRegistry (alias resolve 用)