dominds 1.16.1 → 1.16.2

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 (175) hide show
  1. package/dist/dialog-display-state.d.ts +4 -0
  2. package/dist/dialog-display-state.js +138 -19
  3. package/dist/dialog-fork.js +13 -5
  4. package/dist/dialog-interruption.d.ts +18 -0
  5. package/dist/dialog-interruption.js +34 -0
  6. package/dist/docs/dominds-agent-collaboration.zh.md +401 -0
  7. package/dist/llm/api-quirks.d.ts +11 -0
  8. package/dist/llm/api-quirks.js +322 -24
  9. package/dist/llm/defaults.yaml +2 -1
  10. package/dist/llm/gen/mock.d.ts +1 -1
  11. package/dist/llm/gen/mock.js +12 -0
  12. package/dist/llm/gen/openai-compatible.d.ts +1 -1
  13. package/dist/llm/gen/openai-compatible.js +9 -1
  14. package/dist/llm/gen/openai.d.ts +1 -1
  15. package/dist/llm/gen/openai.js +16 -2
  16. package/dist/llm/gen.d.ts +10 -0
  17. package/dist/llm/gen.js +10 -0
  18. package/dist/llm/kernel-driver/drive.js +994 -866
  19. package/dist/llm/kernel-driver/runtime.d.ts +16 -2
  20. package/dist/llm/kernel-driver/runtime.js +75 -10
  21. package/dist/llm/stop-reason-i18n.d.ts +9 -0
  22. package/dist/llm/stop-reason-i18n.js +114 -0
  23. package/dist/persistence-errors.d.ts +26 -0
  24. package/dist/persistence-errors.js +68 -0
  25. package/dist/persistence.d.ts +119 -82
  26. package/dist/persistence.js +1055 -426
  27. package/dist/server/api-routes.js +174 -58
  28. package/dist/server/websocket-handler.js +125 -21
  29. package/dist/tools/team_mgmt.js +2 -2
  30. package/package.json +3 -3
  31. package/webapp/dist/assets/{_basePickBy-C0MXVhMo.js → _basePickBy-BJWCmtUm.js} +3 -3
  32. package/webapp/dist/assets/_basePickBy-BJWCmtUm.js.map +1 -0
  33. package/webapp/dist/assets/{_baseUniq-CRygl41M.js → _baseUniq-D6k_lGfs.js} +2 -2
  34. package/webapp/dist/assets/_baseUniq-D6k_lGfs.js.map +1 -0
  35. package/webapp/dist/assets/{arc-BeHJtnt2.js → arc-DYDaESgj.js} +2 -2
  36. package/webapp/dist/assets/arc-DYDaESgj.js.map +1 -0
  37. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CGdo5TVi.js → architectureDiagram-VXUJARFQ-DZMT7dqc.js} +8 -26
  38. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DZMT7dqc.js.map +1 -0
  39. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-C59VaSGw.js → blockDiagram-VD42YOAC-CABpgVAa.js} +170 -187
  40. package/webapp/dist/assets/blockDiagram-VD42YOAC-CABpgVAa.js.map +1 -0
  41. package/webapp/dist/assets/{c4Diagram-IC4MRINW-B3YCBmTx.js → c4Diagram-YG6GDRKO-COLZS8Ul.js} +4 -4
  42. package/webapp/dist/assets/c4Diagram-YG6GDRKO-COLZS8Ul.js.map +1 -0
  43. package/webapp/dist/assets/{channel-Dn4i8EAY.js → channel-CYFm9Cri.js} +2 -2
  44. package/webapp/dist/assets/channel-CYFm9Cri.js.map +1 -0
  45. package/webapp/dist/assets/{chunk-4BX2VUAB-CQbB3HlW.js → chunk-4BX2VUAB-CX_-XbaN.js} +2 -2
  46. package/webapp/dist/assets/chunk-4BX2VUAB-CX_-XbaN.js.map +1 -0
  47. package/webapp/dist/assets/{chunk-55IACEB6-CkQR_Qu9.js → chunk-55IACEB6-ByD-NdBC.js} +2 -2
  48. package/webapp/dist/assets/chunk-55IACEB6-ByD-NdBC.js.map +1 -0
  49. package/webapp/dist/assets/{chunk-WL4C6EOR-Bjl-j3bf.js → chunk-B4BG7PRW-BANemsDD.js} +121 -171
  50. package/webapp/dist/assets/chunk-B4BG7PRW-BANemsDD.js.map +1 -0
  51. package/webapp/dist/assets/{chunk-NQ4KR5QH-DBxY8LL2.js → chunk-DI55MBZ5-DV7sdJmQ.js} +7 -9
  52. package/webapp/dist/assets/chunk-DI55MBZ5-DV7sdJmQ.js.map +1 -0
  53. package/webapp/dist/assets/{chunk-FMBD7UC4-YSIOuaST.js → chunk-FMBD7UC4-DYGviJnf.js} +2 -2
  54. package/webapp/dist/assets/chunk-FMBD7UC4-DYGviJnf.js.map +1 -0
  55. package/webapp/dist/assets/{chunk-KX2RTZJC-DFiwgnFf.js → chunk-QN33PNHL-B8DWRL9f.js} +2 -2
  56. package/webapp/dist/assets/chunk-QN33PNHL-B8DWRL9f.js.map +1 -0
  57. package/webapp/dist/assets/{chunk-QZHKN3VN-BAdR6lLc.js → chunk-QZHKN3VN-B1aYIzMR.js} +2 -2
  58. package/webapp/dist/assets/chunk-QZHKN3VN-B1aYIzMR.js.map +1 -0
  59. package/webapp/dist/assets/{chunk-JSJVCQXG-CWDLRawz.js → chunk-TZMSLE5B-_HISzxl3.js} +6 -14
  60. package/webapp/dist/assets/chunk-TZMSLE5B-_HISzxl3.js.map +1 -0
  61. package/webapp/dist/assets/{classDiagram-VBA2DB6C-KBeS6WXD.js → classDiagram-2ON5EDUG-CpyYj1Rc.js} +6 -7
  62. package/webapp/dist/assets/classDiagram-2ON5EDUG-CpyYj1Rc.js.map +1 -0
  63. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-KBeS6WXD.js → classDiagram-v2-WZHVMYZB-CpyYj1Rc.js} +6 -7
  64. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CpyYj1Rc.js.map +1 -0
  65. package/webapp/dist/assets/{clone-C7-aS2vm.js → clone-B_9AxWIU.js} +2 -2
  66. package/webapp/dist/assets/clone-B_9AxWIU.js.map +1 -0
  67. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Bo5IsL-5.js → cose-bilkent-S5V4N54A-17ECLfPR.js} +2 -2
  68. package/webapp/dist/assets/cose-bilkent-S5V4N54A-17ECLfPR.js.map +1 -0
  69. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-C3FeHj7D.js → dagre-6UL2VRFP-DhRqcF1o.js} +7 -7
  71. package/webapp/dist/assets/dagre-6UL2VRFP-DhRqcF1o.js.map +1 -0
  72. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  73. package/webapp/dist/assets/{diagram-E7M64L7V-0HfiRW0u.js → diagram-PSM6KHXK-lpDT6Wwb.js} +10 -10
  74. package/webapp/dist/assets/diagram-PSM6KHXK-lpDT6Wwb.js.map +1 -0
  75. package/webapp/dist/assets/{diagram-IFDJBPK2-DJwh7SMO.js → diagram-QEK2KX5R-ohxbPpDH.js} +8 -9
  76. package/webapp/dist/assets/diagram-QEK2KX5R-ohxbPpDH.js.map +1 -0
  77. package/webapp/dist/assets/{diagram-P4PSJMXO-Y0RbvUZX.js → diagram-S2PKOQOG-DAFFGfch.js} +8 -8
  78. package/webapp/dist/assets/diagram-S2PKOQOG-DAFFGfch.js.map +1 -0
  79. package/webapp/dist/assets/{erDiagram-INFDFZHY-B183xyLa.js → erDiagram-Q2GNP2WA-BH-7rI43.js} +75 -96
  80. package/webapp/dist/assets/erDiagram-Q2GNP2WA-BH-7rI43.js.map +1 -0
  81. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-C_BR3Y3J.js → flowDiagram-NV44I4VS-CdEjFbz4.js} +81 -98
  82. package/webapp/dist/assets/flowDiagram-NV44I4VS-CdEjFbz4.js.map +1 -0
  83. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CHLgkuJT.js → ganttDiagram-JELNMOA3-Cju2t-lK.js} +3 -28
  84. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Cju2t-lK.js.map +1 -0
  85. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js → gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js} +46 -38
  86. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js.map +1 -0
  87. package/webapp/dist/assets/graph-mhcc7ldf.js +425 -0
  88. package/webapp/dist/assets/graph-mhcc7ldf.js.map +1 -0
  89. package/webapp/dist/assets/{index-CLoNHmSQ.js → index-BLnM-uON.js} +2098 -1841
  90. package/webapp/dist/assets/{index-CLoNHmSQ.js.map → index-BLnM-uON.js.map} +1 -1
  91. package/webapp/dist/assets/{index-YaxF76or.css → index-xvYYeHuy.css} +1 -1
  92. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-mnMS61NO.js → infoDiagram-HS3SLOUP-Df8p0okQ.js} +7 -7
  93. package/webapp/dist/assets/infoDiagram-HS3SLOUP-Df8p0okQ.js.map +1 -0
  94. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  95. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BdeERn0r.js → journeyDiagram-XKPGCS4Q-BXMl8H-d.js} +5 -5
  96. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BXMl8H-d.js.map +1 -0
  97. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-MLeCGcYg.js → kanban-definition-3W4ZIXB7-Cc5RwCEh.js} +3 -5
  98. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-Cc5RwCEh.js.map +1 -0
  99. package/webapp/dist/assets/{layout-DY9VEQ9M.js → layout-BB2SvQcE.js} +5 -5
  100. package/webapp/dist/assets/layout-BB2SvQcE.js.map +1 -0
  101. package/webapp/dist/assets/{linear-D-T1xRsr.js → linear-Cj50lA0a.js} +2 -2
  102. package/webapp/dist/assets/linear-Cj50lA0a.js.map +1 -0
  103. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CrVm8vj2.js → mindmap-definition-VGOIOE7T-BLBklJVX.js} +5 -7
  104. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BLBklJVX.js.map +1 -0
  105. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  106. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-GtLLV0r1.js → pieDiagram-ADFJNKIX-BQrOgSc-.js} +8 -8
  107. package/webapp/dist/assets/pieDiagram-ADFJNKIX-BQrOgSc-.js.map +1 -0
  108. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BCgk_2LP.js → quadrantDiagram-AYHSOK5B-C62TxtsO.js} +3 -3
  109. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-C62TxtsO.js.map +1 -0
  110. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DYUKHWKR.js → requirementDiagram-UZGBJVZJ-Is6Q3osM.js} +6 -16
  111. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-Is6Q3osM.js.map +1 -0
  112. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CFAH8OaY.js → sankeyDiagram-TZEHDZUN-CCAW8Dr2.js} +2 -2
  113. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CCAW8Dr2.js.map +1 -0
  114. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BTnhbv6w.js → sequenceDiagram-WL72ISMW-DpODpbl6.js} +201 -601
  115. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-DpODpbl6.js.map +1 -0
  116. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DWUnJTwO.js → stateDiagram-FKZM4ZOC-B8LHaf5T.js} +9 -9
  117. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-B8LHaf5T.js.map +1 -0
  118. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-B-fc52bp.js → stateDiagram-v2-4FDKWEC3-4FzTkpgz.js} +5 -5
  119. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-4FzTkpgz.js.map +1 -0
  120. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BMZ52QaG.js → timeline-definition-IT6M3QCI-Ckxc4qZe.js} +3 -3
  121. package/webapp/dist/assets/timeline-definition-IT6M3QCI-Ckxc4qZe.js.map +1 -0
  122. package/webapp/dist/assets/{treemap-KZPCXAKY-fgSrze0S.js → treemap-GDKQZRPO-QQa4vKMv.js} +24 -37
  123. package/webapp/dist/assets/treemap-GDKQZRPO-QQa4vKMv.js.map +1 -0
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D6aviLtC.js → xychartDiagram-PRI3JC2R-Ba2uJcs6.js} +4 -4
  125. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-Ba2uJcs6.js.map +1 -0
  126. package/webapp/dist/index.html +2 -2
  127. package/webapp/dist/assets/_basePickBy-C0MXVhMo.js.map +0 -1
  128. package/webapp/dist/assets/_baseUniq-CRygl41M.js.map +0 -1
  129. package/webapp/dist/assets/arc-BeHJtnt2.js.map +0 -1
  130. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CGdo5TVi.js.map +0 -1
  131. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-C59VaSGw.js.map +0 -1
  132. package/webapp/dist/assets/c4Diagram-IC4MRINW-B3YCBmTx.js.map +0 -1
  133. package/webapp/dist/assets/channel-Dn4i8EAY.js.map +0 -1
  134. package/webapp/dist/assets/chunk-4BX2VUAB-CQbB3HlW.js.map +0 -1
  135. package/webapp/dist/assets/chunk-55IACEB6-CkQR_Qu9.js.map +0 -1
  136. package/webapp/dist/assets/chunk-FMBD7UC4-YSIOuaST.js.map +0 -1
  137. package/webapp/dist/assets/chunk-JSJVCQXG-CWDLRawz.js.map +0 -1
  138. package/webapp/dist/assets/chunk-KX2RTZJC-DFiwgnFf.js.map +0 -1
  139. package/webapp/dist/assets/chunk-NQ4KR5QH-DBxY8LL2.js.map +0 -1
  140. package/webapp/dist/assets/chunk-QZHKN3VN-BAdR6lLc.js.map +0 -1
  141. package/webapp/dist/assets/chunk-WL4C6EOR-Bjl-j3bf.js.map +0 -1
  142. package/webapp/dist/assets/classDiagram-VBA2DB6C-KBeS6WXD.js.map +0 -1
  143. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-KBeS6WXD.js.map +0 -1
  144. package/webapp/dist/assets/clone-C7-aS2vm.js.map +0 -1
  145. package/webapp/dist/assets/cose-bilkent-S5V4N54A-Bo5IsL-5.js.map +0 -1
  146. package/webapp/dist/assets/dagre-KLK3FWXG-C3FeHj7D.js.map +0 -1
  147. package/webapp/dist/assets/diagram-E7M64L7V-0HfiRW0u.js.map +0 -1
  148. package/webapp/dist/assets/diagram-IFDJBPK2-DJwh7SMO.js.map +0 -1
  149. package/webapp/dist/assets/diagram-P4PSJMXO-Y0RbvUZX.js.map +0 -1
  150. package/webapp/dist/assets/erDiagram-INFDFZHY-B183xyLa.js.map +0 -1
  151. package/webapp/dist/assets/flowDiagram-PKNHOUZH-C_BR3Y3J.js.map +0 -1
  152. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-CHLgkuJT.js.map +0 -1
  153. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js.map +0 -1
  154. package/webapp/dist/assets/graph-D0hgB-X8.js +0 -782
  155. package/webapp/dist/assets/graph-D0hgB-X8.js.map +0 -1
  156. package/webapp/dist/assets/infoDiagram-LFFYTUFH-mnMS61NO.js.map +0 -1
  157. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js +0 -966
  158. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js.map +0 -1
  159. package/webapp/dist/assets/journeyDiagram-4ABVD52K-BdeERn0r.js.map +0 -1
  160. package/webapp/dist/assets/kanban-definition-K7BYSVSG-MLeCGcYg.js.map +0 -1
  161. package/webapp/dist/assets/layout-DY9VEQ9M.js.map +0 -1
  162. package/webapp/dist/assets/linear-D-T1xRsr.js.map +0 -1
  163. package/webapp/dist/assets/mindmap-definition-YRQLILUH-CrVm8vj2.js.map +0 -1
  164. package/webapp/dist/assets/pieDiagram-SKSYHLDU-GtLLV0r1.js.map +0 -1
  165. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-BCgk_2LP.js.map +0 -1
  166. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DYUKHWKR.js.map +0 -1
  167. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CFAH8OaY.js.map +0 -1
  168. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-BTnhbv6w.js.map +0 -1
  169. package/webapp/dist/assets/stateDiagram-RAJIS63D-DWUnJTwO.js.map +0 -1
  170. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-B-fc52bp.js.map +0 -1
  171. package/webapp/dist/assets/timeline-definition-YZTLITO2-BMZ52QaG.js.map +0 -1
  172. package/webapp/dist/assets/treemap-KZPCXAKY-fgSrze0S.js.map +0 -1
  173. package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js +0 -2487
  174. package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js.map +0 -1
  175. package/webapp/dist/assets/xychartDiagram-JWTSCODW-D6aviLtC.js.map +0 -1
