dominds 1.15.5 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/dialog-display-state.d.ts +5 -1
  2. package/dist/dialog-display-state.js +36 -11
  3. package/dist/dialog-fork.js +1 -1
  4. package/dist/llm/api-quirks.d.ts +35 -0
  5. package/dist/llm/api-quirks.js +82 -0
  6. package/dist/llm/defaults.yaml +3 -1
  7. package/dist/llm/gen/failure-classifier.d.ts +7 -0
  8. package/dist/llm/gen/failure-classifier.js +137 -1
  9. package/dist/llm/gen/openai.js +3 -12
  10. package/dist/llm/gen.d.ts +2 -1
  11. package/dist/llm/kernel-driver/drive.js +108 -13
  12. package/dist/llm/kernel-driver/runtime.d.ts +8 -0
  13. package/dist/llm/kernel-driver/runtime.js +554 -156
  14. package/dist/persistence.d.ts +7 -0
  15. package/dist/persistence.js +169 -56
  16. package/dist/server/api-routes.js +79 -56
  17. package/dist/server/dominds-running-version.d.ts +1 -0
  18. package/dist/server/dominds-running-version.js +9 -0
  19. package/dist/server/dominds-runtime-status.d.ts +3 -0
  20. package/dist/server/dominds-runtime-status.js +22 -0
  21. package/dist/server/dominds-self-update.d.ts +13 -0
  22. package/dist/server/dominds-self-update.js +521 -0
  23. package/dist/server/static-server.js +0 -1
  24. package/dist/server/websocket-handler.d.ts +2 -2
  25. package/dist/server/websocket-handler.js +88 -77
  26. package/dist/server.js +10 -1
  27. package/dist/tools/ctrl.js +0 -3
  28. package/dist/tools/plan.js +0 -1
  29. package/dist/tools/team_mgmt.js +2 -2
  30. package/package.json +5 -5
  31. package/webapp/dist/assets/{_basePickBy-QPiPxkcd.js → _basePickBy-C0MXVhMo.js} +3 -3
  32. package/webapp/dist/assets/_basePickBy-C0MXVhMo.js.map +1 -0
  33. package/webapp/dist/assets/{_baseUniq-Dxi782ML.js → _baseUniq-CRygl41M.js} +2 -2
  34. package/webapp/dist/assets/_baseUniq-CRygl41M.js.map +1 -0
  35. package/webapp/dist/assets/{arc-CmoWlJCk.js → arc-BeHJtnt2.js} +2 -2
  36. package/webapp/dist/assets/arc-BeHJtnt2.js.map +1 -0
  37. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Cj8eAVGw.js → architectureDiagram-2XIMDMQ5-CGdo5TVi.js} +26 -8
  38. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CGdo5TVi.js.map +1 -0
  39. package/webapp/dist/assets/{blockDiagram-VD42YOAC-DCSpBIH9.js → blockDiagram-WCTKOSBZ-C59VaSGw.js} +187 -170
  40. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-C59VaSGw.js.map +1 -0
  41. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-BLnTx0I5.js → c4Diagram-IC4MRINW-B3YCBmTx.js} +4 -4
  42. package/webapp/dist/assets/c4Diagram-IC4MRINW-B3YCBmTx.js.map +1 -0
  43. package/webapp/dist/assets/{channel-CHTZ0PXJ.js → channel-Dn4i8EAY.js} +2 -2
  44. package/webapp/dist/assets/channel-Dn4i8EAY.js.map +1 -0
  45. package/webapp/dist/assets/{chunk-4BX2VUAB-D9vwOR-u.js → chunk-4BX2VUAB-CQbB3HlW.js} +2 -2
  46. package/webapp/dist/assets/chunk-4BX2VUAB-CQbB3HlW.js.map +1 -0
  47. package/webapp/dist/assets/{chunk-55IACEB6-Bls-7sze.js → chunk-55IACEB6-CkQR_Qu9.js} +2 -2
  48. package/webapp/dist/assets/chunk-55IACEB6-CkQR_Qu9.js.map +1 -0
  49. package/webapp/dist/assets/{chunk-FMBD7UC4-ETqcFoxP.js → chunk-FMBD7UC4-YSIOuaST.js} +2 -2
  50. package/webapp/dist/assets/chunk-FMBD7UC4-YSIOuaST.js.map +1 -0
  51. package/webapp/dist/assets/{chunk-TZMSLE5B-BnfBq8PA.js → chunk-JSJVCQXG-CWDLRawz.js} +14 -6
  52. package/webapp/dist/assets/chunk-JSJVCQXG-CWDLRawz.js.map +1 -0
  53. package/webapp/dist/assets/{chunk-QN33PNHL-B-dPkZ9T.js → chunk-KX2RTZJC-DFiwgnFf.js} +2 -2
  54. package/webapp/dist/assets/chunk-KX2RTZJC-DFiwgnFf.js.map +1 -0
  55. package/webapp/dist/assets/{chunk-DI55MBZ5-BPJLdjOS.js → chunk-NQ4KR5QH-DBxY8LL2.js} +9 -7
  56. package/webapp/dist/assets/chunk-NQ4KR5QH-DBxY8LL2.js.map +1 -0
  57. package/webapp/dist/assets/{chunk-QZHKN3VN-BqX4sv4Q.js → chunk-QZHKN3VN-BAdR6lLc.js} +2 -2
  58. package/webapp/dist/assets/chunk-QZHKN3VN-BAdR6lLc.js.map +1 -0
  59. package/webapp/dist/assets/{chunk-B4BG7PRW-BXRfjHmI.js → chunk-WL4C6EOR-Bjl-j3bf.js} +171 -121
  60. package/webapp/dist/assets/chunk-WL4C6EOR-Bjl-j3bf.js.map +1 -0
  61. package/webapp/dist/assets/{classDiagram-2ON5EDUG-w89KWhQq.js → classDiagram-VBA2DB6C-KBeS6WXD.js} +7 -6
  62. package/webapp/dist/assets/classDiagram-VBA2DB6C-KBeS6WXD.js.map +1 -0
  63. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-w89KWhQq.js → classDiagram-v2-RAHNMMFH-KBeS6WXD.js} +7 -6
  64. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-KBeS6WXD.js.map +1 -0
  65. package/webapp/dist/assets/{clone-D7jwWk83.js → clone-C7-aS2vm.js} +2 -2
  66. package/webapp/dist/assets/clone-C7-aS2vm.js.map +1 -0
  67. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CHdRDUYT.js → cose-bilkent-S5V4N54A-Bo5IsL-5.js} +2 -2
  68. package/webapp/dist/assets/cose-bilkent-S5V4N54A-Bo5IsL-5.js.map +1 -0
  69. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  70. package/webapp/dist/assets/{dagre-6UL2VRFP-CfltZHNg.js → dagre-KLK3FWXG-C3FeHj7D.js} +7 -7
  71. package/webapp/dist/assets/dagre-KLK3FWXG-C3FeHj7D.js.map +1 -0
  72. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  73. package/webapp/dist/assets/{diagram-PSM6KHXK-Bp_jHEhR.js → diagram-E7M64L7V-0HfiRW0u.js} +10 -10
  74. package/webapp/dist/assets/diagram-E7M64L7V-0HfiRW0u.js.map +1 -0
  75. package/webapp/dist/assets/{diagram-QEK2KX5R-Cdvy6Ep9.js → diagram-IFDJBPK2-DJwh7SMO.js} +9 -8
  76. package/webapp/dist/assets/diagram-IFDJBPK2-DJwh7SMO.js.map +1 -0
  77. package/webapp/dist/assets/{diagram-S2PKOQOG-BwUE6huD.js → diagram-P4PSJMXO-Y0RbvUZX.js} +8 -8
  78. package/webapp/dist/assets/diagram-P4PSJMXO-Y0RbvUZX.js.map +1 -0
  79. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-_GQN3dnV.js → erDiagram-INFDFZHY-B183xyLa.js} +96 -75
  80. package/webapp/dist/assets/erDiagram-INFDFZHY-B183xyLa.js.map +1 -0
  81. package/webapp/dist/assets/{flowDiagram-NV44I4VS-Dhbd5FE4.js → flowDiagram-PKNHOUZH-C_BR3Y3J.js} +98 -81
  82. package/webapp/dist/assets/flowDiagram-PKNHOUZH-C_BR3Y3J.js.map +1 -0
  83. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-BKQtJ_t7.js → ganttDiagram-A5KZAMGK-CHLgkuJT.js} +28 -3
  84. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-CHLgkuJT.js.map +1 -0
  85. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-BcW7gX3_.js → gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js} +38 -46
  86. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js.map +1 -0
  87. package/webapp/dist/assets/graph-D0hgB-X8.js +782 -0
  88. package/webapp/dist/assets/graph-D0hgB-X8.js.map +1 -0
  89. package/webapp/dist/assets/{index-JCkFg05X.js → index-CLoNHmSQ.js} +1845 -1647
  90. package/webapp/dist/assets/{index-JCkFg05X.js.map → index-CLoNHmSQ.js.map} +1 -1
  91. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  92. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-B9IsDiBf.js → infoDiagram-LFFYTUFH-mnMS61NO.js} +7 -7
  93. package/webapp/dist/assets/infoDiagram-LFFYTUFH-mnMS61NO.js.map +1 -0
  94. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  95. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js +966 -0
  96. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js.map +1 -0
  97. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-BpJK6b4f.js → journeyDiagram-4ABVD52K-BdeERn0r.js} +5 -5
  98. package/webapp/dist/assets/journeyDiagram-4ABVD52K-BdeERn0r.js.map +1 -0
  99. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-D0vLghpg.js → kanban-definition-K7BYSVSG-MLeCGcYg.js} +5 -3
  100. package/webapp/dist/assets/kanban-definition-K7BYSVSG-MLeCGcYg.js.map +1 -0
  101. package/webapp/dist/assets/{layout-C9CTTdmU.js → layout-DY9VEQ9M.js} +5 -5
  102. package/webapp/dist/assets/layout-DY9VEQ9M.js.map +1 -0
  103. package/webapp/dist/assets/{linear-DoEKTEMq.js → linear-D-T1xRsr.js} +2 -2
  104. package/webapp/dist/assets/linear-D-T1xRsr.js.map +1 -0
  105. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-D09DtFPK.js → mindmap-definition-YRQLILUH-CrVm8vj2.js} +7 -5
  106. package/webapp/dist/assets/mindmap-definition-YRQLILUH-CrVm8vj2.js.map +1 -0
  107. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  108. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BcM3GR1l.js → pieDiagram-SKSYHLDU-GtLLV0r1.js} +8 -8
  109. package/webapp/dist/assets/pieDiagram-SKSYHLDU-GtLLV0r1.js.map +1 -0
  110. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-D8DjF5Pg.js → quadrantDiagram-337W2JSQ-BCgk_2LP.js} +3 -3
  111. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-BCgk_2LP.js.map +1 -0
  112. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-D2J7OgDl.js → requirementDiagram-Z7DCOOCP-DYUKHWKR.js} +16 -6
  113. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DYUKHWKR.js.map +1 -0
  114. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-BHweOFUp.js → sankeyDiagram-WA2Y5GQK-CFAH8OaY.js} +2 -2
  115. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CFAH8OaY.js.map +1 -0
  116. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-BDCBaUSI.js → sequenceDiagram-2WXFIKYE-BTnhbv6w.js} +601 -201
  117. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-BTnhbv6w.js.map +1 -0
  118. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-jwEbpF4Z.js → stateDiagram-RAJIS63D-DWUnJTwO.js} +9 -9
  119. package/webapp/dist/assets/stateDiagram-RAJIS63D-DWUnJTwO.js.map +1 -0
  120. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-Blk529CR.js → stateDiagram-v2-FVOUBMTO-B-fc52bp.js} +5 -5
  121. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-B-fc52bp.js.map +1 -0
  122. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BQO-9msf.js → timeline-definition-YZTLITO2-BMZ52QaG.js} +3 -3
  123. package/webapp/dist/assets/timeline-definition-YZTLITO2-BMZ52QaG.js.map +1 -0
  124. package/webapp/dist/assets/{treemap-GDKQZRPO-Bc2g2vuB.js → treemap-KZPCXAKY-fgSrze0S.js} +37 -24
  125. package/webapp/dist/assets/treemap-KZPCXAKY-fgSrze0S.js.map +1 -0
  126. package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js +2487 -0
  127. package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js.map +1 -0
  128. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DKzNu-Hu.js → xychartDiagram-JWTSCODW-D6aviLtC.js} +4 -4
  129. package/webapp/dist/assets/xychartDiagram-JWTSCODW-D6aviLtC.js.map +1 -0
  130. package/webapp/dist/index.html +2 -2
  131. package/dist/course-transition.d.ts +0 -4
  132. package/dist/course-transition.js +0 -229
  133. package/dist/docs/tellask-result-unification.md +0 -280
  134. package/dist/shared/async-fifo-mutex.d.ts +0 -12
  135. package/dist/shared/async-fifo-mutex.js +0 -36
  136. package/dist/shared/diligence.d.ts +0 -3
  137. package/dist/shared/diligence.js +0 -64
  138. package/dist/shared/dotenv.d.ts +0 -13
  139. package/dist/shared/dotenv.js +0 -144
  140. package/dist/shared/evt.d.ts +0 -85
  141. package/dist/shared/evt.js +0 -195
  142. package/dist/shared/i18n/driver-messages.d.ts +0 -39
  143. package/dist/shared/i18n/driver-messages.js +0 -426
  144. package/dist/shared/i18n/text.d.ts +0 -6
  145. package/dist/shared/i18n/text.js +0 -9
  146. package/dist/shared/i18n/tool-result-messages.d.ts +0 -5
  147. package/dist/shared/i18n/tool-result-messages.js +0 -51
  148. package/dist/shared/markdown-frontmatter.d.ts +0 -7
  149. package/dist/shared/markdown-frontmatter.js +0 -44
  150. package/dist/shared/rtws-cli.d.ts +0 -8
  151. package/dist/shared/rtws-cli.js +0 -73
  152. package/dist/shared/runtime-language.d.ts +0 -11
  153. package/dist/shared/runtime-language.js +0 -47
  154. package/dist/shared/team_mgmt-manual.d.ts +0 -31
  155. package/dist/shared/team_mgmt-manual.js +0 -138
  156. package/dist/shared/utils/fbr.d.ts +0 -10
  157. package/dist/shared/utils/fbr.js +0 -38
  158. package/dist/shared/utils/fmt.d.ts +0 -1
  159. package/dist/shared/utils/fmt.js +0 -9
  160. package/dist/shared/utils/html.d.ts +0 -2
  161. package/dist/shared/utils/html.js +0 -20
  162. package/dist/shared/utils/id.d.ts +0 -12
  163. package/dist/shared/utils/id.js +0 -18
  164. package/dist/shared/utils/inter-dialog-format.d.ts +0 -73
  165. package/dist/shared/utils/inter-dialog-format.js +0 -295
  166. package/dist/shared/utils/time.d.ts +0 -1
  167. package/dist/shared/utils/time.js +0 -13
  168. package/dist/tools/prompts/team_mgmt/en/errors.md +0 -74
  169. package/dist/tools/prompts/team_mgmt/en/index.md +0 -88
  170. package/dist/tools/prompts/team_mgmt/en/principles.md +0 -70
  171. package/dist/tools/prompts/team_mgmt/en/scenarios.md +0 -183
  172. package/dist/tools/prompts/team_mgmt/en/tools.md +0 -110
  173. package/dist/tools/prompts/team_mgmt/zh/errors.md +0 -74
  174. package/dist/tools/prompts/team_mgmt/zh/index.md +0 -88
  175. package/dist/tools/prompts/team_mgmt/zh/principles.md +0 -70
  176. package/dist/tools/prompts/team_mgmt/zh/scenarios.md +0 -183
  177. package/dist/tools/prompts/team_mgmt/zh/tools.md +0 -110
  178. package/webapp/dist/assets/_basePickBy-QPiPxkcd.js.map +0 -1
  179. package/webapp/dist/assets/_baseUniq-Dxi782ML.js.map +0 -1
  180. package/webapp/dist/assets/arc-CmoWlJCk.js.map +0 -1
  181. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-Cj8eAVGw.js.map +0 -1
  182. package/webapp/dist/assets/blockDiagram-VD42YOAC-DCSpBIH9.js.map +0 -1
  183. package/webapp/dist/assets/c4Diagram-YG6GDRKO-BLnTx0I5.js.map +0 -1
  184. package/webapp/dist/assets/channel-CHTZ0PXJ.js.map +0 -1
  185. package/webapp/dist/assets/chunk-4BX2VUAB-D9vwOR-u.js.map +0 -1
  186. package/webapp/dist/assets/chunk-55IACEB6-Bls-7sze.js.map +0 -1
  187. package/webapp/dist/assets/chunk-B4BG7PRW-BXRfjHmI.js.map +0 -1
  188. package/webapp/dist/assets/chunk-DI55MBZ5-BPJLdjOS.js.map +0 -1
  189. package/webapp/dist/assets/chunk-FMBD7UC4-ETqcFoxP.js.map +0 -1
  190. package/webapp/dist/assets/chunk-QN33PNHL-B-dPkZ9T.js.map +0 -1
  191. package/webapp/dist/assets/chunk-QZHKN3VN-BqX4sv4Q.js.map +0 -1
  192. package/webapp/dist/assets/chunk-TZMSLE5B-BnfBq8PA.js.map +0 -1
  193. package/webapp/dist/assets/classDiagram-2ON5EDUG-w89KWhQq.js.map +0 -1
  194. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-w89KWhQq.js.map +0 -1
  195. package/webapp/dist/assets/clone-D7jwWk83.js.map +0 -1
  196. package/webapp/dist/assets/cose-bilkent-S5V4N54A-CHdRDUYT.js.map +0 -1
  197. package/webapp/dist/assets/dagre-6UL2VRFP-CfltZHNg.js.map +0 -1
  198. package/webapp/dist/assets/diagram-PSM6KHXK-Bp_jHEhR.js.map +0 -1
  199. package/webapp/dist/assets/diagram-QEK2KX5R-Cdvy6Ep9.js.map +0 -1
  200. package/webapp/dist/assets/diagram-S2PKOQOG-BwUE6huD.js.map +0 -1
  201. package/webapp/dist/assets/erDiagram-Q2GNP2WA-_GQN3dnV.js.map +0 -1
  202. package/webapp/dist/assets/flowDiagram-NV44I4VS-Dhbd5FE4.js.map +0 -1
  203. package/webapp/dist/assets/ganttDiagram-JELNMOA3-BKQtJ_t7.js.map +0 -1
  204. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-BcW7gX3_.js.map +0 -1
  205. package/webapp/dist/assets/graph-CE4HL0aU.js +0 -425
  206. package/webapp/dist/assets/graph-CE4HL0aU.js.map +0 -1
  207. package/webapp/dist/assets/infoDiagram-HS3SLOUP-B9IsDiBf.js.map +0 -1
  208. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BpJK6b4f.js.map +0 -1
  209. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-D0vLghpg.js.map +0 -1
  210. package/webapp/dist/assets/layout-C9CTTdmU.js.map +0 -1
  211. package/webapp/dist/assets/linear-DoEKTEMq.js.map +0 -1
  212. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-D09DtFPK.js.map +0 -1
  213. package/webapp/dist/assets/pieDiagram-ADFJNKIX-BcM3GR1l.js.map +0 -1
  214. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-D8DjF5Pg.js.map +0 -1
  215. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-D2J7OgDl.js.map +0 -1
  216. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-BHweOFUp.js.map +0 -1
  217. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BDCBaUSI.js.map +0 -1
  218. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-jwEbpF4Z.js.map +0 -1
  219. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-Blk529CR.js.map +0 -1
  220. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BQO-9msf.js.map +0 -1
  221. package/webapp/dist/assets/treemap-GDKQZRPO-Bc2g2vuB.js.map +0 -1
  222. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-DKzNu-Hu.js.map +0 -1
