fengming 0.3.8 → 0.3.10

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 (1255) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/abort-CCR8oZyg.js +277 -0
  3. package/dist/abort.runtime-eqx84NZa.js +2 -0
  4. package/dist/abort.runtime.js +1 -1
  5. package/dist/acp-spawn-BcDyvaXh.js +2 -0
  6. package/dist/acp-spawn-CCtSel-_.js +1286 -0
  7. package/dist/acp-stateful-target-driver-B3pCvuOV.js +89 -0
  8. package/dist/active-tool-schema-warnings-Cf-5q5WU.js +105 -0
  9. package/dist/active-tool-schema-warnings-Dzt3XE-y.js +2 -0
  10. package/dist/agent-1M2dVE2G.js +2 -0
  11. package/dist/agent-DLDIbUT4.js +1825 -0
  12. package/dist/agent-DZi6j3o6.js +3 -0
  13. package/dist/agent-command-ppfDBwET.js +1435 -0
  14. package/dist/agent-harness-runtime-C0bo62eY.d.ts +913 -0
  15. package/dist/agent-harness-runtime-RkTGiliR.js +207 -0
  16. package/dist/agent-runner-utils-B4YeVAO_.js +267 -0
  17. package/dist/agent-runner.runtime-T_3tlZN1.js +3784 -0
  18. package/dist/agent-runner.runtime.js +1 -1
  19. package/dist/agent-runtime-CloshyK-.d.ts +207 -0
  20. package/dist/agent-runtime-DZsmp1xr.js +199 -0
  21. package/dist/agent-tools-CET9usCz.js +2506 -0
  22. package/dist/agent-via-gateway-CZ0X0YkM.js +486 -0
  23. package/dist/agent-wait-dedupe-I81_F2tr.js +180 -0
  24. package/dist/agents/embedded-agent-runner/run/runtime-context-prompt.d.ts +1 -1
  25. package/dist/agents/embedded-agent-runner/tool-split.d.ts +1 -1
  26. package/dist/agents/model-catalog.runtime.d.ts +1 -1
  27. package/dist/api-BDB5xHYj.js +3 -0
  28. package/dist/api-BH7bfI5d.js +6 -0
  29. package/dist/api-BxJNXitd.js +2 -0
  30. package/dist/approval-client-helpers-CfQA9Jzh.d.ts +78 -0
  31. package/dist/approval-native-helpers-B2zyhxWc.d.ts +241 -0
  32. package/dist/approval-renderers-CMqSXyvm.d.ts +39 -0
  33. package/dist/assistant-Cu_Mzzgu.js +291 -0
  34. package/dist/attachment-normalize-Bb3v5iCC.js +213 -0
  35. package/dist/attempt-execution-BskbAq5I.js +584 -0
  36. package/dist/attempt-execution.runtime-BuT1wpNS.js +3 -0
  37. package/dist/attempt-execution.runtime.js +1 -1
  38. package/dist/attempt.prompt-helpers-ByKj-vQ7.js +543 -0
  39. package/dist/auto-reply/reply/commands-crestodian.d.ts +1 -1
  40. package/dist/binding-routing-EGRNvRC4.js +113 -0
  41. package/dist/binding-targets-B9vYS8n6.js +121 -0
  42. package/dist/bridge-server-DG9YtKQe.js +113 -0
  43. package/dist/browser-cli-B0Ou-Nbm.js +2 -0
  44. package/dist/browser-cli-GF25gL6M.js +230 -0
  45. package/dist/browser-cli-actions-input-CuER6RVe.js +522 -0
  46. package/dist/browser-cli-actions-observe-Dq-Zz_FA.js +81 -0
  47. package/dist/browser-cli-debug-7hvb49S1.js +137 -0
  48. package/dist/browser-cli-inspect-WU5KeWOK.js +117 -0
  49. package/dist/browser-cli-manage-B9D9BvSe.js +446 -0
  50. package/dist/browser-cli-resize-BUOusOPb.js +32 -0
  51. package/dist/browser-cli-shared-DmpSN-Qi.js +69 -0
  52. package/dist/browser-cli-state-D_YxTqRw.js +371 -0
  53. package/dist/browser-control-auth-Cqd1n9FA.js +2 -0
  54. package/dist/browser-profiles-9tQ05wYh.js +2 -0
  55. package/dist/browser-runtime-Bbzumoha.js +389 -0
  56. package/dist/build-CBXuT2K1.js +261 -0
  57. package/dist/build-info.json +3 -3
  58. package/dist/bundled/boot-md/handler.js +2 -2
  59. package/dist/bundled/session-memory/handler.js +1 -1
  60. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  61. package/dist/capability-cli-CiVGX7ut.js +1809 -0
  62. package/dist/channel-BIVwHq7P.js +2309 -0
  63. package/dist/channel-CiA2FVdL.d.ts +427 -0
  64. package/dist/channel-core-Cj9JTqeu.js +5 -0
  65. package/dist/channel-core-DjVpcH1C.d.ts +6 -0
  66. package/dist/channel-entry-contract-Bs_54m1D.d.ts +114 -0
  67. package/dist/channel-inbound-CdUdeQRa.js +121 -0
  68. package/dist/channel-inbound-iGiqx6CS.d.ts +97 -0
  69. package/dist/channel-message-C3QPaDUk.js +12 -0
  70. package/dist/channel-message-CXDjxb2U.d.ts +9 -0
  71. package/dist/channel-outbound-ofvvmMSK.d.ts +325 -0
  72. package/dist/channel-pairing-DKscOV1K.d.ts +58 -0
  73. package/dist/channel.runtime-VW6PW_ez.js +697 -0
  74. package/dist/channel.runtime.js +1 -1
  75. package/dist/chat-CFkQepUQ.js +3 -0
  76. package/dist/chat-Czh_tXM0.js +2940 -0
  77. package/dist/chrome-B2cq8YyH.js +1517 -0
  78. package/dist/cli/run-main.js +5 -5
  79. package/dist/cli-compaction-Dxv4nt7R.js +363 -0
  80. package/dist/cli-runner-CimXSTVs.js +2 -0
  81. package/dist/cli-runner-orCzE1Sr.js +597 -0
  82. package/dist/cli-runner.runtime-CsW0dXJW.js +3 -0
  83. package/dist/cli-runner.runtime-DgPrc1do.js +4 -0
  84. package/dist/cli-runner.runtime.js +1 -1
  85. package/dist/cli-startup-metadata.json +10 -12
  86. package/dist/command-registry-C5ooX6PF.js +4 -0
  87. package/dist/command-registry-DMB-HKIk.js +9 -0
  88. package/dist/command-registry-core-B2w_XWvn.js +114 -0
  89. package/dist/command-status.runtime-Bdy3Dkar.js +90 -0
  90. package/dist/command-status.runtime.js +1 -1
  91. package/dist/commands-compact.runtime-Bk2jTQo6.js +10 -0
  92. package/dist/commands-compact.runtime.js +1 -1
  93. package/dist/commands-handlers.runtime-Csw1og0U.js +6327 -0
  94. package/dist/commands-handlers.runtime.js +1 -1
  95. package/dist/commands-mRqmLIVz.d.ts +117 -0
  96. package/dist/commands-status-Dgrj_ubK.js +3 -0
  97. package/dist/commands-status-s32HJOpD.js +16 -0
  98. package/dist/commands-status.runtime-Dgrj_ubK.js +3 -0
  99. package/dist/commands-status.runtime.js +1 -1
  100. package/dist/commands-subagents-control.runtime-C_hnOO9l.js +2 -0
  101. package/dist/commands-subagents-control.runtime.js +1 -1
  102. package/dist/commands-system-prompt-CQV742Cc.js +2 -0
  103. package/dist/commands-system-prompt-DTfsKwK1.js +161 -0
  104. package/dist/commands-types-MXHhrssO.d.ts +132 -0
  105. package/dist/commands.runtime-akiVK67l.js +175 -0
  106. package/dist/commands.runtime.js +1 -1
  107. package/dist/commitments/runtime.js +1 -1
  108. package/dist/compact-U6ZhvPtD.js +1165 -0
  109. package/dist/compact.runtime-36E5vKsC.js +12 -0
  110. package/dist/compact.runtime.js +1 -1
  111. package/dist/completion-cli-Bf4mEw2W.js +393 -0
  112. package/dist/config-BJJhHN9E.js +374 -0
  113. package/dist/config-mutations-swLu-j_p.js +161 -0
  114. package/dist/config-schema-Tjner6bM.d.ts +20 -0
  115. package/dist/context-engine-host-compat-6fkn_daV.js +280 -0
  116. package/dist/context-engine-host-compat-DtAZC1bS.js +2 -0
  117. package/dist/context-engine-lifecycle-R__Idxi1.js +627 -0
  118. package/dist/control-auth-DnkI94_D.js +114 -0
  119. package/dist/control-service-BBsamNjq.js +40 -0
  120. package/dist/control-service-BGpHj7RL.js +3 -0
  121. package/dist/control-ui/assets/activity-D-mnRThU.js +124 -0
  122. package/dist/control-ui/assets/agents-U_KSP5I_.js +1030 -0
  123. package/dist/control-ui/assets/channels-ohK9_G1O.js +120 -0
  124. package/dist/control-ui/assets/cron-6ZCzfU29.js +1016 -0
  125. package/dist/control-ui/assets/debug-CSsDLg_s.js +97 -0
  126. package/dist/control-ui/assets/index-jUDczxhd.js +7214 -0
  127. package/dist/control-ui/assets/instances-782ZoDT4.js +57 -0
  128. package/dist/control-ui/assets/nodes-BMX16BKM.js +444 -0
  129. package/dist/control-ui/assets/sessions-jLGSApYa.js +425 -0
  130. package/dist/control-ui/assets/skills-DweBwUhs.js +362 -0
  131. package/dist/control-ui/assets/workboard-BsU-FXIo.js +402 -0
  132. package/dist/control-ui/index.html +1 -1
  133. package/dist/control-ui/sw.js +1 -1
  134. package/dist/conversation-runtime-DDekWU-U.js +31 -0
  135. package/dist/core-Bpk-qSJH.js +284 -0
  136. package/dist/core-Chrz4oRB.d.ts +223 -0
  137. package/dist/core-api-DSpUKNVW.js +2 -0
  138. package/dist/core-api-hLsW03Wo.js +5 -0
  139. package/dist/crestodian/crestodian.js +1 -1
  140. package/dist/crestodian/rescue-message.d.ts +1 -1
  141. package/dist/crestodian/rescue-message.js +1 -1
  142. package/dist/crestodian-C0x7JjF-.js +55 -0
  143. package/dist/delegate-BArFIZ4B.d.ts +30 -0
  144. package/dist/deliver-BnVp3VbL.d.ts +111 -0
  145. package/dist/delivery-queue-BFOASdf5.d.ts +161 -0
  146. package/dist/delivery-queue-runtime-BFfc8AEs.d.ts +9 -0
  147. package/dist/dialogue-No0NvYX7.js +37 -0
  148. package/dist/direct-dm-C-h88JJH.d.ts +79 -0
  149. package/dist/directive-handling.fast-lane-DTyDKhZb.js +70 -0
  150. package/dist/directive-handling.impl-DMReM6tu.js +2 -0
  151. package/dist/directive-handling.impl-DzPouhV-.js +823 -0
  152. package/dist/directive-handling.model-selection-BjwTBAZJ.js +122 -0
  153. package/dist/directive-handling.persist.runtime-D_O1okkR.js +274 -0
  154. package/dist/directive-handling.persist.runtime.js +1 -1
  155. package/dist/dispatch-Dtl-oRuN.js +2057 -0
  156. package/dist/dispatch-acp-transcript.runtime-M4y0Dq74.js +40 -0
  157. package/dist/dispatch-acp-transcript.runtime.js +1 -1
  158. package/dist/dispatch-acp.runtime-B8uCIKZS.js +18 -0
  159. package/dist/dispatch-acp.runtime.js +1 -1
  160. package/dist/dispatcher-DslvaRcj.js +106 -0
  161. package/dist/doctor-config-flow-LU2C94af.js +1819 -0
  162. package/dist/doctor-core-checks-BqcjExIZ.js +666 -0
  163. package/dist/doctor-core-checks-Diuk8l0N.js +2 -0
  164. package/dist/doctor-core-checks.runtime-DbS-kMZN.js +278 -0
  165. package/dist/doctor-core-checks.runtime.js +1 -1
  166. package/dist/doctor-health-BdqHwfYE.js +65 -0
  167. package/dist/doctor-health-contributions-DLLTVnll.js +874 -0
  168. package/dist/doctor-lint-PZqkVMWf.js +95 -0
  169. package/dist/doctor-mRfJMSb5.js +6 -0
  170. package/dist/doctor-state-integrity-Cdlm-peH.js +1257 -0
  171. package/dist/draft-stream-controls-B7uLonbw.d.ts +159 -0
  172. package/dist/embedded-agent-CEpOPW6X.js +4 -0
  173. package/dist/embedded-agent-CNINO_M-.d.ts +5 -0
  174. package/dist/embedded-agent-DxwzoZkp.js +4074 -0
  175. package/dist/embedded-agent.runtime-DDbhA85-.js +4 -0
  176. package/dist/embedded-agent.runtime.js +1 -1
  177. package/dist/embedded-backend-ChaKCepC.js +1581 -0
  178. package/dist/embedded-gateway-stub.runtime-e_ZxGhcW.js +12 -0
  179. package/dist/embedded-gateway-stub.runtime.js +1 -1
  180. package/dist/entry.d.ts +1 -1
  181. package/dist/extensionAPI.d.ts +2 -2
  182. package/dist/extensionAPI.js +1 -1
  183. package/dist/extensions/active-memory/index.d.ts +1 -1
  184. package/dist/extensions/active-memory/index.js +1 -1
  185. package/dist/extensions/admin-http-rpc/index.d.ts +1 -1
  186. package/dist/extensions/admin-http-rpc/index.js +1 -1
  187. package/dist/extensions/bonjour/index.d.ts +1 -1
  188. package/dist/extensions/browser/browser-bridge.js +1 -1
  189. package/dist/extensions/browser/browser-config.js +4 -4
  190. package/dist/extensions/browser/browser-control-auth.js +2 -2
  191. package/dist/extensions/browser/browser-doctor.js +2 -2
  192. package/dist/extensions/browser/browser-maintenance.js +1 -1
  193. package/dist/extensions/browser/browser-profiles.js +2 -2
  194. package/dist/extensions/browser/browser-runtime-api.js +12 -12
  195. package/dist/extensions/browser/cli-metadata.d.ts +1 -1
  196. package/dist/extensions/browser/cli-metadata.js +1 -1
  197. package/dist/extensions/browser/index.d.ts +1 -1
  198. package/dist/extensions/browser/index.js +1 -1
  199. package/dist/extensions/browser/plugin-registration.d.ts +1 -1
  200. package/dist/extensions/browser/plugin-registration.js +1 -1
  201. package/dist/extensions/browser/register.runtime.d.ts +2 -2
  202. package/dist/extensions/browser/register.runtime.js +4 -4
  203. package/dist/extensions/browser/runtime-api.d.ts +3 -3
  204. package/dist/extensions/browser/runtime-api.js +14 -14
  205. package/dist/extensions/browser/setup-api.d.ts +1 -1
  206. package/dist/extensions/canvas/cli-metadata.d.ts +1 -1
  207. package/dist/extensions/canvas/index.d.ts +1 -1
  208. package/dist/extensions/canvas/index.js +1 -1
  209. package/dist/extensions/canvas/setup-api.d.ts +1 -1
  210. package/dist/extensions/deepseek/api.d.ts +1 -1
  211. package/dist/extensions/deepseek/index.d.ts +1 -1
  212. package/dist/extensions/deepseek/provider-discovery.d.ts +1 -1
  213. package/dist/extensions/deepseek/stream.d.ts +1 -1
  214. package/dist/extensions/device-pair/api.d.ts +4 -4
  215. package/dist/extensions/device-pair/api.js +1 -1
  216. package/dist/extensions/device-pair/index.d.ts +1 -1
  217. package/dist/extensions/device-pair/notify.d.ts +1 -1
  218. package/dist/extensions/device-pair/pair-command-approve.js +1 -1
  219. package/dist/extensions/device-pair/qr-image.d.ts +1 -1
  220. package/dist/extensions/memory-core/api.d.ts +1 -1
  221. package/dist/extensions/memory-core/cli-metadata.d.ts +1 -1
  222. package/dist/extensions/memory-core/cli-metadata.js +1 -1
  223. package/dist/extensions/memory-core/index.d.ts +1 -1
  224. package/dist/extensions/memory-core/manager-runtime.d.ts +1 -1
  225. package/dist/extensions/memory-core/runtime-api.d.ts +3 -3
  226. package/dist/extensions/skill-workshop/api.d.ts +2 -2
  227. package/dist/extensions/skill-workshop/api.js +1 -1
  228. package/dist/extensions/skill-workshop/index.d.ts +1 -1
  229. package/dist/extensions/skill-workshop/index.js +2 -2
  230. package/dist/extensions/tavily/index.d.ts +1 -1
  231. package/dist/extensions/tavily/web-search-contract-api.d.ts +1 -1
  232. package/dist/extensions/tavily/web-search-provider.d.ts +1 -1
  233. package/dist/extensions/thread-ownership/api.d.ts +2 -2
  234. package/dist/extensions/thread-ownership/index.d.ts +1 -1
  235. package/dist/extensions/webhooks/api.d.ts +2 -2
  236. package/dist/extensions/webhooks/api.js +1 -1
  237. package/dist/extensions/webhooks/index.d.ts +1 -1
  238. package/dist/extensions/webhooks/index.js +1 -1
  239. package/dist/extensions/webhooks/runtime-api.d.ts +1 -1
  240. package/dist/extensions/workboard/api.d.ts +2 -2
  241. package/dist/extensions/workboard/index.d.ts +1 -1
  242. package/dist/extensions/workboard/index.js +1 -1
  243. package/dist/extensions/workboard/runtime-api.d.ts +1 -1
  244. package/dist/fengming-runtime-CtRd5677.d.ts +153 -0
  245. package/dist/fengming-tools-DBLsJfsf.js +12221 -0
  246. package/dist/gateway-cli-BgDV2HF9.js +443 -0
  247. package/dist/gateway-method-runtime-d9oN_XO9.js +21 -0
  248. package/dist/get-reply-CEMtvaTJ.js +5198 -0
  249. package/dist/get-reply-from-config.runtime-CE8zmX7o.js +2 -0
  250. package/dist/get-reply-from-config.runtime.js +1 -1
  251. package/dist/heartbeat-runner-H8SmaKmJ.js +5 -0
  252. package/dist/heartbeat-runner.runtime-6hUaxEbl.js +3 -0
  253. package/dist/heartbeat-runner.runtime.js +1 -1
  254. package/dist/hooks-DkEvkwzS.js +536 -0
  255. package/dist/host-compat-DeAq3dnI.d.ts +21 -0
  256. package/dist/http-registry-BDoApjTY.d.ts +23 -0
  257. package/dist/inbound-reply-dispatch-CIYP2OPo.d.ts +156 -0
  258. package/dist/inbound-reply-dispatch-geHu6oUK.js +147 -0
  259. package/dist/inbound-reply-dispatch-vwW5Hl-_.js +2 -0
  260. package/dist/index.js +1 -1
  261. package/dist/init-DpE_6dG4.js +59 -0
  262. package/dist/interactive-Cb_1f91G.d.ts +26 -0
  263. package/dist/isolated-agent-B_upYOOM.js +2 -0
  264. package/dist/isolated-agent-KH9uwWhw.js +1097 -0
  265. package/dist/kernel-BHnBXnm2.d.ts +241 -0
  266. package/dist/lifecycle-BmZwopzF.js +570 -0
  267. package/dist/list.probe-5kzWm9Jk.js +451 -0
  268. package/dist/list.probe-9zBcGGQ4.js +2 -0
  269. package/dist/list.status-command-DY2ifqp1.js +815 -0
  270. package/dist/llm-slug-generator-Bmx0I84M.js +78 -0
  271. package/dist/llm-slug-generator.js +1 -1
  272. package/dist/loader-BVz75gSb.d.ts +142 -0
  273. package/dist/local-dispatch.runtime-CX3IOY1E.js +10 -0
  274. package/dist/local-dispatch.runtime.js +1 -1
  275. package/dist/manager-BXGg8bfG.d.ts +409 -0
  276. package/dist/mcp-http-B1lnh67s.js +2 -0
  277. package/dist/mcp-http-CamghE-W.js +583 -0
  278. package/dist/media-runtime-DpykroJR.d.ts +261 -0
  279. package/dist/memory-core-host-engine-embeddings-N2dX5P40.d.ts +324 -0
  280. package/dist/memory-core-host-engine-storage-WQfkQMer.d.ts +54 -0
  281. package/dist/message-handler-Ca_pqGVS.js +1806 -0
  282. package/dist/model-catalog-BBMLIjhq.d.ts +88 -0
  283. package/dist/model-selection-Cq82FXLy.js +352 -0
  284. package/dist/models-cli-Dm_393dw.js +257 -0
  285. package/dist/monitor-d0eyE2k0.js +60 -0
  286. package/dist/monitor.account-vLQ3bKHu.js +5382 -0
  287. package/dist/nodes-Bunvrb33.js +1483 -0
  288. package/dist/nodes-edNlxb2I.js +3 -0
  289. package/dist/nodes-pending-DEIwVh9v.js +211 -0
  290. package/dist/openai-compat-errors-CvWEoG98.js +136 -0
  291. package/dist/openai-http-Bskdv4Tv.js +836 -0
  292. package/dist/openresponses-http-DxdgCxFU.js +1175 -0
  293. package/dist/operations-Z85LFqsT.js +805 -0
  294. package/dist/outbound.types-DVkbsxo8.d.ts +291 -0
  295. package/dist/plugin-enabled-fvhTpvYS.js +232 -0
  296. package/dist/plugin-entry-CunlVUw6.d.ts +47 -0
  297. package/dist/plugin-registration-9ovnK_Tk.js +97 -0
  298. package/dist/plugin-runtime-DH2ZM9P5.d.ts +117 -0
  299. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  300. package/dist/plugin-sdk/acp-runtime-backend.js +1 -1
  301. package/dist/plugin-sdk/acp-runtime.js +1 -1
  302. package/dist/plugin-sdk/agent-harness-runtime.js +5 -5
  303. package/dist/plugin-sdk/agent-harness-task-runtime.js +1 -1
  304. package/dist/plugin-sdk/agent-harness.js +6 -6
  305. package/dist/plugin-sdk/agent-runtime.js +2 -2
  306. package/dist/plugin-sdk/bundled-channel-config-schema-Dfn3b8sF.d.ts +3169 -0
  307. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +1 -1
  308. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +1 -1
  309. package/dist/plugin-sdk/channel-core.js +2 -2
  310. package/dist/plugin-sdk/channel-envelope.js +1 -1
  311. package/dist/plugin-sdk/channel-inbound-roots.js +1 -1
  312. package/dist/plugin-sdk/channel-inbound.js +2 -2
  313. package/dist/plugin-sdk/channel-location.js +1 -1
  314. package/dist/plugin-sdk/channel-message-runtime.js +3 -3
  315. package/dist/plugin-sdk/channel-message.js +2 -2
  316. package/dist/plugin-sdk/channel-runtime.js +0 -1
  317. package/dist/plugin-sdk/command-status-runtime.js +1 -1
  318. package/dist/plugin-sdk/compat.js +1 -1
  319. package/dist/plugin-sdk/conversation-binding-runtime.js +1 -1
  320. package/dist/plugin-sdk/conversation-runtime.js +3 -3
  321. package/dist/plugin-sdk/core.js +2 -2
  322. package/dist/plugin-sdk/discord.d.ts +1 -1
  323. package/dist/plugin-sdk/gateway-method-runtime.js +1 -1
  324. package/dist/plugin-sdk/health.js +1 -1
  325. package/dist/plugin-sdk/hook-runtime.js +0 -1
  326. package/dist/plugin-sdk/inbound-reply-dispatch.js +2 -2
  327. package/dist/plugin-sdk/index.js +1 -1
  328. package/dist/plugin-sdk/infra-runtime.js +3 -1
  329. package/dist/plugin-sdk/provider-auth-api-key.js +0 -1
  330. package/dist/plugin-sdk/provider-stream-family.js +0 -1
  331. package/dist/plugin-sdk/provider-usage.js +649 -1
  332. package/dist/plugin-sdk/reply-runtime.js +4 -4
  333. package/dist/plugin-sdk/video-generation.js +206 -1
  334. package/dist/plugin-service-BdZxoKBZ.js +1249 -0
  335. package/dist/plugin-service-quTl5hT0.d.ts +24 -0
  336. package/dist/plugins/build-smoke-entry.d.ts +2 -2
  337. package/dist/plugins/loader.d.ts +1 -1
  338. package/dist/plugins/provider-discovery.runtime.d.ts +1 -1
  339. package/dist/plugins/provider-runtime.runtime.d.ts +1 -1
  340. package/dist/plugins/runtime/index.d.ts +1 -1
  341. package/dist/plugins/runtime/index.js +4 -4
  342. package/dist/plugins/tools.d.ts +1 -1
  343. package/dist/prepare.runtime-DFvkUqBZ.js +798 -0
  344. package/dist/prepare.runtime.js +1 -1
  345. package/dist/preview-warnings-CGzc8ccG.js +618 -0
  346. package/dist/program-D19g2jaa.js +131 -0
  347. package/dist/provider-api-key-auth-B8GgTfo8.d.ts +27 -0
  348. package/dist/provider-auth-result-Diw-woMA.d.ts +21 -0
  349. package/dist/provider-catalog-shared-hMvzzDgL.d.ts +62 -0
  350. package/dist/provider-dispatcher-DCTc4lG_.js +22 -0
  351. package/dist/provider-dispatcher.runtime.js +1 -1
  352. package/dist/provider-model-shared-BUCh3uCL.d.ts +143 -0
  353. package/dist/provider-registry-BIokPlxa.d.ts +8 -0
  354. package/dist/provider-registry-CyUOXHG-.d.ts +8 -0
  355. package/dist/provider-registry-i--H79Ao.d.ts +29 -0
  356. package/dist/provider-self-hosted-setup-BF8UR8wg.d.ts +74 -0
  357. package/dist/provider-stream-NF0XJnar.d.ts +139 -0
  358. package/dist/provider-stream-shared-DLwDaYed.d.ts +132 -0
  359. package/dist/provider-web-search-contract-fields-D61Vl5Kl.d.ts +25 -0
  360. package/dist/pw-ai-DYR-D7xR.js +3064 -0
  361. package/dist/register.agent-DwW0mQPk.js +152 -0
  362. package/dist/register.crestodian-BhIukKDA.js +24 -0
  363. package/dist/register.maintenance-DWHlvztJ.js +85 -0
  364. package/dist/register.subclis-Bsvdh8RI.js +3 -0
  365. package/dist/register.subclis-DVk0HU4k.js +31 -0
  366. package/dist/register.subclis-core-BK7nVvl6.js +278 -0
  367. package/dist/registry-hscEPAcC.d.ts +8 -0
  368. package/dist/registry-types-Ce-n1tuw.d.ts +392 -0
  369. package/dist/repair-sequencing-0-qGNSUO.js +652 -0
  370. package/dist/reply-payload-mCw4ZND6.d.ts +200 -0
  371. package/dist/reply-turn-admission-DMWNadoS.js +2056 -0
  372. package/dist/reply.runtime-CE8zmX7o.js +2 -0
  373. package/dist/reply.runtime.js +1 -1
  374. package/dist/result-fallback-classifier-BZmv2ACy.js +98 -0
  375. package/dist/route-qQ-jYpFa.js +475 -0
  376. package/dist/routes-dTCmw98g.js +2 -0
  377. package/dist/routes-r8DRKa83.js +3701 -0
  378. package/dist/run-BgH7EPGH.js +1162 -0
  379. package/dist/run-command-DCsM-BVh.js +23 -0
  380. package/dist/run-command-I2ib4dwS.js +2 -0
  381. package/dist/run-context-CWaKUKKJ.js +66 -0
  382. package/dist/run-embedded.runtime-CBnDBWN0.js +4 -0
  383. package/dist/run-embedded.runtime.js +1 -1
  384. package/dist/run-execution-cli.runtime-DlYXI-lw.js +4 -0
  385. package/dist/run-execution-cli.runtime.js +1 -1
  386. package/dist/run-executor.runtime-DwepGrmB.js +330 -0
  387. package/dist/run-executor.runtime.js +1 -1
  388. package/dist/run-subagent-registry.runtime-CeVpoIhj.js +2 -0
  389. package/dist/run-subagent-registry.runtime.js +1 -1
  390. package/dist/runtime-D2ee-rNh.js +436 -0
  391. package/dist/runtime-api-B99ZlkNt.d.ts +5 -0
  392. package/dist/runtime-api-Cta2L_Yo.js +12 -0
  393. package/dist/runtime-channel-LKOkML3M.js +2 -0
  394. package/dist/runtime-channel-UtWvrTZ5.js +148 -0
  395. package/dist/runtime-embedded-agent.runtime-9O2Idzyb.js +2 -0
  396. package/dist/runtime-embedded-agent.runtime.js +1 -1
  397. package/dist/runtime-forwarders-DjI8RFL5.d.ts +39 -0
  398. package/dist/sdk-setup-tools-B-X04pa6.js +8 -0
  399. package/dist/selection-B02h8Old.js +3 -0
  400. package/dist/selection-DEPvzrW2.js +18365 -0
  401. package/dist/server-CMYi8gDo.js +24 -0
  402. package/dist/server-Cx07rsiY.js +72 -0
  403. package/dist/server-close.runtime.js +1 -1
  404. package/dist/server-context-BIemGRt4.js +2 -0
  405. package/dist/server-context-CB_an9iy.js +955 -0
  406. package/dist/server-cron-BeyuBUjb.js +3173 -0
  407. package/dist/server-cron-CV7KkVeB.js +2 -0
  408. package/dist/server-methods-C7EnpOhB.js +497 -0
  409. package/dist/server-node-events-DMMzZciN.js +597 -0
  410. package/dist/server-plugin-bootstrap-O6MzvzL8.js +71 -0
  411. package/dist/server-plugins-Dwnaz9kX.js +435 -0
  412. package/dist/server-reload-handlers-C-6TyPvI.js +719 -0
  413. package/dist/server-restart-sentinel-Dc35eYgk.js +700 -0
  414. package/dist/server-runtime-services-DCs-gqh_.js +3 -0
  415. package/dist/server-runtime-services-DF2fzzVd.js +147 -0
  416. package/dist/server-startup-plugins-t-YeYibm.js +127 -0
  417. package/dist/server-startup-post-attach-CiEki-DC.js +793 -0
  418. package/dist/server-ws-runtime-uaUpI-e8.js +374 -0
  419. package/dist/server.impl-MoHjSMr5.js +2622 -0
  420. package/dist/session-kill-http-CYCiQpt2.js +121 -0
  421. package/dist/session-reset-service-BYbADY57.js +651 -0
  422. package/dist/session-status.runtime-8NASbeO4.js +2 -0
  423. package/dist/session-status.runtime.js +1 -1
  424. package/dist/session-subagent-reactivation.runtime-DGeNY2Rb.js +2 -0
  425. package/dist/session-subagent-reactivation.runtime.js +1 -1
  426. package/dist/session-tab-registry-C2eElZrt.js +551 -0
  427. package/dist/sessions-DXAdVXIx.js +1917 -0
  428. package/dist/sessions-history-http-BwK7b8OH.js +432 -0
  429. package/dist/sessions-patch-BYC5gvY1.js +401 -0
  430. package/dist/sessions-resolve-C3ORcdmo.js +180 -0
  431. package/dist/sessions.runtime-BijldeSY.js +2 -0
  432. package/dist/sessions.runtime.js +1 -1
  433. package/dist/snapshot-urls-C5CfP3Co.js +317 -0
  434. package/dist/speech-core-wWkTZPpQ.d.ts +49 -0
  435. package/dist/standalone-CHrieUsw.js +42 -0
  436. package/dist/startup-context-CZfmG8-g.js +314 -0
  437. package/dist/status-subagents.runtime-D2XMebiS.js +32 -0
  438. package/dist/status-subagents.runtime.js +1 -1
  439. package/dist/status-text-JR7IPyzZ.js +301 -0
  440. package/dist/stream-BJgTkLEI.d.ts +5 -0
  441. package/dist/subagent-announce-B9cfs_KZ.js +353 -0
  442. package/dist/subagent-announce-delivery-CtmEvLTS.js +1369 -0
  443. package/dist/subagent-control-DVqLHi9O.js +492 -0
  444. package/dist/subagent-hooks-D251uSvy.js +230 -0
  445. package/dist/subagent-hooks-api-DvdMKxsC.js +23 -0
  446. package/dist/subagent-hooks-uLORYChc.js +2 -0
  447. package/dist/subagent-registry-BW2l_oYu.js +3 -0
  448. package/dist/subagent-registry-BxEMHuiN.js +2627 -0
  449. package/dist/subagent-registry.runtime.d.ts +1 -1
  450. package/dist/subagent-registry.runtime.js +1 -1
  451. package/dist/subagent-session-cleanup-BC5wV2qQ.js +390 -0
  452. package/dist/system-fvgHsr2x.js +111 -0
  453. package/dist/talk-DU0Sod_K.js +2454 -0
  454. package/dist/target-id-BR2xJIkd.js +107 -0
  455. package/dist/task-registry-control.runtime.js +1 -1
  456. package/dist/thread-bindings-8XNu5U2p.js +228 -0
  457. package/dist/tool-Boeg0N5g.js +143 -0
  458. package/dist/tool-dispatch-BhLLaL2g.js +155 -0
  459. package/dist/tool-resolution-CzsLs-87.js +153 -0
  460. package/dist/tool-split-Bedy42Ms.d.ts +19 -0
  461. package/dist/tools-B6egHpE3.d.ts +38 -0
  462. package/dist/tools-effective-NXscxK8n.js +442 -0
  463. package/dist/tools-effective-inventory-NsGMUVo-.js +379 -0
  464. package/dist/tools-invoke-_sSu96Kq.js +51 -0
  465. package/dist/tools-invoke-http-BDhlRl-G.js +68 -0
  466. package/dist/tools-invoke-shared-BH-T9Bcg.js +200 -0
  467. package/dist/tts-runtime-C1wu3o15.d.ts +230 -0
  468. package/dist/tui-C733Qov0.js +2 -0
  469. package/dist/tui-DqbscVN5.js +3 -0
  470. package/dist/tui-backend-_Pn3Byj-.js +257 -0
  471. package/dist/tui-cli-CAiC39zd.js +40 -0
  472. package/dist/tui-ink-run-ChXEGj1h.js +7414 -0
  473. package/dist/tui-ink-run-D4mSfLHj.js +2 -0
  474. package/dist/types-BQw1qXGl.d.ts +7034 -0
  475. package/dist/types-BzMoU6-C.d.ts +111 -0
  476. package/dist/types-DltHmoCX.d.ts +393 -0
  477. package/dist/types.public-C_bVIMBl.d.ts +70 -0
  478. package/dist/web-fetch/runtime.d.ts +1 -1
  479. package/dist/webhook-targets-DW2jhddP.d.ts +99 -0
  480. package/npm-shrinkwrap.json +12861 -11889
  481. package/package.json +2 -5
  482. package/skills/batch/SKILL.md +118 -0
  483. package/skills/code-review/SKILL.md +107 -0
  484. package/skills/debug/SKILL.md +83 -0
  485. package/skills/loop/SKILL.md +118 -0
  486. package/skills/run/SKILL.md +79 -0
  487. package/skills/run-skill-generator/SKILL.md +179 -0
  488. package/skills/verify/SKILL.md +103 -0
  489. package/dist/abort-DGskei2p.js +0 -277
  490. package/dist/abort.runtime-Buq9IZxn.js +0 -2
  491. package/dist/acp-spawn-DC6IyYaB.js +0 -1286
  492. package/dist/acp-spawn-Diqb3nel.js +0 -2
  493. package/dist/acp-stateful-target-driver-Clhe_L8v.js +0 -89
  494. package/dist/active-tool-schema-warnings-BRhKkyvt.js +0 -2
  495. package/dist/active-tool-schema-warnings-C6N0-ce6.js +0 -105
  496. package/dist/agent-C5lhsEZJ.js +0 -2
  497. package/dist/agent-WEb757bl.js +0 -1825
  498. package/dist/agent-command-iLD_nsVY.js +0 -1435
  499. package/dist/agent-core-BeDN8Ns5.d.ts +0 -13
  500. package/dist/agent-harness-runtime-C89_Q-bW.d.ts +0 -913
  501. package/dist/agent-harness-runtime-Dfn5rik2.js +0 -207
  502. package/dist/agent-runner-utils-DNiuuo43.js +0 -267
  503. package/dist/agent-runner.runtime-CFF_qJ5V.js +0 -3784
  504. package/dist/agent-runtime-BkMtWXxn.js +0 -199
  505. package/dist/agent-runtime-HufMO_YR.d.ts +0 -207
  506. package/dist/agent-tools-HmaDv4ot.js +0 -2506
  507. package/dist/agent-via-gateway-CZQG8RYL.js +0 -486
  508. package/dist/agent-wait-dedupe-C3xQk2Ww.js +0 -180
  509. package/dist/agent-z1cs3c7n.js +0 -3
  510. package/dist/api-B4IMKjSe.js +0 -3
  511. package/dist/api-BwSbBWI8.js +0 -3
  512. package/dist/api-CE9In9m4.js +0 -5
  513. package/dist/api-ClPvYNGa.js +0 -32
  514. package/dist/api-CntBCaZf.js +0 -3
  515. package/dist/api-DBZBwTsn.js +0 -6
  516. package/dist/api-OCPwGOvK.js +0 -2
  517. package/dist/api-yYhEo7gK.js +0 -4
  518. package/dist/approval-client-helpers-CfdQ3-vv.d.ts +0 -78
  519. package/dist/approval-native-helpers-DSHPksK4.d.ts +0 -241
  520. package/dist/approval-renderers-BfEfwk44.d.ts +0 -39
  521. package/dist/assistant-v5fdOYu7.js +0 -291
  522. package/dist/attachment-normalize-BHAbLiL2.js +0 -213
  523. package/dist/attempt-execution-5w9WYbaJ.js +0 -584
  524. package/dist/attempt-execution.runtime-DnhOWGzr.js +0 -3
  525. package/dist/attempt.prompt-helpers-C4M4erF7.js +0 -543
  526. package/dist/binding-routing-Dpes-QF1.js +0 -113
  527. package/dist/binding-targets-B6H5Pd-A.js +0 -121
  528. package/dist/bridge-server-BCpxCRm_.js +0 -113
  529. package/dist/browser-cli-DMhXHopl.js +0 -230
  530. package/dist/browser-cli-Dy_VugK0.js +0 -2
  531. package/dist/browser-cli-actions-input-WMP7_lm6.js +0 -522
  532. package/dist/browser-cli-actions-observe-DQWAWhwU.js +0 -81
  533. package/dist/browser-cli-debug-CaT2ZKAx.js +0 -137
  534. package/dist/browser-cli-inspect-DU-LUXq1.js +0 -117
  535. package/dist/browser-cli-manage-DAuogqIh.js +0 -446
  536. package/dist/browser-cli-resize-Cz5uO_aR.js +0 -32
  537. package/dist/browser-cli-shared-CjPZcG3j.js +0 -69
  538. package/dist/browser-cli-state-CC3l77-K.js +0 -371
  539. package/dist/browser-control-auth-ELccIUZy.js +0 -2
  540. package/dist/browser-profiles-Cuy4ia6_.js +0 -2
  541. package/dist/browser-runtime-De-iUfME.js +0 -389
  542. package/dist/build-DEF8Per9.js +0 -261
  543. package/dist/capability-cli-Bydel4E7.js +0 -1809
  544. package/dist/channel-6SGL4R5P.js +0 -2309
  545. package/dist/channel-D3Q3b8J-.d.ts +0 -427
  546. package/dist/channel-core-Bj71kAB5.d.ts +0 -6
  547. package/dist/channel-core-DMvyWnHg.js +0 -5
  548. package/dist/channel-entry-contract-zYxRmEdf.d.ts +0 -114
  549. package/dist/channel-inbound-DVJzBcJ8.d.ts +0 -97
  550. package/dist/channel-inbound-DlCa7eJe.js +0 -121
  551. package/dist/channel-message-CyPGMMFB.js +0 -12
  552. package/dist/channel-message-Czl4cdoA.d.ts +0 -9
  553. package/dist/channel-outbound-BNbhmruA.d.ts +0 -325
  554. package/dist/channel-pairing-BiS-tSvl.d.ts +0 -58
  555. package/dist/channel-runtime-D8hntg7H.js +0 -7
  556. package/dist/channel.runtime-DxErReJR.js +0 -697
  557. package/dist/chat-BLA8ORQI.js +0 -3
  558. package/dist/chat-DWRXkuvU.js +0 -2940
  559. package/dist/chrome-DPwFYi-g.js +0 -1517
  560. package/dist/cli-compaction-YZpssARf.js +0 -363
  561. package/dist/cli-runner-D2OAqxu3.js +0 -597
  562. package/dist/cli-runner-DO4SORQf.js +0 -2
  563. package/dist/cli-runner.runtime-CNSIpbeT.js +0 -4
  564. package/dist/cli-runner.runtime-DAOYvpVQ.js +0 -3
  565. package/dist/command-registry-DpD0fb8D.js +0 -4
  566. package/dist/command-registry-core-Cl3tLG8G.js +0 -114
  567. package/dist/command-registry-nbP7c8RT.js +0 -9
  568. package/dist/command-status.runtime-BBuXTkq0.js +0 -90
  569. package/dist/commands-CR8MVvlD.d.ts +0 -117
  570. package/dist/commands-compact.runtime-BoafIjjg.js +0 -10
  571. package/dist/commands-handlers.runtime-D9jViG_x.js +0 -6327
  572. package/dist/commands-status-BqqJ7PVq.js +0 -16
  573. package/dist/commands-status-CMd41Vxf.js +0 -3
  574. package/dist/commands-status.runtime-CMd41Vxf.js +0 -3
  575. package/dist/commands-subagents-control.runtime-CU4I3A_n.js +0 -2
  576. package/dist/commands-system-prompt-CTtu1D3-.js +0 -2
  577. package/dist/commands-system-prompt-xswhORdM.js +0 -161
  578. package/dist/commands-types-B67CsqXf.d.ts +0 -132
  579. package/dist/commands.runtime-BUFhkrjQ.js +0 -175
  580. package/dist/compact-Dz_WvRkQ.js +0 -1165
  581. package/dist/compact.runtime-n-AKErni.js +0 -12
  582. package/dist/completion-cli-DJYs_L4_.js +0 -393
  583. package/dist/config-CFMbHJb0.js +0 -374
  584. package/dist/config-mutations-DCAloTKR.js +0 -161
  585. package/dist/config-schema-Drw1zrnG.d.ts +0 -20
  586. package/dist/context-engine-host-compat-4mNm1HCE.js +0 -2
  587. package/dist/context-engine-host-compat-BzJ7fUIn.js +0 -280
  588. package/dist/context-engine-lifecycle-V4PNQp6k.js +0 -627
  589. package/dist/control-auth-DG_cw-aN.js +0 -114
  590. package/dist/control-service-CurYipgK.js +0 -3
  591. package/dist/control-service-VyncoV7j.js +0 -40
  592. package/dist/control-ui/assets/activity-D5Plhlo-.js +0 -124
  593. package/dist/control-ui/assets/agents-Chcdfe1E.js +0 -1030
  594. package/dist/control-ui/assets/channels-BEtB4H37.js +0 -120
  595. package/dist/control-ui/assets/cron-CZyPkxSU.js +0 -1016
  596. package/dist/control-ui/assets/debug-DvM8iG47.js +0 -97
  597. package/dist/control-ui/assets/index-Rmpgh0f1.js +0 -7214
  598. package/dist/control-ui/assets/instances-yTC_uu60.js +0 -57
  599. package/dist/control-ui/assets/nodes-vbAxVHIH.js +0 -444
  600. package/dist/control-ui/assets/sessions-DOviHme5.js +0 -425
  601. package/dist/control-ui/assets/skills-Bfp5HEGW.js +0 -362
  602. package/dist/control-ui/assets/workboard-5sU2kHsV.js +0 -402
  603. package/dist/conversation-runtime-DgaABwHh.js +0 -31
  604. package/dist/core-BeBXdneV.js +0 -284
  605. package/dist/core-Chqb7X6l.d.ts +0 -223
  606. package/dist/core-api-BlK0FgBM.js +0 -2
  607. package/dist/core-api-pAvYk716.js +0 -5
  608. package/dist/crestodian-FeGTBqO1.js +0 -55
  609. package/dist/delegate-BjIjSU_E.d.ts +0 -30
  610. package/dist/deliver-CvtWN4Ey.d.ts +0 -111
  611. package/dist/delivery-queue-CQ-cj3KG.d.ts +0 -161
  612. package/dist/delivery-queue-runtime-ut7MG04m.d.ts +0 -9
  613. package/dist/detect-BjXPyrwn.js +0 -115
  614. package/dist/detect-C1xeIemQ.d.ts +0 -16
  615. package/dist/dialogue-BowVYhEC.js +0 -37
  616. package/dist/direct-dm-DoZZHpA0.d.ts +0 -79
  617. package/dist/directive-handling.fast-lane-hnmQ_CvD.js +0 -70
  618. package/dist/directive-handling.impl-Cai-CFS1.js +0 -2
  619. package/dist/directive-handling.impl-DY84qIfU.js +0 -823
  620. package/dist/directive-handling.model-selection-DASssLFQ.js +0 -122
  621. package/dist/directive-handling.persist.runtime-BY7tJUs2.js +0 -274
  622. package/dist/dispatch-D5iG5A8j.js +0 -2057
  623. package/dist/dispatch-acp-transcript.runtime-D3r16hbD.js +0 -40
  624. package/dist/dispatch-acp.runtime-CAIau5qX.js +0 -18
  625. package/dist/dispatcher-7-d2gw3J.js +0 -106
  626. package/dist/doctor-DD5YEMmf.js +0 -6
  627. package/dist/doctor-config-flow-CdlLHJmX.js +0 -1819
  628. package/dist/doctor-core-checks-6MP99TQG.js +0 -666
  629. package/dist/doctor-core-checks-Dm_o576z.js +0 -2
  630. package/dist/doctor-core-checks.runtime-B2qbKATd.js +0 -278
  631. package/dist/doctor-health-BKrhOv1v.js +0 -65
  632. package/dist/doctor-health-contributions-bIBLmw69.js +0 -874
  633. package/dist/doctor-lint-aOLOWli4.js +0 -95
  634. package/dist/doctor-state-integrity-23NQNNuo.js +0 -1257
  635. package/dist/draft-stream-controls-Bk1GVJ1l.d.ts +0 -159
  636. package/dist/embedded-agent-BeK8FhZr.d.ts +0 -5
  637. package/dist/embedded-agent-CNp_y7jW.js +0 -4074
  638. package/dist/embedded-agent-NEmNlXDR.js +0 -4
  639. package/dist/embedded-agent.runtime-hEby8P2s.js +0 -4
  640. package/dist/embedded-backend-BdbgfpBP.js +0 -1581
  641. package/dist/embedded-gateway-stub.runtime-ySZUA3Gy.js +0 -12
  642. package/dist/extensions/alibaba/fengming.plugin.json +0 -47
  643. package/dist/extensions/alibaba/index.d.ts +0 -12
  644. package/dist/extensions/alibaba/index.js +0 -13
  645. package/dist/extensions/alibaba/package.json +0 -15
  646. package/dist/extensions/alibaba/video-generation-provider.d.ts +0 -6
  647. package/dist/extensions/alibaba/video-generation-provider.js +0 -2
  648. package/dist/extensions/baichuan/fengming.plugin.json +0 -69
  649. package/dist/extensions/baichuan/index.d.ts +0 -11
  650. package/dist/extensions/baichuan/index.js +0 -45
  651. package/dist/extensions/baichuan/models.d.ts +0 -7
  652. package/dist/extensions/baichuan/models.js +0 -2
  653. package/dist/extensions/baichuan/onboard.d.ts +0 -5
  654. package/dist/extensions/baichuan/onboard.js +0 -2
  655. package/dist/extensions/baichuan/package.json +0 -15
  656. package/dist/extensions/baichuan/provider-catalog.d.ts +0 -2
  657. package/dist/extensions/baichuan/provider-catalog.js +0 -2
  658. package/dist/extensions/baichuan/provider-discovery.d.ts +0 -2
  659. package/dist/extensions/baichuan/provider-discovery.js +0 -5
  660. package/dist/extensions/byteplus/api.d.ts +0 -3
  661. package/dist/extensions/byteplus/api.js +0 -3
  662. package/dist/extensions/byteplus/fengming.plugin.json +0 -196
  663. package/dist/extensions/byteplus/index.d.ts +0 -12
  664. package/dist/extensions/byteplus/index.js +0 -85
  665. package/dist/extensions/byteplus/models.d.ts +0 -2
  666. package/dist/extensions/byteplus/models.js +0 -2
  667. package/dist/extensions/byteplus/package.json +0 -15
  668. package/dist/extensions/byteplus/provider-catalog.d.ts +0 -2
  669. package/dist/extensions/byteplus/provider-catalog.js +0 -2
  670. package/dist/extensions/byteplus/provider-discovery.d.ts +0 -5
  671. package/dist/extensions/byteplus/provider-discovery.js +0 -23
  672. package/dist/extensions/byteplus/video-generation-provider.d.ts +0 -6
  673. package/dist/extensions/byteplus/video-generation-provider.js +0 -2
  674. package/dist/extensions/longcat/fengming.plugin.json +0 -84
  675. package/dist/extensions/longcat/index.d.ts +0 -11
  676. package/dist/extensions/longcat/index.js +0 -45
  677. package/dist/extensions/longcat/models.d.ts +0 -7
  678. package/dist/extensions/longcat/models.js +0 -2
  679. package/dist/extensions/longcat/onboard.d.ts +0 -5
  680. package/dist/extensions/longcat/onboard.js +0 -2
  681. package/dist/extensions/longcat/package.json +0 -15
  682. package/dist/extensions/longcat/provider-catalog.d.ts +0 -2
  683. package/dist/extensions/longcat/provider-catalog.js +0 -2
  684. package/dist/extensions/longcat/provider-discovery.d.ts +0 -2
  685. package/dist/extensions/longcat/provider-discovery.js +0 -5
  686. package/dist/extensions/minimax/api.d.ts +0 -5
  687. package/dist/extensions/minimax/api.js +0 -6
  688. package/dist/extensions/minimax/fengming.plugin.json +0 -206
  689. package/dist/extensions/minimax/image-generation-provider.d.ts +0 -6
  690. package/dist/extensions/minimax/image-generation-provider.js +0 -2
  691. package/dist/extensions/minimax/index.d.ts +0 -12
  692. package/dist/extensions/minimax/index.js +0 -29
  693. package/dist/extensions/minimax/media-understanding-provider.d.ts +0 -6
  694. package/dist/extensions/minimax/media-understanding-provider.js +0 -2
  695. package/dist/extensions/minimax/model-definitions.d.ts +0 -2
  696. package/dist/extensions/minimax/model-definitions.js +0 -2
  697. package/dist/extensions/minimax/music-generation-provider.d.ts +0 -6
  698. package/dist/extensions/minimax/music-generation-provider.js +0 -2
  699. package/dist/extensions/minimax/oauth.d.ts +0 -2
  700. package/dist/extensions/minimax/oauth.js +0 -2
  701. package/dist/extensions/minimax/oauth.runtime.d.ts +0 -2
  702. package/dist/extensions/minimax/oauth.runtime.js +0 -2
  703. package/dist/extensions/minimax/onboard.d.ts +0 -2
  704. package/dist/extensions/minimax/onboard.js +0 -2
  705. package/dist/extensions/minimax/package.json +0 -15
  706. package/dist/extensions/minimax/provider-catalog.d.ts +0 -2
  707. package/dist/extensions/minimax/provider-catalog.js +0 -2
  708. package/dist/extensions/minimax/provider-contract-api.d.ts +0 -6
  709. package/dist/extensions/minimax/provider-contract-api.js +0 -77
  710. package/dist/extensions/minimax/provider-discovery.d.ts +0 -5
  711. package/dist/extensions/minimax/provider-discovery.js +0 -23
  712. package/dist/extensions/minimax/provider-models.d.ts +0 -2
  713. package/dist/extensions/minimax/provider-models.js +0 -2
  714. package/dist/extensions/minimax/provider-registration.d.ts +0 -7
  715. package/dist/extensions/minimax/provider-registration.js +0 -2
  716. package/dist/extensions/minimax/speech-provider.d.ts +0 -5
  717. package/dist/extensions/minimax/speech-provider.js +0 -2
  718. package/dist/extensions/minimax/tts.d.ts +0 -20
  719. package/dist/extensions/minimax/tts.js +0 -2
  720. package/dist/extensions/minimax/video-generation-provider.d.ts +0 -7
  721. package/dist/extensions/minimax/video-generation-provider.js +0 -2
  722. package/dist/extensions/minimax/web-search-contract-api.d.ts +0 -5
  723. package/dist/extensions/minimax/web-search-contract-api.js +0 -31
  724. package/dist/extensions/minimax/web-search-provider.d.ts +0 -5
  725. package/dist/extensions/minimax/web-search-provider.js +0 -2
  726. package/dist/extensions/moonshot/api.d.ts +0 -3
  727. package/dist/extensions/moonshot/api.js +0 -4
  728. package/dist/extensions/moonshot/fengming.plugin.json +0 -250
  729. package/dist/extensions/moonshot/index.d.ts +0 -11
  730. package/dist/extensions/moonshot/index.js +0 -70
  731. package/dist/extensions/moonshot/media-understanding-provider.d.ts +0 -6
  732. package/dist/extensions/moonshot/media-understanding-provider.js +0 -2
  733. package/dist/extensions/moonshot/onboard.d.ts +0 -2
  734. package/dist/extensions/moonshot/onboard.js +0 -2
  735. package/dist/extensions/moonshot/package.json +0 -15
  736. package/dist/extensions/moonshot/provider-catalog.d.ts +0 -2
  737. package/dist/extensions/moonshot/provider-catalog.js +0 -2
  738. package/dist/extensions/moonshot/provider-contract-api.d.ts +0 -5
  739. package/dist/extensions/moonshot/provider-contract-api.js +0 -27
  740. package/dist/extensions/moonshot/provider-discovery.d.ts +0 -5
  741. package/dist/extensions/moonshot/provider-discovery.js +0 -15
  742. package/dist/extensions/moonshot/web-search-contract-api.d.ts +0 -5
  743. package/dist/extensions/moonshot/web-search-contract-api.js +0 -29
  744. package/dist/extensions/moonshot/web-search-provider.d.ts +0 -5
  745. package/dist/extensions/moonshot/web-search-provider.js +0 -2
  746. package/dist/extensions/qianfan/api.d.ts +0 -3
  747. package/dist/extensions/qianfan/api.js +0 -3
  748. package/dist/extensions/qianfan/fengming.plugin.json +0 -89
  749. package/dist/extensions/qianfan/index.d.ts +0 -11
  750. package/dist/extensions/qianfan/index.js +0 -26
  751. package/dist/extensions/qianfan/onboard.d.ts +0 -2
  752. package/dist/extensions/qianfan/onboard.js +0 -2
  753. package/dist/extensions/qianfan/package.json +0 -15
  754. package/dist/extensions/qianfan/provider-catalog.d.ts +0 -2
  755. package/dist/extensions/qianfan/provider-catalog.js +0 -2
  756. package/dist/extensions/qwen/api.d.ts +0 -4
  757. package/dist/extensions/qwen/api.js +0 -5
  758. package/dist/extensions/qwen/fengming.plugin.json +0 -389
  759. package/dist/extensions/qwen/index.d.ts +0 -11
  760. package/dist/extensions/qwen/index.js +0 -202
  761. package/dist/extensions/qwen/media-understanding-provider.d.ts +0 -6
  762. package/dist/extensions/qwen/media-understanding-provider.js +0 -2
  763. package/dist/extensions/qwen/model-definitions.d.ts +0 -2
  764. package/dist/extensions/qwen/model-definitions.js +0 -2
  765. package/dist/extensions/qwen/models.d.ts +0 -2
  766. package/dist/extensions/qwen/models.js +0 -2
  767. package/dist/extensions/qwen/onboard.d.ts +0 -21
  768. package/dist/extensions/qwen/onboard.js +0 -2
  769. package/dist/extensions/qwen/package.json +0 -15
  770. package/dist/extensions/qwen/provider-catalog.d.ts +0 -2
  771. package/dist/extensions/qwen/provider-catalog.js +0 -2
  772. package/dist/extensions/qwen/stream.d.ts +0 -2
  773. package/dist/extensions/qwen/stream.js +0 -2
  774. package/dist/extensions/qwen/video-generation-provider.d.ts +0 -6
  775. package/dist/extensions/qwen/video-generation-provider.js +0 -2
  776. package/dist/extensions/sensenova/fengming.plugin.json +0 -69
  777. package/dist/extensions/sensenova/index.d.ts +0 -11
  778. package/dist/extensions/sensenova/index.js +0 -45
  779. package/dist/extensions/sensenova/models.d.ts +0 -7
  780. package/dist/extensions/sensenova/models.js +0 -2
  781. package/dist/extensions/sensenova/onboard.d.ts +0 -5
  782. package/dist/extensions/sensenova/onboard.js +0 -2
  783. package/dist/extensions/sensenova/package.json +0 -15
  784. package/dist/extensions/sensenova/provider-catalog.d.ts +0 -2
  785. package/dist/extensions/sensenova/provider-catalog.js +0 -2
  786. package/dist/extensions/sensenova/provider-discovery.d.ts +0 -2
  787. package/dist/extensions/sensenova/provider-discovery.js +0 -5
  788. package/dist/extensions/stepfun/fengming.plugin.json +0 -162
  789. package/dist/extensions/stepfun/index.d.ts +0 -12
  790. package/dist/extensions/stepfun/index.js +0 -165
  791. package/dist/extensions/stepfun/onboard.d.ts +0 -7
  792. package/dist/extensions/stepfun/onboard.js +0 -2
  793. package/dist/extensions/stepfun/package.json +0 -15
  794. package/dist/extensions/stepfun/provider-catalog.d.ts +0 -14
  795. package/dist/extensions/stepfun/provider-catalog.js +0 -2
  796. package/dist/extensions/tencent/api.d.ts +0 -3
  797. package/dist/extensions/tencent/api.js +0 -4
  798. package/dist/extensions/tencent/fengming.plugin.json +0 -105
  799. package/dist/extensions/tencent/index.d.ts +0 -12
  800. package/dist/extensions/tencent/index.js +0 -62
  801. package/dist/extensions/tencent/models.d.ts +0 -2
  802. package/dist/extensions/tencent/models.js +0 -2
  803. package/dist/extensions/tencent/onboard.d.ts +0 -6
  804. package/dist/extensions/tencent/onboard.js +0 -2
  805. package/dist/extensions/tencent/package.json +0 -15
  806. package/dist/extensions/tencent/provider-catalog.d.ts +0 -2
  807. package/dist/extensions/tencent/provider-catalog.js +0 -2
  808. package/dist/extensions/tencent/provider-discovery.d.ts +0 -5
  809. package/dist/extensions/tencent/provider-discovery.js +0 -14
  810. package/dist/extensions/tiangong/fengming.plugin.json +0 -69
  811. package/dist/extensions/tiangong/index.d.ts +0 -11
  812. package/dist/extensions/tiangong/index.js +0 -45
  813. package/dist/extensions/tiangong/models.d.ts +0 -7
  814. package/dist/extensions/tiangong/models.js +0 -2
  815. package/dist/extensions/tiangong/onboard.d.ts +0 -5
  816. package/dist/extensions/tiangong/onboard.js +0 -2
  817. package/dist/extensions/tiangong/package.json +0 -15
  818. package/dist/extensions/tiangong/provider-catalog.d.ts +0 -2
  819. package/dist/extensions/tiangong/provider-catalog.js +0 -2
  820. package/dist/extensions/tiangong/provider-discovery.d.ts +0 -2
  821. package/dist/extensions/tiangong/provider-discovery.js +0 -5
  822. package/dist/extensions/volcengine/api.d.ts +0 -12
  823. package/dist/extensions/volcengine/api.js +0 -4
  824. package/dist/extensions/volcengine/fengming.plugin.json +0 -263
  825. package/dist/extensions/volcengine/index.d.ts +0 -12
  826. package/dist/extensions/volcengine/index.js +0 -88
  827. package/dist/extensions/volcengine/models.d.ts +0 -2
  828. package/dist/extensions/volcengine/models.js +0 -2
  829. package/dist/extensions/volcengine/package.json +0 -15
  830. package/dist/extensions/volcengine/provider-catalog.d.ts +0 -2
  831. package/dist/extensions/volcengine/provider-catalog.js +0 -2
  832. package/dist/extensions/volcengine/provider-discovery.d.ts +0 -5
  833. package/dist/extensions/volcengine/provider-discovery.js +0 -23
  834. package/dist/extensions/volcengine/speech-provider.d.ts +0 -5
  835. package/dist/extensions/volcengine/speech-provider.js +0 -2
  836. package/dist/extensions/volcengine/tts.d.ts +0 -22
  837. package/dist/extensions/volcengine/tts.js +0 -2
  838. package/dist/extensions/weixin/fengming.plugin.json +0 -22
  839. package/dist/extensions/weixin/index.d.ts +0 -26
  840. package/dist/extensions/weixin/index.js +0 -862
  841. package/dist/extensions/weixin/package.json +0 -45
  842. package/dist/extensions/xiaomi/api.d.ts +0 -3
  843. package/dist/extensions/xiaomi/api.js +0 -3
  844. package/dist/extensions/xiaomi/fengming.plugin.json +0 -260
  845. package/dist/extensions/xiaomi/index.d.ts +0 -12
  846. package/dist/extensions/xiaomi/index.js +0 -284
  847. package/dist/extensions/xiaomi/onboard.d.ts +0 -2
  848. package/dist/extensions/xiaomi/onboard.js +0 -2
  849. package/dist/extensions/xiaomi/package.json +0 -15
  850. package/dist/extensions/xiaomi/provider-catalog.d.ts +0 -2
  851. package/dist/extensions/xiaomi/provider-catalog.js +0 -2
  852. package/dist/extensions/xiaomi/speech-provider.d.ts +0 -5
  853. package/dist/extensions/xiaomi/speech-provider.js +0 -2
  854. package/dist/extensions/xiaomi/stream.d.ts +0 -5
  855. package/dist/extensions/xiaomi/stream.js +0 -2
  856. package/dist/extensions/xiaomi/thinking.d.ts +0 -11
  857. package/dist/extensions/xiaomi/thinking.js +0 -2
  858. package/dist/extensions/xingchen/fengming.plugin.json +0 -69
  859. package/dist/extensions/xingchen/index.d.ts +0 -11
  860. package/dist/extensions/xingchen/index.js +0 -45
  861. package/dist/extensions/xingchen/models.d.ts +0 -7
  862. package/dist/extensions/xingchen/models.js +0 -2
  863. package/dist/extensions/xingchen/onboard.d.ts +0 -5
  864. package/dist/extensions/xingchen/onboard.js +0 -2
  865. package/dist/extensions/xingchen/package.json +0 -15
  866. package/dist/extensions/xingchen/provider-catalog.d.ts +0 -2
  867. package/dist/extensions/xingchen/provider-catalog.js +0 -2
  868. package/dist/extensions/xingchen/provider-discovery.d.ts +0 -2
  869. package/dist/extensions/xingchen/provider-discovery.js +0 -5
  870. package/dist/extensions/yi/fengming.plugin.json +0 -84
  871. package/dist/extensions/yi/index.d.ts +0 -11
  872. package/dist/extensions/yi/index.js +0 -45
  873. package/dist/extensions/yi/models.d.ts +0 -7
  874. package/dist/extensions/yi/models.js +0 -2
  875. package/dist/extensions/yi/onboard.d.ts +0 -5
  876. package/dist/extensions/yi/onboard.js +0 -2
  877. package/dist/extensions/yi/package.json +0 -15
  878. package/dist/extensions/yi/provider-catalog.d.ts +0 -2
  879. package/dist/extensions/yi/provider-catalog.js +0 -2
  880. package/dist/extensions/yi/provider-discovery.d.ts +0 -2
  881. package/dist/extensions/yi/provider-discovery.js +0 -5
  882. package/dist/extensions/zai/api.d.ts +0 -4
  883. package/dist/extensions/zai/api.js +0 -4
  884. package/dist/extensions/zai/detect.d.ts +0 -2
  885. package/dist/extensions/zai/detect.js +0 -2
  886. package/dist/extensions/zai/fengming.plugin.json +0 -377
  887. package/dist/extensions/zai/index.d.ts +0 -12
  888. package/dist/extensions/zai/index.js +0 -297
  889. package/dist/extensions/zai/media-understanding-provider.d.ts +0 -5
  890. package/dist/extensions/zai/media-understanding-provider.js +0 -2
  891. package/dist/extensions/zai/model-definitions.d.ts +0 -2
  892. package/dist/extensions/zai/model-definitions.js +0 -2
  893. package/dist/extensions/zai/onboard.d.ts +0 -2
  894. package/dist/extensions/zai/onboard.js +0 -2
  895. package/dist/extensions/zai/package.json +0 -15
  896. package/dist/extensions/zai/runtime-api.d.ts +0 -2
  897. package/dist/extensions/zai/runtime-api.js +0 -2
  898. package/dist/extensions/zhinao/fengming.plugin.json +0 -69
  899. package/dist/extensions/zhinao/index.d.ts +0 -11
  900. package/dist/extensions/zhinao/index.js +0 -45
  901. package/dist/extensions/zhinao/models.d.ts +0 -7
  902. package/dist/extensions/zhinao/models.js +0 -2
  903. package/dist/extensions/zhinao/onboard.d.ts +0 -5
  904. package/dist/extensions/zhinao/onboard.js +0 -2
  905. package/dist/extensions/zhinao/package.json +0 -15
  906. package/dist/extensions/zhinao/provider-catalog.d.ts +0 -2
  907. package/dist/extensions/zhinao/provider-catalog.js +0 -2
  908. package/dist/extensions/zhinao/provider-discovery.d.ts +0 -2
  909. package/dist/extensions/zhinao/provider-discovery.js +0 -5
  910. package/dist/fengming-runtime-0jdu_329.d.ts +0 -153
  911. package/dist/fengming-tools-gQkwsWYz.js +0 -12221
  912. package/dist/fengming.plugin-C-Kdi1_5.js +0 -130
  913. package/dist/fengming.plugin-CRPqMj85.js +0 -166
  914. package/dist/gateway-cli-BV1V43-D.js +0 -443
  915. package/dist/gateway-method-runtime-J2OPP_oH.js +0 -21
  916. package/dist/get-reply-BE8ZGJos.js +0 -5198
  917. package/dist/get-reply-from-config.runtime-C5wfxVI_.js +0 -2
  918. package/dist/heartbeat-runner-_0HlObMb.js +0 -5
  919. package/dist/heartbeat-runner.runtime-DvYz_4Z3.js +0 -3
  920. package/dist/hook-runtime-BH9moP5T.js +0 -4
  921. package/dist/hooks-icCwsmrQ.js +0 -536
  922. package/dist/host-compat-dfJvEfe7.d.ts +0 -21
  923. package/dist/http-registry-Buj7R-F_.d.ts +0 -23
  924. package/dist/image-generation-provider-hrRXkkGc.js +0 -152
  925. package/dist/inbound-reply-dispatch-5AYt56Yt.js +0 -147
  926. package/dist/inbound-reply-dispatch-B5weFW8i.js +0 -2
  927. package/dist/inbound-reply-dispatch-cJh4H31y.d.ts +0 -156
  928. package/dist/infra-runtime-3_0R8nmO.js +0 -32
  929. package/dist/init-BnfkYG_k.js +0 -59
  930. package/dist/interactive-V8NfYsTW.d.ts +0 -26
  931. package/dist/isolated-agent-CgH7dfOj.js +0 -1097
  932. package/dist/isolated-agent-dBWkiw0a.js +0 -2
  933. package/dist/kernel-Ds2aqAJF.d.ts +0 -241
  934. package/dist/kimi-web-search-provider-QJT3Ftj3.js +0 -80
  935. package/dist/kimi-web-search-provider.runtime-Dj3SS4T5.js +0 -307
  936. package/dist/kimi-web-search-provider.runtime.js +0 -1
  937. package/dist/lib-Dg4yjNFQ.js +0 -871
  938. package/dist/lifecycle-B9k7QGsS.js +0 -570
  939. package/dist/list.probe-CbVHFNwf.js +0 -2
  940. package/dist/list.probe-CxiEBmyW.js +0 -451
  941. package/dist/list.status-command-DE-edGgB.js +0 -815
  942. package/dist/llm-slug-generator-DJgq9eFd.js +0 -78
  943. package/dist/loader-5AqYM9PC.d.ts +0 -142
  944. package/dist/local-dispatch.runtime-D3F4v51B.js +0 -10
  945. package/dist/manager-BWf1ks-Z.d.ts +0 -409
  946. package/dist/mcp-http-DU7Nsg4P.js +0 -583
  947. package/dist/mcp-http-iZCW6Cet.js +0 -2
  948. package/dist/media-runtime-DZ5RpQN7.d.ts +0 -261
  949. package/dist/media-understanding-DEdEyoQB.d.ts +0 -46
  950. package/dist/media-understanding-provider-4JHrQOUE.js +0 -70
  951. package/dist/media-understanding-provider-BV7O82XV.js +0 -29
  952. package/dist/media-understanding-provider-BlPRhYkx.js +0 -69
  953. package/dist/media-understanding-provider-BuX8eQLj.js +0 -13
  954. package/dist/memory-core-host-engine-embeddings-BDu5fx8E.d.ts +0 -324
  955. package/dist/memory-core-host-engine-storage-CdCuH-E2.d.ts +0 -54
  956. package/dist/message-handler-L6QLWNVP.js +0 -1806
  957. package/dist/minimax-web-search-provider-_gxeEOy8.js +0 -58
  958. package/dist/minimax-web-search-provider.runtime-BF4mGi6U.js +0 -148
  959. package/dist/minimax-web-search-provider.runtime.js +0 -1
  960. package/dist/model-catalog-DCnRkX8f.d.ts +0 -88
  961. package/dist/model-definitions-B2gY43hI.d.ts +0 -34
  962. package/dist/model-definitions-BLOyeH5h.js +0 -73
  963. package/dist/model-definitions-CoByf5mT.js +0 -243
  964. package/dist/model-definitions-WP3OmzbS.d.ts +0 -57
  965. package/dist/model-selection-DhTE6GZD.js +0 -352
  966. package/dist/models--iAR9QkZ.js +0 -175
  967. package/dist/models-8ImVEkvh.js +0 -36
  968. package/dist/models-BIDM8htk.js +0 -48
  969. package/dist/models-BRgRfrcS.js +0 -36
  970. package/dist/models-Bib5-APc.js +0 -67
  971. package/dist/models-Bl67zOoe.js +0 -36
  972. package/dist/models-BqDDYFE3.d.ts +0 -65
  973. package/dist/models-BtRQoRIu.js +0 -36
  974. package/dist/models-BvXmOXik.js +0 -48
  975. package/dist/models-C-sJciOD.d.ts +0 -9
  976. package/dist/models-COnXPdlL.js +0 -24
  977. package/dist/models-CXTmk-Da.d.ts +0 -8
  978. package/dist/models-Cz0C_8re.js +0 -36
  979. package/dist/models-DbwEIt-m.d.ts +0 -15
  980. package/dist/models-DgXkSADi.js +0 -30
  981. package/dist/models-cli-Bv3y3JgQ.js +0 -257
  982. package/dist/monitor-BiVOsbbN.js +0 -1024
  983. package/dist/monitor-BumfRp1t.js +0 -60
  984. package/dist/monitor.account-Cd6EwtuZ.js +0 -5382
  985. package/dist/music-generation-provider-ZdDMiC-c.js +0 -308
  986. package/dist/nodes-C0f8XgD5.js +0 -1483
  987. package/dist/nodes-Dk4vOgg9.js +0 -3
  988. package/dist/nodes-pending-Cjg09MXz.js +0 -211
  989. package/dist/oauth-BIO69Qw0.d.ts +0 -25
  990. package/dist/oauth-CnO10TN2.js +0 -207
  991. package/dist/onboard-B3BYT5k7.js +0 -34
  992. package/dist/onboard-BDMNV6RE.js +0 -23
  993. package/dist/onboard-B_WNNy5F.d.ts +0 -6
  994. package/dist/onboard-BbyMaErU.js +0 -69
  995. package/dist/onboard-BuYPNE6j2.js +0 -23
  996. package/dist/onboard-C394zMnM.d.ts +0 -11
  997. package/dist/onboard-CHn4oVbY.js +0 -24
  998. package/dist/onboard-CPpVbb0O.js +0 -73
  999. package/dist/onboard-CWDx7Crt.js +0 -23
  1000. package/dist/onboard-CbzkwBzu.d.ts +0 -12
  1001. package/dist/onboard-D099qUd0.js +0 -23
  1002. package/dist/onboard-D7dbzfHc.js +0 -23
  1003. package/dist/onboard-DB-x0nHF.js +0 -30
  1004. package/dist/onboard-DFVrRnxJ.js +0 -23
  1005. package/dist/onboard-DFiqoOc2.d.ts +0 -7
  1006. package/dist/onboard-DJaMK3rr.d.ts +0 -6
  1007. package/dist/onboard-DMdK8D_h.js +0 -67
  1008. package/dist/onboard-J-KL-I6m.js +0 -48
  1009. package/dist/onboard-MIBU-Rmv.js +0 -39
  1010. package/dist/onboard-vmGylfFe.js +0 -23
  1011. package/dist/openai-compat-errors-Dcr5Y8bF.js +0 -136
  1012. package/dist/openai-http-CcqspzU6.js +0 -836
  1013. package/dist/openresponses-http-BnyYYvUF.js +0 -1175
  1014. package/dist/operations-H2Oq0KYz.js +0 -805
  1015. package/dist/outbound.types-BhRehecY.d.ts +0 -291
  1016. package/dist/plugin-enabled-CEIKWKrq.js +0 -232
  1017. package/dist/plugin-entry-CTVRRaaA.d.ts +0 -47
  1018. package/dist/plugin-registration-BTyO5Fwt.js +0 -97
  1019. package/dist/plugin-runtime-_XF2N_UQ.d.ts +0 -117
  1020. package/dist/plugin-sdk/bundled-channel-config-schema-BsOWCrJT.d.ts +0 -3169
  1021. package/dist/plugin-service-B91jVlmZ.d.ts +0 -24
  1022. package/dist/plugin-service-CtGwVz8V.js +0 -1249
  1023. package/dist/prepare.runtime-9dlboph7.js +0 -798
  1024. package/dist/preview-warnings-DJx4KJpC.js +0 -618
  1025. package/dist/program-CWC-NBBB.js +0 -131
  1026. package/dist/provider-api-key-auth-BmNcYRMl.d.ts +0 -27
  1027. package/dist/provider-auth-api-key-CCaFiqY3.js +0 -5
  1028. package/dist/provider-auth-result-D_E9dcVc.d.ts +0 -21
  1029. package/dist/provider-catalog-5KZLmrDO.js +0 -11
  1030. package/dist/provider-catalog-7P6AvDzS.js +0 -11
  1031. package/dist/provider-catalog-B2gyTjTU.js +0 -88
  1032. package/dist/provider-catalog-B3YBhe77.js +0 -17
  1033. package/dist/provider-catalog-B7XEeuUm.js +0 -11
  1034. package/dist/provider-catalog-BFGPRd9v.js +0 -17
  1035. package/dist/provider-catalog-BLvkIMSk.d.ts +0 -6
  1036. package/dist/provider-catalog-BPBL9mJf.d.ts +0 -5
  1037. package/dist/provider-catalog-BRkZ6-HD.d.ts +0 -5
  1038. package/dist/provider-catalog-Bfl_AoTZ.js +0 -142
  1039. package/dist/provider-catalog-BpiHWHu1.js +0 -11
  1040. package/dist/provider-catalog-C1qDLekT.d.ts +0 -5
  1041. package/dist/provider-catalog-CKWNCfry.js +0 -11
  1042. package/dist/provider-catalog-CUHB2pSt.d.ts +0 -7
  1043. package/dist/provider-catalog-CWqN2j6J.d.ts +0 -5
  1044. package/dist/provider-catalog-CZ8oYbx3.js +0 -11
  1045. package/dist/provider-catalog-CcQ5-4ZW.d.ts +0 -6
  1046. package/dist/provider-catalog-Cd16uZ0U.js +0 -20
  1047. package/dist/provider-catalog-CpF2D0VK.js +0 -61
  1048. package/dist/provider-catalog-CvXq36zW.d.ts +0 -5
  1049. package/dist/provider-catalog-D2pgEME3.js +0 -48
  1050. package/dist/provider-catalog-DPzcupEl.d.ts +0 -5
  1051. package/dist/provider-catalog-DaeI606G.d.ts +0 -9
  1052. package/dist/provider-catalog-DrOCtTb-.js +0 -11
  1053. package/dist/provider-catalog-DwZ1J2Al.d.ts +0 -6
  1054. package/dist/provider-catalog-Dy7IcHmS.js +0 -107
  1055. package/dist/provider-catalog-TsZS52nq.d.ts +0 -10
  1056. package/dist/provider-catalog-YqIFRCND.d.ts +0 -5
  1057. package/dist/provider-catalog-Ywb5jRwG.d.ts +0 -5
  1058. package/dist/provider-catalog-evknl1oN.js +0 -11
  1059. package/dist/provider-catalog-l0hFpFO2.d.ts +0 -17
  1060. package/dist/provider-catalog-shared-DsRBv0Tp.d.ts +0 -62
  1061. package/dist/provider-dispatcher-BMy9mBJ1.js +0 -22
  1062. package/dist/provider-model-shared-CPAfQBNs.d.ts +0 -143
  1063. package/dist/provider-models-Diu65OcG.d.ts +0 -18
  1064. package/dist/provider-models-LE7PlLYY.js +0 -22
  1065. package/dist/provider-onboard-CpvXEmvz.d.ts +0 -91
  1066. package/dist/provider-registration-DF-LkmNE.js +0 -235
  1067. package/dist/provider-registry-D9cTPW1F.d.ts +0 -8
  1068. package/dist/provider-registry-DI7gMKUP.d.ts +0 -8
  1069. package/dist/provider-registry-DZtgZDkl.d.ts +0 -29
  1070. package/dist/provider-self-hosted-setup-CoHvoyKm.d.ts +0 -74
  1071. package/dist/provider-stream-BpXJr5Ap.d.ts +0 -139
  1072. package/dist/provider-stream-family-Bj5aBD8w.js +0 -2
  1073. package/dist/provider-stream-shared-BaUkhUHj.d.ts +0 -132
  1074. package/dist/provider-usage-DFUhW2do.js +0 -651
  1075. package/dist/provider-web-search-contract-fields-CkXzSsWu.d.ts +0 -25
  1076. package/dist/pw-ai-9Q_dIq4B.js +0 -3064
  1077. package/dist/register.agent-CbfrlzXB.js +0 -152
  1078. package/dist/register.crestodian-CEg0rPfK.js +0 -24
  1079. package/dist/register.maintenance-k9N8I4Wg.js +0 -85
  1080. package/dist/register.subclis-CrXOeaS3.js +0 -3
  1081. package/dist/register.subclis-DfKlni8N.js +0 -31
  1082. package/dist/register.subclis-core-Bg4wbDsO.js +0 -278
  1083. package/dist/registry-Bh3-P2HL.d.ts +0 -8
  1084. package/dist/registry-types-BmEUS4d3.d.ts +0 -392
  1085. package/dist/repair-sequencing-E4yViXG9.js +0 -652
  1086. package/dist/reply-payload-S2mrc_Mh.d.ts +0 -200
  1087. package/dist/reply-turn-admission-BBoPjmGB.js +0 -2056
  1088. package/dist/reply.runtime-C5wfxVI_.js +0 -2
  1089. package/dist/result-fallback-classifier-CX4iLD1G.js +0 -98
  1090. package/dist/route-CifxcQZ1.js +0 -475
  1091. package/dist/routes-B3XAOeWo.js +0 -2
  1092. package/dist/routes-H185h3U-.js +0 -3701
  1093. package/dist/run-CTJFbwbB.js +0 -1162
  1094. package/dist/run-command-B7B53tYk.js +0 -23
  1095. package/dist/run-command-BFuxRDxS.js +0 -2
  1096. package/dist/run-context-C7im9ICg.js +0 -66
  1097. package/dist/run-embedded.runtime-TljBTbzh.js +0 -4
  1098. package/dist/run-execution-cli.runtime-Bt5zwx1W.js +0 -4
  1099. package/dist/run-executor.runtime-hmbWX2Ct.js +0 -330
  1100. package/dist/run-subagent-registry.runtime-B70X80nS.js +0 -2
  1101. package/dist/runtime-DoKE0o7v.js +0 -436
  1102. package/dist/runtime-api-Ca4Llbgf.js +0 -12
  1103. package/dist/runtime-api-pa8xcEmg.d.ts +0 -5
  1104. package/dist/runtime-channel-CFQ59svm.js +0 -148
  1105. package/dist/runtime-channel-DRwCWGUx.js +0 -2
  1106. package/dist/runtime-embedded-agent.runtime-DwmqKUVp.js +0 -2
  1107. package/dist/runtime-forwarders-BMThPHg_.d.ts +0 -39
  1108. package/dist/sdk-setup-tools-Cg_Tabrf.js +0 -8
  1109. package/dist/selection-COhr7g82.js +0 -18365
  1110. package/dist/selection-_G44EVqd.js +0 -3
  1111. package/dist/send-media-BNc67G7I.js +0 -2072
  1112. package/dist/server-5rR0RCpI.js +0 -24
  1113. package/dist/server-context-BhiPROPA.js +0 -955
  1114. package/dist/server-context-OShBAJZQ.js +0 -2
  1115. package/dist/server-cron-Bkzb9edh.js +0 -3173
  1116. package/dist/server-cron-DdR-ugiU.js +0 -2
  1117. package/dist/server-lwtC1vaS.js +0 -72
  1118. package/dist/server-methods-BY_ZqDFJ.js +0 -497
  1119. package/dist/server-node-events-CLvE94AS.js +0 -597
  1120. package/dist/server-plugin-bootstrap-cKOAH5GL.js +0 -71
  1121. package/dist/server-plugins-CPpUykw5.js +0 -435
  1122. package/dist/server-reload-handlers-uzt4VDZ-.js +0 -719
  1123. package/dist/server-restart-sentinel-CpvV0t4O.js +0 -700
  1124. package/dist/server-runtime-services-BhOHoerM.js +0 -147
  1125. package/dist/server-runtime-services-D3Ig68nC.js +0 -3
  1126. package/dist/server-startup-plugins-DslzKVHK.js +0 -127
  1127. package/dist/server-startup-post-attach-DPFBTQez.js +0 -793
  1128. package/dist/server-ws-runtime-D0zoWoiz.js +0 -374
  1129. package/dist/server.impl-CzqLQ3qt.js +0 -2622
  1130. package/dist/session-kill-http-D8JhwZVS.js +0 -121
  1131. package/dist/session-reset-service-uoi7E4Xp.js +0 -651
  1132. package/dist/session-status.runtime-CZK5IU8w.js +0 -2
  1133. package/dist/session-subagent-reactivation.runtime-BSO00-FY.js +0 -2
  1134. package/dist/session-tab-registry-DM9U7e3o.js +0 -551
  1135. package/dist/sessions-B-SkIoaa.js +0 -1917
  1136. package/dist/sessions-history-http-DCiOG4FK.js +0 -432
  1137. package/dist/sessions-patch-DlAAvQvB.js +0 -401
  1138. package/dist/sessions-resolve-DfMXookg.js +0 -180
  1139. package/dist/sessions.runtime-0V2YxKxB.js +0 -2
  1140. package/dist/snapshot-urls-Ble1-NEW.js +0 -317
  1141. package/dist/speech-core-Bk60ZS_y.d.ts +0 -49
  1142. package/dist/speech-provider-DQO9eZd0.js +0 -233
  1143. package/dist/speech-provider-DnBCla4V.js +0 -171
  1144. package/dist/speech-provider-DyYHFxT5.js +0 -227
  1145. package/dist/standalone-9EWfcxeO.js +0 -42
  1146. package/dist/startup-context-nti4X0_w.js +0 -314
  1147. package/dist/status-subagents.runtime-CPZb1EF1.js +0 -32
  1148. package/dist/status-text-C1Hf37lF.js +0 -301
  1149. package/dist/stream-9VBt1MDs.js +0 -26
  1150. package/dist/stream-B_3P7v7P.js +0 -86
  1151. package/dist/stream-CXsue2-v.d.ts +0 -9
  1152. package/dist/stream-oNBFxfKt.d.ts +0 -5
  1153. package/dist/subagent-announce-CPjQQLy8.js +0 -353
  1154. package/dist/subagent-announce-delivery-B6iBOicL.js +0 -1369
  1155. package/dist/subagent-control-DP72sk-l.js +0 -492
  1156. package/dist/subagent-hooks-B1oUIYH3.js +0 -2
  1157. package/dist/subagent-hooks-BkGj4_xI.js +0 -230
  1158. package/dist/subagent-hooks-api-D2mulK3S.js +0 -23
  1159. package/dist/subagent-registry-CEKAUB5h.js +0 -3
  1160. package/dist/subagent-registry-OUVucPAn.js +0 -2627
  1161. package/dist/subagent-session-cleanup-Bx8d3kw0.js +0 -390
  1162. package/dist/system-CelaP2zI.js +0 -111
  1163. package/dist/talk-DGOI3Lu3.js +0 -2454
  1164. package/dist/target-id-BXRG7x9x.js +0 -107
  1165. package/dist/thinking-B8V29FhB.js +0 -35
  1166. package/dist/thread-bindings-DpVdEPZ0.js +0 -228
  1167. package/dist/tool-DHzDpxE4.js +0 -143
  1168. package/dist/tool-dispatch-ClP3Rc7g.js +0 -155
  1169. package/dist/tool-resolution-CZcLod1d.js +0 -153
  1170. package/dist/tool-split-BhiQ8676.d.ts +0 -19
  1171. package/dist/tools-ZvSvbsCW.d.ts +0 -38
  1172. package/dist/tools-effective-C2mHZT-A.js +0 -442
  1173. package/dist/tools-effective-inventory-ctnM7hc6.js +0 -379
  1174. package/dist/tools-invoke-Ci6Rux2s.js +0 -51
  1175. package/dist/tools-invoke-http-CJflXcJk.js +0 -68
  1176. package/dist/tools-invoke-shared-BLu_mJEX.js +0 -200
  1177. package/dist/tts-B2rPJPij.js +0 -83
  1178. package/dist/tts-Gp9FI3_n.js +0 -163
  1179. package/dist/tts-runtime-DNi1HXPF.d.ts +0 -230
  1180. package/dist/tui-BUhfQ9vD.js +0 -3
  1181. package/dist/tui-BhH5mvLf.js +0 -2
  1182. package/dist/tui-backend-C_4ajTHI.js +0 -257
  1183. package/dist/tui-cli-BhWJ-QoB.js +0 -40
  1184. package/dist/tui-ink-run-BTWbUQGb.js +0 -7414
  1185. package/dist/tui-ink-run-DfTdivkh.js +0 -2
  1186. package/dist/types-B4fW3r5y.d.ts +0 -111
  1187. package/dist/types-DI62NfFe.d.ts +0 -7034
  1188. package/dist/types-sAih_uQb.d.ts +0 -393
  1189. package/dist/types.public-B3MKhuo2.d.ts +0 -70
  1190. package/dist/video-generation-B9c6a5cw.js +0 -207
  1191. package/dist/video-generation-BgJp7UIA.d.ts +0 -224
  1192. package/dist/video-generation-provider-BjiVjf40.js +0 -325
  1193. package/dist/video-generation-provider-CsnQJg_h.js +0 -297
  1194. package/dist/video-generation-provider-DtU-ZPqP.js +0 -64
  1195. package/dist/video-generation-provider-wZ0bzv0e.js +0 -77
  1196. package/dist/webhook-targets-Cy8e7y3g.d.ts +0 -99
  1197. package/skills/canvas/SKILL.md +0 -78
  1198. package/skills/clawhub/SKILL.md +0 -77
  1199. package/skills/coding-agent/SKILL.md +0 -143
  1200. package/skills/diagram-maker/SKILL.md +0 -53
  1201. package/skills/diagram-maker/references/excalidraw-patterns.md +0 -85
  1202. package/skills/diagram-maker/references/svg-template.md +0 -112
  1203. package/skills/gemini/SKILL.md +0 -47
  1204. package/skills/gh-issues/SKILL.md +0 -213
  1205. package/skills/gifgrep/SKILL.md +0 -85
  1206. package/skills/github/SKILL.md +0 -84
  1207. package/skills/healthcheck/SKILL.md +0 -105
  1208. package/skills/mcporter/SKILL.md +0 -61
  1209. package/skills/meme-maker/SKILL.md +0 -42
  1210. package/skills/meme-maker/references/templates.json +0 -358
  1211. package/skills/meme-maker/scripts/meme.mjs +0 -398
  1212. package/skills/model-usage/SKILL.md +0 -71
  1213. package/skills/model-usage/references/codexbar-cli.md +0 -33
  1214. package/skills/model-usage/scripts/model_usage.py +0 -319
  1215. package/skills/model-usage/scripts/test_model_usage.py +0 -40
  1216. package/skills/nano-pdf/SKILL.md +0 -38
  1217. package/skills/node-connect/SKILL.md +0 -143
  1218. package/skills/node-inspect-debugger/SKILL.md +0 -85
  1219. package/skills/openai-whisper/SKILL.md +0 -38
  1220. package/skills/openai-whisper-api/SKILL.md +0 -71
  1221. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -154
  1222. package/skills/oracle/SKILL.md +0 -126
  1223. package/skills/pyproject.toml +0 -10
  1224. package/skills/python-debugpy/SKILL.md +0 -73
  1225. package/skills/sag/SKILL.md +0 -87
  1226. package/skills/session-logs/SKILL.md +0 -151
  1227. package/skills/sherpa-onnx-tts/SKILL.md +0 -109
  1228. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
  1229. package/skills/skill-creator/SKILL.md +0 -78
  1230. package/skills/skill-creator/license.txt +0 -202
  1231. package/skills/skill-creator/scripts/init_skill.py +0 -378
  1232. package/skills/skill-creator/scripts/package_skill.py +0 -139
  1233. package/skills/skill-creator/scripts/quick_validate.py +0 -169
  1234. package/skills/skill-creator/scripts/test_package_skill.py +0 -161
  1235. package/skills/skill-creator/scripts/test_quick_validate.py +0 -116
  1236. package/skills/spike/SKILL.md +0 -51
  1237. package/skills/summarize/SKILL.md +0 -87
  1238. package/skills/taskflow/SKILL.md +0 -149
  1239. package/skills/taskflow/examples/inbox-triage.lobster +0 -33
  1240. package/skills/taskflow/examples/pr-intake.lobster +0 -32
  1241. package/skills/taskflow-inbox-triage/SKILL.md +0 -119
  1242. package/skills/video-frames/SKILL.md +0 -46
  1243. package/skills/video-frames/scripts/frame.sh +0 -81
  1244. package/skills/voice-call/SKILL.md +0 -45
  1245. package/skills/weather/SKILL.md +0 -64
  1246. /package/dist/{acp-runtime-backend-DbchQ02o.js → acp-runtime-backend-DZ1Lnt7f.js} +0 -0
  1247. /package/dist/{delegate-k1aptKei.js → delegate-CwhxUdeb.js} +0 -0
  1248. /package/dist/{dispatch-acp-CD4YxPpf.js → dispatch-acp-BP4I5ZQf.js} +0 -0
  1249. /package/dist/{exec-approvals-ByWUCFQM.js → exec-approvals-ByWUCFQM2.js} +0 -0
  1250. /package/dist/{heartbeat-runner-CM0UZxa_.js → heartbeat-runner-CL3alQ8-.js} +0 -0
  1251. /package/dist/{index-B0VJdRJQ.d.ts → index-B0VJdRJQ2.d.ts} +0 -0
  1252. /package/dist/{library-CQ71yATP.js → library-CiTr_aqC.js} +0 -0
  1253. /package/dist/{run-session-state-DbDeH-q6.js → run-session-state-BOMUtBKZ.js} +0 -0
  1254. /package/dist/{session-subagent-reactivation-Bj91A2ms.js → session-subagent-reactivation-CH0C2I6Y.js} +0 -0
  1255. /package/dist/{types-C4HgagiY2.d.ts → types-C4HgagiY.d.ts} +0 -0