@@ -1,13 +1,25 @@
1
- import type { DialogLlmRetryExhaustedReason } from '@longrun-ai/kernel/types/display-state';
1
+ import type { DialogDisplayTextI18n, DialogLlmRetryExhaustedReason } from '@longrun-ai/kernel/types/display-state';
2
2
  import { Dialog } from '../../dialog';
3
3
  import type { FuncTool, ToolArguments } from '../../tool';
4
+ import { type LlmFailureQuirkHandlerSession } from '../api-quirks';
4
5
  import type { ProviderConfig } from '../client';
5
- import type { LlmFailureClassifier } from '../gen';
6
+ import { type LlmFailureClassifier } from '../gen';
6
7
  import type { KernelDriverHumanPrompt } from './types';
7
8
  export declare class LlmRetryStoppedError extends Error {
8
9
  readonly reason: DialogLlmRetryExhaustedReason;
9
10
  constructor(reason: DialogLlmRetryExhaustedReason, message: string);
10
11
  }
12
+ export declare class LlmRequestFailedError extends Error {
13
+ readonly detail: string;
14
+ readonly streamErrorEmitted: boolean;
15
+ readonly i18nStopReason?: DialogDisplayTextI18n;
16
+ constructor(args: {
17
+ message: string;
18
+ detail: string;
19
+ streamErrorEmitted: boolean;
20
+ i18nStopReason?: DialogDisplayTextI18n;
21
+ });
22
+ }
11
23
  export declare function maybePrepareDiligenceAutoContinuePrompt(options: {
12
24
  dlg: Dialog;
13
25
  isRootDialog: boolean;
@@ -50,8 +62,10 @@ export declare function runLlmRequestWithRetry<T>(params: {
50
62
  retryBackoffMultiplier: number;
51
63
  retryMaxDelayMs: number;
52
64
  classifyFailure?: LlmFailureClassifier;
65
+ quirkFailureHandlerSession?: LlmFailureQuirkHandlerSession;
53
66
  canRetry: () => boolean;
54
67
  onRetry?: () => Promise<void> | void;
55
68
  onGiveUp?: () => Promise<void> | void;
69
+ onRetryStopped?: (reason: DialogLlmRetryExhaustedReason) => Promise<'continue' | 'stop'> | 'continue' | 'stop';
56
70
  doRequest: () => Promise<T>;
57
71
  }): Promise<T>;
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.LlmRetryStoppedError = void 0;
36
+ exports.LlmRequestFailedError = exports.LlmRetryStoppedError = void 0;
37
37
  exports.maybePrepareDiligenceAutoContinuePrompt = maybePrepareDiligenceAutoContinuePrompt;
38
38
  exports.suspendForKeepGoingBudgetExhausted = suspendForKeepGoingBudgetExhausted;
39
39
  exports.validateFuncToolArguments = validateFuncToolArguments;
@@ -50,6 +50,8 @@ const driver_messages_1 = require("../../runtime/driver-messages");
50
50
  const work_language_1 = require("../../runtime/work-language");
51
51
  const tool_1 = require("../../tool");
52
52
  const api_quirks_1 = require("../api-quirks");
53
+ const gen_1 = require("../gen");
54
+ const stop_reason_i18n_1 = require("../stop-reason-i18n");
53
55
  class LlmRetryStoppedError extends Error {
54
56
  constructor(reason, message) {
55
57
  super(message);
@@ -58,6 +60,16 @@ class LlmRetryStoppedError extends Error {
58
60
  }
59
61
  }
60
62
  exports.LlmRetryStoppedError = LlmRetryStoppedError;
63
+ class LlmRequestFailedError extends Error {
64
+ constructor(args) {
65
+ super(args.message);
66
+ this.name = 'LlmRequestFailedError';
67
+ this.detail = args.detail;
68
+ this.streamErrorEmitted = args.streamErrorEmitted;
69
+ this.i18nStopReason = args.i18nStopReason;
70
+ }
71
+ }
72
+ exports.LlmRequestFailedError = LlmRequestFailedError;
61
73
  function isNodeErrorWithCode(error) {
62
74
  return error instanceof Error && 'code' in error;
63
75
  }
@@ -616,6 +628,7 @@ function buildLlmRetryExhaustedReason(args) {
616
628
  kind: 'llm_retry_stopped',
617
629
  error: args.errorText,
618
630
  display: args.display,
631
+ recoveryAction: args.recoveryAction ?? { kind: 'none' },
619
632
  };
620
633
  }
621
634
  async function runLlmRequestWithRetry(params) {
@@ -626,7 +639,7 @@ async function runLlmRequestWithRetry(params) {
626
639
  const retryMaxDelayMs = normalizeRetryMaxDelayMs(params.retryMaxDelayMs, Math.max(retryInitialDelayMs, retryConservativeDelayMs));
627
640
  const retryFlowStartedAtMs = Date.now();
628
641
  let activeRetryContext;
629
- const quirkFailureHandler = (0, api_quirks_1.createLlmFailureQuirkHandlerSession)(params.providerConfig);
642
+ const quirkFailureHandler = params.quirkFailureHandlerSession ?? (0, api_quirks_1.createLlmFailureQuirkHandlerSession)(params.providerConfig);
630
643
  let policyRetryCount = 0;
631
644
  for (let attempt = 0;; attempt++) {
632
645
  try {
@@ -647,6 +660,7 @@ async function runLlmRequestWithRetry(params) {
647
660
  });
648
661
  }
649
662
  const res = await params.doRequest();
663
+ quirkFailureHandler?.onRequestSucceeded?.();
650
664
  decaySmartRateAdaptiveState({
651
665
  providerId: params.provider,
652
666
  modelId: params.modelId,
@@ -672,6 +686,9 @@ async function runLlmRequestWithRetry(params) {
672
686
  if (params.abortSignal?.aborted) {
673
687
  throw err;
674
688
  }
689
+ if (err instanceof gen_1.LlmStreamErrorEmittedError) {
690
+ throw err;
691
+ }
675
692
  const defaultFailure = classifyLlmFailure(err, params.classifyFailure);
676
693
  const handledFailure = applyQuirkFailureHandling(defaultFailure, quirkFailureHandler?.onFailure({
677
694
  provider: params.provider,
@@ -699,6 +716,7 @@ async function runLlmRequestWithRetry(params) {
699
716
  policyRetryCount,
700
717
  failureKind: failure.kind,
701
718
  quirkHandling: handledFailure.handling.kind,
719
+ quirkSource: handledFailure.handling.sourceQuirk,
702
720
  status: failure.status,
703
721
  code: failure.code,
704
722
  errorCode,
@@ -720,13 +738,26 @@ async function runLlmRequestWithRetry(params) {
720
738
  errorText: detail,
721
739
  },
722
740
  });
741
+ let streamErrorEmitted = false;
723
742
  try {
724
743
  await params.dlg.streamError(detail);
744
+ streamErrorEmitted = true;
725
745
  }
726
746
  catch {
727
747
  // best-effort
728
748
  }
729
- throw new Error(`Provider '${params.provider}' rejected the request: ${failure.message}`);
749
+ throw new LlmRequestFailedError({
750
+ message: `Provider '${params.provider}' rejected the request: ${failure.message}`,
751
+ detail,
752
+ streamErrorEmitted,
753
+ i18nStopReason: (0, stop_reason_i18n_1.buildHumanSystemStopReasonTextI18n)({
754
+ detail,
755
+ providerName: params.providerConfig.name.trim().length > 0
756
+ ? params.providerConfig.name
757
+ : params.provider,
758
+ kind: 'provider_rejected',
759
+ }),
760
+ });
730
761
  }
731
762
  const canRetry = failure.kind === 'retriable' && params.canRetry();
732
763
  const stopRetryByQuirk = handledFailure.handling.kind === 'give_up';
@@ -757,13 +788,32 @@ async function runLlmRequestWithRetry(params) {
757
788
  const interruptionReason = buildLlmRetryExhaustedReason({
758
789
  errorText: detail,
759
790
  display,
791
+ recoveryAction: handledFailure.handling.kind === 'give_up'
792
+ ? handledFailure.handling.recoveryAction
793
+ : undefined,
760
794
  });
761
- emitLlmRetryEventBestEffort({
762
- dlg: params.dlg,
763
- phase: 'stopped',
764
- continueEnabled: false,
765
- reason: interruptionReason,
766
- });
795
+ const retryStoppedDecision = params.onRetryStopped
796
+ ? await params.onRetryStopped(interruptionReason)
797
+ : 'stop';
798
+ if (retryStoppedDecision === 'continue') {
799
+ quirkFailureHandler?.onRecoveryActionUsed?.({
800
+ action: interruptionReason.recoveryAction,
801
+ sourceQuirk: handledFailure.handling.sourceQuirk,
802
+ });
803
+ }
804
+ if (retryStoppedDecision !== 'continue') {
805
+ // Keep the retry-stop progress event non-resumable by default. Do not flip this to
806
+ // true just because the eventual finalized stopped state may allow manual Continue:
807
+ // this event is emitted before the driver has fully unwound, cleared interrupted
808
+ // markers, and persisted the terminal projection, so enabling Continue here would
809
+ // advertise a resume action that is not yet safe or actually available.
810
+ emitLlmRetryEventBestEffort({
811
+ dlg: params.dlg,
812
+ phase: 'stopped',
813
+ continueEnabled: false,
814
+ reason: interruptionReason,
815
+ });
816
+ }
767
817
  log_1.log.warn('LLM retriable failure stopped retry flow', undefined, {
768
818
  provider: params.provider,
769
819
  dialogId: params.dlg.id.valueOf(),
@@ -780,6 +830,8 @@ async function runLlmRequestWithRetry(params) {
780
830
  retryMaxDelayMs,
781
831
  stopRetryByQuirk,
782
832
  errorText: detail,
833
+ retryStoppedDecision,
834
+ quirkSource: handledFailure.handling.sourceQuirk,
783
835
  summaryTextI18nOverride,
784
836
  });
785
837
  const interruptionDetail = formatLlmRetryExhaustedInterruptionDetail({
@@ -789,8 +841,10 @@ async function runLlmRequestWithRetry(params) {
789
841
  });
790
842
  retryStoppedError = new LlmRetryStoppedError(interruptionReason, interruptionDetail);
791
843
  }
844
+ let streamErrorEmitted = false;
792
845
  try {
793
846
  await params.dlg.streamError(detail);
847
+ streamErrorEmitted = true;
794
848
  }
795
849
  catch {
796
850
  // best-effort
@@ -798,7 +852,18 @@ async function runLlmRequestWithRetry(params) {
798
852
  if (retryStoppedError) {
799
853
  throw retryStoppedError;
800
854
  }
801
- throw new Error(`LLM failed: ${failure.message}`);
855
+ throw new LlmRequestFailedError({
856
+ message: `LLM failed: ${failure.message}`,
857
+ detail,
858
+ streamErrorEmitted,
859
+ i18nStopReason: (0, stop_reason_i18n_1.buildHumanSystemStopReasonTextI18n)({
860
+ detail,
861
+ providerName: params.providerConfig.name.trim().length > 0
862
+ ? params.providerConfig.name
863
+ : params.provider,
864
+ fallbackKind: 'request_failed',
865
+ }),
866
+ });
802
867
  }
803
868
  const conservativeRampAttempt = Math.max(0, Math.floor(attempt / 10));
804
869
  const backoffMs = handledFailure.handling.kind === 'single_retry'
@@ -0,0 +1,9 @@
1
+ import type { DialogDisplayTextI18n } from '@longrun-ai/kernel/types/display-state';
2
+ type HumanStopReasonKind = 'aborted' | 'transport_interrupted' | 'malformed_stream' | 'conflicting_stream' | 'invalid_tool_call' | 'incomplete_tool_call_stream' | 'invalid_tool_context' | 'provider_rejected' | 'request_failed' | 'identical_update_plan_loop' | 'generic';
3
+ export declare function buildHumanSystemStopReasonTextI18n(args: {
4
+ detail: string;
5
+ providerName?: string;
6
+ kind?: Exclude<HumanStopReasonKind, 'generic'>;
7
+ fallbackKind?: Exclude<HumanStopReasonKind, 'generic'>;
8
+ }): DialogDisplayTextI18n;
9
+ export {};
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildHumanSystemStopReasonTextI18n = buildHumanSystemStopReasonTextI18n;
4
+ function isNonEmptyString(value) {
5
+ return typeof value === 'string' && value.trim() !== '';
6
+ }
7
+ function formatUpstreamRawMessage(detail, language) {
8
+ const trimmed = detail.trim();
9
+ if (trimmed === '') {
10
+ return '';
11
+ }
12
+ return language === 'zh' ? `上游原文:${trimmed}` : `Upstream message: ${trimmed}`;
13
+ }
14
+ function inferHumanStopReasonKind(detail) {
15
+ const lower = detail.toLowerCase();
16
+ if (lower === 'aborted.' || lower === 'aborted') {
17
+ return 'aborted';
18
+ }
19
+ if (lower.includes('unexpected eof')) {
20
+ return 'transport_interrupted';
21
+ }
22
+ if (lower.includes('malformed stream event')) {
23
+ return 'malformed_stream';
24
+ }
25
+ if (lower.includes('stream overlap violation') || lower.startsWith('protocol violation:')) {
26
+ return 'conflicting_stream';
27
+ }
28
+ if (lower.includes('invalid tool call index')) {
29
+ return 'invalid_tool_call';
30
+ }
31
+ if (lower.includes('incomplete function-call stream state')) {
32
+ return 'incomplete_tool_call_stream';
33
+ }
34
+ if (lower.includes('tool_call_adjacency_violation') || lower.includes('tool call adjacency')) {
35
+ return 'invalid_tool_context';
36
+ }
37
+ if (lower.includes('provider projection') || lower.includes('context reconstruction')) {
38
+ return 'invalid_tool_context';
39
+ }
40
+ return 'generic';
41
+ }
42
+ function renderHumanStopReason(args) {
43
+ const providerText = isNonEmptyString(args.providerName)
44
+ ? args.language === 'zh'
45
+ ? `模型服务“${args.providerName}”`
46
+ : `LLM provider '${args.providerName}'`
47
+ : args.language === 'zh'
48
+ ? '模型服务'
49
+ : 'The LLM service';
50
+ switch (args.kind) {
51
+ case 'aborted':
52
+ return args.language === 'zh' ? '已中止。' : 'Aborted.';
53
+ case 'transport_interrupted':
54
+ return args.language === 'zh'
55
+ ? '与模型服务的连接意外中断,本次生成已停止。'
56
+ : 'The connection to the LLM service ended unexpectedly. This generation was stopped.';
57
+ case 'malformed_stream':
58
+ return args.language === 'zh'
59
+ ? '模型服务返回了格式异常的流式事件,本次生成已停止。'
60
+ : 'The LLM service returned a malformed stream event. This generation was stopped.';
61
+ case 'conflicting_stream':
62
+ return args.language === 'zh'
63
+ ? '模型服务返回了互相冲突的流式片段,本次生成已停止。'
64
+ : 'The LLM service returned conflicting stream segments. This generation was stopped.';
65
+ case 'invalid_tool_call':
66
+ return args.language === 'zh'
67
+ ? '模型服务返回了无效的工具调用信息,本次生成已停止。'
68
+ : 'The LLM service returned invalid tool-call data. This generation was stopped.';
69
+ case 'incomplete_tool_call_stream':
70
+ return args.language === 'zh'
71
+ ? '模型服务返回了不完整的工具调用流,本次生成已停止。'
72
+ : 'The LLM service returned an incomplete tool-call stream. This generation was stopped.';
73
+ case 'invalid_tool_context':
74
+ return args.language === 'zh'
75
+ ? '当前对话中的工具调用上下文不一致,本次生成已停止。'
76
+ : 'The tool-call context in this dialog became inconsistent. This generation was stopped.';
77
+ case 'provider_rejected':
78
+ return args.language === 'zh'
79
+ ? `${providerText}拒绝了这次请求,本次生成已停止。${formatUpstreamRawMessage(args.detail, 'zh')}`
80
+ : `${providerText} rejected this request. This generation was stopped. ${formatUpstreamRawMessage(args.detail, 'en')}`;
81
+ case 'request_failed':
82
+ return args.language === 'zh'
83
+ ? `本次生成因上游报错而停止。${formatUpstreamRawMessage(args.detail, 'zh')}`
84
+ : `This generation was stopped because the upstream service returned an error. ${formatUpstreamRawMessage(args.detail, 'en')}`;
85
+ case 'identical_update_plan_loop':
86
+ return args.language === 'zh'
87
+ ? '模型连续重复相同的 update_plan 结果,本次生成已停止。'
88
+ : 'The model repeated the same update_plan result multiple times. This generation was stopped.';
89
+ case 'generic':
90
+ return args.language === 'zh'
91
+ ? `本次生成已因系统错误停止。${formatUpstreamRawMessage(args.detail, 'zh')}`
92
+ : `This generation was stopped because of a system error. ${formatUpstreamRawMessage(args.detail, 'en')}`;
93
+ }
94
+ }
95
+ function buildHumanSystemStopReasonTextI18n(args) {
96
+ const inferredKind = args.kind ?? inferHumanStopReasonKind(args.detail);
97
+ const resolvedKind = inferredKind === 'generic' && args.fallbackKind !== undefined
98
+ ? args.fallbackKind
99
+ : inferredKind;
100
+ return {
101
+ zh: renderHumanStopReason({
102
+ language: 'zh',
103
+ kind: resolvedKind,
104
+ detail: args.detail,
105
+ providerName: args.providerName,
106
+ }),
107
+ en: renderHumanStopReason({
108
+ language: 'en',
109
+ kind: resolvedKind,
110
+ detail: args.detail,
111
+ providerName: args.providerName,
112
+ }),
113
+ };
114
+ }
@@ -0,0 +1,26 @@
1
+ export type DomindsPersistenceFileSource = 'dialog_state' | 'dialog_latest' | 'dialog_metadata' | 'dialog_course_events' | 'reminder_state' | 'questions4human_state' | 'pending_subdialogs' | 'subdialog_responses' | 'subdialog_registry';
2
+ export type DomindsPersistenceFileOperation = 'read' | 'parse';
3
+ export type DomindsPersistenceFileFormat = 'yaml' | 'json' | 'jsonl';
4
+ type DomindsPersistenceFileErrorArgs = {
5
+ message: string;
6
+ source: DomindsPersistenceFileSource;
7
+ operation: DomindsPersistenceFileOperation;
8
+ format: DomindsPersistenceFileFormat;
9
+ filePath: string;
10
+ eofLike: boolean;
11
+ lineNumber?: number;
12
+ cause?: unknown;
13
+ };
14
+ export declare class DomindsPersistenceFileError extends Error {
15
+ readonly code = "DOMINDS_PERSISTENCE_FILE_ERROR";
16
+ readonly source: DomindsPersistenceFileSource;
17
+ readonly operation: DomindsPersistenceFileOperation;
18
+ readonly format: DomindsPersistenceFileFormat;
19
+ readonly filePath: string;
20
+ readonly eofLike: boolean;
21
+ readonly lineNumber?: number;
22
+ readonly cause?: unknown;
23
+ constructor(args: DomindsPersistenceFileErrorArgs);
24
+ }
25
+ export declare function findDomindsPersistenceFileError(error: unknown): DomindsPersistenceFileError | undefined;
26
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomindsPersistenceFileError = void 0;
4
+ exports.findDomindsPersistenceFileError = findDomindsPersistenceFileError;
5
+ class DomindsPersistenceFileError extends Error {
6
+ constructor(args) {
7
+ super(args.message);
8
+ this.code = 'DOMINDS_PERSISTENCE_FILE_ERROR';
9
+ this.name = 'DomindsPersistenceFileError';
10
+ this.source = args.source;
11
+ this.operation = args.operation;
12
+ this.format = args.format;
13
+ this.filePath = args.filePath;
14
+ this.eofLike = args.eofLike;
15
+ this.lineNumber = args.lineNumber;
16
+ this.cause = args.cause;
17
+ }
18
+ }
19
+ exports.DomindsPersistenceFileError = DomindsPersistenceFileError;
20
+ function isObjectLike(value) {
21
+ return typeof value === 'object' && value !== null;
22
+ }
23
+ function readNestedError(value) {
24
+ if (typeof value === 'object' &&
25
+ value !== null &&
26
+ 'error' in value &&
27
+ typeof value.error === 'object' &&
28
+ value.error !== null) {
29
+ return value.error;
30
+ }
31
+ return undefined;
32
+ }
33
+ function readCause(value) {
34
+ if (value instanceof Error) {
35
+ const withCause = value;
36
+ return withCause.cause;
37
+ }
38
+ if (typeof value === 'object' && value !== null && 'cause' in value) {
39
+ return value.cause;
40
+ }
41
+ return undefined;
42
+ }
43
+ function findDomindsPersistenceFileError(error) {
44
+ const queue = [error];
45
+ const visited = new Set();
46
+ while (queue.length > 0) {
47
+ const current = queue.shift();
48
+ if (current instanceof DomindsPersistenceFileError) {
49
+ return current;
50
+ }
51
+ if (!isObjectLike(current)) {
52
+ continue;
53
+ }
54
+ if (visited.has(current)) {
55
+ continue;
56
+ }
57
+ visited.add(current);
58
+ const nestedError = readNestedError(current);
59
+ if (nestedError !== undefined) {
60
+ queue.push(nestedError);
61
+ }
62
+ const cause = readCause(current);
63
+ if (cause !== undefined) {
64
+ queue.push(cause);
65
+ }
66
+ }
67
+ return undefined;
68
+ }