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.
- package/dist/dialog-display-state.d.ts +4 -0
- package/dist/dialog-display-state.js +138 -19
- package/dist/dialog-fork.js +13 -5
- package/dist/dialog-interruption.d.ts +18 -0
- package/dist/dialog-interruption.js +34 -0
- package/dist/docs/dominds-agent-collaboration.zh.md +401 -0
- package/dist/llm/api-quirks.d.ts +11 -0
- package/dist/llm/api-quirks.js +322 -24
- package/dist/llm/defaults.yaml +2 -1
- package/dist/llm/gen/mock.d.ts +1 -1
- package/dist/llm/gen/mock.js +12 -0
- package/dist/llm/gen/openai-compatible.d.ts +1 -1
- package/dist/llm/gen/openai-compatible.js +9 -1
- package/dist/llm/gen/openai.d.ts +1 -1
- package/dist/llm/gen/openai.js +16 -2
- package/dist/llm/gen.d.ts +10 -0
- package/dist/llm/gen.js +10 -0
- package/dist/llm/kernel-driver/drive.js +994 -866
- package/dist/llm/kernel-driver/runtime.d.ts +16 -2
- package/dist/llm/kernel-driver/runtime.js +75 -10
- package/dist/llm/stop-reason-i18n.d.ts +9 -0
- package/dist/llm/stop-reason-i18n.js +114 -0
- package/dist/persistence-errors.d.ts +26 -0
- package/dist/persistence-errors.js +68 -0
- package/dist/persistence.d.ts +119 -82
- package/dist/persistence.js +1055 -426
- package/dist/server/api-routes.js +174 -58
- package/dist/server/websocket-handler.js +125 -21
- package/dist/tools/team_mgmt.js +2 -2
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-C0MXVhMo.js → _basePickBy-BJWCmtUm.js} +3 -3
- package/webapp/dist/assets/_basePickBy-BJWCmtUm.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-CRygl41M.js → _baseUniq-D6k_lGfs.js} +2 -2
- package/webapp/dist/assets/_baseUniq-D6k_lGfs.js.map +1 -0
- package/webapp/dist/assets/{arc-BeHJtnt2.js → arc-DYDaESgj.js} +2 -2
- package/webapp/dist/assets/arc-DYDaESgj.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CGdo5TVi.js → architectureDiagram-VXUJARFQ-DZMT7dqc.js} +8 -26
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DZMT7dqc.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-C59VaSGw.js → blockDiagram-VD42YOAC-CABpgVAa.js} +170 -187
- package/webapp/dist/assets/blockDiagram-VD42YOAC-CABpgVAa.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-B3YCBmTx.js → c4Diagram-YG6GDRKO-COLZS8Ul.js} +4 -4
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-COLZS8Ul.js.map +1 -0
- package/webapp/dist/assets/{channel-Dn4i8EAY.js → channel-CYFm9Cri.js} +2 -2
- package/webapp/dist/assets/channel-CYFm9Cri.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-CQbB3HlW.js → chunk-4BX2VUAB-CX_-XbaN.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-CX_-XbaN.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-CkQR_Qu9.js → chunk-55IACEB6-ByD-NdBC.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-ByD-NdBC.js.map +1 -0
- package/webapp/dist/assets/{chunk-WL4C6EOR-Bjl-j3bf.js → chunk-B4BG7PRW-BANemsDD.js} +121 -171
- package/webapp/dist/assets/chunk-B4BG7PRW-BANemsDD.js.map +1 -0
- package/webapp/dist/assets/{chunk-NQ4KR5QH-DBxY8LL2.js → chunk-DI55MBZ5-DV7sdJmQ.js} +7 -9
- package/webapp/dist/assets/chunk-DI55MBZ5-DV7sdJmQ.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-YSIOuaST.js → chunk-FMBD7UC4-DYGviJnf.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-DYGviJnf.js.map +1 -0
- package/webapp/dist/assets/{chunk-KX2RTZJC-DFiwgnFf.js → chunk-QN33PNHL-B8DWRL9f.js} +2 -2
- package/webapp/dist/assets/chunk-QN33PNHL-B8DWRL9f.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-BAdR6lLc.js → chunk-QZHKN3VN-B1aYIzMR.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-B1aYIzMR.js.map +1 -0
- package/webapp/dist/assets/{chunk-JSJVCQXG-CWDLRawz.js → chunk-TZMSLE5B-_HISzxl3.js} +6 -14
- package/webapp/dist/assets/chunk-TZMSLE5B-_HISzxl3.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-KBeS6WXD.js → classDiagram-2ON5EDUG-CpyYj1Rc.js} +6 -7
- package/webapp/dist/assets/classDiagram-2ON5EDUG-CpyYj1Rc.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-KBeS6WXD.js → classDiagram-v2-WZHVMYZB-CpyYj1Rc.js} +6 -7
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CpyYj1Rc.js.map +1 -0
- package/webapp/dist/assets/{clone-C7-aS2vm.js → clone-B_9AxWIU.js} +2 -2
- package/webapp/dist/assets/clone-B_9AxWIU.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Bo5IsL-5.js → cose-bilkent-S5V4N54A-17ECLfPR.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-17ECLfPR.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-C3FeHj7D.js → dagre-6UL2VRFP-DhRqcF1o.js} +7 -7
- package/webapp/dist/assets/dagre-6UL2VRFP-DhRqcF1o.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-0HfiRW0u.js → diagram-PSM6KHXK-lpDT6Wwb.js} +10 -10
- package/webapp/dist/assets/diagram-PSM6KHXK-lpDT6Wwb.js.map +1 -0
- package/webapp/dist/assets/{diagram-IFDJBPK2-DJwh7SMO.js → diagram-QEK2KX5R-ohxbPpDH.js} +8 -9
- package/webapp/dist/assets/diagram-QEK2KX5R-ohxbPpDH.js.map +1 -0
- package/webapp/dist/assets/{diagram-P4PSJMXO-Y0RbvUZX.js → diagram-S2PKOQOG-DAFFGfch.js} +8 -8
- package/webapp/dist/assets/diagram-S2PKOQOG-DAFFGfch.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-INFDFZHY-B183xyLa.js → erDiagram-Q2GNP2WA-BH-7rI43.js} +75 -96
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-BH-7rI43.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-C_BR3Y3J.js → flowDiagram-NV44I4VS-CdEjFbz4.js} +81 -98
- package/webapp/dist/assets/flowDiagram-NV44I4VS-CdEjFbz4.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-CHLgkuJT.js → ganttDiagram-JELNMOA3-Cju2t-lK.js} +3 -28
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-Cju2t-lK.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js → gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js} +46 -38
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-CUJ5oxCg.js.map +1 -0
- package/webapp/dist/assets/graph-mhcc7ldf.js +425 -0
- package/webapp/dist/assets/graph-mhcc7ldf.js.map +1 -0
- package/webapp/dist/assets/{index-CLoNHmSQ.js → index-BLnM-uON.js} +2098 -1841
- package/webapp/dist/assets/{index-CLoNHmSQ.js.map → index-BLnM-uON.js.map} +1 -1
- package/webapp/dist/assets/{index-YaxF76or.css → index-xvYYeHuy.css} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-mnMS61NO.js → infoDiagram-HS3SLOUP-Df8p0okQ.js} +7 -7
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-Df8p0okQ.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BdeERn0r.js → journeyDiagram-XKPGCS4Q-BXMl8H-d.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BXMl8H-d.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-MLeCGcYg.js → kanban-definition-3W4ZIXB7-Cc5RwCEh.js} +3 -5
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-Cc5RwCEh.js.map +1 -0
- package/webapp/dist/assets/{layout-DY9VEQ9M.js → layout-BB2SvQcE.js} +5 -5
- package/webapp/dist/assets/layout-BB2SvQcE.js.map +1 -0
- package/webapp/dist/assets/{linear-D-T1xRsr.js → linear-Cj50lA0a.js} +2 -2
- package/webapp/dist/assets/linear-Cj50lA0a.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-CrVm8vj2.js → mindmap-definition-VGOIOE7T-BLBklJVX.js} +5 -7
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BLBklJVX.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-GtLLV0r1.js → pieDiagram-ADFJNKIX-BQrOgSc-.js} +8 -8
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-BQrOgSc-.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BCgk_2LP.js → quadrantDiagram-AYHSOK5B-C62TxtsO.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-C62TxtsO.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DYUKHWKR.js → requirementDiagram-UZGBJVZJ-Is6Q3osM.js} +6 -16
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-Is6Q3osM.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CFAH8OaY.js → sankeyDiagram-TZEHDZUN-CCAW8Dr2.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CCAW8Dr2.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BTnhbv6w.js → sequenceDiagram-WL72ISMW-DpODpbl6.js} +201 -601
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-DpODpbl6.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-DWUnJTwO.js → stateDiagram-FKZM4ZOC-B8LHaf5T.js} +9 -9
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-B8LHaf5T.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-B-fc52bp.js → stateDiagram-v2-4FDKWEC3-4FzTkpgz.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-4FzTkpgz.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BMZ52QaG.js → timeline-definition-IT6M3QCI-Ckxc4qZe.js} +3 -3
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-Ckxc4qZe.js.map +1 -0
- package/webapp/dist/assets/{treemap-KZPCXAKY-fgSrze0S.js → treemap-GDKQZRPO-QQa4vKMv.js} +24 -37
- package/webapp/dist/assets/treemap-GDKQZRPO-QQa4vKMv.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-D6aviLtC.js → xychartDiagram-PRI3JC2R-Ba2uJcs6.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-Ba2uJcs6.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/_basePickBy-C0MXVhMo.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-CRygl41M.js.map +0 -1
- package/webapp/dist/assets/arc-BeHJtnt2.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CGdo5TVi.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-C59VaSGw.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-IC4MRINW-B3YCBmTx.js.map +0 -1
- package/webapp/dist/assets/channel-Dn4i8EAY.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-CQbB3HlW.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-CkQR_Qu9.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-YSIOuaST.js.map +0 -1
- package/webapp/dist/assets/chunk-JSJVCQXG-CWDLRawz.js.map +0 -1
- package/webapp/dist/assets/chunk-KX2RTZJC-DFiwgnFf.js.map +0 -1
- package/webapp/dist/assets/chunk-NQ4KR5QH-DBxY8LL2.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-BAdR6lLc.js.map +0 -1
- package/webapp/dist/assets/chunk-WL4C6EOR-Bjl-j3bf.js.map +0 -1
- package/webapp/dist/assets/classDiagram-VBA2DB6C-KBeS6WXD.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-KBeS6WXD.js.map +0 -1
- package/webapp/dist/assets/clone-C7-aS2vm.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-Bo5IsL-5.js.map +0 -1
- package/webapp/dist/assets/dagre-KLK3FWXG-C3FeHj7D.js.map +0 -1
- package/webapp/dist/assets/diagram-E7M64L7V-0HfiRW0u.js.map +0 -1
- package/webapp/dist/assets/diagram-IFDJBPK2-DJwh7SMO.js.map +0 -1
- package/webapp/dist/assets/diagram-P4PSJMXO-Y0RbvUZX.js.map +0 -1
- package/webapp/dist/assets/erDiagram-INFDFZHY-B183xyLa.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-C_BR3Y3J.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-CHLgkuJT.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D6C_HU1q.js.map +0 -1
- package/webapp/dist/assets/graph-D0hgB-X8.js +0 -782
- package/webapp/dist/assets/graph-D0hgB-X8.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-mnMS61NO.js.map +0 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js +0 -966
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-XFIJsnJj.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-BdeERn0r.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-MLeCGcYg.js.map +0 -1
- package/webapp/dist/assets/layout-DY9VEQ9M.js.map +0 -1
- package/webapp/dist/assets/linear-D-T1xRsr.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-CrVm8vj2.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-GtLLV0r1.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-BCgk_2LP.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DYUKHWKR.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CFAH8OaY.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-BTnhbv6w.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-RAJIS63D-DWUnJTwO.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-B-fc52bp.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-YZTLITO2-BMZ52QaG.js.map +0 -1
- package/webapp/dist/assets/treemap-KZPCXAKY-fgSrze0S.js.map +0 -1
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js +0 -2487
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-D5DmDY9l.js.map +0 -1
- 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
|
|
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
|
|
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
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
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
|
|
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
|
+
}
|