@@ -1,3173 +0,0 @@
1
- import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString, s as normalizeOptionalLowercaseString } from "./string-coerce-DKw2K5wM.js";
2
- import { d as finiteSecondsToTimerSafeMilliseconds } from "./number-coercion-D1aDmIZp.js";
3
- import { i as formatErrorMessage } from "./errors-C_Wa6a5T.js";
4
- import { n as defaultRuntime } from "./runtime-BkTkFkXs.js";
5
- import { r as getChildLogger } from "./logger-BxgwHQpm.js";
6
- import "./agent-scope-EEbMCF2I.js";
7
- import { a as isSubagentSessionKey, c as parseAgentSessionKey, r as isCronRunSessionKey } from "./session-key-utils-CdfsDYvz.js";
8
- import { d as resolveAgentIdFromSessionKey, f as resolveEventSessionKey, l as normalizeAgentId, v as toAgentStoreSessionKey } from "./session-key-CJf5_zWs.js";
9
- import { c as resolveDefaultAgentId } from "./agent-scope-config-BHdZonI2.js";
10
- import { i as getRuntimeConfig } from "./io-T1CV3Z1L.js";
11
- import { t as parseDurationMs } from "./parse-duration-CI8nUnt1.js";
12
- import { t as SsrFBlockedError } from "./ssrf-DXorK84V.js";
13
- import { n as fetchWithSsrFGuard } from "./fetch-guard-BAZf5GdF.js";
14
- import { t as getGlobalHookRunner } from "./hook-runner-global-De3loPgD.js";
15
- import { n as resolveAgentMainSessionKey, t as canonicalizeMainSessionAlias } from "./main-session-BxJmPEXx.js";
16
- import { n as deliveryContextFromSession } from "./delivery-context.shared-CHlZnq4E.js";
17
- import { u as resolveStorePath } from "./paths-C79m3Aob.js";
18
- import { i as readSessionEntry, t as loadSessionStore } from "./store-load-CVdafI-Y.js";
19
- import { d as updateSessionStore, n as archiveRemovedSessionTranscripts } from "./store-DH20opqS.js";
20
- import "./sessions-CtMqsEs2.js";
21
- import "./logging-DI5PswWl.js";
22
- import { a as isRetryableHeartbeatBusySkipReason, o as requestHeartbeat } from "./heartbeat-wake-D8JKi1wr.js";
23
- import { a as enqueueSystemEvent } from "./system-events-DviB_CZO.js";
24
- import { a as failTaskRunByRunId, i as createRunningTaskRun, n as completeTaskRunByRunId } from "./detached-task-runtime-C6Jx9d2V.js";
25
- import { t as abortAndDrainEmbeddedAgentRun } from "./runs-B0iD89hy.js";
26
- import "./session-utils.fs-D-Ly08WB.js";
27
- import { i as cleanupArchivedSessionTranscripts } from "./session-transcript-files.fs-CusxaEql.js";
28
- import { i as enqueueCommandInLane } from "./command-queue-BdFPuMNt.js";
29
- import { i as markCronJobActive, t as clearCronJobActive } from "./active-jobs-BttwAMLk.js";
30
- import { s as resolveFailoverReasonFromError } from "./failover-error-77jtO3vs.js";
31
- import { a as summarizeCronRunDiagnostics, i as normalizeCronRunDiagnostics, n as createCronRunDiagnosticsFromError } from "./run-diagnostics-FDplqf4s.js";
32
- import { a as resolveCronRunLogPath, o as resolveCronRunLogPruneOptions, t as appendCronRunLog } from "./run-log-D-S--js7.js";
33
- import { c as saveCronStore, i as loadCronStoreWithConfigJobs, l as cronSchedulingInputsEqual, o as resolveCronStorePath, s as saveCronQuarantineFile } from "./store-DvIbNKvA.js";
34
- import { r as resolveMainScopedEventSessionKey } from "./event-session-routing-CicaO8ED.js";
35
- import { a as resolveCronDeliverySessionKey, o as resolveCronNotificationSessionKey, r as isInvalidCronSessionTargetIdError, s as resolveCronSessionTargetSessionKey, t as normalizeHttpWebhookUrl } from "./webhook-url-CVwhda4S.js";
36
- import { n as normalizeOptionalAgentId } from "./normalize-CMNVNy-n.js";
37
- import { n as normalizeCronJobInput } from "./normalize-CAKl3zKF.js";
38
- import { t as buildOutboundSessionContext } from "./session-context-DpJcitx8.js";
39
- import { t as sendDurableMessageBatch } from "./send-iGmxECvf.js";
40
- import "./runtime-Cdhc55Fq.js";
41
- import "./embedded-agent-CNp_y7jW.js";
42
- import { n as resolveAgentOutboundIdentity } from "./identity-BNCxmjzR.js";
43
- import { t as createOutboundSendDeps } from "./outbound-send-deps-B37JnKsh.js";
44
- import { t as cleanupBrowserSessionsForLifecycleEnd } from "./browser-lifecycle-cleanup-B9xL-d0w.js";
45
- import { t as getInvalidPersistedCronJobReason } from "./persisted-shape-BgpDdVwJ.js";
46
- import { t as computeNextRunAtMs } from "./schedule-DWmXvYor.js";
47
- import { t as runCronIsolatedAgentTurn } from "./isolated-agent-CgH7dfOj.js";
48
- import { n as resolveCronDeliveryPlan, r as resolveFailureDestination } from "./delivery-plan-D8qQsGCM.js";
49
- import { t as resolveCronAgentSessionKey } from "./session-key-D7FzZY3Y.js";
50
- import { _ as resolveJobPayloadTextForMain, a as computeJobPreviousRunAtMs, c as findJobOrThrow, d as isJobEnabled, f as nextWakeAtMs, g as resolveJobErrorBackoffUntilMs, h as recordScheduleComputeError, i as computeJobNextRunAtMs, l as hasScheduledNextRunAtMs, m as recomputeNextRunsForMaintenance, n as applyJobPatch, o as createJob, p as recomputeNextRuns, r as assertSupportedJobSpec, s as errorBackoffMs, t as DEFAULT_ERROR_BACKOFF_SCHEDULE_MS, u as isJobDue, v as resolveDeliveryTarget } from "./jobs-oDS0ZAXT.js";
51
- import { t as createCronExecutionId } from "./run-id-BEdij8BZ.js";
52
- import { n as runHeartbeatOnce } from "./heartbeat-runner-CM0UZxa_.js";
53
- import fs from "node:fs";
54
- //#region src/cron/service/locked.ts
55
- const storeLocks = /* @__PURE__ */ new Map();
56
- const resolveChain = (promise) => promise.then(() => void 0, () => void 0);
57
- async function locked(state, fn) {
58
- const storePath = state.deps.storePath;
59
- const storeOp = storeLocks.get(storePath) ?? Promise.resolve();
60
- const next = Promise.all([resolveChain(state.op), resolveChain(storeOp)]).then(fn);
61
- const keepAlive = resolveChain(next);
62
- state.op = keepAlive;
63
- storeLocks.set(storePath, keepAlive);
64
- return await next;
65
- }
66
- //#endregion
67
- //#region src/cron/normalize-job-identity.ts
68
- function normalizeCronJobIdentityFields(raw) {
69
- const rawId = normalizeOptionalString(raw.id) ?? "";
70
- const legacyJobId = normalizeOptionalString(raw.jobId) ?? "";
71
- const hadJobIdKey = "jobId" in raw;
72
- const normalizedId = rawId || legacyJobId;
73
- const idChanged = Boolean(normalizedId && raw.id !== normalizedId);
74
- if (idChanged) raw.id = normalizedId;
75
- if (hadJobIdKey) delete raw.jobId;
76
- return {
77
- mutated: idChanged || hadJobIdKey,
78
- legacyJobIdIssue: hadJobIdKey
79
- };
80
- }
81
- //#endregion
82
- //#region src/cron/service/store.ts
83
- function invalidateStaleNextRunOnScheduleChange(params) {
84
- const previousJob = params.previousJobsById.get(params.hydrated.id);
85
- if (!previousJob || cronSchedulingInputsEqual(previousJob, params.hydrated)) return;
86
- params.hydrated.state ??= {};
87
- params.hydrated.state.nextRunAtMs = void 0;
88
- }
89
- function warnInvalidPersistedCronJob(params) {
90
- const jobId = typeof params.raw.id === "string" ? params.raw.id : void 0;
91
- const dedupeKey = jobId ?? `index:${params.index}`;
92
- if (params.state.warnedInvalidPersistedJobKeys.has(dedupeKey)) return;
93
- params.state.warnedInvalidPersistedJobKeys.add(dedupeKey);
94
- params.state.deps.log.warn({
95
- storePath: params.state.deps.storePath,
96
- jobId,
97
- jobIndex: params.index,
98
- reason: params.reason
99
- }, "cron: quarantined invalid persisted job and skipped it from runtime");
100
- }
101
- async function getFileMtimeMs(path) {
102
- try {
103
- return (await fs.promises.stat(path)).mtimeMs;
104
- } catch {
105
- return null;
106
- }
107
- }
108
- async function flushPendingQuarantine(state, nowMs) {
109
- if (state.pendingQuarantineConfigJobs.length === 0) return null;
110
- try {
111
- const quarantinePath = await saveCronQuarantineFile({
112
- storePath: state.deps.storePath,
113
- entries: state.pendingQuarantineConfigJobs,
114
- nowMs
115
- });
116
- state.pendingQuarantineConfigJobs = [];
117
- state.lastQuarantineFailureWarnKey = null;
118
- return quarantinePath;
119
- } catch (error) {
120
- const errorMessage = error instanceof Error ? error.message : String(error);
121
- const warnKey = `${state.deps.storePath}\0${errorMessage}`;
122
- if (state.lastQuarantineFailureWarnKey !== warnKey) {
123
- state.lastQuarantineFailureWarnKey = warnKey;
124
- state.deps.log.warn({
125
- storePath: state.deps.storePath,
126
- error: errorMessage
127
- }, "cron: failed to quarantine malformed persisted jobs; skipping active store sanitization");
128
- }
129
- return null;
130
- }
131
- }
132
- async function ensureLoaded(state, opts) {
133
- if (state.store && !opts?.forceReload) return;
134
- const previousJobsById = /* @__PURE__ */ new Map();
135
- for (const job of state.store?.jobs ?? []) previousJobsById.set(job.id, job);
136
- const fileMtimeMs = await getFileMtimeMs(state.deps.storePath);
137
- const loaded = await loadCronStoreWithConfigJobs(state.deps.storePath);
138
- const loadedJobs = loaded.store.jobs ?? [];
139
- const jobs = [];
140
- const quarantinedConfigJobs = [...loaded.invalidConfigRows];
141
- for (const [index, job] of loadedJobs.entries()) {
142
- const raw = job;
143
- const rawConfigJob = loaded.configJobs[index] ?? structuredClone(raw);
144
- const sourceIndex = loaded.configJobIndexes[index] ?? index;
145
- const runtimeEntry = loaded.configJobRuntimeEntries[index];
146
- const { legacyJobIdIssue } = normalizeCronJobIdentityFields(raw);
147
- let normalized;
148
- try {
149
- normalized = normalizeCronJobInput(raw);
150
- } catch (error) {
151
- if (!isInvalidCronSessionTargetIdError(error)) throw error;
152
- normalized = null;
153
- state.deps.log.warn({
154
- storePath: state.deps.storePath,
155
- jobId: typeof raw.id === "string" ? raw.id : void 0
156
- }, "cron: job has invalid persisted sessionTarget; run fengming doctor --fix to repair");
157
- }
158
- const hydrated = normalized && typeof normalized === "object" ? normalized : job;
159
- const invalidReason = getInvalidPersistedCronJobReason(hydrated);
160
- if (invalidReason) {
161
- const quarantineEntry = {
162
- sourceIndex,
163
- reason: invalidReason,
164
- job: rawConfigJob
165
- };
166
- const runtimeState = runtimeEntry?.state ?? raw.state;
167
- if (runtimeState && typeof runtimeState === "object" && !Array.isArray(runtimeState)) quarantineEntry.state = structuredClone(runtimeState);
168
- const updatedAtMs = runtimeEntry?.updatedAtMs ?? raw.updatedAtMs;
169
- if (typeof updatedAtMs === "number" && Number.isFinite(updatedAtMs)) quarantineEntry.updatedAtMs = updatedAtMs;
170
- if (typeof runtimeEntry?.scheduleIdentity === "string") quarantineEntry.scheduleIdentity = runtimeEntry.scheduleIdentity;
171
- quarantinedConfigJobs.push(quarantineEntry);
172
- warnInvalidPersistedCronJob({
173
- state,
174
- raw,
175
- index: sourceIndex,
176
- reason: invalidReason
177
- });
178
- continue;
179
- }
180
- jobs.push(hydrated);
181
- if (legacyJobIdIssue) {
182
- const resolvedId = typeof hydrated.id === "string" ? hydrated.id : void 0;
183
- state.deps.log.warn({
184
- storePath: state.deps.storePath,
185
- jobId: resolvedId
186
- }, "cron: job used legacy jobId field; normalized id in memory (run fengming doctor --fix to persist canonical shape)");
187
- }
188
- if (typeof hydrated.enabled !== "boolean") hydrated.enabled = true;
189
- invalidateStaleNextRunOnScheduleChange({
190
- previousJobsById,
191
- hydrated
192
- });
193
- if (typeof hydrated.sessionTarget !== "string") {
194
- const payload = hydrated.payload;
195
- const payloadKind = payload && typeof payload === "object" && !Array.isArray(payload) && Object.hasOwn(payload, "kind") ? payload.kind : void 0;
196
- let defaulted;
197
- if (payloadKind === "systemEvent") defaulted = "main";
198
- else if (payloadKind === "agentTurn") defaulted = "isolated";
199
- if (defaulted) {
200
- hydrated.sessionTarget = defaulted;
201
- const jobId = typeof hydrated.id === "string" ? hydrated.id : void 0;
202
- const dedupeKey = jobId ?? "<unknown>";
203
- if (!state.warnedMissingSessionTargetJobIds.has(dedupeKey)) {
204
- state.warnedMissingSessionTargetJobIds.add(dedupeKey);
205
- state.deps.log.warn({
206
- storePath: state.deps.storePath,
207
- jobId,
208
- defaulted
209
- }, "cron: job missing sessionTarget; defaulted in memory (edit jobs.json to persist canonical shape)");
210
- }
211
- }
212
- }
213
- }
214
- state.store = {
215
- version: 1,
216
- jobs
217
- };
218
- state.storeLoadedAtMs = state.deps.nowMs();
219
- state.storeFileMtimeMs = fileMtimeMs;
220
- if (quarantinedConfigJobs.length > 0) {
221
- state.pendingQuarantineConfigJobs = quarantinedConfigJobs;
222
- const quarantinePath = await flushPendingQuarantine(state, state.storeLoadedAtMs);
223
- if (quarantinePath) try {
224
- await saveCronStore(state.deps.storePath, state.store);
225
- state.storeFileMtimeMs = await getFileMtimeMs(state.deps.storePath);
226
- state.deps.log.warn({
227
- storePath: state.deps.storePath,
228
- quarantinePath,
229
- quarantinedJobs: quarantinedConfigJobs.length
230
- }, "cron: sanitized active jobs.json after quarantining malformed persisted jobs");
231
- } catch (error) {
232
- state.deps.log.warn({
233
- storePath: state.deps.storePath,
234
- error: error instanceof Error ? error.message : String(error)
235
- }, "cron: failed to sanitize malformed persisted jobs after quarantine; continuing with quarantined in-memory view");
236
- }
237
- }
238
- if (!opts?.skipRecompute) recomputeNextRuns(state);
239
- }
240
- function warnIfDisabled(state, action) {
241
- if (state.deps.cronEnabled) return;
242
- if (state.warnedDisabled) return;
243
- state.warnedDisabled = true;
244
- state.deps.log.warn({
245
- enabled: false,
246
- action,
247
- storePath: state.deps.storePath
248
- }, "cron: scheduler disabled; jobs will not run automatically");
249
- }
250
- async function persist(state, opts) {
251
- if (!state.store) return;
252
- let flushedPendingQuarantine = false;
253
- if (state.pendingQuarantineConfigJobs.length > 0) {
254
- if (!await flushPendingQuarantine(state, state.deps.nowMs())) return;
255
- flushedPendingQuarantine = true;
256
- }
257
- const saveOpts = flushedPendingQuarantine ? { skipBackup: opts?.skipBackup } : opts;
258
- await saveCronStore(state.deps.storePath, state.store, saveOpts);
259
- state.storeFileMtimeMs = await getFileMtimeMs(state.deps.storePath);
260
- }
261
- //#endregion
262
- //#region src/cron/service/task-ledger.ts
263
- const CRON_TASK_RUNNING_PROGRESS_SUMMARY = "Running cron job.";
264
- //#endregion
265
- //#region src/agents/embedded-agent-runner/execution-phase.ts
266
- const EMBEDDED_AGENT_EXECUTION_PHASE_LABELS = {
267
- runner_entered: "runner-entered",
268
- workspace: "workspace",
269
- runtime_plugins: "runtime-plugins",
270
- before_agent_reply: "before-agent-reply",
271
- model_resolution: "model-resolution",
272
- auth: "auth",
273
- context_engine: "context-engine",
274
- attempt_dispatch: "attempt-dispatch",
275
- context_assembled: "context-assembled",
276
- turn_accepted: "turn-accepted",
277
- process_spawned: "process-spawned",
278
- tool_execution_started: "tool-execution-started",
279
- assistant_output_started: "assistant-output-started",
280
- model_call_started: "model-call-started"
281
- };
282
- function formatEmbeddedAgentExecutionPhase(phase) {
283
- return phase ? EMBEDDED_AGENT_EXECUTION_PHASE_LABELS[phase] : void 0;
284
- }
285
- //#endregion
286
- //#region src/cron/retry-hint.ts
287
- const TRANSIENT_PATTERNS = {
288
- rate_limit: /(rate[_ ]limit|too many requests|429|resource has been exhausted|cloudflare|tokens per day)/i,
289
- overloaded: /\b529\b|\boverloaded(?:_error)?\b|high demand|temporar(?:ily|y) overloaded|capacity exceeded/i,
290
- network: /(network|fetch failed|socket|econnreset|econnrefused|eai_again|enetdown|ehostunreach|ehostdown|enetreset|enetunreach|epipe)/i,
291
- timeout: /(timeout|etimedout)/i,
292
- server_error: /\b5\d{2}\b/
293
- };
294
- function resolveCronExecutionRetryHint(error, retryOn, classifiedReason) {
295
- if (!error || typeof error !== "string") return { retryable: false };
296
- const keys = retryOn?.length ? retryOn : Object.keys(TRANSIENT_PATTERNS);
297
- const classified = classifiedReason ?? void 0;
298
- if (classified && keys.includes(classified)) return {
299
- retryable: true,
300
- category: classified
301
- };
302
- for (const key of keys) if (TRANSIENT_PATTERNS[key]?.test(error)) return {
303
- retryable: true,
304
- category: key
305
- };
306
- return { retryable: false };
307
- }
308
- //#endregion
309
- //#region src/cron/session-reaper.ts
310
- /**
311
- * Cron session reaper — prunes completed isolated cron run sessions
312
- * from the session store after a configurable retention period.
313
- *
314
- * Pattern: sessions keyed as `...:cron:<jobId>:run:<uuid>` are ephemeral
315
- * run records. The base session (`...:cron:<jobId>`) is kept as-is.
316
- */
317
- const DEFAULT_RETENTION_MS = 24 * 36e5;
318
- /** Minimum interval between reaper sweeps (avoid running every timer tick). */
319
- const MIN_SWEEP_INTERVAL_MS = 5 * 6e4;
320
- const lastSweepAtMsByStore = /* @__PURE__ */ new Map();
321
- function resolveRetentionMs(cronConfig) {
322
- if (cronConfig?.sessionRetention === false) return null;
323
- const raw = cronConfig?.sessionRetention;
324
- if (typeof raw === "string" && raw.trim()) try {
325
- return parseDurationMs(raw.trim(), { defaultUnit: "h" });
326
- } catch {
327
- return DEFAULT_RETENTION_MS;
328
- }
329
- return DEFAULT_RETENTION_MS;
330
- }
331
- /**
332
- * Sweep the session store and prune expired cron run sessions.
333
- * Designed to be called from the cron timer tick — self-throttles via
334
- * MIN_SWEEP_INTERVAL_MS to avoid excessive I/O.
335
- *
336
- * Lock ordering: this function acquires the session-store file lock via
337
- * `updateSessionStore`. It must be called OUTSIDE of the cron service's
338
- * own `locked()` section to avoid lock-order inversions. The cron timer
339
- * calls this after all `locked()` sections have been released.
340
- */
341
- async function sweepCronRunSessions(params) {
342
- const now = params.nowMs ?? Date.now();
343
- const storePath = params.sessionStorePath;
344
- const lastSweepAtMs = lastSweepAtMsByStore.get(storePath) ?? 0;
345
- if (!params.force && now - lastSweepAtMs < MIN_SWEEP_INTERVAL_MS) return {
346
- swept: false,
347
- pruned: 0
348
- };
349
- const retentionMs = resolveRetentionMs(params.cronConfig);
350
- if (retentionMs === null) {
351
- lastSweepAtMsByStore.set(storePath, now);
352
- return {
353
- swept: false,
354
- pruned: 0
355
- };
356
- }
357
- let pruned = 0;
358
- const prunedSessions = /* @__PURE__ */ new Map();
359
- try {
360
- await updateSessionStore(storePath, (store) => {
361
- const cutoff = now - retentionMs;
362
- for (const key of Object.keys(store)) {
363
- if (!isCronRunSessionKey(key)) continue;
364
- const entry = store[key];
365
- if (!entry) continue;
366
- if ((entry.updatedAt ?? 0) < cutoff) {
367
- if (!prunedSessions.has(entry.sessionId) || entry.sessionFile) prunedSessions.set(entry.sessionId, entry.sessionFile);
368
- delete store[key];
369
- pruned++;
370
- }
371
- }
372
- });
373
- } catch (err) {
374
- params.log.warn({ err: String(err) }, "cron-reaper: failed to sweep session store");
375
- return {
376
- swept: false,
377
- pruned: 0
378
- };
379
- }
380
- lastSweepAtMsByStore.set(storePath, now);
381
- if (prunedSessions.size > 0) try {
382
- const store = loadSessionStore(storePath, { skipCache: true });
383
- const archivedDirs = await archiveRemovedSessionTranscripts({
384
- removedSessionFiles: prunedSessions,
385
- referencedSessionIds: new Set(Object.values(store).map((entry) => entry?.sessionId).filter((id) => Boolean(id))),
386
- storePath,
387
- reason: "deleted",
388
- restrictToStoreDir: true
389
- });
390
- if (archivedDirs.size > 0) await cleanupArchivedSessionTranscripts({
391
- directories: [...archivedDirs],
392
- olderThanMs: retentionMs,
393
- reason: "deleted",
394
- nowMs: now
395
- });
396
- } catch (err) {
397
- params.log.warn({ err: String(err) }, "cron-reaper: transcript cleanup failed");
398
- }
399
- if (pruned > 0) params.log.info({
400
- pruned,
401
- retentionMs
402
- }, `cron-reaper: pruned ${pruned} expired cron run session(s)`);
403
- return {
404
- swept: true,
405
- pruned
406
- };
407
- }
408
- //#endregion
409
- //#region src/cron/service/timeout-policy.ts
410
- /**
411
- * Maximum wall-clock time for a single job execution. Acts as a safety net
412
- * on top of per-provider/per-agent timeouts to prevent one stuck job from
413
- * wedging the entire cron lane.
414
- */
415
- const DEFAULT_JOB_TIMEOUT_MS = 10 * 6e4;
416
- /**
417
- * Agent turns can legitimately run much longer than generic cron jobs.
418
- * Use a larger safety ceiling when no explicit timeout is set.
419
- */
420
- const AGENT_TURN_SAFETY_TIMEOUT_MS = 60 * 6e4;
421
- function resolveCronJobTimeoutMs(job) {
422
- const configuredTimeoutMs = job.payload.kind === "agentTurn" && typeof job.payload.timeoutSeconds === "number" ? finiteSecondsToTimerSafeMilliseconds(job.payload.timeoutSeconds) ?? 0 : void 0;
423
- if (configuredTimeoutMs === void 0) return job.payload.kind === "agentTurn" ? AGENT_TURN_SAFETY_TIMEOUT_MS : DEFAULT_JOB_TIMEOUT_MS;
424
- return configuredTimeoutMs <= 0 ? void 0 : configuredTimeoutMs;
425
- }
426
- //#endregion
427
- //#region src/cron/service/timer.ts
428
- const MAX_TIMER_DELAY_MS = 6e4;
429
- const CRON_TIMEOUT_CLEANUP_GUARD_MS = 2e4;
430
- const CRON_AGENT_SETUP_WATCHDOG_MS = 6e4;
431
- const CRON_AGENT_PRE_EXECUTION_WATCHDOG_MS = 6e4;
432
- const CRON_AGENT_PRE_EXECUTION_MIN_WATCHDOG_MS = 1e3;
433
- /**
434
- * Minimum gap between consecutive fires of the same cron job. This is a
435
- * safety net that prevents spin-loops when `computeJobNextRunAtMs` returns
436
- * a value within the same second as the just-completed run. The guard
437
- * is intentionally generous (2 s) so it never masks a legitimate schedule
438
- * but always breaks an infinite re-trigger cycle. (See #17821)
439
- */
440
- const MIN_REFIRE_GAP_MS = 2e3;
441
- const DEFAULT_MISSED_JOB_STAGGER_MS = 5e3;
442
- const DEFAULT_MAX_MISSED_JOBS_PER_RESTART = 5;
443
- const DEFAULT_STARTUP_DEFERRED_MISSED_AGENT_JOB_DELAY_MS = 2 * 6e4;
444
- const DEFAULT_FAILURE_ALERT_AFTER = 2;
445
- const DEFAULT_FAILURE_ALERT_COOLDOWN_MS = 60 * 6e4;
446
- const CRON_AGENT_PHASE_WATCHDOG_STAGE = {
447
- runner_entered: "pre_execution",
448
- workspace: "pre_execution",
449
- runtime_plugins: "pre_execution",
450
- before_agent_reply: "execution",
451
- model_resolution: "pre_execution",
452
- auth: "pre_execution",
453
- context_engine: "pre_execution",
454
- attempt_dispatch: "execution",
455
- context_assembled: "execution",
456
- turn_accepted: "execution",
457
- process_spawned: "execution",
458
- tool_execution_started: "execution",
459
- assistant_output_started: "execution",
460
- model_call_started: "execution"
461
- };
462
- async function executeJobCoreWithTimeout(state, job) {
463
- const jobTimeoutMs = resolveCronJobTimeoutMs(job);
464
- if (typeof jobTimeoutMs !== "number") return await executeJobCore(state, job);
465
- const runAbortController = new AbortController();
466
- let timeoutReason;
467
- const timeoutMarker = Symbol("cron-timeout");
468
- let resolveTimeout;
469
- const timeoutPromise = new Promise((resolve) => {
470
- resolveTimeout = resolve;
471
- });
472
- const deferTimeoutUntilExecutionStart = job.sessionTarget !== "main" && job.payload.kind === "agentTurn";
473
- const triggerTimeout = (reason) => {
474
- if (runAbortController.signal.aborted) return;
475
- timeoutReason = reason;
476
- runAbortController.abort(reason);
477
- resolveTimeout?.(timeoutMarker);
478
- };
479
- const watchdog = createCronAgentWatchdog({
480
- deferUntilRunner: deferTimeoutUntilExecutionStart,
481
- jobTimeoutMs,
482
- triggerTimeout
483
- });
484
- const corePromise = executeJobCore(state, job, runAbortController.signal, {
485
- onExecutionStarted: deferTimeoutUntilExecutionStart ? watchdog.noteRunnerStarted : void 0,
486
- onExecutionPhase: deferTimeoutUntilExecutionStart ? watchdog.notePhase : void 0
487
- });
488
- watchdog.start();
489
- corePromise.catch((err) => {
490
- if (runAbortController.signal.aborted) state.deps.log.warn({
491
- jobId: job.id,
492
- err: String(err)
493
- }, "cron: job core rejected after timeout abort");
494
- });
495
- try {
496
- const first = await Promise.race([corePromise, timeoutPromise]);
497
- if (first !== timeoutMarker) return first;
498
- const activeExecution = watchdog.activeExecution();
499
- await cleanupTimedOutCronAgentRun(state, job, jobTimeoutMs, activeExecution);
500
- const error = timeoutReason ?? timeoutErrorMessage(activeExecution);
501
- return {
502
- status: "error",
503
- error,
504
- diagnostics: createCronRunDiagnosticsFromError("cron-setup", error, { nowMs: state.deps.nowMs })
505
- };
506
- } finally {
507
- watchdog.dispose();
508
- }
509
- }
510
- function createCronAgentWatchdog(params) {
511
- let state = params.deferUntilRunner ? "waiting_for_runner" : "executing";
512
- let timeoutId;
513
- let setupTimeoutId;
514
- let preExecutionTimeoutId;
515
- let activeExecution;
516
- const setTimedOut = (reason) => {
517
- if (state === "timed_out" || state === "disposed") return;
518
- state = "timed_out";
519
- params.triggerTimeout(reason);
520
- };
521
- const startTimeout = () => {
522
- if (timeoutId || state === "disposed") return;
523
- timeoutId = setTimeout(() => {
524
- setTimedOut(timeoutErrorMessage(activeExecution));
525
- }, params.jobTimeoutMs);
526
- };
527
- const clearSetupTimeout = () => {
528
- if (!setupTimeoutId) return;
529
- clearTimeout(setupTimeoutId);
530
- setupTimeoutId = void 0;
531
- };
532
- const clearPreExecutionTimeout = () => {
533
- if (!preExecutionTimeoutId) return;
534
- clearTimeout(preExecutionTimeoutId);
535
- preExecutionTimeoutId = void 0;
536
- };
537
- const startPreExecutionTimeout = () => {
538
- if (preExecutionTimeoutId || state !== "waiting_for_execution") return;
539
- preExecutionTimeoutId = setTimeout(() => {
540
- if (state === "waiting_for_execution") setTimedOut(preExecutionTimeoutErrorMessage(activeExecution));
541
- }, resolveCronAgentPreExecutionWatchdogMs(params.jobTimeoutMs));
542
- };
543
- const noteExecutionProgress = (info) => {
544
- if (!info) return;
545
- const previousPhase = activeExecution?.phase;
546
- activeExecution = {
547
- ...activeExecution,
548
- ...info
549
- };
550
- const stage = info.phase ? CRON_AGENT_PHASE_WATCHDOG_STAGE[info.phase] : void 0;
551
- if (state === "executing" && previousPhase === "before_agent_reply" && stage === "pre_execution") {
552
- state = "waiting_for_execution";
553
- startPreExecutionTimeout();
554
- return;
555
- }
556
- if (stage === "execution" || info.firstModelCallStarted) {
557
- state = "executing";
558
- clearPreExecutionTimeout();
559
- }
560
- };
561
- return {
562
- start: () => {
563
- if (params.deferUntilRunner) {
564
- setupTimeoutId = setTimeout(() => {
565
- if (state === "waiting_for_runner") setTimedOut(setupTimeoutErrorMessage(activeExecution));
566
- }, CRON_AGENT_SETUP_WATCHDOG_MS);
567
- return;
568
- }
569
- startTimeout();
570
- },
571
- noteRunnerStarted: (info) => {
572
- if (state === "disposed" || state === "timed_out") return;
573
- clearSetupTimeout();
574
- startTimeout();
575
- if (state !== "executing") state = "waiting_for_execution";
576
- noteExecutionProgress(info);
577
- startPreExecutionTimeout();
578
- },
579
- notePhase: (info) => {
580
- if (state === "disposed" || state === "timed_out") return;
581
- noteExecutionProgress(info);
582
- },
583
- activeExecution: () => activeExecution,
584
- dispose: () => {
585
- state = "disposed";
586
- if (timeoutId) clearTimeout(timeoutId);
587
- clearSetupTimeout();
588
- clearPreExecutionTimeout();
589
- }
590
- };
591
- }
592
- async function cleanupTimedOutCronAgentRun(state, job, timeoutMs, execution) {
593
- if (!state.deps.cleanupTimedOutAgentRun) return;
594
- let settleTimer;
595
- const cleanupPromise = state.deps.cleanupTimedOutAgentRun({
596
- job,
597
- timeoutMs,
598
- execution
599
- });
600
- const settleTimeout = new Promise((resolve) => {
601
- settleTimer = setTimeout(resolve, CRON_TIMEOUT_CLEANUP_GUARD_MS);
602
- });
603
- try {
604
- await Promise.race([cleanupPromise, settleTimeout]);
605
- } catch (err) {
606
- state.deps.log.warn({
607
- jobId: job.id,
608
- err: String(err)
609
- }, "cron: timed-out agent cleanup failed");
610
- } finally {
611
- if (settleTimer) clearTimeout(settleTimer);
612
- }
613
- }
614
- function resolveRunConcurrency(state) {
615
- const raw = state.deps.cronConfig?.maxConcurrentRuns;
616
- if (typeof raw !== "number" || !Number.isFinite(raw)) return 1;
617
- return Math.max(1, Math.floor(raw));
618
- }
619
- function timeoutErrorMessage(execution) {
620
- const phase = formatCronAgentExecutionPhase(execution);
621
- if (!phase) return "cron: job execution timed out";
622
- return `cron: job execution timed out (last phase: ${phase})`;
623
- }
624
- function setupTimeoutErrorMessage(execution) {
625
- const phase = formatCronAgentExecutionPhase(execution);
626
- if (!phase) return "cron: isolated agent setup timed out before runner start";
627
- return `cron: isolated agent setup timed out before runner start (last phase: ${phase})`;
628
- }
629
- function preExecutionTimeoutErrorMessage(execution) {
630
- const phase = formatCronAgentExecutionPhase(execution);
631
- if (!phase) return "cron: isolated agent run stalled before execution start";
632
- return `cron: isolated agent run stalled before execution start (last phase: ${phase})`;
633
- }
634
- function formatCronAgentExecutionPhase(execution) {
635
- return formatEmbeddedAgentExecutionPhase(execution?.phase);
636
- }
637
- function resolveCronAgentPreExecutionWatchdogMs(jobTimeoutMs) {
638
- return Math.max(CRON_AGENT_PRE_EXECUTION_MIN_WATCHDOG_MS, Math.min(CRON_AGENT_PRE_EXECUTION_WATCHDOG_MS, Math.floor(jobTimeoutMs / 2)));
639
- }
640
- function abortErrorMessage(signal) {
641
- const reason = signal?.reason;
642
- if (typeof reason === "string" && reason.trim()) return reason.trim();
643
- return timeoutErrorMessage();
644
- }
645
- function isAbortError(err) {
646
- if (!(err instanceof Error)) return false;
647
- return err.name === "AbortError" || err.message === timeoutErrorMessage();
648
- }
649
- function normalizeCronRunErrorText(err) {
650
- if (isAbortError(err)) return timeoutErrorMessage();
651
- if (typeof err === "string") return err === `Error: ${timeoutErrorMessage()}` ? timeoutErrorMessage() : err;
652
- return String(err);
653
- }
654
- function normalizeCronLaneSegment(value, fallback) {
655
- return normalizeOptionalLowercaseString(value)?.replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || fallback;
656
- }
657
- function resolveMainSessionCronRunSessionKey(job, startedAt) {
658
- const explicitAgentId = job.agentId?.trim();
659
- return `agent:${normalizeAgentId(explicitAgentId || resolveAgentIdFromSessionKey(job.sessionKey))}:cron:${normalizeCronLaneSegment(job.id, "job")}:run:${normalizeCronLaneSegment(String(Math.max(0, Math.floor(startedAt))), "run")}`;
660
- }
661
- function resolveMainSessionCronDeliveryContext(state, job) {
662
- const targetSessionKey = job.sessionKey?.trim();
663
- if (!targetSessionKey) return;
664
- const explicitAgentId = job.agentId?.trim();
665
- const agentId = normalizeAgentId(explicitAgentId || resolveAgentIdFromSessionKey(targetSessionKey));
666
- const storePath = state.deps.resolveSessionStorePath?.(agentId) ?? state.deps.sessionStorePath;
667
- if (!storePath) return;
668
- try {
669
- return deliveryContextFromSession(readSessionEntry(storePath, targetSessionKey));
670
- } catch {
671
- return;
672
- }
673
- }
674
- function resolveCronTaskChildSessionKey(params) {
675
- if (params.job.sessionTarget === "main") return resolveMainSessionCronRunSessionKey(params.job, params.startedAt);
676
- const explicitSessionKey = params.job.sessionKey?.trim();
677
- if (explicitSessionKey) return explicitSessionKey;
678
- if (params.job.sessionTarget !== "isolated") return;
679
- return resolveCronAgentSessionKey({
680
- sessionKey: `cron:${params.job.id}`,
681
- agentId: params.job.agentId ?? params.state.deps.defaultAgentId ?? "main"
682
- });
683
- }
684
- function tryCreateCronTaskRun(params) {
685
- const runId = createCronExecutionId(params.job.id, params.startedAt);
686
- try {
687
- createRunningTaskRun({
688
- runtime: "cron",
689
- sourceId: params.job.id,
690
- ownerKey: "",
691
- scopeKind: "system",
692
- childSessionKey: resolveCronTaskChildSessionKey(params),
693
- agentId: params.job.agentId,
694
- runId,
695
- label: params.job.name,
696
- task: params.job.name || params.job.id,
697
- deliveryStatus: "not_applicable",
698
- notifyPolicy: "silent",
699
- startedAt: params.startedAt,
700
- lastEventAt: params.startedAt,
701
- progressSummary: CRON_TASK_RUNNING_PROGRESS_SUMMARY
702
- });
703
- return runId;
704
- } catch (error) {
705
- params.state.deps.log.warn({
706
- jobId: params.job.id,
707
- error
708
- }, "cron: failed to create task ledger record");
709
- return;
710
- }
711
- }
712
- function tryFinishCronTaskRun(state, result) {
713
- if (!result.taskRunId) return;
714
- try {
715
- if (result.status === "ok" || result.status === "skipped") {
716
- completeTaskRunByRunId({
717
- runId: result.taskRunId,
718
- runtime: "cron",
719
- endedAt: result.endedAt,
720
- lastEventAt: result.endedAt,
721
- terminalSummary: result.summary ?? void 0
722
- });
723
- return;
724
- }
725
- failTaskRunByRunId({
726
- runId: result.taskRunId,
727
- runtime: "cron",
728
- status: normalizeCronRunErrorText(result.error) === timeoutErrorMessage() ? "timed_out" : "failed",
729
- endedAt: result.endedAt,
730
- lastEventAt: result.endedAt,
731
- error: result.status === "error" ? normalizeCronRunErrorText(result.error) : void 0,
732
- terminalSummary: result.summary ?? void 0
733
- });
734
- } catch (error) {
735
- state.deps.log.warn({
736
- runId: result.taskRunId,
737
- jobStatus: result.status,
738
- error
739
- }, "cron: failed to update task ledger record");
740
- }
741
- }
742
- /** Default max retries for cron jobs on transient errors (#24355). */
743
- const DEFAULT_MAX_TRANSIENT_RETRIES = 3;
744
- function resolveCronNextRunWithLowerBound(params) {
745
- if (params.naturalNext === void 0) {
746
- params.state.deps.log.warn({
747
- jobId: params.job.id,
748
- jobName: params.job.name,
749
- context: params.context
750
- }, "cron: next run unresolved; clearing schedule to avoid a refire loop");
751
- return;
752
- }
753
- return Math.max(params.naturalNext, params.lowerBoundMs);
754
- }
755
- function resolveRetryConfig(cronConfig) {
756
- const retry = cronConfig?.retry;
757
- return {
758
- maxAttempts: typeof retry?.maxAttempts === "number" ? retry.maxAttempts : DEFAULT_MAX_TRANSIENT_RETRIES,
759
- backoffMs: Array.isArray(retry?.backoffMs) && retry.backoffMs.length > 0 ? retry.backoffMs : DEFAULT_ERROR_BACKOFF_SCHEDULE_MS.slice(0, 3),
760
- retryOn: Array.isArray(retry?.retryOn) && retry.retryOn.length > 0 ? retry.retryOn : void 0
761
- };
762
- }
763
- function resolveTransientCronRetryDecision(params) {
764
- const retryConfig = resolveRetryConfig(params.cronConfig);
765
- const retryHint = resolveCronExecutionRetryHint(params.error, retryConfig.retryOn, params.lastErrorReason);
766
- const consecutiveErrors = params.consecutiveErrors ?? 0;
767
- if (!retryHint.retryable) return {
768
- retryable: false,
769
- consecutiveErrors,
770
- retryCategory: retryHint.category,
771
- reason: "permanent error"
772
- };
773
- if (consecutiveErrors > retryConfig.maxAttempts) return {
774
- retryable: false,
775
- consecutiveErrors,
776
- retryCategory: retryHint.category,
777
- reason: "max retries exhausted"
778
- };
779
- return {
780
- retryable: true,
781
- consecutiveErrors,
782
- retryCategory: retryHint.category,
783
- backoffMs: errorBackoffMs(consecutiveErrors, retryConfig.backoffMs),
784
- reason: "transient retry"
785
- };
786
- }
787
- function resolveDeliveryState(params) {
788
- const primaryDeliveryRequested = resolveCronDeliveryPlan(params.job).requested;
789
- const alternateFailureNotificationRequested = params.runStatus === "error" && params.job.delivery?.bestEffort !== true && resolveFailureDestination(params.job, params.globalFailureDestination) !== null;
790
- if (!primaryDeliveryRequested) return {
791
- status: "not-requested",
792
- failureNotification: { status: alternateFailureNotificationRequested ? "unknown" : "not-requested" }
793
- };
794
- if (params.runStatus === "error") {
795
- const failureNotification = alternateFailureNotificationRequested ? { status: "unknown" } : { status: "delivered" };
796
- if (params.delivered === true) return {
797
- delivered: false,
798
- status: "not-delivered",
799
- error: params.error,
800
- failureNotification: alternateFailureNotificationRequested ? failureNotification : {
801
- delivered: true,
802
- status: "delivered"
803
- }
804
- };
805
- if (params.delivered === false) return {
806
- delivered: false,
807
- status: "not-delivered",
808
- error: params.error,
809
- failureNotification: alternateFailureNotificationRequested ? failureNotification : {
810
- delivered: false,
811
- status: "not-delivered",
812
- ...params.error ? { error: params.error } : {}
813
- }
814
- };
815
- return {
816
- status: "unknown",
817
- error: params.error,
818
- failureNotification: { status: "unknown" }
819
- };
820
- }
821
- if (params.delivered === true) return {
822
- delivered: true,
823
- status: "delivered",
824
- failureNotification: { status: "not-requested" }
825
- };
826
- if (params.delivered === false) return {
827
- delivered: false,
828
- status: "not-delivered",
829
- error: params.error,
830
- failureNotification: { status: "not-requested" }
831
- };
832
- return {
833
- status: "unknown",
834
- failureNotification: { status: "not-requested" }
835
- };
836
- }
837
- function failureNotificationDeliveryFromJobState(job) {
838
- const status = job.state.lastFailureNotificationDeliveryStatus;
839
- if (!status || status === "not-requested") return;
840
- return {
841
- delivered: job.state.lastFailureNotificationDelivered,
842
- status,
843
- error: job.state.lastFailureNotificationDeliveryError
844
- };
845
- }
846
- function normalizeCronMessageChannel(input) {
847
- const channel = normalizeOptionalLowercaseString(input);
848
- return channel ? channel : void 0;
849
- }
850
- function normalizeTo(input) {
851
- if (typeof input !== "string") return;
852
- const to = input.trim();
853
- return to ? to : void 0;
854
- }
855
- function clampPositiveInt(value, fallback) {
856
- if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
857
- const floored = Math.floor(value);
858
- return floored >= 1 ? floored : fallback;
859
- }
860
- function clampNonNegativeInt(value, fallback) {
861
- if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
862
- const floored = Math.floor(value);
863
- return floored >= 0 ? floored : fallback;
864
- }
865
- function resolveFailureAlert(state, job) {
866
- const globalConfig = state.deps.cronConfig?.failureAlert;
867
- const jobConfig = job.failureAlert === false ? void 0 : job.failureAlert;
868
- if (job.failureAlert === false) return null;
869
- if (!jobConfig && globalConfig?.enabled !== true) return null;
870
- const mode = jobConfig?.mode ?? globalConfig?.mode;
871
- const explicitTo = normalizeTo(jobConfig?.to);
872
- return {
873
- after: clampPositiveInt(jobConfig?.after ?? globalConfig?.after, DEFAULT_FAILURE_ALERT_AFTER),
874
- cooldownMs: clampNonNegativeInt(jobConfig?.cooldownMs ?? globalConfig?.cooldownMs, DEFAULT_FAILURE_ALERT_COOLDOWN_MS),
875
- channel: normalizeCronMessageChannel(jobConfig?.channel) ?? normalizeCronMessageChannel(job.delivery?.channel) ?? "last",
876
- to: mode === "webhook" ? explicitTo : explicitTo ?? normalizeTo(job.delivery?.to),
877
- mode,
878
- accountId: jobConfig?.accountId ?? globalConfig?.accountId,
879
- includeSkipped: jobConfig?.includeSkipped ?? globalConfig?.includeSkipped ?? false
880
- };
881
- }
882
- function emitFailureAlert(state, params) {
883
- const safeJobName = params.job.name || params.job.id;
884
- const truncatedError = (params.error?.trim() || "unknown reason").slice(0, 200);
885
- const errorReason = params.status === "error" && typeof params.error === "string" ? resolveFailoverReasonFromError(params.error, params.provider) ?? void 0 : void 0;
886
- const statusVerb = params.status === "skipped" ? "skipped" : "failed";
887
- const detailLabel = params.status === "skipped" ? "Skip reason" : "Last error";
888
- const text = [
889
- `Cron job "${safeJobName}" ${statusVerb} ${params.consecutiveErrors} times`,
890
- ...errorReason ? [`Cause: ${errorReason}`] : [],
891
- `${detailLabel}: ${truncatedError}`
892
- ].join("\n");
893
- if (state.deps.sendCronFailureAlert) {
894
- state.deps.sendCronFailureAlert({
895
- job: params.job,
896
- text,
897
- channel: params.channel,
898
- to: params.to,
899
- mode: params.mode,
900
- accountId: params.accountId
901
- }).catch((err) => {
902
- state.deps.log.warn({
903
- jobId: params.job.id,
904
- err: String(err)
905
- }, "cron: failure alert delivery failed");
906
- });
907
- return;
908
- }
909
- state.deps.enqueueSystemEvent(text, { agentId: params.job.agentId });
910
- if (params.job.wakeMode === "now") state.deps.requestHeartbeat({
911
- source: "cron",
912
- intent: "immediate",
913
- reason: `cron:${params.job.id}:failure-alert`
914
- });
915
- }
916
- function maybeEmitFailureAlert(state, params) {
917
- if (!params.alertConfig || params.consecutiveCount < params.alertConfig.after) return;
918
- if (params.job.delivery?.bestEffort === true) return;
919
- const now = state.deps.nowMs();
920
- const lastAlert = params.job.state.lastFailureAlertAtMs;
921
- if (typeof lastAlert === "number" && now - lastAlert < Math.max(0, params.alertConfig.cooldownMs)) return;
922
- emitFailureAlert(state, {
923
- job: params.job,
924
- error: params.error,
925
- consecutiveErrors: params.consecutiveCount,
926
- channel: params.alertConfig.channel,
927
- to: params.alertConfig.to,
928
- mode: params.alertConfig.mode,
929
- accountId: params.alertConfig.accountId,
930
- status: params.status,
931
- provider: params.provider
932
- });
933
- params.job.state.lastFailureAlertAtMs = now;
934
- }
935
- /**
936
- * Apply the result of a job execution to the job's state.
937
- * Handles consecutive error tracking, exponential backoff, one-shot disable,
938
- * and nextRunAtMs computation. Returns `true` if the job should be deleted.
939
- */
940
- function applyJobResult(state, job, result, opts) {
941
- const prevLastRunAtMs = job.state.lastRunAtMs;
942
- const computeNextWithPreservedLastRun = (nowMs) => {
943
- const saved = job.state.lastRunAtMs;
944
- job.state.lastRunAtMs = prevLastRunAtMs;
945
- try {
946
- return computeJobNextRunAtMs(job, nowMs);
947
- } finally {
948
- job.state.lastRunAtMs = saved;
949
- }
950
- };
951
- job.state.runningAtMs = void 0;
952
- job.state.lastRunAtMs = result.startedAt;
953
- job.state.lastRunStatus = result.status;
954
- job.state.lastStatus = result.status;
955
- job.state.lastDurationMs = Math.max(0, result.endedAt - result.startedAt);
956
- job.state.lastError = result.error;
957
- job.state.lastDiagnostics = normalizeCronRunDiagnostics(result.diagnostics);
958
- job.state.lastDiagnosticSummary = summarizeCronRunDiagnostics(job.state.lastDiagnostics);
959
- job.state.lastErrorReason = result.status === "error" && typeof result.error === "string" ? resolveFailoverReasonFromError(result.error, result.provider) ?? void 0 : void 0;
960
- if (result.status === "error") state.deps.log.warn({
961
- jobId: job.id,
962
- jobName: job.name,
963
- error: result.error,
964
- diagnosticsSummary: job.state.lastDiagnosticSummary
965
- }, "cron: job run returned error status");
966
- const deliveryState = resolveDeliveryState({
967
- job,
968
- runStatus: result.status,
969
- delivered: result.delivered,
970
- error: result.error,
971
- globalFailureDestination: state.deps.cronConfig?.failureDestination
972
- });
973
- job.state.lastDelivered = deliveryState.delivered;
974
- job.state.lastDeliveryStatus = deliveryState.status;
975
- job.state.lastDeliveryError = deliveryState.status === "not-delivered" && deliveryState.error ? deliveryState.error : void 0;
976
- job.state.lastFailureNotificationDelivered = deliveryState.failureNotification.delivered;
977
- job.state.lastFailureNotificationDeliveryStatus = deliveryState.failureNotification.status;
978
- job.state.lastFailureNotificationDeliveryError = deliveryState.failureNotification.error;
979
- job.updatedAtMs = result.endedAt;
980
- const previousConsecutiveErrors = job.state.consecutiveErrors ?? 0;
981
- const alertConfig = resolveFailureAlert(state, job);
982
- if (result.status === "error") {
983
- job.state.consecutiveErrors = (job.state.consecutiveErrors ?? 0) + 1;
984
- job.state.consecutiveSkipped = 0;
985
- maybeEmitFailureAlert(state, {
986
- job,
987
- alertConfig,
988
- status: "error",
989
- error: result.error,
990
- provider: result.provider,
991
- consecutiveCount: job.state.consecutiveErrors
992
- });
993
- } else if (result.status === "skipped") {
994
- job.state.consecutiveErrors = 0;
995
- job.state.consecutiveSkipped = (job.state.consecutiveSkipped ?? 0) + 1;
996
- if (alertConfig?.includeSkipped) maybeEmitFailureAlert(state, {
997
- job,
998
- alertConfig,
999
- status: "skipped",
1000
- error: result.error,
1001
- provider: result.provider,
1002
- consecutiveCount: job.state.consecutiveSkipped
1003
- });
1004
- else job.state.lastFailureAlertAtMs = void 0;
1005
- } else {
1006
- job.state.consecutiveErrors = 0;
1007
- job.state.consecutiveSkipped = 0;
1008
- job.state.lastFailureAlertAtMs = void 0;
1009
- }
1010
- const shouldDelete = job.schedule.kind === "at" && job.deleteAfterRun === true && result.status === "ok";
1011
- if (!shouldDelete) if (job.schedule.kind === "at") {
1012
- if (result.status === "ok" || result.status === "skipped") {
1013
- job.enabled = false;
1014
- job.state.nextRunAtMs = void 0;
1015
- } else if (result.status === "error") {
1016
- const retryDecision = resolveTransientCronRetryDecision({
1017
- cronConfig: state.deps.cronConfig,
1018
- error: result.error,
1019
- lastErrorReason: job.state.lastErrorReason,
1020
- consecutiveErrors: job.state.consecutiveErrors
1021
- });
1022
- if (retryDecision.retryable && retryDecision.backoffMs !== void 0) {
1023
- job.state.nextRunAtMs = result.endedAt + retryDecision.backoffMs;
1024
- state.deps.log.info({
1025
- jobId: job.id,
1026
- jobName: job.name,
1027
- consecutiveErrors: retryDecision.consecutiveErrors,
1028
- backoffMs: retryDecision.backoffMs,
1029
- nextRunAtMs: job.state.nextRunAtMs,
1030
- retryCategory: retryDecision.retryCategory
1031
- }, "cron: scheduling one-shot retry after transient error");
1032
- } else {
1033
- job.enabled = false;
1034
- job.state.nextRunAtMs = void 0;
1035
- state.deps.log.warn({
1036
- jobId: job.id,
1037
- jobName: job.name,
1038
- consecutiveErrors: retryDecision.consecutiveErrors,
1039
- error: result.error,
1040
- reason: retryDecision.reason,
1041
- retryCategory: retryDecision.retryCategory
1042
- }, "cron: disabling one-shot job after error");
1043
- }
1044
- }
1045
- } else if (result.status === "error" && isJobEnabled(job)) {
1046
- const retryDecision = resolveTransientCronRetryDecision({
1047
- cronConfig: state.deps.cronConfig,
1048
- error: result.error,
1049
- lastErrorReason: job.state.lastErrorReason,
1050
- consecutiveErrors: job.state.consecutiveErrors
1051
- });
1052
- let normalNext;
1053
- let normalNextComputed = false;
1054
- const computeNormalNext = () => {
1055
- if (!normalNextComputed) {
1056
- try {
1057
- normalNext = opts?.preserveSchedule && job.schedule.kind === "every" ? computeNextWithPreservedLastRun(result.endedAt) : (retryDecision.retryable || previousConsecutiveErrors > 0) && job.schedule.kind === "every" ? computeNextRunAtMs(job.schedule, result.endedAt) : computeJobNextRunAtMs(job, result.endedAt);
1058
- } catch (err) {
1059
- recordScheduleComputeError({
1060
- state,
1061
- job,
1062
- err
1063
- });
1064
- }
1065
- normalNextComputed = true;
1066
- }
1067
- return normalNext;
1068
- };
1069
- if (!opts?.preserveSchedule && retryDecision.retryable && retryDecision.backoffMs !== void 0) {
1070
- normalNext = computeNormalNext();
1071
- const retryNextRunAtMs = result.endedAt + retryDecision.backoffMs;
1072
- if (normalNext === void 0) {} else if (retryNextRunAtMs < normalNext) {
1073
- job.state.nextRunAtMs = retryNextRunAtMs;
1074
- state.deps.log.info({
1075
- jobId: job.id,
1076
- jobName: job.name,
1077
- consecutiveErrors: retryDecision.consecutiveErrors,
1078
- backoffMs: retryDecision.backoffMs,
1079
- nextRunAtMs: job.state.nextRunAtMs,
1080
- normalNextRunAtMs: normalNext,
1081
- retryCategory: retryDecision.retryCategory
1082
- }, "cron: scheduling recurring retry after transient error");
1083
- return shouldDelete;
1084
- }
1085
- }
1086
- const backoff = errorBackoffMs(job.state.consecutiveErrors ?? 1);
1087
- normalNext = computeNormalNext();
1088
- const backoffNext = result.endedAt + backoff;
1089
- job.state.nextRunAtMs = job.schedule.kind === "cron" ? resolveCronNextRunWithLowerBound({
1090
- state,
1091
- job,
1092
- naturalNext: normalNext,
1093
- lowerBoundMs: backoffNext,
1094
- context: "error_backoff"
1095
- }) : normalNext !== void 0 ? Math.max(normalNext, backoffNext) : backoffNext;
1096
- state.deps.log.info({
1097
- jobId: job.id,
1098
- consecutiveErrors: job.state.consecutiveErrors,
1099
- backoffMs: backoff,
1100
- nextRunAtMs: job.state.nextRunAtMs
1101
- }, "cron: applying error backoff");
1102
- } else if (isJobEnabled(job)) {
1103
- let naturalNext;
1104
- try {
1105
- naturalNext = opts?.preserveSchedule && job.schedule.kind === "every" ? computeNextWithPreservedLastRun(result.endedAt) : previousConsecutiveErrors > 0 && job.schedule.kind === "every" ? computeNextRunAtMs(job.schedule, result.endedAt) : computeJobNextRunAtMs(job, result.endedAt);
1106
- } catch (err) {
1107
- recordScheduleComputeError({
1108
- state,
1109
- job,
1110
- err
1111
- });
1112
- }
1113
- if (job.schedule.kind === "cron") {
1114
- const minNext = result.endedAt + MIN_REFIRE_GAP_MS;
1115
- job.state.nextRunAtMs = resolveCronNextRunWithLowerBound({
1116
- state,
1117
- job,
1118
- naturalNext,
1119
- lowerBoundMs: minNext,
1120
- context: "completion"
1121
- });
1122
- } else job.state.nextRunAtMs = naturalNext;
1123
- } else job.state.nextRunAtMs = void 0;
1124
- return shouldDelete;
1125
- }
1126
- function applyOutcomeToStoredJob(state, result) {
1127
- clearCronJobActive(result.jobId);
1128
- tryFinishCronTaskRun(state, result);
1129
- const store = state.store;
1130
- if (!store) return;
1131
- const jobs = store.jobs;
1132
- const job = jobs.find((entry) => entry.id === result.jobId);
1133
- if (!job) {
1134
- if (result.status === "ok") {
1135
- applyJobResult(state, result.job, {
1136
- status: result.status,
1137
- error: result.error,
1138
- diagnostics: result.diagnostics,
1139
- delivered: result.delivered,
1140
- provider: result.provider,
1141
- startedAt: result.startedAt,
1142
- endedAt: result.endedAt
1143
- });
1144
- emitJobFinished(state, result.job, result, result.startedAt);
1145
- state.deps.log.info({ jobId: result.jobId }, "cron: finalized successful run after job was removed during execution");
1146
- return;
1147
- }
1148
- state.deps.log.warn({ jobId: result.jobId }, "cron: applyOutcomeToStoredJob — job not found after forceReload, result discarded");
1149
- return;
1150
- }
1151
- const shouldDelete = applyJobResult(state, job, {
1152
- status: result.status,
1153
- error: result.error,
1154
- diagnostics: result.diagnostics,
1155
- delivered: result.delivered,
1156
- provider: result.provider,
1157
- startedAt: result.startedAt,
1158
- endedAt: result.endedAt
1159
- });
1160
- emitJobFinished(state, job, result, result.startedAt);
1161
- if (shouldDelete) {
1162
- store.jobs = jobs.filter((entry) => entry.id !== job.id);
1163
- emit(state, {
1164
- jobId: job.id,
1165
- action: "removed",
1166
- job
1167
- });
1168
- }
1169
- }
1170
- function armTimer(state) {
1171
- if (state.timer) clearTimeout(state.timer);
1172
- state.timer = null;
1173
- if (!state.deps.cronEnabled) {
1174
- state.deps.log.debug({}, "cron: armTimer skipped - scheduler disabled");
1175
- return;
1176
- }
1177
- const nextAt = nextWakeAtMs(state);
1178
- if (!nextAt) {
1179
- const jobCount = state.store?.jobs.length ?? 0;
1180
- const enabledCount = state.store?.jobs.filter((j) => j.enabled).length ?? 0;
1181
- const withNextRun = state.store?.jobs.filter((j) => j.enabled && hasScheduledNextRunAtMs(j.state.nextRunAtMs)).length ?? 0;
1182
- if (enabledCount > 0) {
1183
- armRunningRecheckTimer(state);
1184
- state.deps.log.debug({
1185
- jobCount,
1186
- enabledCount,
1187
- withNextRun,
1188
- delayMs: MAX_TIMER_DELAY_MS
1189
- }, "cron: timer armed for maintenance recheck");
1190
- return;
1191
- }
1192
- state.deps.log.debug({
1193
- jobCount,
1194
- enabledCount,
1195
- withNextRun
1196
- }, "cron: armTimer skipped - no jobs with nextRunAtMs");
1197
- return;
1198
- }
1199
- const now = state.deps.nowMs();
1200
- const delay = Math.max(nextAt - now, 0);
1201
- const clampedDelay = Math.min(delay === 0 ? MIN_REFIRE_GAP_MS : delay, MAX_TIMER_DELAY_MS);
1202
- state.timer = setTimeout(() => {
1203
- onTimer(state).catch((err) => {
1204
- state.deps.log.error({ err: String(err) }, "cron: timer tick failed");
1205
- });
1206
- }, clampedDelay);
1207
- state.deps.log.debug({
1208
- nextAt,
1209
- delayMs: clampedDelay,
1210
- clamped: delay > MAX_TIMER_DELAY_MS
1211
- }, "cron: timer armed");
1212
- }
1213
- function armRunningRecheckTimer(state) {
1214
- if (state.timer) clearTimeout(state.timer);
1215
- state.timer = setTimeout(() => {
1216
- onTimer(state).catch((err) => {
1217
- state.deps.log.error({ err: String(err) }, "cron: timer tick failed");
1218
- });
1219
- }, MAX_TIMER_DELAY_MS);
1220
- }
1221
- async function onTimer(state) {
1222
- if (state.running) {
1223
- armRunningRecheckTimer(state);
1224
- return;
1225
- }
1226
- state.running = true;
1227
- armRunningRecheckTimer(state);
1228
- try {
1229
- const dueJobs = await locked(state, async () => {
1230
- await ensureLoaded(state, {
1231
- forceReload: true,
1232
- skipRecompute: true
1233
- });
1234
- const dueCheckNow = state.deps.nowMs();
1235
- const due = collectRunnableJobs(state, dueCheckNow);
1236
- if (due.length === 0) {
1237
- if (recomputeNextRunsForMaintenance(state, {
1238
- recomputeExpired: true,
1239
- nowMs: dueCheckNow
1240
- })) await persist(state);
1241
- return [];
1242
- }
1243
- const now = state.deps.nowMs();
1244
- for (const job of due) {
1245
- job.state.runningAtMs = now;
1246
- job.state.lastError = void 0;
1247
- }
1248
- await persist(state);
1249
- return due.map((j) => ({
1250
- id: j.id,
1251
- job: j
1252
- }));
1253
- });
1254
- const runDueJob = async (params) => {
1255
- const { id, job } = params;
1256
- const startedAt = state.deps.nowMs();
1257
- job.state.runningAtMs = startedAt;
1258
- markCronJobActive(job.id);
1259
- emit(state, {
1260
- jobId: job.id,
1261
- action: "started",
1262
- job,
1263
- runAtMs: startedAt
1264
- });
1265
- const jobTimeoutMs = resolveCronJobTimeoutMs(job);
1266
- const taskRunId = tryCreateCronTaskRun({
1267
- state,
1268
- job,
1269
- startedAt
1270
- });
1271
- try {
1272
- return {
1273
- jobId: id,
1274
- job,
1275
- taskRunId,
1276
- ...await executeJobCoreWithTimeout(state, job),
1277
- startedAt,
1278
- endedAt: state.deps.nowMs()
1279
- };
1280
- } catch (err) {
1281
- const errorText = normalizeCronRunErrorText(err);
1282
- state.deps.log.warn({
1283
- jobId: id,
1284
- jobName: job.name,
1285
- timeoutMs: jobTimeoutMs ?? null
1286
- }, `cron: job failed: ${errorText}`);
1287
- return {
1288
- jobId: id,
1289
- job,
1290
- taskRunId,
1291
- status: "error",
1292
- error: errorText,
1293
- diagnostics: createCronRunDiagnosticsFromError("cron-setup", errorText, { nowMs: state.deps.nowMs }),
1294
- startedAt,
1295
- endedAt: state.deps.nowMs()
1296
- };
1297
- }
1298
- };
1299
- const concurrency = Math.min(resolveRunConcurrency(state), Math.max(1, dueJobs.length));
1300
- const results = Array.from({ length: dueJobs.length });
1301
- let cursor = 0;
1302
- const workers = Array.from({ length: concurrency }, async () => {
1303
- for (;;) {
1304
- const index = cursor++;
1305
- if (index >= dueJobs.length) return;
1306
- const due = dueJobs[index];
1307
- if (!due) return;
1308
- results[index] = await runDueJob(due);
1309
- }
1310
- });
1311
- await Promise.all(workers);
1312
- const completedResults = results.filter((entry) => entry !== void 0);
1313
- if (completedResults.length > 0) await locked(state, async () => {
1314
- await ensureLoaded(state, {
1315
- forceReload: true,
1316
- skipRecompute: true
1317
- });
1318
- for (const result of completedResults) applyOutcomeToStoredJob(state, result);
1319
- recomputeNextRunsForMaintenance(state);
1320
- await persist(state);
1321
- });
1322
- } finally {
1323
- const storePaths = /* @__PURE__ */ new Set();
1324
- if (state.deps.resolveSessionStorePath) {
1325
- const defaultAgentId = state.deps.defaultAgentId ?? "main";
1326
- if (state.store?.jobs?.length) for (const job of state.store.jobs) {
1327
- const agentId = typeof job.agentId === "string" && job.agentId.trim() ? job.agentId : defaultAgentId;
1328
- storePaths.add(state.deps.resolveSessionStorePath(agentId));
1329
- }
1330
- else storePaths.add(state.deps.resolveSessionStorePath(defaultAgentId));
1331
- } else if (state.deps.sessionStorePath) storePaths.add(state.deps.sessionStorePath);
1332
- if (storePaths.size > 0) {
1333
- const nowMs = state.deps.nowMs();
1334
- for (const storePath of storePaths) try {
1335
- await sweepCronRunSessions({
1336
- cronConfig: state.deps.cronConfig,
1337
- sessionStorePath: storePath,
1338
- nowMs,
1339
- log: state.deps.log
1340
- });
1341
- } catch (err) {
1342
- state.deps.log.warn({
1343
- err: String(err),
1344
- storePath
1345
- }, "cron: session reaper sweep failed");
1346
- }
1347
- }
1348
- state.running = false;
1349
- armTimer(state);
1350
- }
1351
- }
1352
- function isRunnableJob(params) {
1353
- const { job, nowMs } = params;
1354
- if (!job.state) job.state = {};
1355
- if (!isJobEnabled(job)) return false;
1356
- if (params.skipJobIds?.has(job.id)) return false;
1357
- if (typeof job.state.runningAtMs === "number") return false;
1358
- if (params.skipAtIfAlreadyRan && job.schedule.kind === "at" && job.state.lastStatus) {
1359
- const lastRun = job.state.lastRunAtMs;
1360
- const nextRun = job.state.nextRunAtMs;
1361
- if (job.state.lastStatus === "error" && isJobEnabled(job) && typeof nextRun === "number" && typeof lastRun === "number" && nextRun > lastRun) return nowMs >= nextRun;
1362
- return false;
1363
- }
1364
- const next = job.state.nextRunAtMs;
1365
- if (isErrorBackoffPending(params.state, job, nowMs)) return false;
1366
- if (hasScheduledNextRunAtMs(next) && nowMs >= next) return true;
1367
- if (!params.allowCronMissedRunByLastRun || job.schedule.kind !== "cron") return false;
1368
- let previousRunAtMs;
1369
- try {
1370
- previousRunAtMs = computeJobPreviousRunAtMs(job, nowMs);
1371
- } catch {
1372
- return false;
1373
- }
1374
- if (typeof previousRunAtMs !== "number" || !Number.isFinite(previousRunAtMs)) return false;
1375
- const lastRunAtMs = job.state.lastRunAtMs;
1376
- if (typeof lastRunAtMs !== "number" || !Number.isFinite(lastRunAtMs)) return false;
1377
- return previousRunAtMs > lastRunAtMs;
1378
- }
1379
- function isErrorBackoffPending(state, job, nowMs) {
1380
- if (job.schedule.kind === "at" || job.state.lastStatus !== "error") return false;
1381
- const backoffUntilMs = resolveJobErrorBackoffUntilMs(job, state.deps.cronConfig?.retry?.backoffMs ?? DEFAULT_ERROR_BACKOFF_SCHEDULE_MS);
1382
- return backoffUntilMs !== void 0 && nowMs < backoffUntilMs;
1383
- }
1384
- function collectRunnableJobs(state, nowMs, opts) {
1385
- if (!state.store) return [];
1386
- return state.store.jobs.filter((job) => isRunnableJob({
1387
- state,
1388
- job,
1389
- nowMs,
1390
- skipJobIds: opts?.skipJobIds,
1391
- skipAtIfAlreadyRan: opts?.skipAtIfAlreadyRan,
1392
- allowCronMissedRunByLastRun: opts?.allowCronMissedRunByLastRun
1393
- }));
1394
- }
1395
- function deferPendingBackoffMissedCronSlots(state, nowMs, opts) {
1396
- if (!state.store) return false;
1397
- let changed = false;
1398
- for (const job of state.store.jobs) {
1399
- if (!isJobEnabled(job) || job.schedule.kind !== "cron" || opts?.skipJobIds?.has(job.id) || typeof job.state.runningAtMs === "number") continue;
1400
- const backoffUntilMs = resolveJobErrorBackoffUntilMs(job, state.deps.cronConfig?.retry?.backoffMs ?? DEFAULT_ERROR_BACKOFF_SCHEDULE_MS);
1401
- if (backoffUntilMs === void 0 || nowMs >= backoffUntilMs) continue;
1402
- let previousRunAtMs;
1403
- try {
1404
- previousRunAtMs = computeJobPreviousRunAtMs(job, nowMs);
1405
- } catch {
1406
- continue;
1407
- }
1408
- const lastRunAtMs = job.state.lastRunAtMs;
1409
- if (typeof previousRunAtMs !== "number" || !Number.isFinite(previousRunAtMs) || typeof lastRunAtMs !== "number" || !Number.isFinite(lastRunAtMs) || previousRunAtMs <= lastRunAtMs) continue;
1410
- if (job.state.nextRunAtMs !== backoffUntilMs) {
1411
- job.state.nextRunAtMs = backoffUntilMs;
1412
- changed = true;
1413
- }
1414
- }
1415
- return changed;
1416
- }
1417
- async function runMissedJobs(state, opts) {
1418
- const plan = await planStartupCatchup(state, opts);
1419
- if (plan.candidates.length === 0 && plan.deferredJobs.length === 0) return;
1420
- await applyStartupCatchupOutcomes(state, plan, await executeStartupCatchupPlan(state, plan));
1421
- }
1422
- async function planStartupCatchup(state, opts) {
1423
- const maxImmediate = Math.max(0, state.deps.maxMissedJobsPerRestart ?? DEFAULT_MAX_MISSED_JOBS_PER_RESTART);
1424
- return locked(state, async () => {
1425
- await ensureLoaded(state, { skipRecompute: true });
1426
- if (!state.store) return {
1427
- candidates: [],
1428
- deferredJobs: []
1429
- };
1430
- const now = state.deps.nowMs();
1431
- const deferredBackoffMissedSlot = deferPendingBackoffMissedCronSlots(state, now, { skipJobIds: opts?.skipJobIds });
1432
- const missed = collectRunnableJobs(state, now, {
1433
- skipJobIds: opts?.skipJobIds,
1434
- skipAtIfAlreadyRan: true,
1435
- allowCronMissedRunByLastRun: true
1436
- });
1437
- if (missed.length === 0) {
1438
- if (deferredBackoffMissedSlot) await persist(state);
1439
- return {
1440
- candidates: [],
1441
- deferredJobs: []
1442
- };
1443
- }
1444
- const sorted = missed.toSorted((a, b) => (a.state.nextRunAtMs ?? 0) - (b.state.nextRunAtMs ?? 0));
1445
- const deferredAgentJobs = opts?.deferAgentTurnJobs ? sorted.filter((job) => job.payload.kind === "agentTurn") : [];
1446
- const startupEligible = opts?.deferAgentTurnJobs ? sorted.filter((job) => job.payload.kind !== "agentTurn") : sorted;
1447
- const startupCandidates = startupEligible.slice(0, maxImmediate);
1448
- const deferredOverflow = startupEligible.slice(maxImmediate);
1449
- const deferredAgentDelayMs = Math.max(0, state.deps.startupDeferredMissedAgentJobDelayMs ?? DEFAULT_STARTUP_DEFERRED_MISSED_AGENT_JOB_DELAY_MS);
1450
- const deferred = [...deferredOverflow.map((job) => ({ jobId: job.id })), ...deferredAgentJobs.map((job) => ({
1451
- jobId: job.id,
1452
- delayMs: deferredAgentDelayMs
1453
- }))];
1454
- if (deferred.length > 0) state.deps.log.info({
1455
- immediateCount: startupCandidates.length,
1456
- deferredCount: deferred.length,
1457
- totalMissed: missed.length
1458
- }, "cron: staggering missed jobs to prevent gateway overload");
1459
- if (deferredAgentJobs.length > 0) state.deps.log.info({
1460
- count: deferredAgentJobs.length,
1461
- jobIds: deferredAgentJobs.map((job) => job.id),
1462
- delayMs: deferredAgentDelayMs
1463
- }, "cron: deferring missed agent jobs until after gateway startup");
1464
- if (startupCandidates.length > 0) state.deps.log.info({
1465
- count: startupCandidates.length,
1466
- jobIds: startupCandidates.map((j) => j.id)
1467
- }, "cron: running missed jobs after restart");
1468
- for (const job of startupCandidates) {
1469
- job.state.runningAtMs = now;
1470
- job.state.lastError = void 0;
1471
- }
1472
- await persist(state);
1473
- return {
1474
- candidates: startupCandidates.map((job) => ({
1475
- jobId: job.id,
1476
- job
1477
- })),
1478
- deferredJobs: deferred
1479
- };
1480
- });
1481
- }
1482
- async function executeStartupCatchupPlan(state, plan) {
1483
- const outcomes = [];
1484
- for (const candidate of plan.candidates) outcomes.push(await runStartupCatchupCandidate(state, candidate));
1485
- return outcomes;
1486
- }
1487
- async function runStartupCatchupCandidate(state, candidate) {
1488
- const startedAt = state.deps.nowMs();
1489
- const taskRunId = tryCreateCronTaskRun({
1490
- state,
1491
- job: candidate.job,
1492
- startedAt
1493
- });
1494
- emit(state, {
1495
- jobId: candidate.job.id,
1496
- action: "started",
1497
- job: candidate.job,
1498
- runAtMs: startedAt
1499
- });
1500
- try {
1501
- const result = await executeJobCoreWithTimeout(state, candidate.job);
1502
- return {
1503
- jobId: candidate.jobId,
1504
- job: candidate.job,
1505
- taskRunId,
1506
- status: result.status,
1507
- error: result.error,
1508
- summary: result.summary,
1509
- diagnostics: result.diagnostics,
1510
- delivered: result.delivered,
1511
- sessionId: result.sessionId,
1512
- sessionKey: result.sessionKey,
1513
- model: result.model,
1514
- provider: result.provider,
1515
- usage: result.usage,
1516
- startedAt,
1517
- endedAt: state.deps.nowMs()
1518
- };
1519
- } catch (err) {
1520
- return {
1521
- jobId: candidate.jobId,
1522
- job: candidate.job,
1523
- taskRunId,
1524
- status: "error",
1525
- error: normalizeCronRunErrorText(err),
1526
- diagnostics: createCronRunDiagnosticsFromError("cron-setup", normalizeCronRunErrorText(err), { nowMs: state.deps.nowMs }),
1527
- startedAt,
1528
- endedAt: state.deps.nowMs()
1529
- };
1530
- }
1531
- }
1532
- async function applyStartupCatchupOutcomes(state, plan, outcomes) {
1533
- const staggerMs = Math.max(0, state.deps.missedJobStaggerMs ?? DEFAULT_MISSED_JOB_STAGGER_MS);
1534
- await locked(state, async () => {
1535
- await ensureLoaded(state, { skipRecompute: true });
1536
- if (!state.store) return;
1537
- for (const result of outcomes) applyOutcomeToStoredJob(state, result);
1538
- if (plan.deferredJobs.length > 0) {
1539
- const baseNow = state.deps.nowMs();
1540
- let offset = staggerMs;
1541
- for (const deferred of plan.deferredJobs) {
1542
- const jobId = deferred.jobId;
1543
- const job = state.store.jobs.find((entry) => entry.id === jobId);
1544
- if (!job || !isJobEnabled(job)) continue;
1545
- if (typeof deferred.delayMs === "number") {
1546
- job.state.nextRunAtMs = baseNow + deferred.delayMs + offset - staggerMs;
1547
- offset += staggerMs;
1548
- continue;
1549
- }
1550
- job.state.nextRunAtMs = baseNow + offset;
1551
- offset += staggerMs;
1552
- }
1553
- }
1554
- recomputeNextRunsForMaintenance(state, { repairFutureCronNextRunAtMs: false });
1555
- await persist(state);
1556
- });
1557
- }
1558
- async function executeJobCore(state, job, abortSignal, options) {
1559
- const resolveAbortError = () => ({
1560
- status: "error",
1561
- error: abortErrorMessage(abortSignal)
1562
- });
1563
- const waitWithAbort = async (ms) => {
1564
- if (!abortSignal) {
1565
- await new Promise((resolve) => setTimeout(resolve, ms));
1566
- return;
1567
- }
1568
- if (abortSignal.aborted) return;
1569
- await new Promise((resolve) => {
1570
- const timer = setTimeout(() => {
1571
- abortSignal.removeEventListener("abort", onAbort);
1572
- resolve();
1573
- }, ms);
1574
- const onAbort = () => {
1575
- clearTimeout(timer);
1576
- abortSignal.removeEventListener("abort", onAbort);
1577
- resolve();
1578
- };
1579
- abortSignal.addEventListener("abort", onAbort, { once: true });
1580
- });
1581
- };
1582
- if (abortSignal?.aborted) return resolveAbortError();
1583
- if (job.sessionTarget === "main") return await executeMainSessionCronJob(state, job, abortSignal, waitWithAbort);
1584
- return await executeDetachedCronJob(state, job, abortSignal, resolveAbortError, options);
1585
- }
1586
- async function executeMainSessionCronJob(state, job, abortSignal, waitWithAbort) {
1587
- const text = resolveJobPayloadTextForMain(job);
1588
- if (!text) return {
1589
- status: "skipped",
1590
- error: job.payload.kind === "systemEvent" ? "main job requires non-empty systemEvent text" : "main job requires payload.kind=\"systemEvent\""
1591
- };
1592
- const cronRunSessionKey = resolveMainSessionCronRunSessionKey(job, typeof job.state.runningAtMs === "number" ? job.state.runningAtMs : state.deps.nowMs());
1593
- const deliveryContext = resolveMainSessionCronDeliveryContext(state, job);
1594
- state.deps.enqueueSystemEvent(text, {
1595
- agentId: job.agentId,
1596
- sessionKey: cronRunSessionKey,
1597
- contextKey: `cron:${job.id}`,
1598
- ...deliveryContext ? { deliveryContext } : {}
1599
- });
1600
- if (job.wakeMode === "now" && state.deps.runHeartbeatOnce) {
1601
- const reason = `cron:${job.id}`;
1602
- const maxWaitMs = state.deps.wakeNowHeartbeatBusyMaxWaitMs ?? 2 * 6e4;
1603
- const retryDelayMs = state.deps.wakeNowHeartbeatBusyRetryDelayMs ?? 250;
1604
- const waitStartedAt = state.deps.nowMs();
1605
- let heartbeatResult;
1606
- for (;;) {
1607
- if (abortSignal?.aborted) return {
1608
- status: "error",
1609
- error: timeoutErrorMessage()
1610
- };
1611
- heartbeatResult = await state.deps.runHeartbeatOnce({
1612
- source: "cron",
1613
- intent: "immediate",
1614
- reason,
1615
- agentId: job.agentId,
1616
- sessionKey: cronRunSessionKey,
1617
- heartbeat: { target: "last" }
1618
- });
1619
- if (heartbeatResult.status !== "skipped" || !isRetryableHeartbeatBusySkipReason(heartbeatResult.reason)) break;
1620
- if (heartbeatResult.reason === "cron-in-progress") {
1621
- state.deps.requestHeartbeat({
1622
- source: "cron",
1623
- intent: "immediate",
1624
- reason,
1625
- agentId: job.agentId,
1626
- sessionKey: cronRunSessionKey,
1627
- heartbeat: { target: "last" }
1628
- });
1629
- return {
1630
- status: "ok",
1631
- summary: text,
1632
- sessionKey: cronRunSessionKey
1633
- };
1634
- }
1635
- if (abortSignal?.aborted) return {
1636
- status: "error",
1637
- error: timeoutErrorMessage()
1638
- };
1639
- if (state.deps.nowMs() - waitStartedAt > maxWaitMs) {
1640
- if (abortSignal?.aborted) return {
1641
- status: "error",
1642
- error: timeoutErrorMessage()
1643
- };
1644
- state.deps.requestHeartbeat({
1645
- source: "cron",
1646
- intent: "immediate",
1647
- reason,
1648
- agentId: job.agentId,
1649
- sessionKey: cronRunSessionKey,
1650
- heartbeat: { target: "last" }
1651
- });
1652
- return {
1653
- status: "ok",
1654
- summary: text,
1655
- sessionKey: cronRunSessionKey
1656
- };
1657
- }
1658
- await waitWithAbort(retryDelayMs);
1659
- }
1660
- if (heartbeatResult.status === "ran") return {
1661
- status: "ok",
1662
- summary: text,
1663
- sessionKey: cronRunSessionKey
1664
- };
1665
- if (heartbeatResult.status === "skipped") return {
1666
- status: "skipped",
1667
- error: heartbeatResult.reason,
1668
- summary: text,
1669
- sessionKey: cronRunSessionKey
1670
- };
1671
- return {
1672
- status: "error",
1673
- error: heartbeatResult.reason,
1674
- summary: text,
1675
- sessionKey: cronRunSessionKey
1676
- };
1677
- }
1678
- if (abortSignal?.aborted) return {
1679
- status: "error",
1680
- error: timeoutErrorMessage()
1681
- };
1682
- state.deps.requestHeartbeat({
1683
- source: "cron",
1684
- intent: job.wakeMode === "now" ? "immediate" : "event",
1685
- reason: `cron:${job.id}`,
1686
- agentId: job.agentId,
1687
- sessionKey: cronRunSessionKey,
1688
- heartbeat: { target: "last" }
1689
- });
1690
- return {
1691
- status: "ok",
1692
- summary: text,
1693
- sessionKey: cronRunSessionKey
1694
- };
1695
- }
1696
- async function executeDetachedCronJob(state, job, abortSignal, resolveAbortError, options) {
1697
- if (job.payload.kind !== "agentTurn") {
1698
- const error = "isolated job requires payload.kind=agentTurn";
1699
- return {
1700
- status: "skipped",
1701
- error,
1702
- diagnostics: createCronRunDiagnosticsFromError("cron-preflight", error, {
1703
- severity: "warn",
1704
- nowMs: state.deps.nowMs
1705
- })
1706
- };
1707
- }
1708
- if (abortSignal?.aborted) {
1709
- const aborted = resolveAbortError();
1710
- return {
1711
- ...aborted,
1712
- diagnostics: createCronRunDiagnosticsFromError("cron-setup", aborted.error, { nowMs: state.deps.nowMs })
1713
- };
1714
- }
1715
- const res = await state.deps.runIsolatedAgentJob({
1716
- job,
1717
- message: job.payload.message,
1718
- abortSignal,
1719
- onExecutionStarted: options?.onExecutionStarted,
1720
- onExecutionPhase: options?.onExecutionPhase
1721
- });
1722
- if (abortSignal?.aborted) {
1723
- const error = abortErrorMessage(abortSignal);
1724
- return {
1725
- status: "error",
1726
- error,
1727
- diagnostics: createCronRunDiagnosticsFromError("cron-setup", error, { nowMs: state.deps.nowMs })
1728
- };
1729
- }
1730
- return {
1731
- status: res.status,
1732
- error: res.error,
1733
- summary: res.summary,
1734
- delivered: res.delivered,
1735
- deliveryAttempted: res.deliveryAttempted,
1736
- delivery: res.delivery,
1737
- sessionId: res.sessionId,
1738
- sessionKey: res.sessionKey,
1739
- diagnostics: res.diagnostics,
1740
- model: res.model,
1741
- provider: res.provider,
1742
- usage: res.usage
1743
- };
1744
- }
1745
- function emitJobFinished(state, job, result, runAtMs) {
1746
- emit(state, {
1747
- jobId: job.id,
1748
- action: "finished",
1749
- job,
1750
- status: result.status,
1751
- error: result.error,
1752
- summary: result.summary,
1753
- diagnostics: result.diagnostics,
1754
- delivered: job.state.lastDelivered,
1755
- deliveryStatus: job.state.lastDeliveryStatus,
1756
- deliveryError: job.state.lastDeliveryError,
1757
- failureNotificationDelivery: failureNotificationDeliveryFromJobState(job),
1758
- delivery: result.delivery,
1759
- sessionId: result.sessionId,
1760
- sessionKey: result.sessionKey,
1761
- runAtMs,
1762
- durationMs: job.state.lastDurationMs,
1763
- nextRunAtMs: job.state.nextRunAtMs,
1764
- model: result.model,
1765
- provider: result.provider,
1766
- usage: result.usage
1767
- });
1768
- }
1769
- function wake(state, opts) {
1770
- const text = opts.text.trim();
1771
- if (!text) return { ok: false };
1772
- const sessionKey = opts.sessionKey?.trim() || void 0;
1773
- if (sessionKey && isSubagentSessionKey(sessionKey)) return {
1774
- ok: false,
1775
- reason: "unwakeable-session-key"
1776
- };
1777
- state.deps.enqueueSystemEvent(text, sessionKey ? { sessionKey } : void 0);
1778
- if (opts.mode === "now") state.deps.requestHeartbeat({
1779
- source: "manual",
1780
- intent: "immediate",
1781
- reason: "wake",
1782
- ...sessionKey ? { sessionKey } : {}
1783
- });
1784
- else if (sessionKey) state.deps.requestHeartbeat({
1785
- source: "manual",
1786
- intent: "immediate",
1787
- reason: "wake",
1788
- sessionKey
1789
- });
1790
- return { ok: true };
1791
- }
1792
- function stopTimer(state) {
1793
- if (state.timer) clearTimeout(state.timer);
1794
- state.timer = null;
1795
- }
1796
- function emit(state, evt) {
1797
- try {
1798
- state.deps.onEvent?.(evt);
1799
- } catch {}
1800
- }
1801
- //#endregion
1802
- //#region src/cron/service/ops.ts
1803
- const STARTUP_INTERRUPTED_ERROR = "cron: job interrupted by gateway restart";
1804
- function resolveInterruptedStartupFailureNotificationStatus(params) {
1805
- if (params.job.delivery?.bestEffort === true) return "not-requested";
1806
- if (resolveFailureDestination(params.job, params.state.deps.cronConfig?.failureDestination)) return "unknown";
1807
- const primaryPlan = resolveCronDeliveryPlan(params.job);
1808
- return primaryPlan.mode === "announce" && primaryPlan.requested ? "unknown" : "not-requested";
1809
- }
1810
- function markInterruptedStartupRun(params) {
1811
- const { job, runningAtMs, nowMs } = params;
1812
- const failureNotificationStatus = resolveInterruptedStartupFailureNotificationStatus({
1813
- state: params.state,
1814
- job
1815
- });
1816
- const previousErrors = typeof job.state.consecutiveErrors === "number" && Number.isFinite(job.state.consecutiveErrors) ? Math.max(0, Math.floor(job.state.consecutiveErrors)) : 0;
1817
- params.state.deps.log.warn({
1818
- jobId: job.id,
1819
- runningAtMs
1820
- }, "cron: marking interrupted running job failed on startup");
1821
- job.state.runningAtMs = void 0;
1822
- job.state.lastRunAtMs = runningAtMs;
1823
- job.state.lastRunStatus = "error";
1824
- job.state.lastStatus = "error";
1825
- job.state.lastError = STARTUP_INTERRUPTED_ERROR;
1826
- job.state.lastDurationMs = Math.max(0, nowMs - runningAtMs);
1827
- job.state.consecutiveErrors = previousErrors + 1;
1828
- job.state.lastDelivered = false;
1829
- job.state.lastDeliveryStatus = "unknown";
1830
- job.state.lastDeliveryError = STARTUP_INTERRUPTED_ERROR;
1831
- job.state.lastFailureNotificationDelivered = void 0;
1832
- job.state.lastFailureNotificationDeliveryStatus = failureNotificationStatus;
1833
- job.state.lastFailureNotificationDeliveryError = void 0;
1834
- job.state.nextRunAtMs = void 0;
1835
- job.updatedAtMs = nowMs;
1836
- if (job.schedule.kind === "at") job.enabled = false;
1837
- return {
1838
- jobId: job.id,
1839
- runAtMs: runningAtMs,
1840
- durationMs: job.state.lastDurationMs
1841
- };
1842
- }
1843
- function mergeManualRunSnapshotAfterReload(params) {
1844
- if (!params.state.store) return;
1845
- if (params.removed) {
1846
- params.state.store.jobs = params.state.store.jobs.filter((job) => job.id !== params.jobId);
1847
- return;
1848
- }
1849
- if (!params.snapshot) return;
1850
- const reloaded = params.state.store.jobs.find((job) => job.id === params.jobId);
1851
- if (!reloaded) return;
1852
- reloaded.enabled = params.snapshot.enabled;
1853
- reloaded.updatedAtMs = params.snapshot.updatedAtMs;
1854
- reloaded.state = params.snapshot.state;
1855
- }
1856
- async function ensureLoadedForRead(state) {
1857
- await ensureLoaded(state, { skipRecompute: true });
1858
- if (!state.store) return;
1859
- if (recomputeNextRunsForMaintenance(state)) await persist(state);
1860
- }
1861
- async function start(state) {
1862
- if (!state.deps.cronEnabled) {
1863
- state.deps.log.info({ enabled: false }, "cron: disabled");
1864
- return;
1865
- }
1866
- const interruptedJobIds = /* @__PURE__ */ new Set();
1867
- const interruptedRuns = [];
1868
- let markedAnyInterruptedRun = false;
1869
- await locked(state, async () => {
1870
- await ensureLoaded(state, { skipRecompute: true });
1871
- const jobs = state.store?.jobs ?? [];
1872
- for (const job of jobs) {
1873
- job.state ??= {};
1874
- if (typeof job.state.runningAtMs === "number") {
1875
- const nowMs = state.deps.nowMs();
1876
- const interrupted = markInterruptedStartupRun({
1877
- state,
1878
- job,
1879
- runningAtMs: job.state.runningAtMs,
1880
- nowMs
1881
- });
1882
- interruptedJobIds.add(job.id);
1883
- interruptedRuns.push(interrupted);
1884
- markedAnyInterruptedRun = true;
1885
- }
1886
- }
1887
- if (markedAnyInterruptedRun || jobs.length > 0) await persist(state, markedAnyInterruptedRun ? void 0 : { stateOnly: true });
1888
- });
1889
- await runMissedJobs(state, {
1890
- skipJobIds: interruptedJobIds.size > 0 ? interruptedJobIds : void 0,
1891
- deferAgentTurnJobs: true
1892
- });
1893
- await locked(state, async () => {
1894
- await ensureLoaded(state, { skipRecompute: true });
1895
- if (recomputeNextRunsForMaintenance(state, { recomputeExpired: true })) await persist(state);
1896
- for (const interrupted of interruptedRuns) {
1897
- const job = state.store?.jobs.find((entry) => entry.id === interrupted.jobId);
1898
- emit(state, {
1899
- jobId: interrupted.jobId,
1900
- action: "finished",
1901
- job,
1902
- status: "error",
1903
- error: STARTUP_INTERRUPTED_ERROR,
1904
- delivered: false,
1905
- deliveryStatus: "unknown",
1906
- deliveryError: STARTUP_INTERRUPTED_ERROR,
1907
- failureNotificationDelivery: job ? failureNotificationDeliveryFromJobState(job) : void 0,
1908
- runAtMs: interrupted.runAtMs,
1909
- durationMs: interrupted.durationMs,
1910
- nextRunAtMs: job?.state.nextRunAtMs
1911
- });
1912
- }
1913
- armTimer(state);
1914
- state.deps.log.info({
1915
- enabled: true,
1916
- jobs: state.store?.jobs.length ?? 0,
1917
- nextWakeAtMs: nextWakeAtMs(state) ?? null
1918
- }, "cron: started");
1919
- });
1920
- }
1921
- function stop(state) {
1922
- stopTimer(state);
1923
- }
1924
- async function status(state) {
1925
- return await locked(state, async () => {
1926
- await ensureLoadedForRead(state);
1927
- return {
1928
- enabled: state.deps.cronEnabled,
1929
- storePath: state.deps.storePath,
1930
- jobs: state.store?.jobs.length ?? 0,
1931
- nextWakeAtMs: state.deps.cronEnabled ? nextWakeAtMs(state) ?? null : null
1932
- };
1933
- });
1934
- }
1935
- async function list(state, opts) {
1936
- return await locked(state, async () => {
1937
- await ensureLoadedForRead(state);
1938
- const includeDisabled = opts?.includeDisabled === true;
1939
- return (state.store?.jobs ?? []).filter((j) => includeDisabled || isJobEnabled(j)).toSorted((a, b) => (a.state.nextRunAtMs ?? 0) - (b.state.nextRunAtMs ?? 0));
1940
- });
1941
- }
1942
- async function readJob(state, id) {
1943
- return await locked(state, async () => {
1944
- await ensureLoadedForRead(state);
1945
- return state.store?.jobs.find((job) => job.id === id);
1946
- });
1947
- }
1948
- function resolveEnabledFilter(opts) {
1949
- if (opts?.enabled === "all" || opts?.enabled === "enabled" || opts?.enabled === "disabled") return opts.enabled;
1950
- return opts?.includeDisabled ? "all" : "enabled";
1951
- }
1952
- function resolveScheduleKindFilter(opts) {
1953
- if (opts?.scheduleKind === "all" || opts?.scheduleKind === "at" || opts?.scheduleKind === "every" || opts?.scheduleKind === "cron") return opts.scheduleKind;
1954
- return "all";
1955
- }
1956
- function resolveLastRunStatusFilter(opts) {
1957
- if (opts?.lastRunStatus === "all" || opts?.lastRunStatus === "ok" || opts?.lastRunStatus === "error" || opts?.lastRunStatus === "skipped" || opts?.lastRunStatus === "unknown") return opts.lastRunStatus;
1958
- return "all";
1959
- }
1960
- function resolveJobLastRunStatus(job) {
1961
- return job.state.lastRunStatus ?? job.state.lastStatus ?? "unknown";
1962
- }
1963
- function sortJobs(jobs, sortBy, sortDir) {
1964
- const dir = sortDir === "desc" ? -1 : 1;
1965
- return jobs.toSorted((a, b) => {
1966
- let cmp = 0;
1967
- if (sortBy === "name") {
1968
- const aName = typeof a.name === "string" ? a.name : "";
1969
- const bName = typeof b.name === "string" ? b.name : "";
1970
- cmp = aName.localeCompare(bName, void 0, { sensitivity: "base" });
1971
- } else if (sortBy === "updatedAtMs") cmp = a.updatedAtMs - b.updatedAtMs;
1972
- else {
1973
- const aNext = a.state.nextRunAtMs;
1974
- const bNext = b.state.nextRunAtMs;
1975
- if (typeof aNext === "number" && typeof bNext === "number") cmp = aNext - bNext;
1976
- else if (typeof aNext === "number") cmp = -1;
1977
- else if (typeof bNext === "number") cmp = 1;
1978
- else cmp = 0;
1979
- }
1980
- if (cmp !== 0) return cmp * dir;
1981
- const aId = typeof a.id === "string" ? a.id : "";
1982
- const bId = typeof b.id === "string" ? b.id : "";
1983
- return aId.localeCompare(bId);
1984
- });
1985
- }
1986
- function resolveEffectiveJobAgentId(job, defaultAgentId) {
1987
- return normalizeOptionalAgentId(job.agentId) ?? normalizeOptionalAgentId(defaultAgentId) ?? "main";
1988
- }
1989
- async function listPage(state, opts) {
1990
- return await locked(state, async () => {
1991
- await ensureLoadedForRead(state);
1992
- const query = normalizeLowercaseStringOrEmpty(opts?.query);
1993
- const enabledFilter = resolveEnabledFilter(opts);
1994
- const scheduleKindFilter = resolveScheduleKindFilter(opts);
1995
- const lastRunStatusFilter = resolveLastRunStatusFilter(opts);
1996
- const sortBy = opts?.sortBy ?? "nextRunAtMs";
1997
- const sortDir = opts?.sortDir ?? "asc";
1998
- const requestedAgentId = normalizeOptionalAgentId(opts?.agentId);
1999
- const sorted = sortJobs((state.store?.jobs ?? []).filter((job) => {
2000
- if (enabledFilter === "enabled" && !isJobEnabled(job)) return false;
2001
- if (enabledFilter === "disabled" && isJobEnabled(job)) return false;
2002
- if (requestedAgentId && resolveEffectiveJobAgentId(job, state.deps.defaultAgentId) !== requestedAgentId) return false;
2003
- if (scheduleKindFilter !== "all" && job.schedule.kind !== scheduleKindFilter) return false;
2004
- if (lastRunStatusFilter !== "all" && resolveJobLastRunStatus(job) !== lastRunStatusFilter) return false;
2005
- if (!query) return true;
2006
- return normalizeLowercaseStringOrEmpty([
2007
- job.id,
2008
- job.name,
2009
- job.description ?? "",
2010
- job.agentId ?? ""
2011
- ].join(" ")).includes(query);
2012
- }), sortBy, sortDir);
2013
- const total = sorted.length;
2014
- const offset = Math.max(0, Math.min(total, Math.floor(opts?.offset ?? 0)));
2015
- const defaultLimit = total === 0 ? 50 : total;
2016
- const limit = Math.max(1, Math.min(200, Math.floor(opts?.limit ?? defaultLimit)));
2017
- const jobs = sorted.slice(offset, offset + limit);
2018
- const nextOffset = offset + jobs.length;
2019
- return {
2020
- jobs,
2021
- total,
2022
- offset,
2023
- limit,
2024
- hasMore: nextOffset < total,
2025
- nextOffset: nextOffset < total ? nextOffset : null
2026
- };
2027
- });
2028
- }
2029
- async function add(state, input) {
2030
- return await locked(state, async () => {
2031
- warnIfDisabled(state, "add");
2032
- await ensureLoaded(state);
2033
- const job = createJob(state, input);
2034
- state.store?.jobs.push(job);
2035
- recomputeNextRuns(state);
2036
- await persist(state);
2037
- armTimer(state);
2038
- state.deps.log.info({
2039
- jobId: job.id,
2040
- jobName: job.name,
2041
- nextRunAtMs: job.state.nextRunAtMs,
2042
- schedulerNextWakeAtMs: nextWakeAtMs(state) ?? null,
2043
- timerArmed: state.timer !== null,
2044
- cronEnabled: state.deps.cronEnabled
2045
- }, "cron: job added");
2046
- emit(state, {
2047
- jobId: job.id,
2048
- action: "added",
2049
- job,
2050
- nextRunAtMs: job.state.nextRunAtMs
2051
- });
2052
- return job;
2053
- });
2054
- }
2055
- async function update(state, id, patch) {
2056
- return await locked(state, async () => {
2057
- warnIfDisabled(state, "update");
2058
- await ensureLoaded(state, { skipRecompute: true });
2059
- const job = findJobOrThrow(state, id);
2060
- const now = state.deps.nowMs();
2061
- const nextJob = structuredClone(job);
2062
- applyJobPatch(nextJob, patch, { defaultAgentId: state.deps.defaultAgentId });
2063
- if (nextJob.schedule.kind === "every") {
2064
- const anchor = nextJob.schedule.anchorMs;
2065
- if (typeof anchor !== "number" || !Number.isFinite(anchor)) {
2066
- const fallbackAnchorMs = patch.schedule?.kind === "every" ? now : typeof nextJob.createdAtMs === "number" && Number.isFinite(nextJob.createdAtMs) ? nextJob.createdAtMs : now;
2067
- nextJob.schedule = {
2068
- ...nextJob.schedule,
2069
- anchorMs: Math.max(0, Math.floor(fallbackAnchorMs))
2070
- };
2071
- }
2072
- }
2073
- const scheduleChanged = patch.schedule !== void 0;
2074
- const enabledChanged = patch.enabled !== void 0;
2075
- if (scheduleChanged && nextJob.schedule.kind === "cron" && !isJobEnabled(nextJob)) computeJobNextRunAtMs({
2076
- ...nextJob,
2077
- enabled: true
2078
- }, now);
2079
- nextJob.updatedAtMs = now;
2080
- if (scheduleChanged || enabledChanged) if (isJobEnabled(nextJob)) nextJob.state.nextRunAtMs = computeJobNextRunAtMs(nextJob, now);
2081
- else {
2082
- nextJob.state.nextRunAtMs = void 0;
2083
- nextJob.state.runningAtMs = void 0;
2084
- }
2085
- else if (isJobEnabled(nextJob) && !hasScheduledNextRunAtMs(nextJob.state.nextRunAtMs)) nextJob.state.nextRunAtMs = computeJobNextRunAtMs(nextJob, now);
2086
- if (state.store) {
2087
- const index = state.store.jobs.findIndex((entry) => entry.id === id);
2088
- if (index >= 0) state.store.jobs[index] = nextJob;
2089
- }
2090
- await persist(state);
2091
- armTimer(state);
2092
- emit(state, {
2093
- jobId: id,
2094
- action: "updated",
2095
- job: nextJob,
2096
- nextRunAtMs: nextJob.state.nextRunAtMs
2097
- });
2098
- return nextJob;
2099
- });
2100
- }
2101
- async function remove(state, id) {
2102
- return await locked(state, async () => {
2103
- warnIfDisabled(state, "remove");
2104
- await ensureLoaded(state);
2105
- const before = state.store?.jobs.length ?? 0;
2106
- if (!state.store) return {
2107
- ok: false,
2108
- removed: false
2109
- };
2110
- const removedJob = state.store.jobs.find((j) => j.id === id);
2111
- state.store.jobs = state.store.jobs.filter((j) => j.id !== id);
2112
- const removed = (state.store.jobs.length ?? 0) !== before;
2113
- await persist(state);
2114
- armTimer(state);
2115
- if (removed) emit(state, {
2116
- jobId: id,
2117
- action: "removed",
2118
- job: removedJob
2119
- });
2120
- return {
2121
- ok: true,
2122
- removed
2123
- };
2124
- });
2125
- }
2126
- let nextManualRunId = 1;
2127
- async function skipInvalidPersistedManualRun(params) {
2128
- const endedAt = params.state.deps.nowMs();
2129
- const errorText = normalizeCronRunErrorText(params.error);
2130
- const diagnostics = createCronRunDiagnosticsFromError("cron-preflight", errorText, {
2131
- severity: "warn",
2132
- nowMs: params.state.deps.nowMs
2133
- });
2134
- const shouldDelete = applyJobResult(params.state, params.job, {
2135
- status: "skipped",
2136
- error: errorText,
2137
- diagnostics,
2138
- startedAt: endedAt,
2139
- endedAt
2140
- }, { preserveSchedule: params.mode === "force" });
2141
- emit(params.state, {
2142
- jobId: params.job.id,
2143
- action: "finished",
2144
- status: "skipped",
2145
- error: errorText,
2146
- diagnostics,
2147
- runAtMs: endedAt,
2148
- durationMs: params.job.state.lastDurationMs,
2149
- nextRunAtMs: params.job.state.nextRunAtMs,
2150
- deliveryStatus: params.job.state.lastDeliveryStatus,
2151
- deliveryError: params.job.state.lastDeliveryError,
2152
- failureNotificationDelivery: failureNotificationDeliveryFromJobState(params.job)
2153
- });
2154
- if (shouldDelete && params.state.store) {
2155
- params.state.store.jobs = params.state.store.jobs.filter((entry) => entry.id !== params.job.id);
2156
- emit(params.state, {
2157
- jobId: params.job.id,
2158
- action: "removed"
2159
- });
2160
- }
2161
- recomputeNextRunsForMaintenance(params.state, { recomputeExpired: true });
2162
- await persist(params.state);
2163
- armTimer(params.state);
2164
- }
2165
- function tryCreateManualTaskRun(params) {
2166
- const runId = createCronExecutionId(params.job.id, params.startedAt);
2167
- try {
2168
- createRunningTaskRun({
2169
- runtime: "cron",
2170
- sourceId: params.job.id,
2171
- ownerKey: "",
2172
- scopeKind: "system",
2173
- childSessionKey: params.job.sessionKey,
2174
- agentId: params.job.agentId,
2175
- runId,
2176
- label: params.job.name,
2177
- task: params.job.name || params.job.id,
2178
- deliveryStatus: "not_applicable",
2179
- notifyPolicy: "silent",
2180
- startedAt: params.startedAt,
2181
- lastEventAt: params.startedAt,
2182
- progressSummary: CRON_TASK_RUNNING_PROGRESS_SUMMARY
2183
- });
2184
- return runId;
2185
- } catch (error) {
2186
- params.state.deps.log.warn({
2187
- jobId: params.job.id,
2188
- error
2189
- }, "cron: failed to create task ledger record");
2190
- return;
2191
- }
2192
- }
2193
- function tryFinishManualTaskRun(state, params) {
2194
- if (!params.taskRunId) return;
2195
- try {
2196
- if (params.coreResult.status === "ok" || params.coreResult.status === "skipped") {
2197
- completeTaskRunByRunId({
2198
- runId: params.taskRunId,
2199
- runtime: "cron",
2200
- endedAt: params.endedAt,
2201
- lastEventAt: params.endedAt,
2202
- terminalSummary: params.coreResult.summary ?? void 0
2203
- });
2204
- return;
2205
- }
2206
- failTaskRunByRunId({
2207
- runId: params.taskRunId,
2208
- runtime: "cron",
2209
- status: normalizeCronRunErrorText(params.coreResult.error) === "cron: job execution timed out" ? "timed_out" : "failed",
2210
- endedAt: params.endedAt,
2211
- lastEventAt: params.endedAt,
2212
- error: params.coreResult.status === "error" ? normalizeCronRunErrorText(params.coreResult.error) : void 0,
2213
- terminalSummary: params.coreResult.summary ?? void 0
2214
- });
2215
- } catch (error) {
2216
- state.deps.log.warn({
2217
- runId: params.taskRunId,
2218
- jobStatus: params.coreResult.status,
2219
- error
2220
- }, "cron: failed to update task ledger record");
2221
- }
2222
- }
2223
- async function inspectManualRunPreflight(state, id, mode) {
2224
- return await locked(state, async () => {
2225
- warnIfDisabled(state, "run");
2226
- await ensureLoaded(state, { skipRecompute: true });
2227
- recomputeNextRunsForMaintenance(state);
2228
- const job = findJobOrThrow(state, id);
2229
- try {
2230
- assertSupportedJobSpec(job);
2231
- } catch (error) {
2232
- await skipInvalidPersistedManualRun({
2233
- state,
2234
- job,
2235
- mode,
2236
- error
2237
- });
2238
- return {
2239
- ok: true,
2240
- ran: false,
2241
- reason: "invalid-spec"
2242
- };
2243
- }
2244
- if (typeof job.state.runningAtMs === "number") return {
2245
- ok: true,
2246
- ran: false,
2247
- reason: "already-running"
2248
- };
2249
- const now = state.deps.nowMs();
2250
- if (!isJobDue(job, now, { forced: mode === "force" })) return {
2251
- ok: true,
2252
- ran: false,
2253
- reason: "not-due"
2254
- };
2255
- return {
2256
- ok: true,
2257
- runnable: true,
2258
- job,
2259
- now
2260
- };
2261
- });
2262
- }
2263
- async function inspectManualRunDisposition(state, id, mode) {
2264
- const result = await inspectManualRunPreflight(state, id, mode);
2265
- if (!result.ok) return result;
2266
- if ("reason" in result) return result;
2267
- return {
2268
- ok: true,
2269
- runnable: true
2270
- };
2271
- }
2272
- async function prepareManualRun(state, id, mode, opts) {
2273
- const preflight = await inspectManualRunPreflight(state, id, mode);
2274
- if (!preflight.ok) return preflight;
2275
- if ("reason" in preflight) return {
2276
- ok: true,
2277
- ran: false,
2278
- reason: preflight.reason
2279
- };
2280
- return await locked(state, async () => {
2281
- const job = findJobOrThrow(state, id);
2282
- if (typeof job.state.runningAtMs === "number") return {
2283
- ok: true,
2284
- ran: false,
2285
- reason: "already-running"
2286
- };
2287
- job.state.runningAtMs = preflight.now;
2288
- job.state.lastError = void 0;
2289
- await persist(state);
2290
- emit(state, {
2291
- jobId: job.id,
2292
- action: "started",
2293
- job,
2294
- runAtMs: preflight.now
2295
- });
2296
- const taskRunId = tryCreateManualTaskRun({
2297
- state,
2298
- job,
2299
- startedAt: preflight.now
2300
- });
2301
- markCronJobActive(job.id);
2302
- const executionJob = structuredClone(job);
2303
- return {
2304
- ok: true,
2305
- ran: true,
2306
- jobId: job.id,
2307
- runId: opts?.runId ?? taskRunId,
2308
- taskRunId,
2309
- startedAt: preflight.now,
2310
- executionJob
2311
- };
2312
- });
2313
- }
2314
- async function finishPreparedManualRun(state, prepared, mode) {
2315
- const executionJob = prepared.executionJob;
2316
- const startedAt = prepared.startedAt;
2317
- const jobId = prepared.jobId;
2318
- const taskRunId = prepared.taskRunId;
2319
- const runId = prepared.runId;
2320
- try {
2321
- let coreResult;
2322
- try {
2323
- coreResult = await executeJobCoreWithTimeout(state, executionJob);
2324
- } catch (err) {
2325
- coreResult = {
2326
- status: "error",
2327
- error: normalizeCronRunErrorText(err)
2328
- };
2329
- }
2330
- const endedAt = state.deps.nowMs();
2331
- tryFinishManualTaskRun(state, {
2332
- taskRunId,
2333
- coreResult,
2334
- endedAt
2335
- });
2336
- await locked(state, async () => {
2337
- await ensureLoaded(state, { skipRecompute: true });
2338
- const job = state.store?.jobs.find((entry) => entry.id === jobId);
2339
- if (!job) return;
2340
- const shouldDelete = applyJobResult(state, job, {
2341
- status: coreResult.status,
2342
- error: coreResult.error,
2343
- diagnostics: coreResult.diagnostics,
2344
- delivered: coreResult.delivered,
2345
- provider: coreResult.provider,
2346
- startedAt,
2347
- endedAt
2348
- }, { preserveSchedule: mode === "force" });
2349
- emit(state, {
2350
- jobId: job.id,
2351
- action: "finished",
2352
- job,
2353
- status: coreResult.status,
2354
- error: coreResult.error,
2355
- summary: coreResult.summary,
2356
- diagnostics: coreResult.diagnostics,
2357
- delivered: job.state.lastDelivered,
2358
- deliveryStatus: job.state.lastDeliveryStatus,
2359
- deliveryError: job.state.lastDeliveryError,
2360
- failureNotificationDelivery: failureNotificationDeliveryFromJobState(job),
2361
- delivery: coreResult.delivery,
2362
- sessionId: coreResult.sessionId,
2363
- sessionKey: coreResult.sessionKey,
2364
- runId,
2365
- runAtMs: startedAt,
2366
- durationMs: job.state.lastDurationMs,
2367
- nextRunAtMs: job.state.nextRunAtMs,
2368
- model: coreResult.model,
2369
- provider: coreResult.provider,
2370
- usage: coreResult.usage
2371
- });
2372
- if (shouldDelete && state.store) {
2373
- state.store.jobs = state.store.jobs.filter((entry) => entry.id !== job.id);
2374
- emit(state, {
2375
- jobId: job.id,
2376
- action: "removed",
2377
- job
2378
- });
2379
- }
2380
- const postRunSnapshot = shouldDelete ? null : {
2381
- enabled: job.enabled,
2382
- updatedAtMs: job.updatedAtMs,
2383
- state: structuredClone(job.state)
2384
- };
2385
- const postRunRemoved = shouldDelete;
2386
- await ensureLoaded(state, {
2387
- forceReload: true,
2388
- skipRecompute: true
2389
- });
2390
- mergeManualRunSnapshotAfterReload({
2391
- state,
2392
- jobId,
2393
- snapshot: postRunSnapshot,
2394
- removed: postRunRemoved
2395
- });
2396
- recomputeNextRunsForMaintenance(state, { recomputeExpired: true });
2397
- await persist(state);
2398
- armTimer(state);
2399
- });
2400
- } finally {
2401
- clearCronJobActive(jobId);
2402
- }
2403
- }
2404
- async function run(state, id, mode, opts) {
2405
- const prepared = await prepareManualRun(state, id, mode, opts);
2406
- if (!prepared.ok || !prepared.ran) return prepared;
2407
- await finishPreparedManualRun(state, prepared, mode);
2408
- return {
2409
- ok: true,
2410
- ran: true
2411
- };
2412
- }
2413
- async function enqueueRun(state, id, mode) {
2414
- const disposition = await inspectManualRunDisposition(state, id, mode);
2415
- if (!disposition.ok || !("runnable" in disposition && disposition.runnable)) return disposition;
2416
- const runId = `manual:${id}:${state.deps.nowMs()}:${nextManualRunId++}`;
2417
- enqueueCommandInLane("cron", async () => {
2418
- const result = await run(state, id, mode, { runId });
2419
- if (result.ok && "ran" in result && !result.ran) state.deps.log.info({
2420
- jobId: id,
2421
- runId,
2422
- reason: result.reason
2423
- }, "cron: queued manual run skipped before execution");
2424
- return result;
2425
- }, {
2426
- warnAfterMs: 5e3,
2427
- onWait: (waitMs, queuedAhead) => {
2428
- state.deps.log.warn({
2429
- jobId: id,
2430
- runId,
2431
- waitMs,
2432
- queuedAhead
2433
- }, "cron: queued manual run waiting for an execution slot");
2434
- }
2435
- }).catch((err) => {
2436
- state.deps.log.error({
2437
- jobId: id,
2438
- runId,
2439
- err: String(err)
2440
- }, "cron: queued manual run background execution failed");
2441
- });
2442
- return {
2443
- ok: true,
2444
- enqueued: true,
2445
- runId
2446
- };
2447
- }
2448
- function wakeNow(state, opts) {
2449
- return wake(state, opts);
2450
- }
2451
- //#endregion
2452
- //#region src/cron/service/state.ts
2453
- function createCronServiceState(deps) {
2454
- return {
2455
- deps: {
2456
- ...deps,
2457
- nowMs: deps.nowMs ?? (() => Date.now())
2458
- },
2459
- store: null,
2460
- timer: null,
2461
- running: false,
2462
- op: Promise.resolve(),
2463
- warnedDisabled: false,
2464
- warnedMissingSessionTargetJobIds: /* @__PURE__ */ new Set(),
2465
- warnedInvalidPersistedJobKeys: /* @__PURE__ */ new Set(),
2466
- pendingQuarantineConfigJobs: [],
2467
- lastQuarantineFailureWarnKey: null,
2468
- storeLoadedAtMs: null,
2469
- storeFileMtimeMs: null
2470
- };
2471
- }
2472
- //#endregion
2473
- //#region src/cron/service.ts
2474
- var CronService = class {
2475
- constructor(deps) {
2476
- this.state = createCronServiceState(deps);
2477
- }
2478
- async start() {
2479
- await start(this.state);
2480
- }
2481
- stop() {
2482
- stop(this.state);
2483
- }
2484
- async status() {
2485
- return await status(this.state);
2486
- }
2487
- async list(opts) {
2488
- return await list(this.state, opts);
2489
- }
2490
- async listPage(opts) {
2491
- return await listPage(this.state, opts);
2492
- }
2493
- async add(input) {
2494
- return await add(this.state, input);
2495
- }
2496
- async update(id, patch) {
2497
- return await update(this.state, id, patch);
2498
- }
2499
- async remove(id) {
2500
- return await remove(this.state, id);
2501
- }
2502
- async run(id, mode) {
2503
- return await run(this.state, id, mode);
2504
- }
2505
- async enqueueRun(id, mode) {
2506
- const result = await enqueueRun(this.state, id, mode);
2507
- if (result.ok && "runnable" in result) throw new Error("cron enqueueRun returned unresolved runnable disposition");
2508
- return result;
2509
- }
2510
- getJob(id) {
2511
- return this.state.store?.jobs.find((job) => job.id === id);
2512
- }
2513
- async readJob(id) {
2514
- return await readJob(this.state, id);
2515
- }
2516
- getDefaultAgentId() {
2517
- return this.state.deps.defaultAgentId;
2518
- }
2519
- wake(opts) {
2520
- return wakeNow(this.state, opts);
2521
- }
2522
- };
2523
- //#endregion
2524
- //#region src/cron/delivery.ts
2525
- const FAILURE_NOTIFICATION_TIMEOUT_MS = 3e4;
2526
- const cronDeliveryLogger = getChildLogger({ subsystem: "cron-delivery" });
2527
- async function resolveCronAnnounceDelivery(params) {
2528
- const resolvedTarget = await resolveDeliveryTarget(params.cfg, params.agentId, {
2529
- channel: params.target.channel,
2530
- to: params.target.to,
2531
- accountId: params.target.accountId,
2532
- sessionKey: params.target.sessionKey
2533
- });
2534
- if (!resolvedTarget.ok) return {
2535
- ok: false,
2536
- error: resolvedTarget.error
2537
- };
2538
- const identity = resolveAgentOutboundIdentity(params.cfg, params.agentId);
2539
- return {
2540
- ok: true,
2541
- resolvedTarget,
2542
- session: buildOutboundSessionContext({
2543
- cfg: params.cfg,
2544
- agentId: params.agentId,
2545
- sessionKey: resolveCronNotificationSessionKey({
2546
- jobId: params.jobId,
2547
- sessionKey: params.target.sessionKey
2548
- })
2549
- }),
2550
- identity
2551
- };
2552
- }
2553
- async function deliverCronAnnouncePayload(params) {
2554
- const send = await sendDurableMessageBatch({
2555
- cfg: params.cfg,
2556
- channel: params.delivery.resolvedTarget.channel,
2557
- to: params.delivery.resolvedTarget.to,
2558
- accountId: params.delivery.resolvedTarget.accountId,
2559
- threadId: params.delivery.resolvedTarget.threadId,
2560
- payloads: [{ text: params.message }],
2561
- session: params.delivery.session,
2562
- identity: params.delivery.identity,
2563
- bestEffort: false,
2564
- deps: createOutboundSendDeps(params.deps),
2565
- signal: params.abortSignal
2566
- });
2567
- if (send.status === "failed" || send.status === "partial_failed") throw send.error;
2568
- }
2569
- async function sendCronAnnouncePayloadStrict(params) {
2570
- const delivery = await resolveCronAnnounceDelivery(params);
2571
- if (!delivery.ok) throw delivery.error;
2572
- await deliverCronAnnouncePayload({
2573
- deps: params.deps,
2574
- cfg: params.cfg,
2575
- delivery,
2576
- message: params.message,
2577
- abortSignal: params.abortSignal
2578
- });
2579
- }
2580
- async function sendFailureNotificationAnnounce(deps, cfg, agentId, jobId, target, message) {
2581
- const delivery = await resolveCronAnnounceDelivery({
2582
- cfg,
2583
- agentId,
2584
- jobId,
2585
- target
2586
- });
2587
- if (!delivery.ok) {
2588
- cronDeliveryLogger.warn({ error: delivery.error.message }, "cron: failed to resolve failure destination target");
2589
- return;
2590
- }
2591
- const abortController = new AbortController();
2592
- const timeout = setTimeout(() => {
2593
- abortController.abort();
2594
- }, FAILURE_NOTIFICATION_TIMEOUT_MS);
2595
- try {
2596
- await deliverCronAnnouncePayload({
2597
- deps,
2598
- cfg,
2599
- delivery,
2600
- message,
2601
- abortSignal: abortController.signal
2602
- });
2603
- } catch (err) {
2604
- cronDeliveryLogger.warn({
2605
- err: formatErrorMessage(err),
2606
- channel: delivery.resolvedTarget.channel,
2607
- to: delivery.resolvedTarget.to
2608
- }, "cron: failure destination announce failed");
2609
- } finally {
2610
- clearTimeout(timeout);
2611
- }
2612
- }
2613
- //#endregion
2614
- //#region src/gateway/server-cron-notifications.ts
2615
- const CRON_WEBHOOK_TIMEOUT_MS = 1e4;
2616
- function redactWebhookUrl(url) {
2617
- try {
2618
- const parsed = new URL(url);
2619
- return `${parsed.origin}${parsed.pathname}`;
2620
- } catch {
2621
- return "<invalid-webhook-url>";
2622
- }
2623
- }
2624
- function resolveCronWebhookTarget(params) {
2625
- if (normalizeOptionalLowercaseString(params.delivery?.mode) === "webhook") {
2626
- const url = normalizeHttpWebhookUrl(params.delivery?.to);
2627
- return url ? {
2628
- url,
2629
- source: "delivery"
2630
- } : null;
2631
- }
2632
- if (params.legacyNotify) {
2633
- const legacyUrl = normalizeHttpWebhookUrl(params.legacyWebhook);
2634
- if (legacyUrl) return {
2635
- url: legacyUrl,
2636
- source: "legacy"
2637
- };
2638
- }
2639
- return null;
2640
- }
2641
- function buildCronWebhookHeaders(webhookToken) {
2642
- const headers = { "Content-Type": "application/json" };
2643
- if (webhookToken) headers.Authorization = `Bearer ${webhookToken}`;
2644
- return headers;
2645
- }
2646
- async function postCronWebhook(params) {
2647
- const abortController = new AbortController();
2648
- const timeout = setTimeout(() => {
2649
- abortController.abort();
2650
- }, CRON_WEBHOOK_TIMEOUT_MS);
2651
- try {
2652
- await (await fetchWithSsrFGuard({
2653
- url: params.webhookUrl,
2654
- init: {
2655
- method: "POST",
2656
- headers: buildCronWebhookHeaders(params.webhookToken),
2657
- body: JSON.stringify(params.payload),
2658
- signal: abortController.signal
2659
- }
2660
- })).release();
2661
- } catch (err) {
2662
- if (err instanceof SsrFBlockedError) params.logger.warn({
2663
- ...params.logContext,
2664
- reason: formatErrorMessage(err),
2665
- webhookUrl: redactWebhookUrl(params.webhookUrl)
2666
- }, params.blockedLog);
2667
- else params.logger.warn({
2668
- ...params.logContext,
2669
- err: formatErrorMessage(err),
2670
- webhookUrl: redactWebhookUrl(params.webhookUrl)
2671
- }, params.failedLog);
2672
- } finally {
2673
- clearTimeout(timeout);
2674
- }
2675
- }
2676
- async function sendGatewayCronFailureAlert(params) {
2677
- const { agentId, cfg: runtimeConfig } = params.resolveCronAgent(params.job.agentId);
2678
- const webhookToken = normalizeOptionalString(params.webhookToken);
2679
- if (params.mode === "webhook" && !params.to) {
2680
- params.logger.warn({ jobId: params.job.id }, "cron: failure alert webhook mode requires URL, skipping");
2681
- return;
2682
- }
2683
- if (params.mode === "webhook" && params.to) {
2684
- const webhookUrl = normalizeHttpWebhookUrl(params.to);
2685
- if (webhookUrl) await postCronWebhook({
2686
- webhookUrl,
2687
- webhookToken,
2688
- payload: {
2689
- jobId: params.job.id,
2690
- jobName: params.job.name,
2691
- message: params.text
2692
- },
2693
- logContext: { jobId: params.job.id },
2694
- blockedLog: "cron: failure alert webhook blocked by SSRF guard",
2695
- failedLog: "cron: failure alert webhook failed",
2696
- logger: params.logger
2697
- });
2698
- else params.logger.warn({
2699
- jobId: params.job.id,
2700
- webhookUrl: redactWebhookUrl(params.to)
2701
- }, "cron: failure alert webhook URL is invalid, skipping");
2702
- return;
2703
- }
2704
- const abortController = new AbortController();
2705
- await sendCronAnnouncePayloadStrict({
2706
- deps: params.deps,
2707
- cfg: runtimeConfig,
2708
- agentId,
2709
- jobId: params.job.id,
2710
- target: {
2711
- channel: params.channel,
2712
- to: params.to,
2713
- accountId: params.accountId,
2714
- sessionKey: resolveCronDeliverySessionKey(params.job)
2715
- },
2716
- message: params.text,
2717
- abortSignal: abortController.signal
2718
- });
2719
- }
2720
- function dispatchGatewayCronFinishedNotifications(params) {
2721
- const webhookToken = normalizeOptionalString(params.webhookToken);
2722
- const legacyWebhook = normalizeOptionalString(params.legacyWebhook);
2723
- const legacyNotify = params.job?.notify === true;
2724
- const webhookTarget = resolveCronWebhookTarget({
2725
- delivery: params.job?.delivery && typeof params.job.delivery.mode === "string" ? {
2726
- mode: params.job.delivery.mode,
2727
- to: params.job.delivery.to
2728
- } : void 0,
2729
- legacyNotify,
2730
- legacyWebhook
2731
- });
2732
- if (!webhookTarget && params.job?.delivery?.mode === "webhook") params.logger.warn({
2733
- jobId: params.evt.jobId,
2734
- deliveryTo: params.job.delivery.to
2735
- }, "cron: skipped webhook delivery, delivery.to must be a valid http(s) URL");
2736
- if (webhookTarget?.source === "legacy" && !params.warnedLegacyWebhookJobs.has(params.evt.jobId)) {
2737
- params.warnedLegacyWebhookJobs.add(params.evt.jobId);
2738
- params.logger.warn({
2739
- jobId: params.evt.jobId,
2740
- legacyWebhook: redactWebhookUrl(webhookTarget.url)
2741
- }, "cron: deprecated notify+cron.webhook fallback in use, migrate to delivery.mode=webhook with delivery.to");
2742
- }
2743
- if (webhookTarget && params.evt.summary) (async () => {
2744
- await postCronWebhook({
2745
- webhookUrl: webhookTarget.url,
2746
- webhookToken,
2747
- payload: params.evt,
2748
- logContext: { jobId: params.evt.jobId },
2749
- blockedLog: "cron: webhook delivery blocked by SSRF guard",
2750
- failedLog: "cron: webhook delivery failed",
2751
- logger: params.logger
2752
- });
2753
- })();
2754
- dispatchCronFailureDestinationNotifications({
2755
- evt: params.evt,
2756
- job: params.job,
2757
- deps: params.deps,
2758
- logger: params.logger,
2759
- resolveCronAgent: params.resolveCronAgent,
2760
- webhookToken,
2761
- globalFailureDestination: params.globalFailureDestination
2762
- });
2763
- }
2764
- function dispatchCronFailureDestinationNotifications(params) {
2765
- if (params.evt.status !== "error" || !params.job || params.job.delivery?.bestEffort === true) return;
2766
- const failureMessage = `Cron job "${params.job.name}" failed: ${params.evt.error ?? "unknown error"}`;
2767
- const failureDest = resolveFailureDestination(params.job, params.globalFailureDestination);
2768
- const deliverySessionKey = resolveCronDeliverySessionKey(params.job);
2769
- if (failureDest) {
2770
- const failurePayload = {
2771
- jobId: params.job.id,
2772
- jobName: params.job.name,
2773
- message: failureMessage,
2774
- status: params.evt.status,
2775
- error: params.evt.error,
2776
- runAtMs: params.evt.runAtMs,
2777
- durationMs: params.evt.durationMs,
2778
- nextRunAtMs: params.evt.nextRunAtMs
2779
- };
2780
- if (failureDest.mode === "webhook" && failureDest.to) {
2781
- const webhookUrl = normalizeHttpWebhookUrl(failureDest.to);
2782
- if (webhookUrl) (async () => {
2783
- await postCronWebhook({
2784
- webhookUrl,
2785
- webhookToken: params.webhookToken,
2786
- payload: failurePayload,
2787
- logContext: { jobId: params.evt.jobId },
2788
- blockedLog: "cron: failure destination webhook blocked by SSRF guard",
2789
- failedLog: "cron: failure destination webhook failed",
2790
- logger: params.logger
2791
- });
2792
- })();
2793
- else params.logger.warn({
2794
- jobId: params.evt.jobId,
2795
- webhookUrl: redactWebhookUrl(failureDest.to)
2796
- }, "cron: failure destination webhook URL is invalid, skipping");
2797
- return;
2798
- }
2799
- if (failureDest.mode === "announce") {
2800
- const { agentId, cfg: runtimeConfig } = params.resolveCronAgent(params.job.agentId);
2801
- sendFailureNotificationAnnounce(params.deps, runtimeConfig, agentId, params.job.id, {
2802
- channel: failureDest.channel,
2803
- to: failureDest.to,
2804
- accountId: failureDest.accountId,
2805
- sessionKey: deliverySessionKey
2806
- }, `⚠️ ${failureMessage}`);
2807
- }
2808
- return;
2809
- }
2810
- const primaryPlan = resolveCronDeliveryPlan(params.job);
2811
- if (primaryPlan.mode !== "announce" || !primaryPlan.requested) return;
2812
- const { agentId, cfg: runtimeConfig } = params.resolveCronAgent(params.job.agentId);
2813
- sendFailureNotificationAnnounce(params.deps, runtimeConfig, agentId, params.job.id, {
2814
- channel: primaryPlan.channel,
2815
- to: primaryPlan.to,
2816
- accountId: primaryPlan.accountId,
2817
- sessionKey: deliverySessionKey
2818
- }, `⚠️ ${failureMessage}`);
2819
- }
2820
- //#endregion
2821
- //#region src/gateway/server-cron.ts
2822
- /** Pick only the keys whose values are not `undefined` from an object. */
2823
- function pickDefined(obj, keys) {
2824
- const result = {};
2825
- for (const k of keys) if (obj[k] !== void 0) result[k] = obj[k];
2826
- return result;
2827
- }
2828
- function omitExplicitHeartbeatDestination(heartbeat) {
2829
- if (!heartbeat) return;
2830
- return {
2831
- ...heartbeat,
2832
- to: void 0,
2833
- accountId: void 0
2834
- };
2835
- }
2836
- function sanitizeCronHeartbeatOverride(heartbeat) {
2837
- return heartbeat?.target === "last" ? omitExplicitHeartbeatDestination(heartbeat) : heartbeat;
2838
- }
2839
- /** Map internal CronJob to the public plugin SDK shape. */
2840
- function toPluginCronJob(job) {
2841
- return {
2842
- id: job.id,
2843
- agentId: job.agentId,
2844
- name: job.name,
2845
- description: job.description,
2846
- enabled: job.enabled,
2847
- schedule: job.schedule ? structuredClone(job.schedule) : void 0,
2848
- sessionTarget: job.sessionTarget,
2849
- wakeMode: job.wakeMode,
2850
- payload: job.payload ? structuredClone(job.payload) : void 0,
2851
- state: {
2852
- nextRunAtMs: job.state.nextRunAtMs,
2853
- runningAtMs: job.state.runningAtMs,
2854
- lastRunAtMs: job.state.lastRunAtMs,
2855
- lastRunStatus: job.state.lastRunStatus,
2856
- lastError: job.state.lastError,
2857
- lastDurationMs: job.state.lastDurationMs,
2858
- lastDelivered: job.state.lastDelivered,
2859
- lastDeliveryStatus: job.state.lastDeliveryStatus,
2860
- lastDeliveryError: job.state.lastDeliveryError,
2861
- lastFailureNotificationDelivered: job.state.lastFailureNotificationDelivered,
2862
- lastFailureNotificationDeliveryStatus: job.state.lastFailureNotificationDeliveryStatus,
2863
- lastFailureNotificationDeliveryError: job.state.lastFailureNotificationDeliveryError
2864
- },
2865
- createdAtMs: job.createdAtMs,
2866
- updatedAtMs: job.updatedAtMs
2867
- };
2868
- }
2869
- function buildGatewayCronService(params) {
2870
- const cronLogger = getChildLogger({ module: "cron" });
2871
- const storePath = resolveCronStorePath(params.cfg.cron?.store);
2872
- const cronEnabled = process.env.FENGMING_SKIP_CRON !== "1" && params.cfg.cron?.enabled !== false;
2873
- const findAgentEntry = (cfg, agentId) => Array.isArray(cfg.agents?.list) ? cfg.agents.list.find((entry) => entry && typeof entry.id === "string" && normalizeAgentId(entry.id) === agentId) : void 0;
2874
- const hasConfiguredAgent = (cfg, agentId) => Boolean(findAgentEntry(cfg, agentId));
2875
- const mergeRuntimeAgentConfig = (runtimeConfig, requestedAgentId) => {
2876
- if (hasConfiguredAgent(runtimeConfig, requestedAgentId)) return runtimeConfig;
2877
- const fallbackAgentEntry = findAgentEntry(params.cfg, requestedAgentId);
2878
- if (!fallbackAgentEntry) return runtimeConfig;
2879
- const startupAgents = params.cfg.agents;
2880
- const runtimeAgents = runtimeConfig.agents;
2881
- return {
2882
- ...runtimeConfig,
2883
- agents: {
2884
- ...startupAgents,
2885
- ...runtimeAgents,
2886
- defaults: {
2887
- ...startupAgents?.defaults,
2888
- ...runtimeAgents?.defaults
2889
- },
2890
- list: [...runtimeAgents?.list ?? [], fallbackAgentEntry]
2891
- }
2892
- };
2893
- };
2894
- const resolveCronAgent = (requested) => {
2895
- const runtimeConfig = getRuntimeConfig();
2896
- const normalized = typeof requested === "string" && requested.trim() ? normalizeAgentId(requested) : void 0;
2897
- const effectiveConfig = normalized !== void 0 ? mergeRuntimeAgentConfig(runtimeConfig, normalized) : runtimeConfig;
2898
- return {
2899
- agentId: normalized !== void 0 && hasConfiguredAgent(effectiveConfig, normalized) ? normalized : resolveDefaultAgentId(effectiveConfig),
2900
- cfg: effectiveConfig
2901
- };
2902
- };
2903
- const resolveCronSessionKey = (params) => {
2904
- const requested = params.requestedSessionKey?.trim();
2905
- if (!requested) return resolveAgentMainSessionKey({
2906
- cfg: params.runtimeConfig,
2907
- agentId: params.agentId
2908
- });
2909
- const candidate = toAgentStoreSessionKey({
2910
- agentId: params.agentId,
2911
- requestKey: requested,
2912
- mainKey: params.runtimeConfig.session?.mainKey
2913
- });
2914
- const canonical = canonicalizeMainSessionAlias({
2915
- cfg: params.runtimeConfig,
2916
- agentId: params.agentId,
2917
- sessionKey: candidate
2918
- });
2919
- if (canonical !== "global") {
2920
- if (normalizeAgentId(resolveAgentIdFromSessionKey(canonical)) !== normalizeAgentId(params.agentId)) return resolveAgentMainSessionKey({
2921
- cfg: params.runtimeConfig,
2922
- agentId: params.agentId
2923
- });
2924
- }
2925
- return resolveMainScopedEventSessionKey({
2926
- cfg: params.runtimeConfig,
2927
- sessionKey: canonical,
2928
- agentId: params.agentId
2929
- }) ?? canonical;
2930
- };
2931
- const resolveCronTarget = (opts) => {
2932
- const requestedAgentId = typeof opts?.agentId === "string" && opts.agentId.trim() ? normalizeAgentId(opts.agentId) : void 0;
2933
- const requestedSessionKey = typeof opts?.sessionKey === "string" && opts.sessionKey.trim() ? opts.sessionKey : void 0;
2934
- if (opts?.preserveUntargeted && !requestedAgentId && !requestedSessionKey) return {
2935
- runtimeConfig: getRuntimeConfig(),
2936
- agentId: void 0,
2937
- sessionKey: void 0
2938
- };
2939
- const derivedAgentId = requestedSessionKey && parseAgentSessionKey(requestedSessionKey) ? resolveAgentIdFromSessionKey(requestedSessionKey) : void 0;
2940
- const { agentId: resolvedAgentId, cfg: runtimeConfig } = resolveCronAgent(requestedAgentId ?? derivedAgentId);
2941
- const agentId = resolvedAgentId || void 0;
2942
- const resolvedSessionKey = agentId ? resolveCronSessionKey({
2943
- runtimeConfig,
2944
- agentId,
2945
- requestedSessionKey
2946
- }) : void 0;
2947
- return {
2948
- runtimeConfig,
2949
- agentId,
2950
- sessionKey: resolvedSessionKey && runtimeConfig.session?.scope === "global" ? resolveEventSessionKey(resolvedSessionKey, runtimeConfig.session?.mainKey, runtimeConfig.session?.scope) : resolvedSessionKey
2951
- };
2952
- };
2953
- const resolveCronHeartbeatOverride = (params) => {
2954
- if (!params.heartbeat) return;
2955
- const agentEntry = params.agentId !== void 0 ? findAgentEntry(params.runtimeConfig, params.agentId) : void 0;
2956
- const agentHeartbeat = agentEntry && typeof agentEntry === "object" ? agentEntry.heartbeat : void 0;
2957
- return sanitizeCronHeartbeatOverride({
2958
- ...params.runtimeConfig.agents?.defaults?.heartbeat,
2959
- ...agentHeartbeat,
2960
- ...params.heartbeat
2961
- });
2962
- };
2963
- const defaultAgentId = resolveDefaultAgentId(params.cfg);
2964
- const runLogPrune = resolveCronRunLogPruneOptions(params.cfg.cron?.runLog);
2965
- const resolveSessionStorePath = (agentId) => resolveStorePath(params.cfg.session?.store, { agentId: agentId ?? defaultAgentId });
2966
- const sessionStorePath = resolveSessionStorePath(defaultAgentId);
2967
- const warnedLegacyWebhookJobs = /* @__PURE__ */ new Set();
2968
- const runCronChangedHook = (evt) => {
2969
- const hookRunner = getGlobalHookRunner();
2970
- if (!hookRunner?.hasHooks("cron_changed")) return;
2971
- const hookCtx = {
2972
- config: getRuntimeConfig(),
2973
- getCron: () => cron
2974
- };
2975
- hookRunner.runCronChanged(evt, hookCtx).catch((err) => {
2976
- cronLogger.warn({
2977
- err: formatErrorMessage(err),
2978
- jobId: evt.jobId
2979
- }, "cron_changed hook failed");
2980
- });
2981
- };
2982
- const cron = new CronService({
2983
- storePath,
2984
- cronEnabled,
2985
- cronConfig: params.cfg.cron,
2986
- defaultAgentId,
2987
- resolveSessionStorePath,
2988
- sessionStorePath,
2989
- enqueueSystemEvent: (text, opts) => {
2990
- const { sessionKey } = resolveCronTarget(opts);
2991
- if (!sessionKey) throw new Error("Cron system event target did not resolve a session key.");
2992
- enqueueSystemEvent(text, {
2993
- sessionKey,
2994
- contextKey: opts?.contextKey,
2995
- deliveryContext: opts?.deliveryContext
2996
- });
2997
- },
2998
- requestHeartbeat: (opts) => {
2999
- const { agentId, sessionKey } = resolveCronTarget({
3000
- ...opts,
3001
- preserveUntargeted: true
3002
- });
3003
- requestHeartbeat({
3004
- source: opts?.source ?? "cron",
3005
- intent: opts?.intent ?? "event",
3006
- reason: opts?.reason,
3007
- agentId,
3008
- sessionKey,
3009
- heartbeat: sanitizeCronHeartbeatOverride(opts?.heartbeat)
3010
- });
3011
- },
3012
- runHeartbeatOnce: async (opts) => {
3013
- const { runtimeConfig, agentId, sessionKey } = resolveCronTarget({
3014
- ...opts,
3015
- preserveUntargeted: true
3016
- });
3017
- return await runHeartbeatOnce({
3018
- cfg: runtimeConfig,
3019
- source: opts?.source ?? "cron",
3020
- intent: opts?.intent ?? "event",
3021
- reason: opts?.reason,
3022
- agentId,
3023
- sessionKey,
3024
- heartbeat: resolveCronHeartbeatOverride({
3025
- runtimeConfig,
3026
- agentId,
3027
- heartbeat: opts?.heartbeat
3028
- }),
3029
- deps: {
3030
- ...params.deps,
3031
- runtime: defaultRuntime
3032
- }
3033
- });
3034
- },
3035
- runIsolatedAgentJob: async ({ job, message, abortSignal, onExecutionStarted, onExecutionPhase }) => {
3036
- const { agentId, cfg: runtimeConfig } = resolveCronAgent(job.agentId);
3037
- const sessionKey = resolveCronSessionTargetSessionKey(job.sessionTarget) ?? `cron:${job.id}`;
3038
- try {
3039
- return await runCronIsolatedAgentTurn({
3040
- cfg: runtimeConfig,
3041
- deps: params.deps,
3042
- job,
3043
- message,
3044
- abortSignal,
3045
- onExecutionStarted,
3046
- onExecutionPhase,
3047
- agentId,
3048
- sessionKey,
3049
- lane: "cron"
3050
- });
3051
- } finally {
3052
- await cleanupBrowserSessionsForLifecycleEnd({
3053
- sessionKeys: [sessionKey],
3054
- onWarn: (msg) => cronLogger.warn({ jobId: job.id }, msg)
3055
- });
3056
- }
3057
- },
3058
- cleanupTimedOutAgentRun: async ({ job, execution }) => {
3059
- if (!execution?.sessionId) return;
3060
- const result = await abortAndDrainEmbeddedAgentRun({
3061
- sessionId: execution.sessionId,
3062
- sessionKey: execution.sessionKey,
3063
- settleMs: 15e3,
3064
- forceClear: true,
3065
- reason: "cron_timeout"
3066
- });
3067
- cronLogger.warn({
3068
- jobId: job.id,
3069
- sessionId: execution.sessionId,
3070
- sessionKey: execution.sessionKey,
3071
- aborted: result.aborted,
3072
- drained: result.drained,
3073
- forceCleared: result.forceCleared
3074
- }, "cron: cleaned up timed-out agent run");
3075
- },
3076
- sendCronFailureAlert: async ({ job, text, channel, to, mode, accountId }) => await sendGatewayCronFailureAlert({
3077
- deps: params.deps,
3078
- logger: cronLogger,
3079
- resolveCronAgent,
3080
- webhookToken: params.cfg.cron?.webhookToken,
3081
- job,
3082
- text,
3083
- channel,
3084
- to,
3085
- mode,
3086
- accountId
3087
- }),
3088
- log: getChildLogger({
3089
- module: "cron",
3090
- storePath
3091
- }),
3092
- onEvent: (evt) => {
3093
- params.broadcast("cron", evt, { dropIfSlow: true });
3094
- const jobSnapshot = evt.job ?? cron.getJob(evt.jobId);
3095
- const pluginJob = jobSnapshot ? toPluginCronJob(jobSnapshot) : void 0;
3096
- runCronChangedHook({
3097
- action: evt.action,
3098
- jobId: evt.jobId,
3099
- ...pluginJob ? { job: pluginJob } : {},
3100
- sessionTarget: jobSnapshot?.sessionTarget,
3101
- agentId: jobSnapshot?.agentId,
3102
- ...pickDefined(evt, [
3103
- "runAtMs",
3104
- "durationMs",
3105
- "status",
3106
- "error",
3107
- "summary",
3108
- "delivered",
3109
- "deliveryStatus",
3110
- "deliveryError",
3111
- "sessionId",
3112
- "sessionKey",
3113
- "runId",
3114
- "nextRunAtMs",
3115
- "model",
3116
- "provider"
3117
- ])
3118
- });
3119
- if (evt.action === "finished") {
3120
- dispatchGatewayCronFinishedNotifications({
3121
- evt,
3122
- job: evt.job ?? cron.getJob(evt.jobId),
3123
- deps: params.deps,
3124
- logger: cronLogger,
3125
- resolveCronAgent,
3126
- webhookToken: params.cfg.cron?.webhookToken,
3127
- legacyWebhook: params.cfg.cron?.webhook,
3128
- globalFailureDestination: params.cfg.cron?.failureDestination,
3129
- warnedLegacyWebhookJobs
3130
- });
3131
- const logPath = resolveCronRunLogPath({
3132
- storePath,
3133
- jobId: evt.jobId
3134
- });
3135
- appendCronRunLog(logPath, {
3136
- ts: Date.now(),
3137
- jobId: evt.jobId,
3138
- action: "finished",
3139
- status: evt.status,
3140
- error: evt.error,
3141
- summary: evt.summary,
3142
- diagnostics: evt.diagnostics,
3143
- delivered: evt.delivered,
3144
- deliveryStatus: evt.deliveryStatus,
3145
- deliveryError: evt.deliveryError,
3146
- failureNotificationDelivery: evt.failureNotificationDelivery,
3147
- delivery: evt.delivery,
3148
- sessionId: evt.sessionId,
3149
- sessionKey: evt.sessionKey,
3150
- runId: evt.runId,
3151
- runAtMs: evt.runAtMs,
3152
- durationMs: evt.durationMs,
3153
- nextRunAtMs: evt.nextRunAtMs,
3154
- model: evt.model,
3155
- provider: evt.provider,
3156
- usage: evt.usage
3157
- }, runLogPrune).catch((err) => {
3158
- cronLogger.warn({
3159
- err: String(err),
3160
- logPath
3161
- }, "cron: run log append failed");
3162
- });
3163
- }
3164
- }
3165
- });
3166
- return {
3167
- cron,
3168
- storePath,
3169
- cronEnabled
3170
- };
3171
- }
3172
- //#endregion
3173
- export { buildGatewayCronService as t };