@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
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Mebular Fleet —— 任务 envelope 与显式状态机(M0 骨架;M1 扩展为完整模型)。
|
|
2
|
+
//
|
|
3
|
+
// **任务 = 记忆**:任务是一类带 `namespace`(如 `tasks`)的图上记忆,生命周期由**显式状态事件**
|
|
4
|
+
// 驱动;`expiresAt` 只是本机任务板的**软约定**,不参与跨端一致性判定(见 `SEALING.md` 红线:
|
|
5
|
+
// 墙钟不进一致性判定)。本文件**只消费 `@mebular/core` 的公共 API**,不在 core 引入任务语义。
|
|
6
|
+
/** 协议版本(envelope 线格式版本;改动 = 破坏性,需全端同版本)。 */
|
|
7
|
+
export const FLEET_PROTOCOL_VERSION = 1;
|
|
8
|
+
/**
|
|
9
|
+
* 任务状态(**单调秩**,用于并发/乱序下的确定性收敛):
|
|
10
|
+
* - `queued` → `claimed` → `running` → `done` | `failed`
|
|
11
|
+
* - `done` / `failed` 为**终态**(同秩,平局由 `TERMINAL_PRECEDENCE` 兜底)。
|
|
12
|
+
*/
|
|
13
|
+
export const TASK_STATUSES = ['queued', 'claimed', 'running', 'done', 'failed'];
|
|
14
|
+
/** 状态秩:`done`/`failed` 同秩(终态),其余严格递增。 */
|
|
15
|
+
export const STATUS_RANK = {
|
|
16
|
+
queued: 0,
|
|
17
|
+
claimed: 1,
|
|
18
|
+
running: 2,
|
|
19
|
+
done: 3,
|
|
20
|
+
failed: 3,
|
|
21
|
+
};
|
|
22
|
+
/** 终态平局裁决:数值大者胜(确定性)。 */
|
|
23
|
+
export const TERMINAL_PRECEDENCE = {
|
|
24
|
+
queued: 0,
|
|
25
|
+
claimed: 0,
|
|
26
|
+
running: 0,
|
|
27
|
+
failed: 2,
|
|
28
|
+
done: 1,
|
|
29
|
+
};
|
|
30
|
+
/** root 级派发策略:`children-ok`(默认,可派生)| `root-only`(执行者只能干、不得再派)。 */
|
|
31
|
+
export const DISPATCH_POLICIES = ['children-ok', 'root-only'];
|
|
32
|
+
/** root 预算默认值(W1 上界,可由 root 收紧)。 */
|
|
33
|
+
export const DEFAULT_ROOT_BUDGET = { maxDepth: 8, maxChildren: 16, maxTasks: 256 };
|
|
34
|
+
/** 预算合法性(非负整数;越界由树不变式判定,这里只做形状)。 */
|
|
35
|
+
export function isTaskBudget(value) {
|
|
36
|
+
if (typeof value !== 'object' || value === null)
|
|
37
|
+
return false;
|
|
38
|
+
const b = value;
|
|
39
|
+
return (Number.isInteger(b.maxDepth) && b.maxDepth >= 0 &&
|
|
40
|
+
Number.isInteger(b.maxChildren) && b.maxChildren >= 0 &&
|
|
41
|
+
Number.isInteger(b.maxTasks) && b.maxTasks >= 0);
|
|
42
|
+
}
|
|
43
|
+
/** 派发策略守卫。 */
|
|
44
|
+
export function isTaskDispatch(value) {
|
|
45
|
+
return typeof value === 'string' && DISPATCH_POLICIES.includes(value);
|
|
46
|
+
}
|
|
47
|
+
function isNonEmptyString(value) {
|
|
48
|
+
return typeof value === 'string' && value.length > 0;
|
|
49
|
+
}
|
|
50
|
+
/** 端标识守卫(`{device,agent}` 均为非空字符串)。 */
|
|
51
|
+
export function isFleetEndpoint(value) {
|
|
52
|
+
if (typeof value !== 'object' || value === null)
|
|
53
|
+
return false;
|
|
54
|
+
const e = value;
|
|
55
|
+
return isNonEmptyString(e.device) && isNonEmptyString(e.agent);
|
|
56
|
+
}
|
|
57
|
+
/** 状态判定。 */
|
|
58
|
+
export function isTaskStatus(value) {
|
|
59
|
+
return typeof value === 'string' && TASK_STATUSES.includes(value);
|
|
60
|
+
}
|
|
61
|
+
/** 终态判定。 */
|
|
62
|
+
export function isTerminal(status) {
|
|
63
|
+
return status === 'done' || status === 'failed';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 确定性状态裁决:返回 `a` / `b` 中更靠后的那个(收敛用,与到达顺序无关)。
|
|
67
|
+
* 先比 `STATUS_RANK`;同秩(终态)比 `TERMINAL_PRECEDENCE`;再平局取字典序大的状态名。
|
|
68
|
+
*/
|
|
69
|
+
export function resolveStatus(a, b) {
|
|
70
|
+
if (STATUS_RANK[a] !== STATUS_RANK[b])
|
|
71
|
+
return STATUS_RANK[a] > STATUS_RANK[b] ? a : b;
|
|
72
|
+
if (TERMINAL_PRECEDENCE[a] !== TERMINAL_PRECEDENCE[b]) {
|
|
73
|
+
return TERMINAL_PRECEDENCE[a] > TERMINAL_PRECEDENCE[b] ? a : b;
|
|
74
|
+
}
|
|
75
|
+
return a >= b ? a : b;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 合法迁移表(显式,避免跳级;与 `protocol/state-machine.json` 一致)。
|
|
79
|
+
* 非法迁移必须被拒绝(M1 负例)。
|
|
80
|
+
*/
|
|
81
|
+
export const TASK_TRANSITIONS = {
|
|
82
|
+
queued: ['claimed', 'failed'],
|
|
83
|
+
claimed: ['running', 'failed'],
|
|
84
|
+
running: ['done', 'failed'],
|
|
85
|
+
done: [],
|
|
86
|
+
failed: [],
|
|
87
|
+
};
|
|
88
|
+
/** 状态是否可迁移(`from === to` 视为幂等自迁移)。 */
|
|
89
|
+
export function canTransition(from, to) {
|
|
90
|
+
if (from === to)
|
|
91
|
+
return true;
|
|
92
|
+
return TASK_TRANSITIONS[from].includes(to);
|
|
93
|
+
}
|
|
94
|
+
/** 校验一个未知输入是否为合法 `TaskEnvelope`(不做数值语义裁决)。 */
|
|
95
|
+
export function validateEnvelope(input) {
|
|
96
|
+
const errors = [];
|
|
97
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
98
|
+
return { ok: false, errors: ['envelope 必须是对象'] };
|
|
99
|
+
}
|
|
100
|
+
const e = input;
|
|
101
|
+
if (e.v !== FLEET_PROTOCOL_VERSION)
|
|
102
|
+
errors.push(`v 必须为 ${FLEET_PROTOCOL_VERSION}`);
|
|
103
|
+
if (!isNonEmptyString(e.taskId))
|
|
104
|
+
errors.push('taskId 必须为非空字符串');
|
|
105
|
+
if (!isFleetEndpoint(e.from))
|
|
106
|
+
errors.push('from 必须为 {device,agent} 非空字符串');
|
|
107
|
+
if (!isFleetEndpoint(e.to))
|
|
108
|
+
errors.push('to 必须为 {device,agent} 非空字符串');
|
|
109
|
+
if (!isNonEmptyString(e.intent))
|
|
110
|
+
errors.push('intent 必须为非空字符串');
|
|
111
|
+
if (e.payloadRef !== undefined && !isNonEmptyString(e.payloadRef)) {
|
|
112
|
+
errors.push('payloadRef 若存在须为非空字符串');
|
|
113
|
+
}
|
|
114
|
+
if (!isTaskStatus(e.status))
|
|
115
|
+
errors.push(`status 必须为 ${TASK_STATUSES.join('|')}`);
|
|
116
|
+
if (typeof e.attempts !== 'number' || !Number.isInteger(e.attempts) || e.attempts < 0) {
|
|
117
|
+
errors.push('attempts 必须为非负整数');
|
|
118
|
+
}
|
|
119
|
+
if (e.expiresAt !== undefined && (typeof e.expiresAt !== 'number' || !Number.isFinite(e.expiresAt))) {
|
|
120
|
+
errors.push('expiresAt 若存在须为有限数字(软约定,不参与跨端状态)');
|
|
121
|
+
}
|
|
122
|
+
if (typeof e.trace !== 'object' || e.trace === null) {
|
|
123
|
+
errors.push('trace 必须为对象');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
const trace = e.trace;
|
|
127
|
+
if (trace.causedBy !== undefined && !isNonEmptyString(trace.causedBy)) {
|
|
128
|
+
errors.push('trace.causedBy 若存在须为非空字符串');
|
|
129
|
+
}
|
|
130
|
+
if (!Array.isArray(trace.chain) || !trace.chain.every(isNonEmptyString)) {
|
|
131
|
+
errors.push('trace.chain 必须为字符串数组');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return { ok: errors.length === 0, errors };
|
|
135
|
+
}
|
|
136
|
+
/** 递归键序规范化(键按字典序,`undefined` 丢弃)→ 同一对象恒得同一字节串。 */
|
|
137
|
+
function canonicalize(input) {
|
|
138
|
+
if (Array.isArray(input))
|
|
139
|
+
return input.map(canonicalize);
|
|
140
|
+
if (typeof input === 'object' && input !== null) {
|
|
141
|
+
const src = input;
|
|
142
|
+
const out = {};
|
|
143
|
+
for (const key of Object.keys(src).sort()) {
|
|
144
|
+
if (src[key] !== undefined)
|
|
145
|
+
out[key] = canonicalize(src[key]);
|
|
146
|
+
}
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
return input;
|
|
150
|
+
}
|
|
151
|
+
/** 序列化为**确定序** JSON(同一 envelope → 同一字节串)。 */
|
|
152
|
+
export function serializeEnvelope(envelope) {
|
|
153
|
+
return JSON.stringify(canonicalize(envelope));
|
|
154
|
+
}
|
|
155
|
+
/** 解析并校验;非法输入抛错(错误信息含全部违规项)。 */
|
|
156
|
+
export function parseEnvelope(json) {
|
|
157
|
+
let raw;
|
|
158
|
+
try {
|
|
159
|
+
raw = JSON.parse(json);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error(`envelope JSON 解析失败:${error.message}`);
|
|
163
|
+
}
|
|
164
|
+
const result = validateEnvelope(raw);
|
|
165
|
+
if (!result.ok)
|
|
166
|
+
throw new Error(`envelope 非法:${result.errors.join('; ')}`);
|
|
167
|
+
return raw;
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/protocol/envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type FleetEndpoint, type FleetTrace, type TaskBudget, type TaskDispatch, type TaskStatus } from './envelope.js';
|
|
2
|
+
/** 事件类型。 */
|
|
3
|
+
export declare const TASK_EVENT_TYPES: readonly ["created", "claimed", "running", "done", "failed"];
|
|
4
|
+
export type TaskEventType = (typeof TASK_EVENT_TYPES)[number];
|
|
5
|
+
/** 事件类型 → 目标权威状态(一一对应)。 */
|
|
6
|
+
export declare const EVENT_TO_STATUS: Readonly<Record<TaskEventType, TaskStatus>>;
|
|
7
|
+
/** 任务事件(线格式)。 */
|
|
8
|
+
export interface TaskEvent {
|
|
9
|
+
/** 协议版本 */
|
|
10
|
+
v: number;
|
|
11
|
+
/** 事件唯一 ID(内容寻址或全局唯一;**幂等键**:重复投递按此去重) */
|
|
12
|
+
eventId: string;
|
|
13
|
+
/** 所属任务 */
|
|
14
|
+
taskId: string;
|
|
15
|
+
/** 事件类型 */
|
|
16
|
+
type: TaskEventType;
|
|
17
|
+
/** 发出该事件的端 */
|
|
18
|
+
actor: FleetEndpoint;
|
|
19
|
+
/** 本机墙钟(**advisory**:不参与收敛) */
|
|
20
|
+
at: number;
|
|
21
|
+
/** 迁移后的权威状态(必须与 `type` 一致) */
|
|
22
|
+
toStatus: TaskStatus;
|
|
23
|
+
/** 因果链 */
|
|
24
|
+
trace: FleetTrace;
|
|
25
|
+
/** `created` 事件必填:目标端 */
|
|
26
|
+
to?: FleetEndpoint;
|
|
27
|
+
/** `created` 事件必填:意图 */
|
|
28
|
+
intent?: string;
|
|
29
|
+
/** `created` 事件可选:**软约定**到期(不参与权威判定) */
|
|
30
|
+
expiresAt?: number;
|
|
31
|
+
/** 结果/负载引用(`done` 常带) */
|
|
32
|
+
payloadRef?: string;
|
|
33
|
+
/** 失败原因(`failed` 常带) */
|
|
34
|
+
reason?: string;
|
|
35
|
+
/** **W1**:`created` 可声明子树预算(随树单调递减;缺省 root 用默认/子任务按父推导) */
|
|
36
|
+
budget?: TaskBudget;
|
|
37
|
+
/** **W1**:`created`(root)可声明派发策略;缺省 `children-ok` */
|
|
38
|
+
dispatch?: TaskDispatch;
|
|
39
|
+
}
|
|
40
|
+
/** 事件类型守卫。 */
|
|
41
|
+
export declare function isTaskEventType(value: unknown): value is TaskEventType;
|
|
42
|
+
/** 校验结果。 */
|
|
43
|
+
export interface TaskEventValidation {
|
|
44
|
+
ok: boolean;
|
|
45
|
+
errors: string[];
|
|
46
|
+
}
|
|
47
|
+
/** 校验未知输入是否为合法 `TaskEvent`(不做迁移合法性判定)。 */
|
|
48
|
+
export declare function validateTaskEvent(input: unknown): TaskEventValidation;
|
|
49
|
+
/** 便于测试/构造的校验快捷键。 */
|
|
50
|
+
export declare function isTaskEvent(input: unknown): input is TaskEvent;
|
|
51
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/protocol/events.ts"],"names":[],"mappings":"AAMA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB,YAAY;AACZ,eAAO,MAAM,gBAAgB,8DAA+D,CAAC;AAC7F,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,2BAA2B;AAC3B,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAMvE,CAAC;AAEF,iBAAiB;AACjB,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,CAAC,EAAE,MAAM,CAAC;IACV,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,IAAI,EAAE,aAAa,CAAC;IACpB,cAAc;IACd,KAAK,EAAE,aAAa,CAAC;IACrB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU;IACV,KAAK,EAAE,UAAU,CAAC;IAClB,yBAAyB;IACzB,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,cAAc;AACd,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,YAAY;AACZ,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CA+CrE;AAED,qBAAqB;AACrB,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Fleet 任务事件(M1):**显式状态事件**驱动权威生命周期。
|
|
2
|
+
//
|
|
3
|
+
// 事件是任务(一类记忆)上的状态迁移记录。`at` 是**本机墙钟**,仅用于展示与本地排队,
|
|
4
|
+
// **不参与**权威状态判定(见 `SEALING.md`:墙钟不进一致性判定)。收敛只由
|
|
5
|
+
// `(状态秩, 终态平局裁决, eventId)` 决定(见 `model.ts`)。
|
|
6
|
+
import { FLEET_PROTOCOL_VERSION, isTaskStatus, isFleetEndpoint, isTaskBudget, isTaskDispatch, } from './envelope.js';
|
|
7
|
+
/** 事件类型。 */
|
|
8
|
+
export const TASK_EVENT_TYPES = ['created', 'claimed', 'running', 'done', 'failed'];
|
|
9
|
+
/** 事件类型 → 目标权威状态(一一对应)。 */
|
|
10
|
+
export const EVENT_TO_STATUS = {
|
|
11
|
+
created: 'queued',
|
|
12
|
+
claimed: 'claimed',
|
|
13
|
+
running: 'running',
|
|
14
|
+
done: 'done',
|
|
15
|
+
failed: 'failed',
|
|
16
|
+
};
|
|
17
|
+
/** 事件类型守卫。 */
|
|
18
|
+
export function isTaskEventType(value) {
|
|
19
|
+
return typeof value === 'string' && TASK_EVENT_TYPES.includes(value);
|
|
20
|
+
}
|
|
21
|
+
function isNonEmptyString(value) {
|
|
22
|
+
return typeof value === 'string' && value.length > 0;
|
|
23
|
+
}
|
|
24
|
+
/** 校验未知输入是否为合法 `TaskEvent`(不做迁移合法性判定)。 */
|
|
25
|
+
export function validateTaskEvent(input) {
|
|
26
|
+
const errors = [];
|
|
27
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
28
|
+
return { ok: false, errors: ['event 必须是对象'] };
|
|
29
|
+
}
|
|
30
|
+
const e = input;
|
|
31
|
+
if (e.v !== FLEET_PROTOCOL_VERSION)
|
|
32
|
+
errors.push(`v 必须为 ${FLEET_PROTOCOL_VERSION}`);
|
|
33
|
+
if (!isNonEmptyString(e.eventId))
|
|
34
|
+
errors.push('eventId 必须为非空字符串');
|
|
35
|
+
if (!isNonEmptyString(e.taskId))
|
|
36
|
+
errors.push('taskId 必须为非空字符串');
|
|
37
|
+
if (!isTaskEventType(e.type))
|
|
38
|
+
errors.push(`type 必须为 ${TASK_EVENT_TYPES.join('|')}`);
|
|
39
|
+
if (!isFleetEndpoint(e.actor))
|
|
40
|
+
errors.push('actor 必须为 {device,agent} 非空字符串');
|
|
41
|
+
if (typeof e.at !== 'number' || !Number.isFinite(e.at))
|
|
42
|
+
errors.push('at 必须为有限数字');
|
|
43
|
+
if (!isTaskStatus(e.toStatus))
|
|
44
|
+
errors.push('toStatus 必须为合法任务状态');
|
|
45
|
+
else if (isTaskEventType(e.type) && EVENT_TO_STATUS[e.type] !== e.toStatus) {
|
|
46
|
+
errors.push(`toStatus 必须与 type 一致(${e.type} → ${EVENT_TO_STATUS[e.type]})`);
|
|
47
|
+
}
|
|
48
|
+
if (typeof e.trace !== 'object' || e.trace === null) {
|
|
49
|
+
errors.push('trace 必须为对象');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const trace = e.trace;
|
|
53
|
+
if (trace.causedBy !== undefined && !isNonEmptyString(trace.causedBy)) {
|
|
54
|
+
errors.push('trace.causedBy 若存在须为非空字符串');
|
|
55
|
+
}
|
|
56
|
+
if (!Array.isArray(trace.chain) || !trace.chain.every(isNonEmptyString)) {
|
|
57
|
+
errors.push('trace.chain 必须为字符串数组');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (e.payloadRef !== undefined && !isNonEmptyString(e.payloadRef)) {
|
|
61
|
+
errors.push('payloadRef 若存在须为非空字符串');
|
|
62
|
+
}
|
|
63
|
+
if (e.reason !== undefined && !isNonEmptyString(e.reason)) {
|
|
64
|
+
errors.push('reason 若存在须为非空字符串');
|
|
65
|
+
}
|
|
66
|
+
if (e.type === 'created') {
|
|
67
|
+
if (!isFleetEndpoint(e.to))
|
|
68
|
+
errors.push('created 事件的 to 必须为 {device,agent}');
|
|
69
|
+
if (!isNonEmptyString(e.intent))
|
|
70
|
+
errors.push('created 事件的 intent 必须为非空字符串');
|
|
71
|
+
}
|
|
72
|
+
if (e.expiresAt !== undefined && (typeof e.expiresAt !== 'number' || !Number.isFinite(e.expiresAt))) {
|
|
73
|
+
errors.push('expiresAt 若存在须为有限数字(advisory)');
|
|
74
|
+
}
|
|
75
|
+
if (e.budget !== undefined && !isTaskBudget(e.budget)) {
|
|
76
|
+
errors.push('budget 若存在须为 {maxDepth,maxChildren,maxTasks} 非负整数');
|
|
77
|
+
}
|
|
78
|
+
if (e.dispatch !== undefined && !isTaskDispatch(e.dispatch)) {
|
|
79
|
+
errors.push('dispatch 若存在须为 children-ok|root-only');
|
|
80
|
+
}
|
|
81
|
+
return { ok: errors.length === 0, errors };
|
|
82
|
+
}
|
|
83
|
+
/** 便于测试/构造的校验快捷键。 */
|
|
84
|
+
export function isTaskEvent(input) {
|
|
85
|
+
return validateTaskEvent(input).ok;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/protocol/events.ts"],"names":[],"mappings":"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"}
|
package/dist/qr.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface QrRenderResult {
|
|
2
|
+
/** 渲染产物(terminal/svg) */
|
|
3
|
+
value: string;
|
|
4
|
+
/** 渲染形态 */
|
|
5
|
+
kind: 'terminal' | 'svg';
|
|
6
|
+
}
|
|
7
|
+
export interface QrOptions {
|
|
8
|
+
/** 非致命渲染告警;调用方回退文本令牌/分组文本 */
|
|
9
|
+
onWarn?: (message: string) => void;
|
|
10
|
+
}
|
|
11
|
+
/** 终端二维码(ANSI 黑字白底;内容=令牌文本) */
|
|
12
|
+
export declare function renderTerminalQr(text: string, options?: QrOptions): Promise<QrRenderResult | null>;
|
|
13
|
+
/** SVG(控制台服务端渲染;前端以 data-uri <img> 展示,避免注入) */
|
|
14
|
+
export declare function renderSvgQr(text: string, options?: QrOptions): Promise<QrRenderResult | null>;
|
|
15
|
+
//# sourceMappingURL=qr.d.ts.map
|
package/dist/qr.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AA+BD,+BAA+B;AAC/B,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAO5G;AAED,+CAA+C;AAC/C,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAQvG"}
|
package/dist/qr.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// C7 · 配对二维码渲染(应用层能力;`qrcode-generator` 为普通运行时依赖)
|
|
2
|
+
//
|
|
3
|
+
// 语义:QR 内容 = **内联令牌文本本身**(不引自定义 scheme);因此任何扫码器/文本通道等价。
|
|
4
|
+
// 降级:编码失败 → 返回 null + 告警(**只给文本,不报错**)——绝不阻断邀请/加入。
|
|
5
|
+
import qrcode from 'qrcode-generator';
|
|
6
|
+
function makeQr(text) {
|
|
7
|
+
const qr = qrcode(0, 'M');
|
|
8
|
+
qr.addData(text);
|
|
9
|
+
qr.make();
|
|
10
|
+
return qr;
|
|
11
|
+
}
|
|
12
|
+
function errorText(error) {
|
|
13
|
+
return error instanceof Error ? error.message : String(error);
|
|
14
|
+
}
|
|
15
|
+
// qrcode-generator 的 ASCII 画法是「亮模块 = 块字符」,只适合深色终端。
|
|
16
|
+
// 反相后固定 ANSI 黑字白底,使任何主题下都保持标准极性。
|
|
17
|
+
const TERMINAL_INVERT = { ' ': '█', '▀': '▄', '▄': '▀', '█': ' ' };
|
|
18
|
+
function invertTerminalArt(art) {
|
|
19
|
+
const lines = art.split('\n');
|
|
20
|
+
return lines
|
|
21
|
+
.map((line, index) => {
|
|
22
|
+
// QR module count 恒为奇数(17 + 4n),四模块静区使最后一行半行全是静区:
|
|
23
|
+
// 保持白色,避免反相成黑条。
|
|
24
|
+
const rendered = index === lines.length - 1
|
|
25
|
+
? ' '.repeat(line.length)
|
|
26
|
+
: line.replace(/[█▀▄ ]/g, (ch) => TERMINAL_INVERT[ch] ?? ch);
|
|
27
|
+
return `\x1b[30;47m${rendered}\x1b[0m`;
|
|
28
|
+
})
|
|
29
|
+
.join('\n');
|
|
30
|
+
}
|
|
31
|
+
/** 终端二维码(ANSI 黑字白底;内容=令牌文本) */
|
|
32
|
+
export async function renderTerminalQr(text, options = {}) {
|
|
33
|
+
try {
|
|
34
|
+
return { value: invertTerminalArt(makeQr(text).createASCII(1, 4)), kind: 'terminal' };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
options.onWarn?.(`二维码:终端渲染失败(${errorText(error)})`);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** SVG(控制台服务端渲染;前端以 data-uri <img> 展示,避免注入) */
|
|
42
|
+
export async function renderSvgQr(text, options = {}) {
|
|
43
|
+
try {
|
|
44
|
+
const value = makeQr(text).createSvgTag({ cellSize: 4, margin: 1 });
|
|
45
|
+
return { value, kind: 'svg' };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
options.onWarn?.(`二维码:SVG 渲染失败(${errorText(error)})`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=qr.js.map
|
package/dist/qr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,wDAAwD;AACxD,mDAAmD;AAEnD,OAAO,MAAM,MAAM,kBAAkB,CAAC;AActC,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,EAAE,CAAC,IAAI,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,mDAAmD;AACnD,iCAAiC;AACjC,MAAM,eAAe,GAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAE3F,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,kDAAkD;QAClD,gBAAgB;QAChB,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACzB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,OAAO,cAAc,QAAQ,SAAS,CAAC;IACzC,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,+BAA+B;AAC/B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,UAAqB,EAAE;IAC1E,IAAI,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACxF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,EAAE,CAAC,cAAc,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,UAAqB,EAAE;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,EAAE,CAAC,gBAAgB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { type FleetAgentConfig, type FleetConfig } from './config.js';
|
|
2
|
+
/** 加入码内信任材料的记录形状(Stage 2 将由令牌取代)。 */
|
|
3
|
+
export interface JoinTrustMaterial {
|
|
4
|
+
publicKey: string;
|
|
5
|
+
privateKeyPkcs8: string;
|
|
6
|
+
}
|
|
7
|
+
export interface JoinCode {
|
|
8
|
+
v: 1;
|
|
9
|
+
kind: 'mebular-fleet-join';
|
|
10
|
+
/** 生成方的构建 SHA(join 侧版本核对;不一致即拒绝) */
|
|
11
|
+
sha: string;
|
|
12
|
+
/** A 的 deviceId */
|
|
13
|
+
device: string;
|
|
14
|
+
namespace: string;
|
|
15
|
+
/** A 的可达 multiaddr(含 /p2p/<id>),跨网回退用 */
|
|
16
|
+
multiaddrs: string[];
|
|
17
|
+
fingerprint: string;
|
|
18
|
+
issuedAt: number;
|
|
19
|
+
trust: JoinTrustMaterial;
|
|
20
|
+
note?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface AgentProbe {
|
|
23
|
+
agents: FleetAgentConfig[];
|
|
24
|
+
sources: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface ServiceInstallOutcome {
|
|
27
|
+
installed: boolean;
|
|
28
|
+
note?: string;
|
|
29
|
+
}
|
|
30
|
+
export type ServiceInstaller = (dir: string) => Promise<ServiceInstallOutcome>;
|
|
31
|
+
/** 默认设备名:主机名清洗(小写、非法字符→`-`、去首尾 `-`)。 */
|
|
32
|
+
export declare function sanitizeDeviceName(name: string): string;
|
|
33
|
+
export declare function defaultDeviceName(host?: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* 默认设备目录:`FLEET_DIR` → `MEBULAR_HOME` → `~/.mebular`(W2 一机一节点统一 home)。
|
|
36
|
+
* 旧 `~/.fleet` 仅作 **embedded 测试模式**(`--dir` 显式指定)。
|
|
37
|
+
*/
|
|
38
|
+
export declare function defaultFleetDir(env?: NodeJS.ProcessEnv): string;
|
|
39
|
+
/** PATH 中是否存在可执行文件(Windows 尝试 PATHEXT 扩展)。 */
|
|
40
|
+
export declare function commandExists(command: string, env?: NodeJS.ProcessEnv, platform?: string): boolean;
|
|
41
|
+
/** agent 自动探测:PATH 有 hermes → hermes;存在 `MEBULAR_FLEET_OPENCHAMBER_*` → openchamber;否则 echo。 */
|
|
42
|
+
export declare function detectAgents(env?: NodeJS.ProcessEnv, platform?: string): AgentProbe;
|
|
43
|
+
/** 端口占用检查:占用 → 抛清晰错误 + 建议(`tcp/0` 表示随机端口,跳过)。 */
|
|
44
|
+
export declare function assertListenAvailable(listen: string): Promise<void>;
|
|
45
|
+
/** 解析加入码:接受内联 base64 或其文本内容(兼容直接粘贴 JSON)。 */
|
|
46
|
+
export declare function decodeJoinCode(text: string): JoinCode;
|
|
47
|
+
/** 加入码 → 内联 base64。 */
|
|
48
|
+
export declare function encodeJoinCode(code: JoinCode): string;
|
|
49
|
+
/** 脱敏描述(**不含信任材料**,可用于日志/报告)。 */
|
|
50
|
+
export declare function describeJoinCode(code: JoinCode): Record<string, unknown>;
|
|
51
|
+
/** 写加入码文件(0600)。 */
|
|
52
|
+
export declare function writeJoinCodeFile(path: string, inline: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* 构建 SHA 的**环境覆盖**(CLI 传入真实 `version.json` 值)。
|
|
55
|
+
* 本模块刻意不读 `import.meta`(ts-jest 以 CJS 加载 src,会编译失败);
|
|
56
|
+
* 缺省 `unknown` → 版本核对自动跳过。
|
|
57
|
+
*/
|
|
58
|
+
export declare function envBuildSha(env?: NodeJS.ProcessEnv): string;
|
|
59
|
+
export interface QuickstartInput {
|
|
60
|
+
dir: string;
|
|
61
|
+
device: string;
|
|
62
|
+
namespace?: string;
|
|
63
|
+
listen?: string;
|
|
64
|
+
codeFile?: string;
|
|
65
|
+
joinPort?: number;
|
|
66
|
+
joinHost?: string;
|
|
67
|
+
agents?: FleetAgentConfig[];
|
|
68
|
+
/** W2:同时配置**统一守护**(写 <dir>/config.json + fleet daemon 客户端 + 装 mebular-serve) */
|
|
69
|
+
daemon?: boolean;
|
|
70
|
+
/** 守护 MCP/app 端口(默认 7331) */
|
|
71
|
+
daemonPort?: number;
|
|
72
|
+
/** 守护服务安装回调(mebular-serve) */
|
|
73
|
+
installDaemon?: ServiceInstaller;
|
|
74
|
+
/** 服务安装回调;缺省 = 不安装(CLI 传真实安装器) */
|
|
75
|
+
installService?: ServiceInstaller;
|
|
76
|
+
/** 跳过端口占用检查(测试用) */
|
|
77
|
+
skipPortCheck?: boolean;
|
|
78
|
+
/** 覆盖构建 SHA(测试用) */
|
|
79
|
+
buildSha?: string;
|
|
80
|
+
/** 覆盖探测环境(测试用) */
|
|
81
|
+
env?: NodeJS.ProcessEnv;
|
|
82
|
+
platform?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface QuickstartResult {
|
|
85
|
+
device: string;
|
|
86
|
+
dir: string;
|
|
87
|
+
namespace: string;
|
|
88
|
+
fingerprint: string;
|
|
89
|
+
code: string;
|
|
90
|
+
codeFile?: string;
|
|
91
|
+
multiaddrs: string[];
|
|
92
|
+
agents: FleetAgentConfig[];
|
|
93
|
+
agentSources: string[];
|
|
94
|
+
serviceInstalled: boolean;
|
|
95
|
+
serviceNote?: string;
|
|
96
|
+
joinNext: string[];
|
|
97
|
+
warnings: string[];
|
|
98
|
+
/** T2:令牌加入(主密钥不复制)——推荐路径 */
|
|
99
|
+
inviteToken: string;
|
|
100
|
+
joinEndpoint: string;
|
|
101
|
+
joinPort: number;
|
|
102
|
+
/** W2:统一守护(`--daemon`)时的端点/服务安装结果 */
|
|
103
|
+
daemon?: {
|
|
104
|
+
endpoint: string;
|
|
105
|
+
installed: boolean;
|
|
106
|
+
note?: string;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** W2:确保守护 bearer 令牌存在(写入 <dir>/auth/tokens.json,0600);返回内联 token。 */
|
|
110
|
+
export declare function ensureDaemonToken(dir: string): Promise<{
|
|
111
|
+
token: string;
|
|
112
|
+
tokensFile: string;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* W2 B2:把统一守护配置写进同一 home(`<dir>/config.json`),并让 fleet 走 daemon 客户端:
|
|
116
|
+
* fleet.config.json 增 `store:'daemon'` + `daemon:{endpoint,token}`。**不动** embedded 配置字段。
|
|
117
|
+
*/
|
|
118
|
+
export declare function configureDaemonHome(dir: string, config: FleetConfig, namespace: string, joinPort: number, daemonPort: number, delegated: {
|
|
119
|
+
userMasterPublicKeyFile: string;
|
|
120
|
+
} | null, peers?: Array<{
|
|
121
|
+
device: string;
|
|
122
|
+
addr?: string;
|
|
123
|
+
}>): Promise<{
|
|
124
|
+
token: string;
|
|
125
|
+
endpoint: string;
|
|
126
|
+
}>;
|
|
127
|
+
/** W2:Agent 侧 MCP 配置片段(守护 MCP stdio)。 */
|
|
128
|
+
export declare function agentMcpConfig(): Record<string, unknown>;
|
|
129
|
+
/** 选一个可对外通告的 LAN IPv4(无则回环)。 */
|
|
130
|
+
export declare function pickLanHost(): string;
|
|
131
|
+
/** A 一条命令:onboard + 本机订阅(self) + 加入码 + 服务 + doctor。 */
|
|
132
|
+
export declare function quickstart(input: QuickstartInput): Promise<QuickstartResult>;
|
|
133
|
+
export interface JoinInput {
|
|
134
|
+
dir: string;
|
|
135
|
+
code: string;
|
|
136
|
+
device: string;
|
|
137
|
+
namespace?: string;
|
|
138
|
+
listen?: string;
|
|
139
|
+
agents?: FleetAgentConfig[];
|
|
140
|
+
installService?: ServiceInstaller;
|
|
141
|
+
skipPortCheck?: boolean;
|
|
142
|
+
buildSha?: string;
|
|
143
|
+
env?: NodeJS.ProcessEnv;
|
|
144
|
+
platform?: string;
|
|
145
|
+
}
|
|
146
|
+
export interface JoinResult {
|
|
147
|
+
device: string;
|
|
148
|
+
dir: string;
|
|
149
|
+
peer: string;
|
|
150
|
+
namespace: string;
|
|
151
|
+
fingerprint: string;
|
|
152
|
+
alreadyJoined: boolean;
|
|
153
|
+
serviceInstalled: boolean;
|
|
154
|
+
serviceNote?: string;
|
|
155
|
+
multiaddrs: string[];
|
|
156
|
+
agents: FleetAgentConfig[];
|
|
157
|
+
agentSources: string[];
|
|
158
|
+
next: string[];
|
|
159
|
+
}
|
|
160
|
+
/** B 一条命令:版本核对 → 导入信任材料/地址 → onboard → 声明成员(active) → 服务 → doctor。 */
|
|
161
|
+
export declare function joinFleet(input: JoinInput): Promise<JoinResult>;
|
|
162
|
+
/** 读加入码文件(或内联)。 */
|
|
163
|
+
export declare function readJoinCode(input: {
|
|
164
|
+
code?: string;
|
|
165
|
+
codeFile?: string;
|
|
166
|
+
}): Promise<string>;
|
|
167
|
+
//# sourceMappingURL=quickstart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.d.ts","sourceRoot":"","sources":["../src/quickstart.ts"],"names":[],"mappings":"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"}
|