@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.
- package/dist/agentdir.d.ts +43 -0
- package/dist/agentdir.d.ts.map +1 -0
- package/dist/agentdir.js +107 -0
- package/dist/agentdir.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1135 -0
- package/dist/cli.js.map +1 -0
- package/dist/collab/chatter.d.ts +54 -0
- package/dist/collab/chatter.d.ts.map +1 -0
- package/dist/collab/chatter.js +94 -0
- package/dist/collab/chatter.js.map +1 -0
- package/dist/collab/dag.d.ts +27 -0
- package/dist/collab/dag.d.ts.map +1 -0
- package/dist/collab/dag.js +107 -0
- package/dist/collab/dag.js.map +1 -0
- package/dist/collab/negotiation.d.ts +60 -0
- package/dist/collab/negotiation.d.ts.map +1 -0
- package/dist/collab/negotiation.js +90 -0
- package/dist/collab/negotiation.js.map +1 -0
- package/dist/collab/tree.d.ts +39 -0
- package/dist/collab/tree.d.ts.map +1 -0
- package/dist/collab/tree.js +177 -0
- package/dist/collab/tree.js.map +1 -0
- package/dist/config.d.ts +123 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +206 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/join.d.ts +50 -0
- package/dist/join.d.ts.map +1 -0
- package/dist/join.js +167 -0
- package/dist/join.js.map +1 -0
- package/dist/jointoken.d.ts +144 -0
- package/dist/jointoken.d.ts.map +1 -0
- package/dist/jointoken.js +472 -0
- package/dist/jointoken.js.map +1 -0
- package/dist/model.d.ts +64 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +158 -0
- package/dist/model.js.map +1 -0
- package/dist/onboard.d.ts +90 -0
- package/dist/onboard.d.ts.map +1 -0
- package/dist/onboard.js +510 -0
- package/dist/onboard.js.map +1 -0
- package/dist/protocol/envelope.d.ts +94 -0
- package/dist/protocol/envelope.d.ts.map +1 -0
- package/dist/protocol/envelope.js +169 -0
- package/dist/protocol/envelope.js.map +1 -0
- package/dist/protocol/events.d.ts +51 -0
- package/dist/protocol/events.d.ts.map +1 -0
- package/dist/protocol/events.js +87 -0
- package/dist/protocol/events.js.map +1 -0
- package/dist/qr.d.ts +15 -0
- package/dist/qr.d.ts.map +1 -0
- package/dist/qr.js +52 -0
- package/dist/qr.js.map +1 -0
- package/dist/quickstart.d.ts +167 -0
- package/dist/quickstart.d.ts.map +1 -0
- package/dist/quickstart.js +482 -0
- package/dist/quickstart.js.map +1 -0
- package/dist/quota.d.ts +41 -0
- package/dist/quota.d.ts.map +1 -0
- package/dist/quota.js +84 -0
- package/dist/quota.js.map +1 -0
- package/dist/runtime/agent.d.ts +100 -0
- package/dist/runtime/agent.d.ts.map +1 -0
- package/dist/runtime/agent.js +260 -0
- package/dist/runtime/agent.js.map +1 -0
- package/dist/runtime/executor.d.ts +42 -0
- package/dist/runtime/executor.d.ts.map +1 -0
- package/dist/runtime/executor.js +87 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/fairness.d.ts +25 -0
- package/dist/runtime/fairness.d.ts.map +1 -0
- package/dist/runtime/fairness.js +79 -0
- package/dist/runtime/fairness.js.map +1 -0
- package/dist/runtime/node.d.ts +91 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +203 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/runtime/openchamber-http.d.ts +27 -0
- package/dist/runtime/openchamber-http.d.ts.map +1 -0
- package/dist/runtime/openchamber-http.js +118 -0
- package/dist/runtime/openchamber-http.js.map +1 -0
- package/dist/runtime/openchamber.d.ts +38 -0
- package/dist/runtime/openchamber.d.ts.map +1 -0
- package/dist/runtime/openchamber.js +43 -0
- package/dist/runtime/openchamber.js.map +1 -0
- package/dist/runtime/planner.d.ts +23 -0
- package/dist/runtime/planner.d.ts.map +1 -0
- package/dist/runtime/planner.js +17 -0
- package/dist/runtime/planner.js.map +1 -0
- package/dist/runtime/worker.d.ts +96 -0
- package/dist/runtime/worker.d.ts.map +1 -0
- package/dist/runtime/worker.js +296 -0
- package/dist/runtime/worker.js.map +1 -0
- package/dist/security.d.ts +462 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +1197 -0
- package/dist/security.js.map +1 -0
- package/dist/store/daemon-store.d.ts +33 -0
- package/dist/store/daemon-store.d.ts.map +1 -0
- package/dist/store/daemon-store.js +115 -0
- package/dist/store/daemon-store.js.map +1 -0
- package/dist/store/file-store.d.ts +22 -0
- package/dist/store/file-store.d.ts.map +1 -0
- package/dist/store/file-store.js +63 -0
- package/dist/store/file-store.js.map +1 -0
- package/dist/store/mebular-store.d.ts +22 -0
- package/dist/store/mebular-store.d.ts.map +1 -0
- package/dist/store/mebular-store.js +53 -0
- package/dist/store/mebular-store.js.map +1 -0
- package/dist/store/message-store.d.ts +26 -0
- package/dist/store/message-store.d.ts.map +1 -0
- package/dist/store/message-store.js +51 -0
- package/dist/store/message-store.js.map +1 -0
- package/dist/surface.d.ts +43 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +515 -0
- package/dist/surface.js.map +1 -0
- package/dist/transport/null.d.ts +7 -0
- package/dist/transport/null.d.ts.map +1 -0
- package/dist/transport/null.js +16 -0
- package/dist/transport/null.js.map +1 -0
- package/dist/transport/spool.d.ts +12 -0
- package/dist/transport/spool.d.ts.map +1 -0
- package/dist/transport/spool.js +54 -0
- package/dist/transport/spool.js.map +1 -0
- package/dist/transport/types.d.ts +21 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +6 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/version.json +6 -0
- package/package.json +37 -4
- package/protocol/collab.example.json +23 -0
- package/protocol/daemon-home.example.json +66 -0
- package/protocol/envelope.example.json +12 -0
- package/protocol/state-machine.json +14 -0
- package/protocol/task-tree.example.json +72 -0
- package/src/agentdir.ts +138 -0
- package/src/cli.ts +1192 -0
- package/src/collab/chatter.ts +116 -0
- package/src/collab/dag.ts +124 -0
- package/src/collab/negotiation.ts +130 -0
- package/src/collab/tree.ts +184 -0
- package/src/config.ts +286 -0
- package/src/index.ts +39 -0
- package/src/join.ts +227 -0
- package/src/jointoken.ts +609 -0
- package/src/model.ts +203 -0
- package/src/onboard.ts +601 -0
- package/src/protocol/envelope.ts +228 -0
- package/src/protocol/events.ts +135 -0
- package/src/qr.ts +68 -0
- package/src/quickstart.ts +632 -0
- package/src/quota.ts +112 -0
- package/src/runtime/agent.ts +313 -0
- package/src/runtime/executor.ts +114 -0
- package/src/runtime/fairness.ts +90 -0
- package/src/runtime/node.ts +250 -0
- package/src/runtime/openchamber-http.ts +137 -0
- package/src/runtime/openchamber.ts +66 -0
- package/src/runtime/planner.ts +36 -0
- package/src/runtime/worker.ts +354 -0
- package/src/security.ts +1660 -0
- package/src/store/daemon-store.ts +144 -0
- package/src/store/file-store.ts +75 -0
- package/src/store/mebular-store.ts +66 -0
- package/src/store/message-store.ts +62 -0
- package/src/surface.ts +535 -0
- package/src/transport/null.ts +20 -0
- package/src/transport/spool.ts +62 -0
- package/src/transport/types.ts +27 -0
- package/README.md +0 -3
package/dist/surface.js
ADDED
|
@@ -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 @@
|
|
|
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
|