@@ -16,7 +16,7 @@
16
16
  * so multi-tab views converge without polling.
17
17
  */
18
18
  import type { DialogDisplayState, DialogInterruptionReason } from '@longrun-ai/kernel/types/display-state';
19
- import type { DialogExecutionMarker } from '@longrun-ai/kernel/types/storage';
19
+ import type { DialogExecutionMarker, DialogLatestFile } from '@longrun-ai/kernel/types/storage';
20
20
  import type { WebSocketMessage } from '@longrun-ai/kernel/types/wire';
21
21
  import { DialogID, type Dialog } from './dialog';
22
22
  type StopRequestedReason = 'user_stop' | 'emergency_stop';
@@ -25,6 +25,10 @@ export type RunControlCountsSnapshot = {
25
25
  resumable: number;
26
26
  };
27
27
  export declare function setDisplayStateBroadcaster(fn: (msg: WebSocketMessage) => void): void;
28
+ export declare function isStoppedReasonResumable(reason: DialogInterruptionReason): boolean;
29
+ export declare function isDisplayStateResumable(state: DialogDisplayState | undefined): boolean;
30
+ export declare function isExecutionMarkerResumable(executionMarker: DialogExecutionMarker | undefined): boolean;
31
+ export declare function isDialogLatestResumable(latest: DialogLatestFile | null | undefined): boolean;
28
32
  export declare function getRunControlCountsSnapshot(): Promise<RunControlCountsSnapshot>;
