@bolloon/bolloon-agent 0.5.1 → 0.5.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 (77) hide show
  1. package/README.md +39 -0
  2. package/dist/agents/agent-lang.js +101 -0
  3. package/dist/agents/agent-manifest-protocol.js +4 -0
  4. package/dist/agents/chain/transfer-classify.js +99 -0
  5. package/dist/agents/chain/transfer-index.js +354 -0
  6. package/dist/agents/gateway-group.js +44 -3
  7. package/dist/agents/identity/address-binding.js +613 -0
  8. package/dist/agents/network-pulse.js +706 -27
  9. package/dist/agents/pi-sdk.js +101 -8
  10. package/dist/agents/workflow-pivot-loop.js +3 -1
  11. package/dist/agents/x402/direct-payment.js +689 -0
  12. package/dist/agents/x402/order-identity.js +408 -0
  13. package/dist/agents/x402/paid-info-store.js +17 -0
  14. package/dist/agents/x402/seller-signing.js +614 -0
  15. package/dist/agents/x402/seller-summary.js +398 -0
  16. package/dist/cli/identity-command.js +327 -2
  17. package/dist/cli/protocol-envelope.js +4 -0
  18. package/dist/cli/update-commands.js +41 -25
  19. package/dist/cli/x402-buyer-command.js +463 -0
  20. package/dist/cli/x402-seller-command.js +289 -0
  21. package/dist/cli-entry.js +21 -5
  22. package/dist/efficode/compress.js +78 -0
  23. package/dist/efficode/crc32.js +38 -0
  24. package/dist/efficode/did.js +66 -0
  25. package/dist/efficode/index.js +24 -0
  26. package/dist/efficode/lz77.js +170 -0
  27. package/dist/efficode/negotiate.js +187 -0
  28. package/dist/efficode/ops.js +87 -0
  29. package/dist/efficode/packet.js +271 -0
  30. package/dist/efficode/types.js +45 -0
  31. package/dist/electron-build/agents/agent-manifest-protocol.js +4 -0
  32. package/dist/electron-build/agents/agent-manifest-protocol.js.map +1 -1
  33. package/dist/electron-build/agents/chain/transfer-classify.js +106 -0
  34. package/dist/electron-build/agents/chain/transfer-classify.js.map +1 -0
  35. package/dist/electron-build/agents/chain/transfer-index.js +400 -0
  36. package/dist/electron-build/agents/chain/transfer-index.js.map +1 -0
  37. package/dist/electron-build/agents/identity/address-binding.js +672 -0
  38. package/dist/electron-build/agents/identity/address-binding.js.map +1 -0
  39. package/dist/electron-build/agents/network-pulse.js +714 -28
  40. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  41. package/dist/electron-build/agents/pi-sdk.js +102 -8
  42. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  43. package/dist/electron-build/agents/workflow-pivot-loop.js +3 -1
  44. package/dist/electron-build/agents/workflow-pivot-loop.js.map +1 -1
  45. package/dist/electron-build/agents/x402/direct-payment.js +744 -0
  46. package/dist/electron-build/agents/x402/direct-payment.js.map +1 -0
  47. package/dist/electron-build/agents/x402/order-identity.js +458 -0
  48. package/dist/electron-build/agents/x402/order-identity.js.map +1 -0
  49. package/dist/electron-build/agents/x402/paid-info-protocol.js.map +1 -1
  50. package/dist/electron-build/agents/x402/paid-info-store.js +18 -0
  51. package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -1
  52. package/dist/electron-build/agents/x402/seller-signing.js +682 -0
  53. package/dist/electron-build/agents/x402/seller-signing.js.map +1 -0
  54. package/dist/electron-build/llm/pi-ai.js +685 -48
  55. package/dist/electron-build/llm/pi-ai.js.map +1 -1
  56. package/dist/electron-build/utils/auto-update.js +2 -2
  57. package/dist/electron-build/utils/auto-update.js.map +1 -1
  58. package/dist/electron-build/utils/runtime-bootstrap.js +1 -1
  59. package/dist/electron-build/utils/runtime-bootstrap.js.map +1 -1
  60. package/dist/electron-build/utils/update-manager.js +3 -3
  61. package/dist/electron-build/utils/update-manager.js.map +1 -1
  62. package/dist/electron-build/utils/version-identity.js +1 -1
  63. package/dist/electron-build/utils/version-identity.js.map +1 -1
  64. package/dist/electron-build/web/routes-x402-info.js +28 -1
  65. package/dist/electron-build/web/routes-x402-info.js.map +1 -1
  66. package/dist/index.js +3 -3
  67. package/dist/llm/pi-ai.js +666 -47
  68. package/dist/utils/auto-update.js +2 -2
  69. package/dist/utils/runtime-bootstrap.js +1 -1
  70. package/dist/utils/update-health.js +2 -2
  71. package/dist/utils/update-manager.js +3 -3
  72. package/dist/utils/version-identity.js +1 -1
  73. package/dist/web/bolloon-web.json +3 -3
  74. package/dist/web/mobile.js +64 -0
  75. package/dist/web/routes-x402-info.js +28 -1
  76. package/dist/web/sw.js +1 -1
  77. package/package.json +2 -1
