botmux 2.33.0 → 2.33.1

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 (281) hide show
  1. package/README.en.md +12 -1
  2. package/README.md +45 -1
  3. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  4. package/dist/adapters/cli/claude-code.js +11 -0
  5. package/dist/adapters/cli/claude-code.js.map +1 -1
  6. package/dist/cli/bots-list-output.d.ts +21 -0
  7. package/dist/cli/bots-list-output.d.ts.map +1 -0
  8. package/dist/cli/bots-list-output.js +23 -0
  9. package/dist/cli/bots-list-output.js.map +1 -0
  10. package/dist/cli/workflow.d.ts +13 -0
  11. package/dist/cli/workflow.d.ts.map +1 -0
  12. package/dist/cli/workflow.js +781 -0
  13. package/dist/cli/workflow.js.map +1 -0
  14. package/dist/cli.js +69 -14
  15. package/dist/cli.js.map +1 -1
  16. package/dist/core/command-handler.d.ts.map +1 -1
  17. package/dist/core/command-handler.js +211 -4
  18. package/dist/core/command-handler.js.map +1 -1
  19. package/dist/core/session-manager.d.ts +6 -1
  20. package/dist/core/session-manager.d.ts.map +1 -1
  21. package/dist/core/session-manager.js +22 -12
  22. package/dist/core/session-manager.js.map +1 -1
  23. package/dist/core/worker-pool.d.ts +13 -0
  24. package/dist/core/worker-pool.d.ts.map +1 -1
  25. package/dist/core/worker-pool.js +100 -6
  26. package/dist/core/worker-pool.js.map +1 -1
  27. package/dist/daemon.d.ts +3 -0
  28. package/dist/daemon.d.ts.map +1 -1
  29. package/dist/daemon.js +884 -3
  30. package/dist/daemon.js.map +1 -1
  31. package/dist/dashboard/auth.d.ts +36 -0
  32. package/dist/dashboard/auth.d.ts.map +1 -1
  33. package/dist/dashboard/auth.js +22 -0
  34. package/dist/dashboard/auth.js.map +1 -1
  35. package/dist/dashboard/web/app.js +20 -1
  36. package/dist/dashboard/web/app.js.map +1 -1
  37. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  38. package/dist/dashboard/web/i18n.js +356 -0
  39. package/dist/dashboard/web/i18n.js.map +1 -1
  40. package/dist/dashboard/web/workflow-catalog.d.ts +2 -0
  41. package/dist/dashboard/web/workflow-catalog.d.ts.map +1 -0
  42. package/dist/dashboard/web/workflow-catalog.js +323 -0
  43. package/dist/dashboard/web/workflow-catalog.js.map +1 -0
  44. package/dist/dashboard/web/workflows.d.ts +2 -0
  45. package/dist/dashboard/web/workflows.d.ts.map +1 -0
  46. package/dist/dashboard/web/workflows.js +1618 -0
  47. package/dist/dashboard/web/workflows.js.map +1 -0
  48. package/dist/dashboard/workflow-api.d.ts +23 -0
  49. package/dist/dashboard/workflow-api.d.ts.map +1 -0
  50. package/dist/dashboard/workflow-api.js +463 -0
  51. package/dist/dashboard/workflow-api.js.map +1 -0
  52. package/dist/dashboard-web/app.js +494 -199
  53. package/dist/dashboard-web/index.html +1 -0
  54. package/dist/dashboard-web/style.css +160 -6
  55. package/dist/dashboard-web/terminal-replay.html +227 -0
  56. package/dist/dashboard.js +29 -12
  57. package/dist/dashboard.js.map +1 -1
  58. package/dist/i18n/en.d.ts.map +1 -1
  59. package/dist/i18n/en.js +12 -0
  60. package/dist/i18n/en.js.map +1 -1
  61. package/dist/i18n/zh.d.ts.map +1 -1
  62. package/dist/i18n/zh.js +12 -0
  63. package/dist/i18n/zh.js.map +1 -1
  64. package/dist/im/lark/card-handler.d.ts +3 -0
  65. package/dist/im/lark/card-handler.d.ts.map +1 -1
  66. package/dist/im/lark/card-handler.js +27 -1
  67. package/dist/im/lark/card-handler.js.map +1 -1
  68. package/dist/im/lark/client.d.ts +19 -2
  69. package/dist/im/lark/client.d.ts.map +1 -1
  70. package/dist/im/lark/client.js +21 -2
  71. package/dist/im/lark/client.js.map +1 -1
  72. package/dist/im/lark/workflow-card-handler.d.ts +50 -0
  73. package/dist/im/lark/workflow-card-handler.d.ts.map +1 -0
  74. package/dist/im/lark/workflow-card-handler.js +152 -0
  75. package/dist/im/lark/workflow-card-handler.js.map +1 -0
  76. package/dist/im/lark/workflow-cards.d.ts +46 -0
  77. package/dist/im/lark/workflow-cards.d.ts.map +1 -0
  78. package/dist/im/lark/workflow-cards.js +226 -0
  79. package/dist/im/lark/workflow-cards.js.map +1 -0
  80. package/dist/im/lark/workflow-progress-card.d.ts +76 -0
  81. package/dist/im/lark/workflow-progress-card.d.ts.map +1 -0
  82. package/dist/im/lark/workflow-progress-card.js +279 -0
  83. package/dist/im/lark/workflow-progress-card.js.map +1 -0
  84. package/dist/im/lark/workflow-slash-command.d.ts +92 -0
  85. package/dist/im/lark/workflow-slash-command.d.ts.map +1 -0
  86. package/dist/im/lark/workflow-slash-command.js +185 -0
  87. package/dist/im/lark/workflow-slash-command.js.map +1 -0
  88. package/dist/services/group-creator.d.ts.map +1 -1
  89. package/dist/services/group-creator.js +17 -4
  90. package/dist/services/group-creator.js.map +1 -1
  91. package/dist/services/groups-store.d.ts +11 -0
  92. package/dist/services/groups-store.d.ts.map +1 -1
  93. package/dist/services/groups-store.js +26 -0
  94. package/dist/services/groups-store.js.map +1 -1
  95. package/dist/services/jsonl-cursor.d.ts +12 -0
  96. package/dist/services/jsonl-cursor.d.ts.map +1 -0
  97. package/dist/services/jsonl-cursor.js +45 -0
  98. package/dist/services/jsonl-cursor.js.map +1 -0
  99. package/dist/services/schedule-store.d.ts +35 -0
  100. package/dist/services/schedule-store.d.ts.map +1 -1
  101. package/dist/services/schedule-store.js +108 -1
  102. package/dist/services/schedule-store.js.map +1 -1
  103. package/dist/skills/definitions.d.ts.map +1 -1
  104. package/dist/skills/definitions.js +399 -0
  105. package/dist/skills/definitions.js.map +1 -1
  106. package/dist/types.d.ts +4 -0
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  109. package/dist/utils/cli-usage-limit.js +4 -0
  110. package/dist/utils/cli-usage-limit.js.map +1 -1
  111. package/dist/worker.js +118 -14
  112. package/dist/worker.js.map +1 -1
  113. package/dist/workflows/attempt-resume.d.ts +114 -0
  114. package/dist/workflows/attempt-resume.d.ts.map +1 -0
  115. package/dist/workflows/attempt-resume.js +385 -0
  116. package/dist/workflows/attempt-resume.js.map +1 -0
  117. package/dist/workflows/attempt-terminal.d.ts +21 -0
  118. package/dist/workflows/attempt-terminal.d.ts.map +1 -0
  119. package/dist/workflows/attempt-terminal.js +7 -0
  120. package/dist/workflows/attempt-terminal.js.map +1 -0
  121. package/dist/workflows/blob.d.ts +27 -0
  122. package/dist/workflows/blob.d.ts.map +1 -0
  123. package/dist/workflows/blob.js +39 -0
  124. package/dist/workflows/blob.js.map +1 -0
  125. package/dist/workflows/cancel-run.d.ts +45 -0
  126. package/dist/workflows/cancel-run.d.ts.map +1 -0
  127. package/dist/workflows/cancel-run.js +99 -0
  128. package/dist/workflows/cancel-run.js.map +1 -0
  129. package/dist/workflows/cancel.d.ts +111 -0
  130. package/dist/workflows/cancel.d.ts.map +1 -0
  131. package/dist/workflows/cancel.js +120 -0
  132. package/dist/workflows/cancel.js.map +1 -0
  133. package/dist/workflows/catalog.d.ts +60 -0
  134. package/dist/workflows/catalog.d.ts.map +1 -0
  135. package/dist/workflows/catalog.js +119 -0
  136. package/dist/workflows/catalog.js.map +1 -0
  137. package/dist/workflows/cold-attach.d.ts +30 -0
  138. package/dist/workflows/cold-attach.d.ts.map +1 -0
  139. package/dist/workflows/cold-attach.js +40 -0
  140. package/dist/workflows/cold-attach.js.map +1 -0
  141. package/dist/workflows/cold-scan.d.ts +21 -0
  142. package/dist/workflows/cold-scan.d.ts.map +1 -0
  143. package/dist/workflows/cold-scan.js +70 -0
  144. package/dist/workflows/cold-scan.js.map +1 -0
  145. package/dist/workflows/daemon-spawn.d.ts +117 -0
  146. package/dist/workflows/daemon-spawn.d.ts.map +1 -0
  147. package/dist/workflows/daemon-spawn.js +551 -0
  148. package/dist/workflows/daemon-spawn.js.map +1 -0
  149. package/dist/workflows/definition.d.ts +1309 -0
  150. package/dist/workflows/definition.d.ts.map +1 -0
  151. package/dist/workflows/definition.js +334 -0
  152. package/dist/workflows/definition.js.map +1 -0
  153. package/dist/workflows/effect-input.d.ts +4 -0
  154. package/dist/workflows/effect-input.d.ts.map +1 -0
  155. package/dist/workflows/effect-input.js +18 -0
  156. package/dist/workflows/effect-input.js.map +1 -0
  157. package/dist/workflows/events/append.d.ts +77 -0
  158. package/dist/workflows/events/append.d.ts.map +1 -0
  159. package/dist/workflows/events/append.js +214 -0
  160. package/dist/workflows/events/append.js.map +1 -0
  161. package/dist/workflows/events/idempotency.d.ts +77 -0
  162. package/dist/workflows/events/idempotency.d.ts.map +1 -0
  163. package/dist/workflows/events/idempotency.js +116 -0
  164. package/dist/workflows/events/idempotency.js.map +1 -0
  165. package/dist/workflows/events/index.d.ts +7 -0
  166. package/dist/workflows/events/index.d.ts.map +1 -0
  167. package/dist/workflows/events/index.js +7 -0
  168. package/dist/workflows/events/index.js.map +1 -0
  169. package/dist/workflows/events/payloads.d.ts +917 -0
  170. package/dist/workflows/events/payloads.d.ts.map +1 -0
  171. package/dist/workflows/events/payloads.js +337 -0
  172. package/dist/workflows/events/payloads.js.map +1 -0
  173. package/dist/workflows/events/replay.d.ts +238 -0
  174. package/dist/workflows/events/replay.d.ts.map +1 -0
  175. package/dist/workflows/events/replay.js +608 -0
  176. package/dist/workflows/events/replay.js.map +1 -0
  177. package/dist/workflows/events/schema.d.ts +5242 -0
  178. package/dist/workflows/events/schema.d.ts.map +1 -0
  179. package/dist/workflows/events/schema.js +295 -0
  180. package/dist/workflows/events/schema.js.map +1 -0
  181. package/dist/workflows/events/types.d.ts +34 -0
  182. package/dist/workflows/events/types.d.ts.map +1 -0
  183. package/dist/workflows/events/types.js +2 -0
  184. package/dist/workflows/events/types.js.map +1 -0
  185. package/dist/workflows/fanout.d.ts +36 -0
  186. package/dist/workflows/fanout.d.ts.map +1 -0
  187. package/dist/workflows/fanout.js +114 -0
  188. package/dist/workflows/fanout.js.map +1 -0
  189. package/dist/workflows/hostExecutors/botmux-schedule.d.ts +41 -0
  190. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -0
  191. package/dist/workflows/hostExecutors/botmux-schedule.js +121 -0
  192. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -0
  193. package/dist/workflows/hostExecutors/feishu-im.d.ts +12 -0
  194. package/dist/workflows/hostExecutors/feishu-im.d.ts.map +1 -0
  195. package/dist/workflows/hostExecutors/feishu-im.js +49 -0
  196. package/dist/workflows/hostExecutors/feishu-im.js.map +1 -0
  197. package/dist/workflows/hostExecutors/feishu-reply.d.ts +24 -0
  198. package/dist/workflows/hostExecutors/feishu-reply.d.ts.map +1 -0
  199. package/dist/workflows/hostExecutors/feishu-reply.js +88 -0
  200. package/dist/workflows/hostExecutors/feishu-reply.js.map +1 -0
  201. package/dist/workflows/hostExecutors/feishu-send.d.ts +23 -0
  202. package/dist/workflows/hostExecutors/feishu-send.d.ts.map +1 -0
  203. package/dist/workflows/hostExecutors/feishu-send.js +124 -0
  204. package/dist/workflows/hostExecutors/feishu-send.js.map +1 -0
  205. package/dist/workflows/hostExecutors/index.d.ts +8 -0
  206. package/dist/workflows/hostExecutors/index.d.ts.map +1 -0
  207. package/dist/workflows/hostExecutors/index.js +8 -0
  208. package/dist/workflows/hostExecutors/index.js.map +1 -0
  209. package/dist/workflows/hostExecutors/protocol.d.ts +42 -0
  210. package/dist/workflows/hostExecutors/protocol.d.ts.map +1 -0
  211. package/dist/workflows/hostExecutors/protocol.js +181 -0
  212. package/dist/workflows/hostExecutors/protocol.js.map +1 -0
  213. package/dist/workflows/hostExecutors/registry.d.ts +10 -0
  214. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -0
  215. package/dist/workflows/hostExecutors/registry.js +36 -0
  216. package/dist/workflows/hostExecutors/registry.js.map +1 -0
  217. package/dist/workflows/hostExecutors/types.d.ts +78 -0
  218. package/dist/workflows/hostExecutors/types.d.ts.map +1 -0
  219. package/dist/workflows/hostExecutors/types.js +2 -0
  220. package/dist/workflows/hostExecutors/types.js.map +1 -0
  221. package/dist/workflows/loader.d.ts +16 -0
  222. package/dist/workflows/loader.d.ts.map +1 -0
  223. package/dist/workflows/loader.js +56 -0
  224. package/dist/workflows/loader.js.map +1 -0
  225. package/dist/workflows/loop.d.ts +50 -0
  226. package/dist/workflows/loop.d.ts.map +1 -0
  227. package/dist/workflows/loop.js +350 -0
  228. package/dist/workflows/loop.js.map +1 -0
  229. package/dist/workflows/ops-projection.d.ts +168 -0
  230. package/dist/workflows/ops-projection.d.ts.map +1 -0
  231. package/dist/workflows/ops-projection.js +707 -0
  232. package/dist/workflows/ops-projection.js.map +1 -0
  233. package/dist/workflows/orchestrator.d.ts +107 -0
  234. package/dist/workflows/orchestrator.d.ts.map +1 -0
  235. package/dist/workflows/orchestrator.js +197 -0
  236. package/dist/workflows/orchestrator.js.map +1 -0
  237. package/dist/workflows/output-binding.d.ts +70 -0
  238. package/dist/workflows/output-binding.d.ts.map +1 -0
  239. package/dist/workflows/output-binding.js +265 -0
  240. package/dist/workflows/output-binding.js.map +1 -0
  241. package/dist/workflows/params.d.ts +61 -0
  242. package/dist/workflows/params.d.ts.map +1 -0
  243. package/dist/workflows/params.js +195 -0
  244. package/dist/workflows/params.js.map +1 -0
  245. package/dist/workflows/resume.d.ts +263 -0
  246. package/dist/workflows/resume.d.ts.map +1 -0
  247. package/dist/workflows/resume.js +808 -0
  248. package/dist/workflows/resume.js.map +1 -0
  249. package/dist/workflows/run-id.d.ts +2 -0
  250. package/dist/workflows/run-id.d.ts.map +1 -0
  251. package/dist/workflows/run-id.js +7 -0
  252. package/dist/workflows/run-id.js.map +1 -0
  253. package/dist/workflows/run-init.d.ts +48 -0
  254. package/dist/workflows/run-init.d.ts.map +1 -0
  255. package/dist/workflows/run-init.js +99 -0
  256. package/dist/workflows/run-init.js.map +1 -0
  257. package/dist/workflows/runs-dir.d.ts +4 -0
  258. package/dist/workflows/runs-dir.d.ts.map +1 -0
  259. package/dist/workflows/runs-dir.js +15 -0
  260. package/dist/workflows/runs-dir.js.map +1 -0
  261. package/dist/workflows/runtime.d.ts +211 -0
  262. package/dist/workflows/runtime.d.ts.map +1 -0
  263. package/dist/workflows/runtime.js +594 -0
  264. package/dist/workflows/runtime.js.map +1 -0
  265. package/dist/workflows/spawn-bot.d.ts +165 -0
  266. package/dist/workflows/spawn-bot.d.ts.map +1 -0
  267. package/dist/workflows/spawn-bot.js +215 -0
  268. package/dist/workflows/spawn-bot.js.map +1 -0
  269. package/dist/workflows/system.d.ts +49 -0
  270. package/dist/workflows/system.d.ts.map +1 -0
  271. package/dist/workflows/system.js +48 -0
  272. package/dist/workflows/system.js.map +1 -0
  273. package/dist/workflows/trigger-run.d.ts +70 -0
  274. package/dist/workflows/trigger-run.d.ts.map +1 -0
  275. package/dist/workflows/trigger-run.js +88 -0
  276. package/dist/workflows/trigger-run.js.map +1 -0
  277. package/dist/workflows/wait.d.ts +120 -0
  278. package/dist/workflows/wait.d.ts.map +1 -0
  279. package/dist/workflows/wait.js +181 -0
  280. package/dist/workflows/wait.js.map +1 -0
  281. package/package.json +3 -3
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Resume + reconcile algorithm (events doc v0.1.2 §4.3 + §4.3.1).
3
+ *
4
+ * Entry point for daemon restart / hand-off. Walks the event log,
5
+ * replays a snapshot, then drives reconcile decisions for each dangling
6
+ * `effectAttempted` and writes terminal events for `pure skill`
7
+ * activities that crashed mid-flight (workerLost path).
8
+ *
9
+ * Step 7 boundaries:
10
+ * - Resume DOES NOT execute activity logic; reconcile uses provider
11
+ * capabilities (`readOnlyLookup` / `idempotentSubmit`) to decide
12
+ * terminal state without re-issuing user-visible work beyond what
13
+ * idempotency guarantees.
14
+ * - Resume DOES NOT decide retry policy. A `freshRetry` decision
15
+ * leaves the attempt dangling — the scheduler (Step 8+) is
16
+ * responsible for spawning the actual replacement attempt.
17
+ * - Dangling waits are left alone (waiting for external signal).
18
+ *
19
+ * Round 1 fixes (codex review of `1d14081`):
20
+ * F1 — replay surfaces the latest reconcileResult per attempt; resume
21
+ * consumes it before re-running the decision tree, so a crash
22
+ * between reconcileResult and the terminal event is recoverable.
23
+ * F2 — reconcilers receive the materialized effect input via the
24
+ * caller-supplied `loadEffectInput` callback. Reconcilers that
25
+ * require input (e.g. Feishu — chatId/rootMessageId/content can't
26
+ * be reconstructed from idempotencyKey alone) fail explicitly
27
+ * when input is unrecoverable.
28
+ * F3 — `retryable` failures from idempotentSubmit do NOT terminate
29
+ * the attempt; the activity stays dangling and is surfaced in
30
+ * `ResumeResult.transientFailures` for the caller to retry.
31
+ * F4 — `resumeStarted` is written ONLY after a preflight validates
32
+ * the log is replayable; bad inputs throw without polluting the
33
+ * run event log.
34
+ */
35
+ import type { EventLog } from './events/append.js';
36
+ import { type Snapshot, type AttemptState } from './events/replay.js';
37
+ import type { ActivityCanceledEvent, ActivityFailedEvent, ActivitySucceededEvent, ReconcileResultEvent, ResumeStartedEvent } from './events/types.js';
38
+ export type ReconcileCapability = 'readOnlyLookup' | 'idempotentSubmit' | 'none';
39
+ export type ReconcileDecision = 'replayed' | 'completedByIdempotentSubmit' | 'manual' | 'freshRetry';
40
+ export type ReadOnlyLookupResult = {
41
+ found: true;
42
+ externalRefs: Record<string, unknown>;
43
+ evidence?: Record<string, unknown>;
44
+ } | {
45
+ found: false;
46
+ evidence?: Record<string, unknown>;
47
+ };
48
+ export type IdempotentSubmitResult = {
49
+ ok: true;
50
+ externalRefs: Record<string, unknown>;
51
+ evidence?: Record<string, unknown>;
52
+ } | {
53
+ ok: false;
54
+ errorCode: string;
55
+ errorClass: 'retryable' | 'fatal' | 'userFault' | 'manual';
56
+ errorMessage: string;
57
+ evidence?: Record<string, unknown>;
58
+ };
59
+ /**
60
+ * Per-provider capability bundle. Resume looks up the reconciler by the
61
+ * `effectAttempted.provider` field; missing entries fall through to
62
+ * manual/UnknownProviderError.
63
+ *
64
+ * Reconcilers receive the materialized effect input alongside the
65
+ * idempotencyKey: providers like Feishu can't re-construct the request
66
+ * body from the key alone (the key is a hash, not the body). When the
67
+ * caller doesn't supply `loadEffectInput`, resume treats the input as
68
+ * `undefined`; reconcilers that NEED input MUST declare so via
69
+ * `requiresEffectInput` so resume can fail fast with a clear error
70
+ * instead of letting the reconciler silently misbehave.
71
+ */
72
+ export interface ProviderReconciler {
73
+ readonly provider: string;
74
+ /**
75
+ * When `true`, resume refuses to call this reconciler without a
76
+ * materialized effect input — i.e. it writes manual/InputUnrecoverable
77
+ * if `loadEffectInput` is absent or throws. Feishu sets this; schedule
78
+ * does not (idempotencyKey is the full key).
79
+ */
80
+ readonly requiresEffectInput?: boolean;
81
+ /**
82
+ * Pure read against the provider keyed by `idempotencyKey`. Has no
83
+ * side effects; safe to call from resume even when we don't intend to
84
+ * complete the effect. Schedule has it (`getTask(id)`); Feishu does
85
+ * not (no uuid-reverse-lookup API).
86
+ */
87
+ readOnlyLookup?(idempotencyKey: string, input: unknown): Promise<ReadOnlyLookupResult>;
88
+ /**
89
+ * Re-submit the effect with the same `idempotencyKey`. MAY produce
90
+ * the side effect for real (if the original pre-invoke crash never
91
+ * reached the provider); provider dedupe inside TTL guarantees the
92
+ * second submit returns the original ref instead of a duplicate.
93
+ */
94
+ idempotentSubmit?(idempotencyKey: string, input: unknown): Promise<IdempotentSubmitResult>;
95
+ /**
96
+ * Canonical form of the loaded effect input — used at resume time to
97
+ * recompute `inputHash` and compare against `effectAttempted.inputHash`.
98
+ * MUST mirror the executor's `canonicalInput` exactly; mismatched
99
+ * canonicalization across resume/dispatch silently breaks idempotency.
100
+ *
101
+ * Reconcilers with `requiresEffectInput=true` SHOULD implement this;
102
+ * resume writes `IdempotencyInputMismatch/manual` if a tampered or
103
+ * drifted sidecar would otherwise reach the provider with a different
104
+ * body than the original attempt promised.
105
+ */
106
+ canonicalInput?(input: unknown): unknown;
107
+ }
108
+ export type ResumeContext = {
109
+ /** Authoritative event log for this run. Resume writes events into it. */
110
+ log: EventLog;
111
+ /** Match `log.runId`; passed explicitly so the contract is visible. */
112
+ runId: string;
113
+ /** Daemon identifier for the resumeStarted audit event. */
114
+ daemonId: string;
115
+ /** Reconcilers keyed by provider name (`feishu-im`, `botmux-schedule`). */
116
+ reconcilers: Map<string, ProviderReconciler>;
117
+ /**
118
+ * Load the materialized effect input that was passed to the original
119
+ * attempt. Required for providers that re-submit (Feishu). Resume
120
+ * passes the returned value to the reconciler's readOnlyLookup /
121
+ * idempotentSubmit.
122
+ *
123
+ * v0: the caller (daemon) decides where to persist or recover this —
124
+ * in-memory while alive, or some external storage on cold start.
125
+ * Resume only consumes the callback.
126
+ *
127
+ * Returning `undefined` is treated as "input unrecoverable" and
128
+ * triggers the manual/InputUnrecoverable path for reconcilers that
129
+ * declared `requiresEffectInput`.
130
+ */
131
+ loadEffectInput?(activityId: string, attemptId: string): Promise<unknown>;
132
+ /** Injectable clock for deterministic tests. Defaults to Date.now. */
133
+ now?: () => number;
134
+ };
135
+ export type ReconcileOutcome = {
136
+ activityId: string;
137
+ attemptId: string;
138
+ idempotencyKey: string;
139
+ provider: string;
140
+ capability: ReconcileCapability;
141
+ decision: ReconcileDecision;
142
+ evidence: Record<string, unknown>;
143
+ /**
144
+ * Terminal event written as a consequence. null for `replayed` (the
145
+ * pre-existing terminal IS the consequence) and `freshRetry` (scheduler
146
+ * issues a new attempt later, not Step 7's job).
147
+ */
148
+ terminalEvent: ActivitySucceededEvent | ActivityFailedEvent | null;
149
+ /** The reconcileResult event written, or null if this outcome reused
150
+ * a pre-existing reconcileResult (recovery path — codex F1). */
151
+ reconcileEvent: ReconcileResultEvent | null;
152
+ /** True when this outcome recovered a prior crashed reconcile cycle
153
+ * rather than running the decision tree from scratch. */
154
+ recovered: boolean;
155
+ };
156
+ export type WorkerCrashedOutcome = {
157
+ activityId: string;
158
+ attemptId: string;
159
+ terminalEvent: ActivityFailedEvent;
160
+ };
161
+ /**
162
+ * Recovery of a wait whose resolution event landed but whose activity
163
+ * terminal was never written (crash between `waitResolved` /
164
+ * `waitDeadlineExceeded` and the terminal). Step 8: replay surfaces
165
+ * these as `Snapshot.danglingWaitResolutions`; resume materializes the
166
+ * terminal from the recorded resolution.
167
+ */
168
+ export type WaitRecoveryOutcome = {
169
+ activityId: string;
170
+ attemptId: string;
171
+ /** What the recovery decided to write. */
172
+ kind: 'succeeded' | 'failed';
173
+ source: 'resolved' | 'deadlineExceeded';
174
+ terminalEvent: ActivitySucceededEvent | ActivityFailedEvent;
175
+ };
176
+ /**
177
+ * Recovery of a cancel whose request landed but whose activity
178
+ * terminal was never written (crash between `cancelRequested` /
179
+ * `cancelDelivered` and the terminal). Step 9: replay surfaces these
180
+ * as `Snapshot.danglingCancels`.
181
+ *
182
+ * The terminal resume writes depends on whether the cancelled
183
+ * attempt also had a dangling `effectAttempted` (Step 9 round 1
184
+ * finding 1):
185
+ *
186
+ * - **No effectAttempted** (plain cancel): resume writes
187
+ * `activityCanceled` directly, with `cancelOriginEventId`
188
+ * pointing at the originating `cancelRequested`.
189
+ * - **effectAttempted present** (cancel + effect): resume FIRST
190
+ * runs reconcile to capture provider evidence (writes
191
+ * `reconcileResult` with cancel-coupled keys — see
192
+ * payloads.ts `ReconcileResultPayload` doc), THEN decides:
193
+ * - `completedByIdempotentSubmit` / `freshRetry` →
194
+ * `activityCanceled` (cancel wins as terminal reason; the
195
+ * provider's outcome is preserved in reconcileResult evidence)
196
+ * - `manual` (TTL expired / unknown provider / submit errored
197
+ * fatally) → `activityFailed{manual}` — we deliberately do
198
+ * NOT write `activityCanceled` because provider state is
199
+ * unknown and pretending the cancel cleanly succeeded would
200
+ * lie to forensics
201
+ * - `transient` → NO terminal; the activity stays dangling and
202
+ * the next resume cycle retries (surfaces as a
203
+ * `TransientReconcileFailure` on `ResumeResult.transientFailures`)
204
+ */
205
+ export type CancelRecoveryOutcome = {
206
+ activityId: string;
207
+ attemptId: string;
208
+ cancelOriginEventId: string;
209
+ /** True if cancelDelivered was already written; false means we
210
+ * short-circuited a never-delivered cancel. Both still terminate
211
+ * the activity (cancel intent is authoritative). */
212
+ delivered: boolean;
213
+ /**
214
+ * What terminal we ended up writing. `cancelled` is the regular
215
+ * cancel terminal; `failed` is the "manual escalation" path when
216
+ * reconcile evidence is non-conclusive (Step 9 finding 1).
217
+ */
218
+ kind: 'cancelled' | 'failed';
219
+ /** Present when reconcile ran alongside cancel — i.e. the activity
220
+ * had a dangling effectAttempted. Pure cancels (no effect) leave
221
+ * this undefined. */
222
+ reconcileEvent?: ReconcileResultEvent;
223
+ /**
224
+ * The reconcile decision that informed the cancel terminal (only
225
+ * populated when the activity had a dangling effectAttempted).
226
+ * - For `completedByIdempotentSubmit` and `freshRetry`, terminal is
227
+ * `activityCanceled`.
228
+ * - For `manual`, terminal is `activityFailed{manual}`.
229
+ */
230
+ reconcileDecision?: ReconcileDecision;
231
+ terminalEvent: ActivityCanceledEvent | ActivityFailedEvent;
232
+ };
233
+ /**
234
+ * Reconcile failures that resume DELIBERATELY does not terminate (codex
235
+ * F3): a retryable provider failure during idempotentSubmit might mean
236
+ * "request landed, response lost", and writing a manual terminal there
237
+ * would freeze the activity in a wrong terminal state. Resume reports
238
+ * these back to the caller and leaves the activity dangling so the next
239
+ * resume cycle can retry.
240
+ */
241
+ export type TransientReconcileFailure = {
242
+ activityId: string;
243
+ attemptId: string;
244
+ provider: string;
245
+ idempotencyKey: string;
246
+ errorCode: string;
247
+ errorClass: 'retryable';
248
+ errorMessage: string;
249
+ };
250
+ export type ResumeResult = {
251
+ resumeStartedEvent: ResumeStartedEvent;
252
+ /** Snapshot captured after `resumeStarted` is appended. Returned for
253
+ * observability — caller can inspect dangling sets it consumed. */
254
+ snapshot: Snapshot;
255
+ reconcileOutcomes: ReconcileOutcome[];
256
+ workerCrashedOutcomes: WorkerCrashedOutcome[];
257
+ transientFailures: TransientReconcileFailure[];
258
+ waitRecoveryOutcomes: WaitRecoveryOutcome[];
259
+ cancelRecoveryOutcomes: CancelRecoveryOutcome[];
260
+ };
261
+ export declare function resume(ctx: ResumeContext): Promise<ResumeResult>;
262
+ export type { AttemptState };
263
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/workflows/resume.ts"],"names":[],"mappings":"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"}