29
33
  export declare function broadcastRunControlCountsSnapshot(): Promise<void>;
30
34
  export declare function hasActiveRun(dialogId: DialogID): boolean;
@@ -18,6 +18,10 @@
18
18
  */
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.setDisplayStateBroadcaster = setDisplayStateBroadcaster;
21
+ exports.isStoppedReasonResumable = isStoppedReasonResumable;
22
+ exports.isDisplayStateResumable = isDisplayStateResumable;
23
+ exports.isExecutionMarkerResumable = isExecutionMarkerResumable;
24
+ exports.isDialogLatestResumable = isDialogLatestResumable;
21
25
  exports.getRunControlCountsSnapshot = getRunControlCountsSnapshot;
22
26
  exports.broadcastRunControlCountsSnapshot = broadcastRunControlCountsSnapshot;
23
27
  exports.hasActiveRun = hasActiveRun;
@@ -58,13 +62,27 @@ function syncRunControlCountsAfterActiveRunChange(trigger, dialogId) {
58
62
  }
59
63
  })();
60
64
  }
65
+ function isStoppedReasonResumable(reason) {
66
+ return reason.kind !== 'llm_retry_stopped';
67
+ }
68
+ function isDisplayStateResumable(state) {
69
+ return state?.kind === 'stopped' && state.continueEnabled;
70
+ }
71
+ function isExecutionMarkerResumable(executionMarker) {
72
+ return (executionMarker?.kind === 'interrupted' && isStoppedReasonResumable(executionMarker.reason));
73
+ }
74
+ function isDialogLatestResumable(latest) {
75
+ return (latest?.displayState?.kind === 'stopped' &&
76
+ latest.displayState.continueEnabled &&
77
+ latest.executionMarker?.kind === 'interrupted');
78
+ }
61
79
  function classifyRunControlBucket(state) {
62
80
  if (!state)
63
81
  return 'none';
64
82
  if (state.kind === 'proceeding' || state.kind === 'proceeding_stop_requested') {
65
83
  return 'proceeding';
66
84
  }
67
- if (state.kind === 'interrupted') {
85
+ if (isDisplayStateResumable(state)) {
68
86
  return 'resumable';
69
87
  }
70
88
  return 'none';
@@ -91,7 +109,7 @@ async function getRunControlCountsSnapshot() {
91
109
  if (latest?.generating === true) {
92
110
  proceeding++;
93
111
  }
94
- else if (latest?.executionMarker?.kind === 'interrupted') {
112
+ else if (isDialogLatestResumable(latest)) {
95
113
  resumable++;
96
114
  }
97
115
  }
@@ -219,7 +237,7 @@ async function setDialogDisplayState(dialogId, displayState) {
219
237
  dialogId: dialogId.valueOf(),
220
238
  });
221
239
  }
222
- const nextExecutionMarker = displayState.kind === 'interrupted'
240
+ const nextExecutionMarker = displayState.kind === 'stopped'
223
241
  ? { kind: 'interrupted', reason: displayState.reason }
224
242
  : displayState.kind === 'dead'
225
243
  ? { kind: 'dead', reason: displayState.reason }
@@ -270,7 +288,7 @@ function broadcastDisplayStateMarker(dialogId, marker) {
270
288
  }
271
289
  async function computeIdleDisplayState(dlg) {
272
290
  if (dlg.status === 'completed' || dlg.status === 'archived') {
273
- return { kind: 'terminal', status: dlg.status };
291
+ return { kind: 'idle_waiting_user' };
274
292
  }
275
293
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(dlg.id, 'running');
276
294
  if (dlg.id.selfId !== dlg.id.rootId &&
@@ -279,7 +297,11 @@ async function computeIdleDisplayState(dlg) {
279
297
  return { kind: 'dead', reason: latest.executionMarker.reason };
280
298
  }
281
299
  if (latest?.executionMarker?.kind === 'interrupted') {
282
- return { kind: 'interrupted', reason: latest.executionMarker.reason };
300
+ return {
301
+ kind: 'stopped',
302
+ reason: latest.executionMarker.reason,
303
+ continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
304
+ };
283
305
  }
284
306
  const hasQ4H = await dlg.hasPendingQ4H();
285
307
  const hasSubdialogs = await dlg.hasPendingSubdialogs();
@@ -298,7 +320,7 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
298
320
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
299
321
  const status = latest?.status;
300
322
  if (status === 'completed' || status === 'archived') {
301
- return { kind: 'terminal', status };
323
+ return { kind: 'idle_waiting_user' };
302
324
  }
303
325
  if (dialogId.selfId !== dialogId.rootId &&
304
326
  latest &&
@@ -307,7 +329,11 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
307
329
  return { kind: 'dead', reason: latest.executionMarker.reason };
308
330
  }
309
331
  if (latest?.executionMarker?.kind === 'interrupted') {
310
- return { kind: 'interrupted', reason: latest.executionMarker.reason };
332
+ return {
333
+ kind: 'stopped',
334
+ reason: latest.executionMarker.reason,
335
+ continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
336
+ };
311
337
  }
312
338
  const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
313
339
  const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, 'running');
@@ -358,8 +384,9 @@ async function reconcileDisplayStatesAfterRestart() {
358
384
  const next = nextIdle.kind === 'blocked'
359
385
  ? nextIdle
360
386
  : {
361
- kind: 'interrupted',
387
+ kind: 'stopped',
362
388
  reason: { kind: 'server_restart' },
389
+ continueEnabled: true,
363
390
  };
364
391
  try {
365
392
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
@@ -367,9 +394,7 @@ async function reconcileDisplayStatesAfterRestart() {
367
394
  patch: {
368
395
  generating: false,
369
396
  displayState: next,
370
- executionMarker: next.kind === 'interrupted'
371
- ? { kind: 'interrupted', reason: next.reason }
372
- : undefined,
397
+ executionMarker: next.kind === 'stopped' ? { kind: 'interrupted', reason: next.reason } : undefined,
373
398
  },
374
399
  }));
375
400
  }
@@ -245,7 +245,7 @@ function computeRootForkDisplayState(args) {
245
245
  if (hasSubdialogs) {
246
246
  return { kind: 'blocked', reason: { kind: 'waiting_for_subdialogs' } };
247
247
  }
248
- return { kind: 'interrupted', reason: { kind: 'system_stop', detail: 'fork_dialog_continue' } };
248
+ return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
249
249
  }
250
250
  async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
251
251
  const sourceDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(sourceId, sourceStatus), 'artifacts');
