dominds 1.12.2 → 1.13.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 (121) hide show
  1. package/dist/llm/client.d.ts +1 -0
  2. package/dist/llm/defaults.yaml +1 -0
  3. package/dist/llm/gen/anthropic.d.ts +2 -1
  4. package/dist/llm/gen/anthropic.js +4 -0
  5. package/dist/llm/gen/codex.d.ts +2 -1
  6. package/dist/llm/gen/codex.js +4 -0
  7. package/dist/llm/gen/failure-classifier.d.ts +3 -0
  8. package/dist/llm/gen/failure-classifier.js +156 -0
  9. package/dist/llm/gen/openai-compatible.d.ts +2 -1
  10. package/dist/llm/gen/openai-compatible.js +4 -0
  11. package/dist/llm/gen/openai.d.ts +2 -1
  12. package/dist/llm/gen/openai.js +4 -0
  13. package/dist/llm/gen.d.ts +10 -0
  14. package/dist/llm/kernel-driver/drive.js +18 -1
  15. package/dist/llm/kernel-driver/flow.js +15 -20
  16. package/dist/llm/kernel-driver/reply-guidance.d.ts +7 -1
  17. package/dist/llm/kernel-driver/reply-guidance.js +30 -4
  18. package/dist/llm/kernel-driver/runtime.d.ts +3 -0
  19. package/dist/llm/kernel-driver/runtime.js +103 -30
  20. package/dist/runtime/inter-dialog-format.js +46 -16
  21. package/dist/runtime/reply-prompt-copy.d.ts +12 -2
  22. package/dist/runtime/reply-prompt-copy.js +74 -16
  23. package/dist/runtime/tellask-labels.d.ts +8 -0
  24. package/dist/runtime/tellask-labels.js +47 -0
  25. package/dist/tools/pending-tellask-reminder.js +3 -19
  26. package/package.json +3 -3
  27. package/webapp/dist/assets/{_basePickBy-B1lGEusm.js → _basePickBy-B7AM8mGp.js} +3 -3
  28. package/webapp/dist/assets/{_basePickBy-B1lGEusm.js.map → _basePickBy-B7AM8mGp.js.map} +1 -1
  29. package/webapp/dist/assets/{_baseUniq-SGAsMSaE.js → _baseUniq-CNN5ldgV.js} +2 -2
  30. package/webapp/dist/assets/{_baseUniq-SGAsMSaE.js.map → _baseUniq-CNN5ldgV.js.map} +1 -1
  31. package/webapp/dist/assets/{arc-B2joU0eL.js → arc-BhUaxSjh.js} +2 -2
  32. package/webapp/dist/assets/{arc-B2joU0eL.js.map → arc-BhUaxSjh.js.map} +1 -1
  33. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CsuG-Xa3.js → architectureDiagram-2XIMDMQ5-jM4BY3EG.js} +7 -7
  34. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CsuG-Xa3.js.map → architectureDiagram-2XIMDMQ5-jM4BY3EG.js.map} +1 -1
  35. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D8_SVEGn.js → blockDiagram-WCTKOSBZ-Di66FrI-.js} +7 -7
  36. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D8_SVEGn.js.map → blockDiagram-WCTKOSBZ-Di66FrI-.js.map} +1 -1
  37. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D_lhLw36.js → c4Diagram-IC4MRINW-DGiSo37G.js} +3 -3
  38. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D_lhLw36.js.map → c4Diagram-IC4MRINW-DGiSo37G.js.map} +1 -1
  39. package/webapp/dist/assets/{channel-BI76pqQS.js → channel-CnYgZC93.js} +2 -2
  40. package/webapp/dist/assets/{channel-BI76pqQS.js.map → channel-CnYgZC93.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-4BX2VUAB-BVI27QNV.js → chunk-4BX2VUAB-DUBRT6TH.js} +2 -2
  42. package/webapp/dist/assets/{chunk-4BX2VUAB-BVI27QNV.js.map → chunk-4BX2VUAB-DUBRT6TH.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-55IACEB6-D2ECkhpq.js → chunk-55IACEB6-CRKEnqbq.js} +2 -2
  44. package/webapp/dist/assets/{chunk-55IACEB6-D2ECkhpq.js.map → chunk-55IACEB6-CRKEnqbq.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-FMBD7UC4-BAtzNqV5.js → chunk-FMBD7UC4-DvfF97AX.js} +2 -2
  46. package/webapp/dist/assets/{chunk-FMBD7UC4-BAtzNqV5.js.map → chunk-FMBD7UC4-DvfF97AX.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-JSJVCQXG-BYyIDBzB.js → chunk-JSJVCQXG-CVAIB7Yc.js} +2 -2
  48. package/webapp/dist/assets/{chunk-JSJVCQXG-BYyIDBzB.js.map → chunk-JSJVCQXG-CVAIB7Yc.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-KX2RTZJC-Dt3XFfSl.js → chunk-KX2RTZJC-CdlioJA0.js} +2 -2
  50. package/webapp/dist/assets/{chunk-KX2RTZJC-Dt3XFfSl.js.map → chunk-KX2RTZJC-CdlioJA0.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-NQ4KR5QH-CZmmNdX5.js → chunk-NQ4KR5QH-FV2ESz_U.js} +4 -4
  52. package/webapp/dist/assets/{chunk-NQ4KR5QH-CZmmNdX5.js.map → chunk-NQ4KR5QH-FV2ESz_U.js.map} +1 -1
  53. package/webapp/dist/assets/{chunk-QZHKN3VN-BI_lqvsU.js → chunk-QZHKN3VN-D_uo77qV.js} +2 -2
  54. package/webapp/dist/assets/{chunk-QZHKN3VN-BI_lqvsU.js.map → chunk-QZHKN3VN-D_uo77qV.js.map} +1 -1
  55. package/webapp/dist/assets/{chunk-WL4C6EOR-Cd-rWL8V.js → chunk-WL4C6EOR-BTOqiSyq.js} +6 -6
  56. package/webapp/dist/assets/{chunk-WL4C6EOR-Cd-rWL8V.js.map → chunk-WL4C6EOR-BTOqiSyq.js.map} +1 -1
  57. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CGVpNFjf.js → classDiagram-VBA2DB6C-CyQrle8d.js} +7 -7
  58. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CGVpNFjf.js.map → classDiagram-VBA2DB6C-CyQrle8d.js.map} +1 -1
  59. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CGVpNFjf.js → classDiagram-v2-RAHNMMFH-CyQrle8d.js} +7 -7
  60. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CGVpNFjf.js.map → classDiagram-v2-RAHNMMFH-CyQrle8d.js.map} +1 -1
  61. package/webapp/dist/assets/{clone-BcAwA2lT.js → clone-DDxFLx6p.js} +2 -2
  62. package/webapp/dist/assets/{clone-BcAwA2lT.js.map → clone-DDxFLx6p.js.map} +1 -1
  63. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CfkPOIie.js → cose-bilkent-S5V4N54A-CKrio5Hp.js} +2 -2
  64. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CfkPOIie.js.map → cose-bilkent-S5V4N54A-CKrio5Hp.js.map} +1 -1
  65. package/webapp/dist/assets/{dagre-KLK3FWXG-ETpwT3pg.js → dagre-KLK3FWXG-BgDI0iqb.js} +7 -7
  66. package/webapp/dist/assets/{dagre-KLK3FWXG-ETpwT3pg.js.map → dagre-KLK3FWXG-BgDI0iqb.js.map} +1 -1
  67. package/webapp/dist/assets/{diagram-E7M64L7V-CAkt3_Wu.js → diagram-E7M64L7V-CtDB5DRa.js} +8 -8
  68. package/webapp/dist/assets/{diagram-E7M64L7V-CAkt3_Wu.js.map → diagram-E7M64L7V-CtDB5DRa.js.map} +1 -1
  69. package/webapp/dist/assets/{diagram-IFDJBPK2-BUoOrHGY.js → diagram-IFDJBPK2-B2dc9MR-.js} +7 -7
  70. package/webapp/dist/assets/{diagram-IFDJBPK2-BUoOrHGY.js.map → diagram-IFDJBPK2-B2dc9MR-.js.map} +1 -1
  71. package/webapp/dist/assets/{diagram-P4PSJMXO-CITRT5KI.js → diagram-P4PSJMXO-DVZNcAOH.js} +7 -7
  72. package/webapp/dist/assets/{diagram-P4PSJMXO-CITRT5KI.js.map → diagram-P4PSJMXO-DVZNcAOH.js.map} +1 -1
  73. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cjpy0ose.js → erDiagram-INFDFZHY-BOHPg145.js} +5 -5
  74. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cjpy0ose.js.map → erDiagram-INFDFZHY-BOHPg145.js.map} +1 -1
  75. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-CBmrK8ST.js → flowDiagram-PKNHOUZH-Vdh_Pi85.js} +7 -7
  76. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-CBmrK8ST.js.map → flowDiagram-PKNHOUZH-Vdh_Pi85.js.map} +1 -1
  77. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CLoJRKb7.js → ganttDiagram-A5KZAMGK-DpKT1WIU.js} +3 -3
  78. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CLoJRKb7.js.map → ganttDiagram-A5KZAMGK-DpKT1WIU.js.map} +1 -1
  79. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DcAa_Q3i.js → gitGraphDiagram-K3NZZRJ6-BoXiXc9_.js} +8 -8
  80. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DcAa_Q3i.js.map → gitGraphDiagram-K3NZZRJ6-BoXiXc9_.js.map} +1 -1
  81. package/webapp/dist/assets/{graph-CyYArI_M.js → graph-D2HjO4iO.js} +3 -3
  82. package/webapp/dist/assets/{graph-CyYArI_M.js.map → graph-D2HjO4iO.js.map} +1 -1
  83. package/webapp/dist/assets/{index-B219Q97D.js → index-D0yfoEzC.js} +59 -37
  84. package/webapp/dist/assets/{index-B219Q97D.js.map → index-D0yfoEzC.js.map} +1 -1
  85. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXY1BDG-.js → infoDiagram-LFFYTUFH-D7T4vLo1.js} +6 -6
  86. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXY1BDG-.js.map → infoDiagram-LFFYTUFH-D7T4vLo1.js.map} +1 -1
  87. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-CCgHez0F.js → ishikawaDiagram-PHBUUO56-BwqSA5c4.js} +2 -2
  88. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-CCgHez0F.js.map → ishikawaDiagram-PHBUUO56-BwqSA5c4.js.map} +1 -1
  89. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-jFEOb3_9.js → journeyDiagram-4ABVD52K-oJpBqbvV.js} +5 -5
  90. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-jFEOb3_9.js.map → journeyDiagram-4ABVD52K-oJpBqbvV.js.map} +1 -1
  91. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-g9DIRWk3.js → kanban-definition-K7BYSVSG-CUjSUlek.js} +3 -3
  92. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-g9DIRWk3.js.map → kanban-definition-K7BYSVSG-CUjSUlek.js.map} +1 -1
  93. package/webapp/dist/assets/{layout-BvoIJLam.js → layout-B-mChjgy.js} +5 -5
  94. package/webapp/dist/assets/{layout-BvoIJLam.js.map → layout-B-mChjgy.js.map} +1 -1
  95. package/webapp/dist/assets/{linear-WhxKIgP6.js → linear-BlAb78my.js} +2 -2
  96. package/webapp/dist/assets/{linear-WhxKIgP6.js.map → linear-BlAb78my.js.map} +1 -1
  97. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BXxTVKab.js → mindmap-definition-YRQLILUH-BM5j79AR.js} +4 -4
  98. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BXxTVKab.js.map → mindmap-definition-YRQLILUH-BM5j79AR.js.map} +1 -1
  99. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BVfKuFkc.js → pieDiagram-SKSYHLDU-C_AaSKX_.js} +8 -8
  100. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BVfKuFkc.js.map → pieDiagram-SKSYHLDU-C_AaSKX_.js.map} +1 -1
  101. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DjOan1Ul.js → quadrantDiagram-337W2JSQ-DtC1icZQ.js} +3 -3
  102. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DjOan1Ul.js.map → quadrantDiagram-337W2JSQ-DtC1icZQ.js.map} +1 -1
  103. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CdkkhNJu.js → requirementDiagram-Z7DCOOCP-DMeQBRmf.js} +4 -4
  104. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CdkkhNJu.js.map → requirementDiagram-Z7DCOOCP-DMeQBRmf.js.map} +1 -1
  105. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cc7UCE1M.js → sankeyDiagram-WA2Y5GQK-CU-iv5Ut.js} +2 -2
  106. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cc7UCE1M.js.map → sankeyDiagram-WA2Y5GQK-CU-iv5Ut.js.map} +1 -1
  107. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CAf-TzzV.js → sequenceDiagram-2WXFIKYE-wOjTTWlz.js} +4 -4
  108. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CAf-TzzV.js.map → sequenceDiagram-2WXFIKYE-wOjTTWlz.js.map} +1 -1
  109. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CjQh2yGU.js → stateDiagram-RAJIS63D--D3xxVba.js} +9 -9
  110. package/webapp/dist/assets/{stateDiagram-RAJIS63D-CjQh2yGU.js.map → stateDiagram-RAJIS63D--D3xxVba.js.map} +1 -1
  111. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BINESHF-.js → stateDiagram-v2-FVOUBMTO-BMC53oDX.js} +5 -5
  112. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BINESHF-.js.map → stateDiagram-v2-FVOUBMTO-BMC53oDX.js.map} +1 -1
  113. package/webapp/dist/assets/{timeline-definition-YZTLITO2-FCh1aV2p.js → timeline-definition-YZTLITO2-CeHaNNRV.js} +3 -3
  114. package/webapp/dist/assets/{timeline-definition-YZTLITO2-FCh1aV2p.js.map → timeline-definition-YZTLITO2-CeHaNNRV.js.map} +1 -1
  115. package/webapp/dist/assets/{treemap-KZPCXAKY-J-UTxKUf.js → treemap-KZPCXAKY-BKPUHmNk.js} +5 -5
  116. package/webapp/dist/assets/{treemap-KZPCXAKY-J-UTxKUf.js.map → treemap-KZPCXAKY-BKPUHmNk.js.map} +1 -1
  117. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-T1yQlS2L.js → vennDiagram-LZ73GAT5-B_xjnmx1.js} +2 -2
  118. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-T1yQlS2L.js.map → vennDiagram-LZ73GAT5-B_xjnmx1.js.map} +1 -1
  119. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-KYLvRsLH.js → xychartDiagram-JWTSCODW-BW781zxi.js} +3 -3
  120. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-KYLvRsLH.js.map → xychartDiagram-JWTSCODW-BW781zxi.js.map} +1 -1
  121. package/webapp/dist/index.html +1 -1
