@migor/agentia 0.9.4 → 0.10.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 (211) hide show
  1. package/CHANGELOG.md +1280 -4
  2. package/README.en.md +61 -3
  3. package/README.md +66 -4
  4. package/dist/AGENTS.md +330 -45
  5. package/dist/container/container.js +21 -0
  6. package/dist/container/container.js.map +1 -1
  7. package/dist/core/limits.d.ts +101 -14
  8. package/dist/core/limits.js +103 -13
  9. package/dist/core/limits.js.map +1 -1
  10. package/dist/core/line-framing.d.ts +36 -0
  11. package/dist/core/line-framing.js +39 -0
  12. package/dist/core/line-framing.js.map +1 -0
  13. package/dist/core/message.d.ts +11 -0
  14. package/dist/core/run.d.ts +68 -4
  15. package/dist/core/run.js +27 -1
  16. package/dist/core/run.js.map +1 -1
  17. package/dist/core/schema.js +59 -8
  18. package/dist/core/schema.js.map +1 -1
  19. package/dist/core/timeout.d.ts +43 -1
  20. package/dist/core/timeout.js +76 -3
  21. package/dist/core/timeout.js.map +1 -1
  22. package/dist/core/tool.d.ts +25 -1
  23. package/dist/core/trace.d.ts +40 -1
  24. package/dist/core/trace.js +26 -0
  25. package/dist/core/trace.js.map +1 -1
  26. package/dist/engine/budget.js +14 -0
  27. package/dist/engine/budget.js.map +1 -1
  28. package/dist/engine/defer.d.ts +49 -0
  29. package/dist/engine/defer.js +72 -0
  30. package/dist/engine/defer.js.map +1 -0
  31. package/dist/engine/errors.d.ts +23 -1
  32. package/dist/engine/errors.js +24 -0
  33. package/dist/engine/errors.js.map +1 -1
  34. package/dist/engine/forwarded.d.ts +14 -5
  35. package/dist/engine/forwarded.js +4 -1
  36. package/dist/engine/forwarded.js.map +1 -1
  37. package/dist/engine/loop-result.d.ts +65 -7
  38. package/dist/engine/loop-result.js +24 -5
  39. package/dist/engine/loop-result.js.map +1 -1
  40. package/dist/engine/loop.d.ts +2 -0
  41. package/dist/engine/loop.js +157 -17
  42. package/dist/engine/loop.js.map +1 -1
  43. package/dist/engine/mcp-server-http.d.ts +2 -0
  44. package/dist/engine/mcp-server-http.js +215 -0
  45. package/dist/engine/mcp-server-http.js.map +1 -0
  46. package/dist/engine/mcp-server-stdio.d.ts +15 -0
  47. package/dist/engine/mcp-server-stdio.js +106 -0
  48. package/dist/engine/mcp-server-stdio.js.map +1 -0
  49. package/dist/engine/mcp-server.d.ts +134 -0
  50. package/dist/engine/mcp-server.js +232 -0
  51. package/dist/engine/mcp-server.js.map +1 -0
  52. package/dist/engine/menu-drift.d.ts +34 -0
  53. package/dist/engine/menu-drift.js +81 -0
  54. package/dist/engine/menu-drift.js.map +1 -0
  55. package/dist/engine/policy.d.ts +2 -1
  56. package/dist/engine/policy.js +7 -1
  57. package/dist/engine/policy.js.map +1 -1
  58. package/dist/engine/replay.d.ts +2 -1
  59. package/dist/engine/replay.js +3 -2
  60. package/dist/engine/replay.js.map +1 -1
  61. package/dist/engine/resume-input.d.ts +10 -0
  62. package/dist/engine/resume-input.js +11 -0
  63. package/dist/engine/resume-input.js.map +1 -1
  64. package/dist/engine/run-config.d.ts +26 -2
  65. package/dist/engine/run-config.js +60 -0
  66. package/dist/engine/run-config.js.map +1 -1
  67. package/dist/engine/spec.d.ts +33 -4
  68. package/dist/engine/spec.js.map +1 -1
  69. package/dist/engine/tool-context.d.ts +10 -5
  70. package/dist/engine/tool-context.js +5 -1
  71. package/dist/engine/tool-context.js.map +1 -1
  72. package/dist/engine/tracer.d.ts +43 -5
  73. package/dist/engine/tracer.js +73 -10
  74. package/dist/engine/tracer.js.map +1 -1
  75. package/dist/engine/trimming.js +28 -2
  76. package/dist/engine/trimming.js.map +1 -1
  77. package/dist/engine/turn.d.ts +60 -3
  78. package/dist/engine/turn.js +180 -71
  79. package/dist/engine/turn.js.map +1 -1
  80. package/dist/engine/types.d.ts +89 -3
  81. package/dist/engine/types.js +38 -2
  82. package/dist/engine/types.js.map +1 -1
  83. package/dist/eval/export.d.ts +48 -0
  84. package/dist/eval/export.js +146 -0
  85. package/dist/eval/export.js.map +1 -0
  86. package/dist/eval/harvest.js +7 -2
  87. package/dist/eval/harvest.js.map +1 -1
  88. package/dist/index.d.ts +8 -5
  89. package/dist/index.js +6 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/integrations/adapter-options.d.ts +22 -0
  92. package/dist/integrations/adapter-options.js +51 -0
  93. package/dist/integrations/adapter-options.js.map +1 -1
  94. package/dist/integrations/anthropic.d.ts +4 -2
  95. package/dist/integrations/anthropic.js +27 -27
  96. package/dist/integrations/anthropic.js.map +1 -1
  97. package/dist/integrations/file-sink.d.ts +20 -0
  98. package/dist/integrations/file-sink.js +27 -0
  99. package/dist/integrations/file-sink.js.map +1 -0
  100. package/dist/integrations/mcp-http.d.ts +3 -3
  101. package/dist/integrations/mcp-http.js +1 -1
  102. package/dist/integrations/mcp-http.js.map +1 -1
  103. package/dist/integrations/mcp-protocol.d.ts +115 -0
  104. package/dist/integrations/mcp-protocol.js +69 -0
  105. package/dist/integrations/mcp-protocol.js.map +1 -0
  106. package/dist/integrations/mcp-stdio.d.ts +3 -3
  107. package/dist/integrations/mcp-stdio.js +17 -3
  108. package/dist/integrations/mcp-stdio.js.map +1 -1
  109. package/dist/integrations/mcp.d.ts +6 -95
  110. package/dist/integrations/mcp.js +24 -66
  111. package/dist/integrations/mcp.js.map +1 -1
  112. package/dist/integrations/metrics-otlp.js +52 -7
  113. package/dist/integrations/metrics-otlp.js.map +1 -1
  114. package/dist/integrations/metrics-render.d.ts +15 -0
  115. package/dist/integrations/metrics-render.js +79 -2
  116. package/dist/integrations/metrics-render.js.map +1 -1
  117. package/dist/integrations/metrics-state.d.ts +99 -1
  118. package/dist/integrations/metrics-state.js +128 -4
  119. package/dist/integrations/metrics-state.js.map +1 -1
  120. package/dist/integrations/metrics.d.ts +62 -6
  121. package/dist/integrations/metrics.js +49 -8
  122. package/dist/integrations/metrics.js.map +1 -1
  123. package/dist/integrations/openai.js +9 -31
  124. package/dist/integrations/openai.js.map +1 -1
  125. package/dist/integrations/otlp.d.ts +3 -3
  126. package/dist/integrations/report.d.ts +7 -0
  127. package/dist/integrations/report.js +20 -1
  128. package/dist/integrations/report.js.map +1 -1
  129. package/dist/runtime/memory.d.ts +61 -1
  130. package/dist/runtime/memory.js +47 -7
  131. package/dist/runtime/memory.js.map +1 -1
  132. package/dist/runtime/run.d.ts +12 -2
  133. package/dist/runtime/run.js +126 -17
  134. package/dist/runtime/run.js.map +1 -1
  135. package/dist/store/fsStore.js +10 -4
  136. package/dist/store/fsStore.js.map +1 -1
  137. package/dist/store/record.d.ts +41 -0
  138. package/dist/store/record.js +54 -0
  139. package/dist/store/record.js.map +1 -0
  140. package/dist/store/redisStore.d.ts +24 -1
  141. package/dist/store/redisStore.js +42 -7
  142. package/dist/store/redisStore.js.map +1 -1
  143. package/dist/store/sqliteStore.d.ts +23 -0
  144. package/dist/store/sqliteStore.js +103 -8
  145. package/dist/store/sqliteStore.js.map +1 -1
  146. package/dist/store/store.d.ts +65 -2
  147. package/dist/store/store.js +5 -2
  148. package/dist/store/store.js.map +1 -1
  149. package/dist/toolkit/capability-cycles.d.ts +50 -0
  150. package/dist/toolkit/capability-cycles.js +88 -0
  151. package/dist/toolkit/capability-cycles.js.map +1 -0
  152. package/dist/toolkit/capability-slice.d.ts +86 -0
  153. package/dist/toolkit/capability-slice.js +98 -0
  154. package/dist/toolkit/capability-slice.js.map +1 -0
  155. package/dist/toolkit/module.d.ts +7 -1
  156. package/dist/toolkit/module.js +65 -32
  157. package/dist/toolkit/module.js.map +1 -1
  158. package/dist/transport/approval-policy.d.ts +1 -1
  159. package/dist/transport/approval-policy.js +8 -4
  160. package/dist/transport/approval-policy.js.map +1 -1
  161. package/dist/transport/approval-supervisor.d.ts +73 -0
  162. package/dist/transport/approval-supervisor.js +252 -0
  163. package/dist/transport/approval-supervisor.js.map +1 -0
  164. package/dist/transport/async.d.ts +159 -56
  165. package/dist/transport/async.js +627 -269
  166. package/dist/transport/async.js.map +1 -1
  167. package/dist/transport/drain-gate.d.ts +6 -2
  168. package/dist/transport/drain-gate.js +14 -2
  169. package/dist/transport/drain-gate.js.map +1 -1
  170. package/dist/transport/http-endpoints.d.ts +151 -0
  171. package/dist/transport/http-endpoints.js +480 -0
  172. package/dist/transport/http-endpoints.js.map +1 -0
  173. package/dist/transport/http-io.d.ts +66 -0
  174. package/dist/transport/http-io.js +145 -0
  175. package/dist/transport/http-io.js.map +1 -0
  176. package/dist/transport/http-route.d.ts +10 -3
  177. package/dist/transport/http-route.js +18 -3
  178. package/dist/transport/http-route.js.map +1 -1
  179. package/dist/transport/http-shapes.d.ts +11 -0
  180. package/dist/transport/http-shapes.js +31 -1
  181. package/dist/transport/http-shapes.js.map +1 -1
  182. package/dist/transport/http.d.ts +22 -35
  183. package/dist/transport/http.js +98 -476
  184. package/dist/transport/http.js.map +1 -1
  185. package/dist/transport/owner-id.d.ts +29 -0
  186. package/dist/transport/owner-id.js +46 -0
  187. package/dist/transport/owner-id.js.map +1 -0
  188. package/dist/transport/owner-liveness.d.ts +8 -0
  189. package/dist/transport/owner-liveness.js +56 -0
  190. package/dist/transport/owner-liveness.js.map +1 -0
  191. package/dist/transport/resume-policy.d.ts +48 -10
  192. package/dist/transport/resume-policy.js +25 -10
  193. package/dist/transport/resume-policy.js.map +1 -1
  194. package/dist/transport/resume-scanner.d.ts +55 -0
  195. package/dist/transport/resume-scanner.js +219 -0
  196. package/dist/transport/resume-scanner.js.map +1 -0
  197. package/dist/transport/scheduler.js +9 -23
  198. package/dist/transport/scheduler.js.map +1 -1
  199. package/dist/transport/signal-supervisor.d.ts +80 -0
  200. package/dist/transport/signal-supervisor.js +129 -0
  201. package/dist/transport/signal-supervisor.js.map +1 -0
  202. package/dist/transport/slot-pool.d.ts +9 -1
  203. package/dist/transport/slot-pool.js +9 -1
  204. package/dist/transport/slot-pool.js.map +1 -1
  205. package/dist/transport/task-events.d.ts +34 -3
  206. package/dist/transport/task-events.js +93 -5
  207. package/dist/transport/task-events.js.map +1 -1
  208. package/dist/transport/wake-policy.d.ts +50 -0
  209. package/dist/transport/wake-policy.js +43 -0
  210. package/dist/transport/wake-policy.js.map +1 -0
  211. package/package.json +14 -4
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Agentia —— 认领者标识(`TaskRecord.ownerId`)的**格式真源**(2026-09-28)。
3
+ *
4
+ * 形状:`p<pid>@<host>-<8 位十六进制>`。为什么要带主机名 —— 崩溃恢复那句
5
+ * 「这条记录的主人还活着吗」**不能只看时间**:`staleAfterMs` 是新鲜度(记录起跑多久了),
6
+ * 不是租约(主人是否还在心跳)。两个方向都会判错:
7
+ * - 单段 run 跑超 `staleAfterMs` ⇒ 他进程当孤儿抢走 ⇒ **同一任务跑两遍**;
8
+ * - **崩溃进程**留下的记录仍然带 ownerId(`submit` 恒写)⇒ 落在保鲜期内没人捡 ⇒ 饿死。
9
+ *
10
+ * 带上主机名与 pid 之后:**同主机**可以直接问操作系统(`process.kill(pid, 0)`),
11
+ * 比时间猜准;**异主机**(或升级前写下的旧格式记录)判不了,退回新鲜度启发式 ——
12
+ * 判定分级在 `resume-policy.ts` 的 `ownerAlive` 上,这里只负责「写」与「读回」。
13
+ *
14
+ * 兼容:旧格式 `p<pid>-<8 位十六进制>`(没有 `@host`)解析出来 `host === undefined`,
15
+ * 判定侧按「判不了」处理 ≡ 升级前行为;解析不出来的串(如测试里的 `'p999-otherproc'`)
16
+ * 返回 `undefined`,同样走新鲜度。
17
+ *
18
+ * 纯件:只用 `node:os` 的另一个函数取值由调用方传入(`formatOwnerId` 不自己取主机名)——
19
+ * 判定的可测性靠这个缝,别把它焊死。
20
+ */
21
+ export interface ParsedOwnerId {
22
+ readonly pid: number;
23
+ /** `undefined` = 旧格式(无主机名)⇒ 「同主机吗」无从判断 */
24
+ readonly host: string | undefined;
25
+ }
26
+ /** 拼一个 ownerId(`suffix` 由调用方给随机串;本函数不引 `node:crypto`,保持纯) */
27
+ export declare function formatOwnerId(pid: number, host: string, suffix: string): string;
28
+ /** 解析 ownerId;形状不认识 ⇒ `undefined`(判定侧据此退回新鲜度启发式) */
29
+ export declare function parseOwnerId(ownerId: string): ParsedOwnerId | undefined;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Agentia —— 认领者标识(`TaskRecord.ownerId`)的**格式真源**(2026-09-28)。
3
+ *
4
+ * 形状:`p<pid>@<host>-<8 位十六进制>`。为什么要带主机名 —— 崩溃恢复那句
5
+ * 「这条记录的主人还活着吗」**不能只看时间**:`staleAfterMs` 是新鲜度(记录起跑多久了),
6
+ * 不是租约(主人是否还在心跳)。两个方向都会判错:
7
+ * - 单段 run 跑超 `staleAfterMs` ⇒ 他进程当孤儿抢走 ⇒ **同一任务跑两遍**;
8
+ * - **崩溃进程**留下的记录仍然带 ownerId(`submit` 恒写)⇒ 落在保鲜期内没人捡 ⇒ 饿死。
9
+ *
10
+ * 带上主机名与 pid 之后:**同主机**可以直接问操作系统(`process.kill(pid, 0)`),
11
+ * 比时间猜准;**异主机**(或升级前写下的旧格式记录)判不了,退回新鲜度启发式 ——
12
+ * 判定分级在 `resume-policy.ts` 的 `ownerAlive` 上,这里只负责「写」与「读回」。
13
+ *
14
+ * 兼容:旧格式 `p<pid>-<8 位十六进制>`(没有 `@host`)解析出来 `host === undefined`,
15
+ * 判定侧按「判不了」处理 ≡ 升级前行为;解析不出来的串(如测试里的 `'p999-otherproc'`)
16
+ * 返回 `undefined`,同样走新鲜度。
17
+ *
18
+ * 纯件:只用 `node:os` 的另一个函数取值由调用方传入(`formatOwnerId` 不自己取主机名)——
19
+ * 判定的可测性靠这个缝,别把它焊死。
20
+ */
21
+ /**
22
+ * 切分点靠**锚定结尾的定长后缀**唯一确定:`-` 之后正好 8 位十六进制收在串尾,所以主机名里
23
+ * 带 `-`(`my-host-1`,常态)不会被误切进后缀。
24
+ *
25
+ * `(.+?)` 写成惰性而非贪婪只是把意图写在脸上 —— **实测两种写法在 28 组夹具上结果完全一致**
26
+ * (见 tests/transport/owner-id.test.ts 的说明):撑住这条的是 `$` 与 `{8}`,不是惰性。
27
+ * 去掉 `$`、或把 `{8}` 放宽成 `{1,8}`,那两条用例就会红。
28
+ */
29
+ const OWNER_ID_RE = /^p(\d+)(?:@(.+?))?-([0-9a-f]{8})$/;
30
+ /** 拼一个 ownerId(`suffix` 由调用方给随机串;本函数不引 `node:crypto`,保持纯) */
31
+ export function formatOwnerId(pid, host, suffix) {
32
+ return `p${pid}@${host}-${suffix}`;
33
+ }
34
+ /** 解析 ownerId;形状不认识 ⇒ `undefined`(判定侧据此退回新鲜度启发式) */
35
+ export function parseOwnerId(ownerId) {
36
+ const m = OWNER_ID_RE.exec(ownerId);
37
+ if (m === null)
38
+ return undefined;
39
+ const pid = Number(m[1]);
40
+ // isSafeInteger 而不是 isInteger:`p<超长数字>-…` 会解析成 1e21 / Infinity 这种「整数」,
41
+ // 放过去就等于把垃圾当 pid 递给探针。不是安全整数 ⇒ 形状不成立。
42
+ if (!Number.isSafeInteger(pid) || pid <= 0)
43
+ return undefined;
44
+ return { pid, host: m[2] };
45
+ }
46
+ //# sourceMappingURL=owner-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-id.js","sourceRoot":"","sources":["../../src/transport/owner-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG,mCAAmC,CAAC;AAExD,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,IAAY,EAAE,MAAc;IACrE,OAAO,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,uEAAuE;IACvE,sCAAsC;IACtC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** 探针:等价于 `process.kill(pid, 0)` —— 正常返回 = 进程在,抛错则看 `e.code` */
2
+ export type SignalProbe = (pid: number) => void;
3
+ /**
4
+ * `true` = 同主机且进程在(**无论记录多老都不许抢**);
5
+ * `false` = 同主机但进程不在(崩溃孤儿,**立刻可抢**,不等保鲜期);
6
+ * `undefined` = 判不了(异主机 / 旧格式 / 坏形状 / 意外 errno)⇒ 交给新鲜度启发式。
7
+ */
8
+ export declare function ownerAlive(ownerId: string, host: string, probe?: SignalProbe): boolean | undefined;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Agentia —— 「这条记录的主人还在吗」的判定(2026-09-28)。
3
+ *
4
+ * 为什么单独成件:`resume-policy.ts` 是**纯**策略(不碰进程、不碰 store),而这个问题
5
+ * 必须问操作系统。两者之间的缝就是这个文件:做成「ownerId + 本机主机名 ⇒ 活着 / 不在 /
6
+ * 判不了」的判定,探针可注入 ⇒ 三种结论的边界都能被穷尽单测,策略侧只消费结论。
7
+ *
8
+ * **三态而不是布尔**:「判不了」必须与「不在」分开。判不了的三种来源:
9
+ * - **异主机**:pid 是各机器自己的命名空间,本机问不到别人家的 pid;
10
+ * - **旧格式 ownerId**(升级前写下的 `p<pid>-<rand>`,没有 `@host`):不知道是哪台机器写的;
11
+ * - **形状不认识的串**(宿主自定的标识、测试夹具):更不知道。
12
+ * 三者一律 `undefined` ⇒ 策略侧退回新鲜度启发式 ≡ 升级前行为(不清楚就不乱抢)。
13
+ *
14
+ * 探针语义(`process.kill(pid, 0)`;实测记录见 `tests/transport/owner-liveness.test.ts`):
15
+ * - 进程在 ⇒ 正常返回;**`EPERM` 也是「在」**(归别人的进程,本进程无权发信号 —— pid 1 即此);
16
+ * - 进程不在 ⇒ 一律 `ESRCH`,**包括超过 `kern.maxprocperuid` 的 pid**(macOS 实测
17
+ * 2784 / 2785 / 999999 / 4194303 / 99999999 全是 ESRCH)⇒ 不需要「pid 太大」这类边角分类;
18
+ * - 其他 errno ⇒ `undefined`(判不了)。
19
+ *
20
+ * ⚠️ 残留风险,两种都只会「**晚一点**才捡」,不会「抢错」:
21
+ * ① **PID 复用**:撞号进程活着 ⇒ 误判为「主人在」。**自愈** —— 那个进程一退出,
22
+ * 下一次扫描就 `ESRCH` ⇒ 立刻可抢;
23
+ * ② **僵尸**(父进程没 `wait` 收尸,pid 仍留在进程表里)⇒ 同①。框架不探 `/proc/<pid>/stat`
24
+ * 的 `Z`:macOS 没有 `/proc`,跨平台拿不到,为一个边角引平台分支不划算。
25
+ * 刻意**不加时间硬上限**兜这两种 —— 加上限 = 把租约换回新鲜度启发式,「长跑被抢」那个 bug
26
+ * 原样回来(那才是真·重复执行)。取舍:宁可偶尔晚捡,不可偶尔抢跑。
27
+ */
28
+ import { parseOwnerId } from './owner-id.js';
29
+ const defaultProbe = (pid) => {
30
+ process.kill(pid, 0);
31
+ };
32
+ /**
33
+ * `true` = 同主机且进程在(**无论记录多老都不许抢**);
34
+ * `false` = 同主机但进程不在(崩溃孤儿,**立刻可抢**,不等保鲜期);
35
+ * `undefined` = 判不了(异主机 / 旧格式 / 坏形状 / 意外 errno)⇒ 交给新鲜度启发式。
36
+ */
37
+ export function ownerAlive(ownerId, host, probe = defaultProbe) {
38
+ const parsed = parseOwnerId(ownerId);
39
+ if (parsed === undefined || parsed.host === undefined)
40
+ return undefined;
41
+ if (parsed.host !== host)
42
+ return undefined;
43
+ try {
44
+ probe(parsed.pid);
45
+ return true;
46
+ }
47
+ catch (e) {
48
+ const code = e.code;
49
+ if (code === 'ESRCH')
50
+ return false;
51
+ if (code === 'EPERM')
52
+ return true;
53
+ return undefined;
54
+ }
55
+ }
56
+ //# sourceMappingURL=owner-liveness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-liveness.js","sourceRoot":"","sources":["../../src/transport/owner-liveness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAK7C,MAAM,YAAY,GAAgB,CAAC,GAAG,EAAE,EAAE;IACxC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAY,EACZ,KAAK,GAAgB,YAAY;IAEjC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -7,34 +7,72 @@
7
7
  * 只能靠读代码去确认,错了也不会有人告诉你 —— 只会看到副作用与花费翻倍。