@@ -0,0 +1,35 @@
1
+ import type { LanguageCode } from '@longrun-ai/kernel/types/language';
2
+ import type { ProviderConfig } from './client';
3
+ import type { LlmRetryStrategy } from './gen';
4
+ export type LlmFailureKind = 'retriable' | 'rejected' | 'fatal';
5
+ export type LlmFailureSummary = {
6
+ kind: LlmFailureKind;
7
+ message: string;
8
+ status?: number;
9
+ code?: string;
10
+ };
11
+ export type LlmQuirkFailureHandling = {
12
+ kind: 'default';
13
+ } | {
14
+ kind: 'give_up';
15
+ message?: string;
16
+ summaryTextI18n?: Partial<Record<LanguageCode, string>>;
17
+ } | {
18
+ kind: 'retry_strategy';
19
+ retryStrategy: LlmRetryStrategy;
20
+ message?: string;
21
+ } | {
22
+ kind: 'single_retry';
23
+ delayMs: number;
24
+ message?: string;
25
+ };
26
+ export type LlmFailureQuirkHandlerSession = {
27
+ onFailure: (args: {
28
+ provider: string;
29
+ providerConfig: ProviderConfig;
30
+ failure: LlmFailureSummary;
31
+ error: unknown;
32
+ }) => LlmQuirkFailureHandling;
33
+ };
34
+ export declare function normalizeProviderApiQuirks(providerConfig: ProviderConfig): Set<string>;
35
+ export declare function createLlmFailureQuirkHandlerSession(providerConfig: ProviderConfig): LlmFailureQuirkHandlerSession | undefined;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeProviderApiQuirks = normalizeProviderApiQuirks;
4
+ exports.createLlmFailureQuirkHandlerSession = createLlmFailureQuirkHandlerSession;
5
+ const DOMINDS_LLM_EMPTY_RESPONSE_ERROR_CODE = 'DOMINDS_LLM_EMPTY_RESPONSE';
6
+ const XCODE_BEST_EMPTY_RESPONSE_SINGLE_RETRY_DELAY_MS = 3000;
7
+ const XCODE_BEST_EMPTY_RESPONSE_GIVE_UP_THRESHOLD = 5;
8
+ function createXcodeBestFailureQuirkHandlerSession(providerConfig) {
9
+ let consecutiveEmptyResponseCount = 0;
10
+ return {
11
+ onFailure(args) {
12
+ if (args.failure.code !== DOMINDS_LLM_EMPTY_RESPONSE_ERROR_CODE) {
13
+ consecutiveEmptyResponseCount = 0;
14
+ return { kind: 'default' };
15
+ }
16
+ consecutiveEmptyResponseCount += 1;
17
+ if (consecutiveEmptyResponseCount < XCODE_BEST_EMPTY_RESPONSE_GIVE_UP_THRESHOLD) {
18
+ return {
19
+ kind: 'single_retry',
20
+ delayMs: XCODE_BEST_EMPTY_RESPONSE_SINGLE_RETRY_DELAY_MS,
21
+ };
22
+ }
23
+ const providerName = providerConfig.name.trim().length > 0 ? providerConfig.name : args.provider;
24
+ const summaryTextI18n = {
25
+ zh: `${providerName} 在同一对话上下文中连续返回 empty response。` +
26
+ `Dominds 已在 ${String(XCODE_BEST_EMPTY_RESPONSE_GIVE_UP_THRESHOLD)} 次 empty response 后停止继续重试,因为这通常表示 provider 侧该对话上下文已经卡住;` +
27
+ '继续调整常规重试策略也无助于恢复。请新开对话继续。',
28
+ en: `${providerName} returned empty responses repeatedly for the same dialog context. ` +
29
+ `Dominds stopped retrying after ${String(XCODE_BEST_EMPTY_RESPONSE_GIVE_UP_THRESHOLD)} empty responses because this usually means the provider-side conversation ` +
30
+ 'context is stuck; adjusting the normal retry policies will not recover it. ' +
31
+ 'Start a new dialog to continue.',
32
+ };
33
+ return {
34
+ kind: 'give_up',
35
+ message: `${providerName} returned empty responses repeatedly for the same dialog context; ` +
36
+ 'automatic retries will not help until a new dialog is started.',
37
+ summaryTextI18n,
38
+ };
39
+ },
40
+ };
41
+ }
42
+ const FAILURE_QUIRK_HANDLER_FACTORIES = {
43
+ 'xcode.best': createXcodeBestFailureQuirkHandlerSession,
44
+ };
45
+ function normalizeProviderApiQuirks(providerConfig) {
46
+ const raw = providerConfig.apiQuirks;
47
+ if (typeof raw === 'string') {
48
+ return raw.trim().length > 0 ? new Set([raw.trim()]) : new Set();
49
+ }
50
+ if (Array.isArray(raw)) {
51
+ return new Set(raw.flatMap((entry) => {
52
+ if (typeof entry !== 'string')
53
+ return [];
54
+ const trimmed = entry.trim();
55
+ return trimmed === '' ? [] : [trimmed];
56
+ }));
57
+ }
58
+ return new Set();
59
+ }
60
+ function createLlmFailureQuirkHandlerSession(providerConfig) {
61
+ const sessions = [];
62
+ for (const quirk of normalizeProviderApiQuirks(providerConfig)) {
63
+ const factory = FAILURE_QUIRK_HANDLER_FACTORIES[quirk];
64
+ if (!factory)
65
+ continue;
66
+ sessions.push(factory(providerConfig));
67
+ }
68
+ if (sessions.length === 0) {
69
+ return undefined;
70
+ }
71
+ return {
72
+ onFailure(args) {
73
+ for (const session of sessions) {
74
+ const handling = session.onFailure(args);
75
+ if (handling.kind !== 'default') {
76
+ return handling;
77
+ }
78
+ }
79
+ return { kind: 'default' };
80
+ },
81
+ };
82
+ }
@@ -5,7 +5,9 @@
5
5
  # - llm_retry_backoff_multiplier: exponential factor between retries (default 1.5).
