@bolloon/bolloon-agent 0.4.33 → 0.5.0

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 (143) hide show
  1. package/dist/agents/contacts/chain.js +27 -7
  2. package/dist/agents/execution-supervisor.js +493 -35
  3. package/dist/agents/external-events.js +35 -6
  4. package/dist/agents/gateway-group.js +100 -12
  5. package/dist/agents/goal-criteria.js +10 -3
  6. package/dist/agents/goal-flywheel/block-executor.js +346 -0
  7. package/dist/agents/goal-flywheel/continuation-decision.js +592 -0
  8. package/dist/agents/goal-flywheel/goal-change.js +754 -0
  9. package/dist/agents/goal-flywheel/index.js +26 -0
  10. package/dist/agents/goal-flywheel/memory-layers.js +227 -0
  11. package/dist/agents/goal-flywheel/run-closure.js +809 -0
  12. package/dist/agents/goal-flywheel/skill-candidate.js +628 -0
  13. package/dist/agents/goal-flywheel/types.js +329 -0
  14. package/dist/agents/goal-flywheel/wiring/change.js +288 -0
  15. package/dist/agents/goal-flywheel/wiring/closure.js +697 -0
  16. package/dist/agents/goal-flywheel/wiring/continuation.js +432 -0
  17. package/dist/agents/goal-flywheel/wiring/contract.js +270 -0
  18. package/dist/agents/goal-flywheel/wiring/index.js +26 -0
  19. package/dist/agents/goal-flywheel/wiring/monitor.js +254 -0
  20. package/dist/agents/goal-flywheel/wiring/seams.js +592 -0
  21. package/dist/agents/goal-flywheel/work-contract.js +478 -0
  22. package/dist/agents/goal-flywheel/work-monitor.js +488 -0
  23. package/dist/agents/goal-flywheel-wiring.js +1870 -0
  24. package/dist/agents/goal-state-reducer.js +406 -0
  25. package/dist/agents/goal-store.js +35 -1
  26. package/dist/agents/mobile-flywheel-view.js +144 -0
  27. package/dist/agents/mobile-task-actions-verify.js +74 -0
  28. package/dist/agents/mobile-task-actions.js +178 -0
  29. package/dist/agents/mobile-task-views.js +199 -0
  30. package/dist/agents/network-pulse.js +304 -18
  31. package/dist/agents/pi-sdk.js +75 -20
  32. package/dist/agents/run-store.js +18 -5
  33. package/dist/agents/skill-readiness.js +52 -10
  34. package/dist/agents/subagent-manager.js +209 -3
  35. package/dist/agents/task/task-runner.js +9 -3
  36. package/dist/agents/task-group.js +8 -51
  37. package/dist/agents/task-public-text.js +89 -0
  38. package/dist/cli/commands/index.js +1 -0
  39. package/dist/cli/commands/tasks.js +350 -2
  40. package/dist/cli/identity-command.js +177 -0
  41. package/dist/cli/setup-wizard.js +71 -0
  42. package/dist/cli/update-commands.js +150 -24
  43. package/dist/cli-entry.js +12 -2
  44. package/dist/electron-build/agents/contacts/chain.js +26 -6
  45. package/dist/electron-build/agents/contacts/chain.js.map +1 -1
  46. package/dist/electron-build/agents/execution-supervisor.js +492 -34
  47. package/dist/electron-build/agents/execution-supervisor.js.map +1 -1
  48. package/dist/electron-build/agents/external-events.js +34 -5
  49. package/dist/electron-build/agents/external-events.js.map +1 -1
  50. package/dist/electron-build/agents/goal-criteria.js +10 -3
  51. package/dist/electron-build/agents/goal-criteria.js.map +1 -1
  52. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js +598 -0
  53. package/dist/electron-build/agents/goal-flywheel/continuation-decision.js.map +1 -0
  54. package/dist/electron-build/agents/goal-flywheel/goal-change.js +773 -0
  55. package/dist/electron-build/agents/goal-flywheel/goal-change.js.map +1 -0
  56. package/dist/electron-build/agents/goal-flywheel/memory-layers.js +269 -0
  57. package/dist/electron-build/agents/goal-flywheel/memory-layers.js.map +1 -0
  58. package/dist/electron-build/agents/goal-flywheel/run-closure.js +818 -0
  59. package/dist/electron-build/agents/goal-flywheel/run-closure.js.map +1 -0
  60. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js +642 -0
  61. package/dist/electron-build/agents/goal-flywheel/skill-candidate.js.map +1 -0
  62. package/dist/electron-build/agents/goal-flywheel/types.js +333 -0
  63. package/dist/electron-build/agents/goal-flywheel/types.js.map +1 -0
  64. package/dist/electron-build/agents/goal-flywheel/wiring/change.js +294 -0
  65. package/dist/electron-build/agents/goal-flywheel/wiring/change.js.map +1 -0
  66. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js +742 -0
  67. package/dist/electron-build/agents/goal-flywheel/wiring/closure.js.map +1 -0
  68. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js +444 -0
  69. package/dist/electron-build/agents/goal-flywheel/wiring/continuation.js.map +1 -0
  70. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js +279 -0
  71. package/dist/electron-build/agents/goal-flywheel/wiring/contract.js.map +1 -0
  72. package/dist/electron-build/agents/goal-flywheel/wiring/index.js +111 -0
  73. package/dist/electron-build/agents/goal-flywheel/wiring/index.js.map +1 -0
  74. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js +264 -0
  75. package/dist/electron-build/agents/goal-flywheel/wiring/monitor.js.map +1 -0
  76. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js +612 -0
  77. package/dist/electron-build/agents/goal-flywheel/wiring/seams.js.map +1 -0
  78. package/dist/electron-build/agents/goal-flywheel/work-contract.js +488 -0
  79. package/dist/electron-build/agents/goal-flywheel/work-contract.js.map +1 -0
  80. package/dist/electron-build/agents/goal-flywheel/work-monitor.js +501 -0
  81. package/dist/electron-build/agents/goal-flywheel/work-monitor.js.map +1 -0
  82. package/dist/electron-build/agents/goal-flywheel-wiring.js +1962 -0
  83. package/dist/electron-build/agents/goal-flywheel-wiring.js.map +1 -0
  84. package/dist/electron-build/agents/goal-state-reducer.js +414 -0
  85. package/dist/electron-build/agents/goal-state-reducer.js.map +1 -0
  86. package/dist/electron-build/agents/goal-store.js +35 -1
  87. package/dist/electron-build/agents/goal-store.js.map +1 -1
  88. package/dist/electron-build/agents/network-pulse.js +307 -19
  89. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  90. package/dist/electron-build/agents/pi-sdk.js +74 -19
  91. package/dist/electron-build/agents/pi-sdk.js.map +1 -1
  92. package/dist/electron-build/agents/run-store.js +20 -5
  93. package/dist/electron-build/agents/run-store.js.map +1 -1
  94. package/dist/electron-build/agents/skill-readiness.js +52 -9
  95. package/dist/electron-build/agents/skill-readiness.js.map +1 -1
  96. package/dist/electron-build/agents/task/task-runner.js +8 -2
  97. package/dist/electron-build/agents/task/task-runner.js.map +1 -1
  98. package/dist/electron-build/orbitdb/cid-database.js +83 -17
  99. package/dist/electron-build/orbitdb/cid-database.js.map +1 -1
  100. package/dist/electron-build/orbitdb/ipfs-node.js +31 -2
  101. package/dist/electron-build/orbitdb/ipfs-node.js.map +1 -1
  102. package/dist/electron-build/utils/dual-source.js +471 -0
  103. package/dist/electron-build/utils/dual-source.js.map +1 -0
  104. package/dist/electron-build/utils/update-manager.js +331 -57
  105. package/dist/electron-build/utils/update-manager.js.map +1 -1
  106. package/dist/electron-build/utils/update-state.js +16 -1
  107. package/dist/electron-build/utils/update-state.js.map +1 -1
  108. package/dist/electron-build/utils/version-info.js +82 -2
  109. package/dist/electron-build/utils/version-info.js.map +1 -1
  110. package/dist/index.js +103 -12
  111. package/dist/ios/chain-explorer.js +617 -0
  112. package/dist/ios/explorer.html +163 -0
  113. package/dist/ios/index.html +96 -0
  114. package/dist/ios/mobile-agent.js +2 -2
  115. package/dist/ios/mobile-contacts.js +329 -0
  116. package/dist/ios/mobile-core.js +1379 -226
  117. package/dist/ios/mobile-privacy.js +185 -0
  118. package/dist/ios/mobile.css +19 -0
  119. package/dist/ios/mobile.html +96 -0
  120. package/dist/ios/mobile.js +706 -7
  121. package/dist/ios/routes-chain-index.js +108 -0
  122. package/dist/ios/routes-contacts.js +420 -0
  123. package/dist/ios/routes-onchain-trade.js +99 -0
  124. package/dist/ios/routes-x402-info.js +1 -0
  125. package/dist/ios/server.js +762 -0
  126. package/dist/ios/task-frame-server.js +211 -0
  127. package/dist/orbitdb/cid-database.js +81 -16
  128. package/dist/orbitdb/ipfs-node.js +31 -2
  129. package/dist/utils/dual-source.js +426 -0
  130. package/dist/utils/update-cli.js +16 -21
  131. package/dist/utils/update-health.js +35 -5
  132. package/dist/utils/update-manager.js +329 -57
  133. package/dist/utils/update-state.js +16 -1
  134. package/dist/utils/version-info.js +75 -1
  135. package/dist/web/mobile-contacts.js +44 -11
  136. package/dist/web/mobile-core.js +1197 -513
  137. package/dist/web/mobile-tasks.js +339 -0
  138. package/dist/web/mobile.css +19 -0
  139. package/dist/web/mobile.html +64 -0
  140. package/dist/web/mobile.js +531 -1
  141. package/dist/web/routes-mobile-tasks.js +353 -0
  142. package/dist/web/server.js +163 -4
  143. package/package.json +3 -1