8
8
  * 抽成具名函数后,「跳过原因」成为返回值的一部分,每条规则与边界都能被直接单测。
9
9
  *
10
+ * 2026-09-28 补了一档更硬的判据:**「主人还活着吗」**(`ownerAlive` ⇒ `owner-alive`)。
11
+ * 在此之前只有「新鲜度」一条启发式(`too-fresh`),它的两个方向都会出错(长跑被抢 /
12
+ * 崩溃孤儿饿死,见 `owner-alive` 的说明)。判定分级:能问到 pid 就信 pid,问不到才退回时间。
13
+ *
10
14
  * 纯的边界:不碰 store、不改 rec、不派发 —— 只回答「这条记录我能不能抢」。
11
15
  */
12
16
  import type { TaskRecord } from '../store/store.js';
13
17
  /** 不该被我认领的原因(诊断用;命名本身也是文档) */
14
18
  export type ResumeSkipReason =
15
- /** 不在 queued/running:终态没什么可续的;`awaiting_approval` 在等人,不是孤儿 */
19
+ /** 不在 queued/running(也不是挂起):终态没什么可续的 */
16
20
  'terminal'
21
+ /**
22
+ * 挂起(`suspended`):**不是孤儿** —— 它由各自那条闸唤醒(`approval` 等决定、
23
+ * `timer` 等到点),崩溃续跑语义不适用于「在等」。单列一档而不是并进 `terminal`:
24
+ * 一条在睡的 run 被具名成「终态」是**静默说错话**(2026-09-27 调研 §1 事实 4 点的
25
+ * 就是这一处),而这个字段的全部用途就是诊断 —— 说错等于没有。
26
+ */
27
+ | 'suspended'
17
28
  /** ownerId 是本进程:它一定还活着,重派只会让同一任务跑两遍 */
