@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,510 @@
1
+ // Fleet 设备上车 + 自检(Step 1b)。
2
+ //
3
+ // `onboardDevice`:一次(幂等)完成 主密钥(生成/导入,0600)→ 配置 → 设备证书(core 落盘)。
4
+ // `doctor`:逐项 PASS/FAIL/SKIP(含脱敏与修复建议);`skipped` 明列原因。
5
+ import { access, chmod, mkdir } from 'node:fs/promises';
6
+ import { constants } from 'node:fs';
7
+ import net from 'node:net';
8
+ import { Mebular, } from '@mebular/core';
9
+ import { isHeartbeatFresh, readHeartbeat, registeredServicesForDir } from '../../service/dist/index.js';
10
+ import { fileMode, permissionsApplicable, fleetConfigPath, fleetMasterKeyPath, fleetStoragePath, generateMasterKey, loadFleetConfig, loadToolConfig, masterKeyFingerprint, readMasterKeyFile, saveFleetConfig, validateFleetConfig, writeMasterKeyFile, } from './config.js';
11
+ import { CommandAgent, ExecutorRegistry, HermesAgent } from './runtime/agent.js';
12
+ import { HttpOpenChamberSeam } from './runtime/openchamber-http.js';
13
+ import { OpenChamberAgent } from './runtime/openchamber.js';
14
+ import { EchoExecutor } from './runtime/executor.js';
15
+ async function exists(path) {
16
+ try {
17
+ await access(path, constants.F_OK);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ /** 由 agent 配置构建执行器注册表(未知 kind 已在校验期拒绝)。 */
25
+ export function buildRegistry(agents) {
26
+ const registry = new ExecutorRegistry();
27
+ for (const a of agents) {
28
+ if (a.kind === 'echo')
29
+ registry.register(a.name, new EchoExecutor());
30
+ else if (a.kind === 'command') {
31
+ registry.register(a.name, new CommandAgent({
32
+ command: a.command ?? '',
33
+ ...(a.baseArgs !== undefined ? { baseArgs: a.baseArgs } : {}),
34
+ ...(a.timeoutMs !== undefined ? { timeoutMs: a.timeoutMs } : {}),
35
+ ...(a.concurrency !== undefined ? { concurrency: a.concurrency } : {}),
36
+ }));
37
+ }
38
+ else if (a.kind === 'hermes') {
39
+ registry.register(a.name, new HermesAgent({ ...(a.timeoutMs !== undefined ? { timeoutMs: a.timeoutMs } : {}) }));
40
+ }
41
+ else {
42
+ registry.register(a.name, new OpenChamberAgent(new HttpOpenChamberSeam({ ...(a.timeoutMs !== undefined ? { timeoutMs: a.timeoutMs } : {}) })));
43
+ }
44
+ }
45
+ return registry;
46
+ }
47
+ /** 由配置 + 加密材料构造 core `Mebular` 选项(订阅自主;对端自行声明)。 */
48
+ export function mebularOptions(config, encryption) {
49
+ return {
50
+ storagePath: config.storagePath,
51
+ deviceId: config.device,
52
+ encryption,
53
+ network: { enabled: true, libp2p: { listen: [config.listen] } },
54
+ sync: {
55
+ autoSync: true,
56
+ pushOnWrite: true,
57
+ pushOnWriteThrottleMs: 20,
58
+ namespaces: [config.namespace],
59
+ antiEntropy: { enabled: true, intervalMs: 600_000, jitterRatio: 0.2 },
60
+ },
61
+ };
62
+ }
63
+ /** 离线(不启网络)`Mebular` 选项:onboard/doctor/subscribe 用,只读写本地存储。 */
64
+ export function offlineMebularOptions(config, encryption) {
65
+ return {
66
+ storagePath: config.storagePath,
67
+ deviceId: config.device,
68
+ encryption,
69
+ network: { enabled: false },
70
+ };
71
+ }
72
+ /** 生成/导入主密钥并写配置;幂等(重复执行不损坏身份)。 */
73
+ export async function onboardDevice(input) {
74
+ if (typeof input.device !== 'string' || input.device.length === 0)
75
+ throw new Error('onboard 需要 --device');
76
+ await mkdir(input.dir, { recursive: true });
77
+ if (permissionsApplicable())
78
+ await chmod(input.dir, 0o700);
79
+ const keyPath = fleetMasterKeyPath(input.dir);
80
+ let masterKeyCreated = false;
81
+ let encryption;
82
+ if (input.masterKeyFile !== undefined) {
83
+ encryption = await readMasterKeyFile(input.masterKeyFile);
84
+ await writeMasterKeyFile(keyPath, encryption); // 归一化到设备目录,0600
85
+ }
86
+ else if (await exists(keyPath)) {
87
+ encryption = await readMasterKeyFile(keyPath);
88
+ }
89
+ else {
90
+ encryption = await generateMasterKey();
91
+ await writeMasterKeyFile(keyPath, encryption);
92
+ masterKeyCreated = true;
93
+ }
94
+ const config = {
95
+ v: 1,
96
+ device: input.device,
97
+ dir: input.dir,
98
+ storagePath: fleetStoragePath(input.dir),
99
+ masterKeyFile: keyPath,
100
+ namespace: input.namespace ?? 'tasks',
101
+ listen: input.listen ?? '/ip4/0.0.0.0/tcp/0',
102
+ peers: input.peerDevice !== undefined ? [{ device: input.peerDevice, ...(input.peerAddr !== undefined ? { addr: input.peerAddr } : {}) }] : [],
103
+ agents: input.agents ?? [{ name: 'echo', kind: 'echo' }],
104
+ ...(input.quotaLimitPerDevice !== undefined ? { quotaLimitPerDevice: input.quotaLimitPerDevice } : {}),
105
+ };
106
+ const errors = validateFleetConfig(config);
107
+ if (errors.length > 0)
108
+ throw new Error(`onboard 配置非法:${errors.join('; ')}`);
109
+ const alreadyOnboarded = await exists(fleetConfigPath(input.dir));
110
+ await saveFleetConfig(fleetConfigPath(input.dir), config);
111
+ // 用 core 落盘设备身份/证书(幂等:已存在则复用)。
112
+ const mebular = new Mebular({
113
+ storagePath: config.storagePath,
114
+ deviceId: config.device,
115
+ encryption,
116
+ network: { enabled: false },
117
+ });
118
+ await mebular.initialize();
119
+ try {
120
+ // 上车即声明本机对该域的订阅(订阅自主、零门槛;其他人仍需自行订阅)。
121
+ await mebular.subscribeNamespace(config.namespace);
122
+ }
123
+ finally {
124
+ await mebular.shutdown();
125
+ }
126
+ return { config, alreadyOnboarded, masterKeyCreated, masterKeyFingerprint: masterKeyFingerprint(encryption.userMasterKey) };
127
+ }
128
+ /**
129
+ * 工具/CLI 共用的 app 生命周期:注入 live app(运行中 daemon)时**复用它**——不 initialize、
130
+ * 不 shutdown;否则按目录新建离线实例并在结束时关闭。这样同一份 handler 既能服务 daemon,也能离线跑。
131
+ */
132
+ async function withToolMebular(dir, live, run) {
133
+ const config = await loadToolConfig(dir);
134
+ if (live !== undefined)
135
+ return run(live, config);
136
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
137
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
138
+ await mebular.initialize();
139
+ try {
140
+ return await run(mebular, config);
141
+ }
142
+ finally {
143
+ await mebular.shutdown();
144
+ }
145
+ }
146
+ /**
147
+ * 本机订阅/退订某记忆域(**只能改自己**;写 `namespace_subscription` 到 `__policy__`)。
148
+ * `active=false` 只退订,不清本地数据;退出并交接走 `leaveNamespace`。
149
+ *
150
+ * `mebular`:运行中 daemon 的 live app(可选);提供时写入同一 EventLog,不另开离线实例。
151
+ */
152
+ export async function subscribeNamespace(dir, input) {
153
+ const active = input.active ?? true;
154
+ return withToolMebular(dir, input.mebular, async (mebular, config) => {
155
+ const namespace = input.namespace ?? config.namespace;
156
+ const event = active
157
+ ? await mebular.subscribeNamespace(namespace)
158
+ : await mebular.unsubscribeNamespace(namespace);
159
+ return { member: config.device, namespace, active, eventId: event.id };
160
+ });
161
+ }
162
+ /** 某分区的 active 订阅者(只读)。 */
163
+ export async function namespaceSubscribers(dir, namespace) {
164
+ const config = await loadToolConfig(dir);
165
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
166
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
167
+ await mebular.initialize();
168
+ try {
169
+ return await mebular.getNamespaceSubscribers(namespace ?? config.namespace);
170
+ }
171
+ finally {
172
+ await mebular.shutdown();
173
+ }
174
+ }
175
+ /** 某分区订阅视图(只读)。 */
176
+ export async function namespaceSubscriptions(dir, namespace) {
177
+ const config = await loadToolConfig(dir);
178
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
179
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
180
+ await mebular.initialize();
181
+ try {
182
+ return await mebular.getNamespaceSubscriptions(namespace ?? config.namespace);
183
+ }
184
+ finally {
185
+ await mebular.shutdown();
186
+ }
187
+ }
188
+ /** 建域(零门槛):写 `namespace_declare`;不自动订阅。`mebular` 为运行中 daemon 的 live app(可选)。 */
189
+ export async function declareNamespace(dir, input) {
190
+ if (typeof input.namespace !== 'string' || input.namespace.length === 0)
191
+ throw new Error('namespace 不能为空');
192
+ return withToolMebular(dir, input.mebular, async (mebular) => {
193
+ const event = await mebular.declareNamespace({ namespace: input.namespace, ...(input.note !== undefined ? { note: input.note } : {}) });
194
+ return { namespace: input.namespace, eventId: event.id };
195
+ });
196
+ }
197
+ /** 恢复被移出的设备(写 `device_restore`;high 档证明由调用方给出)。 */
198
+ export async function restoreDevice(dir, input) {
199
+ if (typeof input.subject !== 'string' || input.subject.length === 0)
200
+ throw new Error('restore 需要 --to <deviceId>');
201
+ const config = await loadToolConfig(dir);
202
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
203
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
204
+ await mebular.initialize();
205
+ try {
206
+ const event = await mebular.restoreDevice({
207
+ subject: input.subject,
208
+ ...(input.note !== undefined ? { note: input.note } : {}),
209
+ ...(input.nonce !== undefined ? { nonce: input.nonce } : {}),
210
+ ...(input.cosign !== undefined ? { cosign: input.cosign } : {}),
211
+ ...(input.breakGlass !== undefined ? { breakGlass: input.breakGlass } : {}),
212
+ });
213
+ return { subject: input.subject, eventId: event.id };
214
+ }
215
+ finally {
216
+ await mebular.shutdown();
217
+ }
218
+ }
219
+ /** 重订阅恢复(准入:曾订阅 ∧ 未被移出;写图外 reset 标记)。 */
220
+ export async function rejoinNamespace(dir, input = {}) {
221
+ const config = await loadToolConfig(dir);
222
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
223
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
224
+ await mebular.initialize();
225
+ try {
226
+ return await mebular.rejoinNamespace({ namespace: input.namespace ?? config.namespace });
227
+ }
228
+ finally {
229
+ await mebular.shutdown();
230
+ }
231
+ }
232
+ /** 本机是否已声明某分区重置(读图外标记)。只读。 */
233
+ export async function rejoinReset(dir, namespace) {
234
+ const config = await loadToolConfig(dir);
235
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
236
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
237
+ await mebular.initialize();
238
+ try {
239
+ return await mebular.hasRejoinReset(namespace ?? config.namespace);
240
+ }
241
+ finally {
242
+ await mebular.shutdown();
243
+ }
244
+ }
245
+ /** 交接前置校验(只读)——继任者是否订阅且已 ack 本机在该分区的全部事件。 */
246
+ export async function planHandoff(dir, input) {
247
+ const config = await loadToolConfig(dir);
248
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
249
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
250
+ await mebular.initialize();
251
+ try {
252
+ return await mebular.planNamespaceHandoff({ namespace: input.namespace ?? config.namespace, successor: input.successor });
253
+ }
254
+ finally {
255
+ await mebular.shutdown();
256
+ }
257
+ }
258
+ /** 退出并交接(默认要求继任者全量 ack;`force` 仅本地 CLI,仍如实记录)。 */
259
+ export async function leaveNamespace(dir, input) {
260
+ const config = await loadToolConfig(dir);
261
+ const encryption = await readMasterKeyFile(config.masterKeyFile);
262
+ const mebular = new Mebular(offlineMebularOptions(config, encryption));
263
+ await mebular.initialize();
264
+ try {
265
+ return await mebular.leaveNamespace({
266
+ namespace: input.namespace ?? config.namespace,
267
+ successor: input.successor,
268
+ ...(input.force !== undefined ? { force: input.force } : {}),
269
+ ...(input.note !== undefined ? { note: input.note } : {}),
270
+ });
271
+ }
272
+ finally {
273
+ await mebular.shutdown();
274
+ }
275
+ }
276
+ function parseTcp(multiaddr) {
277
+ const m = /\/ip4\/([0-9.]+)\/tcp\/(\d+)/.exec(multiaddr);
278
+ return m ? { host: m[1], port: Number(m[2]) } : null;
279
+ }
280
+ function tcpReachable(host, port, timeoutMs = 1500) {
281
+ return new Promise((resolve) => {
282
+ const socket = net.connect({ host, port });
283
+ const done = (ok) => {
284
+ socket.destroy();
285
+ resolve(ok);
286
+ };
287
+ socket.setTimeout(timeoutMs);
288
+ socket.once('connect', () => done(true));
289
+ socket.once('timeout', () => done(false));
290
+ socket.once('error', () => done(false));
291
+ });
292
+ }
293
+ /** 从 multiaddr 取监听主机(`/ip4|ip6/<host>/tcp/<port>`);无法解析 → null。 */
294
+ function listenHostOf(multiaddr) {
295
+ const m = /^\/(?:ip4|ip6)\/([^/]+)\/tcp\/\d+/.exec(multiaddr);
296
+ return m ? m[1] : null;
297
+ }
298
+ /** 回环/私有/链路本地/ULA 视为“非公网”;`0.0.0.0`/`::`/全局地址 → false。 */
299
+ function isPrivateListenHost(host) {
300
+ if (host === '127.0.0.1' || host === '::1' || host === 'localhost')
301
+ return true;
302
+ if (/^10\./.test(host) || /^192\.168\./.test(host))
303
+ return true;
304
+ if (/^172\.(1[6-9]|2\d|3[01])\./.test(host))
305
+ return true;
306
+ if (/^169\.254\./.test(host))
307
+ return true;
308
+ if (/^fe80:/i.test(host))
309
+ return true;
310
+ if (/^f[cd]/i.test(host))
311
+ return true; // IPv6 ULA
312
+ return false;
313
+ }
314
+ /** 逐项自检;默认脱敏(不含任何密钥材料)。 */
315
+ export async function doctor(dir) {
316
+ const checks = [];
317
+ const cfgPath = fleetConfigPath(dir);
318
+ const add = (name, status, detail, hint) => {
319
+ checks.push({ name, status, detail, ...(hint !== undefined ? { hint } : {}) });
320
+ };
321
+ let config;
322
+ try {
323
+ config = await loadFleetConfig(cfgPath);
324
+ }
325
+ catch (error) {
326
+ add('config', 'FAIL', `无法加载配置:${error.message}`, `先运行:fleet onboard --dir ${dir} --device <id>`);
327
+ return { ok: false, device: '<unknown>', checks, skipped: [] };
328
+ }
329
+ // 1) 配置权限(POSIX mode;Windows 无该语义 → SKIP,依赖用户目录 ACL)
330
+ const posix = permissionsApplicable();
331
+ if (posix) {
332
+ const cfgMode = await fileMode(cfgPath).catch(() => -1);
333
+ add('config 权限', cfgMode === 0o600 ? 'PASS' : 'FAIL', `mode=${cfgMode.toString(8)}`, cfgMode === 0o600 ? undefined : `chmod 600 ${cfgPath}`);
334
+ }
335
+ else {
336
+ add('config 权限', 'SKIP', 'Windows 无 POSIX mode;依赖用户目录 ACL(见 ONBOARDING Windows 章节)');
337
+ }
338
+ // 1.5) 监听地址:绑定全接口/公网 → **WARN**(不静默;给加固建议)。不使 ok=false。
339
+ const listenHost = listenHostOf(config.listen);
340
+ if (listenHost === null) {
341
+ add('监听地址', 'SKIP', `无法解析 listen:${config.listen}`);
342
+ }
343
+ else if (isPrivateListenHost(listenHost)) {
344
+ add('监听地址', 'PASS', config.listen);
345
+ }
346
+ else {
347
+ add('监听地址', 'WARN', `${config.listen} 绑定到全接口/公网地址(${listenHost})`, '改绑回环或 LAN 地址(/ip4/127.0.0.1 或内网 IP)+ 经 relay 互联,或仅放行已授权对端(见 RELAY-OPS.md)');
348
+ }
349
+ // 2) 主密钥(存在 + 权限 + 可加载)
350
+ let encryption = null;
351
+ try {
352
+ encryption = await readMasterKeyFile(config.masterKeyFile);
353
+ }
354
+ catch {
355
+ encryption = null;
356
+ }
357
+ if (!posix) {
358
+ add('主密钥权限', 'SKIP', 'Windows 无 POSIX mode;依赖用户目录 ACL(见 ONBOARDING Windows 章节)');
359
+ if (encryption === null)
360
+ add('主密钥', 'FAIL', '无法加载主密钥文件', '重新生成或导入(--master-key)');
361
+ else
362
+ add('主密钥', 'PASS', `fingerprint=${masterKeyFingerprint(encryption.userMasterKey)}`);
363
+ }
364
+ else {
365
+ const keyMode = await fileMode(config.masterKeyFile).catch(() => -1);
366
+ if (keyMode !== 0o600)
367
+ add('主密钥权限', 'FAIL', `mode=${keyMode.toString(8)}`, `chmod 600 ${config.masterKeyFile}`);
368
+ else if (encryption === null)
369
+ add('主密钥', 'FAIL', '无法加载主密钥文件', '重新生成或导入(--master-key)');
370
+ else
371
+ add('主密钥', 'PASS', `fingerprint=${masterKeyFingerprint(encryption.userMasterKey)}`);
372
+ }
373
+ // 3) 设备身份 + 主密钥链(core 验签设备证书)
374
+ const identityPath = `${config.storagePath}.identity.json`;
375
+ add('设备身份文件', (await exists(identityPath)) ? 'PASS' : 'FAIL', identityPath, `fleet onboard --dir ${dir} --device ${config.device}`);
376
+ if (encryption !== null) {
377
+ try {
378
+ const m = new Mebular({ storagePath: config.storagePath, deviceId: config.device, encryption, network: { enabled: false } });
379
+ await m.initialize();
380
+ await m.shutdown();
381
+ add('主密钥链', 'PASS', '设备证书链到用户主密钥');
382
+ }
383
+ catch (error) {
384
+ add('主密钥链', 'FAIL', `初始化失败:${error.message}`, '确认 --master-key 与既有身份一致');
385
+ }
386
+ }
387
+ // 4) 对端可达(有 addr 才测;否则等待对端拨入)
388
+ const withAddr = config.peers.filter((p) => typeof p.addr === 'string');
389
+ if (config.peers.length === 0) {
390
+ add('peer 可达', 'SKIP', '未配置任何对端(默认拒绝)', 'fleet onboard … --peer-device <id> [--peer-addr <multiaddr>]');
391
+ }
392
+ else if (withAddr.length === 0) {
393
+ add('peer 可达', 'SKIP', '对端未提供 addr(等待对端拨入)', undefined);
394
+ }
395
+ else {
396
+ for (const peer of withAddr) {
397
+ const tcp = parseTcp(peer.addr);
398
+ const reachable = tcp !== null && (await tcpReachable(tcp.host, tcp.port));
399
+ add(`peer 可达(${peer.device})`, reachable ? 'PASS' : 'FAIL', peer.addr, '确认对端已启动且地址/端口可达');
400
+ }
401
+ }
402
+ // 5) 订阅:本机自声明 + 对端自声明(没有「授权」项)。
403
+ const peerDevices = config.peers.map((p) => p.device);
404
+ if (encryption === null) {
405
+ add('namespace 订阅', 'SKIP', `主密钥不可用,无法读取图上订阅(namespace=${config.namespace})`, '导入主密钥后重试(--master-key)');
406
+ }
407
+ else {
408
+ try {
409
+ const m = new Mebular(offlineMebularOptions(config, encryption));
410
+ await m.initialize();
411
+ const view = await m.getNamespaceSubscriptions(config.namespace);
412
+ const blocked = await m.getBlockedDevices();
413
+ const peerParts = [];
414
+ let allPeersSubscribed = peerDevices.length > 0;
415
+ for (const device of peerDevices) {
416
+ const subscribed = (await m.getSubscriptions(device)).includes(config.namespace);
417
+ peerParts.push(`${device}:${subscribed ? 'subscribed' : 'not-yet'}`);
418
+ if (!subscribed)
419
+ allPeersSubscribed = false;
420
+ }
421
+ await m.shutdown();
422
+ const selfSubscribed = view.subscribers.includes(config.device);
423
+ add('namespace 订阅', selfSubscribed ? 'PASS' : 'FAIL', `namespace=${config.namespace} subscribers=[${view.subscribers.join(', ')}] self=${config.device}`, selfSubscribed ? undefined : `fleet subscribe --namespace ${config.namespace}`);
424
+ add('对端订阅', peerDevices.length === 0 ? 'SKIP' : allPeersSubscribed ? 'PASS' : 'SKIP', peerDevices.length === 0 ? '未登记对端' : `peers=[${peerParts.join(', ')}]`, allPeersSubscribed ? undefined : '对端自行声明订阅后即可互通(订阅零门槛)');
425
+ add('移出状态', blocked.includes(config.device) ? 'FAIL' : blocked.length > 0 ? 'WARN' : 'PASS', blocked.length === 0 ? '无设备被移出' : `blocked=[${blocked.join(', ')}]`, blocked.includes(config.device) ? '本机已被移出:请由其他设备执行 device_restore 后重新订阅' : undefined);
426
+ }
427
+ catch (error) {
428
+ add('namespace 订阅', 'FAIL', `读取本地订阅失败:${error.message}`, '确认存储/主密钥可用');
429
+ }
430
+ }
431
+ // 5.5) W2 守护(仅当 fleet 走 daemon 客户端时检查;embedded 不引入新 SKIP,保持既有验收不变)
432
+ if (config.daemon?.endpoint !== undefined) {
433
+ try {
434
+ const res = await fetch(`${config.daemon.endpoint.replace(/\/+$/, '')}/healthz`);
435
+ add('守护', res.ok ? 'PASS' : 'FAIL', `${config.daemon.endpoint}(HTTP ${res.status})`, res.ok ? undefined : '确认 mebular serve 已启动(mebular service install mebular-serve)');
436
+ }
437
+ catch (error) {
438
+ add('守护', 'FAIL', `${config.daemon.endpoint} 不可达`, `启动守护:mebular serve(${error.message})`);
439
+ }
440
+ }
441
+ // 6) agent 注册表可解析
442
+ const agentErrors = validateFleetConfig({ ...config, agents: config.agents }).filter((e) => e.startsWith('agent'));
443
+ try {
444
+ buildRegistry(config.agents);
445
+ add('agent 注册表', agentErrors.length === 0 ? 'PASS' : 'FAIL', config.agents.map((a) => `${a.name}:${a.kind}`).join(','), '修正 agents 配置');
446
+ }
447
+ catch (error) {
448
+ add('agent 注册表', 'FAIL', error.message, '修正 agents 配置');
449
+ }
450
+ // 7) 同步已收敛(本地是否已见对端署名的任务事件)
451
+ if (encryption === null) {
452
+ add('同步已收敛', 'SKIP', '主密钥不可用,跳过');
453
+ }
454
+ else {
455
+ try {
456
+ const m = new Mebular({ storagePath: config.storagePath, deviceId: config.device, encryption, network: { enabled: false } });
457
+ await m.initialize();
458
+ const nodes = (await m.graph.listNodes({ type: 'task_event' }));
459
+ await m.shutdown();
460
+ const taskNodes = nodes.filter((n) => n.namespace === config.namespace);
461
+ if (taskNodes.length === 0) {
462
+ add('同步已收敛', 'SKIP', '尚无任务事件,无法判断(可在派活后重跑 doctor)');
463
+ }
464
+ else {
465
+ const peerDevices = new Set(config.peers.map((p) => p.device));
466
+ const authors = taskNodes
467
+ .map((n) => n.content?.actor?.device ?? n.content?.author)
468
+ .filter((a) => typeof a === 'string');
469
+ const seen = new Set(authors.filter((a) => peerDevices.has(a)));
470
+ add('同步已收敛', seen.size > 0 ? 'PASS' : 'FAIL', `对端署名事件:${seen.size}/${peerDevices.size}`, '确认对端在线、已授权且已产生同步');
471
+ }
472
+ }
473
+ catch (error) {
474
+ add('同步已收敛', 'FAIL', `读取本地状态失败:${error.message}`);
475
+ }
476
+ }
477
+ // 7.4) 2c 重入状态:本机是否已声明某分区重置(图外标记,不同步)。恒 PASS,供审计。
478
+ const rejoinMarker = `${config.storagePath}.rejoin.${config.namespace}.json`;
479
+ add('重入状态', 'PASS', (await exists(rejoinMarker)) ? `namespace=${config.namespace} reset=true(已声明重置;下次同步将从零拉取)` : 'reset=false');
480
+ // 7.5) 2b 交接状态:存在未完成意图(图外 sidecar)→ FAIL(重跑 `fleet leave` 幂等续跑)。
481
+ const intentPath = `${config.storagePath}.handoff.json`;
482
+ if (await exists(intentPath)) {
483
+ add('交接状态', 'FAIL', `存在未完成交接意图:${intentPath}`, '重跑 `fleet leave --successor <id>`(幂等续跑)');
484
+ }
485
+ else {
486
+ add('交接状态', 'PASS', '无未完成交接');
487
+ }
488
+ // 8) 服务已注册(D4):是否有常驻服务**指向本目录**(读 manifest,dir-scoped,temp 目录可复现)。
489
+ const registered = registeredServicesForDir(dir);
490
+ if (registered.length === 0) {
491
+ add('服务已注册', 'SKIP', '未安装常驻服务', 'fleet service install fleet-node|fleet-worker(或 mebular service install)');
492
+ }
493
+ else {
494
+ add('服务已注册', 'PASS', `services=[${registered.join(', ')}]`);
495
+ }
496
+ // 9) 心跳新鲜(D4):process 写 `<dir>/service.heartbeat`;无文件 → SKIP,陈旧 → FAIL。
497
+ const heartbeat = readHeartbeat(dir);
498
+ if (heartbeat === null) {
499
+ add('心跳新鲜', 'SKIP', '无 service.heartbeat(服务未运行/未安装)');
500
+ }
501
+ else if (isHeartbeatFresh(dir)) {
502
+ add('心跳新鲜', 'PASS', `role=${heartbeat.role} pid=${heartbeat.pid} age=${Date.now() - heartbeat.ts}ms sha=${heartbeat.sha}`);
503
+ }
504
+ else {
505
+ add('心跳新鲜', 'FAIL', `心跳陈旧 age=${Date.now() - heartbeat.ts}ms(role=${heartbeat.role} pid=${heartbeat.pid})`, '服务可能已崩溃:`fleet service status` / `fleet service logs`');
506
+ }
507
+ const skipped = checks.filter((c) => c.status === 'SKIP').map((c) => c.name);
508
+ return { ok: !checks.some((c) => c.status === 'FAIL'), device: config.device, checks, skipped };
509
+ }
510
+ //# sourceMappingURL=onboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /** 协议版本(envelope 线格式版本;改动 = 破坏性,需全端同版本)。 */
2
+ export declare const FLEET_PROTOCOL_VERSION: 1;
3
+ /**
4
+ * 任务状态(**单调秩**,用于并发/乱序下的确定性收敛):
5
+ * - `queued` → `claimed` → `running` → `done` | `failed`
6
+ * - `done` / `failed` 为**终态**(同秩,平局由 `TERMINAL_PRECEDENCE` 兜底)。
7
+ */
8
+ export declare const TASK_STATUSES: readonly ["queued", "claimed", "running", "done", "failed"];
9
+ export type TaskStatus = (typeof TASK_STATUSES)[number];
10
+ /** 状态秩:`done`/`failed` 同秩(终态),其余严格递增。 */
11
+ export declare const STATUS_RANK: Readonly<Record<TaskStatus, number>>;
12
+ /** 终态平局裁决:数值大者胜(确定性)。 */
13
+ export declare const TERMINAL_PRECEDENCE: Readonly<Record<TaskStatus, number>>;
14
+ /** 任务树预算(**W1**):随树单调递减;root 声明,子任务 ≤ 父剩余。 */
15
+ export interface TaskBudget {
16
+ /** 允许的最大深度(root 深度 0;链长 = 祖先数) */
17
+ maxDepth: number;
18
+ /** 每个父任务可派生的直接子任务上限 */
19
+ maxChildren: number;
20
+ /** 整个子树的任务总数上限(含 root) */
21
+ maxTasks: number;
22
+ }
23
+ /** root 级派发策略:`children-ok`(默认,可派生)| `root-only`(执行者只能干、不得再派)。 */
24
+ export declare const DISPATCH_POLICIES: readonly ["children-ok", "root-only"];
25
+ export type TaskDispatch = (typeof DISPATCH_POLICIES)[number];
26
+ /** root 预算默认值(W1 上界,可由 root 收紧)。 */
27
+ export declare const DEFAULT_ROOT_BUDGET: Readonly<TaskBudget>;
28
+ /** 预算合法性(非负整数;越界由树不变式判定,这里只做形状)。 */
29
+ export declare function isTaskBudget(value: unknown): value is TaskBudget;
30
+ /** 派发策略守卫。 */
31
+ export declare function isTaskDispatch(value: unknown): value is TaskDispatch;
32
+ /** 端标识:设备 + 该设备上的 Agent 名。 */
33
+ export interface FleetEndpoint {
34
+ device: string;
35
+ agent: string;
36
+ }
37
+ /** 因果追踪:`causedBy` 指向触发本任务/迁移的父任务;`chain` 为祖先链(去重、有序)。 */
38
+ export interface FleetTrace {
39
+ causedBy?: string;
40
+ chain: string[];
41
+ }
42
+ /** 任务 envelope(图上一类记忆的规范化负载)。 */
43
+ export interface TaskEnvelope {
44
+ /** 协议版本 */
45
+ v: number;
46
+ /** 任务唯一 ID(内容寻址前的逻辑 id;由发起方生成) */
47
+ taskId: string;
48
+ /** 发起端 */
49
+ from: FleetEndpoint;
50
+ /** 目标端(`to.agent` 为 `*` 表示该设备任一 Agent 可领取) */
51
+ to: FleetEndpoint;
52
+ /** 意图/指令(人可读;执行语义由执行器解释) */
53
+ intent: string;
54
+ /** 负载引用(如 Blob/记忆节点 id;不在 envelope 内联大对象) */
55
+ payloadRef?: string;
56
+ /** 当前权威状态(显式状态事件驱动) */
57
+ status: TaskStatus;
58
+ /** 已尝试次数(至少一次投递 + 幂等应用;见 M1) */
59
+ attempts: number;
60
+ /** **软约定**:仅影响本机任务板展示;不参与跨端状态判定 */
61
+ expiresAt?: number;
62
+ /** 因果链 */
63
+ trace: FleetTrace;
64
+ }
65
+ /** 校验结果。 */
66
+ export interface EnvelopeValidation {
67
+ ok: boolean;
68
+ errors: string[];
69
+ }
70
+ /** 端标识守卫(`{device,agent}` 均为非空字符串)。 */
71
+ export declare function isFleetEndpoint(value: unknown): value is FleetEndpoint;
72
+ /** 状态判定。 */
73
+ export declare function isTaskStatus(value: unknown): value is TaskStatus;
74
+ /** 终态判定。 */
75
+ export declare function isTerminal(status: TaskStatus): boolean;
76
+ /**
77
+ * 确定性状态裁决:返回 `a` / `b` 中更靠后的那个(收敛用,与到达顺序无关)。
78
+ * 先比 `STATUS_RANK`;同秩(终态)比 `TERMINAL_PRECEDENCE`;再平局取字典序大的状态名。
79
+ */
80
+ export declare function resolveStatus(a: TaskStatus, b: TaskStatus): TaskStatus;
81
+ /**
82
+ * 合法迁移表(显式,避免跳级;与 `protocol/state-machine.json` 一致)。
83
+ * 非法迁移必须被拒绝(M1 负例)。
84
+ */
85
+ export declare const TASK_TRANSITIONS: Readonly<Record<TaskStatus, readonly TaskStatus[]>>;
86
+ /** 状态是否可迁移(`from === to` 视为幂等自迁移)。 */
87
+ export declare function canTransition(from: TaskStatus, to: TaskStatus): boolean;
88
+ /** 校验一个未知输入是否为合法 `TaskEnvelope`(不做数值语义裁决)。 */
89
+ export declare function validateEnvelope(input: unknown): EnvelopeValidation;
90
+ /** 序列化为**确定序** JSON(同一 envelope → 同一字节串)。 */
91
+ export declare function serializeEnvelope(envelope: TaskEnvelope): string;
92
+ /** 解析并校验;非法输入抛错(错误信息含全部违规项)。 */
93
+ export declare function parseEnvelope(json: string): TaskEnvelope;
94
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/protocol/envelope.ts"],"names":[],"mappings":"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"}