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.
- package/dist/llm/client.d.ts +1 -0
- package/dist/llm/defaults.yaml +1 -0
- package/dist/llm/gen/anthropic.d.ts +2 -1
- package/dist/llm/gen/anthropic.js +4 -0
- package/dist/llm/gen/codex.d.ts +2 -1
- package/dist/llm/gen/codex.js +4 -0
- package/dist/llm/gen/failure-classifier.d.ts +3 -0
- package/dist/llm/gen/failure-classifier.js +156 -0
- package/dist/llm/gen/openai-compatible.d.ts +2 -1
- package/dist/llm/gen/openai-compatible.js +4 -0
- package/dist/llm/gen/openai.d.ts +2 -1
- package/dist/llm/gen/openai.js +4 -0
- package/dist/llm/gen.d.ts +10 -0
- package/dist/llm/kernel-driver/drive.js +18 -1
- package/dist/llm/kernel-driver/flow.js +15 -20
- package/dist/llm/kernel-driver/reply-guidance.d.ts +7 -1
- package/dist/llm/kernel-driver/reply-guidance.js +30 -4
- package/dist/llm/kernel-driver/runtime.d.ts +3 -0
- package/dist/llm/kernel-driver/runtime.js +103 -30
- package/dist/runtime/inter-dialog-format.js +46 -16
- package/dist/runtime/reply-prompt-copy.d.ts +12 -2
- package/dist/runtime/reply-prompt-copy.js +74 -16
- package/dist/runtime/tellask-labels.d.ts +8 -0
- package/dist/runtime/tellask-labels.js +47 -0
- package/dist/tools/pending-tellask-reminder.js +3 -19
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-B1lGEusm.js → _basePickBy-B7AM8mGp.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-B1lGEusm.js.map → _basePickBy-B7AM8mGp.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-SGAsMSaE.js → _baseUniq-CNN5ldgV.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-SGAsMSaE.js.map → _baseUniq-CNN5ldgV.js.map} +1 -1
- package/webapp/dist/assets/{arc-B2joU0eL.js → arc-BhUaxSjh.js} +2 -2
- package/webapp/dist/assets/{arc-B2joU0eL.js.map → arc-BhUaxSjh.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CsuG-Xa3.js → architectureDiagram-2XIMDMQ5-jM4BY3EG.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CsuG-Xa3.js.map → architectureDiagram-2XIMDMQ5-jM4BY3EG.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D8_SVEGn.js → blockDiagram-WCTKOSBZ-Di66FrI-.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D8_SVEGn.js.map → blockDiagram-WCTKOSBZ-Di66FrI-.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D_lhLw36.js → c4Diagram-IC4MRINW-DGiSo37G.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D_lhLw36.js.map → c4Diagram-IC4MRINW-DGiSo37G.js.map} +1 -1
- package/webapp/dist/assets/{channel-BI76pqQS.js → channel-CnYgZC93.js} +2 -2
- package/webapp/dist/assets/{channel-BI76pqQS.js.map → channel-CnYgZC93.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-BVI27QNV.js → chunk-4BX2VUAB-DUBRT6TH.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-BVI27QNV.js.map → chunk-4BX2VUAB-DUBRT6TH.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-D2ECkhpq.js → chunk-55IACEB6-CRKEnqbq.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-D2ECkhpq.js.map → chunk-55IACEB6-CRKEnqbq.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-BAtzNqV5.js → chunk-FMBD7UC4-DvfF97AX.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-BAtzNqV5.js.map → chunk-FMBD7UC4-DvfF97AX.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-BYyIDBzB.js → chunk-JSJVCQXG-CVAIB7Yc.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-BYyIDBzB.js.map → chunk-JSJVCQXG-CVAIB7Yc.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-Dt3XFfSl.js → chunk-KX2RTZJC-CdlioJA0.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-Dt3XFfSl.js.map → chunk-KX2RTZJC-CdlioJA0.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CZmmNdX5.js → chunk-NQ4KR5QH-FV2ESz_U.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CZmmNdX5.js.map → chunk-NQ4KR5QH-FV2ESz_U.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-BI_lqvsU.js → chunk-QZHKN3VN-D_uo77qV.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-BI_lqvsU.js.map → chunk-QZHKN3VN-D_uo77qV.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-Cd-rWL8V.js → chunk-WL4C6EOR-BTOqiSyq.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-Cd-rWL8V.js.map → chunk-WL4C6EOR-BTOqiSyq.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CGVpNFjf.js → classDiagram-VBA2DB6C-CyQrle8d.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CGVpNFjf.js.map → classDiagram-VBA2DB6C-CyQrle8d.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CGVpNFjf.js → classDiagram-v2-RAHNMMFH-CyQrle8d.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CGVpNFjf.js.map → classDiagram-v2-RAHNMMFH-CyQrle8d.js.map} +1 -1
- package/webapp/dist/assets/{clone-BcAwA2lT.js → clone-DDxFLx6p.js} +2 -2
- package/webapp/dist/assets/{clone-BcAwA2lT.js.map → clone-DDxFLx6p.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CfkPOIie.js → cose-bilkent-S5V4N54A-CKrio5Hp.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CfkPOIie.js.map → cose-bilkent-S5V4N54A-CKrio5Hp.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-ETpwT3pg.js → dagre-KLK3FWXG-BgDI0iqb.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-ETpwT3pg.js.map → dagre-KLK3FWXG-BgDI0iqb.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-CAkt3_Wu.js → diagram-E7M64L7V-CtDB5DRa.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-CAkt3_Wu.js.map → diagram-E7M64L7V-CtDB5DRa.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-BUoOrHGY.js → diagram-IFDJBPK2-B2dc9MR-.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-BUoOrHGY.js.map → diagram-IFDJBPK2-B2dc9MR-.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-CITRT5KI.js → diagram-P4PSJMXO-DVZNcAOH.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-CITRT5KI.js.map → diagram-P4PSJMXO-DVZNcAOH.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Cjpy0ose.js → erDiagram-INFDFZHY-BOHPg145.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Cjpy0ose.js.map → erDiagram-INFDFZHY-BOHPg145.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-CBmrK8ST.js → flowDiagram-PKNHOUZH-Vdh_Pi85.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-CBmrK8ST.js.map → flowDiagram-PKNHOUZH-Vdh_Pi85.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CLoJRKb7.js → ganttDiagram-A5KZAMGK-DpKT1WIU.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CLoJRKb7.js.map → ganttDiagram-A5KZAMGK-DpKT1WIU.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DcAa_Q3i.js → gitGraphDiagram-K3NZZRJ6-BoXiXc9_.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-DcAa_Q3i.js.map → gitGraphDiagram-K3NZZRJ6-BoXiXc9_.js.map} +1 -1
- package/webapp/dist/assets/{graph-CyYArI_M.js → graph-D2HjO4iO.js} +3 -3
- package/webapp/dist/assets/{graph-CyYArI_M.js.map → graph-D2HjO4iO.js.map} +1 -1
- package/webapp/dist/assets/{index-B219Q97D.js → index-D0yfoEzC.js} +59 -37
- package/webapp/dist/assets/{index-B219Q97D.js.map → index-D0yfoEzC.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXY1BDG-.js → infoDiagram-LFFYTUFH-D7T4vLo1.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CXY1BDG-.js.map → infoDiagram-LFFYTUFH-D7T4vLo1.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-CCgHez0F.js → ishikawaDiagram-PHBUUO56-BwqSA5c4.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-CCgHez0F.js.map → ishikawaDiagram-PHBUUO56-BwqSA5c4.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-jFEOb3_9.js → journeyDiagram-4ABVD52K-oJpBqbvV.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-jFEOb3_9.js.map → journeyDiagram-4ABVD52K-oJpBqbvV.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-g9DIRWk3.js → kanban-definition-K7BYSVSG-CUjSUlek.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-g9DIRWk3.js.map → kanban-definition-K7BYSVSG-CUjSUlek.js.map} +1 -1
- package/webapp/dist/assets/{layout-BvoIJLam.js → layout-B-mChjgy.js} +5 -5
- package/webapp/dist/assets/{layout-BvoIJLam.js.map → layout-B-mChjgy.js.map} +1 -1
- package/webapp/dist/assets/{linear-WhxKIgP6.js → linear-BlAb78my.js} +2 -2
- package/webapp/dist/assets/{linear-WhxKIgP6.js.map → linear-BlAb78my.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BXxTVKab.js → mindmap-definition-YRQLILUH-BM5j79AR.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BXxTVKab.js.map → mindmap-definition-YRQLILUH-BM5j79AR.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BVfKuFkc.js → pieDiagram-SKSYHLDU-C_AaSKX_.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-BVfKuFkc.js.map → pieDiagram-SKSYHLDU-C_AaSKX_.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DjOan1Ul.js → quadrantDiagram-337W2JSQ-DtC1icZQ.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DjOan1Ul.js.map → quadrantDiagram-337W2JSQ-DtC1icZQ.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CdkkhNJu.js → requirementDiagram-Z7DCOOCP-DMeQBRmf.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CdkkhNJu.js.map → requirementDiagram-Z7DCOOCP-DMeQBRmf.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cc7UCE1M.js → sankeyDiagram-WA2Y5GQK-CU-iv5Ut.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cc7UCE1M.js.map → sankeyDiagram-WA2Y5GQK-CU-iv5Ut.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CAf-TzzV.js → sequenceDiagram-2WXFIKYE-wOjTTWlz.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CAf-TzzV.js.map → sequenceDiagram-2WXFIKYE-wOjTTWlz.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CjQh2yGU.js → stateDiagram-RAJIS63D--D3xxVba.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CjQh2yGU.js.map → stateDiagram-RAJIS63D--D3xxVba.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BINESHF-.js → stateDiagram-v2-FVOUBMTO-BMC53oDX.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BINESHF-.js.map → stateDiagram-v2-FVOUBMTO-BMC53oDX.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-FCh1aV2p.js → timeline-definition-YZTLITO2-CeHaNNRV.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-FCh1aV2p.js.map → timeline-definition-YZTLITO2-CeHaNNRV.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-J-UTxKUf.js → treemap-KZPCXAKY-BKPUHmNk.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-J-UTxKUf.js.map → treemap-KZPCXAKY-BKPUHmNk.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-T1yQlS2L.js → vennDiagram-LZ73GAT5-B_xjnmx1.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-T1yQlS2L.js.map → vennDiagram-LZ73GAT5-B_xjnmx1.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-KYLvRsLH.js → xychartDiagram-JWTSCODW-BW781zxi.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-KYLvRsLH.js.map → xychartDiagram-JWTSCODW-BW781zxi.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
package/dist/llm/client.d.ts
CHANGED
|
@@ -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;
|
package/dist/llm/defaults.yaml
CHANGED
|
@@ -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)
|
package/dist/llm/gen/codex.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/llm/gen/codex.js
CHANGED
|
@@ -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,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)
|
package/dist/llm/gen/openai.d.ts
CHANGED
|
@@ -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
|
}
|
package/dist/llm/gen/openai.js
CHANGED
|
@@ -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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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;
|