18
29
  | 'own-process'
19
- /** 他进程刚起的记录(在 `staleAfterMs` 保鲜期内):别抢,那边还活着 */
30
+ /**
31
+ * **同主机、且那个 pid 还活着**(2026-09-28 加):比 `too-fresh` 准一个量级 ——
32
+ * 它是「主人在」的**直接证据**,不是「记录看起来还新」的推测。长跑的 run 因此不再
33
+ * 因为「起跑很久了」被当孤儿抢走(那是真·重复执行)。
34
+ */
35
+ | 'owner-alive'
36
+ /**
37
+ * 他进程刚起的记录(在 `staleAfterMs` 保鲜期内):别抢,那边还活着。
38
+ * ⚠️ 这是**判不了「主人在不在」时**的兜底 —— 异主机、或升级前写下的旧格式 ownerId。
39
+ * 同主机能直接问 pid(见 `owner-alive`),那时这条不参与。
40
+ */
20
41
  | 'too-fresh';
21
42
  export interface ResumeClaimOptions {
22
43
  /** 本进程标识(AsyncRunner 恒为字符串,不会是 undefined) */
23
44
  ownerId: string;
24
- /** >0 时启用「他进程记录保鲜期」;0 = 不看他进程的起跑时间,立刻可抢 */
45
+ /** >0 时启用「他进程记录」的判定;0 = 完全不看他进程,立刻可抢(单进程旧语义) */
25
46
  staleAfterMs: number;
26
47
  now: number;
48
+ /**
49
+ * 「这条记录的主人还活着吗」—— `true` = 活着、`false` = 死了、`undefined` = **判不了**。
50
+ *
51
+ * 注入而不是在这里直接 `process.kill`:① 本文件要保住**纯**(不碰进程、不碰 store,
52
+ * 边界才能被穷尽单测);② 判定依赖主机名与 pid 语义,那是 transport 的现场知识
53
+ * (`owner-id.ts` 负责格式,`AsyncRunner` 负责问操作系统),策略只消费结论。
54
+ *
55
+ * 只在 `staleAfterMs > 0` 时被调用(缺省 0 = 不看他进程,与升级前逐字一致)。
56
+ */
57
+ ownerAlive?: (ownerId: string) => boolean | undefined;
27
58
  }
