@mebular/fleet 0.0.0-stage → 0.1.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 (178) hide show
  1. package/dist/agentdir.d.ts +43 -0
  2. package/dist/agentdir.d.ts.map +1 -0
  3. package/dist/agentdir.js +107 -0
  4. package/dist/agentdir.js.map +1 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +1135 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/collab/chatter.d.ts +54 -0
  10. package/dist/collab/chatter.d.ts.map +1 -0
  11. package/dist/collab/chatter.js +94 -0
  12. package/dist/collab/chatter.js.map +1 -0
  13. package/dist/collab/dag.d.ts +27 -0
  14. package/dist/collab/dag.d.ts.map +1 -0
  15. package/dist/collab/dag.js +107 -0
  16. package/dist/collab/dag.js.map +1 -0
  17. package/dist/collab/negotiation.d.ts +60 -0
  18. package/dist/collab/negotiation.d.ts.map +1 -0
  19. package/dist/collab/negotiation.js +90 -0
  20. package/dist/collab/negotiation.js.map +1 -0
  21. package/dist/collab/tree.d.ts +39 -0
  22. package/dist/collab/tree.d.ts.map +1 -0
  23. package/dist/collab/tree.js +177 -0
  24. package/dist/collab/tree.js.map +1 -0
  25. package/dist/config.d.ts +123 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +206 -0
  28. package/dist/config.js.map +1 -0
  29. package/dist/index.d.ts +33 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +40 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/join.d.ts +50 -0
  34. package/dist/join.d.ts.map +1 -0
  35. package/dist/join.js +167 -0
  36. package/dist/join.js.map +1 -0
  37. package/dist/jointoken.d.ts +144 -0
  38. package/dist/jointoken.d.ts.map +1 -0
  39. package/dist/jointoken.js +472 -0
  40. package/dist/jointoken.js.map +1 -0
  41. package/dist/model.d.ts +64 -0
  42. package/dist/model.d.ts.map +1 -0
  43. package/dist/model.js +158 -0
  44. package/dist/model.js.map +1 -0
  45. package/dist/onboard.d.ts +90 -0
  46. package/dist/onboard.d.ts.map +1 -0
  47. package/dist/onboard.js +510 -0
  48. package/dist/onboard.js.map +1 -0
  49. package/dist/protocol/envelope.d.ts +94 -0
  50. package/dist/protocol/envelope.d.ts.map +1 -0
  51. package/dist/protocol/envelope.js +169 -0
  52. package/dist/protocol/envelope.js.map +1 -0
  53. package/dist/protocol/events.d.ts +51 -0
  54. package/dist/protocol/events.d.ts.map +1 -0
  55. package/dist/protocol/events.js +87 -0
  56. package/dist/protocol/events.js.map +1 -0
  57. package/dist/qr.d.ts +15 -0
  58. package/dist/qr.d.ts.map +1 -0
  59. package/dist/qr.js +52 -0
  60. package/dist/qr.js.map +1 -0
  61. package/dist/quickstart.d.ts +167 -0
  62. package/dist/quickstart.d.ts.map +1 -0
  63. package/dist/quickstart.js +482 -0
  64. package/dist/quickstart.js.map +1 -0
  65. package/dist/quota.d.ts +41 -0
  66. package/dist/quota.d.ts.map +1 -0
  67. package/dist/quota.js +84 -0
  68. package/dist/quota.js.map +1 -0
  69. package/dist/runtime/agent.d.ts +100 -0
  70. package/dist/runtime/agent.d.ts.map +1 -0
  71. package/dist/runtime/agent.js +260 -0
  72. package/dist/runtime/agent.js.map +1 -0
  73. package/dist/runtime/executor.d.ts +42 -0
  74. package/dist/runtime/executor.d.ts.map +1 -0
  75. package/dist/runtime/executor.js +87 -0
  76. package/dist/runtime/executor.js.map +1 -0
  77. package/dist/runtime/fairness.d.ts +25 -0
  78. package/dist/runtime/fairness.d.ts.map +1 -0
  79. package/dist/runtime/fairness.js +79 -0
  80. package/dist/runtime/fairness.js.map +1 -0
  81. package/dist/runtime/node.d.ts +91 -0
  82. package/dist/runtime/node.d.ts.map +1 -0
  83. package/dist/runtime/node.js +203 -0
  84. package/dist/runtime/node.js.map +1 -0
  85. package/dist/runtime/openchamber-http.d.ts +27 -0
  86. package/dist/runtime/openchamber-http.d.ts.map +1 -0
  87. package/dist/runtime/openchamber-http.js +118 -0
  88. package/dist/runtime/openchamber-http.js.map +1 -0
  89. package/dist/runtime/openchamber.d.ts +38 -0
  90. package/dist/runtime/openchamber.d.ts.map +1 -0
  91. package/dist/runtime/openchamber.js +43 -0
  92. package/dist/runtime/openchamber.js.map +1 -0
  93. package/dist/runtime/planner.d.ts +23 -0
  94. package/dist/runtime/planner.d.ts.map +1 -0
  95. package/dist/runtime/planner.js +17 -0
  96. package/dist/runtime/planner.js.map +1 -0
  97. package/dist/runtime/worker.d.ts +96 -0
  98. package/dist/runtime/worker.d.ts.map +1 -0
  99. package/dist/runtime/worker.js +296 -0
  100. package/dist/runtime/worker.js.map +1 -0
  101. package/dist/security.d.ts +462 -0
  102. package/dist/security.d.ts.map +1 -0
  103. package/dist/security.js +1197 -0
  104. package/dist/security.js.map +1 -0
  105. package/dist/store/daemon-store.d.ts +33 -0
  106. package/dist/store/daemon-store.d.ts.map +1 -0
  107. package/dist/store/daemon-store.js +115 -0
  108. package/dist/store/daemon-store.js.map +1 -0
  109. package/dist/store/file-store.d.ts +22 -0
  110. package/dist/store/file-store.d.ts.map +1 -0
  111. package/dist/store/file-store.js +63 -0
  112. package/dist/store/file-store.js.map +1 -0
  113. package/dist/store/mebular-store.d.ts +22 -0
  114. package/dist/store/mebular-store.d.ts.map +1 -0
  115. package/dist/store/mebular-store.js +53 -0
  116. package/dist/store/mebular-store.js.map +1 -0
  117. package/dist/store/message-store.d.ts +26 -0
  118. package/dist/store/message-store.d.ts.map +1 -0
  119. package/dist/store/message-store.js +51 -0
  120. package/dist/store/message-store.js.map +1 -0
  121. package/dist/surface.d.ts +43 -0
  122. package/dist/surface.d.ts.map +1 -0
  123. package/dist/surface.js +515 -0
  124. package/dist/surface.js.map +1 -0
  125. package/dist/transport/null.d.ts +7 -0
  126. package/dist/transport/null.d.ts.map +1 -0
  127. package/dist/transport/null.js +16 -0
  128. package/dist/transport/null.js.map +1 -0
  129. package/dist/transport/spool.d.ts +12 -0
  130. package/dist/transport/spool.d.ts.map +1 -0
  131. package/dist/transport/spool.js +54 -0
  132. package/dist/transport/spool.js.map +1 -0
  133. package/dist/transport/types.d.ts +21 -0
  134. package/dist/transport/types.d.ts.map +1 -0
  135. package/dist/transport/types.js +6 -0
  136. package/dist/transport/types.js.map +1 -0
  137. package/dist/version.json +6 -0
  138. package/package.json +37 -4
  139. package/protocol/collab.example.json +23 -0
  140. package/protocol/daemon-home.example.json +66 -0
  141. package/protocol/envelope.example.json +12 -0
  142. package/protocol/state-machine.json +14 -0
  143. package/protocol/task-tree.example.json +72 -0
  144. package/src/agentdir.ts +138 -0
  145. package/src/cli.ts +1192 -0
  146. package/src/collab/chatter.ts +116 -0
  147. package/src/collab/dag.ts +124 -0
  148. package/src/collab/negotiation.ts +130 -0
  149. package/src/collab/tree.ts +184 -0
  150. package/src/config.ts +286 -0
  151. package/src/index.ts +39 -0
  152. package/src/join.ts +227 -0
  153. package/src/jointoken.ts +609 -0
  154. package/src/model.ts +203 -0
  155. package/src/onboard.ts +601 -0
  156. package/src/protocol/envelope.ts +228 -0
  157. package/src/protocol/events.ts +135 -0
  158. package/src/qr.ts +68 -0
  159. package/src/quickstart.ts +632 -0
  160. package/src/quota.ts +112 -0
  161. package/src/runtime/agent.ts +313 -0
  162. package/src/runtime/executor.ts +114 -0
  163. package/src/runtime/fairness.ts +90 -0
  164. package/src/runtime/node.ts +250 -0
  165. package/src/runtime/openchamber-http.ts +137 -0
  166. package/src/runtime/openchamber.ts +66 -0
  167. package/src/runtime/planner.ts +36 -0
  168. package/src/runtime/worker.ts +354 -0
  169. package/src/security.ts +1660 -0
  170. package/src/store/daemon-store.ts +144 -0
  171. package/src/store/file-store.ts +75 -0
  172. package/src/store/mebular-store.ts +66 -0
  173. package/src/store/message-store.ts +62 -0
  174. package/src/surface.ts +535 -0
  175. package/src/transport/null.ts +20 -0
  176. package/src/transport/spool.ts +62 -0
  177. package/src/transport/types.ts +27 -0
  178. package/README.md +0 -3
