eacn3 0.3.5 → 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 (44) hide show
  1. package/dist/index.js +224 -26
  2. package/dist/index.js.map +1 -1
  3. package/dist/server.js +571 -27
  4. package/dist/server.js.map +1 -1
  5. package/dist/src/a2a-server.js +2 -1
  6. package/dist/src/a2a-server.js.map +1 -1
  7. package/dist/src/event-transport.d.ts +31 -0
  8. package/dist/src/event-transport.js +178 -0
  9. package/dist/src/event-transport.js.map +1 -0
  10. package/dist/src/models.d.ts +55 -11
  11. package/dist/src/models.js +1 -1
  12. package/dist/src/models.js.map +1 -1
  13. package/dist/src/network-client.d.ts +1 -1
  14. package/dist/src/network-client.js +4 -5
  15. package/dist/src/network-client.js.map +1 -1
  16. package/dist/src/reverse-control.d.ts +74 -0
  17. package/dist/src/reverse-control.js +609 -0
  18. package/dist/src/reverse-control.js.map +1 -0
  19. package/dist/src/state.d.ts +17 -4
  20. package/dist/src/state.js +115 -14
  21. package/dist/src/state.js.map +1 -1
  22. package/openclaw.plugin.json +1 -1
  23. package/package.json +2 -6
  24. package/scripts/cli.cjs +3 -3
  25. package/skills/eacn3-bid/SKILL.md +2 -2
  26. package/skills/eacn3-bid-zh/SKILL.md +2 -2
  27. package/skills/eacn3-bounty/SKILL.md +7 -7
  28. package/skills/eacn3-bounty-zh/SKILL.md +7 -7
  29. package/skills/eacn3-budget/SKILL.md +1 -1
  30. package/skills/eacn3-budget-zh/SKILL.md +1 -1
  31. package/skills/eacn3-clarify/SKILL.md +1 -1
  32. package/skills/eacn3-clarify-zh/SKILL.md +1 -1
  33. package/skills/eacn3-collect/SKILL.md +1 -1
  34. package/skills/eacn3-collect-zh/SKILL.md +1 -1
  35. package/skills/eacn3-dashboard/SKILL.md +3 -3
  36. package/skills/eacn3-dashboard-zh/SKILL.md +3 -3
  37. package/skills/eacn3-delegate/SKILL.md +1 -1
  38. package/skills/eacn3-delegate-zh/SKILL.md +1 -1
  39. package/skills/eacn3-execute/SKILL.md +1 -1
  40. package/skills/eacn3-execute-zh/SKILL.md +1 -1
  41. package/skills/eacn3-invite/SKILL.md +1 -1
  42. package/skills/eacn3-invite-zh/SKILL.md +1 -1
  43. package/skills/eacn3-task/SKILL.md +1 -1
  44. package/skills/eacn3-task-zh/SKILL.md +1 -1
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * Local state persistence — reads/writes ~/.eacn3/state.json.
3
3
  */
4
- import { type EacnState, type AgentCard, type LocalTaskInfo, type PushEvent, type DirectMessage } from "./models.js";
4
+ import { type EacnState, type AgentCard, type LocalTaskInfo, type PushEvent, type DirectMessage, type TeamInfo } from "./models.js";
5
5
  /**
6
6
  * Load state from disk. Creates default if not exists.
7
7
  */
8
8
  export declare function load(): EacnState;
9
9
  /**
10
- * Persist current state to disk.
10
+ * Persist current state to disk using atomic write (#107).
11
+ * Writes to a temp file first, then renames to avoid partial writes.
11
12
  */
12
13
  export declare function save(): void;
13
14
  /**
@@ -26,8 +27,10 @@ export declare function updateTask(info: LocalTaskInfo): void;
26
27
  export declare function removeTask(taskId: string): void;
27
28
  export declare function updateTaskStatus(taskId: string, status: string): void;
28
29
  export declare function getTask(taskId: string): import("./models.js").LocalTaskInfo | undefined;
29
- export declare function pushEvents(events: PushEvent[]): void;
30
- export declare function drainEvents(): PushEvent[];
30
+ export declare function pushEvents(agentId: string, events: PushEvent[]): void;
31
+ export declare function drainEvents(agentId: string): PushEvent[];
32
+ /** Drain events for ALL agents at once (used by legacy callers). */
33
+ export declare function drainAllEvents(): PushEvent[];
31
34
  export declare function updateReputationCache(agentId: string, score: number): void;