package/dist/index.js CHANGED
@@ -1598,6 +1598,7 @@ async function processInputInner(input, comm) {
1598
1598
  try {
1599
1599
  const { getSupervisor } = await import('./agents/execution-supervisor.js');
1600
1600
  const { wakeReport, listRunnableGoals, formatGoalLine } = await import('./agents/goal-store.js');
1601
+ const { USER_VISIBLE_STATE_LABELS } = await import('./agents/goal-flywheel/types.js');
1601
1602
  const { runnable, skipped } = await listRunnableGoals({ now: Date.now() });
1602
1603
  const st = getSupervisor().status();
1603
1604
  appendLine(`${C_DIM}supervisor: owner=${st.owner} running=${st.running ? 'yes' : 'no'} tick=${st.tickIntervalMs}ms lease=${st.leaseTtlMs}ms dryRun=${st.dryRun ? 'yes' : 'no'} ticks=${st.ticks}${RESET}`);
@@ -1637,10 +1638,23 @@ async function processInputInner(input, comm) {
1637
1638
  const sup = new ExecutionSupervisor({ runner: runner, maxPerTick: 1, log: (m) => appendLine(`${C_DIM}${m}${RESET}`) });
1638
1639
  const rep = await sup.tickOnce();
1639
1640
  appendLine(`${C_ACCENT}调度周期 #${rep.tick}${RESET} 认领 ${rep.claimed.length} · 执行 ${rep.executed.length}${rep.skipped.length ? ` · 跳过 ${rep.skipped.length}` : ''}`);
1641
+ // 2026-09-25 (飞轮接线): 把飞轮的**判断**如实打出来 —— 为什么跑/为什么停, 用的是哪一类用户可见态
1640
1642
  for (const s of rep.skipped.slice(0, 6))
1641
1643
  appendLine(` ${C_DIM}跳过 ${s.goalId}: ${s.reason}${RESET}`);
1642
1644
  for (const e of rep.executed)
1643
1645
  appendLine(` ▶ ${e.goalId} → run=${e.runId || '-'} ${e.status || ''}${e.error ? ` (${e.error})` : ''}`);
1646
+ for (const f of rep.flywheel) {
1647
+ const zh = USER_VISIBLE_STATE_LABELS[f.visibleState]?.zh || f.visibleState;
1648
+ appendLine(` ${f.runnable ? C_DIM : C_WARN}飞轮 ${f.goalId}: ${f.decision}/${f.state} 无进展连续 ${f.noProgressStreak} 轮 · 用户可见态=${zh} · ${f.reason}${RESET}`);
1649
+ }
1650
+ for (const c of rep.closures) {
1651
+ appendLine(` ${C_DIM}收尾 ${c.goalId}/${c.runId}: ${c.steps} 步 → ${c.decision} (memory ${c.memories} · skill 候选 ${c.candidates})${RESET}`);
1652
+ appendLine(` ${C_DIM}用户汇报: ${c.reportPath}${RESET}`);
1653
+ }
1654
+ for (const b of rep.blocks)
1655
+ appendLine(` ${C_WARN}阻塞 ${b.goalId}/${b.workId}: ${b.kind} → ${b.action} — ${b.note}${RESET}`);
1656
+ for (const w of rep.workContracts)
1657
+ appendLine(` ${C_DIM}工作合同已签发 ${w.goalId}: workId=${w.workId} 能力=${w.capability}${RESET}`);
1644
1658
  return;
1645
1659
  }
1646
1660
  const rows = await wakeReport();
@@ -1648,8 +1662,12 @@ async function processInputInner(input, comm) {
1648
1662
  appendLine(`${C_DIM}还没有目标。${RESET}`);
1649
1663
  return;
1650
1664
  }
1651
- for (const r of rows.slice(0, 12))
1652
- appendLine(` ${r.goalId} [${r.status}] 唤醒: ${r.wake}${r.lease ? ` (lease ${r.lease})` : ''}`);
1665
+ // 界面只上屏**用户可见态** (六类); 内部状态缩到 dim 尾巴里, 只作为排障线索
1666
+ for (const r of rows.slice(0, 12)) {
1667
+ const zh = USER_VISIBLE_STATE_LABELS[r.visible]?.zh || r.visible || r.status;
1668
+ appendLine(` ${r.goalId} [${zh}] 唤醒: ${r.wake}${r.nextAction ? ` 下一步: ${String(r.nextAction).slice(0, 60)}` : ''}${r.lease ? ` (lease ${r.lease})` : ''}`);
1669
+ appendLine(`${C_DIM} (内部: status=${r.status} visible=${r.visible})${RESET}`);
1670
+ }
1653
1671
  if (runnable.length) {
1654
1672
  appendLine(`${C_DIM}现在可推进:${RESET}`);
1655
1673
  for (const g of runnable.slice(0, 5))
@@ -3112,7 +3130,53 @@ const AVAILABLE_TOOLS = [
3112
3130
  { name: 'update_check', description: '检查 npm 包更新', example: '--update-check' },
3113
3131
  { name: 'update_now', description: '立即更新到最新版本', example: '--update-now [package]' },
3114
3132
  ];
3115
- async function runToolCommand(tool, args, outputJson, comm, model, prompt) {
3133
+ /**
3134
+ * 给 `--delegate` 找长期目标上下文 (P5 验收修复)。
3135
+ *
3136
+ * `SubAgentManager.delegateTask` 只在拿到 `goalId` 时才签工作合同 (`issueWorkContractFor`:
3137
+ * "没有长期目标就没有合同上下文"), 而合同是"回报必须带逐条证据"这道门的唯一凭据。
3138
+ *
3139
+ * ★ 之前 CLI 是唯一的生产派遣调用方, **不传 goalId** ⇒ 真路径上一条合同都不签:
3140
+ * 运行时复现过"回一句『全部做完了』就把任务标成 completed, 父目标上什么都没留下"。
3141
+ *
3142
+ * 两种入口:
3143
+ * - `--goal <goalId>`: 用既有目标 (目标不存在 → 抛错, 让调用方如实报告"没签合同");
3144
+ * - 没给: 为这次委派**建一个目标** (`createdBy='cli:delegate'`) 并进"等外部回报"态 ——
3145
+ * 委派总是有目标上下文, 合同门不再空转。
3146
+ *
3147
+ * 为什么是 `awaiting_external` + `autoContinue=false`: 这次委派的执行者是**子 Agent**, 不是本节点
3148
+ * harness。`awaiting_external` 会被 Supervisor 明确跳过 (`listRunnableGoals`: "等外部事件, 不重复
3149
+ * 发送"), 因此不会出现"同一件事被 harness 和子 Agent 各跑一遍"; 同时"没拿到带证据的回报前不自动
3150
+ * 继续"。
3151
+ */
3152
+ async function ensureDelegateGoal(explicitGoalId, taskDesc, caps) {
3153
+ const { createGoal, readGoal, setContinuation, updateGoal } = await import('./agents/goal-store.js');
3154
+ if (explicitGoalId) {
3155
+ const g = await readGoal(explicitGoalId);
3156
+ if (!g)
3157
+ throw new Error(`--goal ${explicitGoalId} 不存在 (不签合同)`);
3158
+ return { goalId: g.goalId, note: `合同签在既有目标 ${g.goalId} (状态 ${g.status}) 上` };
3159
+ }
3160
+ const g = await createGoal({
3161
+ objective: `【委派】${taskDesc}`,
3162
+ successCriteria: [taskDesc],
3163
+ createdBy: 'cli:delegate',
3164
+ });
3165
+ await updateGoal(g.goalId, { status: 'awaiting_external' });
3166
+ await setContinuation(g.goalId, {
3167
+ state: 'awaiting_external',
3168
+ wakeReason: 'awaiting_external',
3169
+ autoContinue: false,
3170
+ needsExternal: `等子 Agent 「${caps.join('/')}」交回带逐条证据的回报 (回报核验不过不算完成)`,
3171
+ });
3172
+ return {
3173
+ goalId: g.goalId,
3174
+ note: `已为本次委派建目标 ${g.goalId} (状态=等外部回复: 等子 Agent 的带证据回报)`,
3175
+ };
3176
+ }
3177
+ async function runToolCommand(tool, args, outputJson, comm, model, prompt,
3178
+ /** `--goal <goalId>` (P5 验收修复: 给 `--delegate` 指目标上下文) */
3179
+ goalFlag) {
3116
3180
  const a = await getAgent();
3117
3181
  const startTime = Date.now();
3118
3182
  let response;
@@ -3572,18 +3636,39 @@ async function runToolCommand(tool, args, outputJson, comm, model, prompt) {
3572
3636
  case 'delegate': {
3573
3637
  const [taskDesc, ...requiredCaps] = args;
3574
3638
  if (!taskDesc) {
3575
- response = '用法: --delegate <任务描述> [能力要求1] [能力要求2] ...';
3639
+ response = '用法: --delegate <任务描述> [能力要求1] [能力要求2] ... [--goal <goalId>]';
3576
3640
  error = response;
3577
3641
  break;
3578
3642
  }
3643
+ const caps = requiredCaps.length > 0 ? requiredCaps : ['general'];
3579
3644
  const manager = await createSubAgentManager();
3580
- const a = await getAgent();
3581
- const { task, agent } = await manager.delegateTask('cli-user', taskDesc, requiredCaps.length > 0 ? requiredCaps : ['general']);
3582
- if (agent) {
3583
- response = `✅ 任务已委派:\n 任务ID: ${task.id}\n 执行Agent: ${agent.name} (${agent.id})\n 状态: ${task.status}`;
3645
+ // ★ 2026-09-25 (P5 验收修复): 派遣**必须**带 goalId。
3646
+ // `SubAgentManager` 只在拿到 goalId 时才签工作合同 (没有长期目标就没有合同上下文);
3647
+ // 而在真实运行里复现过: 不签合同 ⇒ 回报核验这道门完全不生效 ——
3648
+ // 一句"全部做完了"就能把任务标成 completed, 父 Goal 上也留不下"等回报"的痕迹。
3649
+ // 显式 `--goal <goalId>` (校验目标存在) 优先; 没给就为这次委派**建一个目标**,
3650
+ // 合同门在生产路径上不再空转 (目标进"等外部回报"态, 见 ensureDelegateGoal)。
3651
+ let goalId = '';
3652
+ let goalNote = '';
3653
+ try {
3654
+ const g = await ensureDelegateGoal(goalFlag || '', taskDesc, caps);
3655
+ goalId = g.goalId;
3656
+ goalNote = g.note;
3657
+ }
3658
+ catch (err) {
3659
+ goalNote = `目标上下文准备失败 → 本次不签工作合同 (合同门不生效): ${String(err?.message || err).slice(0, 160)}`;
3660
+ }
3661
+ const { task, agent, workContract } = await manager.delegateTask('cli-user', taskDesc, caps, 'normal', undefined, goalId ? { goalId, successCriteria: [taskDesc] } : undefined);
3662
+ const head = agent
3663
+ ? `✅ 任务已委派:\n 任务ID: ${task.id}\n 执行Agent: ${agent.name} (${agent.id})\n 状态: ${task.status}`
3664
+ : `⚠️ 未找到合适的Agent,任务已创建:\n 任务ID: ${task.id}\n 状态: ${task.status}`;
3665
+ if (workContract) {
3666
+ response = `${head}\n ${goalNote}\n 工作合同: ${workContract.workId} (目标 ${goalId})\n`
3667
+ + ` 完成判据 ${workContract.successCriteria.length} 条 · 必带证据 ${workContract.requiredEvidence.length} 条\n`
3668
+ + ` ⚠️ 回报必须按判据逐条给证据: 一句"全部做完了"**不会**被接受为完成`;
3584
3669
  }
3585
3670
  else {
3586
- response = `⚠️ 未找到合适的Agent,任务已创建:\n 任务ID: ${task.id}\n 状态: ${task.status}`;
3671
+ response = `${head}\n ⚠️ 未签工作合同: ${goalNote || '没有目标上下文'} —— 无合同的回报不做证据核验`;
3587
3672
  }
3588
3673
  break;
3589
3674
  }
@@ -3985,7 +4070,7 @@ async function runNonInteractive(args, comm) {
3985
4070
  outputBuffer += params.join(' ') + '\n';
3986
4071
  };
3987
4072
  if (tool) {
3988
- await runToolCommand(tool, toolArgs, false, comm, args.model, prompt);
4073
+ await runToolCommand(tool, toolArgs, false, comm, args.model, prompt, args.goal);
3989
4074
  }
3990
4075
  else if (prompt) {
3991
4076
  const a = await getAgent();
@@ -4025,7 +4110,7 @@ async function runNonInteractive(args, comm) {
4025
4110
  return;
4026
4111
  }
4027
4112
  if (tool) {
4028
- await runToolCommand(tool, toolArgs, !!json, comm, args.model, prompt);
4113
+ await runToolCommand(tool, toolArgs, !!json, comm, args.model, prompt, args.goal);
4029
4114
  }
4030
4115
  else if (prompt) {
4031
4116
  const startTime = Date.now();
@@ -4186,6 +4271,10 @@ function parseArgs() {
4186
4271
  }
4187
4272
  result.toolArgs = delArgs;
4188
4273
  break;
4274
+ // ★ 2026-09-25 (P5 验收修复): 给 --delegate 指定长期目标 (有 goalId 才签工作合同)
4275
+ case '--goal':
4276
+ result.goal = args[++i];
4277
+ break;
4189
4278
  case '--engine':
4190
4279
  case '-e':
4191
4280
  result.engine = args[++i];
@@ -4389,7 +4478,9 @@ function printHelp() {
4389
4478
  # SubAgent 管理
4390
4479
  --agents 列出所有 SubAgent
4391
4480
  --register-agent <name> [cap1] [cap2]... 注册新 SubAgent
4392
- --delegate <任务描述> [能力要求...] 委派任务给最佳 Agent
4481
+ --delegate <任务描述> [能力要求...] [--goal <goalId>]
4482
+ 委派任务给最佳 Agent (签工作合同: 回报必须带逐条证据;
4483
+ --goal 不给则为本次委派建一个目标)
4393
4484
 
4394
4485
  # 全局共享上下文
4395
4486
  --context 显示全局共享上下文摘要