@@ -0,0 +1,515 @@
1
+ // W1 Agent 任务面:**单一工具注册表**(MCP 与 CLI 共用同一 handler,能力完全一致)。
2
+ //
3
+ // 域 = 记忆数据通道(数据义务);任务 = 树/DAG;派发三层 L1 传输授权 / L2 任务树 / L3 本地执行。
4
+ // 本模块只消费 `@mebular/core` 公共 API;工具输出为**结构化 JSON**。
5
+ import { Mebular } from '@mebular/core';
6
+ import { loadToolConfig, readMasterKeyFile, } from './config.js';
7
+ import { declareNamespace, offlineMebularOptions, subscribeNamespace } from './onboard.js';
8
+ import { MebularTaskEventStore } from './store/mebular-store.js';
9
+ import { negotiationMessageStore } from './collab/negotiation.js';
10
+ import { chatterMessageStore, FleetChatter } from './collab/chatter.js';
11
+ import { FleetNode } from './runtime/node.js';
12
+ import { NullTransport } from './transport/null.js';
13
+ import { LocalQuota } from './quota.js';
14
+ import { deriveEdges } from './collab/dag.js';
15
+ import { reduceTaskEvents } from './model.js';
16
+ import { agentDirectoryStore, expandTargets } from './agentdir.js';
17
+ import { EVENT_TO_STATUS } from './protocol/events.js';
18
+ import { DEFAULT_ROOT_BUDGET } from './protocol/envelope.js';
19
+ async function openSession(ctx) {
20
+ // F-UNI:fleet home(fleet.config.json)或守护 home(config.json)都可作为工具上下文
21
+ const config = await loadToolConfig(ctx.dir);
22
+ const namespace = ctx.namespace ?? config.namespace;
23
+ const agent = ctx.agent ?? 'board';
24
+ const live = ctx.mebular;
25
+ let mebular;
26
+ if (live !== undefined) {
27
+ // 运行中 daemon:复用 live app(同一实例 / 同一 EventLog)——写入即本地 append,推送与 SSE 正常。
28
+ mebular = live;
29
+ }
30
+ else {
31
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
32
+ mebular = new Mebular(offlineMebularOptions(config, encryption));
33
+ await mebular.initialize();
34
+ }
35
+ const ownsMebular = live === undefined;
36
+ const device = live?.deviceId ?? config.device;
37
+ const store = new MebularTaskEventStore(mebular, { namespace });
38
+ const node = new FleetNode({
39
+ device,
40
+ agent,
41
+ store,
42
+ transport: new NullTransport(),
43
+ quota: new LocalQuota({ limitPerDevice: config.quotaLimitPerDevice ?? 1_000_000 }),
44
+ });
45
+ return {
46
+ mebular,
47
+ store,
48
+ node,
49
+ device,
50
+ agent,
51
+ namespace,
52
+ close: async () => {
53
+ // live app 的生命周期归 daemon(MCP serve)所有:工具调用只结束会话,不关闭它。
54
+ if (ownsMebular)
55
+ await mebular.shutdown();
56
+ },
57
+ };
58
+ }
59
+ function strInput(input, key) {
60
+ const v = input[key];
61
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
62
+ }
63
+ function requiredString(input, key) {
64
+ const v = strInput(input, key);
65
+ if (v === undefined)
66
+ throw new Error(`${key} 必填(非空字符串)`);
67
+ return v;
68
+ }
69
+ async function statesOf(store) {
70
+ const byTask = new Map();
71
+ for (const e of await store.all()) {
72
+ const list = byTask.get(e.taskId);
73
+ if (list)
74
+ list.push(e);
75
+ else
76
+ byTask.set(e.taskId, [e]);
77
+ }
78
+ return [...byTask.keys()].sort().map((id) => reduceTaskEvents(byTask.get(id))).filter((s) => s !== null);
79
+ }
80
+ function summarizeState(s) {
81
+ return {
82
+ taskId: s.taskId,
83
+ status: s.status,
84
+ from: s.from,
85
+ to: s.to,
86
+ intent: s.intent,
87
+ attempts: s.attempts,
88
+ trace: s.trace,
89
+ lastEventId: s.lastEventId,
90
+ ...(s.resultRef !== undefined ? { resultRef: s.resultRef } : {}),
91
+ ...(s.reason !== undefined ? { reason: s.reason } : {}),
92
+ ...(s.budget !== undefined ? { budget: s.budget } : {}),
93
+ ...(s.dispatch !== undefined ? { dispatch: s.dispatch } : {}),
94
+ };
95
+ }
96
+ function budgetInput(input) {
97
+ const b = input.budget;
98
+ if (b === undefined)
99
+ return undefined;
100
+ if (typeof b !== 'object' || b === null)
101
+ throw new Error('budget 必须为对象');
102
+ const r = b;
103
+ const norm = (k, d) => (r[k] === undefined ? d : Number(r[k]));
104
+ const budget = { maxDepth: norm('maxDepth', DEFAULT_ROOT_BUDGET.maxDepth), maxChildren: norm('maxChildren', DEFAULT_ROOT_BUDGET.maxChildren), maxTasks: norm('maxTasks', DEFAULT_ROOT_BUDGET.maxTasks) };
105
+ for (const [k, v] of Object.entries(budget)) {
106
+ if (!Number.isInteger(v) || v < 0)
107
+ throw new Error(`budget.${k} 必须为非负整数`);
108
+ }
109
+ return budget;
110
+ }
111
+ function dispatchInput(input) {
112
+ const d = input.dispatch;
113
+ if (d === undefined)
114
+ return undefined;
115
+ if (d !== 'children-ok' && d !== 'root-only')
116
+ throw new Error('dispatch 必须为 children-ok|root-only');
117
+ return d;
118
+ }
119
+ export const TASK_TOOLS = [
120
+ {
121
+ name: 'task_submit',
122
+ cli: 'task_submit',
123
+ scope: 'task.write',
124
+ description: '提交任务(root 或 child);root 可带预算与派发策略。**非幂等**:重试 = 新任务(需要关联请用 causedBy/chain)',
125
+ inputSchema: {
126
+ type: 'object',
127
+ required: ['intent', 'to'],
128
+ properties: {
129
+ intent: { type: 'string' },
130
+ to: { type: 'object', properties: { device: { type: 'string' }, agent: { type: 'string' } } },
131
+ payloadRef: { type: 'string' },
132
+ expiresAt: { type: 'number' },
133
+ causedBy: { type: 'string' },
134
+ chain: { type: 'array', items: { type: 'string' } },
135
+ budget: { type: 'object' },
136
+ dispatch: { type: 'string', enum: ['children-ok', 'root-only'] },
137
+ },
138
+ },
139
+ handler: async (input, ctx) => {
140
+ const session = await openSession(ctx);
141
+ try {
142
+ const to = (input.to ?? {});
143
+ const causedBy = strInput(input, 'causedBy');
144
+ const chain = Array.isArray(input.chain) ? input.chain : [];
145
+ const budget = budgetInput(input);
146
+ const dispatch = dispatchInput(input);
147
+ const result = await session.node.submit({
148
+ intent: requiredString(input, 'intent'),
149
+ to: { device: requiredString(to, 'device'), agent: requiredString(to, 'agent') },
150
+ ...(strInput(input, 'payloadRef') !== undefined ? { payloadRef: strInput(input, 'payloadRef') } : {}),
151
+ ...(typeof input.expiresAt === 'number' ? { expiresAt: input.expiresAt } : {}),
152
+ ...(causedBy !== undefined ? { trace: { causedBy, chain: [...chain, causedBy] } } : { trace: { chain } }),
153
+ ...(budget !== undefined ? { budget } : {}),
154
+ ...(dispatch !== undefined ? { dispatch } : {}),
155
+ });
156
+ const state = result.taskId !== null ? reduceTaskEvents(await session.store.byTask(result.taskId)) : null;
157
+ return { ok: result.taskId !== null, taskId: result.taskId, decision: result.decision, from: { device: session.device, agent: session.agent }, ...(state ? { state: summarizeState(state) } : {}) };
158
+ }
159
+ finally {
160
+ await session.close();
161
+ }
162
+ },
163
+ },
164
+ {
165
+ name: 'task_submit_batch',
166
+ cli: 'task_submit_batch',
167
+ scope: 'task.write',
168
+ description: '批量提交任务(同 root 语义)',
169
+ inputSchema: { type: 'object', required: ['tasks'], properties: { tasks: { type: 'array' } } },
170
+ handler: async (input, ctx) => {
171
+ const tasks = input.tasks;
172
+ if (!Array.isArray(tasks) || tasks.length === 0)
173
+ throw new Error('tasks 必须为非空数组');
174
+ const results = [];
175
+ for (const t of tasks) {
176
+ results.push(await TASK_TOOLS.find((x) => x.name === 'task_submit').handler(t, ctx));
177
+ }
178
+ return { ok: results.every((r) => r.ok), count: results.length, results };
179
+ },
180
+ },
181
+ {
182
+ name: 'task_cancel',
183
+ cli: 'task_cancel',
184
+ scope: 'task.write',
185
+ description: '取消未终态任务(写 failed,reason=CANCELLED)',
186
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' }, reason: { type: 'string' } } },
187
+ handler: async (input, ctx) => {
188
+ const session = await openSession(ctx);
189
+ try {
190
+ const taskId = requiredString(input, 'taskId');
191
+ const state = reduceTaskEvents(await session.store.byTask(taskId));
192
+ if (state === null)
193
+ throw new Error(`任务不存在:${taskId}`);
194
+ if (state.terminal)
195
+ return { ok: false, taskId, reason: 'already-terminal', status: state.status };
196
+ const reason = strInput(input, 'reason') ?? 'CANCELLED';
197
+ const event = {
198
+ v: 1,
199
+ eventId: `${taskId}#failed@${session.device}`,
200
+ taskId,
201
+ type: 'failed',
202
+ actor: { device: session.device, agent: session.agent },
203
+ at: Date.now(),
204
+ toStatus: 'failed',
205
+ trace: state.trace,
206
+ reason,
207
+ };
208
+ await session.store.append(event);
209
+ return { ok: true, taskId, status: 'failed', reason };
210
+ }
211
+ finally {
212
+ await session.close();
213
+ }
214
+ },
215
+ },
216
+ {
217
+ name: 'task_retry',
218
+ cli: 'task_retry',
219
+ scope: 'task.write',
220
+ description: '以新任务重试(链表达:新任务 causedBy 原任务)',
221
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' } } },
222
+ handler: async (input, ctx) => {
223
+ const session = await openSession(ctx);
224
+ try {
225
+ const taskId = requiredString(input, 'taskId');
226
+ const state = reduceTaskEvents(await session.store.byTask(taskId));
227
+ if (state === null)
228
+ throw new Error(`任务不存在:${taskId}`);
229
+ const result = await session.node.submit({
230
+ intent: state.intent,
231
+ to: state.to,
232
+ ...(state.payloadRef !== undefined ? { payloadRef: state.payloadRef } : {}),
233
+ trace: { causedBy: taskId, chain: [...state.trace.chain, taskId] },
234
+ });
235
+ return { ok: result.taskId !== null, taskId: result.taskId, retryOf: taskId, decision: result.decision };
236
+ }
237
+ finally {
238
+ await session.close();
239
+ }
240
+ },
241
+ },
242
+ {
243
+ name: 'task_status',
244
+ cli: 'task_status',
245
+ scope: 'task.read',
246
+ description: '查询单任务权威状态',
247
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' } } },
248
+ handler: async (input, ctx) => {
249
+ const session = await openSession(ctx);
250
+ try {
251
+ const taskId = requiredString(input, 'taskId');
252
+ const state = reduceTaskEvents(await session.store.byTask(taskId));
253
+ return state === null ? { ok: false, taskId, state: null } : { ok: true, taskId, state: summarizeState(state) };
254
+ }
255
+ finally {
256
+ await session.close();
257
+ }
258
+ },
259
+ },
260
+ {
261
+ name: 'task_list',
262
+ cli: 'task_list',
263
+ scope: 'task.read',
264
+ description: '列出任务(可按 status/from 过滤)',
265
+ inputSchema: { type: 'object', properties: { status: { type: 'string' }, fromDevice: { type: 'string' } } },
266
+ handler: async (input, ctx) => {
267
+ const session = await openSession(ctx);
268
+ try {
269
+ let states = await statesOf(session.store);
270
+ const status = strInput(input, 'status');
271
+ const fromDevice = strInput(input, 'fromDevice');
272
+ if (status !== undefined)
273
+ states = states.filter((s) => s.status === status);
274
+ if (fromDevice !== undefined)
275
+ states = states.filter((s) => s.from.device === fromDevice);
276
+ return { ok: true, count: states.length, tasks: states.map(summarizeState) };
277
+ }
278
+ finally {
279
+ await session.close();
280
+ }
281
+ },
282
+ },
283
+ {
284
+ name: 'task_history',
285
+ cli: 'task_history',
286
+ scope: 'task.read',
287
+ description: '任务的全部事件(确定序)',
288
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' } } },
289
+ handler: async (input, ctx) => {
290
+ const session = await openSession(ctx);
291
+ try {
292
+ const taskId = requiredString(input, 'taskId');
293
+ const events = (await session.store.byTask(taskId)).sort((a, b) => (a.eventId < b.eventId ? -1 : 1));
294
+ return { ok: true, taskId, events };
295
+ }
296
+ finally {
297
+ await session.close();
298
+ }
299
+ },
300
+ },
301
+ {
302
+ name: 'task_children',
303
+ cli: 'task_children',
304
+ scope: 'task.read',
305
+ description: '任务的直接子任务(trace.causedBy)',
306
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' } } },
307
+ handler: async (input, ctx) => {
308
+ const session = await openSession(ctx);
309
+ try {
310
+ const taskId = requiredString(input, 'taskId');
311
+ const states = await statesOf(session.store);
312
+ const children = deriveEdges(states).filter((e) => e.parent === taskId).map((e) => e.child).sort();
313
+ return { ok: true, taskId, children };
314
+ }
315
+ finally {
316
+ await session.close();
317
+ }
318
+ },
319
+ },
320
+ {
321
+ name: 'task_summarize',
322
+ cli: 'task_summarize',
323
+ scope: 'task.read',
324
+ description: '从 root 可达子图的汇总(复用 summarizeDag)',
325
+ inputSchema: { type: 'object', required: ['taskId'], properties: { taskId: { type: 'string' } } },
326
+ handler: async (input, ctx) => {
327
+ const session = await openSession(ctx);
328
+ try {
329
+ const taskId = requiredString(input, 'taskId');
330
+ return { ok: true, ...(await session.node.summarizeDag(taskId)) };
331
+ }
332
+ finally {
333
+ await session.close();
334
+ }
335
+ },
336
+ },
337
+ {
338
+ name: 'task_subscribe',
339
+ cli: 'task_subscribe',
340
+ scope: 'task.write',
341
+ description: '变化订阅:返回自 cursor 起有变化的任务(单次);CLI --watch 轮询',
342
+ inputSchema: { type: 'object', properties: { cursor: { type: 'object' } } },
343
+ handler: async (input, ctx) => {
344
+ const session = await openSession(ctx);
345
+ try {
346
+ const cursor = (input.cursor ?? {});
347
+ const states = await statesOf(session.store);
348
+ const changed = states.filter((s) => cursor[s.taskId] !== s.lastEventId).map(summarizeState);
349
+ const nextCursor = Object.fromEntries(states.map((s) => [s.taskId, s.lastEventId]));
350
+ return { ok: true, changed, cursor: nextCursor };
351
+ }
352
+ finally {
353
+ await session.close();
354
+ }
355
+ },
356
+ },
357
+ {
358
+ name: 'task_negotiate',
359
+ cli: 'task_negotiate',
360
+ scope: 'task.write',
361
+ description: '发送协商消息(clarify/counter/accept/reject;messageId 幂等)',
362
+ inputSchema: { type: 'object', required: ['taskId', 'kind', 'round'], properties: { taskId: { type: 'string' }, kind: { type: 'string' }, round: { type: 'number' }, text: { type: 'string' } } },
363
+ handler: async (input, ctx) => {
364
+ const session = await openSession(ctx);
365
+ try {
366
+ const taskId = requiredString(input, 'taskId');
367
+ const kind = requiredString(input, 'kind');
368
+ if (!['clarify', 'counter', 'accept', 'reject'].includes(kind))
369
+ throw new Error('kind 非法');
370
+ const round = Number(input.round);
371
+ if (!Number.isInteger(round) || round < 0)
372
+ throw new Error('round 必须为非负整数');
373
+ const store = negotiationMessageStore(session.mebular, session.namespace);
374
+ const message = {
375
+ v: 1,
376
+ messageId: `${taskId}#neg#${round}@${session.device}`,
377
+ taskId,
378
+ round,
379
+ from: { device: session.device, agent: session.agent },
380
+ kind: kind,
381
+ ...(strInput(input, 'text') !== undefined ? { text: strInput(input, 'text') } : {}),
382
+ };
383
+ const appended = await store.append(message);
384
+ return { ok: true, appended, messageId: message.messageId };
385
+ }
386
+ finally {
387
+ await session.close();
388
+ }
389
+ },
390
+ },
391
+ {
392
+ name: 'chatter_send',
393
+ cli: 'chatter_send',
394
+ scope: 'task.write',
395
+ description: '配额制闲聊发送(本地配额记账)',
396
+ inputSchema: { type: 'object', required: ['topic', 'text'], properties: { topic: { type: 'string' }, text: { type: 'string' }, messageId: { type: 'string' } } },
397
+ handler: async (input, ctx) => {
398
+ const session = await openSession(ctx);
399
+ try {
400
+ const quota = new LocalQuota({ limitPerDevice: 1000 });
401
+ const chatter = new FleetChatter({ device: session.device, quota, store: chatterMessageStore(session.mebular, session.namespace) });
402
+ const messageId = strInput(input, 'messageId') ?? `${session.device}-${Date.now().toString(36)}`;
403
+ const decision = await chatter.send({
404
+ v: 1,
405
+ messageId,
406
+ from: { device: session.device, agent: session.agent },
407
+ topic: requiredString(input, 'topic'),
408
+ text: requiredString(input, 'text'),
409
+ });
410
+ return { ok: decision === 'accepted', decision, messageId };
411
+ }
412
+ finally {
413
+ await session.close();
414
+ }
415
+ },
416
+ },
417
+ {
418
+ name: 'chatter_inbox',
419
+ cli: 'chatter_inbox',
420
+ scope: 'task.write',
421
+ description: '闲聊收件箱(幂等去重、确定序)',
422
+ inputSchema: { type: 'object', properties: {} },
423
+ handler: async (_input, ctx) => {
424
+ const session = await openSession(ctx);
425
+ try {
426
+ const chatter = new FleetChatter({ device: session.device, quota: new LocalQuota({ limitPerDevice: 1000 }), store: chatterMessageStore(session.mebular, session.namespace) });
427
+ const inbox = await chatter.inbox();
428
+ return { ok: true, count: inbox.length, messages: inbox };
429
+ }
430
+ finally {
431
+ await session.close();
432
+ }
433
+ },
434
+ },
435
+ {
436
+ name: 'task_quota',
437
+ cli: 'task_quota',
438
+ scope: 'task.read',
439
+ description: '本机配额状态(每设备对自己发出本地记账;无全局账本)',
440
+ inputSchema: { type: 'object', properties: {} },
441
+ handler: async (_input, ctx) => {
442
+ const config = await loadToolConfig(ctx.dir);
443
+ return { ok: true, device: config.device, limitPerDevice: config.quotaLimitPerDevice ?? 1_000_000, note: '本地记账,无全局账本;墙钟不参与一致性判定' };
444
+ },
445
+ },
446
+ {
447
+ name: 'task_targets',
448
+ cli: 'task_targets',
449
+ scope: 'task.read',
450
+ description: '我能派给谁:订阅任务域的对端 ∩ 其 Agent 目录(device, agent)',
451
+ inputSchema: { type: 'object', properties: {} },
452
+ handler: async (_input, ctx) => {
453
+ const session = await openSession(ctx);
454
+ try {
455
+ const config = await loadToolConfig(ctx.dir);
456
+ const subscribed = [];
457
+ for (const peer of config.peers) {
458
+ const namespaces = await session.mebular.getSubscriptions(peer.device);
459
+ if (namespaces.includes(session.namespace))
460
+ subscribed.push(peer.device);
461
+ }
462
+ const entries = await agentDirectoryStore(session.mebular, 'agents').all();
463
+ const targets = expandTargets(entries, subscribed);
464
+ return { ok: true, namespace: session.namespace, subscribed, targets };
465
+ }
466
+ finally {
467
+ await session.close();
468
+ }
469
+ },
470
+ },
471
+ {
472
+ name: 'board_create',
473
+ cli: 'board_create',
474
+ scope: 'task.write',
475
+ description: '建板(= 建域 + 本机订阅 + 邀请成员);域是板的薄封装',
476
+ inputSchema: { type: 'object', required: ['name'], properties: { name: { type: 'string' }, with: { type: 'array', items: { type: 'string' } } } },
477
+ handler: async (input, ctx) => {
478
+ const name = requiredString(input, 'name');
479
+ const withDevices = Array.isArray(input.with) ? input.with : [];
480
+ const config = await loadToolConfig(ctx.dir);
481
+ const live = ctx.mebular !== undefined ? { mebular: ctx.mebular } : {};
482
+ // 建域 = 公告(零门槛)+ 本机订阅;其他设备自行订阅(不能代订)。
483
+ // 运行中 daemon 注入 live app 时复用同一 EventLog(不另开离线写者)。
484
+ const declaration = await declareNamespace(ctx.dir, { namespace: name, note: `board ${name}`, ...live });
485
+ const subscription = await subscribeNamespace(ctx.dir, { namespace: name, note: `board ${name}`, ...live });
486
+ return {
487
+ ok: true,
488
+ namespace: name,
489
+ declaredBy: config.device,
490
+ declarationEventId: declaration.eventId,
491
+ subscribedBy: [config.device],
492
+ subscriptionEventId: subscription.eventId,
493
+ invited: withDevices,
494
+ note: '其他设备需自行订阅该域(订阅零门槛;不能替他人订阅)',
495
+ };
496
+ },
497
+ },
498
+ ];
499
+ /** 工具名 → handler(MCP tools/call 用)。 */
500
+ export function toolByName(name) {
501
+ return TASK_TOOLS.find((t) => t.name === name);
502
+ }
503
+ /** CLI 子命令 → handler。 */
504
+ export function toolByCli(cli) {
505
+ return TASK_TOOLS.find((t) => t.cli === cli);
506
+ }
507
+ /** 工具 ↔ CLI 对照表(文档/测试用)。 */
508
+ export function toolCliTable() {
509
+ return TASK_TOOLS.map((t) => ({ tool: t.name, cli: t.cli }));
510
+ }
511
+ /** 事件类型 → 状态(供表面工具/测试复用,避免硬编码)。 */
512
+ export function statusOfEventType(type) {
513
+ return EVENT_TO_STATUS[type];
514
+ }
515
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { FleetMessage, TaskTransport } from './types.js';
2
+ export declare class NullTransport implements TaskTransport {
3
+ publish(): Promise<void>;
4
+ drain(): Promise<FleetMessage[]>;
5
+ close(): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=null.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null.d.ts","sourceRoot":"","sources":["../../src/transport/null.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,qBAAa,aAAc,YAAW,aAAa;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,16 @@
1
+ // 空传输(M3):当任务事件直接落在**会被同步复制的记忆**里时,无需额外投递通道。
2
+ //
3
+ // 语义:`publish` 为 no-op(事件已由 core 记忆同步传播);`drain` 恒空(消费方直接读本地存储,
4
+ // 该存储会随同步收敛)。用于 `MebularTaskEventStore`。
5
+ export class NullTransport {
6
+ async publish() {
7
+ // no-op:投递由记忆同步负责。
8
+ }
9
+ async drain() {
10
+ return [];
11
+ }
12
+ async close() {
13
+ // 无资源。
14
+ }
15
+ }
16
+ //# sourceMappingURL=null.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null.js","sourceRoot":"","sources":["../../src/transport/null.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,gEAAgE;AAChE,yCAAyC;AAIzC,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,OAAO;QACX,mBAAmB;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO;IACT,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { FleetEndpoint } from '../protocol/envelope.js';
2
+ import type { FleetMessage, TaskTransport } from './types.js';
3
+ export declare class SpoolTransport implements TaskTransport {
4
+ private readonly root;
5
+ constructor(spoolDir: string);
6
+ private inbox;
7
+ private processed;
8
+ publish(message: FleetMessage): Promise<void>;
9
+ drain(recipient: FleetEndpoint): Promise<FleetMessage[]>;
10
+ close(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=spool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spool.d.ts","sourceRoot":"","sources":["../../src/transport/spool.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,QAAQ,EAAE,MAAM;IAI5B,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,SAAS;IAIX,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7C,KAAK,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyBxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,54 @@
1
+ // 本地 spool 传输(M2):单机两进程用一个目录做收件箱,文件级投递。
2
+ //
3
+ // 目录布局:`<spool>/<device>/<msgId>.json`;消费后移入 `<spool>/<device>/.processed/`。
4
+ // 崩溃可能重投(至少一次),消费方按 `eventId` 幂等。
5
+ import { mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';
6
+ import { dirname, join } from 'node:path';
7
+ export class SpoolTransport {
8
+ root;
9
+ constructor(spoolDir) {
10
+ this.root = spoolDir;
11
+ }
12
+ inbox(device) {
13
+ return join(this.root, device);
14
+ }
15
+ processed(device) {
16
+ return join(this.inbox(device), '.processed');
17
+ }
18
+ async publish(message) {
19
+ const dir = this.inbox(message.to.device);
20
+ await mkdir(dir, { recursive: true });
21
+ const file = join(dir, `${message.msgId}.json`);
22
+ await mkdir(dirname(file), { recursive: true });
23
+ await writeFile(file, JSON.stringify(message), 'utf-8');
24
+ }
25
+ async drain(recipient) {
26
+ const dir = this.inbox(recipient.device);
27
+ await mkdir(dir, { recursive: true });
28
+ const names = (await readdir(dir)).filter((n) => n.endsWith('.json')).sort();
29
+ if (names.length === 0)
30
+ return [];
31
+ const processed = this.processed(recipient.device);
32
+ await mkdir(processed, { recursive: true });
33
+ const messages = [];
34
+ for (const name of names) {
35
+ const from = join(dir, name);
36
+ let parsed;
37
+ try {
38
+ parsed = JSON.parse(await readFile(from, 'utf-8'));
39
+ }
40
+ catch {
41
+ // 半写/损坏:移走避免反复失败(诚实跳过;至少一次语义下不静默丢失语义事件)
42
+ await rename(from, join(processed, `${name}.corrupt`));
43
+ continue;
44
+ }
45
+ await rename(from, join(processed, name));
46
+ messages.push(parsed);
47
+ }
48
+ return messages;
49
+ }
50
+ async close() {
51
+ // 无长连接;无需清理。
52
+ }
53
+ }
54
+ //# sourceMappingURL=spool.js.map