28
59
  /**
29
60
  * 能否认领这条记录:`undefined` = 可以,否则给出跳过原因。
30
61
  *
31
- * 判定顺序(与抽取前的 filter **逐字一致**,顺序本身有语义):
32
- * 1. 状态不合法 → `terminal`(先判状态:终态记录即便 ownerId 是自己也不该被"续跑");
33
- * 2. `ownerId` 等于本进程 → `own-process`;
34
- * 3. 启用了保鲜期**且**记录有主 → 起跑时间(`startedAt` 退化到 `createdAt`)至今
35
- * 不足保鲜期 → `too-fresh`;边界是**严格小于**(恰好到期即可抢)。
62
+ * 判定顺序(顺序本身有语义):
63
+ * 1. 挂起 → `suspended`(先摘出来:它不是终态、也不是我的活 —— 唤醒是各自的闸的事);
64
+ * 2. 状态不合法 → `terminal`(先判状态:终态记录即便 ownerId 是自己也不该被"续跑");
65
+ * 3. `ownerId` 等于本进程 → `own-process`;
66
+ * 4. 启用了他进程判定(`staleAfterMs > 0`)**且**记录有主:
67
+ * - `ownerAlive(ownerId) === true` → `owner-alive`(**无论记录多老都不抢**);
68
+ * - `=== false`(同主机但进程没了 = 崩溃孤儿)→ **立刻可抢**(不再被保鲜期挡住);
69
+ * - `undefined`(异主机 / 旧格式 ownerId)→ 退回下面那条新鲜度启发式。
70
+ * 5. 新鲜度:起跑时间(`startedAt` 退化到 `createdAt`)距今不足保鲜期 → `too-fresh`;
71
+ * 边界是**严格小于**(恰好到期即可抢)。
36
72
  *
37
- * ⚠️ 第 3 条要求「有主」:**无主记录(ownerId === undefined)永远可抢**,不受保鲜期约束 ——
38
- * 否则崩溃留下的孤儿会因为"看起来太新"而永远没人捡。
73
+ * ⚠️ 第 4/5 条要求「有主」:**无主记录(ownerId === undefined)永远可抢**,不受保鲜期约束。
74
+ * 注意这句话的**保护范围有限** —— `AsyncRunner.submit` 恒写 ownerId(`p<pid>@<host>-<rand>`),
75
+ * 所以「崩溃留下的记录」通常**有** ownerId,能不能捡靠的是第 4 条那个 pid 存活判定
76
+ * (2026-09-28 之前只有第 5 条 ⇒ 崩溃孤儿在保鲜期内会饿死,见 `owner-alive`)。
39
77
  */