@@ -57,6 +57,7 @@ export type ProviderConfig = {
57
57
  tool_result_max_chars?: number;
58
58
  llm_retry_max_retries?: number;
59
59
  llm_retry_initial_delay_ms?: number;
60
+ llm_retry_conservative_delay_ms?: number;
60
61
  llm_retry_backoff_multiplier?: number;
61
62
  llm_retry_max_delay_ms?: number;
62
63
  tech_spec_url?: string;
@@ -1,6 +1,7 @@
1
1
  # Optional provider-level retry controls for kernel dialog driving:
2
2
  # - llm_retry_max_retries: extra retries after the initial attempt (default 99; ~41.2h total retry window with current backoff defaults).
3
3
  # - llm_retry_initial_delay_ms: delay before the 1st retry (default 1000).
4
+ # - llm_retry_conservative_delay_ms: base delay for provider-classified conservative retries (default 30000; fixed for first 10 retries, then ramps by x1.5 with the normal max-delay cap).
4
5
  # - llm_retry_backoff_multiplier: exponential factor between retries (default 1.5).
5
6
  # - llm_retry_max_delay_ms: upper bound for retry delay (default 1800000 / 30m).
6
7
  # - tool_result_max_chars: optional transport-level cap for a single tool-result text payload
@@ -3,7 +3,7 @@ import type { LlmUsageStats } from '@longrun-ai/kernel/types/context-health';
3
3
  import type { Team } from '../../team';
4
4
  import type { FuncTool } from '../../tool';
5
5
  import type { ChatMessage, ProviderConfig } from '../client';
6
- import type { LlmBatchResult, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
6
+ import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
7
7
  export type AnthropicStreamConsumeResult = {
8
8
  usage: LlmUsageStats;
9
9
  llmGenModel?: string;
@@ -28,6 +28,7 @@ export declare function reconstructAnthropicContextWrapperAsync(persistedMessage
28
28
  */
29
29
  export declare class AnthropicGen implements LlmGenerator {
30
30
  get apiType(): string;
31
+ classifyFailure(error: unknown): LlmFailureDisposition | undefined;
31
32
  genToReceiver(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], receiver: LlmStreamReceiver, _genseq: number, abortSignal?: AbortSignal): Promise<LlmStreamResult>;
32
33
  genMoreMessages(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], genseq: number, abortSignal?: AbortSignal): Promise<LlmBatchResult>;
33
34
  }
@@ -15,6 +15,7 @@ const log_1 = require("../../log");
15
15
  const i18n_text_1 = require("../../runtime/i18n-text");
16
16
  const work_language_1 = require("../../runtime/work-language");
17
17
  const artifacts_1 = require("./artifacts");
18
+ const failure_classifier_1 = require("./failure-classifier");
18
19
  const tool_call_context_1 = require("./tool-call-context");
19
20
  const tool_output_limit_1 = require("./tool-output-limit");
20
21
  const log = (0, log_1.createLogger)('llm/anthropic');
@@ -822,6 +823,9 @@ class AnthropicGen {
822
823
  get apiType() {
823
824
  return 'anthropic';
824
825
  }
826
+ classifyFailure(error) {
827
+ return (0, failure_classifier_1.classifyAnthropicFailure)(error);
828
+ }
825
829
  async genToReceiver(providerConfig, agent, systemPrompt, funcTools, _requestContext, context, receiver, _genseq, abortSignal) {
826
830
  const apiKey = process.env[providerConfig.apiKeyEnvVar];
827
831
  if (!apiKey)
@@ -7,10 +7,11 @@ import type { ChatGptResponsesRequest } from '@longrun-ai/codex-auth';
7
7
  import type { Team } from '../../team';
8
8
  import type { FuncTool } from '../../tool';
9
9
  import type { ChatMessage, ProviderConfig } from '../client';
10
- import type { LlmBatchResult, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
10
+ import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
11
11
  export declare function resolveCodexServiceTier(serviceTier: ChatGptResponsesRequest['service_tier'] | undefined): Exclude<NonNullable<ChatGptResponsesRequest['service_tier']>, 'default'> | undefined;
12
12
  export declare class CodexGen implements LlmGenerator {
13
13
  get apiType(): string;
14
+ classifyFailure(error: unknown): LlmFailureDisposition | undefined;
14
15
  genToReceiver(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], requestContext: LlmRequestContext, context: ChatMessage[], receiver: LlmStreamReceiver, _genseq: number, abortSignal?: AbortSignal): Promise<LlmStreamResult>;
15
16
  genMoreMessages(_providerConfig: ProviderConfig, _agent: Team.Member, _systemPrompt: string, _funcTools: FuncTool[], _requestContext: LlmRequestContext, _context: ChatMessage[], _genseq: number): Promise<LlmBatchResult>;
16
17
  }
@@ -39,6 +39,7 @@ const log_1 = require("../../log");
39
39
  const i18n_text_1 = require("../../runtime/i18n-text");
40
40
  const work_language_1 = require("../../runtime/work-language");
41
41
  const artifacts_1 = require("./artifacts");
42
+ const failure_classifier_1 = require("./failure-classifier");
42
43
  const tool_call_context_1 = require("./tool-call-context");
43
44
  const tool_output_limit_1 = require("./tool-output-limit");
44
45
  const log = (0, log_1.createLogger)('llm/codex');
@@ -443,6 +444,9 @@ class CodexGen {
443
444
  get apiType() {
444
445
  return 'codex';
445
446
  }
447
+ classifyFailure(error) {
448
+ return (0, failure_classifier_1.classifyOpenAiLikeFailure)(error);
449
+ }
446
450
  async genToReceiver(providerConfig, agent, systemPrompt, funcTools, requestContext, context, receiver, _genseq, abortSignal) {
447
451
  const codexHomeValue = process.env[providerConfig.apiKeyEnvVar] || '~/.codex';
448
452
  const codexHome = codexHomeValue.startsWith('~')
@@ -0,0 +1,3 @@
1
+ import type { LlmFailureDisposition } from '../gen';
2
+ export declare function classifyOpenAiLikeFailure(error: unknown): LlmFailureDisposition | undefined;
3
+ export declare function classifyAnthropicFailure(error: unknown): LlmFailureDisposition | undefined;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyOpenAiLikeFailure = classifyOpenAiLikeFailure;
4
+ exports.classifyAnthropicFailure = classifyAnthropicFailure;
5
+ function isPlainObject(value) {
6
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
7
+ }
8
+ function readNestedError(error) {
9
+ if (!isPlainObject(error) || !('error' in error) || !isPlainObject(error.error)) {
10
+ return undefined;
11
+ }
12
+ return error.error;
13
+ }
14
+ function readErrorStatus(error) {
15
+ if (isPlainObject(error)) {
16
+ if ('status' in error && typeof error.status === 'number') {
17
+ return error.status;
18
+ }
19
+ if ('statusCode' in error && typeof error.statusCode === 'number') {
20
+ return error.statusCode;
21
+ }
22
+ }
23
+ const nested = readNestedError(error);
24
+ if (!nested) {
25
+ return undefined;
26
+ }
27
+ if ('status' in nested && typeof nested.status === 'number') {
28
+ return nested.status;
29
+ }
30
+ if ('statusCode' in nested && typeof nested.statusCode === 'number') {
31
+ return nested.statusCode;
32
+ }
33
+ return undefined;
34
+ }
35
+ function readErrorCode(error) {
36
+ if (isPlainObject(error)) {
37
+ if ('code' in error && typeof error.code === 'string') {
38
+ return error.code;
39
+ }
40
+ if ('errno' in error && typeof error.errno === 'string') {
41
+ return error.errno;
42
+ }
43
+ }
44
+ const nested = readNestedError(error);
45
+ if (nested && 'code' in nested && typeof nested.code === 'string') {
46
+ return nested.code;
47
+ }
48
+ return undefined;
49
+ }
50
+ function readErrorType(error) {
51
+ if (isPlainObject(error) && 'type' in error && typeof error.type === 'string') {
52
+ return error.type;
53
+ }
54
+ const nested = readNestedError(error);
55
+ if (nested && 'type' in nested && typeof nested.type === 'string') {
56
+ return nested.type;
57
+ }
58
+ return undefined;
59
+ }
60
+ function readErrorMessage(error) {
61
+ if (error instanceof Error) {
62
+ const message = error.message.trim();
63
+ return message.length > 0 ? message : error.name;
64
+ }
65
+ if (typeof error === 'string') {
66
+ const message = error.trim();
67
+ return message.length > 0 ? message : undefined;
68
+ }
69
+ if (isPlainObject(error) && 'message' in error && typeof error.message === 'string') {
70
+ const message = error.message.trim();
71
+ if (message.length > 0) {
72
+ return message;
73
+ }
74
+ }
75
+ const nested = readNestedError(error);
76
+ if (nested && 'message' in nested && typeof nested.message === 'string') {
77
+ const message = nested.message.trim();
78
+ return message.length > 0 ? message : undefined;
79
+ }
80
+ return undefined;
81
+ }
82
+ function buildFailureMessage(error) {
83
+ return readErrorMessage(error) ?? 'Unknown LLM provider error.';
84
+ }
85
+ function isOpenAiRetriableProcessingFailureMessage(lowerMessage) {
86
+ if (!lowerMessage.includes('processing your request')) {
87
+ return false;
88
+ }
89
+ if (lowerMessage.includes('you can retry your request') ||
90
+ lowerMessage.includes('please retry your request')) {
91
+ return true;
92
+ }
93
+ return lowerMessage.includes('help.openai.com') && lowerMessage.includes('request id');
94
+ }
95
+ function isConservativeRetryMessage(lowerMessage) {
96
+ if (lowerMessage.includes('servers are currently overloaded')) {
97
+ return true;
98
+ }
99
+ if (lowerMessage.includes('server is currently overloaded')) {
100
+ return true;
101
+ }
102
+ if (lowerMessage.includes('currently overloaded')) {
103
+ return true;
104
+ }
105
+ if (lowerMessage.includes('temporarily overloaded')) {
106
+ return true;
107
+ }
108
+ if (lowerMessage.includes('service unavailable')) {
109
+ return true;
110
+ }
111
+ return lowerMessage.includes('overloaded') && lowerMessage.includes('try again later');
112
+ }
113
+ function classifyOpenAiLikeFailure(error) {
114
+ const message = buildFailureMessage(error);
115
+ const lowerMessage = message.toLowerCase();
116
+ const status = readErrorStatus(error);
117
+ const code = readErrorCode(error);
118
+ if (status === 503 || status === 529 || isConservativeRetryMessage(lowerMessage)) {
119
+ return {
120
+ kind: 'retriable',
121
+ message,
122
+ status,
123
+ code,
124
+ retryStrategy: 'conservative',
125
+ };
126
+ }
127
+ if (isOpenAiRetriableProcessingFailureMessage(lowerMessage)) {
128
+ return {
129
+ kind: 'retriable',
130
+ message,
131
+ status,
132
+ code,
133
+ retryStrategy: 'aggressive',
134
+ };
135
+ }
136
+ return undefined;
137
+ }
138
+ function classifyAnthropicFailure(error) {
139
+ const message = buildFailureMessage(error);
140
+ const lowerMessage = message.toLowerCase();
141
+ const status = readErrorStatus(error);
142
+ const code = readErrorCode(error);
143
+ const errorType = readErrorType(error);
144
+ if (errorType === 'overloaded_error' ||
145
+ status === 529 ||
146
+ isConservativeRetryMessage(lowerMessage)) {
147
+ return {
148
+ kind: 'retriable',
149
+ message,
150
+ status,
151
+ code,
152
+ retryStrategy: 'conservative',
153
+ };
154
+ }
155
+ return undefined;
156
+ }
@@ -12,13 +12,14 @@ import type { ChatCompletionMessageParam } from 'openai/resources/chat/completio
12
12
  import type { Team } from '../../team';
13
13
  import type { FuncTool } from '../../tool';
14
14
  import type { ChatMessage, ProviderConfig } from '../client';
15
- import type { LlmBatchResult, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
15
+ import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
16
16
  export declare function buildOpenAiCompatibleRequestMessagesWrapper(systemPrompt: string, context: ChatMessage[], options?: {
17
17
  reasoningContentMode?: boolean;
18
18
  providerConfig?: ProviderConfig;
19
19
  }): Promise<ChatCompletionMessageParam[]>;
20
20
  export declare class OpenAiCompatibleGen implements LlmGenerator {
21
21
  get apiType(): string;
22
+ classifyFailure(error: unknown): LlmFailureDisposition | undefined;
22
23
  genToReceiver(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], receiver: LlmStreamReceiver, genseq: number, abortSignal?: AbortSignal): Promise<LlmStreamResult>;
23
24
  genMoreMessages(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], genseq: number, abortSignal?: AbortSignal): Promise<LlmBatchResult>;
24
25
  }
@@ -20,6 +20,7 @@ const log_1 = require("../../log");
20
20
  const i18n_text_1 = require("../../runtime/i18n-text");
21
21
  const work_language_1 = require("../../runtime/work-language");
22
22
  const artifacts_1 = require("./artifacts");
23
+ const failure_classifier_1 = require("./failure-classifier");
23
24
  const tool_call_context_1 = require("./tool-call-context");
24
25
  const tool_output_limit_1 = require("./tool-output-limit");
25
26
  const log = (0, log_1.createLogger)('llm/openai-compatible');
@@ -476,6 +477,9 @@ class OpenAiCompatibleGen {
476
477
  get apiType() {
477
478
  return 'openai-compatible';
478
479
  }
480
+ classifyFailure(error) {
481
+ return (0, failure_classifier_1.classifyOpenAiLikeFailure)(error);
482
+ }
479
483
  async genToReceiver(providerConfig, agent, systemPrompt, funcTools, _requestContext, context, receiver, genseq, abortSignal) {
480
484
  const apiKey = process.env[providerConfig.apiKeyEnvVar];
481
485
  if (!apiKey)
@@ -7,10 +7,11 @@ import type { ResponseInputItem } from 'openai/resources/responses/responses';
7
7
  import type { Team } from '../../team';
8
8
  import type { FuncTool } from '../../tool';
9
9
  import type { ChatMessage, ProviderConfig } from '../client';
10
- import type { LlmBatchResult, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
10
+ import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
11
11
  export declare function buildOpenAiRequestInputWrapper(context: ChatMessage[], providerConfig?: ProviderConfig): Promise<ResponseInputItem[]>;
12
12
  export declare class OpenAiGen implements LlmGenerator {
13
13
  get apiType(): string;
14
+ classifyFailure(error: unknown): LlmFailureDisposition | undefined;
14
15
  genToReceiver(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], receiver: LlmStreamReceiver, _genseq: number, abortSignal?: AbortSignal): Promise<LlmStreamResult>;
15
16
  genMoreMessages(providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], _requestContext: LlmRequestContext, context: ChatMessage[], genseq: number, abortSignal?: AbortSignal): Promise<LlmBatchResult>;
16
17
  }
@@ -15,6 +15,7 @@ const log_1 = require("../../log");
15
15
  const i18n_text_1 = require("../../runtime/i18n-text");
16
16
  const work_language_1 = require("../../runtime/work-language");
17
17
  const artifacts_1 = require("./artifacts");
18
+ const failure_classifier_1 = require("./failure-classifier");
18
19
  const tool_call_context_1 = require("./tool-call-context");
19
20
  const tool_output_limit_1 = require("./tool-output-limit");
20
21
  const log = (0, log_1.createLogger)('llm/openai');
@@ -463,6 +464,9 @@ class OpenAiGen {
463
464
  get apiType() {
464
465
  return 'openai';
465
466
  }
467
+ classifyFailure(error) {
468
+ return (0, failure_classifier_1.classifyOpenAiLikeFailure)(error);
469
+ }
466
470
  async genToReceiver(providerConfig, agent, systemPrompt, funcTools, _requestContext, context, receiver, _genseq, abortSignal) {
467
471
  const apiKey = process.env[providerConfig.apiKeyEnvVar];
468
472
  if (!apiKey)
package/dist/llm/gen.d.ts CHANGED
@@ -12,6 +12,15 @@ export interface LlmBatchResult {
12
12
  usage: LlmUsageStats;
13
13
  llmGenModel?: string;
14
14
  }
15
+ export type LlmRetryStrategy = 'aggressive' | 'conservative';
16
+ export type LlmFailureDisposition = {
17
+ kind: 'retriable' | 'rejected' | 'fatal';
18
+ message: string;
19
+ status?: number;
20
+ code?: string;
21
+ retryStrategy?: LlmRetryStrategy;
22
+ };
23
+ export type LlmFailureClassifier = (error: unknown) => LlmFailureDisposition | undefined;
15
24
  export interface LlmRequestContext {
16
25
  dialogSelfId: string;
17
26
  dialogRootId: string;
@@ -47,6 +56,7 @@ export interface LlmStreamReceiver {
47
56
  }
48
57
  export interface LlmGenerator {
49
58
  readonly apiType: string;
59
+ classifyFailure?: LlmFailureClassifier;
50
60
  genToReceiver: (providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], requestContext: LlmRequestContext, context: ChatMessage[], receiver: LlmStreamReceiver, genseq: number, abortSignal?: AbortSignal) => Promise<LlmStreamResult>;
51
61
  genMoreMessages: (providerConfig: ProviderConfig, agent: Team.Member, systemPrompt: string, funcTools: FuncTool[], requestContext: LlmRequestContext, context: ChatMessage[], genseq: number, abortSignal?: AbortSignal) => Promise<LlmBatchResult>;
52
62
  }
@@ -30,6 +30,7 @@ const tellask_special_1 = require("./tellask-special");
30
30
  const KERNEL_DRIVER_DEFAULT_RETRY_POLICY = {
31
31
  maxRetries: 99, // long total retry window to survive major down-time by llm providers
32
32
  initialDelayMs: 1000,
33
+ conservativeDelayMs: 30000,
33
34
  backoffMultiplier: 1.5,
34
35
  maxDelayMs: 30 * 60 * 1000, // 30 minutes
35
36
  };
@@ -136,6 +137,16 @@ function resolveRetryBackoffMultiplier(raw) {
136
137
  }
137
138
  return raw;
138
139
  }
140
+ function resolveRetryConservativeDelayMs(raw) {
141
+ if (typeof raw !== 'number' || !Number.isFinite(raw)) {
142
+ return KERNEL_DRIVER_DEFAULT_RETRY_POLICY.conservativeDelayMs;
143
+ }
144
+ const normalized = Math.floor(raw);
145
+ if (normalized < 0) {
146
+ return KERNEL_DRIVER_DEFAULT_RETRY_POLICY.conservativeDelayMs;
147
+ }
148
+ return normalized;
149
+ }
139
150
  function resolveRetryMaxDelayMs(raw) {
140
151
  if (typeof raw !== 'number' || !Number.isFinite(raw)) {
141
152
  return KERNEL_DRIVER_DEFAULT_RETRY_POLICY.maxDelayMs;
@@ -149,13 +160,15 @@ function resolveRetryMaxDelayMs(raw) {
149
160
  function resolveKernelDriverRetryPolicy(providerCfg) {
150
161
  const maxRetries = resolveRetryMaxRetries(providerCfg.llm_retry_max_retries);
151
162
  const initialDelayMs = resolveRetryInitialDelayMs(providerCfg.llm_retry_initial_delay_ms);
163
+ const conservativeDelayMs = resolveRetryConservativeDelayMs(providerCfg.llm_retry_conservative_delay_ms);
152
164
  const backoffMultiplier = resolveRetryBackoffMultiplier(providerCfg.llm_retry_backoff_multiplier);
153
165
  const maxDelayMs = resolveRetryMaxDelayMs(providerCfg.llm_retry_max_delay_ms);
154
166
  return {
155
167
  maxRetries,
156
168
  initialDelayMs,
169
+ conservativeDelayMs: Math.max(initialDelayMs, conservativeDelayMs),
157
170
  backoffMultiplier,
158
- maxDelayMs: Math.max(initialDelayMs, maxDelayMs),
171
+ maxDelayMs: Math.max(initialDelayMs, conservativeDelayMs, maxDelayMs),
159
172
  };
160
173
  }
161
174
  function hasMeaningfulBatchOutput(messages) {
@@ -1465,8 +1478,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1465
1478
  abortSignal,
1466
1479
  maxRetries: retryPolicy.maxRetries,
1467
1480
  retryInitialDelayMs: retryPolicy.initialDelayMs,
1481
+ retryConservativeDelayMs: retryPolicy.conservativeDelayMs,
1468
1482
  retryBackoffMultiplier: retryPolicy.backoffMultiplier,
1469
1483
  retryMaxDelayMs: retryPolicy.maxDelayMs,
1484
+ classifyFailure: llmGen.classifyFailure?.bind(llmGen),
1470
1485
  canRetry: () => true,
1471
1486
  doRequest: async () => {
1472
1487
  const batchResult = await llmGen.genMoreMessages(providerCfg, agent, systemPrompt, funcTools, {
@@ -1622,8 +1637,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1622
1637
  abortSignal,
1623
1638
  maxRetries: retryPolicy.maxRetries,
1624
1639
  retryInitialDelayMs: retryPolicy.initialDelayMs,
1640
+ retryConservativeDelayMs: retryPolicy.conservativeDelayMs,
1625
1641
  retryBackoffMultiplier: retryPolicy.backoffMultiplier,
1626
1642
  retryMaxDelayMs: retryPolicy.maxDelayMs,
1643
+ classifyFailure: llmGen.classifyFailure?.bind(llmGen),
1627
1644
  canRetry: () => true,
1628
1645
  onRetry: rollbackStreamAttempt,
1629
1646
  onGiveUp: rollbackStreamAttempt,
@@ -10,6 +10,7 @@ const log_1 = require("../../log");
10
10
  const load_1 = require("../../minds/load");
11
11
  const persistence_1 = require("../../persistence");
12
12
  const driver_messages_1 = require("../../runtime/driver-messages");
13
+ const reply_prompt_copy_1 = require("../../runtime/reply-prompt-copy");
13
14
  const work_language_1 = require("../../runtime/work-language");
14
15
  const client_1 = require("../client");
15
16
  const context_health_1 = require("./context-health");
@@ -28,24 +29,16 @@ function isReplyToolReminderPrompt(prompt) {
28
29
  function isIgnorablePostResponseAnchorTailEvent(type) {
29
30
  return type === 'tellask_reply_resolution_record' || type === 'gen_finish_record';
30
31
  }
31
- function buildReplyToolReminderPrompt(args) {
32
- const toolName = args.directive.expectedReplyCallName;
33
- if (args.language === 'zh') {
34
- return [
35
- REPLY_TOOL_REMINDER_PREFIX_ZH,
36
- '',
37
- `你刚才给出了正文,但尚未调用必需的 \`${toolName}\`。`,
38
- `请现在立刻调用 \`${toolName}({ replyContent })\` 完成本次对话间回贴,不要再直接输出最终消息。`,
39
- '如果你再次直接输出最终消息而仍不调用该工具,运行时当前会暂按 direct-reply fallback 投递,并在 UI/传递正文中明确标注。',
40
- ].join('\n');
41
- }
42
- return [
43
- REPLY_TOOL_REMINDER_PREFIX_EN,
44
- '',
45
- `You produced a reply body but did not call the required \`${toolName}\` tool.`,
46
- `Call \`${toolName}({ replyContent })\` now to deliver this inter-dialog reply. Do not emit another plain final message.`,
47
- 'If you still emit a plain final message without the tool, runtime will currently deliver it via direct-reply fallback and label that path explicitly in UI and transfer text.',
48
- ].join('\n');
32
+ async function buildReplyToolReminderPrompt(args) {
33
+ return (0, reply_prompt_copy_1.buildReplyToolReminderText)({
34
+ language: args.language,
35
+ directive: args.directive,
36
+ prefix: args.language === 'zh' ? REPLY_TOOL_REMINDER_PREFIX_ZH : REPLY_TOOL_REMINDER_PREFIX_EN,
37
+ replyTargetAgentId: await (0, reply_guidance_1.resolveReplyTargetAgentId)({
38
+ dlg: args.dlg,
39
+ directive: args.directive,
40
+ }),
41
+ });
49
42
  }
50
43
  async function loadPendingDiagnosticsSnapshot(args) {
51
44
  const ownerDialogIdObj = new dialog_1.DialogID(args.ownerDialogId, args.rootId);
@@ -224,7 +217,8 @@ async function maybeResolveDeferredReplyReassertionPrompt(dialog) {
224
217
  await persistence_1.DialogPersistence.setDeferredReplyReassertion(dialog.id, undefined, dialog.status);
225
218
  const language = (0, work_language_1.getWorkLanguage)();
226
219
  return {
227
- content: (0, reply_guidance_1.buildReplyObligationReassertionPrompt)({
220
+ content: await (0, reply_guidance_1.buildReplyObligationReassertionPrompt)({
221
+ dlg: dialog,
228
222
  directive: deferredReplyReassertion.directive,
229
223
  language,
230
224
  }),
@@ -637,7 +631,8 @@ async function executeDriveRound(args) {
637
631
  if (!activePromptWasReplyToolReminder) {
638
632
  const language = (0, work_language_1.getWorkLanguage)();
639
633
  followUp = {
640
- prompt: buildReplyToolReminderPrompt({
634
+ prompt: await buildReplyToolReminderPrompt({
635
+ dlg: dialog,
641
636
  directive: activeTellaskReplyDirective,
642
637
  language,
643
638
  }),
@@ -1,5 +1,10 @@
1
+ import type { TellaskReplyDirective } from '@longrun-ai/kernel/types/storage';
1
2
  import { Dialog } from '../../dialog';
2
3
  import type { KernelDriverHumanPrompt } from './types';
4
+ export declare function resolveReplyTargetAgentId(args: {
5
+ dlg: Dialog;
6
+ directive: TellaskReplyDirective;
7
+ }): Promise<string | undefined>;
3
8
  export declare function resolvePromptReplyGuidance(args: {
4
9
  dlg: Dialog;
5
10
  prompt: KernelDriverHumanPrompt | undefined;
@@ -16,6 +21,7 @@ export declare function buildReplyObligationSuppressionGuide(args: {
16
21
  language: 'zh' | 'en';
17
22
  }): string;
18
23
  export declare function buildReplyObligationReassertionPrompt(args: {
24
+ dlg: Dialog;
19
25
  directive: NonNullable<KernelDriverHumanPrompt['tellaskReplyDirective']>;
20
26
  language: 'zh' | 'en';
21
- }): string;
27
+ }): Promise<string>;
@@ -1,14 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveReplyTargetAgentId = resolveReplyTargetAgentId;
3
4
  exports.resolvePromptReplyGuidance = resolvePromptReplyGuidance;
4
5
  exports.buildReplyObligationSuppressionGuide = buildReplyObligationSuppressionGuide;
5
6
  exports.buildReplyObligationReassertionPrompt = buildReplyObligationReassertionPrompt;
6
7
  const dialog_1 = require("../../dialog");
8
+ const dialog_instance_registry_1 = require("../../dialog-instance-registry");
7
9
  const reply_prompt_copy_1 = require("../../runtime/reply-prompt-copy");
8
10
  const work_language_1 = require("../../runtime/work-language");
9
11
  const tellask_special_1 = require("./tellask-special");
10
12
  const REPLY_TOOL_REMINDER_PREFIX_EN = '[Dominds replyTellask required]';
11
13
  const REPLY_TOOL_REMINDER_PREFIX_ZH = '[Dominds 必须调用回复工具]';
14
+ async function resolveReplyTargetAgentId(args) {
15
+ switch (args.directive.expectedReplyCallName) {
16
+ case 'replyTellaskBack': {
17
+ const rootDialog = args.dlg instanceof dialog_1.RootDialog
18
+ ? args.dlg
19
+ : args.dlg instanceof dialog_1.SubDialog
20
+ ? args.dlg.rootDialog
21
+ : undefined;
22
+ if (!rootDialog) {
23
+ return undefined;
24
+ }
25
+ const targetDialogId = new dialog_1.DialogID(args.directive.targetDialogId, rootDialog.id.rootId);
26
+ const targetDialog = rootDialog.lookupDialog(targetDialogId.selfId) ??
27
+ (await (0, dialog_instance_registry_1.ensureDialogLoaded)(rootDialog, targetDialogId, rootDialog.status));
28
+ return targetDialog?.agentId;
29
+ }
30
+ case 'replyTellask':
31
+ case 'replyTellaskSessionless':
32
+ return args.dlg instanceof dialog_1.SubDialog ? args.dlg.assignmentFromSup.originMemberId : undefined;
33
+ }
34
+ }
12
35
  function buildPromptContentWithExactReplyToolName(args) {
13
36
  const isFbrSubdialog = args.dlg instanceof dialog_1.SubDialog && args.dlg.assignmentFromSup.callName === 'freshBootsReasoning';
14
37
  const noActivePrefix = args.language === 'zh'
@@ -48,13 +71,12 @@ function buildPromptContentWithExactReplyToolName(args) {
48
71
  if (args.prompt.content.startsWith(activePrefix)) {
49
72
  return args.prompt.content;
50
73
  }
51
- const toolName = directive.expectedReplyCallName;
52
74
  if (reminderPrefixes.some((prefix) => args.prompt.content.startsWith(prefix))) {
53
75
  return args.prompt.content;
54
76
  }
55
77
  const note = (0, reply_prompt_copy_1.buildActiveReplyToolNote)({
56
78
  language: args.language,
57
- toolName,
79
+ toolName: directive.expectedReplyCallName,
58
80
  });
59
81
  return `${note}\n\n${args.prompt.content}`;
60
82
  }
@@ -109,9 +131,13 @@ async function resolvePromptReplyGuidance(args) {
109
131
  function buildReplyObligationSuppressionGuide(args) {
110
132
  return (0, reply_prompt_copy_1.buildReplyObligationSuppressionGuideText)(args.language);
111
133
  }
112
- function buildReplyObligationReassertionPrompt(args) {
134
+ async function buildReplyObligationReassertionPrompt(args) {
113
135
  return (0, reply_prompt_copy_1.buildReplyObligationReassertionText)({
114
136
  language: args.language,
115
- toolName: args.directive.expectedReplyCallName,
137
+ directive: args.directive,
138
+ replyTargetAgentId: await resolveReplyTargetAgentId({
139
+ dlg: args.dlg,
140
+ directive: args.directive,
141
+ }),
116
142
  });
117
143
  }
@@ -1,5 +1,6 @@
1
1
  import { Dialog } from '../../dialog';
2
2
  import type { FuncTool, ToolArguments } from '../../tool';
3
+ import type { LlmFailureClassifier } from '../gen';
3
4
  import type { KernelDriverHumanPrompt } from './types';
4
5
  export declare function maybePrepareDiligenceAutoContinuePrompt(options: {
5
6
  dlg: Dialog;
@@ -37,8 +38,10 @@ export declare function runLlmRequestWithRetry<T>(params: {
37
38
  abortSignal?: AbortSignal;
38
39
  maxRetries: number;
39
40
  retryInitialDelayMs: number;
41
+ retryConservativeDelayMs: number;
40
42
  retryBackoffMultiplier: number;
41
43
  retryMaxDelayMs: number;
44
+ classifyFailure?: LlmFailureClassifier;
42
45
  canRetry: () => boolean;
43
46
  onRetry?: () => Promise<void> | void;
44
47
  onGiveUp?: () => Promise<void> | void;