dominds 1.25.6 → 1.25.7
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.js +99 -29
- package/dist/dialog-fork.js +53 -20
- package/dist/llm/kernel-driver/drive.js +253 -4
- package/dist/llm/kernel-driver/flow.js +13 -15
- package/dist/llm/kernel-driver/sideDialog.js +13 -0
- package/dist/persistence.js +18 -17
- package/dist/server/dominds-self-update.js +312 -22
- package/dist/server/websocket-handler.js +41 -4
- package/dist/tools/os.d.ts +1 -0
- package/dist/tools/os.js +19 -1
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-fZ31r-iF.js → _basePickBy-Y5Q2L95x.js} +3 -3
- package/webapp/dist/assets/_basePickBy-Y5Q2L95x.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-CI1keLoL.js → _baseUniq-Cj3ro8Ri.js} +2 -2
- package/webapp/dist/assets/_baseUniq-Cj3ro8Ri.js.map +1 -0
- package/webapp/dist/assets/{arc-1NeUqzoV.js → arc-Bz9VfJlg.js} +2 -2
- package/webapp/dist/assets/arc-Bz9VfJlg.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-C7SdzYIh.js → architectureDiagram-VXUJARFQ-Ce6_zDEY.js} +8 -26
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-Ce6_zDEY.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Cmpu3kIy.js → blockDiagram-VD42YOAC-DIEKjBVU.js} +170 -187
- package/webapp/dist/assets/blockDiagram-VD42YOAC-DIEKjBVU.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-ChGTHIor.js → c4Diagram-YG6GDRKO-CQpAPdOt.js} +4 -4
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-CQpAPdOt.js.map +1 -0
- package/webapp/dist/assets/{channel-ndS-XTQQ.js → channel-C_7bziVU.js} +2 -2
- package/webapp/dist/assets/channel-C_7bziVU.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-Cw5FtBd_.js → chunk-4BX2VUAB-CI07YP8x.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-CI07YP8x.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-D3G71JdA.js → chunk-55IACEB6-CH-ZnQdW.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-CH-ZnQdW.js.map +1 -0
- package/webapp/dist/assets/{chunk-WL4C6EOR-CIwdSg5q.js → chunk-B4BG7PRW-B8XZmRWD.js} +121 -171
- package/webapp/dist/assets/chunk-B4BG7PRW-B8XZmRWD.js.map +1 -0
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CGEMYTch.js → chunk-DI55MBZ5-BTJEMG8W.js} +7 -9
- package/webapp/dist/assets/chunk-DI55MBZ5-BTJEMG8W.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-BcugPyy7.js → chunk-FMBD7UC4-u7Ho3qNZ.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-u7Ho3qNZ.js.map +1 -0
- package/webapp/dist/assets/{chunk-KX2RTZJC-BQ42xd4s.js → chunk-QN33PNHL-C-7kvetv.js} +2 -2
- package/webapp/dist/assets/chunk-QN33PNHL-C-7kvetv.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-CxNTVm5w.js → chunk-QZHKN3VN-Cutz7csQ.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-Cutz7csQ.js.map +1 -0
- package/webapp/dist/assets/{chunk-JSJVCQXG-DvuxYuNq.js → chunk-TZMSLE5B-b_LZteUW.js} +6 -14
- package/webapp/dist/assets/chunk-TZMSLE5B-b_LZteUW.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dl05PJAP.js → classDiagram-2ON5EDUG-CCGe8-bu.js} +6 -7
- package/webapp/dist/assets/classDiagram-2ON5EDUG-CCGe8-bu.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dl05PJAP.js → classDiagram-v2-WZHVMYZB-CCGe8-bu.js} +6 -7
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CCGe8-bu.js.map +1 -0
- package/webapp/dist/assets/{clone-KCj1-QMr.js → clone-CEpSMVek.js} +2 -2
- package/webapp/dist/assets/clone-CEpSMVek.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BttciCz5.js → cose-bilkent-S5V4N54A-JEt2Ncxk.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-JEt2Ncxk.js.map +1 -0
- package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-Dm5yE9k2.js → dagre-6UL2VRFP-dy6U1rpE.js} +7 -7
- package/webapp/dist/assets/dagre-6UL2VRFP-dy6U1rpE.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-C80ZsiBG.js → diagram-PSM6KHXK-u1RaCst_.js} +10 -10
- package/webapp/dist/assets/diagram-PSM6KHXK-u1RaCst_.js.map +1 -0
- package/webapp/dist/assets/{diagram-IFDJBPK2-CqKidH4n.js → diagram-QEK2KX5R-Bm297BXQ.js} +8 -9
- package/webapp/dist/assets/diagram-QEK2KX5R-Bm297BXQ.js.map +1 -0
- package/webapp/dist/assets/{diagram-P4PSJMXO-EHVjfzUV.js → diagram-S2PKOQOG-B9Z57WnU.js} +8 -8
- package/webapp/dist/assets/diagram-S2PKOQOG-B9Z57WnU.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-INFDFZHY-7MrtsOIt.js → erDiagram-Q2GNP2WA-CyXAp9Ik.js} +75 -96
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-CyXAp9Ik.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D6hXqCy7.js → flowDiagram-NV44I4VS-ONR9JQsN.js} +81 -98
- package/webapp/dist/assets/flowDiagram-NV44I4VS-ONR9JQsN.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DLO0XCDk.js → ganttDiagram-JELNMOA3-Coi5jLKz.js} +3 -28
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-Coi5jLKz.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js → gitGraphDiagram-V2S2FVAM-BoLPKg9P.js} +46 -38
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-BoLPKg9P.js.map +1 -0
- package/webapp/dist/assets/graph-DLwD58eC.js +425 -0
- package/webapp/dist/assets/graph-DLwD58eC.js.map +1 -0
- package/webapp/dist/assets/{index-BXjq-k48.js → index-HwgQoWbn.js} +1118 -1041
- package/webapp/dist/assets/{index-BXjq-k48.js.map → index-HwgQoWbn.js.map} +1 -1
- package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-D2fqM9Fn.js → infoDiagram-HS3SLOUP-BpEpEjG2.js} +7 -7
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-BpEpEjG2.js.map +1 -0
- package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DmbA52J-.js → journeyDiagram-XKPGCS4Q-C2HNBnMQ.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-C2HNBnMQ.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DRUw-P-d.js → kanban-definition-3W4ZIXB7-DcELha9W.js} +3 -5
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DcELha9W.js.map +1 -0
- package/webapp/dist/assets/{layout-BUoHHXzn.js → layout-Cyg7MRlM.js} +5 -5
- package/webapp/dist/assets/layout-Cyg7MRlM.js.map +1 -0
- package/webapp/dist/assets/{linear-xVSAq8rI.js → linear-pOIWL8hY.js} +2 -2
- package/webapp/dist/assets/linear-pOIWL8hY.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BcajbGmW.js → mindmap-definition-VGOIOE7T-BTyvfLY3.js} +5 -7
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BTyvfLY3.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Bu8kmCW6.js → pieDiagram-ADFJNKIX-D1CwcmEb.js} +8 -8
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-D1CwcmEb.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DIBSNUGa.js → quadrantDiagram-AYHSOK5B-DdlItwqV.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-DdlItwqV.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CkrDkbBt.js → requirementDiagram-UZGBJVZJ-B6AntBtK.js} +6 -16
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-B6AntBtK.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js → sankeyDiagram-TZEHDZUN-Cb1skLgE.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-Cb1skLgE.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYoNARdO.js → sequenceDiagram-WL72ISMW-BXtnapRV.js} +201 -601
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BXtnapRV.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9v19nvh.js → stateDiagram-FKZM4ZOC-BEJSYJxc.js} +9 -9
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BEJSYJxc.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js → stateDiagram-v2-4FDKWEC3-YlQ0hGcy.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-YlQ0hGcy.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BT10dRIJ.js → timeline-definition-IT6M3QCI-BHzyY6Ip.js} +3 -3
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-BHzyY6Ip.js.map +1 -0
- package/webapp/dist/assets/{treemap-KZPCXAKY-yPoPC5hc.js → treemap-GDKQZRPO-BMYh8Nea.js} +24 -37
- package/webapp/dist/assets/treemap-GDKQZRPO-BMYh8Nea.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BWLUzo9S.js → xychartDiagram-PRI3JC2R-C5vczZ0B.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-C5vczZ0B.js.map +1 -0
- package/webapp/dist/index.html +2 -2
- package/webapp/dist/assets/_basePickBy-fZ31r-iF.js.map +0 -1
- package/webapp/dist/assets/_baseUniq-CI1keLoL.js.map +0 -1
- package/webapp/dist/assets/arc-1NeUqzoV.js.map +0 -1
- package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-C7SdzYIh.js.map +0 -1
- package/webapp/dist/assets/blockDiagram-WCTKOSBZ-Cmpu3kIy.js.map +0 -1
- package/webapp/dist/assets/c4Diagram-IC4MRINW-ChGTHIor.js.map +0 -1
- package/webapp/dist/assets/channel-ndS-XTQQ.js.map +0 -1
- package/webapp/dist/assets/chunk-4BX2VUAB-Cw5FtBd_.js.map +0 -1
- package/webapp/dist/assets/chunk-55IACEB6-D3G71JdA.js.map +0 -1
- package/webapp/dist/assets/chunk-FMBD7UC4-BcugPyy7.js.map +0 -1
- package/webapp/dist/assets/chunk-JSJVCQXG-DvuxYuNq.js.map +0 -1
- package/webapp/dist/assets/chunk-KX2RTZJC-BQ42xd4s.js.map +0 -1
- package/webapp/dist/assets/chunk-NQ4KR5QH-CGEMYTch.js.map +0 -1
- package/webapp/dist/assets/chunk-QZHKN3VN-CxNTVm5w.js.map +0 -1
- package/webapp/dist/assets/chunk-WL4C6EOR-CIwdSg5q.js.map +0 -1
- package/webapp/dist/assets/classDiagram-VBA2DB6C-Dl05PJAP.js.map +0 -1
- package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-Dl05PJAP.js.map +0 -1
- package/webapp/dist/assets/clone-KCj1-QMr.js.map +0 -1
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-BttciCz5.js.map +0 -1
- package/webapp/dist/assets/dagre-KLK3FWXG-Dm5yE9k2.js.map +0 -1
- package/webapp/dist/assets/diagram-E7M64L7V-C80ZsiBG.js.map +0 -1
- package/webapp/dist/assets/diagram-IFDJBPK2-CqKidH4n.js.map +0 -1
- package/webapp/dist/assets/diagram-P4PSJMXO-EHVjfzUV.js.map +0 -1
- package/webapp/dist/assets/erDiagram-INFDFZHY-7MrtsOIt.js.map +0 -1
- package/webapp/dist/assets/flowDiagram-PKNHOUZH-D6hXqCy7.js.map +0 -1
- package/webapp/dist/assets/ganttDiagram-A5KZAMGK-DLO0XCDk.js.map +0 -1
- package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js.map +0 -1
- package/webapp/dist/assets/graph-DQTj8O0Q.js +0 -782
- package/webapp/dist/assets/graph-DQTj8O0Q.js.map +0 -1
- package/webapp/dist/assets/infoDiagram-LFFYTUFH-D2fqM9Fn.js.map +0 -1
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js +0 -966
- package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js.map +0 -1
- package/webapp/dist/assets/journeyDiagram-4ABVD52K-DmbA52J-.js.map +0 -1
- package/webapp/dist/assets/kanban-definition-K7BYSVSG-DRUw-P-d.js.map +0 -1
- package/webapp/dist/assets/layout-BUoHHXzn.js.map +0 -1
- package/webapp/dist/assets/linear-xVSAq8rI.js.map +0 -1
- package/webapp/dist/assets/mindmap-definition-YRQLILUH-BcajbGmW.js.map +0 -1
- package/webapp/dist/assets/pieDiagram-SKSYHLDU-Bu8kmCW6.js.map +0 -1
- package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DIBSNUGa.js.map +0 -1
- package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-CkrDkbBt.js.map +0 -1
- package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js.map +0 -1
- package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYoNARdO.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-RAJIS63D-D9v19nvh.js.map +0 -1
- package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js.map +0 -1
- package/webapp/dist/assets/timeline-definition-YZTLITO2-BT10dRIJ.js.map +0 -1
- package/webapp/dist/assets/treemap-KZPCXAKY-yPoPC5hc.js.map +0 -1
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js +0 -2487
- package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js.map +0 -1
- package/webapp/dist/assets/xychartDiagram-JWTSCODW-BWLUzo9S.js.map +0 -1
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.driveDialogStreamCore = driveDialogStreamCore;
|
|
4
7
|
const diligence_1 = require("@longrun-ai/kernel/diligence");
|
|
5
8
|
const storage_1 = require("@longrun-ai/kernel/types/storage");
|
|
6
9
|
const id_1 = require("@longrun-ai/kernel/utils/id");
|
|
7
10
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
11
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
13
|
const dialog_1 = require("../../dialog");
|
|
9
14
|
const dialog_display_state_1 = require("../../dialog-display-state");
|
|
10
15
|
const dialog_interruption_1 = require("../../dialog-interruption");
|
|
@@ -1226,6 +1231,167 @@ async function persistInvalidFuncCallRuntimeGuide(args) {
|
|
|
1226
1231
|
function resolveFuncToolFollowupMode(tool) {
|
|
1227
1232
|
return tool?.followupMode ?? 'immediate';
|
|
1228
1233
|
}
|
|
1234
|
+
function summarizeRoutedFunctionResult(routed) {
|
|
1235
|
+
return {
|
|
1236
|
+
hasImmediateFollowupToolCalls: routed.hasImmediateFollowupToolCalls,
|
|
1237
|
+
hasImmediateTellaskOutputs: routed.hasImmediateTellaskOutputs,
|
|
1238
|
+
immediateFollowupCallIds: routed.immediateFollowupCallIds,
|
|
1239
|
+
immediateTellaskOutputCallIds: routed.immediateTellaskOutputCallIds,
|
|
1240
|
+
shouldStopAfterReplyTool: routed.shouldStopAfterReplyTool,
|
|
1241
|
+
shouldStopAfterPendingTellaskWait: routed.shouldStopAfterPendingTellaskWait,
|
|
1242
|
+
pairedMessageTypes: routed.pairedMessages.map((msg) => msg.type),
|
|
1243
|
+
tellaskToolOutputTypes: routed.tellaskToolOutputs.map((msg) => msg.type),
|
|
1244
|
+
};
|
|
1245
|
+
}
|
|
1246
|
+
function buildToolRoundStopDiagnostics(args) {
|
|
1247
|
+
return {
|
|
1248
|
+
course: args.dlg.activeGenCourseOrUndefined ?? args.dlg.currentCourse,
|
|
1249
|
+
genseq: args.dlg.activeGenSeq,
|
|
1250
|
+
callIds: args.streamedFuncCalls.map((call) => call.id),
|
|
1251
|
+
callNames: args.streamedFuncCalls.map((call) => call.name),
|
|
1252
|
+
lastBusinessContinuation: args.lastBusinessContinuation,
|
|
1253
|
+
routed: summarizeRoutedFunctionResult(args.routed),
|
|
1254
|
+
decision: {
|
|
1255
|
+
shouldStartImmediatePostToolGeneration: args.shouldStartImmediatePostToolGeneration,
|
|
1256
|
+
stopReason: args.stopReason,
|
|
1257
|
+
...(args.suspensionAfterToolRound === undefined
|
|
1258
|
+
? {}
|
|
1259
|
+
: { suspensionAfterToolRound: args.suspensionAfterToolRound }),
|
|
1260
|
+
...(args.queuedPromptAfterToolRound === undefined
|
|
1261
|
+
? {}
|
|
1262
|
+
: { queuedPromptAfterToolRound: args.queuedPromptAfterToolRound }),
|
|
1263
|
+
...(args.remindersVer === undefined ? {} : { remindersVer: args.remindersVer }),
|
|
1264
|
+
...(args.pubRemindersVer === undefined ? {} : { pubRemindersVer: args.pubRemindersVer }),
|
|
1265
|
+
},
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
function shouldCaptureUnexpectedIdleAfterToolRound(args) {
|
|
1269
|
+
if (args.finalDisplayState.kind !== 'idle_waiting_user')
|
|
1270
|
+
return false;
|
|
1271
|
+
const diagnostics = args.diagnostics;
|
|
1272
|
+
if (diagnostics === undefined)
|
|
1273
|
+
return false;
|
|
1274
|
+
if (diagnostics.callIds.length === 0)
|
|
1275
|
+
return false;
|
|
1276
|
+
if ((args.latest?.nextStep.triggers.length ?? 0) > 0)
|
|
1277
|
+
return false;
|
|
1278
|
+
if (diagnostics.decision.stopReason === 'reply_tool' ||
|
|
1279
|
+
diagnostics.decision.stopReason === 'pending_tellask_wait') {
|
|
1280
|
+
return false;
|
|
1281
|
+
}
|
|
1282
|
+
const continuation = diagnostics.lastBusinessContinuation;
|
|
1283
|
+
if (continuation.kind !== 'none')
|
|
1284
|
+
return true;
|
|
1285
|
+
if (diagnostics.routed.hasImmediateFollowupToolCalls)
|
|
1286
|
+
return true;
|
|
1287
|
+
if (diagnostics.routed.hasImmediateTellaskOutputs)
|
|
1288
|
+
return true;
|
|
1289
|
+
if (diagnostics.routed.immediateFollowupCallIds.length > 0)
|
|
1290
|
+
return true;
|
|
1291
|
+
if (diagnostics.routed.immediateTellaskOutputCallIds.length > 0)
|
|
1292
|
+
return true;
|
|
1293
|
+
return false;
|
|
1294
|
+
}
|
|
1295
|
+
function sanitizeDebugFileSegment(value) {
|
|
1296
|
+
const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, '_').replace(/^_+|_+$/g, '');
|
|
1297
|
+
return sanitized.length > 0 ? sanitized.slice(0, 80) : 'unknown';
|
|
1298
|
+
}
|
|
1299
|
+
async function maybeWriteUnexpectedIdleAfterToolRoundDebugDump(args) {
|
|
1300
|
+
if (!shouldCaptureUnexpectedIdleAfterToolRound({
|
|
1301
|
+
finalDisplayState: args.finalDisplayState,
|
|
1302
|
+
latest: args.latest,
|
|
1303
|
+
diagnostics: args.diagnostics,
|
|
1304
|
+
})) {
|
|
1305
|
+
return;
|
|
1306
|
+
}
|
|
1307
|
+
const diagnostics = args.diagnostics;
|
|
1308
|
+
if (diagnostics === undefined) {
|
|
1309
|
+
throw new Error('unexpected idle debug invariant violation: diagnostics disappeared');
|
|
1310
|
+
}
|
|
1311
|
+
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1312
|
+
const debugDir = node_path_1.default.resolve(process.cwd(), '.dislogs', 'debug');
|
|
1313
|
+
const fileName = [
|
|
1314
|
+
'kernel-driver-unexpected-idle-after-tool-round',
|
|
1315
|
+
sanitizeDebugFileSegment(capturedAt),
|
|
1316
|
+
sanitizeDebugFileSegment(args.dlg.id.rootId),
|
|
1317
|
+
sanitizeDebugFileSegment(args.dlg.id.selfId),
|
|
1318
|
+
`c${String(diagnostics.course)}`,
|
|
1319
|
+
`g${String(diagnostics.genseq)}`,
|
|
1320
|
+
`${(0, id_1.generateShortId)()}.json`,
|
|
1321
|
+
].join('-');
|
|
1322
|
+
const activeCallees = await persistence_1.DialogPersistence.loadActiveCallees(args.dlg.id, args.dlg.status);
|
|
1323
|
+
const suspension = await args.dlg.getSuspensionStatus();
|
|
1324
|
+
const payload = {
|
|
1325
|
+
kind: 'kernel_driver_unexpected_idle_after_tool_round',
|
|
1326
|
+
capturedAt,
|
|
1327
|
+
rtwsRootAbs: process.cwd(),
|
|
1328
|
+
dialog: {
|
|
1329
|
+
rootId: args.dlg.id.rootId,
|
|
1330
|
+
selfId: args.dlg.id.selfId,
|
|
1331
|
+
value: args.dlg.id.valueOf(),
|
|
1332
|
+
agentId: args.dlg.agentId,
|
|
1333
|
+
status: args.dlg.status,
|
|
1334
|
+
currentCourse: args.dlg.currentCourse,
|
|
1335
|
+
activeGenCourse: args.dlg.activeGenCourseOrUndefined ?? null,
|
|
1336
|
+
activeGenSeq: args.dlg.activeGenSeqOrUndefined ?? null,
|
|
1337
|
+
hasQueuedPrompt: args.dlg.hasQueuedPrompt(),
|
|
1338
|
+
queuedPrompt: args.dlg.peekQueuedPrompt() ?? null,
|
|
1339
|
+
},
|
|
1340
|
+
finalDisplayState: args.finalDisplayState,
|
|
1341
|
+
latest: args.latest,
|
|
1342
|
+
activeCallees,
|
|
1343
|
+
suspension,
|
|
1344
|
+
diagnostics,
|
|
1345
|
+
callstack: new Error('kernel-driver unexpected idle after tool round').stack ?? null,
|
|
1346
|
+
};
|
|
1347
|
+
await promises_1.default.mkdir(debugDir, { recursive: true });
|
|
1348
|
+
await promises_1.default.writeFile(node_path_1.default.join(debugDir, fileName), `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
1349
|
+
}
|
|
1350
|
+
async function maybeWriteIdleWithActiveReplyObligationDebugDump(args) {
|
|
1351
|
+
if (args.finalDisplayState.kind !== 'idle_waiting_user') {
|
|
1352
|
+
return;
|
|
1353
|
+
}
|
|
1354
|
+
if (args.activeReplyObligation === undefined) {
|
|
1355
|
+
return;
|
|
1356
|
+
}
|
|
1357
|
+
const capturedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
1358
|
+
const debugDir = node_path_1.default.resolve(process.cwd(), '.dislogs', 'debug');
|
|
1359
|
+
const fileName = [
|
|
1360
|
+
'kernel-driver-idle-with-active-reply-obligation',
|
|
1361
|
+
sanitizeDebugFileSegment(capturedAt),
|
|
1362
|
+
sanitizeDebugFileSegment(args.dlg.id.rootId),
|
|
1363
|
+
sanitizeDebugFileSegment(args.dlg.id.selfId),
|
|
1364
|
+
sanitizeDebugFileSegment(args.activeReplyObligation.targetCallId),
|
|
1365
|
+
`${(0, id_1.generateShortId)()}.json`,
|
|
1366
|
+
].join('-');
|
|
1367
|
+
const activeCallees = await persistence_1.DialogPersistence.loadActiveCallees(args.dlg.id, args.dlg.status);
|
|
1368
|
+
const suspension = await args.dlg.getSuspensionStatus();
|
|
1369
|
+
const payload = {
|
|
1370
|
+
kind: 'kernel_driver_idle_with_active_reply_obligation',
|
|
1371
|
+
capturedAt,
|
|
1372
|
+
rtwsRootAbs: process.cwd(),
|
|
1373
|
+
dialog: {
|
|
1374
|
+
rootId: args.dlg.id.rootId,
|
|
1375
|
+
selfId: args.dlg.id.selfId,
|
|
1376
|
+
value: args.dlg.id.valueOf(),
|
|
1377
|
+
agentId: args.dlg.agentId,
|
|
1378
|
+
status: args.dlg.status,
|
|
1379
|
+
currentCourse: args.dlg.currentCourse,
|
|
1380
|
+
activeGenCourse: args.dlg.activeGenCourseOrUndefined ?? null,
|
|
1381
|
+
activeGenSeq: args.dlg.activeGenSeqOrUndefined ?? null,
|
|
1382
|
+
hasQueuedPrompt: args.dlg.hasQueuedPrompt(),
|
|
1383
|
+
queuedPrompt: args.dlg.peekQueuedPrompt() ?? null,
|
|
1384
|
+
},
|
|
1385
|
+
finalDisplayState: args.finalDisplayState,
|
|
1386
|
+
latest: args.latest,
|
|
1387
|
+
activeCallees,
|
|
1388
|
+
suspension,
|
|
1389
|
+
activeReplyObligation: args.activeReplyObligation,
|
|
1390
|
+
callstack: new Error('kernel-driver idle with active reply obligation').stack ?? null,
|
|
1391
|
+
};
|
|
1392
|
+
await promises_1.default.mkdir(debugDir, { recursive: true });
|
|
1393
|
+
await promises_1.default.writeFile(node_path_1.default.join(debugDir, fileName), `${JSON.stringify(payload, null, 2)}\n`, 'utf8');
|
|
1394
|
+
}
|
|
1229
1395
|
async function upsertImmediateFollowupTrigger(args) {
|
|
1230
1396
|
const reasons = [];
|
|
1231
1397
|
if (args.routed.immediateFollowupCallIds.length > 0) {
|
|
@@ -1856,6 +2022,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
1856
2022
|
let lastBusinessContinuation = { kind: 'none' };
|
|
1857
2023
|
let fbrConclusion;
|
|
1858
2024
|
let pubRemindersVer = dlg.remindersVer;
|
|
2025
|
+
let lastToolRoundStopDiagnostics;
|
|
1859
2026
|
let pendingPrompt = humanPrompt;
|
|
1860
2027
|
let resolvingImmediateToolResultForUserPrompt = false;
|
|
1861
2028
|
let resolvingImmediateToolResultUserPromptMsgId;
|
|
@@ -2088,6 +2255,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2088
2255
|
}
|
|
2089
2256
|
}
|
|
2090
2257
|
const acceptedTriggers = await dlg.notifyGeneratingStart(currentPrompt?.msgId);
|
|
2258
|
+
lastToolRoundStopDiagnostics = undefined;
|
|
2091
2259
|
for (const trigger of acceptedTriggers) {
|
|
2092
2260
|
if (trigger.kind === 'followup' && trigger.continuation !== undefined) {
|
|
2093
2261
|
if (currentBusinessContinuation.kind !== 'none' &&
|
|
@@ -2119,9 +2287,11 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2119
2287
|
prompt: currentPrompt,
|
|
2120
2288
|
language: promptLanguage,
|
|
2121
2289
|
});
|
|
2122
|
-
|
|
2290
|
+
const deferredReplyReassertionDirective = replyGuidance.deferredReplyReassertionDirective;
|
|
2291
|
+
const currentPromptIsUserInterjection = currentPrompt.origin === 'user' &&
|
|
2123
2292
|
replyGuidance.suppressInterDialogReplyGuidance &&
|
|
2124
|
-
|
|
2293
|
+
deferredReplyReassertionDirective !== undefined;
|
|
2294
|
+
if (currentPromptIsUserInterjection) {
|
|
2125
2295
|
// WARNING:
|
|
2126
2296
|
// User interjection suppression is a reversible state transition, not a one-shot
|
|
2127
2297
|
// latch. The normal cycle is:
|
|
@@ -2135,7 +2305,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2135
2305
|
const existingDeferredReplyReassertion = await persistence_1.DialogPersistence.getDeferredReplyReassertion(dlg.id, dlg.status);
|
|
2136
2306
|
const nextDeferredReplyReassertion = {
|
|
2137
2307
|
reason: 'user_interjection_with_parked_original_task',
|
|
2138
|
-
directive:
|
|
2308
|
+
directive: deferredReplyReassertionDirective,
|
|
2139
2309
|
};
|
|
2140
2310
|
const mustRearmDeferredReplyReassertion = existingDeferredReplyReassertion === undefined ||
|
|
2141
2311
|
existingDeferredReplyReassertion.resumeGuideSurfaced === true ||
|
|
@@ -2169,7 +2339,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2169
2339
|
if (replyGuidance.promptContent === undefined) {
|
|
2170
2340
|
throw new Error(`kernel-driver reply guidance invariant violation: missing prompt content for dialog=${dlg.id.valueOf()} msgId=${currentPrompt.msgId}`);
|
|
2171
2341
|
}
|
|
2172
|
-
if (
|
|
2342
|
+
if (currentPromptIsUserInterjection) {
|
|
2173
2343
|
await persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
|
|
2174
2344
|
kind: 'patch',
|
|
2175
2345
|
patch: {
|
|
@@ -2951,6 +3121,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2951
3121
|
break;
|
|
2952
3122
|
}
|
|
2953
3123
|
if (routed.shouldStopAfterReplyTool) {
|
|
3124
|
+
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3125
|
+
dlg,
|
|
3126
|
+
streamedFuncCalls,
|
|
3127
|
+
routed,
|
|
3128
|
+
lastBusinessContinuation,
|
|
3129
|
+
shouldStartImmediatePostToolGeneration: false,
|
|
3130
|
+
stopReason: 'reply_tool',
|
|
3131
|
+
});
|
|
2954
3132
|
log_1.log.debug('kernel-driver stop round after explicit replyTellask* tool', undefined, {
|
|
2955
3133
|
dialogId: dlg.id.valueOf(),
|
|
2956
3134
|
toolNames: streamedFuncCalls
|
|
@@ -2962,6 +3140,17 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2962
3140
|
break;
|
|
2963
3141
|
}
|
|
2964
3142
|
if (dlg.hasQueuedPrompt()) {
|
|
3143
|
+
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3144
|
+
dlg,
|
|
3145
|
+
streamedFuncCalls,
|
|
3146
|
+
routed,
|
|
3147
|
+
lastBusinessContinuation,
|
|
3148
|
+
shouldStartImmediatePostToolGeneration: false,
|
|
3149
|
+
stopReason: 'queued_prompt_after_tool_round',
|
|
3150
|
+
queuedPromptAfterToolRound: true,
|
|
3151
|
+
remindersVer: dlg.remindersVer,
|
|
3152
|
+
pubRemindersVer,
|
|
3153
|
+
});
|
|
2965
3154
|
break;
|
|
2966
3155
|
}
|
|
2967
3156
|
if (dlg.remindersVer > pubRemindersVer) {
|
|
@@ -2972,6 +3161,18 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2972
3161
|
// background work, so only Q4H can suspend this same-drive continuation point.
|
|
2973
3162
|
const suspensionAfterToolRound = await dlg.getSuspensionStatus();
|
|
2974
3163
|
if (!suspensionAfterToolRound.canDrive) {
|
|
3164
|
+
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3165
|
+
dlg,
|
|
3166
|
+
streamedFuncCalls,
|
|
3167
|
+
routed,
|
|
3168
|
+
lastBusinessContinuation,
|
|
3169
|
+
shouldStartImmediatePostToolGeneration: false,
|
|
3170
|
+
stopReason: 'suspended_after_tool_round',
|
|
3171
|
+
suspensionAfterToolRound,
|
|
3172
|
+
queuedPromptAfterToolRound: dlg.hasQueuedPrompt(),
|
|
3173
|
+
remindersVer: dlg.remindersVer,
|
|
3174
|
+
pubRemindersVer,
|
|
3175
|
+
});
|
|
2975
3176
|
await preserveDiligenceBudgetAcrossQ4H(dlg);
|
|
2976
3177
|
break;
|
|
2977
3178
|
}
|
|
@@ -2984,6 +3185,18 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
2984
3185
|
invalidFuncCallCount > 0;
|
|
2985
3186
|
if (!shouldStartImmediatePostToolGeneration) {
|
|
2986
3187
|
if (routed.shouldStopAfterPendingTellaskWait) {
|
|
3188
|
+
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3189
|
+
dlg,
|
|
3190
|
+
streamedFuncCalls,
|
|
3191
|
+
routed,
|
|
3192
|
+
lastBusinessContinuation,
|
|
3193
|
+
shouldStartImmediatePostToolGeneration,
|
|
3194
|
+
stopReason: 'pending_tellask_wait',
|
|
3195
|
+
suspensionAfterToolRound,
|
|
3196
|
+
queuedPromptAfterToolRound: dlg.hasQueuedPrompt(),
|
|
3197
|
+
remindersVer: dlg.remindersVer,
|
|
3198
|
+
pubRemindersVer,
|
|
3199
|
+
});
|
|
2987
3200
|
log_1.log.debug('kernel-driver stop round after pending tellask wait boundary', undefined, {
|
|
2988
3201
|
dialogId: dlg.id.valueOf(),
|
|
2989
3202
|
rootId: dlg.id.rootId,
|
|
@@ -3012,6 +3225,18 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3012
3225
|
pendingPrompt = next.prompt;
|
|
3013
3226
|
continue;
|
|
3014
3227
|
}
|
|
3228
|
+
lastToolRoundStopDiagnostics = buildToolRoundStopDiagnostics({
|
|
3229
|
+
dlg,
|
|
3230
|
+
streamedFuncCalls,
|
|
3231
|
+
routed,
|
|
3232
|
+
lastBusinessContinuation,
|
|
3233
|
+
shouldStartImmediatePostToolGeneration,
|
|
3234
|
+
stopReason: 'no_post_tool_continuation',
|
|
3235
|
+
suspensionAfterToolRound,
|
|
3236
|
+
queuedPromptAfterToolRound: dlg.hasQueuedPrompt(),
|
|
3237
|
+
remindersVer: dlg.remindersVer,
|
|
3238
|
+
pubRemindersVer,
|
|
3239
|
+
});
|
|
3015
3240
|
break;
|
|
3016
3241
|
}
|
|
3017
3242
|
if (shouldStartImmediatePostToolGeneration) {
|
|
@@ -3180,6 +3405,30 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
|
|
|
3180
3405
|
reason: 'newer_generation_active',
|
|
3181
3406
|
});
|
|
3182
3407
|
}
|
|
3408
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
|
|
3409
|
+
try {
|
|
3410
|
+
await maybeWriteUnexpectedIdleAfterToolRoundDebugDump({
|
|
3411
|
+
dlg,
|
|
3412
|
+
finalDisplayState,
|
|
3413
|
+
latest,
|
|
3414
|
+
diagnostics: lastToolRoundStopDiagnostics,
|
|
3415
|
+
});
|
|
3416
|
+
await maybeWriteIdleWithActiveReplyObligationDebugDump({
|
|
3417
|
+
dlg,
|
|
3418
|
+
finalDisplayState,
|
|
3419
|
+
latest,
|
|
3420
|
+
activeReplyObligation,
|
|
3421
|
+
});
|
|
3422
|
+
}
|
|
3423
|
+
catch (debugErr) {
|
|
3424
|
+
log_1.log.warn('kernel-driver failed to write idle debug dump', debugErr, {
|
|
3425
|
+
dialogId: dlg.id.valueOf(),
|
|
3426
|
+
rootId: dlg.id.rootId,
|
|
3427
|
+
selfId: dlg.id.selfId,
|
|
3428
|
+
course: lastToolRoundStopDiagnostics?.course ?? null,
|
|
3429
|
+
genseq: lastToolRoundStopDiagnostics?.genseq ?? null,
|
|
3430
|
+
});
|
|
3431
|
+
}
|
|
3183
3432
|
}
|
|
3184
3433
|
catch (err) {
|
|
3185
3434
|
log_1.log.warn('kernel-driver failed to re-check displayState before finalizing', err, {
|
|
@@ -294,15 +294,6 @@ async function loadFreshSuspensionStatusFromPersistence(dialog) {
|
|
|
294
294
|
canDrive: !hasQ4H,
|
|
295
295
|
};
|
|
296
296
|
}
|
|
297
|
-
function buildDisplayStateFromSuspensionStatus(args) {
|
|
298
|
-
if (args.q4h && args.backgroundCalleeDialogs) {
|
|
299
|
-
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
300
|
-
}
|
|
301
|
-
if (args.q4h) {
|
|
302
|
-
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
303
|
-
}
|
|
304
|
-
return { kind: 'idle_waiting_user' };
|
|
305
|
-
}
|
|
306
297
|
async function loadPendingDiagnosticsSnapshot(args) {
|
|
307
298
|
const callerDialogIdObj = new dialog_1.DialogID(args.callerDialogId, args.rootId);
|
|
308
299
|
try {
|
|
@@ -413,13 +404,23 @@ async function clearStaleSideDialogRunControlForFinalResponse(args) {
|
|
|
413
404
|
previousNextStepTriggerCount: latest?.nextStep.triggers.length ?? null,
|
|
414
405
|
};
|
|
415
406
|
}
|
|
407
|
+
const finalResponseCallId = latest.sideDialogFinalResponse?.callId.trim();
|
|
408
|
+
if (finalResponseCallId !== undefined && finalResponseCallId !== '') {
|
|
409
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(args.dialog.id, args.dialog.status);
|
|
410
|
+
if (activeReplyObligation?.targetCallId.trim() === finalResponseCallId) {
|
|
411
|
+
await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(args.dialog.id, undefined, args.dialog.status);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
const displayState = await (0, dialog_display_state_1.computeIdleDisplayState)(args.dialog);
|
|
416
415
|
await persistence_1.DialogPersistence.mutateDialogLatest(args.dialog.id, () => ({
|
|
417
416
|
kind: 'patch',
|
|
418
417
|
patch: {
|
|
419
418
|
generating: false,
|
|
420
419
|
nextStep: (0, dialog_latest_state_1.createEmptyDialogNextStepState)(),
|
|
421
|
-
displayState
|
|
422
|
-
executionMarker:
|
|
420
|
+
displayState,
|
|
421
|
+
executionMarker: displayState.kind === 'stopped'
|
|
422
|
+
? { kind: 'interrupted', reason: displayState.reason }
|
|
423
|
+
: undefined,
|
|
423
424
|
},
|
|
424
425
|
}), args.dialog.status);
|
|
425
426
|
await persistence_1.DialogPersistence.removeWakeQueueEntriesForDialog(args.dialog.id, args.dialog.status);
|
|
@@ -1420,10 +1421,7 @@ async function executeDriveRound(args) {
|
|
|
1420
1421
|
const queuedSideDialogPromptCanResume = dialog instanceof dialog_1.SideDialog && queuedPrompt !== undefined;
|
|
1421
1422
|
if (!suspension.canDrive && !queuedSideDialogPromptCanResume) {
|
|
1422
1423
|
if (resumeFromInterjectionPause) {
|
|
1423
|
-
const restoredState =
|
|
1424
|
-
q4h: suspension.q4h,
|
|
1425
|
-
backgroundCalleeDialogs: suspension.backgroundCalleeDialogs,
|
|
1426
|
-
});
|
|
1424
|
+
const restoredState = await (0, dialog_display_state_1.computeIdleDisplayState)(dialog);
|
|
1427
1425
|
await (0, dialog_display_state_1.setDialogDisplayState)(dialog.id, restoredState);
|
|
1428
1426
|
await maybeSurfaceDeferredReplyReassertionGuideForBlockedContinue(dialog);
|
|
1429
1427
|
log_1.log.debug('kernel-driver continue after interjection pause restored true suspended state from fresh persistence facts', undefined, {
|
|
@@ -6,6 +6,7 @@ exports.supplySideDialogResponseToAssignedAskerIfPendingV2 = supplySideDialogRes
|
|
|
6
6
|
const storage_1 = require("@longrun-ai/kernel/types/storage");
|
|
7
7
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
8
8
|
const dialog_1 = require("../../dialog");
|
|
9
|
+
const dialog_display_state_1 = require("../../dialog-display-state");
|
|
9
10
|
const dialog_global_registry_1 = require("../../dialog-global-registry");
|
|
10
11
|
const dialog_instance_registry_1 = require("../../dialog-instance-registry");
|
|
11
12
|
const log_1 = require("../../log");
|
|
@@ -378,6 +379,18 @@ async function supplyResponseToAskerDialog(args) {
|
|
|
378
379
|
},
|
|
379
380
|
},
|
|
380
381
|
}), callerDialog.status);
|
|
382
|
+
if (maybeSideDialog) {
|
|
383
|
+
const displayState = await (0, dialog_display_state_1.computeIdleDisplayState)(maybeSideDialog);
|
|
384
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(sideDialogId, () => ({
|
|
385
|
+
kind: 'patch',
|
|
386
|
+
patch: {
|
|
387
|
+
displayState,
|
|
388
|
+
executionMarker: displayState.kind === 'stopped'
|
|
389
|
+
? { kind: 'interrupted', reason: displayState.reason }
|
|
390
|
+
: undefined,
|
|
391
|
+
},
|
|
392
|
+
}), callerDialog.status);
|
|
393
|
+
}
|
|
381
394
|
}
|
|
382
395
|
await syncPendingTellaskReminderBestEffort(callerDialog, 'kernel-driver:supplyResponseToAskerDialog');
|
|
383
396
|
const responseRouteRef = calleeResponseRef;
|
package/dist/persistence.js
CHANGED
|
@@ -252,12 +252,6 @@ function hasActiveReplyObligationInAskerStackState(state) {
|
|
|
252
252
|
const top = state?.askerStack[state.askerStack.length - 1];
|
|
253
253
|
return top?.tellaskReplyObligation !== undefined;
|
|
254
254
|
}
|
|
255
|
-
function q4hSuspensionDisplayState(hasQ4H) {
|
|
256
|
-
if (hasQ4H) {
|
|
257
|
-
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
258
|
-
}
|
|
259
|
-
return undefined;
|
|
260
|
-
}
|
|
261
255
|
async function normalizeSideDialogIdleWhileReplyObligationPending(dialogId, status, previous, latest, askerStackState, context) {
|
|
262
256
|
if (status !== 'running' || dialogId.selfId === dialogId.rootId) {
|
|
263
257
|
return latest;
|
|
@@ -268,12 +262,13 @@ async function normalizeSideDialogIdleWhileReplyObligationPending(dialogId, stat
|
|
|
268
262
|
if (!hasActiveReplyObligationInAskerStackState(askerStackState)) {
|
|
269
263
|
return latest;
|
|
270
264
|
}
|
|
271
|
-
const q4hSuspensionState = q4hSuspensionDisplayState((await DialogPersistence.loadQuestions4HumanState(dialogId, status)).length > 0);
|
|
272
|
-
if (!q4hSuspensionState) {
|
|
273
|
-
return latest;
|
|
274
|
-
}
|
|
275
265
|
const top = askerStackState?.askerStack[askerStackState.askerStack.length - 1];
|
|
276
|
-
|
|
266
|
+
const healedDisplayState = {
|
|
267
|
+
kind: 'stopped',
|
|
268
|
+
reason: { kind: 'pending_reply_obligation' },
|
|
269
|
+
continueEnabled: true,
|
|
270
|
+
};
|
|
271
|
+
log_1.log.debug('Dialog latest projection invariant warning: sideDialog with active reply obligation attempted to enter idle displayState; healing from persistence facts', undefined, {
|
|
277
272
|
trigger: context.trigger,
|
|
278
273
|
mutationKind: context.mutationKind,
|
|
279
274
|
latestSource: context.latestSource,
|
|
@@ -284,20 +279,20 @@ async function normalizeSideDialogIdleWhileReplyObligationPending(dialogId, stat
|
|
|
284
279
|
selfId: dialogId.selfId,
|
|
285
280
|
status,
|
|
286
281
|
targetCallId: top?.tellaskReplyObligation?.targetCallId ?? null,
|
|
287
|
-
|
|
282
|
+
targetDialogId: top?.tellaskReplyObligation?.targetDialogId ?? null,
|
|
288
283
|
before: summarizeLatestProjectionState(previous),
|
|
289
284
|
afterBeforeHealing: summarizeLatestProjectionState(latest),
|
|
290
285
|
healedTo: {
|
|
291
|
-
displayState:
|
|
292
|
-
executionMarker:
|
|
286
|
+
displayState: healedDisplayState,
|
|
287
|
+
executionMarker: { kind: 'interrupted', reason: healedDisplayState.reason },
|
|
293
288
|
},
|
|
294
289
|
callStack: captureInvariantWarningStack(),
|
|
295
290
|
});
|
|
296
291
|
return {
|
|
297
292
|
...latest,
|
|
298
293
|
lastModified: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
299
|
-
displayState:
|
|
300
|
-
executionMarker:
|
|
294
|
+
displayState: healedDisplayState,
|
|
295
|
+
executionMarker: { kind: 'interrupted', reason: healedDisplayState.reason },
|
|
301
296
|
};
|
|
302
297
|
}
|
|
303
298
|
const quarantiningMainDialogs = new Set();
|
|
@@ -2615,7 +2610,9 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
|
|
|
2615
2610
|
};
|
|
2616
2611
|
await this.appendEvent(askerDialog, callerCourse, sideDialogCreatedRecord);
|
|
2617
2612
|
const initialSideDialogDisplayState = {
|
|
2618
|
-
kind: '
|
|
2613
|
+
kind: 'stopped',
|
|
2614
|
+
reason: { kind: 'pending_reply_obligation' },
|
|
2615
|
+
continueEnabled: true,
|
|
2619
2616
|
};
|
|
2620
2617
|
// Initialize latest.yaml via the mutation API (write-back will flush).
|
|
2621
2618
|
await DialogPersistence.mutateDialogLatest(sideDialogId, () => ({
|
|
@@ -2631,6 +2628,10 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
|
|
|
2631
2628
|
tellaskCalls: (0, dialog_latest_state_1.createEmptyDialogTellaskCallState)(),
|
|
2632
2629
|
tellaskResults: (0, dialog_latest_state_1.createEmptyDialogTellaskResultState)(),
|
|
2633
2630
|
displayState: initialSideDialogDisplayState,
|
|
2631
|
+
executionMarker: {
|
|
2632
|
+
kind: 'interrupted',
|
|
2633
|
+
reason: initialSideDialogDisplayState.reason,
|
|
2634
|
+
},
|
|
2634
2635
|
disableDiligencePush: false,
|
|
2635
2636
|
},
|
|
2636
2637
|
}));
|