dominds 1.24.2 → 1.24.3
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/docs/tellask-background-continuation-refactor.zh.md +144 -15
- package/dist/llm/kernel-driver/drive.js +10 -0
- package/dist/llm/kernel-driver/flow.js +289 -76
- package/dist/llm/kernel-driver/reply-guidance.js +0 -3
- package/dist/llm/kernel-driver/tellask-special.d.ts +1 -0
- package/dist/llm/kernel-driver/tellask-special.js +3 -0
- package/dist/llm/kernel-driver/types.d.ts +0 -3
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.js +33 -4
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-DBvh4H3k.js → _basePickBy-ZLV93S3E.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-DBvh4H3k.js.map → _basePickBy-ZLV93S3E.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-CQmc9B-o.js → _baseUniq-D0wSOJ06.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-CQmc9B-o.js.map → _baseUniq-D0wSOJ06.js.map} +1 -1
- package/webapp/dist/assets/{arc-DfLiOX_4.js → arc-BHclbMTS.js} +2 -2
- package/webapp/dist/assets/{arc-DfLiOX_4.js.map → arc-BHclbMTS.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CaTVJ5ev.js → architectureDiagram-2XIMDMQ5-CK99gE_D.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CaTVJ5ev.js.map → architectureDiagram-2XIMDMQ5-CK99gE_D.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-DlmAtUca.js → blockDiagram-WCTKOSBZ-fE5MBTEU.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-DlmAtUca.js.map → blockDiagram-WCTKOSBZ-fE5MBTEU.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-CNHKD5Sl.js → c4Diagram-IC4MRINW-BSLyPyoU.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-CNHKD5Sl.js.map → c4Diagram-IC4MRINW-BSLyPyoU.js.map} +1 -1
- package/webapp/dist/assets/{channel-BTWhZYd5.js → channel-DSvMpp-a.js} +2 -2
- package/webapp/dist/assets/{channel-BTWhZYd5.js.map → channel-DSvMpp-a.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-CV1n0Uhy.js → chunk-4BX2VUAB-OXEX170k.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-CV1n0Uhy.js.map → chunk-4BX2VUAB-OXEX170k.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-C5r77i_p.js → chunk-55IACEB6-BFQ_spQD.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-C5r77i_p.js.map → chunk-55IACEB6-BFQ_spQD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-DJ1yHxrH.js → chunk-FMBD7UC4-CbQ2BBPs.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-DJ1yHxrH.js.map → chunk-FMBD7UC4-CbQ2BBPs.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-Ahg9hCCm.js → chunk-JSJVCQXG-C4P1mjCL.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-Ahg9hCCm.js.map → chunk-JSJVCQXG-C4P1mjCL.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-qBrewKt0.js → chunk-KX2RTZJC-BMd-daMY.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-qBrewKt0.js.map → chunk-KX2RTZJC-BMd-daMY.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-1lEdM6Wi.js → chunk-NQ4KR5QH-B_ZhWMXR.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-1lEdM6Wi.js.map → chunk-NQ4KR5QH-B_ZhWMXR.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-ChVR749G.js → chunk-QZHKN3VN-Cbf92xIw.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-ChVR749G.js.map → chunk-QZHKN3VN-Cbf92xIw.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-BAUXgk0K.js → chunk-WL4C6EOR-PtH-blkK.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-BAUXgk0K.js.map → chunk-WL4C6EOR-PtH-blkK.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-DlqyhKve.js → classDiagram-VBA2DB6C-Dc3ncaD0.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-DlqyhKve.js.map → classDiagram-VBA2DB6C-Dc3ncaD0.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-DlqyhKve.js → classDiagram-v2-RAHNMMFH-Dc3ncaD0.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-DlqyhKve.js.map → classDiagram-v2-RAHNMMFH-Dc3ncaD0.js.map} +1 -1
- package/webapp/dist/assets/{clone-BFiIqUsc.js → clone-E9Ad85BC.js} +2 -2
- package/webapp/dist/assets/{clone-BFiIqUsc.js.map → clone-E9Ad85BC.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-JYvhtd6J.js → cose-bilkent-S5V4N54A-B-nj0o74.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-JYvhtd6J.js.map → cose-bilkent-S5V4N54A-B-nj0o74.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-CCGcQh6w.js → dagre-KLK3FWXG-CyJYNIbm.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-CCGcQh6w.js.map → dagre-KLK3FWXG-CyJYNIbm.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-BXC4AxAd.js → diagram-E7M64L7V-C8eweQ7b.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-BXC4AxAd.js.map → diagram-E7M64L7V-C8eweQ7b.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-B--Sb3XT.js → diagram-IFDJBPK2-DMdygRl0.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-B--Sb3XT.js.map → diagram-IFDJBPK2-DMdygRl0.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-CVqgtrh3.js → diagram-P4PSJMXO-BQDZHb0a.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-CVqgtrh3.js.map → diagram-P4PSJMXO-BQDZHb0a.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BniHaRTt.js → erDiagram-INFDFZHY-C1HaXN6E.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BniHaRTt.js.map → erDiagram-INFDFZHY-C1HaXN6E.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-wLKFBWTR.js → flowDiagram-PKNHOUZH-24nNqQyo.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-wLKFBWTR.js.map → flowDiagram-PKNHOUZH-24nNqQyo.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DrptcitZ.js → ganttDiagram-A5KZAMGK-BWPOFaLV.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DrptcitZ.js.map → ganttDiagram-A5KZAMGK-BWPOFaLV.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C6l5aP44.js → gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C6l5aP44.js.map → gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js.map} +1 -1
- package/webapp/dist/assets/{graph-DXuQGYQN.js → graph-OHu4dL2n.js} +3 -3
- package/webapp/dist/assets/{graph-DXuQGYQN.js.map → graph-OHu4dL2n.js.map} +1 -1
- package/webapp/dist/assets/{index-DuQ1OCMG.js → index-CDCDAfqP.js} +165 -67
- package/webapp/dist/assets/{index-DuQ1OCMG.js.map → index-CDCDAfqP.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-BbleCSjW.js → infoDiagram-LFFYTUFH-CvaBM5j6.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-BbleCSjW.js.map → infoDiagram-LFFYTUFH-CvaBM5j6.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-DmV-LZuk.js → ishikawaDiagram-PHBUUO56-DB1l2Uue.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-DmV-LZuk.js.map → ishikawaDiagram-PHBUUO56-DB1l2Uue.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D3sQFfac.js → journeyDiagram-4ABVD52K-TQR6_teO.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-D3sQFfac.js.map → journeyDiagram-4ABVD52K-TQR6_teO.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BEeBlBtM.js → kanban-definition-K7BYSVSG-B-BOuC-U.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BEeBlBtM.js.map → kanban-definition-K7BYSVSG-B-BOuC-U.js.map} +1 -1
- package/webapp/dist/assets/{layout-g7jjgV-W.js → layout-B8yqIqbx.js} +5 -5
- package/webapp/dist/assets/{layout-g7jjgV-W.js.map → layout-B8yqIqbx.js.map} +1 -1
- package/webapp/dist/assets/{linear-D_X91Yek.js → linear-CoLfiZKK.js} +2 -2
- package/webapp/dist/assets/{linear-D_X91Yek.js.map → linear-CoLfiZKK.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-NkMAIgRY.js → mindmap-definition-YRQLILUH-P70BMIHI.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-NkMAIgRY.js.map → mindmap-definition-YRQLILUH-P70BMIHI.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Z6E4GEPC.js → pieDiagram-SKSYHLDU-DsS_4dTB.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Z6E4GEPC.js.map → pieDiagram-SKSYHLDU-DsS_4dTB.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BH8hfOuU.js → quadrantDiagram-337W2JSQ-DoM9PEq-.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BH8hfOuU.js.map → quadrantDiagram-337W2JSQ-DoM9PEq-.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DRJkvoQI.js → requirementDiagram-Z7DCOOCP-Bn3lYMMI.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DRJkvoQI.js.map → requirementDiagram-Z7DCOOCP-Bn3lYMMI.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-D2VwjtJo.js → sankeyDiagram-WA2Y5GQK-97kCegRT.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-D2VwjtJo.js.map → sankeyDiagram-WA2Y5GQK-97kCegRT.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Cq-gEPOw.js → sequenceDiagram-2WXFIKYE-DXqjQjf6.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Cq-gEPOw.js.map → sequenceDiagram-2WXFIKYE-DXqjQjf6.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CFM8Jqke.js → stateDiagram-RAJIS63D-DQcTPKWP.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-CFM8Jqke.js.map → stateDiagram-RAJIS63D-DQcTPKWP.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Dip5iGX_.js → stateDiagram-v2-FVOUBMTO-DHmxRVJn.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-Dip5iGX_.js.map → stateDiagram-v2-FVOUBMTO-DHmxRVJn.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-OI9JzMjX.js → timeline-definition-YZTLITO2-BlovQQ4B.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-OI9JzMjX.js.map → timeline-definition-YZTLITO2-BlovQQ4B.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-CtNF416A.js → treemap-KZPCXAKY-CGu93c9S.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-CtNF416A.js.map → treemap-KZPCXAKY-CGu93c9S.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-CjaPj4FZ.js → vennDiagram-LZ73GAT5-Do1jprrz.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-CjaPj4FZ.js.map → vennDiagram-LZ73GAT5-Do1jprrz.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-21mBt9iu.js → xychartDiagram-JWTSCODW-BKa1DxVq.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-21mBt9iu.js.map → xychartDiagram-JWTSCODW-BKa1DxVq.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
|
@@ -70,6 +70,125 @@ async function queueReplyReminderFollowUp(args) {
|
|
|
70
70
|
function isReplyToolReminderPrompt(prompt) {
|
|
71
71
|
return typeof prompt?.content === 'string' && (0, reply_prompt_copy_1.isReplyToolReminderPromptContent)(prompt.content);
|
|
72
72
|
}
|
|
73
|
+
function hasSameReplyDirective(left, right) {
|
|
74
|
+
return (left.expectedReplyCallName === right.expectedReplyCallName &&
|
|
75
|
+
left.targetDialogId === right.targetDialogId &&
|
|
76
|
+
left.targetCallId === right.targetCallId &&
|
|
77
|
+
left.tellaskContent === right.tellaskContent);
|
|
78
|
+
}
|
|
79
|
+
function buildCurrentSideDialogAssignmentReplyDirective(dialog) {
|
|
80
|
+
switch (dialog.assignmentFromAsker.callName) {
|
|
81
|
+
case 'tellask':
|
|
82
|
+
return {
|
|
83
|
+
expectedReplyCallName: 'replyTellask',
|
|
84
|
+
targetDialogId: dialog.assignmentFromAsker.askerDialogId,
|
|
85
|
+
targetCallId: dialog.assignmentFromAsker.callId,
|
|
86
|
+
tellaskContent: dialog.assignmentFromAsker.tellaskContent,
|
|
87
|
+
};
|
|
88
|
+
case 'tellaskSessionless':
|
|
89
|
+
case 'freshBootsReasoning':
|
|
90
|
+
return {
|
|
91
|
+
expectedReplyCallName: 'replyTellaskSessionless',
|
|
92
|
+
targetDialogId: dialog.assignmentFromAsker.askerDialogId,
|
|
93
|
+
targetCallId: dialog.assignmentFromAsker.callId,
|
|
94
|
+
tellaskContent: dialog.assignmentFromAsker.tellaskContent,
|
|
95
|
+
};
|
|
96
|
+
default: {
|
|
97
|
+
const _exhaustive = dialog.assignmentFromAsker.callName;
|
|
98
|
+
throw new Error(`Unsupported sideDialog assignment callName: ${_exhaustive}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function isQueuedReplyObligationContinuation(prompt) {
|
|
103
|
+
return ((prompt.kind === 'new_course_runtime_reply' ||
|
|
104
|
+
prompt.kind === 'new_course_runtime_sideDialog') &&
|
|
105
|
+
(0, reply_prompt_copy_1.isReplyToolReminderPromptContent)(prompt.prompt));
|
|
106
|
+
}
|
|
107
|
+
function latestHasTellaskResultForCallId(latest, targetCallId) {
|
|
108
|
+
return (latest?.tellaskResults.results.some((entry) => entry.callId.trim() === targetCallId) === true);
|
|
109
|
+
}
|
|
110
|
+
async function claimQueuedReplyObligationContinuation(args) {
|
|
111
|
+
const directive = args.prompt.tellaskReplyDirective;
|
|
112
|
+
const targetCallId = directive.targetCallId.trim();
|
|
113
|
+
const targetDialogId = directive.targetDialogId.trim();
|
|
114
|
+
if (targetCallId === '' || targetDialogId === '') {
|
|
115
|
+
throw new Error(`reply obligation continuation invariant violation: empty target identity ` +
|
|
116
|
+
`(dialog=${args.dialog.id.valueOf()}, targetDialogId=${directive.targetDialogId}, targetCallId=${directive.targetCallId})`);
|
|
117
|
+
}
|
|
118
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(args.dialog.id, args.dialog.status);
|
|
119
|
+
if (latest?.sideDialogFinalResponse?.callId.trim() === targetCallId) {
|
|
120
|
+
return 'stale';
|
|
121
|
+
}
|
|
122
|
+
if (latestHasTellaskResultForCallId(latest, targetCallId)) {
|
|
123
|
+
return 'stale';
|
|
124
|
+
}
|
|
125
|
+
const targetLatest = targetDialogId === args.dialog.id.selfId
|
|
126
|
+
? latest
|
|
127
|
+
: await persistence_1.DialogPersistence.loadDialogLatest(new dialog_1.DialogID(targetDialogId, args.dialog.id.rootId), args.dialog.status);
|
|
128
|
+
if (latestHasTellaskResultForCallId(targetLatest, targetCallId)) {
|
|
129
|
+
return 'stale';
|
|
130
|
+
}
|
|
131
|
+
if (args.dialog instanceof dialog_1.SideDialog) {
|
|
132
|
+
const assignmentDirective = buildCurrentSideDialogAssignmentReplyDirective(args.dialog);
|
|
133
|
+
if (hasSameReplyDirective(assignmentDirective, directive)) {
|
|
134
|
+
return 'claimed';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const activeDirective = await (0, tellask_special_1.loadActiveTellaskReplyDirective)(args.dialog);
|
|
138
|
+
if (!activeDirective) {
|
|
139
|
+
return 'stale';
|
|
140
|
+
}
|
|
141
|
+
if (activeDirective.targetCallId !== directive.targetCallId) {
|
|
142
|
+
return 'stale';
|
|
143
|
+
}
|
|
144
|
+
if (!hasSameReplyDirective(activeDirective, directive)) {
|
|
145
|
+
throw new Error(`reply obligation continuation invariant violation: active obligation changed for callId=${directive.targetCallId} ` +
|
|
146
|
+
`(dialog=${args.dialog.id.valueOf()}, expectedReplyCallName=${directive.expectedReplyCallName}, ` +
|
|
147
|
+
`activeReplyCallName=${activeDirective.expectedReplyCallName}, targetDialogId=${directive.targetDialogId}, ` +
|
|
148
|
+
`activeTargetDialogId=${activeDirective.targetDialogId})`);
|
|
149
|
+
}
|
|
150
|
+
return 'claimed';
|
|
151
|
+
}
|
|
152
|
+
async function resolveSideDialogReplyDirectiveForAssistantOutput(args) {
|
|
153
|
+
const replyTarget = args.replyTarget;
|
|
154
|
+
const targetCallId = replyTarget?.callId.trim();
|
|
155
|
+
if (!replyTarget || !targetCallId) {
|
|
156
|
+
return args.currentDirective;
|
|
157
|
+
}
|
|
158
|
+
if (args.currentDirective?.targetCallId === targetCallId) {
|
|
159
|
+
return args.currentDirective;
|
|
160
|
+
}
|
|
161
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(args.dialog.id, args.dialog.status);
|
|
162
|
+
if (!latest) {
|
|
163
|
+
return args.currentDirective;
|
|
164
|
+
}
|
|
165
|
+
if (latest.sideDialogFinalResponse?.callId.trim() === targetCallId) {
|
|
166
|
+
return args.currentDirective;
|
|
167
|
+
}
|
|
168
|
+
if (latestHasTellaskResultForCallId(latest, targetCallId)) {
|
|
169
|
+
return args.currentDirective;
|
|
170
|
+
}
|
|
171
|
+
const assignmentDirective = buildCurrentSideDialogAssignmentReplyDirective(args.dialog);
|
|
172
|
+
if (assignmentDirective.targetCallId !== targetCallId) {
|
|
173
|
+
return args.currentDirective;
|
|
174
|
+
}
|
|
175
|
+
if (assignmentDirective.targetDialogId !== replyTarget.callerDialogId ||
|
|
176
|
+
assignmentDirective.targetCallId !== replyTarget.callId) {
|
|
177
|
+
return args.currentDirective;
|
|
178
|
+
}
|
|
179
|
+
const latestAssignmentAnchor = latest.latestAssignmentAnchor;
|
|
180
|
+
if (latestAssignmentAnchor?.callId !== targetCallId ||
|
|
181
|
+
args.responseGenseq < latestAssignmentAnchor.assignmentGenseq) {
|
|
182
|
+
return args.currentDirective;
|
|
183
|
+
}
|
|
184
|
+
const activeDirective = await (0, tellask_special_1.loadActiveTellaskReplyDirective)(args.dialog);
|
|
185
|
+
if (activeDirective && !hasSameReplyDirective(activeDirective, assignmentDirective)) {
|
|
186
|
+
throw new Error(`sideDialog assistant output reply directive invariant violation: active obligation does not match latest assignment ` +
|
|
187
|
+
`(dialog=${args.dialog.id.valueOf()}, targetCallId=${targetCallId}, ` +
|
|
188
|
+
`activeTargetCallId=${activeDirective.targetCallId}, assignmentTargetCallId=${assignmentDirective.targetCallId})`);
|
|
189
|
+
}
|
|
190
|
+
return activeDirective ?? assignmentDirective;
|
|
191
|
+
}
|
|
73
192
|
function hasQ4HAnswerCallId(callId) {
|
|
74
193
|
return typeof callId === 'string' && callId.trim() !== '';
|
|
75
194
|
}
|
|
@@ -294,13 +413,6 @@ async function clearStaleSideDialogRunControlForFinalResponse(args) {
|
|
|
294
413
|
previousNextStepTriggerCount: latest.nextStep.triggers.length,
|
|
295
414
|
};
|
|
296
415
|
}
|
|
297
|
-
function hasNoPromptSideDialogResumeEntitlement(dialog, driveOptions) {
|
|
298
|
-
const entitlement = driveOptions?.noPromptSideDialogResumeEntitlement;
|
|
299
|
-
if (!entitlement) {
|
|
300
|
-
return false;
|
|
301
|
-
}
|
|
302
|
-
return entitlement.callerDialogId === dialog.id.selfId;
|
|
303
|
-
}
|
|
304
416
|
function hasResultArrivalTrigger(latest) {
|
|
305
417
|
return latest?.nextStep.triggers.some((trigger) => trigger.kind === 'result_arrival') === true;
|
|
306
418
|
}
|
|
@@ -418,10 +530,6 @@ async function inspectNoPromptSideDialogDrive(args) {
|
|
|
418
530
|
const supplyResponseCallerReviveAllowed = hasCallerReviveEntitlement(args.dialog, args.driveOptions) &&
|
|
419
531
|
(!resolvedPendingSideDialogReplyEntitlement || resultArrivalTriggerPresent);
|
|
420
532
|
const backendLoopDurableWorkAllowed = source === 'kernel_driver_backend_loop' && resultArrivalTriggerPresent;
|
|
421
|
-
const replyObligationFollowUpAllowed = source === 'kernel_driver_follow_up' &&
|
|
422
|
-
args.driveOptions?.noPromptSideDialogResumeEntitlement?.reason ===
|
|
423
|
-
'reply_obligation_follow_up' &&
|
|
424
|
-
hasNoPromptSideDialogResumeEntitlement(args.dialog, args.driveOptions);
|
|
425
533
|
const finalResponseResultArrivalReviveAllowed = sideDialogFinalResponseCallId !== undefined &&
|
|
426
534
|
((resolvedPendingSideDialogReplyEntitlement && resultArrivalTriggerPresent) ||
|
|
427
535
|
backendLoopDurableWorkAllowed ||
|
|
@@ -436,11 +544,20 @@ async function inspectNoPromptSideDialogDrive(args) {
|
|
|
436
544
|
sideDialogFinalResponseCallId,
|
|
437
545
|
};
|
|
438
546
|
}
|
|
547
|
+
if (resolvedPendingSideDialogReplyEntitlement && !resultArrivalTriggerPresent) {
|
|
548
|
+
return {
|
|
549
|
+
shouldReject: true,
|
|
550
|
+
source,
|
|
551
|
+
rejection: 'stale_consumed_result_arrival',
|
|
552
|
+
displayState,
|
|
553
|
+
currentCourse,
|
|
554
|
+
sideDialogFinalResponseCallId,
|
|
555
|
+
};
|
|
556
|
+
}
|
|
439
557
|
if (!explicitInterruptedResumeAllowed &&
|
|
440
558
|
!inProgressGenerationResumeAllowed &&
|
|
441
559
|
!supplyResponseCallerReviveAllowed &&
|
|
442
|
-
!backendLoopDurableWorkAllowed
|
|
443
|
-
!replyObligationFollowUpAllowed) {
|
|
560
|
+
!backendLoopDurableWorkAllowed) {
|
|
444
561
|
return {
|
|
445
562
|
shouldReject: true,
|
|
446
563
|
source,
|
|
@@ -544,71 +661,96 @@ async function surfaceRuntimeGuide(dialog, content) {
|
|
|
544
661
|
}
|
|
545
662
|
async function resolveEffectivePrompt(dialog, humanPrompt) {
|
|
546
663
|
if (humanPrompt) {
|
|
547
|
-
return { prompt: humanPrompt, fromUpNext: false };
|
|
664
|
+
return { prompt: humanPrompt, fromUpNext: false, droppedStaleQueuedContinuation: false };
|
|
548
665
|
}
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
fromUpNext: true,
|
|
558
|
-
prompt: (() => {
|
|
559
|
-
const normalizedUserLanguageCode = upNext.userLanguageCode === 'zh' || upNext.userLanguageCode === 'en'
|
|
560
|
-
? upNext.userLanguageCode
|
|
561
|
-
: undefined;
|
|
562
|
-
const common = {
|
|
563
|
-
content: upNext.prompt,
|
|
564
|
-
msgId: upNext.msgId,
|
|
565
|
-
grammar: upNext.grammar ?? 'markdown',
|
|
566
|
-
userLanguageCode: normalizedUserLanguageCode,
|
|
567
|
-
runControl: upNext.runControl,
|
|
666
|
+
let droppedStaleQueuedContinuation = false;
|
|
667
|
+
for (;;) {
|
|
668
|
+
const upNext = dialog.peekUpNext();
|
|
669
|
+
if (!upNext) {
|
|
670
|
+
return {
|
|
671
|
+
prompt: await maybeResolveDeferredReplyReassertionPrompt(dialog),
|
|
672
|
+
fromUpNext: false,
|
|
673
|
+
droppedStaleQueuedContinuation,
|
|
568
674
|
};
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
? {}
|
|
577
|
-
: { q4hAnswerCallId: upNext.q4hAnswerCallId }),
|
|
578
|
-
};
|
|
579
|
-
return prompt;
|
|
675
|
+
}
|
|
676
|
+
if (isQueuedReplyObligationContinuation(upNext)) {
|
|
677
|
+
const claim = await claimQueuedReplyObligationContinuation({ dialog, prompt: upNext });
|
|
678
|
+
if (claim === 'stale') {
|
|
679
|
+
const discarded = dialog.takeUpNext();
|
|
680
|
+
if (!discarded || discarded.msgId !== upNext.msgId) {
|
|
681
|
+
throw new Error(`reply obligation continuation invariant violation: expected queued prompt ${upNext.msgId} before stale discard`);
|
|
580
682
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
683
|
+
await persistence_1.DialogPersistence.clearPendingRuntimePrompt(dialog.id, upNext.msgId, dialog.status);
|
|
684
|
+
log_1.log.debug('kernel-driver dropped stale reply obligation continuation', undefined, {
|
|
685
|
+
dialogId: dialog.id.valueOf(),
|
|
686
|
+
rootId: dialog.id.rootId,
|
|
687
|
+
selfId: dialog.id.selfId,
|
|
688
|
+
msgId: upNext.msgId,
|
|
689
|
+
targetCallId: upNext.tellaskReplyDirective.targetCallId,
|
|
690
|
+
expectedReplyCallName: upNext.tellaskReplyDirective.expectedReplyCallName,
|
|
691
|
+
});
|
|
692
|
+
droppedStaleQueuedContinuation = true;
|
|
693
|
+
continue;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
return {
|
|
697
|
+
fromUpNext: true,
|
|
698
|
+
droppedStaleQueuedContinuation,
|
|
699
|
+
prompt: (() => {
|
|
700
|
+
const normalizedUserLanguageCode = upNext.userLanguageCode === 'zh' || upNext.userLanguageCode === 'en'
|
|
701
|
+
? upNext.userLanguageCode
|
|
702
|
+
: undefined;
|
|
703
|
+
const common = {
|
|
704
|
+
content: upNext.prompt,
|
|
705
|
+
msgId: upNext.msgId,
|
|
706
|
+
grammar: upNext.grammar ?? 'markdown',
|
|
707
|
+
userLanguageCode: normalizedUserLanguageCode,
|
|
708
|
+
runControl: upNext.runControl,
|
|
709
|
+
};
|
|
710
|
+
switch (upNext.kind) {
|
|
711
|
+
case 'user_generation_boundary':
|
|
712
|
+
case 'deferred_q4h_answer': {
|
|
592
713
|
const prompt = {
|
|
593
|
-
...
|
|
594
|
-
|
|
595
|
-
|
|
714
|
+
...common,
|
|
715
|
+
origin: 'user',
|
|
716
|
+
...(upNext.q4hAnswerCallId === undefined
|
|
717
|
+
? {}
|
|
718
|
+
: { q4hAnswerCallId: upNext.q4hAnswerCallId }),
|
|
596
719
|
};
|
|
597
720
|
return prompt;
|
|
598
721
|
}
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
722
|
+
case 'registered_assignment_update':
|
|
723
|
+
case 'new_course_runtime_guide':
|
|
724
|
+
case 'new_course_runtime_reply':
|
|
725
|
+
case 'new_course_runtime_sideDialog': {
|
|
726
|
+
const runtimeCommon = {
|
|
727
|
+
...common,
|
|
728
|
+
origin: 'runtime',
|
|
729
|
+
...(upNext.skipTaskdoc === undefined ? {} : { skipTaskdoc: upNext.skipTaskdoc }),
|
|
603
730
|
};
|
|
731
|
+
if (upNext.kind === 'registered_assignment_update' ||
|
|
732
|
+
upNext.kind === 'new_course_runtime_sideDialog') {
|
|
733
|
+
const prompt = {
|
|
734
|
+
...runtimeCommon,
|
|
735
|
+
tellaskReplyDirective: upNext.tellaskReplyDirective,
|
|
736
|
+
calleeDialogReplyTarget: upNext.calleeDialogReplyTarget,
|
|
737
|
+
};
|
|
738
|
+
return prompt;
|
|
739
|
+
}
|
|
740
|
+
if (upNext.kind === 'new_course_runtime_reply') {
|
|
741
|
+
const prompt = {
|
|
742
|
+
...runtimeCommon,
|
|
743
|
+
tellaskReplyDirective: upNext.tellaskReplyDirective,
|
|
744
|
+
};
|
|
745
|
+
return prompt;
|
|
746
|
+
}
|
|
747
|
+
const prompt = runtimeCommon;
|
|
604
748
|
return prompt;
|
|
605
749
|
}
|
|
606
|
-
const prompt = runtimeCommon;
|
|
607
|
-
return prompt;
|
|
608
750
|
}
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
}
|
|
751
|
+
})(),
|
|
752
|
+
};
|
|
753
|
+
}
|
|
612
754
|
}
|
|
613
755
|
async function executeDriveRound(args) {
|
|
614
756
|
const [dialog, humanPrompt, waitInQue, driveOptions] = args.driveArgs;
|
|
@@ -656,7 +798,7 @@ async function executeDriveRound(args) {
|
|
|
656
798
|
if (!cleanup.cleared) {
|
|
657
799
|
await persistence_1.DialogPersistence.removeDriveWatchForDialog(dialog.id, dialog.status);
|
|
658
800
|
}
|
|
659
|
-
log_1.log.
|
|
801
|
+
log_1.log.debug('Dropped stale no-prompt sideDialog drive after final response anchor', undefined, {
|
|
660
802
|
dialogId: dialog.id.valueOf(),
|
|
661
803
|
rootId: dialog.id.rootId,
|
|
662
804
|
selfId: dialog.id.selfId,
|
|
@@ -713,6 +855,22 @@ async function executeDriveRound(args) {
|
|
|
713
855
|
try {
|
|
714
856
|
const inspection = await inspectNoPromptSideDialogDrive({ dialog, driveOptions });
|
|
715
857
|
if (inspection.shouldReject) {
|
|
858
|
+
if (inspection.rejection === 'stale_consumed_result_arrival') {
|
|
859
|
+
log_1.log.debug('Dropped stale no-prompt sideDialog caller revive after result arrival', undefined, {
|
|
860
|
+
dialogId: dialog.id.valueOf(),
|
|
861
|
+
rootId: dialog.id.rootId,
|
|
862
|
+
selfId: dialog.id.selfId,
|
|
863
|
+
source: inspection.source,
|
|
864
|
+
reason: driveOptions?.reason ?? null,
|
|
865
|
+
rejection: inspection.rejection,
|
|
866
|
+
allowResumeFromInterrupted: driveOptions?.allowResumeFromInterrupted === true,
|
|
867
|
+
displayState: inspection.displayState ?? null,
|
|
868
|
+
currentCourse: inspection.currentCourse,
|
|
869
|
+
sideDialogFinalResponseCallId: inspection.sideDialogFinalResponseCallId ?? null,
|
|
870
|
+
waitInQue,
|
|
871
|
+
});
|
|
872
|
+
return;
|
|
873
|
+
}
|
|
716
874
|
log_1.log.error('Rejected unexpected no-prompt sideDialog drive request', undefined, {
|
|
717
875
|
dialogId: dialog.id.valueOf(),
|
|
718
876
|
rootId: dialog.id.rootId,
|
|
@@ -909,6 +1067,18 @@ async function executeDriveRound(args) {
|
|
|
909
1067
|
dialog,
|
|
910
1068
|
latest: latestBeforeCore,
|
|
911
1069
|
}));
|
|
1070
|
+
if (resolvedPrompt.droppedStaleQueuedContinuation &&
|
|
1071
|
+
effectivePrompt === undefined &&
|
|
1072
|
+
!(0, dialog_drive_work_1.hasDurableDriveWork)(latestBeforeCore)) {
|
|
1073
|
+
log_1.log.debug('kernel-driver stopped after dropping stale queued continuation', undefined, {
|
|
1074
|
+
dialogId: dialog.id.valueOf(),
|
|
1075
|
+
rootId: dialog.id.rootId,
|
|
1076
|
+
selfId: dialog.id.selfId,
|
|
1077
|
+
source: driveSource,
|
|
1078
|
+
reason: driveOptions?.reason ?? null,
|
|
1079
|
+
});
|
|
1080
|
+
return;
|
|
1081
|
+
}
|
|
912
1082
|
await applyRegisteredDialogRunControlsBeforeDrive({
|
|
913
1083
|
dialog,
|
|
914
1084
|
humanPrompt,
|
|
@@ -942,7 +1112,7 @@ async function executeDriveRound(args) {
|
|
|
942
1112
|
replyGuidance.deferredReplyReassertionDirective !== undefined;
|
|
943
1113
|
activeTellaskReplyDirective = replyGuidance.activeReplyDirective;
|
|
944
1114
|
activePromptWasReplyToolReminder = isReplyToolReminderPrompt(effectivePrompt);
|
|
945
|
-
|
|
1115
|
+
let activePromptCarriesReplyDirective = effectivePrompt?.tellaskReplyDirective !== undefined &&
|
|
946
1116
|
activeTellaskReplyDirective !== undefined &&
|
|
947
1117
|
effectivePrompt.tellaskReplyDirective.targetCallId ===
|
|
948
1118
|
activeTellaskReplyDirective.targetCallId;
|
|
@@ -973,7 +1143,31 @@ async function executeDriveRound(args) {
|
|
|
973
1143
|
calleeDialogReplyTarget = driveResult.lastAssistantReplyTarget ?? calleeDialogReplyTarget;
|
|
974
1144
|
interruptedBySignal = (0, dialog_display_state_1.getActiveRunSignal)(dialog.id)?.aborted === true;
|
|
975
1145
|
if (!interruptedBySignal) {
|
|
976
|
-
|
|
1146
|
+
const queuedFollowUp = dialog.takeUpNext();
|
|
1147
|
+
if (queuedFollowUp && isQueuedReplyObligationContinuation(queuedFollowUp)) {
|
|
1148
|
+
const claim = await claimQueuedReplyObligationContinuation({
|
|
1149
|
+
dialog,
|
|
1150
|
+
prompt: queuedFollowUp,
|
|
1151
|
+
});
|
|
1152
|
+
if (claim === 'stale') {
|
|
1153
|
+
await persistence_1.DialogPersistence.clearPendingRuntimePrompt(dialog.id, queuedFollowUp.msgId, dialog.status);
|
|
1154
|
+
log_1.log.debug('kernel-driver dropped stale reply obligation follow-up after core', undefined, {
|
|
1155
|
+
dialogId: dialog.id.valueOf(),
|
|
1156
|
+
rootId: dialog.id.rootId,
|
|
1157
|
+
selfId: dialog.id.selfId,
|
|
1158
|
+
msgId: queuedFollowUp.msgId,
|
|
1159
|
+
targetCallId: queuedFollowUp.tellaskReplyDirective.targetCallId,
|
|
1160
|
+
expectedReplyCallName: queuedFollowUp.tellaskReplyDirective.expectedReplyCallName,
|
|
1161
|
+
});
|
|
1162
|
+
followUp = undefined;
|
|
1163
|
+
}
|
|
1164
|
+
else {
|
|
1165
|
+
followUp = queuedFollowUp;
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
else {
|
|
1169
|
+
followUp = queuedFollowUp;
|
|
1170
|
+
}
|
|
977
1171
|
}
|
|
978
1172
|
let tailError;
|
|
979
1173
|
try {
|
|
@@ -1021,6 +1215,31 @@ async function executeDriveRound(args) {
|
|
|
1021
1215
|
});
|
|
1022
1216
|
}
|
|
1023
1217
|
else {
|
|
1218
|
+
const replyDirectiveForAssistantOutput = await resolveSideDialogReplyDirectiveForAssistantOutput({
|
|
1219
|
+
dialog,
|
|
1220
|
+
responseGenseq: directFallbackResponse.responseGenseq,
|
|
1221
|
+
replyTarget: driveResult.lastAssistantReplyTarget,
|
|
1222
|
+
currentDirective: activeTellaskReplyDirective,
|
|
1223
|
+
});
|
|
1224
|
+
if (replyDirectiveForAssistantOutput !== undefined &&
|
|
1225
|
+
replyDirectiveForAssistantOutput.targetCallId !==
|
|
1226
|
+
activeTellaskReplyDirective?.targetCallId) {
|
|
1227
|
+
// `driveDialogStreamCore` may already have consumed a queued assignment-update prompt
|
|
1228
|
+
// inside the same drive, so rebind the tail decision to the assistant output target.
|
|
1229
|
+
log_1.log.debug('kernel-driver rebound sideDialog reply directive to latest assistant output target', undefined, {
|
|
1230
|
+
dialogId: dialog.id.valueOf(),
|
|
1231
|
+
previousTargetCallId: activeTellaskReplyDirective?.targetCallId ?? null,
|
|
1232
|
+
nextTargetCallId: replyDirectiveForAssistantOutput.targetCallId,
|
|
1233
|
+
responseGenseq: directFallbackResponse.responseGenseq,
|
|
1234
|
+
replyTargetCallId: driveResult.lastAssistantReplyTarget?.callId ?? null,
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
activeTellaskReplyDirective = replyDirectiveForAssistantOutput;
|
|
1238
|
+
activePromptCarriesReplyDirective =
|
|
1239
|
+
activePromptCarriesReplyDirective ||
|
|
1240
|
+
(activeTellaskReplyDirective !== undefined &&
|
|
1241
|
+
driveResult.lastAssistantReplyTarget?.callId ===
|
|
1242
|
+
activeTellaskReplyDirective.targetCallId);
|
|
1024
1243
|
const hasFollowUp = followUp !== undefined;
|
|
1025
1244
|
const suspension = await dialog.getSuspensionStatus();
|
|
1026
1245
|
const backgroundCalleeBlocksImplicitReply = suspension.backgroundCalleeDialogs &&
|
|
@@ -1195,12 +1414,6 @@ async function executeDriveRound(args) {
|
|
|
1195
1414
|
driveOptions: {
|
|
1196
1415
|
source: 'kernel_driver_follow_up',
|
|
1197
1416
|
reason: 'follow_up_prompt',
|
|
1198
|
-
noPromptSideDialogResumeEntitlement: dialog instanceof dialog_1.SideDialog
|
|
1199
|
-
? {
|
|
1200
|
-
callerDialogId: dialog.id.selfId,
|
|
1201
|
-
reason: 'reply_obligation_follow_up',
|
|
1202
|
-
}
|
|
1203
|
-
: undefined,
|
|
1204
1417
|
},
|
|
1205
1418
|
});
|
|
1206
1419
|
return driveResult;
|
|
@@ -125,9 +125,6 @@ async function resolveFreshCurrentSideDialogAssignmentDirective(args) {
|
|
|
125
125
|
if (!latest) {
|
|
126
126
|
return undefined;
|
|
127
127
|
}
|
|
128
|
-
if (latest.pendingRuntimePrompt?.msgId !== args.prompt.msgId) {
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
128
|
if (latest.sideDialogFinalResponse?.callId === currentAssignmentDirective.targetCallId.trim()) {
|
|
132
129
|
return undefined;
|
|
133
130
|
}
|
|
@@ -122,6 +122,7 @@ export type TellaskFunctionRoundResult = Readonly<{
|
|
|
122
122
|
hasImmediateTellaskOutputs: boolean;
|
|
123
123
|
immediateTellaskOutputCallIds: readonly string[];
|
|
124
124
|
shouldStopAfterReplyTool: boolean;
|
|
125
|
+
shouldStopAfterPendingTellaskWait: boolean;
|
|
125
126
|
}>;
|
|
126
127
|
export declare function processTellaskFunctionRound(args: {
|
|
127
128
|
dlg: Dialog;
|
|
@@ -2390,6 +2390,7 @@ async function processTellaskFunctionRound(args) {
|
|
|
2390
2390
|
const tellaskToolOutputs = [];
|
|
2391
2391
|
const immediateTellaskOutputCallIds = [];
|
|
2392
2392
|
let hasImmediateTellaskOutputs = false;
|
|
2393
|
+
let shouldStopAfterPendingTellaskWait = false;
|
|
2393
2394
|
for (const output of tellaskExecution.toolOutputs) {
|
|
2394
2395
|
if (output.type === 'func_result_msg') {
|
|
2395
2396
|
const result = output;
|
|
@@ -2445,6 +2446,7 @@ async function processTellaskFunctionRound(args) {
|
|
|
2445
2446
|
});
|
|
2446
2447
|
tellaskFuncResultByCallId.set(call.callId, pendingResult);
|
|
2447
2448
|
tellaskFuncResults.push(pendingResult);
|
|
2449
|
+
shouldStopAfterPendingTellaskWait = true;
|
|
2448
2450
|
}
|
|
2449
2451
|
for (const result of tellaskFuncResults) {
|
|
2450
2452
|
await persistTellaskFuncResult(args.dlg, result);
|
|
@@ -2459,5 +2461,6 @@ async function processTellaskFunctionRound(args) {
|
|
|
2459
2461
|
hasImmediateTellaskOutputs,
|
|
2460
2462
|
immediateTellaskOutputCallIds,
|
|
2461
2463
|
shouldStopAfterReplyTool: orderedInvalidCalls.length === 0 && tellaskExecution.successfulReplyCallIds.length > 0,
|
|
2464
|
+
shouldStopAfterPendingTellaskWait,
|
|
2462
2465
|
};
|
|
2463
2466
|
}
|
|
@@ -21,9 +21,6 @@ export type KernelDriverDriveOptions = Readonly<{
|
|
|
21
21
|
sideDialogId?: string;
|
|
22
22
|
callType?: 'A' | 'B' | 'C';
|
|
23
23
|
callId?: string;
|
|
24
|
-
}> | Readonly<{
|
|
25
|
-
callerDialogId: string;
|
|
26
|
-
reason: 'reply_obligation_follow_up';
|
|
27
24
|
}> | Readonly<{
|
|
28
25
|
callerDialogId: string;
|
|
29
26
|
reason: 'resolved_pending_sideDialog_reply';
|
package/dist/persistence.d.ts
CHANGED
|
@@ -478,6 +478,7 @@ export declare class DialogPersistence {
|
|
|
478
478
|
private static loadDriveWatchFromDisk;
|
|
479
479
|
private static writeDriveWatchToDisk;
|
|
480
480
|
private static mutateDriveWatch;
|
|
481
|
+
private static removeWithRetry;
|
|
481
482
|
static loadDriveWatchedDialogIds(rootDialogId: DialogID, status?: DialogStatusKind): Promise<readonly DialogID[]>;
|
|
482
483
|
private static setDialogDriveWatched;
|
|
483
484
|
static syncDriveWatchForDialogLatest(dialogId: DialogID, latest: DialogLatestFile, status?: DialogStatusKind): Promise<void>;
|
package/dist/persistence.js
CHANGED
|
@@ -412,6 +412,16 @@ function getErrorCode(error) {
|
|
|
412
412
|
const maybeCode = error.code;
|
|
413
413
|
return typeof maybeCode === 'string' ? maybeCode : undefined;
|
|
414
414
|
}
|
|
415
|
+
const RETRYABLE_FILESYSTEM_ERROR_CODES = new Set(['ENOENT', 'EPERM', 'EACCES', 'EBUSY']);
|
|
416
|
+
const FILESYSTEM_RETRY_BASE_DELAY_MS = 20;
|
|
417
|
+
const FILESYSTEM_RETRY_MAX_DELAY_MS = 250;
|
|
418
|
+
function getFilesystemRetryDelayMs(attempt) {
|
|
419
|
+
const delayMs = FILESYSTEM_RETRY_BASE_DELAY_MS * 2 ** (attempt - 1);
|
|
420
|
+
return Math.min(FILESYSTEM_RETRY_MAX_DELAY_MS, delayMs);
|
|
421
|
+
}
|
|
422
|
+
async function sleepForFilesystemRetry(attempt) {
|
|
423
|
+
await new Promise((resolve) => setTimeout(resolve, getFilesystemRetryDelayMs(attempt)));
|
|
424
|
+
}
|
|
415
425
|
function isGenericUnexpectedEofLikeError(error) {
|
|
416
426
|
const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
|
|
417
427
|
return message.includes('unexpected eof') || message.includes('unexpected end');
|
|
@@ -6696,7 +6706,7 @@ class DialogPersistence {
|
|
|
6696
6706
|
const normalized = this.normalizeDriveWatchFile(file);
|
|
6697
6707
|
const filePath = this.getDriveWatchFilePath(rootDialogId, status);
|
|
6698
6708
|
if (normalized.dialogs.length === 0) {
|
|
6699
|
-
await
|
|
6709
|
+
await this.removeWithRetry(filePath);
|
|
6700
6710
|
return;
|
|
6701
6711
|
}
|
|
6702
6712
|
const dialogPath = this.getMainDialogPath(rootDialogId, status);
|
|
@@ -6720,6 +6730,24 @@ class DialogPersistence {
|
|
|
6720
6730
|
release();
|
|
6721
6731
|
}
|
|
6722
6732
|
}
|
|
6733
|
+
static async removeWithRetry(filePath, maxRetries = 5) {
|
|
6734
|
+
let lastError;
|
|
6735
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
6736
|
+
try {
|
|
6737
|
+
await fs.promises.rm(filePath, { force: true });
|
|
6738
|
+
return;
|
|
6739
|
+
}
|
|
6740
|
+
catch (error) {
|
|
6741
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
6742
|
+
const errorCode = getErrorCode(error);
|
|
6743
|
+
if (!RETRYABLE_FILESYSTEM_ERROR_CODES.has(errorCode ?? '') || attempt === maxRetries) {
|
|
6744
|
+
throw error;
|
|
6745
|
+
}
|
|
6746
|
+
await sleepForFilesystemRetry(attempt);
|
|
6747
|
+
}
|
|
6748
|
+
}
|
|
6749
|
+
throw lastError;
|
|
6750
|
+
}
|
|
6723
6751
|
static async loadDriveWatchedDialogIds(rootDialogId, status = 'running') {
|
|
6724
6752
|
try {
|
|
6725
6753
|
const file = await this.loadDriveWatchFromDisk(rootDialogId, status);
|
|
@@ -7753,11 +7781,12 @@ class DialogPersistence {
|
|
|
7753
7781
|
throw error;
|
|
7754
7782
|
}
|
|
7755
7783
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
7756
|
-
|
|
7784
|
+
const errorCode = getErrorCode(error);
|
|
7785
|
+
if (!RETRYABLE_FILESYSTEM_ERROR_CODES.has(errorCode ?? '') || attempt === maxRetries) {
|
|
7757
7786
|
throw error;
|
|
7758
7787
|
}
|
|
7759
|
-
// Exponential backoff for
|
|
7760
|
-
await
|
|
7788
|
+
// Exponential backoff for transient filesystem contention.
|
|
7789
|
+
await sleepForFilesystemRetry(attempt);
|
|
7761
7790
|
}
|
|
7762
7791
|
}
|
|
7763
7792
|
throw lastError;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dominds",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.3",
|
|
4
4
|
"description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"publishConfig": {
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"yaml": "^2.8.2",
|
|
54
54
|
"zod": "^4.3.6",
|
|
55
55
|
"@longrun-ai/codex-auth": "0.13.0",
|
|
56
|
-
"@longrun-ai/
|
|
57
|
-
"@longrun-ai/
|
|
56
|
+
"@longrun-ai/shell": "1.14.0",
|
|
57
|
+
"@longrun-ai/kernel": "1.14.0"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@types/node": "^25.3.5",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-
|
|
2
|
-
import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-
|
|
1
|
+
import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-D0wSOJ06.js";
|
|
2
|
+
import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-CDCDAfqP.js";
|
|
3
3
|
var reWhitespace = /\s/;
|
|
4
4
|
function trimmedEndIndex(string) {
|
|
5
5
|
var index = string.length;
|
|
@@ -193,4 +193,4 @@ export {
|
|
|
193
193
|
map as m,
|
|
194
194
|
toFinite as t
|
|
195
195
|
};
|
|
196
|
-
//# sourceMappingURL=_basePickBy-
|
|
196
|
+
//# sourceMappingURL=_basePickBy-ZLV93S3E.js.map
|