40
78
  export declare function resumeSkipReason(rec: TaskRecord, opts: ResumeClaimOptions): ResumeSkipReason | undefined;
@@ -1,24 +1,39 @@
1
1
  /**
2
2
  * 能否认领这条记录:`undefined` = 可以,否则给出跳过原因。
3
3
  *
4
- * 判定顺序(与抽取前的 filter **逐字一致**,顺序本身有语义):
5
- * 1. 状态不合法 → `terminal`(先判状态:终态记录即便 ownerId 是自己也不该被"续跑");
6
- * 2. `ownerId` 等于本进程 → `own-process`;
7
- * 3. 启用了保鲜期**且**记录有主 → 起跑时间(`startedAt` 退化到 `createdAt`)至今
8
- * 不足保鲜期 → `too-fresh`;边界是**严格小于**(恰好到期即可抢)。
4
+ * 判定顺序(顺序本身有语义):
5
+ * 1. 挂起 → `suspended`(先摘出来:它不是终态、也不是我的活 —— 唤醒是各自的闸的事);
6
+ * 2. 状态不合法 → `terminal`(先判状态:终态记录即便 ownerId 是自己也不该被"续跑");
7
+ * 3. `ownerId` 等于本进程 → `own-process`;
8
+ * 4. 启用了他进程判定(`staleAfterMs > 0`)**且**记录有主:
9
+ * - `ownerAlive(ownerId) === true` → `owner-alive`(**无论记录多老都不抢**);
10
+ * - `=== false`(同主机但进程没了 = 崩溃孤儿)→ **立刻可抢**(不再被保鲜期挡住);
11
+ * - `undefined`(异主机 / 旧格式 ownerId)→ 退回下面那条新鲜度启发式。
12
+ * 5. 新鲜度:起跑时间(`startedAt` 退化到 `createdAt`)距今不足保鲜期 → `too-fresh`;
13
+ * 边界是**严格小于**(恰好到期即可抢)。
9
14
  *
10
- * ⚠️ 第 3 条要求「有主」:**无主记录(ownerId === undefined)永远可抢**,不受保鲜期约束 ——
11
- * 否则崩溃留下的孤儿会因为"看起来太新"而永远没人捡。
15
+ * ⚠️ 第 4/5 条要求「有主」:**无主记录(ownerId === undefined)永远可抢**,不受保鲜期约束。
16
+ * 注意这句话的**保护范围有限** —— `AsyncRunner.submit` 恒写 ownerId(`p<pid>@<host>-<rand>`),
17
+ * 所以「崩溃留下的记录」通常**有** ownerId,能不能捡靠的是第 4 条那个 pid 存活判定
18
+ * (2026-09-28 之前只有第 5 条 ⇒ 崩溃孤儿在保鲜期内会饿死,见 `owner-alive`)。
12
19
  */