@@ -18,6 +18,8 @@
18
18
  import * as os from 'os';
19
19
  import * as path from 'path';
20
20
  import { getCIDDatabase } from '../orbitdb/cid-database.js';
21
+ // 2026-09-28: 交流语言 (Efficode 是可选项, 不是默认项) —— 只有双方都声明才用
22
+ import { decodeFromPeer, encodeForPeer, recordLangDecision } from '../efficode/negotiate.js';
21
23
  // ============ 依赖注入 (测试用, 避免单测起真实 OrbitDB 节点) ============
22
24
  let _dbOverride = null;
23
25
  /** 测试用: 注入 fake CIDDatabase */
@@ -281,7 +283,11 @@ export async function groupMessages(groupId, limit = 50) {
281
283
  for (const entry of all) {
282
284
  const v = entry.value;
283
285
  if (v && typeof v.text === 'string' && typeof v.from === 'string') {
284
- msgs.push({ from: v.from, text: v.text, ts: typeof v.ts === 'number' ? v.ts : 0 });
286
+ const m = { from: v.from, text: v.text, ts: typeof v.ts === 'number' ? v.ts : 0 };
287
+ // 只透传字符串形态的语言声明; 别的形状一律当"没声明"(不让脏值进到解码分派)
288
+ if (typeof v.lang === 'string' && v.lang.trim())
289
+ m.lang = v.lang.trim();
290
+ msgs.push(m);
285
291
  }
286
292
  }
287
293
  msgs.sort((a, b) => a.ts - b.ts);
@@ -293,7 +299,7 @@ export async function groupMembers(groupId) {
293
299
  return Array.from(new Set(msgs.map((m) => m.from)));
294
300
  }
295
301
  /** 发送群消息 (广播给所有成员) */
296
- export async function groupSend(groupId, text, from) {
302
+ export async function groupSend(groupId, text, from, opts) {
297
303
  const msg = String(text || '').trim();
298
304
  if (!msg)
299
305
  return { ok: false, error: '消息不能为空' };
@@ -309,13 +315,48 @@ export async function groupSend(groupId, text, from) {
309
315
  }
310
316
  }
311
317
  try {
312
- await store.add({ from: String(from || 'anonymous'), text: msg, ts: Date.now() });
318
+ const record = { from: String(from || 'anonymous'), text: msg, ts: Date.now() };
319
+ // 只有显式给了合法声明才写字段 —— 不给就不写 (老读者读到的东西一字不变)
320
+ const lang = typeof opts?.lang === 'string' ? opts.lang.trim() : '';
321
+ if (lang)
322
+ record.lang = lang;
323
+ await store.add(record);
313
324
  return { ok: true };
314
325
  }
315
326
  catch (e) {
316
327
  return { ok: false, error: `发送失败: ${String(e?.message || e).slice(0, 160)}` };
317
328
  }
318
329
  }
330
+ /**
331
+ * 2026-09-28: 按语言裁决发群消息 —— 真可走的那条路。
332
+ *
333
+ * 双方都声明 efficode ⇒ 正文真编成 Efficode 包 (文本模式 Base64), `lang: 'efficode'` 一起落库;
334
+ * 否则**原文直发** + `lang: 'natural'` (或干脆不写字段, 由调用方定), 并记一笔回落原因。
335
+ * 裁决/编码/落库各自失败都有结构化结果, 不静默。
336
+ */
337
+ export async function groupSendWithLang(groupId, text, from, opts = { mine: undefined, theirs: undefined }) {
338
+ const enc = encodeForPeer({ text, mine: opts.mine, theirs: opts.theirs, from, op: opts.op });
339
+ recordLangDecision(enc.decision, { channel: `group:${groupId}`, peer: from });
340
+ const wantLang = enc.lang === 'efficode' || opts.record === 'always' ? enc.lang : '';
341
+ const r = await groupSend(groupId, enc.text, from, wantLang ? { lang: wantLang } : undefined);
342
+ return {
343
+ ok: r.ok,
344
+ error: r.error,
345
+ lang: enc.lang,
346
+ bytes: enc.bytes,
347
+ fallback: enc.decision.fallback,
348
+ reason: enc.decision.reason,
349
+ symbolic: enc.symbolic,
350
+ };
351
+ }
352
+ /**
353
+ * 2026-09-28: 读一条群消息 —— 严格按它自己声明的 `lang` 分派。
354
+ * 声明不是 efficode (含未知字符串 / 没声明) ⇒ 原样返回, **不进解码器**。
355
+ * 声明 efficode 且本机也声明支持 ⇒ 真解包 (畸形包抛, 由调用方如实报失败)。
356
+ */
357
+ export function readGroupMessage(msg, mine) {
358
+ return decodeFromPeer({ payload: msg.text, declaredLang: msg.lang, mine });
359
+ }
319
360
  /** 群组邀请链接 */
320
361
  export async function groupLink(groupId) {
321
362
  const groups = await loadGroups();