6
6
  # - llm_retry_max_delay_ms: upper bound for retry delay (default 1800000 / 30m).
7
7
  # - apiQuirks: optional provider/gateway quirk profile(s) for non-standard transport behavior
8
- # and retry classification. Example: `apiQuirks: xcode.best`.
8
+ # and provider-specific failure handling that can override the driver's default retry disposition.
9
+ # Example: `apiQuirks: xcode.best` currently covers both keepalive/heartbeat stream quirks and
10
+ # repeated empty-response handling for the same dialog context.
9
11
  # - tool_result_max_chars: optional transport-level cap for a single tool-result text payload
10
12
  # before Dominds projects it into the provider request. Use this when a provider/gateway enforces
11
13
  # a stricter per-item string limit than Dominds' built-in defaults.
@@ -1,3 +1,10 @@
1
1
  import type { LlmFailureDisposition } from '../gen';
2
+ export declare function readErrorStatus(error: unknown): number | undefined;
3
+ export declare function readErrorCode(error: unknown): string | undefined;
4
+ export declare function readErrorMessage(error: unknown): string | undefined;
5
+ export declare function readProviderSuggestedRetryAfterMs(error: unknown): number | undefined;
6
+ export declare function isConservativeRetryMessage(lowerMessage: string): boolean;
7
+ export declare function isOpenAiLikeOverloadFailure(error: unknown): boolean;
8
+ export declare function isOpenAiLikeRateLimitFailure(error: unknown): boolean;
2
9
  export declare function classifyOpenAiLikeFailure(error: unknown): LlmFailureDisposition | undefined;