13
20
  export function resumeSkipReason(rec, opts) {
21
+ if (rec.status === 'suspended')
22
+ return 'suspended';
14
23
  if (rec.status !== 'queued' && rec.status !== 'running')
15
24
  return 'terminal';
16
25
  if (rec.ownerId === opts.ownerId)
17
26
  return 'own-process';
18
27
  if (opts.staleAfterMs > 0 && rec.ownerId !== undefined) {
19
- const since = rec.startedAt ?? rec.createdAt;
20
- if (opts.now - since < opts.staleAfterMs)
21
- return 'too-fresh';
28
+ const alive = opts.ownerAlive?.(rec.ownerId);
29
+ if (alive === true)
30
+ return 'owner-alive';
31
+ if (alive === undefined) {
32
+ const since = rec.startedAt ?? rec.createdAt;
33
+ if (opts.now - since < opts.staleAfterMs)
34
+ return 'too-fresh';
35
+ }
36
+ // alive === false:同主机、进程已不在 ⇒ 崩溃孤儿,直接可抢(不参与新鲜度)
22
37
  }
23
38
  return undefined;
24
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resume-policy.js","sourceRoot":"","sources":["../../src/transport/resume-policy.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAe,EACf,IAAwB;IAExB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC3E,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,aAAa,CAAC;IACvD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;QAC7C,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY;YAAE,OAAO,WAAW,CAAC;IAC/D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"resume-policy.js","sourceRoot":"","sources":["../../src/transport/resume-policy.ts"],"names":[],"mappings":"AA6DA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAe,EACf,IAAwB;IAExB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACnD,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC3E,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,aAAa,CAAC;IACvD,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,aAAa,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC;YAC7C,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC,YAAY;gBAAE,OAAO,WAAW,CAAC;QAC/D,CAAC;QACD,gDAAgD;IAClD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { TaskRecord, TaskStore } from '../store/store.js';
2
+ import type { ApprovalSupervisor } from './approval-supervisor.js';
3
+ /** resumePending 的启动扫描选项 */
4
+ export interface ResumePendingOptions {
5
+ /**
6
+ * 他进程任务的判定开关;缺省 0 = 不判断,一律重派(重启即续跑,单进程旧语义)。
7
+ *
8
+ * `> 0` 时按**两档**判他进程的记录(判据在 `resume-policy.ts`,这里只说取舍):
9
+ * ① 记录里的主机名是本机 ⇒ **问 pid 还在不在**(`owner-liveness.ts`)——
10
+ * 「主人在」的直接证据:**在的绝不抢**(不管它起跑多久),**不在的立刻可抢**
11
+ * (不等保鲜期,崩溃孤儿不会饿死);
12
+ * ② 判不了(异主机 / 升级前写下的旧格式 ownerId / 自定义串)⇒ 退回本参数名义上的
13
+ * 那件事:`startedAt`(退化到 `createdAt`)距今不足该值就当他还在跑、先别抢。
14
+ *
15
+ * ⚠️ ②只是**启发式**(「记录看起来还新」),不是租约:单进程部署建议 0;多进程共库
16
+ * 时它只是「问不到 pid」时的兜底,别再指望它单独把「重复执行」挡住。
17
+ * 阈值取值要大于「一个进程从启动到跑满一条记录」的合理时间,否则长跑会被抢。
18
+ */
19
+ staleAfterMs?: number;
20
+ }
21
+ /** `ResumeScanner` 的注入依赖(全部由 `AsyncRunner` 构造时提供) */
22
+ export interface ResumeScannerDeps {
23
+ store: TaskStore;
24
+ /** 认领时写进记录的宿主标识(`resumePending` 靠它区分他我) */
25
+ ownerId: string;
26
+ /** 本机主机名(`ownerAlive` 判 pid 存活时用;见 `owner-liveness.ts`) */
27
+ host: string;
28
+ /** 挂起登记簿(扫描第①②步:重建读数、催审批超时) */
29
+ approvals: ApprovalSupervisor;
30
+ /** 派发入口(`AsyncRunner.#dispatch`:停机闸 + 唯一派发点 + 停机窗口里的一次告警) */
31
+ dispatch(rec: TaskRecord): void;
32
+ /** 停机闸读数(`wakeDue` 的配套 5:drain 之后不唤醒,见 `drain-gate.ts`) */
33
+ isDraining(): boolean;
34
+ }
35
+ export declare class ResumeScanner {
36
+ #private;
37
+ constructor(deps: ResumeScannerDeps);
38
+ resumePending(opts?: ResumePendingOptions): number | Promise<number>;
39
+ /**
40
+ * 到期唤醒(durable timer):读到一条**在睡且到点**的挂起 ⇒ 认领 + 重派,醒来后重跑那一批。
41
+ *
42
+ * 与 `approval-supervisor.ts` 的 `#expireAndResume` 逐条同形(进在飞闸、重读一遍、先落库再派发),
43
+ * 理由一字不差;三处不同,都写在下面:drain 之后不唤(配套 5)、不填任何决定(时间挂起没有待决项)、
44
+ * 以及**返回值**(见下)。
45
+ *
46
+ * 公开而非私有:**两个调用点**都要用它 —— 全表扫描(`resumePending` 的 `#redispatch`)与
47
+ * 读路径(`AsyncRunner.#lazyGates`,`poll()` 的惰性闸)。
48
+ *
49
+ * @returns 是否真的接管了这次唤醒 —— decline 时 `false`。`resumePending` 的返回值是
50
+ * 「我推进了几条」,把没推进的算进去就是谎报(drain 之后每次扫描都报「唤醒了 N 条」,
51
+ * 而它们一条都没动)。⚠️ 审批那条(`approval-supervisor.ts` 的 `#expireAndResume`)计数口径略宽(在飞也计入),
52
+ * 那是既有行为、本批不动它。
53
+ */
54
+ wakeDue(rec: TaskRecord, now: number): boolean;
55
+ }
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Agentia —— 恢复扫描:`resumePending()` 的那一次扫描全流程。
3
+ *
4
+ * 一次扫描按顺序干四件事(顺序是有语义的,不是巧合):
5
+ * ① **重建挂起读数**(`approvals.rebuild`)—— 扫描本来就 `list()` 了全表,顺手对齐;
6
+ * ② **催审批超时**(`approvals.expireIfExpired`)—— 到点的 awaiting 自动全拒 + 重派;
7
+ * ③ **唤醒到期**(`wakeDue`)—— 在睡且到点的 timer 挂起 ⇒ 认领 + 重派;
8
+ * ④ **认领重投**(`#redispatch` 尾部)—— 孤儿记录(他进程留下的 / 本进程上一世的)续跑。
9
+ *
10
+ * 从 `async.ts` 的 `AsyncRunner` 抽出的方向正交的一块(外部深评结构体检的建议④「恢复重投」)。
11
+ * 它管的是「**谁在等 · 等到了没 · 该不该由我来捡**」,与「认领之后怎么跑」(`#execute`/
12
+ * `#executeInner`)和「跑起来怎么派发」(`#dispatch`)都不是一个方向。
13
+ *
14
+ * **零行为变化**:逐字搬迁 + 依赖改为构造注入。判据、分支顺序、返回值语义、副作用次序
15
+ * (先落库再派发)一字未改。
16
+ *
17
+ * 为什么 `dispatch` / `isDraining` 用**回调注入**而不是 import `async.ts`:见
18
+ * `approval-supervisor.ts` 头注(`#dispatch` 与 drain 闸都归 `AsyncRunner`,本件只消费它们,
19
+ * 不该拥有、也不该复制一份)。
20
+ *
21
+ * ⚠️ `ResumePendingOptions` 随本簇迁到这里;`async.ts` 仍 **re-export** 它 ⇒
22
+ * `src/index.ts` 的公共导出面不变。
23
+ */
24
+ import { isThenable } from '../store/store.js';
25
+ import { timerDue } from './wake-policy.js';
26
+ import { resumeSkipReason } from './resume-policy.js';
27
+ import { ownerAlive } from './owner-liveness.js';
28
+ export class ResumeScanner {
29
+ /**
30
+ * 在飞的 `resumePending`(重入闸,见 `resumePending` 的注释)。
31
+ * 不用 boolean 而用 Promise:重入方要拿到**同一次扫描**的结果,而不是一个「你等着」的空数。
32
+ */
33
+ #inflightResume = null;
34
+ /** 在飞的到期唤醒(同一任务的重入闸,理由与审批那条同款 —— 见 `approval-supervisor.ts` 的 `#inflight`:两条路径都「落库 + 派发」)。 */
35
+ #inflightWakes = new Map();
36
+ #deps;
37
+ constructor(deps) {
38
+ this.#deps = deps;
39
+ }
40
+ resumePending(opts = {}) {
41
+ // 重入闸:**并发**调用共享同一次扫描的结果,而不是各自再扫一遍。
42
+ //
43
+ // 为什么必须(2026-09-18 补):「先落库再派发」只堵住了**串行**重扫 —— 认领是异步的
44
+ // (异步 store 的 `list()` 返回反序列化的**新对象**),两个并发调用都在任一 `save`
45
+ // 落地前 `list()` 到旧快照,`ownerId === this.ownerId` 的过滤对两份旧快照**双双失效**
46
+ // ⇒ 同一个任务被派发两次(`app.run` 重复执行,副作用与花费翻倍)。
47
+ //
48
+ // 语义:闸门期间返回**在飞那次的 Promise**(同一个数),而不是 0 —— 0 会谎称
49
+ // 「没派发任何东西」,而实际上派发了。调用方拿到的始终是本次扫描的真实结果。
50
+ if (this.#inflightResume)
51
+ return this.#inflightResume;
52
+ const listed = this.#deps.store.list();
53
+ const staleAfterMs = opts.staleAfterMs ?? 0;
54
+ // 到期索引(2026-09-28 ⑤ 落地):store 实现了 `listDue` 时,「到期唤醒」那一半的
55
+ // 输入走索引(只回到期的记录),否则回退全表过滤 —— 语义不变,只是扫描规模不同。
56
+ // ⚠️ 它**只**替代那一半的输入:挂起读数重建 / 审批超时 / 孤儿认领的职责
57
+ // 仍是全表 `list()`(它们要的不只是「到期的」),别把整个扫描的输入源换掉。
58
+ const dueListed = this.#deps.store.listDue === undefined ? undefined : this.#deps.store.listDue(Date.now());
59
+ if (isThenable(listed) || (dueListed !== undefined && isThenable(dueListed))) {
60
+ const run = Promise.all([listed, dueListed])
61
+ .then(([recs, due]) => this.#redispatch(recs, staleAfterMs, due))
62
+ .finally(() => {
63
+ this.#inflightResume = null;
64
+ });
65
+ this.#inflightResume = run;
66
+ return run;
67
+ }
68
+ const dispatched = this.#redispatch(listed, staleAfterMs, dueListed);
69
+ if (isThenable(dispatched)) {
70
+ const run = Promise.resolve(dispatched).finally(() => {
71
+ this.#inflightResume = null;
72
+ });
73
+ this.#inflightResume = run;
74
+ return run;
75
+ }
76
+ return dispatched;
77
+ }
78
+ /**
79
+ * 到期唤醒(durable timer):读到一条**在睡且到点**的挂起 ⇒ 认领 + 重派,醒来后重跑那一批。
80
+ *
81
+ * 与 `approval-supervisor.ts` 的 `#expireAndResume` 逐条同形(进在飞闸、重读一遍、先落库再派发),
82
+ * 理由一字不差;三处不同,都写在下面:drain 之后不唤(配套 5)、不填任何决定(时间挂起没有待决项)、
83
+ * 以及**返回值**(见下)。
84
+ *
85
+ * 公开而非私有:**两个调用点**都要用它 —— 全表扫描(`resumePending` 的 `#redispatch`)与
86
+ * 读路径(`AsyncRunner.#lazyGates`,`poll()` 的惰性闸)。
87
+ *
88
+ * @returns 是否真的接管了这次唤醒 —— decline 时 `false`。`resumePending` 的返回值是
89
+ * 「我推进了几条」,把没推进的算进去就是谎报(drain 之后每次扫描都报「唤醒了 N 条」,
90
+ * 而它们一条都没动)。⚠️ 审批那条(`approval-supervisor.ts` 的 `#expireAndResume`)计数口径略宽(在飞也计入),
91
+ * 那是既有行为、本批不动它。
92
+ */
93
+ wakeDue(rec, now) {
94
+ // 配套 5(drain 后不唤醒):停机是「不再往前推」,与 submit 在 drain 后回 503 同一条纪律。
95
+ // 不设这道闸,一条天级的 sleeping run 会在停机窗口里被叫起来接着跑 —— 部署卡在它身上。
96
+ // (重启后由新进程的首次 resumePending 唤醒:那时停机窗口早过去了。)
97
+ if (this.#deps.isDraining())
98
+ return false;
99
+ if (this.#inflightWakes.has(rec.taskId))
100
+ return false;
101
+ const run = this.#wakeDueInner(rec, now).finally(() => {
102
+ this.#inflightWakes.delete(rec.taskId);
103
+ });
104
+ this.#inflightWakes.set(rec.taskId, run);
105
+ // poll / resumePending 路径没有调用方接 reject —— 订阅掉,不得逃逸成 unhandled rejection
106
+ run.catch(() => undefined);
107
+ return true;
108
+ }
109
+ /**
110
+ * 重新派发前**必须**先把 `ownerId` 认领落库 —— 否则「认领」只是内存里的一个记号。
111
+ *
112
+ * 病灶:此前这里只改内存里的 `status`/`ownerId` 就 `void #execute(rec)`,真正的 save
113
+ * 要等到 `#executeInner`(还在 `#acquireSlot` 之后)。对 sqlite/redis 这类 `list()`
114
+ * 返回**反序列化新对象**的 store,这段窗口里再调一次 `resumePending()` 读到的仍是旧
115
+ * ownerId,`:305` 的过滤失效 → 同一个任务被再派发一次 → `app.run` 重复执行,副作用
116
+ * 与花费翻倍。`InMemoryTaskStore` 存的是对象引用,恰好掩盖了这个问题。
117
+ *
118
+ * 返回类型刻意保持 `number | Promise<number>`:同步 store 的 save 是同步的,认领当场
119
+ * 落地,返回数字(`submit`/`list` 那套「同步 store 保持同步门面」的约定不变);只有
120
+ * 真出现 thenable 才升级成 Promise,等所有认领落库后再统一派发。
121
+ */
122
+ #redispatch(recs, staleAfterMs, due) {
123
+ const now = Date.now();
124
+ // 挂起读数的对齐(读数纪律③):扫描本来就拿到了全表,顺手把 `/healthz` 的读数
125
+ // 按 store 重建一遍 —— 于是「漏了某个除名出口」只是下一次扫描前的偏差,不会永久漂移。
126
+ // 顺带把**他进程**(或本进程上一世)留下的挂起也算进本进程可见的那些(口径见
127
+ // `approvals.summary` 的注释:本进程看得见的记录,不假装是全局面)。
128
+ this.#deps.approvals.rebuild(recs);
129
+ // 惰性审批超时扫描(HITL):suspended **不捡走续跑**(它在等人,不是
130
+ // 孤儿 —— 崩溃续跑语义不适用于「等审批」),但读到它时顺手判超时:
131
+ // 到点自动全拒并重派(框架补的 deny 决定先进 store,再进引擎)。
132
+ let expired = 0;
133
+ for (const rec of recs) {
134
+ if (this.#deps.approvals.expireIfExpired(rec, now))
135
+ expired++;
136
+ }
137
+ // 到期唤醒(durable timer):在睡且到点的 timer 挂起 ⇒ 认领 + 重派(醒来重跑那一批)。
138
+ // 与上面那条循环并列而不是合并:两条闸的**原因判据互斥**,各读各的一眼可见;
139
+ // 合并成一个循环会让「谁的责任」藏进条件里。drain 之后不唤(`wakeDue` 里那道闸)。
140
+ // 输入(2026-09-28 ⑤):store 提供到期索引时 `due` 是「只回到期的」那一半 ——
141
+ // 仍过 `timerDue` 复核(索引口径是 status+wakeAt,原因那一半由这里兜,且
142
+ // `#wakeDueInner` 进闸后还会重读再判一次)。
143
+ let woken = 0;
144
+ for (const rec of due ?? recs) {
145
+ if (!timerDue(rec, now))
146
+ continue;
147
+ // 只算**真接管**的那些(drain / 已在飞 ⇒ 不算)—— 返回值是「推进了几条」的承诺
148
+ if (this.wakeDue(rec, now))
149
+ woken++;
150
+ }
151
+ // 认领判定外移到 resume-policy.ts:跳过原因具名化(terminal / suspended / own-process /
152
+ // owner-alive / too-fresh),每条规则与边界都由那份纯函数的单测钉住
153
+ const alive = (id) => this.#ownerLiveness(id);
154
+ const pending = recs.filter((r) => resumeSkipReason(r, {
155
+ ownerId: this.#deps.ownerId,
156
+ staleAfterMs,
157
+ now,
158
+ ownerAlive: alive,
159
+ }) === undefined);
160
+ const claims = [];
161
+ for (const rec of pending) {
162
+ rec.status = 'queued'; // 重新入队,由 #execute 统一推进
163
+ rec.ownerId = this.#deps.ownerId; // 认领:此后本进程的记录不再被(自己)重派
164
+ const saved = this.#deps.store.save(rec);
165
+ if (isThenable(saved)) {
166
+ // 落库失败则**不派发**:认领没落地,派发等于把上面那个重复执行的窗口重新打开
167
+ claims.push(Promise.resolve(saved).then(() => this.#deps.dispatch(rec)));
168
+ }
169
+ else {
170
+ // 派发走唯一入口(闸在 #dispatch 里)—— 外部深评 P2-1:认领循环以前绕过了那道闸。
171
+ this.#deps.dispatch(rec);
172
+ }
173
+ }
174
+ if (claims.length === 0)
175
+ return pending.length + expired + woken;
176
+ return Promise.all(claims).then(() => pending.length + expired + woken);
177
+ }
178
+ async #wakeDueInner(rec, now) {
179
+ // 进闸后**重读一遍**再判(与 approval-supervisor.ts 的 #expireAndResumeInner 同因):闸只互斥「进入」,
180
+ // 挡不住「进闸前已取到的旧副本」——异步 store 的 get 有往返,凭陈旧快照放行会重复派发。
181
+ const fresh = await this.#deps.store.get(rec.taskId);
182
+ const target = fresh ?? rec;
183
+ if (!timerDue(target, now))
184
+ return target;
185
+ target.status = 'running';
186
+ target.ownerId = this.#deps.ownerId;
187
+ let saved;
188
+ try {
189
+ saved = this.#deps.store.save(target);
190
+ }
191
+ catch {
192
+ return target; // 同步落库失败则不派发(先落库再派发,见 approval-supervisor.ts 的 #expireAndResumeInner)
193
+ }
194
+ if (isThenable(saved)) {
195
+ try {
196
+ await saved;
197
+ }
198
+ catch {
199
+ return target;
200
+ }
201
+ }
202
+ // 离开挂起态(读数纪律②)—— 落库成功之后才算醒来
203
+ this.#deps.approvals.unmarkSuspended(target.taskId);
204
+ // 派发走唯一入口(闸在 #dispatch 里判一次 —— 它同时盖住「进入时」与「窗口里刚进入停机」
205
+ // 两个时点,这里不必再判一遍)。
206
+ this.#deps.dispatch(target);
207
+ return target;
208
+ }
209
+ /**
210
+ * 「这条记录的主人还活着吗」—— 绑上本机主机名后的 pid 存活判定(见 `owner-liveness.ts`)。
211
+ *
212
+ * 只被 `#redispatch` 用,且只在 `staleAfterMs > 0` 时真正被问到(那道闸在 resume-policy
213
+ * 里,单源;缺省 0 = 不看他进程,与升级前逐字一致)。判定不写库、不改状态 —— 纯读数。
214
+ */
215
+ #ownerLiveness(ownerId) {
216
+ return ownerAlive(ownerId, this.#deps.host);
217
+ }
218
+ }
219
+ //# sourceMappingURL=resume-scanner.js.map