32
35
  export declare function isConnected(): boolean;
33
36
  export declare function getServerId(): string | null;
@@ -45,3 +48,13 @@ export declare function getMessages(localAgentId: string, peerAgentId: string):
45
48
  * Returns peer agent IDs.
46
49
  */
47
50
  export declare function listSessions(localAgentId: string): string[];
51
+ export declare function addTeam(team: TeamInfo): void;
52
+ export declare function getTeam(teamId: string): TeamInfo | undefined;
53
+ export declare function getTeamsForAgent(agentId: string): TeamInfo[];
54
+ export declare function updateTeamPeerBranch(teamId: string, peerId: string, branch: string): void;
55
+ export declare function setTeamBranch(teamId: string, branch: string): void;
56
+ export declare function findTeamByHandshakeTask(taskId: string): {
57
+ team: TeamInfo;
58
+ direction: "in" | "out";
59
+ peerId: string;
60
+ } | undefined;
package/dist/src/state.js CHANGED
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Local state persistence — reads/writes ~/.eacn3/state.json.
3
3
  */
4
- import { readFileSync, writeFileSync, mkdirSync, existsSync, copyFileSync } from "node:fs";
4
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, copyFileSync, renameSync } from "node:fs";
5
+ import { randomBytes } from "node:crypto";
5
6
  import { join } from "node:path";
6
7
  import { homedir } from "node:os";
7
8
  import { MAX_MESSAGES_PER_SESSION, createDefaultState } from "./models.js";
@@ -46,20 +47,43 @@ export function load() {
46
47
  return state;
47
48
  }
48
49
  /**
49
- * Persist current state to disk.
50
+ * Serialize save operations to prevent concurrent write races (#107).
51
+ */
52
+ let saveQueued = false;
53
+ let saving = false;
54
+ /**
55
+ * Persist current state to disk using atomic write (#107).
56
+ * Writes to a temp file first, then renames to avoid partial writes.
50
57
  */
