@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/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// @mebular/fleet —— 跨设备多 Agent 协作(任务=记忆)的公共入口。
|
|
2
|
+
//
|
|
3
|
+
// 边界(红线,见 DESIGN.md 与仓库 SEALING.md):
|
|
4
|
+
// - 只消费 `@mebular/core` 的**公共 API**(`import { ... } from '@mebular/core'`),
|
|
5
|
+
// 不得 `import` core 的内部路径(`src/**`);
|
|
6
|
+
// - core 不得反向依赖本包(`tests/fleet/boundary.test.ts` 强制);
|
|
7
|
+
// - 墙钟(`expiresAt`)不进一致性判定。
|
|
8
|
+
export * from './protocol/envelope.js';
|
|
9
|
+
export * from './protocol/events.js';
|
|
10
|
+
export * from './model.js';
|
|
11
|
+
export * from './quota.js';
|
|
12
|
+
export * from './agentdir.js';
|
|
13
|
+
export * from './surface.js';
|
|
14
|
+
export * from './config.js';
|
|
15
|
+
export * from './onboard.js';
|
|
16
|
+
export * from './security.js';
|
|
17
|
+
export * from './quickstart.js';
|
|
18
|
+
export * from './jointoken.js';
|
|
19
|
+
export * from './qr.js';
|
|
20
|
+
export * from './join.js';
|
|
21
|
+
export * from './collab/dag.js';
|
|
22
|
+
export * from './collab/tree.js';
|
|
23
|
+
export * from './collab/negotiation.js';
|
|
24
|
+
export * from './collab/chatter.js';
|
|
25
|
+
export * from './transport/types.js';
|
|
26
|
+
export * from './transport/spool.js';
|
|
27
|
+
export * from './transport/null.js';
|
|
28
|
+
export * from './store/file-store.js';
|
|
29
|
+
export * from './store/mebular-store.js';
|
|
30
|
+
export * from './store/message-store.js';
|
|
31
|
+
export * from './store/daemon-store.js';
|
|
32
|
+
export * from './runtime/planner.js';
|
|
33
|
+
export * from './runtime/fairness.js';
|
|
34
|
+
export * from './runtime/executor.js';
|
|
35
|
+
export * from './runtime/agent.js';
|
|
36
|
+
export * from './runtime/openchamber.js';
|
|
37
|
+
export * from './runtime/openchamber-http.js';
|
|
38
|
+
export * from './runtime/node.js';
|
|
39
|
+
export * from './runtime/worker.js';
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,qCAAqC;AACrC,4EAA4E;AAC5E,sCAAsC;AACtC,sDAAsD;AACtD,4BAA4B;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
package/dist/join.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type FleetAgentConfig } from './config.js';
|
|
2
|
+
import type { ServiceInstaller } from './quickstart.js';
|
|
3
|
+
export interface JoinWithTokenInput {
|
|
4
|
+
dir: string;
|
|
5
|
+
token: string;
|
|
6
|
+
device: string;
|
|
7
|
+
namespace?: string;
|
|
8
|
+
listen?: string;
|
|
9
|
+
agents: FleetAgentConfig[];
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
/** W2:同时配置统一守护(delegated 身份 + fleet daemon 客户端 + 令牌) */
|
|
12
|
+
daemon?: boolean;
|
|
13
|
+
daemonPort?: number;
|
|
14
|
+
joinPort?: number;
|
|
15
|
+
installDaemon?: ServiceInstaller;
|
|
16
|
+
}
|
|
17
|
+
export interface JoinWithTokenResult {
|
|
18
|
+
/** C2:写入地址簿的 hint 条数(0 = 旧令牌无 hints) */
|
|
19
|
+
hinted: number;
|
|
20
|
+
device: string;
|
|
21
|
+
dir: string;
|
|
22
|
+
peer: string;
|
|
23
|
+
namespace: string;
|
|
24
|
+
fingerprint: string;
|
|
25
|
+
alreadyJoined: boolean;
|
|
26
|
+
inviterDeviceId: string;
|
|
27
|
+
next: string[];
|
|
28
|
+
/** W2:统一守护配置结果 */
|
|
29
|
+
daemon?: {
|
|
30
|
+
endpoint: string;
|
|
31
|
+
installed: boolean;
|
|
32
|
+
note?: string;
|
|
33
|
+
};
|
|
34
|
+
/** W2:Agent MCP 配置片段 */
|
|
35
|
+
agentMcp: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* C2:把邀请方 hints 落盘到 `<dir>/net/peers.json`(0600)。
|
|
39
|
+
* 同时写 **deviceId 键**(可读)与 **peerId 键**(由 inviterPublicKey 派生,首次拨号即可命中)。
|
|
40
|
+
* 返回写入条数;无 hints(旧令牌)→ 0。任何失败都不应让 join 失败。
|
|
41
|
+
*/
|
|
42
|
+
export declare function persistInviterHints(dir: string, token: {
|
|
43
|
+
inviterDeviceId: string;
|
|
44
|
+
inviterPublicKey: string;
|
|
45
|
+
endpoints?: string[];
|
|
46
|
+
relaySeeds?: string[];
|
|
47
|
+
}): Promise<number>;
|
|
48
|
+
/** B:用令牌加入(**不持有主密钥私钥**)。 */
|
|
49
|
+
export declare function joinWithToken(input: JoinWithTokenInput): Promise<JoinWithTokenResult>;
|
|
50
|
+
//# sourceMappingURL=join.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../src/join.ts"],"names":[],"mappings":"AAUA,OAAO,EAQL,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKxD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,kBAAkB;IAClB,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlB;AAED,6BAA6B;AAC7B,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA2H3F"}
|
package/dist/join.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// 信任模型 v2(T2):B 持**加入令牌**加入(不复制主密钥)。
|
|
2
|
+
//
|
|
3
|
+
// 流程:生成设备密钥 → 向 inviter 的 join 端点请求**委派证书**(令牌验签/TTL/一次性)→
|
|
4
|
+
// 落盘身份文件(含证书链,**无主私钥**)→ 写**主公钥**文件 → onboard(登记 inviter 地址)→ 声明成员。
|
|
5
|
+
// 主密钥私钥全程不出现;inviter 可为**任意**在册设备。
|
|
6
|
+
import { access, mkdir, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { constants } from 'node:fs';
|
|
9
|
+
import { Mebular, IdentityManager, bytesToHex, hexToBytes, EndpointBook, FileEndpointStore, derivePeerIdHex, RELAY_SEEDS_KEY } from '@mebular/core';
|
|
10
|
+
import { fleetConfigPath, fleetMasterKeyPath, fleetStoragePath, loadFleetConfig, masterKeyFingerprint, readMasterKeyFile, writeMasterKeyFile, } from './config.js';
|
|
11
|
+
import { offlineMebularOptions, onboardDevice } from './onboard.js';
|
|
12
|
+
import { agentMcpConfig, configureDaemonHome } from './quickstart.js';
|
|
13
|
+
import { decodeJoinToken, requestJoin } from './jointoken.js';
|
|
14
|
+
/**
|
|
15
|
+
* C2:把邀请方 hints 落盘到 `<dir>/net/peers.json`(0600)。
|
|
16
|
+
* 同时写 **deviceId 键**(可读)与 **peerId 键**(由 inviterPublicKey 派生,首次拨号即可命中)。
|
|
17
|
+
* 返回写入条数;无 hints(旧令牌)→ 0。任何失败都不应让 join 失败。
|
|
18
|
+
*/
|
|
19
|
+
export async function persistInviterHints(dir, token) {
|
|
20
|
+
try {
|
|
21
|
+
const hints = Array.isArray(token.endpoints) ? token.endpoints.filter((a) => typeof a === 'string' && a.length > 0) : [];
|
|
22
|
+
const seeds = Array.isArray(token.relaySeeds) ? token.relaySeeds.filter((a) => typeof a === 'string' && a.length > 0) : [];
|
|
23
|
+
if (hints.length === 0 && seeds.length === 0)
|
|
24
|
+
return 0;
|
|
25
|
+
const book = new EndpointBook({ store: new FileEndpointStore(join(dir, 'net', 'peers.json')) });
|
|
26
|
+
await book.load();
|
|
27
|
+
let count = 0;
|
|
28
|
+
const keys = [token.inviterDeviceId];
|
|
29
|
+
try {
|
|
30
|
+
keys.push(derivePeerIdHex(hexToBytes(token.inviterPublicKey)));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// 公钥非法:只写 deviceId 键
|
|
34
|
+
}
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
if (hints.length > 0)
|
|
37
|
+
count += await book.upsert(key, hints, 'paired');
|
|
38
|
+
}
|
|
39
|
+
// relay seeds 存保留键(不是对端地址;app 启动时并入 libp2p.relayServers)
|
|
40
|
+
if (seeds.length > 0)
|
|
41
|
+
await book.upsert(RELAY_SEEDS_KEY, seeds, 'config');
|
|
42
|
+
return count;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** B:用令牌加入(**不持有主密钥私钥**)。 */
|
|
49
|
+
export async function joinWithToken(input) {
|
|
50
|
+
const token = decodeJoinToken(input.token);
|
|
51
|
+
const namespace = input.namespace ?? token.namespace;
|
|
52
|
+
const listen = input.listen ?? '/ip4/0.0.0.0/tcp/4001';
|
|
53
|
+
const alreadyJoined = await exists(fleetConfigPath(input.dir));
|
|
54
|
+
if (alreadyJoined) {
|
|
55
|
+
const existing = await loadFleetConfig(fleetConfigPath(input.dir));
|
|
56
|
+
if (existing.device !== input.device) {
|
|
57
|
+
throw new Error(`目录已被设备 ${existing.device} 占用(--dir ${input.dir});换目录或先停用。`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
await mkdir(input.dir, { recursive: true });
|
|
61
|
+
const storagePath = fleetStoragePath(input.dir);
|
|
62
|
+
const keyPath = fleetMasterKeyPath(input.dir);
|
|
63
|
+
let peerAddr;
|
|
64
|
+
let securityApproval;
|
|
65
|
+
if (!alreadyJoined) {
|
|
66
|
+
const im = new IdentityManager();
|
|
67
|
+
const deviceKey = await im.generateDeviceKey(input.device, input.device);
|
|
68
|
+
const issued = await requestJoin({
|
|
69
|
+
endpoint: token.endpoint,
|
|
70
|
+
token: input.token,
|
|
71
|
+
deviceId: input.device,
|
|
72
|
+
devicePublicKeyHex: bytesToHex(deviceKey.publicKey),
|
|
73
|
+
...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
|
|
74
|
+
});
|
|
75
|
+
peerAddr = issued.inviterMultiaddrs[0];
|
|
76
|
+
securityApproval = issued.securityApproval;
|
|
77
|
+
const privateKeyPkcs8 = await IdentityManager.exportPrivateKey(deviceKey.privateKey);
|
|
78
|
+
const record = {
|
|
79
|
+
deviceId: input.device,
|
|
80
|
+
deviceName: input.device,
|
|
81
|
+
publicKeyHex: bytesToHex(deviceKey.publicKey),
|
|
82
|
+
certificate: issued.certificate,
|
|
83
|
+
certificateChain: issued.chain,
|
|
84
|
+
createdAt: Date.now(),
|
|
85
|
+
privateKeyPkcs8,
|
|
86
|
+
};
|
|
87
|
+
await writeFile(`${storagePath}.identity.json`, JSON.stringify(record, null, 2), { mode: 0o600 });
|
|
88
|
+
const publicOnly = { userMasterKey: hexToBytes(token.masterPublicKey) };
|
|
89
|
+
await writeMasterKeyFile(keyPath, publicOnly);
|
|
90
|
+
}
|
|
91
|
+
// C2:把邀请方 hints(token.endpoints)写入本机地址簿 <dir>/net/peers.json(0600)
|
|
92
|
+
// 机制在 core(EndpointBook/FileEndpointStore),路径由 app 决定;不改变任何授权。
|
|
93
|
+
const hinted = await persistInviterHints(input.dir, token);
|
|
94
|
+
const onboard = await onboardDevice({
|
|
95
|
+
dir: input.dir,
|
|
96
|
+
device: input.device,
|
|
97
|
+
namespace,
|
|
98
|
+
listen,
|
|
99
|
+
agents: input.agents,
|
|
100
|
+
peerDevice: token.inviterDeviceId,
|
|
101
|
+
...(peerAddr !== undefined ? { peerAddr } : {}),
|
|
102
|
+
});
|
|
103
|
+
const config = onboard.config;
|
|
104
|
+
const encryption = await readMasterKeyFile(config.masterKeyFile);
|
|
105
|
+
const mebular = new Mebular(offlineMebularOptions(config, encryption));
|
|
106
|
+
await mebular.initialize();
|
|
107
|
+
try {
|
|
108
|
+
await mebular.declareNamespaceSubscription({
|
|
109
|
+
namespace,
|
|
110
|
+
active: true,
|
|
111
|
+
note: 'join-token self',
|
|
112
|
+
...(securityApproval !== undefined
|
|
113
|
+
? {
|
|
114
|
+
initiator: securityApproval.initiator,
|
|
115
|
+
nonce: securityApproval.nonce,
|
|
116
|
+
...(securityApproval.cosign !== undefined ? { cosign: securityApproval.cosign } : {}),
|
|
117
|
+
}
|
|
118
|
+
: {}),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await mebular.shutdown();
|
|
123
|
+
}
|
|
124
|
+
// W2 B2:delegated 守护 home(无主私钥)+ fleet daemon 客户端 + (可选)mebular-serve
|
|
125
|
+
let daemonInfo = null;
|
|
126
|
+
if (input.daemon === true) {
|
|
127
|
+
const publicKeyFile = join(input.dir, 'user-master-key.json');
|
|
128
|
+
await writeFile(publicKeyFile, JSON.stringify({ publicKey: Buffer.from(encryption.userMasterKey).toString('base64') }, null, 2), { mode: 0o600 });
|
|
129
|
+
const peer = peerAddr ?? config.peers[0]?.addr;
|
|
130
|
+
const peers = peer !== undefined ? [{ device: token.inviterDeviceId, addr: peer }] : [{ device: token.inviterDeviceId }];
|
|
131
|
+
const { endpoint } = await configureDaemonHome(input.dir, config, namespace, input.joinPort ?? 4002, input.daemonPort ?? 7331, { userMasterPublicKeyFile: publicKeyFile }, peers);
|
|
132
|
+
let installed = false;
|
|
133
|
+
let note;
|
|
134
|
+
if (input.installDaemon !== undefined) {
|
|
135
|
+
const outcome = await input.installDaemon(input.dir);
|
|
136
|
+
installed = outcome.installed;
|
|
137
|
+
note = outcome.note;
|
|
138
|
+
}
|
|
139
|
+
daemonInfo = { endpoint, installed, ...(note !== undefined ? { note } : {}) };
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
hinted,
|
|
143
|
+
device: config.device,
|
|
144
|
+
dir: config.dir,
|
|
145
|
+
peer: token.inviterDeviceId,
|
|
146
|
+
namespace,
|
|
147
|
+
fingerprint: masterKeyFingerprint(encryption.userMasterKey),
|
|
148
|
+
alreadyJoined,
|
|
149
|
+
inviterDeviceId: token.inviterDeviceId,
|
|
150
|
+
next: [
|
|
151
|
+
'本机已声明订阅;对端同步后即可互通(订阅零门槛,无需批准)',
|
|
152
|
+
...(hinted > 0 ? [`已写入邀请方地址 hints(${hinted} 条):本机可在无 --addr 时自动选路连通`] : ['令牌未携带地址 hints(旧令牌):首次连接仍需显式 --addr']),
|
|
153
|
+
],
|
|
154
|
+
...(daemonInfo !== null ? { daemon: daemonInfo } : {}),
|
|
155
|
+
agentMcp: agentMcpConfig(),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
async function exists(path) {
|
|
159
|
+
try {
|
|
160
|
+
await access(path, constants.F_OK);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=join.js.map
|
package/dist/join.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.js","sourceRoot":"","sources":["../src/join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { type Server } from 'node:http';
|
|
2
|
+
import { type DeviceCertificate, type Mebular } from '@mebular/core';
|
|
3
|
+
/** 令牌(inviter 设备私钥签名;不含主密钥)。 */
|
|
4
|
+
export interface JoinToken {
|
|
5
|
+
v: 1;
|
|
6
|
+
kind: 'mebular-fleet-join-token';
|
|
7
|
+
inviterDeviceId: string;
|
|
8
|
+
/** inviter 设备公钥(hex) */
|
|
9
|
+
inviterPublicKey: string;
|
|
10
|
+
/** inviter 的证书链(叶→根),供请求方与验签方锚定到主密钥 */
|
|
11
|
+
inviterChain: DeviceCertificate[];
|
|
12
|
+
/** 用户主公钥(hex;公开信息,非秘密) */
|
|
13
|
+
masterPublicKey: string;
|
|
14
|
+
namespace: string;
|
|
15
|
+
nonce: string;
|
|
16
|
+
issuedAt: number;
|
|
17
|
+
expiresAt: number;
|
|
18
|
+
/** join 服务端点(http(s)://host:port) */
|
|
19
|
+
endpoint: string;
|
|
20
|
+
/**
|
|
21
|
+
* C2:邀请方可达的 P2P 地址(multiaddr,新设备 join 后写入地址簿)。
|
|
22
|
+
* 旧令牌可缺省;缺省时 join 侧不写 hints(行为与历史一致)。
|
|
23
|
+
*/
|
|
24
|
+
endpoints?: string[];
|
|
25
|
+
/** C2:邀请方建议的 relay seeds(可选) */
|
|
26
|
+
relaySeeds?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* high 档首次订阅的会签证明(批准记录 + cosign)。新设备把它写进自己的
|
|
29
|
+
* `namespace_subscription`,证明随记录走、全网验收。
|
|
30
|
+
*/
|
|
31
|
+
securityApproval?: {
|
|
32
|
+
approvalId: string;
|
|
33
|
+
nonce: string;
|
|
34
|
+
initiator?: string;
|
|
35
|
+
cosign?: Record<string, unknown>;
|
|
36
|
+
};
|
|
37
|
+
/** C2:邀请方是否有公网可达地址(诊断提示用;仅信息,不参与授权) */
|
|
38
|
+
pubReachable?: boolean;
|
|
39
|
+
/** inviter 设备私钥对 canonical 数据的签名(base64) */
|
|
40
|
+
signature: string;
|
|
41
|
+
}
|
|
42
|
+
/** 令牌规范化签名内容(固定键序,排除 signature)。 */
|
|
43
|
+
export declare function canonicalJoinTokenData(token: Omit<JoinToken, 'signature'> & {
|
|
44
|
+
signature?: string;
|
|
45
|
+
}): string;
|
|
46
|
+
export declare function encodeJoinToken(token: JoinToken): string;
|
|
47
|
+
export declare function decodeJoinToken(text: string): JoinToken;
|
|
48
|
+
/** 脱敏描述:**不含签名**,供日志/报告。 */
|
|
49
|
+
export declare function describeJoinToken(token: JoinToken): Record<string, unknown>;
|
|
50
|
+
/** 令牌 nonce 状态文件(本地;0600)。 */
|
|
51
|
+
export interface JoinNonceState {
|
|
52
|
+
used: string[];
|
|
53
|
+
revoked: string[];
|
|
54
|
+
/**
|
|
55
|
+
* 当前唯一有效的邀请 nonce(旧状态文件可能没有)。
|
|
56
|
+
* 生成新令牌时把上一个 active 放入 revoked → 重新生成即让旧令牌失效。
|
|
57
|
+
*/
|
|
58
|
+
active?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function joinNonceStatePath(storagePath: string): string;
|
|
61
|
+
export declare function readJoinNonceState(storagePath: string): Promise<JoinNonceState>;
|
|
62
|
+
export declare function writeJoinNonceState(storagePath: string, state: JoinNonceState): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* 激活新邀请 nonce:把上一个 active 放入 revoked,再落盘新 active。
|
|
65
|
+
* 生成与兑换共用同一把锁(同进程内存队列 + <state>.lock 跨进程),避免并发丢更新。
|
|
66
|
+
*/
|
|
67
|
+
export declare function activateJoinInvite(storagePath: string, nonce: string): Promise<{
|
|
68
|
+
revoked: string | null;
|
|
69
|
+
}>;
|
|
70
|
+
/** 签发令牌(inviter 设备私钥)。 */
|
|
71
|
+
export declare function buildJoinToken(input: {
|
|
72
|
+
mebular: Mebular;
|
|
73
|
+
deviceId: string;
|
|
74
|
+
namespace: string;
|
|
75
|
+
endpoint: string;
|
|
76
|
+
ttlMs?: number;
|
|
77
|
+
now?: number;
|
|
78
|
+
nonce?: string;
|
|
79
|
+
/** C2:邀请方可达 P2P 地址(缺省自动从本机节点收集) */
|
|
80
|
+
endpoints?: string[];
|
|
81
|
+
relaySeeds?: string[];
|
|
82
|
+
pubReachable?: boolean;
|
|
83
|
+
/** high 档首次订阅会签(由控制台/CLI 的批准流程带入) */
|
|
84
|
+
securityApproval?: JoinToken['securityApproval'];
|
|
85
|
+
}): Promise<JoinToken>;
|
|
86
|
+
/** C2:本机可达 P2P 地址(节点监听 + /p2p/<peerId>;无节点则空)。 */
|
|
87
|
+
export declare function collectReachableEndpoints(mebular: Mebular): string[];
|
|
88
|
+
/**
|
|
89
|
+
* C2:可共享的 relay seeds(供新设备在无法直连时中转)。
|
|
90
|
+
* app 已把 `network.relaySeeds` 并入 `network.libp2p.relayServers`,此处经公开 getter 读取。
|
|
91
|
+
*/
|
|
92
|
+
export declare function collectRelaySeeds(mebular: Mebular): string[];
|
|
93
|
+
/** 地址是否为回环(用于 pubReachable 提示;判断失败按回环处理)。 */
|
|
94
|
+
export declare function isLoopbackAddress(address: string): boolean;
|
|
95
|
+
export interface VerifyJoinTokenOptions {
|
|
96
|
+
now?: number;
|
|
97
|
+
used?: readonly string[];
|
|
98
|
+
revoked?: readonly string[];
|
|
99
|
+
/** 仅接受该 inviter(join 服务端 = 本机时使用) */
|
|
100
|
+
expectedInviter?: string;
|
|
101
|
+
}
|
|
102
|
+
export type JoinTokenFailure = 'signature' | 'chain' | 'inviter' | 'expired' | 'used' | 'revoked';
|
|
103
|
+
/** 校验令牌:签名 → 链锚定主密钥 → inviter 匹配 → TTL → 一次性 → 撕票。 */
|
|
104
|
+
export declare function verifyJoinToken(token: JoinToken, opts?: VerifyJoinTokenOptions): Promise<{
|
|
105
|
+
ok: true;
|
|
106
|
+
} | {
|
|
107
|
+
ok: false;
|
|
108
|
+
reason: JoinTokenFailure;
|
|
109
|
+
}>;
|
|
110
|
+
/** inviter 证书链的指纹(诊断/去重;非密钥材料)。 */
|
|
111
|
+
export declare function chainFingerprint(chain: readonly DeviceCertificate[]): string;
|
|
112
|
+
export interface JoinServiceOptions {
|
|
113
|
+
mebular: Mebular;
|
|
114
|
+
deviceId: string;
|
|
115
|
+
storagePath: string;
|
|
116
|
+
/** 绑定地址(默认 0.0.0.0);令牌是 bearer,建议 LAN + 短 TTL */
|
|
117
|
+
bind?: string;
|
|
118
|
+
/** 端口(默认 0 = 随机;quickstart 默认 4002) */
|
|
119
|
+
port: number;
|
|
120
|
+
log?: (msg: string) => void;
|
|
121
|
+
}
|
|
122
|
+
export interface JoinService {
|
|
123
|
+
server: Server;
|
|
124
|
+
port: number;
|
|
125
|
+
close: () => Promise<void>;
|
|
126
|
+
}
|
|
127
|
+
export declare function startJoinService(opts: JoinServiceOptions): Promise<JoinService>;
|
|
128
|
+
export interface JoinRequestResult {
|
|
129
|
+
certificate: DeviceCertificate;
|
|
130
|
+
chain: DeviceCertificate[];
|
|
131
|
+
namespace: string;
|
|
132
|
+
inviterDeviceId: string;
|
|
133
|
+
inviterMultiaddrs: string[];
|
|
134
|
+
securityApproval?: JoinToken['securityApproval'];
|
|
135
|
+
}
|
|
136
|
+
/** B 持令牌向 inviter 的 join 端点请求委派证书(纯 HTTP;令牌是 bearer)。 */
|
|
137
|
+
export declare function requestJoin(input: {
|
|
138
|
+
endpoint: string;
|
|
139
|
+
token: string;
|
|
140
|
+
deviceId: string;
|
|
141
|
+
devicePublicKeyHex: string;
|
|
142
|
+
timeoutMs?: number;
|
|
143
|
+
}): Promise<JoinRequestResult>;
|
|
144
|
+
//# sourceMappingURL=jointoken.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jointoken.d.ts","sourceRoot":"","sources":["../src/jointoken.ts"],"names":[],"mappings":"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"}
|