3
10
  export declare function classifyAnthropicFailure(error: unknown): LlmFailureDisposition | undefined;
@@ -1,5 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readErrorStatus = readErrorStatus;
4
+ exports.readErrorCode = readErrorCode;
5
+ exports.readErrorMessage = readErrorMessage;
6
+ exports.readProviderSuggestedRetryAfterMs = readProviderSuggestedRetryAfterMs;
7
+ exports.isConservativeRetryMessage = isConservativeRetryMessage;
8
+ exports.isOpenAiLikeOverloadFailure = isOpenAiLikeOverloadFailure;
9
+ exports.isOpenAiLikeRateLimitFailure = isOpenAiLikeRateLimitFailure;
3
10
  exports.classifyOpenAiLikeFailure = classifyOpenAiLikeFailure;
4
11
  exports.classifyAnthropicFailure = classifyAnthropicFailure;
5
12
  function isPlainObject(value) {
@@ -11,6 +18,12 @@ function readNestedError(error) {
11
18
  }
12
19
  return error.error;
13
20
  }
21
+ function readNestedResponse(error) {
22
+ if (!isPlainObject(error) || !('response' in error) || !isPlainObject(error.response)) {
23
+ return undefined;
24
+ }
25
+ return error.response;
26
+ }
14
27
  function readErrorStatus(error) {
15
28
  if (isPlainObject(error)) {
16
29
  if ('status' in error && typeof error.status === 'number') {
@@ -79,6 +92,96 @@ function readErrorMessage(error) {
79
92
  }
80
93
  return undefined;
81
94
  }
95
+ function readErrorHeaders(error) {
96
+ if (isPlainObject(error) && 'headers' in error && isPlainObject(error.headers)) {
97
+ return error.headers;
98
+ }
99
+ const nested = readNestedError(error);
100
+ if (nested && 'headers' in nested && isPlainObject(nested.headers)) {
101
+ return nested.headers;
102
+ }
103
+ const response = readNestedResponse(error);
104
+ if (response && 'headers' in response && isPlainObject(response.headers)) {
105
+ return response.headers;
106
+ }
107
+ return undefined;
108
+ }
109
+ function readHeaderValue(headers, headerName) {
110
+ const target = headerName.toLowerCase();
111
+ for (const [key, value] of Object.entries(headers)) {
112
+ if (key.toLowerCase() === target) {
113
+ return value;
114
+ }
115
+ }
116
+ return undefined;
117
+ }
118
+ function parseRetryAfterHeaderMs(value) {
119
+ if (typeof value === 'number' && Number.isFinite(value)) {
120
+ return Math.max(0, Math.floor(value * 1000));
121
+ }
122
+ if (typeof value !== 'string')
123
+ return undefined;
124
+ const trimmed = value.trim();
125
+ if (trimmed === '')
126
+ return undefined;
127
+ const numeric = Number(trimmed);
128
+ if (Number.isFinite(numeric)) {
129
+ return Math.max(0, Math.floor(numeric * 1000));
130
+ }
131
+ const parsedDateMs = Date.parse(trimmed);
132
+ if (!Number.isFinite(parsedDateMs))
133
+ return undefined;
134
+ return Math.max(0, parsedDateMs - Date.now());
135
+ }
136
+ function parseDelayFieldMs(value, unit) {
137
+ if (typeof value === 'number' && Number.isFinite(value)) {
138
+ const ms = unit === 'seconds' ? value * 1000 : value;
139
+ return Math.max(0, Math.floor(ms));
140
+ }
141
+ if (typeof value !== 'string')
142
+ return undefined;
143
+ const numeric = Number(value.trim());
144
+ if (!Number.isFinite(numeric))
145
+ return undefined;
146
+ const ms = unit === 'seconds' ? numeric * 1000 : numeric;
147
+ return Math.max(0, Math.floor(ms));
148
+ }
149
+ function readProviderSuggestedRetryAfterMs(error) {
150
+ const headers = readErrorHeaders(error);
151
+ if (headers) {
152
+ const retryAfter = parseRetryAfterHeaderMs(readHeaderValue(headers, 'retry-after'));
153
+ if (retryAfter !== undefined)
154
+ return retryAfter;
155
+ const resetAfter = parseDelayFieldMs(readHeaderValue(headers, 'x-ratelimit-reset-after'), 'seconds') ??
156
+ parseDelayFieldMs(readHeaderValue(headers, 'ratelimit-reset-after'), 'seconds');
157
+ if (resetAfter !== undefined)
158
+ return resetAfter;
159
+ }
160
+ const roots = [];
161
+ if (isPlainObject(error))
162
+ roots.push(error);
163
+ const nested = readNestedError(error);
164
+ if (nested)
165
+ roots.push(nested);
166
+ const response = readNestedResponse(error);
167
+ if (response)
168
+ roots.push(response);
169
+ for (const root of roots) {
170
+ const retryAfterMs = parseDelayFieldMs(root.retryAfterMs, 'milliseconds') ??
171
+ parseDelayFieldMs(root.retry_after_ms, 'milliseconds') ??
172
+ parseDelayFieldMs(root.resetAfterMs, 'milliseconds') ??
173
+ parseDelayFieldMs(root.reset_after_ms, 'milliseconds');
174
+ if (retryAfterMs !== undefined)
175
+ return retryAfterMs;
176
+ const retryAfterSeconds = parseDelayFieldMs(root.retryAfter, 'seconds') ??
177
+ parseDelayFieldMs(root.retry_after, 'seconds') ??
178
+ parseDelayFieldMs(root.resetAfter, 'seconds') ??
179
+ parseDelayFieldMs(root.reset_after, 'seconds');
180
+ if (retryAfterSeconds !== undefined)
181
+ return retryAfterSeconds;
182
+ }
183
+ return undefined;
184
+ }
82
185
  function buildFailureMessage(error) {
83
186
  return readErrorMessage(error) ?? 'Unknown LLM provider error.';
84
187
  }
@@ -110,6 +213,29 @@ function isConservativeRetryMessage(lowerMessage) {
110
213
  }
111
214
  return lowerMessage.includes('overloaded') && lowerMessage.includes('try again later');
112
215
  }
216
+ function isOpenAiLikeOverloadFailure(error) {
217
+ const lowerMessage = buildFailureMessage(error).toLowerCase();
218
+ const status = readErrorStatus(error);
219
+ return status === 503 || status === 529 || isConservativeRetryMessage(lowerMessage);
220
+ }
221
+ function isOpenAiLikeRateLimitFailure(error) {
222
+ const lowerMessage = buildFailureMessage(error).toLowerCase();
223
+ const status = readErrorStatus(error);
224
+ const code = readErrorCode(error)?.toLowerCase();
225
+ if (status === 429) {
226
+ return true;
227
+ }
228
+ if (typeof code === 'string' && code.includes('rate_limit')) {
229
+ return true;
230
+ }
231
+ if (lowerMessage.includes('rate limit')) {
232
+ return true;
233
+ }
234
+ if (lowerMessage.includes('requests per min')) {
235
+ return true;
236
+ }
237
+ return lowerMessage.includes('rpm') && lowerMessage.includes('limit');
238
+ }
113
239
  function classifyOpenAiLikeFailure(error) {
114
240
  const message = buildFailureMessage(error);
115
241
  const lowerMessage = message.toLowerCase();
@@ -132,7 +258,7 @@ function classifyOpenAiLikeFailure(error) {
132
258
  retryStrategy: 'aggressive',
133
259
  };
134
260
  }
135
- if (status === 503 || status === 529 || isConservativeRetryMessage(lowerMessage)) {
261
+ if (isOpenAiLikeOverloadFailure(error)) {
136
262
  return {
137
263
  kind: 'retriable',
138
264
  message,
@@ -141,6 +267,16 @@ function classifyOpenAiLikeFailure(error) {
141
267
  retryStrategy: 'conservative',
142
268
  };
143
269
  }
270
+ if (isOpenAiLikeRateLimitFailure(error)) {
271
+ return {
272
+ kind: 'retriable',
273
+ message,
274
+ status,
275
+ code,
276
+ retryStrategy: 'smart_rate',
277
+ retryAfterMs: readProviderSuggestedRetryAfterMs(error),
278
+ };
279
+ }
144
280
  if (isOpenAiRetriableProcessingFailureMessage(lowerMessage)) {
145
281
  return {
146
282
  kind: 'retriable',
@@ -16,6 +16,7 @@ const openai_1 = __importDefault(require("openai"));
16
16
  const log_1 = require("../../log");
17
17
  const i18n_text_1 = require("../../runtime/i18n-text");
18
18
  const work_language_1 = require("../../runtime/work-language");
19
+ const api_quirks_1 = require("../api-quirks");
19
20
  const artifacts_1 = require("./artifacts");
20
21
  const failure_classifier_1 = require("./failure-classifier");
21
22
  const tool_call_context_1 = require("./tool-call-context");
@@ -86,19 +87,9 @@ function readEventType(value) {
86
87
  }
87
88
  return value.type;
88
89
  }
89
- function normalizeProviderApiQuirks(providerConfig) {
90
- const raw = providerConfig.apiQuirks;
91
- if (typeof raw === 'string') {
92
- return raw.trim().length > 0 ? new Set([raw.trim()]) : new Set();
93
- }
94
- if (Array.isArray(raw)) {
95
- return new Set(raw.filter((entry) => typeof entry === 'string' && entry.trim() !== ''));
96
- }
97
- return new Set();
98
- }
99
90
  function resolveOpenAiVendorHeartbeatEventTypes(providerConfig) {
100
91
  const eventTypes = new Set();
101
- for (const quirk of normalizeProviderApiQuirks(providerConfig)) {
92
+ for (const quirk of (0, api_quirks_1.normalizeProviderApiQuirks)(providerConfig)) {
102
93
  const vendorEventTypes = OPENAI_API_QUIRK_VENDOR_HEARTBEAT_EVENT_TYPES[quirk];
103
94
  if (!vendorEventTypes)
104
95
  continue;
@@ -109,7 +100,7 @@ function resolveOpenAiVendorHeartbeatEventTypes(providerConfig) {
109
100
  return eventTypes;
110
101
  }
111
102
  function maybeAnnotateOpenAiQuirkFailure(providerConfig, error) {
112
- const quirks = normalizeProviderApiQuirks(providerConfig);
103
+ const quirks = (0, api_quirks_1.normalizeProviderApiQuirks)(providerConfig);
113
104
  const message = error instanceof Error
114
105
  ? error.message
115
106
  : typeof error === 'string'
package/dist/llm/gen.d.ts CHANGED
@@ -23,13 +23,14 @@ export interface LlmBatchResult {
23
23
  usage: LlmUsageStats;
24
24
  llmGenModel?: string;
25
25
  }
26
- export type LlmRetryStrategy = 'aggressive' | 'conservative';
26
+ export type LlmRetryStrategy = 'aggressive' | 'conservative' | 'smart_rate';
27
27
  export type LlmFailureDisposition = {
28
28
  kind: 'retriable' | 'rejected' | 'fatal';
29
29
  message: string;
30
30
  status?: number;
31
31
  code?: string;
32
32
  retryStrategy?: LlmRetryStrategy;
33
+ retryAfterMs?: number;
33
34
  };
34
35
  export type LlmFailureClassifier = (error: unknown) => LlmFailureDisposition | undefined;
35
36
  export interface LlmRequestContext {