@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,96 @@
1
+ import type { FleetEndpoint } from '../protocol/envelope.js';
2
+ import { type TaskState } from '../model.js';
3
+ import type { TaskEventStore } from '../store/file-store.js';
4
+ import type { MebularMessageStore } from '../store/message-store.js';
5
+ import type { TaskTransport } from '../transport/types.js';
6
+ import type { ExecutorRegistry } from './agent.js';
7
+ import { type ExecutionLog, type TaskExecutor } from './executor.js';
8
+ import { type AgentConcurrencyOptions } from './fairness.js';
9
+ import { type TaskPlanner } from './planner.js';
10
+ import { type NegotiationMessage } from '../collab/negotiation.js';
11
+ export interface FleetWorkerOptions {
12
+ device: string;
13
+ /** 本 worker 标识(注册表模式下作为端标识;单执行器模式下用于 agent 匹配) */
14
+ agent: string;
15
+ store: TaskEventStore;
16
+ transport: TaskTransport;
17
+ /** 单执行器模式(旧):本 worker 只服务该 agent 名 / `'*'` */
18
+ executor?: TaskExecutor;
19
+ /** 注册表模式:按 `to.agent` 选执行器;未知 agent → 任务 `failed`(UNKNOWN_AGENT) */
20
+ registry?: ExecutorRegistry;
21
+ log: ExecutionLog;
22
+ /** 1d-a:执行成功后的**派生计划**(审查 DAG);缺省不派生 */
23
+ planner?: TaskPlanner;
24
+ /** W1 公平准入:每 Agent 并发(默认 2)与 (来源设备,目标 Agent) 配额;本地记账、无墙钟 */
25
+ admission?: AgentConcurrencyOptions;
26
+ /**
27
+ * 1d-b:有限协商(可选)。启用判定为真的任务在**执行前**走协商:
28
+ * 未接受则发出下一轮 `counter`,超 `maxRounds` → `failed`(NEGOTIATION_LIMIT);
29
+ * 收到 `accept` → 继续执行。消息按 `messageId` 幂等。
30
+ */
31
+ negotiation?: {
32
+ store: MebularMessageStore<NegotiationMessage>;
33
+ maxRounds: number;
34
+ enabled: (state: TaskState) => boolean;
35
+ };
36
+ }
37
+ export interface PollOutcome {
38
+ /** 本次新并入的事件数 */
39
+ applied: number;
40
+ /** 本次真实执行的次数(新增执行记录) */
41
+ executed: number;
42
+ }
43
+ export declare class FleetWorker {
44
+ readonly endpoint: FleetEndpoint;
45
+ private readonly store;
46
+ private readonly transport;
47
+ private readonly executor;
48
+ private readonly registry;
49
+ private readonly log;
50
+ private readonly planner;
51
+ private readonly negotiation;
52
+ private readonly admission;
53
+ private stopped;
54
+ constructor(options: FleetWorkerOptions);
55
+ /** 权威任务视图(已剔除违反树不变式的任务);供 DAG/汇总与验收读取。 */
56
+ statesView(): Promise<TaskState[]>;
57
+ /** 全部任务权威状态(按 taskId 排序;供 DAG 推导)。 */
58
+ private states;
59
+ /**
60
+ * 1d-b:执行前的有限协商。返回 `proceed`(可执行)或 `handled`(已回写/失败)。
61
+ * 未接受:发下一轮 `counter`(直到超过 `maxRounds` → `NEGOTIATION_LIMIT`)。
62
+ */
63
+ private handleNegotiation;
64
+ /**
65
+ * 1d-a:派生直接子任务(`created` 事件)。禁环守卫先行;成环则返回错误原因(不静默)。
66
+ */
67
+ private emitChildren;
68
+ /** 注册表模式:按设备职责认领(agent 由注册表解析);单执行器模式:设备 + agent 匹配。 */
69
+ private targetsMe;
70
+ /** 解析执行器;注册表模式下未知 agent 返回 null(须显式失败)。 */
71
+ private executorFor;
72
+ private emit;
73
+ private baseEvent;
74
+ private complete;
75
+ /** 处理发往本端、尚未终态的任务(幂等;可安全重复调用)。`maxTasks` 限制单轮真实执行数。 */
76
+ processPending(maxTasks?: number): Promise<number>;
77
+ /** 处理收件箱 + 推进本地任务。`maxTasks` 限制单轮真实执行数(默认不限)。 */
78
+ pollOnce(maxTasks?: number): Promise<PollOutcome>;
79
+ /**
80
+ * 启动对账(重启韧性):
81
+ * 1) **补发终态事件**:崩溃可能发生在「已执行并本地落 done」与「已发布到对端」之间的窗口,
82
+ * 重启后若任务已终态则**重发**该终态事件(对端按 `eventId` 幂等去重,至少一次语义)。
83
+ * 2) 续跑未终态任务。
84
+ */
85
+ reconcile(): Promise<number>;
86
+ /** 重发本端产生的终态事件(幂等:对端按 eventId 去重)。 */
87
+ private republishTerminal;
88
+ /** 持续轮询直到 `signal` 中止。 */
89
+ run(options?: {
90
+ intervalMs?: number;
91
+ signal?: AbortSignal;
92
+ }): Promise<void>;
93
+ stop(): void;
94
+ close(): Promise<void>;
95
+ }
96
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/runtime/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ // Fleet worker(M2):订阅任务分区 → 拾取发往本端(device/agent)的任务 → 执行 → 写回状态/结果。
2
+ //
3
+ // 幂等与韧性:
4
+ // - 事件按 `eventId` 幂等落库(重复投递不重复应用);
5
+ // - 执行按 `taskId` 至多一次(`ExecutionLog` 持久化),重复投递/重启都不重复执行;
6
+ // - 启动即 reconcile:对「已执行未回写」补回写、对「未执行」补执行(不丢不重)。
7
+ import { randomUUID } from 'node:crypto';
8
+ import { reduceTaskEvents } from '../model.js';
9
+ import { executeOnce } from './executor.js';
10
+ import { assertAcyclicParent, deriveEdges } from '../collab/dag.js';
11
+ import { admitCreated, admissibleTaskIds } from '../collab/tree.js';
12
+ import { fairOrder, admitByConcurrency } from './fairness.js';
13
+ import { childTaskId } from './planner.js';
14
+ import { NegotiationTracker, negotiationDecision, validateNegotiationMessage, } from '../collab/negotiation.js';
15
+ export class FleetWorker {
16
+ endpoint;
17
+ store;
18
+ transport;
19
+ executor;
20
+ registry;
21
+ log;
22
+ planner;
23
+ negotiation;
24
+ admission;
25
+ stopped = false;
26
+ constructor(options) {
27
+ this.endpoint = { device: options.device, agent: options.agent };
28
+ this.store = options.store;
29
+ this.transport = options.transport;
30
+ this.executor = options.executor ?? null;
31
+ this.registry = options.registry ?? null;
32
+ if (this.executor === null && this.registry === null) {
33
+ throw new Error('FleetWorker 需要 executor(单执行器)或 registry(按 agent 路由)之一');
34
+ }
35
+ this.log = options.log;
36
+ this.planner = options.planner ?? null;
37
+ this.negotiation = options.negotiation ?? null;
38
+ this.admission = options.admission ?? {};
39
+ }
40
+ /** 权威任务视图(已剔除违反树不变式的任务);供 DAG/汇总与验收读取。 */
41
+ async statesView() {
42
+ return this.states();
43
+ }
44
+ /** 全部任务权威状态(按 taskId 排序;供 DAG 推导)。 */
45
+ async states() {
46
+ const byTask = new Map();
47
+ for (const event of await this.store.all()) {
48
+ const list = byTask.get(event.taskId);
49
+ if (list)
50
+ list.push(event);
51
+ else
52
+ byTask.set(event.taskId, [event]);
53
+ }
54
+ const out = [];
55
+ for (const taskId of [...byTask.keys()].sort()) {
56
+ const state = reduceTaskEvents(byTask.get(taskId));
57
+ if (state)
58
+ out.push(state);
59
+ }
60
+ // W1:权威视图剔除违反树不变式的任务(经记忆同步到达的无效 created 亦生效)
61
+ const admissible = admissibleTaskIds(out);
62
+ return out.filter((s) => admissible.has(s.taskId));
63
+ }
64
+ /**
65
+ * 1d-b:执行前的有限协商。返回 `proceed`(可执行)或 `handled`(已回写/失败)。
66
+ * 未接受:发下一轮 `counter`(直到超过 `maxRounds` → `NEGOTIATION_LIMIT`)。
67
+ */
68
+ async handleNegotiation(state) {
69
+ const negotiation = this.negotiation;
70
+ const tracker = new NegotiationTracker(state.taskId, { maxRounds: negotiation.maxRounds });
71
+ for (const message of await negotiation.store.all()) {
72
+ if (message.taskId === state.taskId && validateNegotiationMessage(message).ok)
73
+ tracker.apply(message);
74
+ }
75
+ const decision = negotiationDecision(tracker.status());
76
+ if (decision.action === 'proceed')
77
+ return 'proceed';
78
+ if (decision.action === 'fail') {
79
+ await this.complete(state, undefined, false, decision.reason);
80
+ return 'handled';
81
+ }
82
+ // 轮次:**轮到本端**才发起下一轮 counter(避免空转刷轮次)。对方已回复(或首发)→ 本端回合。
83
+ const messages = tracker.messages();
84
+ const status = tracker.status();
85
+ const last = messages[messages.length - 1];
86
+ const ourTurn = last === undefined || last.from.device !== this.endpoint.device;
87
+ const nextRound = status.rounds + 1;
88
+ if (ourTurn && nextRound <= negotiation.maxRounds + 1) {
89
+ const message = {
90
+ v: 1,
91
+ messageId: `${state.taskId}#neg#${nextRound}@${this.endpoint.device}`,
92
+ taskId: state.taskId,
93
+ round: nextRound,
94
+ from: this.endpoint,
95
+ kind: 'counter',
96
+ text: 'need more detail',
97
+ };
98
+ await negotiation.store.append(message);
99
+ }
100
+ return 'handled';
101
+ }
102
+ /**
103
+ * 1d-a:派生直接子任务(`created` 事件)。禁环守卫先行;成环则返回错误原因(不静默)。
104
+ */
105
+ async emitChildren(state, children) {
106
+ let edges = deriveEdges(await this.states());
107
+ const planned = [];
108
+ for (let i = 0; i < children.length; i++) {
109
+ const child = children[i];
110
+ const childId = child.taskId ?? childTaskId(state.taskId, i);
111
+ try {
112
+ assertAcyclicParent(edges, state.taskId, childId);
113
+ }
114
+ catch {
115
+ return `DAG_CYCLE: ${state.taskId}→${childId}`;
116
+ }
117
+ edges = [...edges, { parent: state.taskId, child: childId }];
118
+ planned.push({ child, childId });
119
+ }
120
+ for (const { child, childId } of planned) {
121
+ const to = child.to ?? state.to;
122
+ await this.emit({
123
+ v: 1,
124
+ eventId: `${childId}#created`,
125
+ taskId: childId,
126
+ type: 'created',
127
+ actor: this.endpoint,
128
+ at: Date.now(),
129
+ toStatus: 'queued',
130
+ trace: { causedBy: state.taskId, chain: [...state.trace.chain, state.taskId] },
131
+ to,
132
+ intent: child.intent,
133
+ ...(child.payloadRef !== undefined ? { payloadRef: child.payloadRef } : {}),
134
+ }, to);
135
+ }
136
+ return null;
137
+ }
138
+ /** 注册表模式:按设备职责认领(agent 由注册表解析);单执行器模式:设备 + agent 匹配。 */
139
+ targetsMe(state) {
140
+ if (state.to.device !== this.endpoint.device)
141
+ return false;
142
+ if (this.registry !== null)
143
+ return true;
144
+ return state.to.agent === this.endpoint.agent || state.to.agent === '*';
145
+ }
146
+ /** 解析执行器;注册表模式下未知 agent 返回 null(须显式失败)。 */
147
+ executorFor(state) {
148
+ if (this.registry !== null)
149
+ return this.registry.resolve(state.to.agent);
150
+ return this.executor;
151
+ }
152
+ async emit(event, to) {
153
+ await this.store.append(event);
154
+ await this.transport.publish({ msgId: randomUUID(), from: this.endpoint, to, event });
155
+ }
156
+ baseEvent(state) {
157
+ return {
158
+ v: 1,
159
+ taskId: state.taskId,
160
+ actor: this.endpoint,
161
+ at: Date.now(),
162
+ trace: state.trace,
163
+ };
164
+ }
165
+ async complete(state, resultRef, ok, reason) {
166
+ const base = this.baseEvent(state);
167
+ const dev = this.endpoint.device;
168
+ await this.emit({ ...base, eventId: `${state.taskId}#claimed@${dev}`, type: 'claimed', toStatus: 'claimed' }, state.from);
169
+ await this.emit({ ...base, eventId: `${state.taskId}#running@${dev}`, type: 'running', toStatus: 'running' }, state.from);
170
+ if (ok) {
171
+ await this.emit({ ...base, eventId: `${state.taskId}#done@${dev}`, type: 'done', toStatus: 'done', ...(resultRef !== undefined ? { payloadRef: resultRef } : {}) }, state.from);
172
+ }
173
+ else {
174
+ await this.emit({ ...base, eventId: `${state.taskId}#failed@${dev}`, type: 'failed', toStatus: 'failed', ...(reason !== undefined ? { reason } : {}) }, state.from);
175
+ }
176
+ }
177
+ /** 处理发往本端、尚未终态的任务(幂等;可安全重复调用)。`maxTasks` 限制单轮真实执行数。 */
178
+ async processPending(maxTasks = Number.POSITIVE_INFINITY) {
179
+ let executed = 0;
180
+ const pending = (await this.states()).filter((s) => !s.terminal && this.targetsMe(s));
181
+ const byId = new Map(pending.map((s) => [s.taskId, s]));
182
+ // W1:按 (from.device, 逻辑序) 公平轮转 + 每 Agent 并发/配额门(本地、确定性、无墙钟)
183
+ const ordered = fairOrder(pending);
184
+ // 显式配置并发/配额门时才过滤(顺序 worker 默认不因并发上限而饿死;
185
+ // `admitByConcurrency` 的默认 perAgent=2 适用于**并行**执行,测试见 fairness.test.ts)
186
+ const gate = this.admission.perAgent !== undefined || this.admission.perPair !== undefined;
187
+ const admitted = gate
188
+ ? admitByConcurrency(ordered.map((id) => byId.get(id)), { agent: new Map(), pair: new Map() }, this.admission)
189
+ : ordered;
190
+ for (const taskId of admitted) {
191
+ const state = byId.get(taskId);
192
+ if (executed >= maxTasks)
193
+ break;
194
+ // 1d-b:有限协商(可选)——未接受前不执行
195
+ if (this.negotiation && this.negotiation.enabled(state)) {
196
+ const decided = await this.handleNegotiation(state);
197
+ if (decided === 'handled')
198
+ continue;
199
+ }
200
+ const executor = this.executorFor(state);
201
+ if (executor === null) {
202
+ // 未知 agent:显式失败(绝不静默回退)。
203
+ await this.complete(state, undefined, false, `UNKNOWN_AGENT: ${state.to.agent}`);
204
+ continue;
205
+ }
206
+ const before = this.log.size();
207
+ const outcome = await executeOnce(state, executor, this.log);
208
+ if (this.log.size() > before)
209
+ executed += 1;
210
+ // 1d-a:执行成功按计划派生子任务;成环 → 父任务显式失败(不静默)
211
+ if (outcome.ok && this.planner) {
212
+ const children = this.planner.plan(state, {
213
+ ok: outcome.ok,
214
+ ...(outcome.resultRef !== undefined ? { resultRef: outcome.resultRef } : {}),
215
+ });
216
+ if (children.length > 0) {
217
+ const cycle = await this.emitChildren(state, children);
218
+ if (cycle !== null) {
219
+ await this.complete(state, outcome.resultRef, false, cycle);
220
+ continue;
221
+ }
222
+ }
223
+ }
224
+ await this.complete(state, outcome.resultRef, outcome.ok, outcome.reason);
225
+ }
226
+ return executed;
227
+ }
228
+ /** 处理收件箱 + 推进本地任务。`maxTasks` 限制单轮真实执行数(默认不限)。 */
229
+ async pollOnce(maxTasks = Number.POSITIVE_INFINITY) {
230
+ const messages = await this.transport.drain(this.endpoint);
231
+ let applied = 0;
232
+ let states = await this.states();
233
+ for (const message of messages) {
234
+ const event = message.event;
235
+ // W1 入口拒收:越预算/越链长/root-only 的 created 不入库(纯函数、全端一致)
236
+ if (event.type === 'created') {
237
+ const verdict = admitCreated(event, states, reduceTaskEvents);
238
+ if (!verdict.ok)
239
+ continue;
240
+ }
241
+ if (await this.store.append(event)) {
242
+ applied += 1;
243
+ const reduced = reduceTaskEvents(await this.store.byTask(event.taskId));
244
+ if (reduced !== null) {
245
+ states = states.filter((s) => s.taskId !== reduced.taskId).concat(reduced);
246
+ }
247
+ }
248
+ }
249
+ const executed = await this.processPending(maxTasks);
250
+ return { applied, executed };
251
+ }
252
+ /**
253
+ * 启动对账(重启韧性):
254
+ * 1) **补发终态事件**:崩溃可能发生在「已执行并本地落 done」与「已发布到对端」之间的窗口,
255
+ * 重启后若任务已终态则**重发**该终态事件(对端按 `eventId` 幂等去重,至少一次语义)。
256
+ * 2) 续跑未终态任务。
257
+ */
258
+ async reconcile() {
259
+ await this.republishTerminal();
260
+ return this.processPending();
261
+ }
262
+ /** 重发本端产生的终态事件(幂等:对端按 eventId 去重)。 */
263
+ async republishTerminal() {
264
+ for (const state of await this.states()) {
265
+ if (!state.terminal)
266
+ continue;
267
+ if (state.from.device === this.endpoint.device)
268
+ continue; // 自派任务无需回传
269
+ const base = this.baseEvent(state);
270
+ const dev = this.endpoint.device;
271
+ const event = state.status === 'done'
272
+ ? { ...base, eventId: `${state.taskId}#done@${dev}`, type: 'done', toStatus: 'done', ...(state.resultRef !== undefined ? { payloadRef: state.resultRef } : {}) }
273
+ : { ...base, eventId: `${state.taskId}#failed@${dev}`, type: 'failed', toStatus: 'failed', ...(state.reason !== undefined ? { reason: state.reason } : {}) };
274
+ await this.transport.publish({ msgId: randomUUID(), from: this.endpoint, to: state.from, event });
275
+ }
276
+ }
277
+ /** 持续轮询直到 `signal` 中止。 */
278
+ async run(options = {}) {
279
+ const intervalMs = options.intervalMs ?? 5;
280
+ while (!this.stopped) {
281
+ if (options.signal?.aborted)
282
+ break;
283
+ await this.pollOnce();
284
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
285
+ }
286
+ }
287
+ stop() {
288
+ this.stopped = true;
289
+ }
290
+ async close() {
291
+ this.stop();
292
+ await this.transport.close();
293
+ await this.store.close();
294
+ }
295
+ }
296
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/runtime/worker.ts"],"names":[],"mappings":"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"}