botmux 3.9.2 → 3.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 (314) hide show
  1. package/README.en.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/.runtime-build-id +1 -1
  4. package/dist/adapters/cli/codex.d.ts.map +1 -1
  5. package/dist/adapters/cli/codex.js +6 -0
  6. package/dist/adapters/cli/codex.js.map +1 -1
  7. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  8. package/dist/adapters/cli/opencode.js +7 -1
  9. package/dist/adapters/cli/opencode.js.map +1 -1
  10. package/dist/adapters/cli/reasonix.d.ts +35 -0
  11. package/dist/adapters/cli/reasonix.d.ts.map +1 -0
  12. package/dist/adapters/cli/reasonix.js +236 -0
  13. package/dist/adapters/cli/reasonix.js.map +1 -0
  14. package/dist/adapters/cli/registry.d.ts +2 -1
  15. package/dist/adapters/cli/registry.d.ts.map +1 -1
  16. package/dist/adapters/cli/registry.js +4 -1
  17. package/dist/adapters/cli/registry.js.map +1 -1
  18. package/dist/adapters/cli/types.d.ts +5 -1
  19. package/dist/adapters/cli/types.d.ts.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +168 -62
  22. package/dist/cli.js.map +1 -1
  23. package/dist/core/command-handler.d.ts +18 -4
  24. package/dist/core/command-handler.d.ts.map +1 -1
  25. package/dist/core/command-handler.js +234 -26
  26. package/dist/core/command-handler.js.map +1 -1
  27. package/dist/core/dashboard-ipc-server.d.ts +1 -0
  28. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  29. package/dist/core/dashboard-ipc-server.js +27 -3
  30. package/dist/core/dashboard-ipc-server.js.map +1 -1
  31. package/dist/core/dispatch.d.ts +54 -24
  32. package/dist/core/dispatch.d.ts.map +1 -1
  33. package/dist/core/dispatch.js +81 -27
  34. package/dist/core/dispatch.js.map +1 -1
  35. package/dist/core/input-turn-dedupe.d.ts +20 -0
  36. package/dist/core/input-turn-dedupe.d.ts.map +1 -0
  37. package/dist/core/input-turn-dedupe.js +57 -0
  38. package/dist/core/input-turn-dedupe.js.map +1 -0
  39. package/dist/core/local-terminal-opener.d.ts.map +1 -1
  40. package/dist/core/local-terminal-opener.js +10 -1
  41. package/dist/core/local-terminal-opener.js.map +1 -1
  42. package/dist/core/passthrough-commands.d.ts.map +1 -1
  43. package/dist/core/passthrough-commands.js +1 -1
  44. package/dist/core/passthrough-commands.js.map +1 -1
  45. package/dist/core/plugins/pm2.d.ts.map +1 -1
  46. package/dist/core/plugins/pm2.js +7 -1
  47. package/dist/core/plugins/pm2.js.map +1 -1
  48. package/dist/core/resource-monitor/attribution.d.ts.map +1 -1
  49. package/dist/core/resource-monitor/attribution.js +17 -1
  50. package/dist/core/resource-monitor/attribution.js.map +1 -1
  51. package/dist/core/resource-monitor/darwin.d.ts +145 -0
  52. package/dist/core/resource-monitor/darwin.d.ts.map +1 -0
  53. package/dist/core/resource-monitor/darwin.js +360 -0
  54. package/dist/core/resource-monitor/darwin.js.map +1 -0
  55. package/dist/core/resource-monitor/procfs.d.ts.map +1 -1
  56. package/dist/core/resource-monitor/procfs.js +6 -0
  57. package/dist/core/resource-monitor/procfs.js.map +1 -1
  58. package/dist/core/resource-monitor/types.d.ts +1 -1
  59. package/dist/core/resource-monitor/types.d.ts.map +1 -1
  60. package/dist/core/scheduler.d.ts.map +1 -1
  61. package/dist/core/scheduler.js +5 -2
  62. package/dist/core/scheduler.js.map +1 -1
  63. package/dist/core/session-discovery.d.ts.map +1 -1
  64. package/dist/core/session-discovery.js +3 -0
  65. package/dist/core/session-discovery.js.map +1 -1
  66. package/dist/core/session-manager.d.ts +3 -1
  67. package/dist/core/session-manager.d.ts.map +1 -1
  68. package/dist/core/session-manager.js +46 -0
  69. package/dist/core/session-manager.js.map +1 -1
  70. package/dist/core/session-marker.d.ts +1 -8
  71. package/dist/core/session-marker.d.ts.map +1 -1
  72. package/dist/core/session-marker.js +2 -50
  73. package/dist/core/session-marker.js.map +1 -1
  74. package/dist/core/types.d.ts +3 -1
  75. package/dist/core/types.d.ts.map +1 -1
  76. package/dist/core/types.js.map +1 -1
  77. package/dist/core/worker-pool.d.ts +17 -0
  78. package/dist/core/worker-pool.d.ts.map +1 -1
  79. package/dist/core/worker-pool.js +292 -9
  80. package/dist/core/worker-pool.js.map +1 -1
  81. package/dist/daemon.d.ts.map +1 -1
  82. package/dist/daemon.js +27 -12
  83. package/dist/daemon.js.map +1 -1
  84. package/dist/dashboard/daemon-internal-api.d.ts.map +1 -1
  85. package/dist/dashboard/daemon-internal-api.js +11 -2
  86. package/dist/dashboard/daemon-internal-api.js.map +1 -1
  87. package/dist/dashboard/groups-action-helpers.d.ts +2 -0
  88. package/dist/dashboard/groups-action-helpers.d.ts.map +1 -1
  89. package/dist/dashboard/groups-action-helpers.js +9 -0
  90. package/dist/dashboard/groups-action-helpers.js.map +1 -1
  91. package/dist/dashboard/groups-matrix-snapshot.d.ts +56 -0
  92. package/dist/dashboard/groups-matrix-snapshot.d.ts.map +1 -0
  93. package/dist/dashboard/groups-matrix-snapshot.js +127 -0
  94. package/dist/dashboard/groups-matrix-snapshot.js.map +1 -0
  95. package/dist/dashboard/resource-monitor-service.d.ts.map +1 -1
  96. package/dist/dashboard/resource-monitor-service.js +18 -2
  97. package/dist/dashboard/resource-monitor-service.js.map +1 -1
  98. package/dist/dashboard/web/app.d.ts.map +1 -1
  99. package/dist/dashboard/web/app.js +45 -4
  100. package/dist/dashboard/web/app.js.map +1 -1
  101. package/dist/dashboard/web/groups-api.js +1 -1
  102. package/dist/dashboard/web/groups-api.js.map +1 -1
  103. package/dist/dashboard/web/i18n.js +10 -10
  104. package/dist/dashboard/web/i18n.js.map +1 -1
  105. package/dist/dashboard/web/roles-page.d.ts.map +1 -1
  106. package/dist/dashboard/web/roles-page.js +26 -11
  107. package/dist/dashboard/web/roles-page.js.map +1 -1
  108. package/dist/dashboard-web/app.js +1 -1
  109. package/dist/dashboard-web/chunks/{bot-defaults-page-BHTQEWCH.js → bot-defaults-page-LTVOUDIS.js} +1 -1
  110. package/dist/dashboard-web/chunks/{chunk-KLZCQAHF.js → chunk-3UE7S77S.js} +1 -1
  111. package/dist/dashboard-web/chunks/{chunk-W77TPKZH.js → chunk-DCS35UMD.js} +1 -1
  112. package/dist/dashboard-web/chunks/{chunk-E3HZZXK5.js → chunk-MFQPCVHY.js} +4 -4
  113. package/dist/dashboard-web/chunks/{chunk-EZH56JCI.js → chunk-ZU3UUKAR.js} +1 -1
  114. package/dist/dashboard-web/chunks/{connectors-page-BP255CAX.js → connectors-page-5KWDIMKC.js} +1 -1
  115. package/dist/dashboard-web/chunks/{groups-page-CDHVXBUT.js → groups-page-FHOKYXMW.js} +1 -1
  116. package/dist/dashboard-web/chunks/{insights-page-57BFE6GT.js → insights-page-T2ZX2RWL.js} +1 -1
  117. package/dist/dashboard-web/chunks/{monitor-room-UTOYGQVF.js → monitor-room-YNVBAGR6.js} +1 -1
  118. package/dist/dashboard-web/chunks/{monitoring-page-WTHYAIUM.js → monitoring-page-LHM55YWN.js} +1 -1
  119. package/dist/dashboard-web/chunks/{office-page-JSMIB353.js → office-page-ATXVP7PW.js} +1 -1
  120. package/dist/dashboard-web/chunks/{overview-page-3VDBOH7L.js → overview-page-QYI3KBDD.js} +1 -1
  121. package/dist/dashboard-web/chunks/roles-page-56VWM6CD.js +1 -0
  122. package/dist/dashboard-web/chunks/{schedules-page-HHN736H6.js → schedules-page-S5K6U4EO.js} +1 -1
  123. package/dist/dashboard-web/chunks/{sessions-page-EIWOZD7A.js → sessions-page-WBP4N7D2.js} +1 -1
  124. package/dist/dashboard-web/chunks/{settings-page-2IUT5LS4.js → settings-page-QUZDQARR.js} +1 -1
  125. package/dist/dashboard-web/chunks/{skills-page-JKFKMUEM.js → skills-page-IFY7AEND.js} +1 -1
  126. package/dist/dashboard-web/chunks/{team-federation-page-Q2PXC3UY.js → team-federation-page-C7FJQPFZ.js} +1 -1
  127. package/dist/dashboard-web/chunks/{v3-page-EBQCD4AO.js → v3-page-2LMF3WWR.js} +1 -1
  128. package/dist/dashboard-web/chunks/{whiteboards-page-QZRMVNZN.js → whiteboards-page-3XC6QRMY.js} +1 -1
  129. package/dist/dashboard-web/style.css +2 -4
  130. package/dist/dashboard.js +65 -9
  131. package/dist/dashboard.js.map +1 -1
  132. package/dist/i18n/en.d.ts.map +1 -1
  133. package/dist/i18n/en.js +33 -7
  134. package/dist/i18n/en.js.map +1 -1
  135. package/dist/i18n/zh.d.ts.map +1 -1
  136. package/dist/i18n/zh.js +31 -7
  137. package/dist/i18n/zh.js.map +1 -1
  138. package/dist/im/lark/card-builder.d.ts +7 -0
  139. package/dist/im/lark/card-builder.d.ts.map +1 -1
  140. package/dist/im/lark/card-builder.js +56 -0
  141. package/dist/im/lark/card-builder.js.map +1 -1
  142. package/dist/im/lark/card-handler.d.ts.map +1 -1
  143. package/dist/im/lark/card-handler.js +42 -19
  144. package/dist/im/lark/card-handler.js.map +1 -1
  145. package/dist/im/lark/client.d.ts +10 -0
  146. package/dist/im/lark/client.d.ts.map +1 -1
  147. package/dist/im/lark/client.js +79 -0
  148. package/dist/im/lark/client.js.map +1 -1
  149. package/dist/im/lark/event-dispatcher.d.ts +14 -1
  150. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  151. package/dist/im/lark/event-dispatcher.js +171 -15
  152. package/dist/im/lark/event-dispatcher.js.map +1 -1
  153. package/dist/im/lark/lark-hosts.d.ts +5 -0
  154. package/dist/im/lark/lark-hosts.d.ts.map +1 -1
  155. package/dist/im/lark/lark-hosts.js +10 -0
  156. package/dist/im/lark/lark-hosts.js.map +1 -1
  157. package/dist/im/lark/message-parser.d.ts.map +1 -1
  158. package/dist/im/lark/message-parser.js +24 -7
  159. package/dist/im/lark/message-parser.js.map +1 -1
  160. package/dist/pm2-graceful-exit.d.ts +28 -0
  161. package/dist/pm2-graceful-exit.d.ts.map +1 -0
  162. package/dist/pm2-graceful-exit.js +39 -0
  163. package/dist/pm2-graceful-exit.js.map +1 -0
  164. package/dist/services/bridge-fallback-gate.d.ts +9 -2
  165. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  166. package/dist/services/bridge-fallback-gate.js +31 -19
  167. package/dist/services/bridge-fallback-gate.js.map +1 -1
  168. package/dist/services/message-listener-store.d.ts +18 -0
  169. package/dist/services/message-listener-store.d.ts.map +1 -1
  170. package/dist/services/message-listener-store.js +35 -10
  171. package/dist/services/message-listener-store.js.map +1 -1
  172. package/dist/services/message-listener.d.ts +17 -0
  173. package/dist/services/message-listener.d.ts.map +1 -1
  174. package/dist/services/message-listener.js +26 -0
  175. package/dist/services/message-listener.js.map +1 -1
  176. package/dist/setup/bot-config-editor.d.ts.map +1 -1
  177. package/dist/setup/bot-config-editor.js +2 -0
  178. package/dist/setup/bot-config-editor.js.map +1 -1
  179. package/dist/setup/lark-scopes.json +1 -0
  180. package/dist/setup/verify-permissions.d.ts.map +1 -1
  181. package/dist/setup/verify-permissions.js +8 -0
  182. package/dist/setup/verify-permissions.js.map +1 -1
  183. package/dist/types.d.ts +34 -0
  184. package/dist/types.d.ts.map +1 -1
  185. package/dist/utils/child-env.d.ts +1 -1
  186. package/dist/utils/child-env.d.ts.map +1 -1
  187. package/dist/utils/child-env.js +13 -0
  188. package/dist/utils/child-env.js.map +1 -1
  189. package/dist/utils/file-lock.d.ts.map +1 -1
  190. package/dist/utils/file-lock.js +1 -1
  191. package/dist/utils/file-lock.js.map +1 -1
  192. package/dist/utils/global-install.d.ts.map +1 -1
  193. package/dist/utils/global-install.js +56 -10
  194. package/dist/utils/global-install.js.map +1 -1
  195. package/dist/utils/idle-detector.d.ts +4 -0
  196. package/dist/utils/idle-detector.d.ts.map +1 -1
  197. package/dist/utils/idle-detector.js +25 -0
  198. package/dist/utils/idle-detector.js.map +1 -1
  199. package/dist/utils/process-identity.d.ts +7 -0
  200. package/dist/utils/process-identity.d.ts.map +1 -0
  201. package/dist/utils/process-identity.js +62 -0
  202. package/dist/utils/process-identity.js.map +1 -0
  203. package/dist/worker.js +123 -9
  204. package/dist/worker.js.map +1 -1
  205. package/dist/workflows/events/payloads.d.ts +10 -10
  206. package/dist/workflows/events/schema.d.ts +28 -28
  207. package/dist/workflows/hostExecutors/registry.d.ts +2 -7
  208. package/dist/workflows/hostExecutors/registry.d.ts.map +1 -1
  209. package/dist/workflows/hostExecutors/registry.js.map +1 -1
  210. package/dist/workflows/shared/provider-reconciler.d.ts +1 -30
  211. package/dist/workflows/shared/provider-reconciler.d.ts.map +1 -1
  212. package/dist/workflows/shared/provider-reconciler.js.map +1 -1
  213. package/dist/workflows/v3/artifact-contract.d.ts +41 -0
  214. package/dist/workflows/v3/artifact-contract.d.ts.map +1 -0
  215. package/dist/workflows/v3/artifact-contract.js +20 -0
  216. package/dist/workflows/v3/artifact-contract.js.map +1 -0
  217. package/dist/workflows/v3/botmux-attempt-lease.d.ts +7 -0
  218. package/dist/workflows/v3/botmux-attempt-lease.d.ts.map +1 -0
  219. package/dist/workflows/v3/botmux-attempt-lease.js +189 -0
  220. package/dist/workflows/v3/botmux-attempt-lease.js.map +1 -0
  221. package/dist/workflows/v3/botmux-host-policy.d.ts +7 -0
  222. package/dist/workflows/v3/botmux-host-policy.d.ts.map +1 -0
  223. package/dist/workflows/v3/botmux-host-policy.js +34 -0
  224. package/dist/workflows/v3/botmux-host-policy.js.map +1 -0
  225. package/dist/workflows/v3/cli-run.d.ts +1 -1
  226. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  227. package/dist/workflows/v3/cli-run.js +1 -1
  228. package/dist/workflows/v3/cli-run.js.map +1 -1
  229. package/dist/workflows/v3/contract.d.ts +8 -89
  230. package/dist/workflows/v3/contract.d.ts.map +1 -1
  231. package/dist/workflows/v3/contract.js +2 -8
  232. package/dist/workflows/v3/contract.js.map +1 -1
  233. package/dist/workflows/v3/core-control.d.ts +16 -0
  234. package/dist/workflows/v3/core-control.d.ts.map +1 -0
  235. package/dist/workflows/v3/core-control.js +60 -0
  236. package/dist/workflows/v3/core-control.js.map +1 -0
  237. package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
  238. package/dist/workflows/v3/daemon-run.js +2 -1
  239. package/dist/workflows/v3/daemon-run.js.map +1 -1
  240. package/dist/workflows/v3/dag-loader.d.ts +5 -0
  241. package/dist/workflows/v3/dag-loader.d.ts.map +1 -0
  242. package/dist/workflows/v3/dag-loader.js +22 -0
  243. package/dist/workflows/v3/dag-loader.js.map +1 -0
  244. package/dist/workflows/v3/dag.d.ts +2 -6
  245. package/dist/workflows/v3/dag.d.ts.map +1 -1
  246. package/dist/workflows/v3/dag.js +2 -24
  247. package/dist/workflows/v3/dag.js.map +1 -1
  248. package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
  249. package/dist/workflows/v3/ephemeral-pool.js +22 -12
  250. package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
  251. package/dist/workflows/v3/event-contract.d.ts +273 -0
  252. package/dist/workflows/v3/event-contract.d.ts.map +1 -0
  253. package/dist/workflows/v3/event-contract.js +8 -0
  254. package/dist/workflows/v3/event-contract.js.map +1 -0
  255. package/dist/workflows/v3/gate-policy.d.ts +12 -0
  256. package/dist/workflows/v3/gate-policy.d.ts.map +1 -0
  257. package/dist/workflows/v3/gate-policy.js +20 -0
  258. package/dist/workflows/v3/gate-policy.js.map +1 -0
  259. package/dist/workflows/v3/gate-wait-store.d.ts +99 -0
  260. package/dist/workflows/v3/gate-wait-store.d.ts.map +1 -0
  261. package/dist/workflows/v3/gate-wait-store.js +263 -0
  262. package/dist/workflows/v3/gate-wait-store.js.map +1 -0
  263. package/dist/workflows/v3/host.js +1 -1
  264. package/dist/workflows/v3/host.js.map +1 -1
  265. package/dist/workflows/v3/human-gate.d.ts +4 -99
  266. package/dist/workflows/v3/human-gate.d.ts.map +1 -1
  267. package/dist/workflows/v3/human-gate.js +4 -275
  268. package/dist/workflows/v3/human-gate.js.map +1 -1
  269. package/dist/workflows/v3/in-process-attempt-lease.d.ts +10 -0
  270. package/dist/workflows/v3/in-process-attempt-lease.d.ts.map +1 -0
  271. package/dist/workflows/v3/in-process-attempt-lease.js +47 -0
  272. package/dist/workflows/v3/in-process-attempt-lease.js.map +1 -0
  273. package/dist/workflows/v3/journal.d.ts +2 -275
  274. package/dist/workflows/v3/journal.d.ts.map +1 -1
  275. package/dist/workflows/v3/journal.js.map +1 -1
  276. package/dist/workflows/v3/library-service.js +1 -1
  277. package/dist/workflows/v3/library-service.js.map +1 -1
  278. package/dist/workflows/v3/orchestrator.d.ts +1 -2
  279. package/dist/workflows/v3/orchestrator.d.ts.map +1 -1
  280. package/dist/workflows/v3/orchestrator.js.map +1 -1
  281. package/dist/workflows/v3/portable-artifact-snapshot.d.ts +15 -0
  282. package/dist/workflows/v3/portable-artifact-snapshot.d.ts.map +1 -0
  283. package/dist/workflows/v3/portable-artifact-snapshot.js +76 -0
  284. package/dist/workflows/v3/portable-artifact-snapshot.js.map +1 -0
  285. package/dist/workflows/v3/portable-final-outputs.d.ts +37 -0
  286. package/dist/workflows/v3/portable-final-outputs.d.ts.map +1 -0
  287. package/dist/workflows/v3/portable-final-outputs.js +137 -0
  288. package/dist/workflows/v3/portable-final-outputs.js.map +1 -0
  289. package/dist/workflows/v3/portable-run-snapshot.d.ts +14 -0
  290. package/dist/workflows/v3/portable-run-snapshot.d.ts.map +1 -0
  291. package/dist/workflows/v3/portable-run-snapshot.js +176 -0
  292. package/dist/workflows/v3/portable-run-snapshot.js.map +1 -0
  293. package/dist/workflows/v3/portable-runtime.d.ts +83 -0
  294. package/dist/workflows/v3/portable-runtime.d.ts.map +1 -0
  295. package/dist/workflows/v3/portable-runtime.js +135 -0
  296. package/dist/workflows/v3/portable-runtime.js.map +1 -0
  297. package/dist/workflows/v3/runtime-host-contract.d.ts +182 -0
  298. package/dist/workflows/v3/runtime-host-contract.d.ts.map +1 -0
  299. package/dist/workflows/v3/runtime-host-contract.js +9 -0
  300. package/dist/workflows/v3/runtime-host-contract.js.map +1 -0
  301. package/dist/workflows/v3/runtime.d.ts +12 -226
  302. package/dist/workflows/v3/runtime.d.ts.map +1 -1
  303. package/dist/workflows/v3/runtime.js +14 -3173
  304. package/dist/workflows/v3/runtime.js.map +1 -1
  305. package/dist/workflows/v3/shared-node-runtime.d.ts +203 -0
  306. package/dist/workflows/v3/shared-node-runtime.d.ts.map +1 -0
  307. package/dist/workflows/v3/shared-node-runtime.js +2978 -0
  308. package/dist/workflows/v3/shared-node-runtime.js.map +1 -0
  309. package/dist/workflows/v3/shared-runtime.d.ts +17 -0
  310. package/dist/workflows/v3/shared-runtime.d.ts.map +1 -0
  311. package/dist/workflows/v3/shared-runtime.js +12 -0
  312. package/dist/workflows/v3/shared-runtime.js.map +1 -0
  313. package/package.json +4 -1
  314. package/dist/dashboard-web/chunks/roles-page-LHVAU2BI.js +0 -1