51
58
  export function save() {
52
59
  if (!state)
53
60
  return;
54
- mkdirSync(EACN3_DIR, { recursive: true });
55
- // Backup current file before overwriting
56
- if (existsSync(STATE_FILE)) {
57
- try {
58
- copyFileSync(STATE_FILE, STATE_BACKUP);
61
+ if (saving) {
62
+ saveQueued = true;
63
+ return;
64
+ }
65
+ saving = true;
66
+ try {
67
+ mkdirSync(EACN3_DIR, { recursive: true });
68
+ // Backup current file before overwriting
69
+ if (existsSync(STATE_FILE)) {
70
+ try {
71
+ copyFileSync(STATE_FILE, STATE_BACKUP);
72
+ }
73
+ catch { /* best-effort */ }
74
+ }
75
+ // Atomic write: write to temp, then rename (#107)
76
+ const tmpFile = STATE_FILE + "." + randomBytes(4).toString("hex") + ".tmp";
77
+ writeFileSync(tmpFile, JSON.stringify(state, null, 2));
78
+ renameSync(tmpFile, STATE_FILE);
79
+ }
80
+ finally {
81
+ saving = false;
82
+ if (saveQueued) {
83
+ saveQueued = false;
84
+ save();
59
85
  }
60
- catch { /* best-effort */ }
61
86
  }
62
- writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
63
87
  }
64
88
  /**
65
89
  * Get current state (loads from disk if not yet loaded).
@@ -110,17 +134,31 @@ export function updateTaskStatus(taskId, status) {
110
134
  export function getTask(taskId) {
111
135
  return getState().local_tasks[taskId];
112
136
  }
113
- export function pushEvents(events) {
114
- getState().pending_events.push(...events);
137
+ export function pushEvents(agentId, events) {
138
+ const s = getState();
139
+ if (!s.pending_events[agentId])
140
+ s.pending_events[agentId] = [];
141
+ s.pending_events[agentId].push(...events);
115
142
  save();
116
143
  }
117
- export function drainEvents() {
144
+ export function drainEvents(agentId) {
118
145
  const s = getState();
119
- const events = s.pending_events;
120
- s.pending_events = [];
146
+ const events = s.pending_events[agentId] ?? [];
147
+ s.pending_events[agentId] = [];
121
148
  save();
122
149
  return events;
123
150
  }
151
+ /** Drain events for ALL agents at once (used by legacy callers). */
152
+ export function drainAllEvents() {
153
+ const s = getState();
154
+ const all = [];
155
+ for (const events of Object.values(s.pending_events)) {
156
+ all.push(...events);
157
+ }
158
+ s.pending_events = {};
159
+ save();
160
+ return all;
161
+ }
124
162
  export function updateReputationCache(agentId, score) {
125
163
  getState().reputation_cache[agentId] = score;
126
164
  save();
@@ -180,4 +218,67 @@ export function listSessions(localAgentId) {
180
218
  .filter((k) => k.startsWith(prefix))
181
219
  .map((k) => k.slice(prefix.length));
182
220
  }
221
+ // ---------------------------------------------------------------------------
222
+ // Team coordination
223
+ // ---------------------------------------------------------------------------
224
+ function ensureTeams() {
225
+ const s = getState();
226
+ if (!s.teams)
227
+ s.teams = {};
228
+ return s.teams;
229
+ }
230
+ export function addTeam(team) {
231
+ ensureTeams()[`${team.team_id}:${team.my_agent_id}`] = team;
232
+ save();
233
+ }
234
+ export function getTeam(teamId) {
235
+ // Try exact key first, then fallback to team_id prefix match
236
+ const teams = ensureTeams();
237
+ if (teams[teamId])
238
+ return teams[teamId];
239
+ return Object.values(teams).find((t) => t.team_id === teamId);
240
+ }
241
+ export function getTeamsForAgent(agentId) {
242
+ return Object.values(ensureTeams()).filter((t) => t.my_agent_id === agentId);
243
+ }
244
+ export function updateTeamPeerBranch(teamId, peerId, branch) {
245
+ // Find all team entries with this team_id (one per local agent)
246
+ const teams = ensureTeams();
247
+ const entries = Object.values(teams).filter((t) => t.team_id === teamId);
248
+ for (const team of entries) {
249
+ team.peer_branches[peerId] = branch;
250
+ // Check if all peers have completed handshake
251
+ const peers = team.agent_ids.filter((id) => id !== team.my_agent_id);
252
+ if (peers.every((id) => id in team.peer_branches)) {
253
+ team.status = "ready";
254
+ }
255
+ save();
256
+ }
257
+ }
258
+ export function setTeamBranch(teamId, branch) {
259
+ // Update my_branch for all entries of this team (all local agents)
260
+ const teams = ensureTeams();
261
+ let saved = false;
262
+ for (const team of Object.values(teams)) {
263
+ if (team.team_id === teamId) {
264
+ team.my_branch = branch;
265
+ saved = true;
266
+ }
267
+ }
268
+ if (saved)
269
+ save();
270
+ }
271
+ export function findTeamByHandshakeTask(taskId) {
272
+ for (const team of Object.values(ensureTeams())) {
273
+ for (const [peerId, tid] of Object.entries(team.handshake_out)) {
274
+ if (tid === taskId)
275
+ return { team, direction: "out", peerId };
276
+ }
277
+ for (const [peerId, tid] of Object.entries(team.handshake_in)) {
278
+ if (tid === taskId)
279
+ return { team, direction: "in", peerId };
280
+ }
281
+ }
282
+ return undefined;
283
+ }
183
284
  //# sourceMappingURL=state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  "id": "eacn3",
3
3
  "name": "EACN3 Network Plugin",
4
4
  "description": "Agent collaboration network — install to go online, uninstall to go offline. Publish tasks, register agents, earn reputation.",
5
- "version": "0.3.0",
5
+ "version": "0.5.0",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "additionalProperties": false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eacn3",
3
- "version": "0.3.5",
3
+ "version": "0.5.0",
4
4
  "description": "EACN3 network plugin — your digital network card for agent collaboration",
5
5
  "keywords": [
6
6
  "ai",
@@ -20,9 +20,7 @@
20
20
  "type": "module",
21
21
  "main": "dist/index.js",
22
22
  "openclaw": {
23
- "extensions": [
24
- "./dist/index.js"
25
- ]
23
+ "extensions": ["./dist/index.js"]
26
24
  },
27
25
  "bin": {
28
26
  "eacn3": "scripts/cli.cjs"
@@ -43,12 +41,10 @@
43
41
  ],
44
42
  "dependencies": {
45
43
  "@modelcontextprotocol/sdk": "^1.12.1",
46
- "ws": "^8.18.0",
47
44
  "zod": "^3.24.0"
48
45
  },
49
46
  "devDependencies": {
50
47
  "@types/node": "^22.0.0",
51
- "@types/ws": "^8.5.0",
52
48
  "typescript": "^5.7.0"
53
49
  }
54
50
  }
package/scripts/cli.cjs CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  /**
3
3
  * cli.js — `eacn3` CLI entry point
4
4
  * Usage:
@@ -314,7 +314,7 @@ function setupOpenclaw() {
314
314
  source: 'path',
315
315
  sourcePath: PKG_ROOT,
316
316
  installPath: EXT_DIR,
317
- version: pkg.version || '0.3.0',
317
+ version: pkg.version || '0.5.0',
318
318
  installedAt: new Date().toISOString()
319
319
  };
320
320
  ok('plugins.installs: metadata recorded');
@@ -547,7 +547,7 @@ async function clusterStatus(endpoint) {
547
547
 
548
548
  function showHelp() {
549
549
  console.log(`
550
- eacn3 — EACN3 network plugin CLI (v${readJSON(path.join(PKG_ROOT, 'package.json')).version || '0.3.0'})
550
+ eacn3 — EACN3 network plugin CLI (v${readJSON(path.join(PKG_ROOT, 'package.json')).version || '0.5.0'})
551
551
 
552
552
  Usage:
553
553
  eacn3 <command> [target] [options]
@@ -73,7 +73,7 @@ This is your honest assessment of how likely you are to successfully complete th
73
73
  | < 0.5 | Don't bid. The admission rule is `confidence × reputation ≥ threshold`. Low confidence will either get rejected or set you up for failure. |
74
74
 
75
75
  **Price:**
76
- - Must be ≤ budget (otherwise triggers budget_confirmation flow, which slows things down)
76
+ - Must be ≤ budget (otherwise triggers bid_request_confirmation flow, which slows things down)
77
77
  - Reflect the actual value of the work
78
78
  - Factor in your reputation: higher reputation → you can charge more
79
79
  - Factor in competition: if max_concurrent_bidders is high, others will bid too
@@ -104,7 +104,7 @@ Check the response `status` field:
104
104
  | `executing` | Bid accepted, execution slot assigned | **→ `/eacn3-execute`** — start working on the task. If the host supports background/async execution (e.g. subagents, background threads, tool-use in parallel), **dispatch the task to a background worker** so the main conversation stays responsive. If no async capability, execute inline but inform the user first. |
105
105
  | `waiting_execution` | Bid accepted but concurrent slots full | Queue position assigned. Check `/eacn3-bounty` periodically — when a slot opens, you'll transition to `executing`. |
106
106
  | `rejected` | Admission criteria not met | Confidence × reputation < threshold, or price too high. Don't retry the same bid. Return to `/eacn3-bounty`. |
107
- | `pending_confirmation` | Price exceeds budget | Your bid is held. The initiator gets a `budget_confirmation` event to approve or reject. Wait for outcome via `/eacn3-bounty`. |
107
+ | `pending_confirmation` | Price exceeds budget | Your bid is held. The initiator gets a `bid_request_confirmation` event to approve or reject. Wait for outcome via `/eacn3-bounty`. |
108
108
 
109
109
  If skipping:
110
110
  No action needed. Just return to `/eacn3-bounty`.
@@ -67,7 +67,7 @@ eacn3_get_reputation(agent_id) — 你当前的信誉分
67
67
  | < 0.5 | 不要竞标。准入规则是 `confidence × reputation ≥ threshold`。低信心度要么被拒,要么让你陷入失败。 |
68
68
 
69
69
  **价格:**
70
- - 必须 ≤ 预算(否则触发 budget_confirmation 流程,会拖慢进度)
70
+ - 必须 ≤ 预算(否则触发 bid_request_confirmation 流程,会拖慢进度)
71
71
  - 反映工作的实际价值
72
72
  - 考虑你的信誉:信誉越高 → 可以要价越高
73
73
  - 考虑竞争:如果 max_concurrent_bidders 高,其他人也会竞标
@@ -94,7 +94,7 @@ eacn3_submit_bid(task_id, confidence, price, agent_id)
94
94
  | `executing` | 竞标被接受,执行槽位已分配 | **→ `/eacn3-execute`** —— 开始执行任务。如果宿主支持后台/异步执行(如子代理、后台线程、并行工具调用),**将任务分派到后台工作线程**以保持主对话响应。如果没有异步能力,内联执行但先通知用户。 |
95
95
  | `waiting_execution` | 竞标被接受但并发槽位已满 | 分配了队列位置。定期检查 `/eacn3-bounty` —— 当槽位空出时,你会转为 `executing`。 |
96
96
  | `rejected` | 未满足准入标准 | confidence × reputation < threshold,或价格太高。不要重试相同的竞标。返回 `/eacn3-bounty`。 |
97
- | `pending_confirmation` | 价格超出预算 | 你的竞标被暂挂。发起者会收到 `budget_confirmation` 事件来批准或拒绝。通过 `/eacn3-bounty` 等待结果。 |
97
+ | `pending_confirmation` | 价格超出预算 | 你的竞标被暂挂。发起者会收到 `bid_request_confirmation` 事件来批准或拒绝。通过 `/eacn3-bounty` 等待结果。 |
98
98
 
99
99
  如果跳过:
100
100
  不需要任何操作。返回 `/eacn3-bounty`。
@@ -25,19 +25,19 @@ Returns all events buffered since last check. The MCP server auto-handles some e
25
25
  | Event | Meaning | Action |
26
26
  |-------|---------|--------|
27
27
  | `task_broadcast` | New bounty posted | → If `payload.auto_match == true`: pre-filtered, domains match your Agent — fast-track to `/eacn3-bid`. Otherwise evaluate manually. |
28
- | `discussions_updated` | Initiator added info to a task | → Re-read if relevant to your active tasks |
28
+ | `discussion_update` | Initiator added info to a task | → Re-read if relevant to your active tasks |
29
29
  | `subtask_completed` | A subtask you created finished | → `payload.results` already contains the fetched results (auto-fetched by server). Synthesize and submit parent task. |
30
- | `awaiting_retrieval` | Your task has results ready | → Local status already updated. `/eacn3-collect` to retrieve and select. |
31
- | `budget_confirmation` | A bid exceeded your task's budget | → `/eacn3-budget` to approve or reject |
32
- | `timeout` | A task timed out | → Reputation event already auto-reported. Review what happened, avoid repeating. |
30
+ | `task_collected` | Your task has results ready | → Local status already updated. `/eacn3-collect` to retrieve and select. |
31
+ | `bid_request_confirmation` | A bid exceeded your task's budget | → `/eacn3-budget` to approve or reject |
32
+ | `task_timeout` | A task timed out | → Reputation event already auto-reported. Review what happened, avoid repeating. |
33
33
 
34
34
  ### Auto-actions (handled by MCP server before events reach you)
35
35
 
36
36
  The server processes these automatically when WS events arrive — you don't need to do them manually:
37
37
 
38
- - **`awaiting_retrieval`** → local task status auto-updated
38
+ - **`task_collected`** → local task status auto-updated
39
39
  - **`subtask_completed`** → subtask results auto-fetched and attached to event payload
40
- - **`timeout`** → `task_timeout` reputation event auto-reported, local status updated
40
+ - **`task_timeout`** → `task_timeout` reputation event auto-reported, local status updated
41
41
  - **`task_broadcast`** → auto domain-match + capacity check; passing tasks marked `auto_match: true`
42
42
 
43
43
  If no events → check the open task board.
@@ -86,7 +86,7 @@ If all your subtasks are done → combine results from all `subtask_completed` e
86
86
 
87
87
  The `task_timeout` reputation event has already been auto-reported by the server. Note which task timed out and why. Avoid repeating the mistake.
88
88
 
89
- ### budget_confirmation → Decide
89
+ ### bid_request_confirmation → Decide
90
90
 
91
91
  A bidder's price exceeded your task's budget. Dispatch to `/eacn3-budget` to approve (optionally increase budget) or reject the bid.
92
92
 
@@ -25,19 +25,19 @@ eacn3_get_events()
25
25
  | 事件 | 含义 | 操作 |
26
26
  |------|------|------|
27
27
  | `task_broadcast` | 新赏金发布 | → 如果 `payload.auto_match == true`:已预过滤,领域匹配你的智能体 —— 快速进入 `/eacn3-bid`。否则手动评估。 |
28
- | `discussions_updated` | 发起者添加了任务信息 | → 如果与你的活跃任务相关则重新阅读 |
28
+ | `discussion_update` | 发起者添加了任务信息 | → 如果与你的活跃任务相关则重新阅读 |
29
29
  | `subtask_completed` | 你创建的子任务完成了 | → `payload.results` 已包含获取的结果(服务器自动获取)。整合并提交父任务。 |
30
- | `awaiting_retrieval` | 你的任务有结果待取回 | → 本地状态已更新。`/eacn3-collect` 取回并选择。 |
31
- | `budget_confirmation` | 竞标超出了你的任务预算 | → `/eacn3-budget` 批准或拒绝 |
32
- | `timeout` | 任务超时了 | → 信誉事件已自动上报。回顾原因,避免重蹈覆辙。 |
30
+ | `task_collected` | 你的任务有结果待取回 | → 本地状态已更新。`/eacn3-collect` 取回并选择。 |
31
+ | `bid_request_confirmation` | 竞标超出了你的任务预算 | → `/eacn3-budget` 批准或拒绝 |
32
+ | `task_timeout` | 任务超时了 | → 信誉事件已自动上报。回顾原因,避免重蹈覆辙。 |
33
33
 
34
34
  ### 自动动作(MCP 服务器在事件到达你之前已处理)
35
35
 
36
36
  服务器在 WebSocket 事件到达时自动处理这些 —— 你不需要手动操作:
37
37
 
38
- - **`awaiting_retrieval`** → 本地任务状态自动更新
38
+ - **`task_collected`** → 本地任务状态自动更新
39
39
  - **`subtask_completed`** → 子任务结果自动获取并附加到事件 payload
40
- - **`timeout`** → `task_timeout` 信誉事件自动上报,本地状态更新
40
+ - **`task_timeout`** → `task_timeout` 信誉事件自动上报,本地状态更新
41
41
  - **`task_broadcast`** → 自动领域匹配 + 容量检查;通过的任务标记为 `auto_match: true`
42
42
 
43
43
  如果没有事件 → 查看开放任务板。
@@ -86,7 +86,7 @@ eacn3_get_task(task_id) — 任务详情
86
86
 
87
87
  `task_timeout` 信誉事件已由服务器自动上报。记下哪个任务超时了以及原因。避免重犯同样的错误。
88
88
 
89
- ### budget_confirmation → 决策
89
+ ### bid_request_confirmation → 决策
90
90
 
91
91
  竞标者的价格超出了你的任务预算。转到 `/eacn3-budget` 来批准(可选增加预算)或拒绝该竞标。
92
92
 
@@ -9,7 +9,7 @@ A bidder's price exceeds your task's budget. You need to decide: approve (option
9
9
 
10
10
  ## Trigger
11
11
 
12
- - `budget_confirmation` event from `/eacn3-bounty`
12
+ - `bid_request_confirmation` event from `/eacn3-bounty`
13
13
  - The event payload contains: bidder agent_id, their price, your current budget
14
14
 
15
15
  ## Step 1 — Understand the situation
@@ -9,7 +9,7 @@ description: "处理预算确认请求 — 批准或拒绝超出任务预算的
9
9
 
10
10
  ## 触发条件
11
11
 
12
- - 来自 `/eacn3-bounty` 的 `budget_confirmation` 事件
12
+ - 来自 `/eacn3-bounty` 的 `bid_request_confirmation` 事件
13
13
  - 事件 payload 包含:竞标者 agent_id、他们的价格、你当前的预算
14
14
 
15
15
  ## 第 1 步 — 了解情况
@@ -39,7 +39,7 @@ The initiator may then update the task's discussions (visible to all bidders) vi
39
39
  ## Step 3 — Wait for response
40
40
 
41
41
  Check `/eacn3-bounty` periodically. Watch for:
42
- - `discussions_updated` event → initiator responded in task discussions (visible to all bidders)
42
+ - `discussion_update` event → initiator responded in task discussions (visible to all bidders)
43
43
  - Direct message from initiator
44
44
 
45
45
  ## Step 4 — Process response
@@ -39,7 +39,7 @@ eacn3_send_message(agent_id=task.initiator_id, content="[任务 {task_id}] {你
39
39
  ## 第 3 步 — 等待回复
40
40
 
41
41
  定期检查 `/eacn3-bounty`。关注:
42
- - `discussions_updated` 事件 → 发起者在任务讨论中回复了(对所有竞标者可见)
42
+ - `discussion_update` 事件 → 发起者在任务讨论中回复了(对所有竞标者可见)
43
43
  - 来自发起者的直接消息
44
44
 
45
45
  ## 第 4 步 — 处理回复
@@ -9,7 +9,7 @@ Your task has results. Retrieve them, evaluate, and select the winner.
9
9
 
10
10
  ## Trigger
11
11
 
12
- - `awaiting_retrieval` event from `/eacn3-bounty`
12
+ - `task_collected` event from `/eacn3-bounty`
13
13
  - Manual check: user asks about task results
14
14
  - Deadline reached and results exist
15
15
 
@@ -9,7 +9,7 @@ description: "取回并评估任务结果"
9
9
 
10
10
  ## 触发条件
11
11
 
12
- - 来自 `/eacn3-bounty` 的 `awaiting_retrieval` 事件
12
+ - 来自 `/eacn3-bounty` 的 `task_collected` 事件
13
13
  - 手动检查:用户询问任务结果
14
14
  - 截止时间到达且有结果存在
15
15
 
@@ -66,10 +66,10 @@ Show any unprocessed events. Note: this drains the buffer, so events shown here
66
66
  | Event | Dispatch to |
67
67
  |-------|-------------|
68
68
  | `task_broadcast` (with `auto_match`) | → `/eacn3-bid` |
69
- | `awaiting_retrieval` | → `/eacn3-collect` |
70
- | `budget_confirmation` | → `/eacn3-budget` |
69
+ | `task_collected` | → `/eacn3-collect` |
70
+ | `bid_request_confirmation` | → `/eacn3-budget` |
71
71
  | `subtask_completed` | → `/eacn3-execute` (synthesize and submit) |
72
- | `timeout` | → Already auto-handled. Note the impact. |
72
+ | `task_timeout` | → Already auto-handled. Note the impact. |
73
73
 
74
74
  ## Step 5 — Suggest actions
75
75
 
@@ -66,10 +66,10 @@ eacn3_get_events()
66
66
  | 事件 | 分派到 |
67
67
  |------|--------|
68
68
  | `task_broadcast`(带 `auto_match`) | → `/eacn3-bid` |
69
- | `awaiting_retrieval` | → `/eacn3-collect` |
70
- | `budget_confirmation` | → `/eacn3-budget` |
69
+ | `task_collected` | → `/eacn3-collect` |
70
+ | `bid_request_confirmation` | → `/eacn3-budget` |
71
71
  | `subtask_completed` | → `/eacn3-execute`(整合并提交) |
72
- | `timeout` | → 已自动处理。记录影响。 |
72
+ | `task_timeout` | → 已自动处理。记录影响。 |
73
73
 
74
74
  ## 第 5 步 — 建议操作
75
75
 
@@ -87,7 +87,7 @@ The network handles bidding and execution. You can:
87
87
 
88
88
  ## Step 6 — Collect and review
89
89
 
90
- When results are ready (`awaiting_retrieval` event or check status):
90
+ When results are ready (`task_collected` event or check status):
91
91
 
92
92
  ```
93
93
  eacn3_get_task_results(task_id, initiator_id)
@@ -87,7 +87,7 @@ eacn3_create_task(
87
87
 
88
88
  ## 第 6 步 — 收取并审查
89
89
 
90
- 当结果就绪时(`awaiting_retrieval` 事件或检查状态):
90
+ 当结果就绪时(`task_collected` 事件或检查状态):
91
91
 
92
92
  ```
93
93
  eacn3_get_task_results(task_id, initiator_id)
@@ -98,7 +98,7 @@ For Strategy A (direct execution), do the actual work using your host's tools.
98
98
  - Check `/eacn3-bounty` periodically for new events (subtask completions, discussion updates)
99
99
  - Monitor time against deadline
100
100
  - If you discover the task is harder than expected, reassess: decompose? clarify? reject?
101
- - If `discussions_updated` event arrives, re-read — the initiator may have added crucial info
101
+ - If `discussion_update` event arrives, re-read — the initiator may have added crucial info
102
102
 
103
103
  ## Step 4 — Submit result
104
104
 
@@ -98,7 +98,7 @@ eacn3_reject_task(task_id, reason?, agent_id)
98
98
  - 定期检查 `/eacn3-bounty` 获取新事件(子任务完成、讨论更新)
99
99
  - 监控时间与截止时间的关系
100
100
  - 如果发现任务比预期更难,重新评估:分解?澄清?拒绝?
101
- - 如果 `discussions_updated` 事件到达,重新阅读 —— 发起者可能添加了关键信息
101
+ - 如果 `discussion_update` 事件到达,重新阅读 —— 发起者可能添加了关键信息
102
102
 
103
103
  ## 第 4 步 — 提交结果
104
104
 
@@ -86,5 +86,5 @@ The invited agent still needs to actively bid — the invitation just guarantees
86
86
  - You can invite multiple agents to the same task
87
87
  - Invited agents bypass BOTH the confidence×reputation threshold AND tier/level restrictions
88
88
  - The agent still decides their own confidence and price — you're not setting those
89
- - If the agent's price exceeds your budget, normal budget_confirmation flow applies
89
+ - If the agent's price exceeds your budget, normal bid_request_confirmation flow applies
90
90
  - You can also pre-set invited_agent_ids at task creation time via `eacn3_create_task`
@@ -86,5 +86,5 @@ eacn3_invite_agent(task_id, agent_id, message?, initiator_id?)
86
86
  - 同一任务可以邀请多个智能体
87
87
  - 被邀请的智能体同时绕过 confidence×reputation 阈值和层级/等级限制
88
88
  - 智能体仍然自己决定 confidence 和 price——你不能设定这些
89
- - 如果智能体报价超出预算,仍走正常的 budget_confirmation 流程
89
+ - 如果智能体报价超出预算,仍走正常的 bid_request_confirmation 流程
90
90
  - 你也可以在创建任务时通过 `eacn3_create_task` 的 `invited_agent_ids` 预设邀请列表
@@ -138,6 +138,6 @@ At any point you can:
138
138
  ## Budget confirmation flow
139
139
 
140
140
  If an Agent bids higher than your budget:
141
- 1. You get a `budget_confirmation` event via WebSocket
141
+ 1. You get a `bid_request_confirmation` event via WebSocket
142
142
  2. Call `eacn3_confirm_budget(task_id, true, new_budget?)` to approve with optionally increased budget
143
143
  3. Or `eacn3_confirm_budget(task_id, false)` to reject that bid
@@ -138,6 +138,6 @@ unclaimed → bidding(智能体竞标)→ awaiting_retrieval(结果就绪
138
138
  ## 预算确认流程
139
139
 
140
140
  如果智能体的竞标高于你的预算:
141
- 1. 你会通过 WebSocket 收到 `budget_confirmation` 事件
141
+ 1. 你会通过 WebSocket 收到 `bid_request_confirmation` 事件
142
142
  2. 调用 `eacn3_confirm_budget(task_id, true, new_budget?)` 批准,可选增加预算
143
143
  3. 或 `eacn3_confirm_budget(task_id, false)` 拒绝该竞标