@@ -0,0 +1,176 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { canonicalJson, computeInputHash, } from '../../utils/canonical-input-hash.js';
4
+ import { validateDag } from './dag.js';
5
+ export const PORTABLE_RUN_SNAPSHOT_FILE = 'portable-run.snapshot.json';
6
+ const LEGACY_RUN_ARTIFACTS = [
7
+ 'journal.ndjson',
8
+ 'dag.json',
9
+ 'bots.snapshot.json',
10
+ 'STATE',
11
+ ];
12
+ function canonicalClone(value) {
13
+ return JSON.parse(canonicalJson(value));
14
+ }
15
+ function normalizeProfiles(profiles) {
16
+ return [...profiles]
17
+ .sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)
18
+ .map(([selector, profile]) => ({
19
+ selector,
20
+ profile: canonicalClone(profile),
21
+ }));
22
+ }
23
+ function createSnapshot(dag, profiles) {
24
+ const normalizedDag = canonicalClone(validateDag(dag));
25
+ const executionProfiles = normalizeProfiles(profiles);
26
+ const dagHash = computeInputHash(normalizedDag);
27
+ const executionProfilesHash = computeInputHash(executionProfiles);
28
+ return {
29
+ schemaVersion: 1,
30
+ dag: normalizedDag,
31
+ dagHash,
32
+ executionProfiles,
33
+ executionProfilesHash,
34
+ definitionHash: computeInputHash({
35
+ dagHash,
36
+ executionProfilesHash,
37
+ }),
38
+ };
39
+ }
40
+ function isObject(value) {
41
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
42
+ }
43
+ function parseProfile(raw, selector) {
44
+ if (!isObject(raw)) {
45
+ throw new Error(`execution profile "${selector || '<default>'}" is not an object`);
46
+ }
47
+ const allowed = new Set([
48
+ 'profileId',
49
+ 'executorId',
50
+ 'workingDirectory',
51
+ 'model',
52
+ 'adapterData',
53
+ ]);
54
+ const unknown = Object.keys(raw).filter((key) => !allowed.has(key));
55
+ if (unknown.length > 0) {
56
+ throw new Error(`execution profile "${selector || '<default>'}" has unknown fields: ${unknown.join(', ')}`);
57
+ }
58
+ if (typeof raw.profileId !== 'string'
59
+ || typeof raw.executorId !== 'string'
60
+ || typeof raw.workingDirectory !== 'string'
61
+ || (raw.model !== undefined && typeof raw.model !== 'string')) {
62
+ throw new Error(`execution profile "${selector || '<default>'}" is malformed`);
63
+ }
64
+ return {
65
+ profileId: raw.profileId,
66
+ executorId: raw.executorId,
67
+ workingDirectory: raw.workingDirectory,
68
+ ...(raw.model !== undefined ? { model: raw.model } : {}),
69
+ ...(raw.adapterData !== undefined
70
+ ? { adapterData: canonicalClone(raw.adapterData) }
71
+ : {}),
72
+ };
73
+ }
74
+ function parseSnapshot(raw) {
75
+ if (!isObject(raw) || raw.schemaVersion !== 1) {
76
+ throw new Error('unsupported or malformed snapshot schema');
77
+ }
78
+ const dag = validateDag(raw.dag);
79
+ if (!Array.isArray(raw.executionProfiles)) {
80
+ throw new Error('executionProfiles must be an array');
81
+ }
82
+ const selectors = new Set();
83
+ const executionProfiles = raw.executionProfiles.map((entry, index) => {
84
+ if (!isObject(entry) || typeof entry.selector !== 'string') {
85
+ throw new Error(`executionProfiles[${index}] is malformed`);
86
+ }
87
+ if (selectors.has(entry.selector)) {
88
+ throw new Error(`duplicate execution profile selector "${entry.selector}"`);
89
+ }
90
+ selectors.add(entry.selector);
91
+ return {
92
+ selector: entry.selector,
93
+ profile: parseProfile(entry.profile, entry.selector),
94
+ };
95
+ });
96
+ if (typeof raw.dagHash !== 'string'
97
+ || typeof raw.executionProfilesHash !== 'string'
98
+ || typeof raw.definitionHash !== 'string') {
99
+ throw new Error('snapshot hashes are missing');
100
+ }
101
+ const snapshot = {
102
+ schemaVersion: 1,
103
+ dag,
104
+ dagHash: raw.dagHash,
105
+ executionProfiles,
106
+ executionProfilesHash: raw.executionProfilesHash,
107
+ definitionHash: raw.definitionHash,
108
+ };
109
+ const actualDagHash = computeInputHash(snapshot.dag);
110
+ const actualProfilesHash = computeInputHash(snapshot.executionProfiles);
111
+ const actualDefinitionHash = computeInputHash({
112
+ dagHash: actualDagHash,
113
+ executionProfilesHash: actualProfilesHash,
114
+ });
115
+ if (snapshot.dagHash !== actualDagHash
116
+ || snapshot.executionProfilesHash !== actualProfilesHash
117
+ || snapshot.definitionHash !== actualDefinitionHash) {
118
+ throw new Error('snapshot integrity check failed');
119
+ }
120
+ return snapshot;
121
+ }
122
+ function readSnapshot(path) {
123
+ try {
124
+ return parseSnapshot(JSON.parse(readFileSync(path, 'utf-8')));
125
+ }
126
+ catch (error) {
127
+ throw new Error(`v3 runtime: frozen portable run snapshot is unreadable: ${error instanceof Error ? error.message : String(error)}`);
128
+ }
129
+ }
130
+ function writeSnapshotOnce(path, snapshot) {
131
+ try {
132
+ writeFileSync(path, `${JSON.stringify(snapshot, null, 2)}\n`, {
133
+ encoding: 'utf-8',
134
+ flag: 'wx',
135
+ mode: 0o600,
136
+ });
137
+ }
138
+ catch (error) {
139
+ if (typeof error !== 'object'
140
+ || error === null
141
+ || !('code' in error)
142
+ || error.code !== 'EEXIST') {
143
+ throw error;
144
+ }
145
+ }
146
+ }
147
+ /**
148
+ * Freeze the complete portable execution contract before the journal starts.
149
+ * A legacy run without this artifact cannot prove its original host profile,
150
+ * so recovery fails closed instead of blessing the caller's current config.
151
+ */
152
+ export function assertOrCreatePortableRunSnapshot(runDir, dag, profiles) {
153
+ mkdirSync(runDir, { recursive: true });
154
+ const path = join(runDir, PORTABLE_RUN_SNAPSHOT_FILE);
155
+ const expected = createSnapshot(dag, profiles);
156
+ if (!existsSync(path)) {
157
+ const existingArtifact = LEGACY_RUN_ARTIFACTS.find((name) => existsSync(join(runDir, name)));
158
+ if (existingArtifact) {
159
+ throw new Error(`v3 runtime: cannot safely resume run without ${PORTABLE_RUN_SNAPSHOT_FILE} `
160
+ + `(found ${existingArtifact})`);
161
+ }
162
+ writeSnapshotOnce(path, expected);
163
+ }
164
+ const stored = readSnapshot(path);
165
+ if (stored.dagHash !== expected.dagHash) {
166
+ throw new Error('v3 runtime: frozen workflow definition differs from this resume request');
167
+ }
168
+ if (stored.executionProfilesHash !== expected.executionProfilesHash) {
169
+ throw new Error('v3 runtime: frozen execution profiles differ from this resume request');
170
+ }
171
+ return {
172
+ dag: stored.dag,
173
+ executionProfiles: new Map(stored.executionProfiles.map(({ selector, profile }) => [selector, profile])),
174
+ };
175
+ }
176
+ //# sourceMappingURL=portable-run-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-run-snapshot.js","sourceRoot":"","sources":["../../../src/workflows/v3/portable-run-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Host-neutral adapter for the complete v3 Node runtime.
3
+ *
4
+ * The action realization remains single-sourced in shared-node-runtime.ts;
5
+ * this adapter only translates execution profiles and agent calls.
6
+ */
7
+ import type { ValidateManifest } from './artifact-contract.js';
8
+ import { type V3Dag } from './dag.js';
9
+ import type { PortableWorkflowFinalOutput } from './portable-final-outputs.js';
10
+ import type { AgentExecutor, AttemptLeaseProvider, ExecutionContextSnapshot, ExecutionProfileSnapshot, GateResolver, HostExecutorRegistry, HostExecutorPolicy, ProviderReconciler } from './runtime-host-contract.js';
11
+ export interface PortableWorkflowPendingGate {
12
+ nodeId: string;
13
+ waitId: string;
14
+ prompt: string;
15
+ options: string[];
16
+ approveOptions: string[];
17
+ approvers: string[];
18
+ hostApproval?: {
19
+ attemptId: string;
20
+ approvalDigest: string;
21
+ inputHash: string;
22
+ };
23
+ }
24
+ export { readPortableWorkflowFinalOutputs, } from './portable-final-outputs.js';
25
+ export type { PortableWorkflowFinalOutput, } from './portable-final-outputs.js';
26
+ export type PortableWorkflowRunOutcome = {
27
+ reason: 'terminal';
28
+ runStatus: 'succeeded' | 'failed' | 'blocked' | 'cancelled';
29
+ failedNodeId?: string;
30
+ blockedNodeId?: string;
31
+ failureReason?: 'allSinksSkipped';
32
+ failureDetail?: string;
33
+ uncertainHostEffects?: Array<{
34
+ nodeId: string;
35
+ instanceId: string;
36
+ attemptId: string;
37
+ executor: string;
38
+ errorCode: string;
39
+ }>;
40
+ finalOutputs: PortableWorkflowFinalOutput[];
41
+ runDir: string;
42
+ } | {
43
+ reason: 'awaitingGate';
44
+ pendingWaits: PortableWorkflowPendingGate[];
45
+ runDir: string;
46
+ };
47
+ export interface PortableWorkflowRuntimeDeps {
48
+ executeAgent: AgentExecutor;
49
+ validateManifest: ValidateManifest;
50
+ resolveExecutionProfile: (selector: string | undefined) => ExecutionProfileSnapshot;
51
+ validateExecutionProfile?: (profile: ExecutionProfileSnapshot, selector: string) => void;
52
+ /**
53
+ * Optional only for fresh process-local runs. The default provider cannot
54
+ * prove old attempts closed after recovery and therefore returns `unknown`.
55
+ * Desktop and other durable hosts must inject a durable provider.
56
+ */
57
+ attemptLeaseProvider?: AttemptLeaseProvider;
58
+ hostExecutors?: HostExecutorRegistry;
59
+ hostReconcilers?: Map<string, ProviderReconciler>;
60
+ hostExecutorPolicy?: HostExecutorPolicy;
61
+ now?: () => number;
62
+ resolveGate?: GateResolver;
63
+ }
64
+ export interface PortableWorkflowRuntimeOptions {
65
+ /**
66
+ * Durable run root. Reusing the same baseDir + dag.runId formally resumes
67
+ * the existing journal and does not redispatch settled nodes.
68
+ */
69
+ baseDir: string;
70
+ gateMode?: 'blocking' | 'suspend';
71
+ globalConcurrency?: number;
72
+ frozenExecutionProfiles?: ReadonlyMap<string, ExecutionProfileSnapshot>;
73
+ perProfileConcurrency?: number;
74
+ perExecutorConcurrency?: number;
75
+ cancelSignal?: AbortSignal;
76
+ authorizedArtifacts?: boolean;
77
+ executionContext?: ExecutionContextSnapshot;
78
+ /** @deprecated Use `executionContext`. */
79
+ resolvedWorkflowData?: ExecutionContextSnapshot;
80
+ hostResponseWaitMs?: number;
81
+ }
82
+ export declare function runPortableWorkflow(dag: V3Dag, deps: PortableWorkflowRuntimeDeps, options: PortableWorkflowRuntimeOptions): Promise<PortableWorkflowRunOutcome>;
83
+ //# sourceMappingURL=portable-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-runtime.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/portable-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Host-neutral adapter for the complete v3 Node runtime.
3
+ *
4
+ * The action realization remains single-sourced in shared-node-runtime.ts;
5
+ * this adapter only translates execution profiles and agent calls.
6
+ */
7
+ import { isGoalNode, isLoopNode, validateDag, } from './dag.js';
8
+ import { createInProcessAttemptLeaseProvider } from './in-process-attempt-lease.js';
9
+ import { readPortableWorkflowFinalOutputs } from './portable-final-outputs.js';
10
+ import { assertOrCreatePortableRunSnapshot } from './portable-run-snapshot.js';
11
+ import { runWorkflow as runNodeWorkflow } from './shared-node-runtime.js';
12
+ import { join } from 'node:path';
13
+ export { readPortableWorkflowFinalOutputs, } from './portable-final-outputs.js';
14
+ function defaultValidateProfile(profile, selector) {
15
+ if (!profile.profileId || !profile.executorId || !profile.workingDirectory) {
16
+ throw new Error(`v3 runtime: execution profile "${selector || '<default>'}" is incomplete`);
17
+ }
18
+ }
19
+ function botSnapshotFor(profile) {
20
+ return {
21
+ // These legacy field names are confined to this adapter. The scheduler
22
+ // treats them as opaque profile/executor/cwd slots.
23
+ larkAppId: profile.profileId,
24
+ cliId: profile.executorId,
25
+ workingDir: profile.workingDirectory,
26
+ ...(profile.model ? { model: profile.model } : {}),
27
+ };
28
+ }
29
+ export async function runPortableWorkflow(dag, deps, options) {
30
+ const normalizedDag = validateDag(dag);
31
+ let profiles = new Map(options.frozenExecutionProfiles ?? []);
32
+ const resolveProfile = (selector) => {
33
+ const key = selector ?? '';
34
+ const existing = profiles.get(key);
35
+ if (existing)
36
+ return existing;
37
+ if (options.frozenExecutionProfiles) {
38
+ throw new Error(`v3 runtime: frozen execution profiles are missing selector "${key || '<default>'}"`);
39
+ }
40
+ const profile = deps.resolveExecutionProfile(selector);
41
+ profiles.set(key, profile);
42
+ return profile;
43
+ };
44
+ for (const node of normalizedDag.nodes) {
45
+ if (isGoalNode(node))
46
+ resolveProfile(node.bot);
47
+ if (isLoopNode(node)) {
48
+ for (const bodyNode of node.body.nodes) {
49
+ resolveProfile(bodyNode.bot ?? node.bot);
50
+ }
51
+ }
52
+ }
53
+ const validateProfile = deps.validateExecutionProfile ?? defaultValidateProfile;
54
+ for (const [selector, executionProfile] of profiles) {
55
+ validateProfile(executionProfile, selector);
56
+ }
57
+ const frozenDefinition = assertOrCreatePortableRunSnapshot(join(options.baseDir, normalizedDag.runId), normalizedDag, profiles);
58
+ profiles = frozenDefinition.executionProfiles;
59
+ const frozenDag = frozenDefinition.dag;
60
+ const profileById = new Map();
61
+ for (const executionProfile of profiles.values()) {
62
+ profileById.set(executionProfile.profileId, executionProfile);
63
+ }
64
+ const requireProfile = (selector) => {
65
+ const key = selector ?? '';
66
+ const executionProfile = profiles.get(key);
67
+ if (!executionProfile) {
68
+ throw new Error(`v3 runtime: frozen execution profiles are missing selector "${key || '<default>'}"`);
69
+ }
70
+ return executionProfile;
71
+ };
72
+ const runNode = async (request) => {
73
+ const profile = profileById.get(request.botSnapshot.larkAppId);
74
+ if (!profile) {
75
+ throw new Error(`v3 runtime: execution profile "${request.botSnapshot.larkAppId}" was not frozen`);
76
+ }
77
+ if (!request.attemptLease) {
78
+ throw new Error(`v3 runtime: attempt ${request.attemptId} has no lease`);
79
+ }
80
+ return deps.executeAgent({
81
+ runId: request.runId,
82
+ attemptId: request.attemptId,
83
+ attemptLease: request.attemptLease,
84
+ node: request.node,
85
+ executionProfile: {
86
+ ...profile,
87
+ ...(request.botSnapshot.model ? { model: request.botSnapshot.model } : {}),
88
+ },
89
+ runDir: request.runDir,
90
+ attemptDir: request.attemptDir,
91
+ inputsPath: request.inputsPath,
92
+ outputDir: request.outputDir,
93
+ env: request.env,
94
+ timeoutMs: request.timeoutMs,
95
+ ...(request.onSessionReady ? { onSessionReady: request.onSessionReady } : {}),
96
+ ...(request.stdoutPath ? { stdoutPath: request.stdoutPath } : {}),
97
+ ...(request.stderrPath ? { stderrPath: request.stderrPath } : {}),
98
+ });
99
+ };
100
+ const outcome = await runNodeWorkflow(frozenDag, {
101
+ runNode,
102
+ validateManifest: deps.validateManifest,
103
+ resolveBotSnapshot: (selector) => botSnapshotFor(requireProfile(selector)),
104
+ validateExecutionSnapshot: (snapshot, selector) => {
105
+ const profile = profileById.get(snapshot.larkAppId);
106
+ if (!profile) {
107
+ throw new Error(`v3 runtime: profile "${snapshot.larkAppId}" is unavailable`);
108
+ }
109
+ validateProfile(profile, selector);
110
+ },
111
+ attemptLeaseProvider: deps.attemptLeaseProvider ?? createInProcessAttemptLeaseProvider(),
112
+ ...(deps.hostExecutors ? { hostExecutors: deps.hostExecutors } : {}),
113
+ ...(deps.hostReconcilers ? { hostReconcilers: deps.hostReconcilers } : {}),
114
+ ...(deps.hostExecutorPolicy ? { hostExecutorPolicy: deps.hostExecutorPolicy } : {}),
115
+ ...(deps.now ? { now: deps.now } : {}),
116
+ ...(deps.resolveGate ? { resolveGate: deps.resolveGate } : {}),
117
+ }, {
118
+ ...options,
119
+ perBotConcurrency: options.perProfileConcurrency,
120
+ perCliConcurrency: options.perExecutorConcurrency,
121
+ frozenBotSnapshots: new Map([...profiles].map(([key, profile]) => [
122
+ key,
123
+ botSnapshotFor(profile),
124
+ ])),
125
+ });
126
+ if (outcome.reason !== 'terminal')
127
+ return outcome;
128
+ return {
129
+ ...outcome,
130
+ finalOutputs: outcome.runStatus === 'succeeded'
131
+ ? await readPortableWorkflowFinalOutputs(frozenDag, outcome.runDir, deps.validateManifest)
132
+ : [],
133
+ };
134
+ }
135
+ //# sourceMappingURL=portable-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-runtime.js","sourceRoot":"","sources":["../../../src/workflows/v3/portable-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Host-neutral contracts for embedding the v3 workflow runtime.
3
+ *
4
+ * These types deliberately avoid daemon, Lark, worker-fence, and Botmux bot
5
+ * configuration details. A host may keep its own durable state and adapt it
6
+ * into this boundary.
7
+ */
8
+ import type { V3GoalNode } from './dag.js';
9
+ export interface ExecutionContextSnapshot {
10
+ /** Immutable workflow parameters resolved when the run is authorized. */
11
+ readonly params: Readonly<Record<string, unknown>>;
12
+ /** Immutable host identity/context values resolved when the run is authorized. */
13
+ readonly context: Readonly<Record<string, string>>;
14
+ }
15
+ /**
16
+ * One scheduler-owned execution lease. The id is durable while the signal is
17
+ * process-local; hosts should use the id for audit and the signal for teardown.
18
+ */
19
+ export interface AttemptLease {
20
+ readonly attemptId: string;
21
+ readonly signal: AbortSignal;
22
+ /** Opaque provider token passed from the scheduler to the agent executor. */
23
+ readonly hostToken?: unknown;
24
+ }
25
+ export type AttemptLeaseCloseReason = 'pre_aborted' | 'setup_failed';
26
+ export interface AttemptLeaseBinding {
27
+ runId: string;
28
+ attemptId: string;
29
+ attemptDir: string;
30
+ }
31
+ export interface AttemptLeaseAcquisition {
32
+ hostToken?: unknown;
33
+ /** Preserve the legacy Botmux journal marker without imposing it on hosts. */
34
+ auditKind: 'workerFence' | 'attemptLease';
35
+ }
36
+ export type AttemptLeaseDrainResult =
37
+ /** Exact external ownership is proven closed; journal proof precedes finalization. */
38
+ {
39
+ status: 'closed';
40
+ finalizeAfterProof(): void;
41
+ }
42
+ /** `pending` is known live ownership; `unknown` means the host cannot prove either state. */
43
+ | {
44
+ status: 'pending' | 'unknown';
45
+ };
46
+ export interface AttemptLeaseProvider {
47
+ /**
48
+ * Durable/restartable hosts (including Desktop) must back this contract with
49
+ * host-owned execution state. Recovery may return `closed` only after proving
50
+ * the exact executor/terminal attempt stopped; `finalizeAfterProof` runs only
51
+ * after the workflow journal durably records that close.
52
+ */
53
+ acquire(binding: AttemptLeaseBinding): AttemptLeaseAcquisition;
54
+ closeBeforeExecution(binding: AttemptLeaseBinding, acquisition: AttemptLeaseAcquisition, reason: AttemptLeaseCloseReason): void;
55
+ drainExternallyOwned(binding: AttemptLeaseBinding): AttemptLeaseDrainResult;
56
+ cleanupSettled(binding: AttemptLeaseBinding, acquisition?: AttemptLeaseAcquisition): void;
57
+ }
58
+ export interface ExecutionProfileSnapshot {
59
+ /** Stable profile selector frozen for this run. */
60
+ readonly profileId: string;
61
+ /** Concurrency/capability domain, e.g. a CLI or remote execution backend. */
62
+ readonly executorId: string;
63
+ readonly workingDirectory: string;
64
+ readonly model?: string;
65
+ /**
66
+ * Host-owned, JSON-safe, non-secret adapter configuration. Persist stable
67
+ * credential references here; the executor resolves live secrets itself.
68
+ */
69
+ readonly adapterData?: unknown;
70
+ }
71
+ export interface AgentSessionInfo {
72
+ sessionId: string;
73
+ webPort?: number;
74
+ token?: string;
75
+ }
76
+ export interface AgentExecutionRequest {
77
+ runId: string;
78
+ attemptId: string;
79
+ attemptLease: AttemptLease;
80
+ node: V3GoalNode;
81
+ executionProfile: ExecutionProfileSnapshot;
82
+ runDir: string;
83
+ attemptDir: string;
84
+ inputsPath: string;
85
+ outputDir: string;
86
+ env: Record<string, string>;
87
+ timeoutMs: number;
88
+ onSessionReady?: (info: AgentSessionInfo & {
89
+ ptyLogPath?: string;
90
+ }) => void | Promise<void>;
91
+ stdoutPath?: string;
92
+ stderrPath?: string;
93
+ }
94
+ export interface AgentExecutionResult {
95
+ status: 'ok' | 'fail' | 'cancelled';
96
+ cancelReason?: unknown;
97
+ manifestPath: string;
98
+ sessionInfo?: AgentSessionInfo;
99
+ }
100
+ export type AgentExecutor = (request: AgentExecutionRequest) => Promise<AgentExecutionResult>;
101
+ export type ExecutorErrorClassification = {
102
+ errorCode: string;
103
+ errorClass: 'retryable' | 'fatal' | 'userFault' | 'manual';
104
+ errorMessage: string;
105
+ };
106
+ export interface HostSideEffectExecutor<Input = unknown, Output = unknown> {
107
+ readonly provider: string;
108
+ readonly idempotencyTtlMs: number;
109
+ canonicalInput(input: Input): unknown;
110
+ validateBeforeIntent?(input: Input, nowMs: number): {
111
+ ok: true;
112
+ } | {
113
+ ok: false;
114
+ errorCode: string;
115
+ message: string;
116
+ };
117
+ invoke(input: Input, idempotencyKey: string): Promise<{
118
+ output: Output;
119
+ externalRefs: Record<string, unknown>;
120
+ }>;
121
+ classifyError?(error: unknown): ExecutorErrorClassification | null;
122
+ }
123
+ export type RegisteredHostExecutor<Input = unknown, Output = unknown> = {
124
+ executor: HostSideEffectExecutor<Input, Output>;
125
+ parseInput(input: unknown): Input;
126
+ };
127
+ export type HostExecutorRegistry = Map<string, RegisteredHostExecutor>;
128
+ export type ReadOnlyLookupResult = {
129
+ found: true;
130
+ externalRefs: Record<string, unknown>;
131
+ evidence?: Record<string, unknown>;
132
+ } | {
133
+ found: false;
134
+ evidence?: Record<string, unknown>;
135
+ };
136
+ export type IdempotentSubmitResult = {
137
+ ok: true;
138
+ externalRefs: Record<string, unknown>;
139
+ evidence?: Record<string, unknown>;
140
+ } | {
141
+ ok: false;
142
+ errorCode: string;
143
+ errorClass: 'retryable' | 'fatal' | 'userFault' | 'manual';
144
+ errorMessage: string;
145
+ evidence?: Record<string, unknown>;
146
+ };
147
+ export interface ProviderReconciler {
148
+ readonly provider: string;
149
+ readonly requiresEffectInput?: boolean;
150
+ readOnlyLookup?(idempotencyKey: string, input: unknown): Promise<ReadOnlyLookupResult>;
151
+ idempotentSubmit?(idempotencyKey: string, input: unknown): Promise<IdempotentSubmitResult>;
152
+ canonicalInput?(input: unknown): unknown;
153
+ }
154
+ export interface HostExecutorPolicyRequest {
155
+ readonly nodeId: string;
156
+ readonly executor: string;
157
+ readonly input: unknown;
158
+ readonly executionContext?: ExecutionContextSnapshot;
159
+ }
160
+ /**
161
+ * Synchronous by design: authorization must finish before a prepared host
162
+ * effect can be committed or presented for approval.
163
+ */
164
+ export type HostExecutorPolicy = (request: HostExecutorPolicyRequest) => void;
165
+ export interface GateResolutionRequest {
166
+ nodeId: string;
167
+ prompt: string;
168
+ waitId: string;
169
+ runDir: string;
170
+ hostApproval?: {
171
+ attemptId: string;
172
+ approvalDigest: string;
173
+ inputHash: string;
174
+ };
175
+ }
176
+ export interface GateResolution {
177
+ resolution: 'approved' | 'rejected';
178
+ by: string;
179
+ selected?: string;
180
+ }
181
+ export type GateResolver = (request: GateResolutionRequest) => Promise<GateResolution>;
182
+ //# sourceMappingURL=runtime-host-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-host-contract.d.ts","sourceRoot":"","sources":["../../../src/workflows/v3/runtime-host-contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,wBAAwB;IACvC,yEAAyE;IACzE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,uBAAuB,GAC/B,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,SAAS,EAAE,aAAa,GAAG,cAAc,CAAC;CAC3C;AAED,MAAM,MAAM,uBAAuB;AACjC,sFAAsF;AACpF;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,kBAAkB,IAAI,IAAI,CAAA;CAAE;AAClD,6FAA6F;GAC3F;IAAE,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,uBAAuB,CAAC;IAC/D,oBAAoB,CAClB,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,uBAAuB,EACpC,MAAM,EAAE,uBAAuB,GAC9B,IAAI,CAAC;IACR,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,uBAAuB,CAAC;IAC5E,cAAc,CACZ,OAAO,EAAE,mBAAmB,EAC5B,WAAW,CAAC,EAAE,uBAAuB,GACpC,IAAI,CAAC;CACT;AAED,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CACf,IAAI,EAAE,gBAAgB,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,WAAW,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,sBAAsB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACtC,oBAAoB,CAAC,CACnB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GAEX;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GACZ;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,MAAM,CACJ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC,CAAC;IACH,aAAa,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,2BAA2B,GAAG,IAAI,CAAC;CACpE;AAED,MAAM,MAAM,sBAAsB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI;IACtE,QAAQ,EAAE,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAC5B;IACE,KAAK,EAAE,IAAI,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACD;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,sBAAsB,GAC9B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEN,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,cAAc,CAAC,CACb,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,gBAAgB,CAAC,CACf,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnC,cAAc,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;CACtD;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACjF;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Host-neutral contracts for embedding the v3 workflow runtime.
3
+ *
4
+ * These types deliberately avoid daemon, Lark, worker-fence, and Botmux bot
5
+ * configuration details. A host may keep its own durable state and adapt it
6
+ * into this boundary.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=runtime-host-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-host-contract.js","sourceRoot":"","sources":["../../../src/workflows/v3/runtime-host-contract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}