dominds 1.25.6 → 1.25.8
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 +166 -45
- package/dist/dialog-fork.js +45 -20
- package/dist/dialog-interruption.js +2 -1
- package/dist/dialog.d.ts +4 -0
- package/dist/dialog.js +14 -0
- package/dist/llm/gen/mock.d.ts +1 -0
- package/dist/llm/gen/mock.js +12 -0
- package/dist/llm/kernel-driver/drive.js +253 -4
- package/dist/llm/kernel-driver/flow.js +61 -22
- package/dist/llm/kernel-driver/runtime.d.ts +1 -1
- package/dist/llm/kernel-driver/runtime.js +12 -0
- package/dist/llm/kernel-driver/sideDialog.js +13 -0
- package/dist/llm/kernel-driver/tellask-special.js +4 -0
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.js +83 -26
- package/dist/server/dominds-self-update.js +312 -22
- package/dist/server/websocket-handler.js +49 -7
- 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-CATeRp8S.js} +3 -3
- package/webapp/dist/assets/_basePickBy-CATeRp8S.js.map +1 -0
- package/webapp/dist/assets/{_baseUniq-CI1keLoL.js → _baseUniq-CFRLPgeM.js} +2 -2
- package/webapp/dist/assets/_baseUniq-CFRLPgeM.js.map +1 -0
- package/webapp/dist/assets/{arc-1NeUqzoV.js → arc-CB9bI1EY.js} +2 -2
- package/webapp/dist/assets/arc-CB9bI1EY.js.map +1 -0
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-C7SdzYIh.js → architectureDiagram-VXUJARFQ-CCpiy2xw.js} +8 -26
- package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CCpiy2xw.js.map +1 -0
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Cmpu3kIy.js → blockDiagram-VD42YOAC-DgzrbcBd.js} +170 -187
- package/webapp/dist/assets/blockDiagram-VD42YOAC-DgzrbcBd.js.map +1 -0
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-ChGTHIor.js → c4Diagram-YG6GDRKO-C0LCDSs6.js} +4 -4
- package/webapp/dist/assets/c4Diagram-YG6GDRKO-C0LCDSs6.js.map +1 -0
- package/webapp/dist/assets/{channel-ndS-XTQQ.js → channel-sKpY2JZ5.js} +2 -2
- package/webapp/dist/assets/channel-sKpY2JZ5.js.map +1 -0
- package/webapp/dist/assets/{chunk-4BX2VUAB-Cw5FtBd_.js → chunk-4BX2VUAB-D9_yL_TQ.js} +2 -2
- package/webapp/dist/assets/chunk-4BX2VUAB-D9_yL_TQ.js.map +1 -0
- package/webapp/dist/assets/{chunk-55IACEB6-D3G71JdA.js → chunk-55IACEB6-CTuUncSx.js} +2 -2
- package/webapp/dist/assets/chunk-55IACEB6-CTuUncSx.js.map +1 -0
- package/webapp/dist/assets/{chunk-WL4C6EOR-CIwdSg5q.js → chunk-B4BG7PRW-Ceelj1iX.js} +121 -171
- package/webapp/dist/assets/chunk-B4BG7PRW-Ceelj1iX.js.map +1 -0
- package/webapp/dist/assets/{chunk-NQ4KR5QH-CGEMYTch.js → chunk-DI55MBZ5-BoHV50iw.js} +7 -9
- package/webapp/dist/assets/chunk-DI55MBZ5-BoHV50iw.js.map +1 -0
- package/webapp/dist/assets/{chunk-FMBD7UC4-BcugPyy7.js → chunk-FMBD7UC4-CyCMHG2I.js} +2 -2
- package/webapp/dist/assets/chunk-FMBD7UC4-CyCMHG2I.js.map +1 -0
- package/webapp/dist/assets/{chunk-KX2RTZJC-BQ42xd4s.js → chunk-QN33PNHL-DPr_6BJj.js} +2 -2
- package/webapp/dist/assets/chunk-QN33PNHL-DPr_6BJj.js.map +1 -0
- package/webapp/dist/assets/{chunk-QZHKN3VN-CxNTVm5w.js → chunk-QZHKN3VN-B87nIEZP.js} +2 -2
- package/webapp/dist/assets/chunk-QZHKN3VN-B87nIEZP.js.map +1 -0
- package/webapp/dist/assets/{chunk-JSJVCQXG-DvuxYuNq.js → chunk-TZMSLE5B-CEOLgAwG.js} +6 -14
- package/webapp/dist/assets/chunk-TZMSLE5B-CEOLgAwG.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dl05PJAP.js → classDiagram-2ON5EDUG-OU3Rb0MK.js} +6 -7
- package/webapp/dist/assets/classDiagram-2ON5EDUG-OU3Rb0MK.js.map +1 -0
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dl05PJAP.js → classDiagram-v2-WZHVMYZB-OU3Rb0MK.js} +6 -7
- package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-OU3Rb0MK.js.map +1 -0
- package/webapp/dist/assets/{clone-KCj1-QMr.js → clone-DPJ1e01h.js} +2 -2
- package/webapp/dist/assets/clone-DPJ1e01h.js.map +1 -0
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BttciCz5.js → cose-bilkent-S5V4N54A-Eb4tTnqa.js} +2 -2
- package/webapp/dist/assets/cose-bilkent-S5V4N54A-Eb4tTnqa.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--wouwNZD.js} +7 -7
- package/webapp/dist/assets/dagre-6UL2VRFP--wouwNZD.js.map +1 -0
- package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-C80ZsiBG.js → diagram-PSM6KHXK-Da_Qnble.js} +10 -10
- package/webapp/dist/assets/diagram-PSM6KHXK-Da_Qnble.js.map +1 -0
- package/webapp/dist/assets/{diagram-IFDJBPK2-CqKidH4n.js → diagram-QEK2KX5R-BhOtufwo.js} +8 -9
- package/webapp/dist/assets/diagram-QEK2KX5R-BhOtufwo.js.map +1 -0
- package/webapp/dist/assets/{diagram-P4PSJMXO-EHVjfzUV.js → diagram-S2PKOQOG-k-LiSr-7.js} +8 -8
- package/webapp/dist/assets/diagram-S2PKOQOG-k-LiSr-7.js.map +1 -0
- package/webapp/dist/assets/{erDiagram-INFDFZHY-7MrtsOIt.js → erDiagram-Q2GNP2WA-DSTHWIXm.js} +75 -96
- package/webapp/dist/assets/erDiagram-Q2GNP2WA-DSTHWIXm.js.map +1 -0
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D6hXqCy7.js → flowDiagram-NV44I4VS-BjS-xbaY.js} +81 -98
- package/webapp/dist/assets/flowDiagram-NV44I4VS-BjS-xbaY.js.map +1 -0
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DLO0XCDk.js → ganttDiagram-JELNMOA3-DAgcUpJe.js} +3 -28
- package/webapp/dist/assets/ganttDiagram-JELNMOA3-DAgcUpJe.js.map +1 -0
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js → gitGraphDiagram-V2S2FVAM-i1vEkfoe.js} +46 -38
- package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-i1vEkfoe.js.map +1 -0
- package/webapp/dist/assets/graph-CxNIZAUJ.js +425 -0
- package/webapp/dist/assets/graph-CxNIZAUJ.js.map +1 -0
- package/webapp/dist/assets/{index-BXjq-k48.js → index-piqwT9B7.js} +1156 -1048
- package/webapp/dist/assets/{index-BXjq-k48.js.map → index-piqwT9B7.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-BH-Wj-38.js} +7 -7
- package/webapp/dist/assets/infoDiagram-HS3SLOUP-BH-Wj-38.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-B5c5iW9X.js} +5 -5
- package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B5c5iW9X.js.map +1 -0
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DRUw-P-d.js → kanban-definition-3W4ZIXB7-fgYwmV5l.js} +3 -5
- package/webapp/dist/assets/kanban-definition-3W4ZIXB7-fgYwmV5l.js.map +1 -0
- package/webapp/dist/assets/{layout-BUoHHXzn.js → layout-Dc9UeLis.js} +5 -5
- package/webapp/dist/assets/layout-Dc9UeLis.js.map +1 -0
- package/webapp/dist/assets/{linear-xVSAq8rI.js → linear-DFqZ7yVr.js} +2 -2
- package/webapp/dist/assets/linear-DFqZ7yVr.js.map +1 -0
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BcajbGmW.js → mindmap-definition-VGOIOE7T-CWXQmWf-.js} +5 -7
- package/webapp/dist/assets/mindmap-definition-VGOIOE7T-CWXQmWf-.js.map +1 -0
- package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Bu8kmCW6.js → pieDiagram-ADFJNKIX-Dmm4opIx.js} +8 -8
- package/webapp/dist/assets/pieDiagram-ADFJNKIX-Dmm4opIx.js.map +1 -0
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DIBSNUGa.js → quadrantDiagram-AYHSOK5B-L48S6y-Y.js} +3 -3
- package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-L48S6y-Y.js.map +1 -0
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CkrDkbBt.js → requirementDiagram-UZGBJVZJ-uQa6qCTU.js} +6 -16
- package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-uQa6qCTU.js.map +1 -0
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js → sankeyDiagram-TZEHDZUN-4wM4sZjA.js} +2 -2
- package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-4wM4sZjA.js.map +1 -0
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYoNARdO.js → sequenceDiagram-WL72ISMW-EZlETI0Q.js} +201 -601
- package/webapp/dist/assets/sequenceDiagram-WL72ISMW-EZlETI0Q.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9v19nvh.js → stateDiagram-FKZM4ZOC-CeCT7b7S.js} +9 -9
- package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CeCT7b7S.js.map +1 -0
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js → stateDiagram-v2-4FDKWEC3-3oDsYGFz.js} +5 -5
- package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-3oDsYGFz.js.map +1 -0
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BT10dRIJ.js → timeline-definition-IT6M3QCI-9k0ahO0m.js} +3 -3
- package/webapp/dist/assets/timeline-definition-IT6M3QCI-9k0ahO0m.js.map +1 -0
- package/webapp/dist/assets/{treemap-KZPCXAKY-yPoPC5hc.js → treemap-GDKQZRPO--DQUhriC.js} +24 -37
- package/webapp/dist/assets/treemap-GDKQZRPO--DQUhriC.js.map +1 -0
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BWLUzo9S.js → xychartDiagram-PRI3JC2R-VhFrAQO2.js} +4 -4
- package/webapp/dist/assets/xychartDiagram-PRI3JC2R-VhFrAQO2.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
|
@@ -97,12 +97,29 @@ function isNonIdleDisplayProjection(state) {
|
|
|
97
97
|
function hasPendingNextStepTriggers(latest) {
|
|
98
98
|
return (latest?.nextStep.triggers.length ?? 0) > 0;
|
|
99
99
|
}
|
|
100
|
-
function
|
|
100
|
+
function waitingHumanInputDisplayState(hasQ4H) {
|
|
101
101
|
if (hasQ4H) {
|
|
102
102
|
return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
|
|
103
103
|
}
|
|
104
104
|
return undefined;
|
|
105
105
|
}
|
|
106
|
+
async function waitingSideDialogDisplayState(dialogId, status, activeReplyObligation) {
|
|
107
|
+
if (status !== 'running' || activeReplyObligation === undefined) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const activeCallees = await persistence_1.DialogPersistence.loadActiveCallees(dialogId, status);
|
|
111
|
+
const hasPendingSideDialog = activeCallees.batches.some((batch) => batch.callees.some((callee) => callee.status === 'pending'));
|
|
112
|
+
if (!hasPendingSideDialog) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
return { kind: 'waiting_side_dialog' };
|
|
116
|
+
}
|
|
117
|
+
function pendingReplyObligationDisplayState(activeReplyObligation) {
|
|
118
|
+
if (activeReplyObligation === undefined) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return { kind: 'proceeding' };
|
|
122
|
+
}
|
|
106
123
|
async function resolveSideDialogFinalResponseClosure(args) {
|
|
107
124
|
if (!args.latest) {
|
|
108
125
|
return { kind: 'no_final_response' };
|
|
@@ -111,26 +128,50 @@ async function resolveSideDialogFinalResponseClosure(args) {
|
|
|
111
128
|
if (!finalResponseAnchor) {
|
|
112
129
|
return { kind: 'no_final_response' };
|
|
113
130
|
}
|
|
131
|
+
const finalResponseCallId = finalResponseAnchor.callId.trim();
|
|
114
132
|
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(args.dialogId, 'running');
|
|
115
133
|
if (activeReplyObligation === undefined) {
|
|
116
134
|
return {
|
|
117
135
|
kind: 'closed_without_active_reply_obligation',
|
|
118
|
-
callId:
|
|
136
|
+
callId: finalResponseCallId,
|
|
119
137
|
};
|
|
120
138
|
}
|
|
121
|
-
if (activeReplyObligation.targetCallId ===
|
|
139
|
+
if (activeReplyObligation.targetCallId.trim() === finalResponseCallId) {
|
|
122
140
|
return {
|
|
123
141
|
kind: 'closed_with_matching_reply_obligation',
|
|
124
|
-
callId:
|
|
142
|
+
callId: finalResponseCallId,
|
|
125
143
|
activeReplyObligation,
|
|
126
144
|
};
|
|
127
145
|
}
|
|
128
146
|
return {
|
|
129
147
|
kind: 'blocked_by_different_reply_obligation',
|
|
130
|
-
callId:
|
|
148
|
+
callId: finalResponseCallId,
|
|
131
149
|
activeReplyObligation,
|
|
132
150
|
};
|
|
133
151
|
}
|
|
152
|
+
async function clearMatchingFinalResponseReplyObligation(dialogId, closure) {
|
|
153
|
+
if (closure.kind !== 'closed_with_matching_reply_obligation') {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(dialogId, undefined, 'running');
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
async function settleFinalResponseClosureForIdleProjection(dialogId, closure) {
|
|
160
|
+
switch (closure.kind) {
|
|
161
|
+
case 'no_final_response':
|
|
162
|
+
case 'blocked_by_different_reply_obligation':
|
|
163
|
+
return false;
|
|
164
|
+
case 'closed_without_active_reply_obligation':
|
|
165
|
+
return true;
|
|
166
|
+
case 'closed_with_matching_reply_obligation':
|
|
167
|
+
await clearMatchingFinalResponseReplyObligation(dialogId, closure);
|
|
168
|
+
return true;
|
|
169
|
+
default: {
|
|
170
|
+
const _exhaustive = closure;
|
|
171
|
+
throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
134
175
|
function classifyRunControlBucket(state) {
|
|
135
176
|
if (!state)
|
|
136
177
|
return 'none';
|
|
@@ -181,7 +222,7 @@ async function getRunControlCountsSnapshot() {
|
|
|
181
222
|
else if (latest?.executionMarker?.kind === 'interrupted' &&
|
|
182
223
|
isStoppedReasonResumable(latest.executionMarker.reason)) {
|
|
183
224
|
// Keep run-control counts aligned with actual Continue affordance:
|
|
184
|
-
// - ordinary interrupted dialogs count as resumable only when no Q4H
|
|
225
|
+
// - ordinary interrupted dialogs count as resumable only when no Q4H human-input wait remains
|
|
185
226
|
// - legacy interjection-paused dialogs still count as resumable even if Q4H remains,
|
|
186
227
|
// because Continue only re-evaluates the original task from fresh facts
|
|
187
228
|
if ((0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
|
|
@@ -372,6 +413,7 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
|
|
|
372
413
|
});
|
|
373
414
|
return;
|
|
374
415
|
}
|
|
416
|
+
let nextDisplayState = displayState;
|
|
375
417
|
let previousDisplayState;
|
|
376
418
|
let previousExecutionMarker;
|
|
377
419
|
// "dead" is irreversible. Once a dialog is marked dead, do not allow overwriting it with
|
|
@@ -397,24 +439,82 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
|
|
|
397
439
|
}
|
|
398
440
|
return;
|
|
399
441
|
}
|
|
442
|
+
if (status === 'running' && displayState.kind === 'idle_waiting_user') {
|
|
443
|
+
const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
|
|
444
|
+
if (waitingHumanInput) {
|
|
445
|
+
nextDisplayState = waitingHumanInput;
|
|
446
|
+
log.warn('Redirecting idle displayState to waiting-human-input state', undefined, {
|
|
447
|
+
dialogId: dialogId.valueOf(),
|
|
448
|
+
rootId: dialogId.rootId,
|
|
449
|
+
selfId: dialogId.selfId,
|
|
450
|
+
status,
|
|
451
|
+
nextDisplayState,
|
|
452
|
+
previousDisplayState: latest?.displayState ?? null,
|
|
453
|
+
previousExecutionMarker: latest?.executionMarker ?? null,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
else if (!(await settleFinalResponseClosureForIdleProjection(dialogId, await resolveSideDialogFinalResponseClosure({
|
|
457
|
+
dialogId,
|
|
458
|
+
latest,
|
|
459
|
+
})))) {
|
|
460
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, status);
|
|
461
|
+
const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, status, activeReplyObligation);
|
|
462
|
+
if (waitingSideDialog) {
|
|
463
|
+
nextDisplayState = waitingSideDialog;
|
|
464
|
+
log.warn('Redirecting idle displayState to waiting-side-dialog state', undefined, {
|
|
465
|
+
dialogId: dialogId.valueOf(),
|
|
466
|
+
rootId: dialogId.rootId,
|
|
467
|
+
selfId: dialogId.selfId,
|
|
468
|
+
status,
|
|
469
|
+
nextDisplayState,
|
|
470
|
+
targetCallId: activeReplyObligation?.targetCallId ?? null,
|
|
471
|
+
targetDialogId: activeReplyObligation?.targetDialogId.valueOf() ?? null,
|
|
472
|
+
previousDisplayState: latest?.displayState ?? null,
|
|
473
|
+
previousExecutionMarker: latest?.executionMarker ?? null,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
|
|
478
|
+
if (pendingReplyObligation) {
|
|
479
|
+
nextDisplayState = pendingReplyObligation;
|
|
480
|
+
log.warn('Redirecting idle displayState to active reply obligation state', undefined, {
|
|
481
|
+
dialogId: dialogId.valueOf(),
|
|
482
|
+
rootId: dialogId.rootId,
|
|
483
|
+
selfId: dialogId.selfId,
|
|
484
|
+
status,
|
|
485
|
+
nextDisplayState,
|
|
486
|
+
targetCallId: activeReplyObligation?.targetCallId ?? null,
|
|
487
|
+
targetDialogId: activeReplyObligation?.targetDialogId.valueOf() ?? null,
|
|
488
|
+
previousDisplayState: latest?.displayState ?? null,
|
|
489
|
+
previousExecutionMarker: latest?.executionMarker ?? null,
|
|
490
|
+
sideDialogFinalResponseCallId: latest?.sideDialogFinalResponse?.callId ?? null,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
400
496
|
}
|
|
401
497
|
catch (err) {
|
|
402
498
|
log.warn('Failed to check existing displayState before setDialogDisplayState', err, {
|
|
403
499
|
dialogId: dialogId.valueOf(),
|
|
404
500
|
status,
|
|
501
|
+
intendedDisplayState: displayState,
|
|
405
502
|
});
|
|
503
|
+
if (status === 'running' && displayState.kind === 'idle_waiting_user') {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
406
506
|
}
|
|
407
|
-
const nextExecutionMarker =
|
|
408
|
-
? { kind: 'interrupted', reason:
|
|
409
|
-
:
|
|
410
|
-
? { kind: 'dead', reason:
|
|
507
|
+
const nextExecutionMarker = nextDisplayState.kind === 'stopped'
|
|
508
|
+
? { kind: 'interrupted', reason: nextDisplayState.reason }
|
|
509
|
+
: nextDisplayState.kind === 'dead'
|
|
510
|
+
? { kind: 'dead', reason: nextDisplayState.reason }
|
|
411
511
|
: previousExecutionMarker?.kind === 'interrupted'
|
|
412
512
|
? undefined
|
|
413
513
|
: previousExecutionMarker;
|
|
414
514
|
try {
|
|
415
515
|
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
416
516
|
kind: 'patch',
|
|
417
|
-
patch: { displayState, executionMarker: nextExecutionMarker },
|
|
517
|
+
patch: { displayState: nextDisplayState, executionMarker: nextExecutionMarker },
|
|
418
518
|
}), status);
|
|
419
519
|
}
|
|
420
520
|
catch (err) {
|
|
@@ -424,16 +524,17 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
|
|
|
424
524
|
selfId: dialogId.selfId,
|
|
425
525
|
status,
|
|
426
526
|
intendedDisplayState: displayState,
|
|
527
|
+
persistedDisplayState: nextDisplayState,
|
|
427
528
|
});
|
|
428
529
|
}
|
|
429
530
|
const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
|
|
430
531
|
type: 'dlg_display_state_evt',
|
|
431
|
-
displayState,
|
|
532
|
+
displayState: nextDisplayState,
|
|
432
533
|
});
|
|
433
534
|
if (broadcastToClients) {
|
|
434
535
|
broadcastToClients(typed);
|
|
435
536
|
}
|
|
436
|
-
if (shouldBroadcastRunControlCounts(previousDisplayState,
|
|
537
|
+
if (shouldBroadcastRunControlCounts(previousDisplayState, nextDisplayState)) {
|
|
437
538
|
try {
|
|
438
539
|
await broadcastRunControlCountsSnapshot();
|
|
439
540
|
}
|
|
@@ -479,18 +580,26 @@ async function computeIdleDisplayState(dlg) {
|
|
|
479
580
|
continueEnabled: true,
|
|
480
581
|
};
|
|
481
582
|
}
|
|
482
|
-
const
|
|
483
|
-
if (
|
|
484
|
-
return
|
|
583
|
+
const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
|
|
584
|
+
if (waitingHumanInput) {
|
|
585
|
+
return waitingHumanInput;
|
|
485
586
|
}
|
|
486
587
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
|
|
487
588
|
dialogId: dlg.id,
|
|
488
589
|
latest,
|
|
489
590
|
});
|
|
490
|
-
if (
|
|
491
|
-
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
591
|
+
if (await settleFinalResponseClosureForIdleProjection(dlg.id, finalResponseClosure)) {
|
|
492
592
|
return { kind: 'idle_waiting_user' };
|
|
493
593
|
}
|
|
594
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
|
|
595
|
+
const waitingSideDialog = await waitingSideDialogDisplayState(dlg.id, dlg.status, activeReplyObligation);
|
|
596
|
+
if (waitingSideDialog) {
|
|
597
|
+
return waitingSideDialog;
|
|
598
|
+
}
|
|
599
|
+
const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
|
|
600
|
+
if (pendingReplyObligation) {
|
|
601
|
+
return pendingReplyObligation;
|
|
602
|
+
}
|
|
494
603
|
return { kind: 'idle_waiting_user' };
|
|
495
604
|
}
|
|
496
605
|
async function computeIdleDisplayStateFromPersistence(dialogId) {
|
|
@@ -520,15 +629,23 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
|
|
|
520
629
|
continueEnabled: true,
|
|
521
630
|
};
|
|
522
631
|
}
|
|
523
|
-
const
|
|
524
|
-
if (
|
|
525
|
-
return
|
|
632
|
+
const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
|
|
633
|
+
if (waitingHumanInput) {
|
|
634
|
+
return waitingHumanInput;
|
|
526
635
|
}
|
|
527
636
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
|
|
528
|
-
if (
|
|
529
|
-
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
637
|
+
if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
|
|
530
638
|
return { kind: 'idle_waiting_user' };
|
|
531
639
|
}
|
|
640
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
|
|
641
|
+
const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, 'running', activeReplyObligation);
|
|
642
|
+
if (waitingSideDialog) {
|
|
643
|
+
return waitingSideDialog;
|
|
644
|
+
}
|
|
645
|
+
const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
|
|
646
|
+
if (pendingReplyObligation) {
|
|
647
|
+
return pendingReplyObligation;
|
|
648
|
+
}
|
|
532
649
|
return { kind: 'idle_waiting_user' };
|
|
533
650
|
}
|
|
534
651
|
async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
@@ -549,19 +666,12 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
|
|
|
549
666
|
dialogId: args.dialogId,
|
|
550
667
|
latest: args.latest,
|
|
551
668
|
});
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
case 'closed_with_matching_reply_obligation':
|
|
559
|
-
await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(args.dialogId, undefined, 'running');
|
|
560
|
-
break;
|
|
561
|
-
default: {
|
|
562
|
-
const _exhaustive = finalResponseClosure;
|
|
563
|
-
throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
|
|
564
|
-
}
|
|
669
|
+
if (finalResponseClosure.kind !== 'closed_without_active_reply_obligation' &&
|
|
670
|
+
finalResponseClosure.kind !== 'closed_with_matching_reply_obligation') {
|
|
671
|
+
return args.latest;
|
|
672
|
+
}
|
|
673
|
+
if (!(await settleFinalResponseClosureForIdleProjection(args.dialogId, finalResponseClosure))) {
|
|
674
|
+
return args.latest;
|
|
565
675
|
}
|
|
566
676
|
const clearedReplyObligation = finalResponseClosure.kind === 'closed_with_matching_reply_obligation';
|
|
567
677
|
log.warn('Healing stale sideDialog run-control flags after final response anchor', undefined, {
|
|
@@ -615,15 +725,15 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
|
|
|
615
725
|
(0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
|
|
616
726
|
// WARNING:
|
|
617
727
|
// This is the one place where the projection intentionally preserves legacy
|
|
618
|
-
// paused-interjection stopped state ahead of the current
|
|
728
|
+
// paused-interjection stopped state ahead of the current wait facts. That is not a bug:
|
|
619
729
|
// the UI may still need to show that the original task was paused even if the underlying
|
|
620
730
|
// dialog is now waiting on Q4H.
|
|
621
731
|
//
|
|
622
732
|
// The true source-of-truth decision about what Continue should do next lives in `flow.ts`'s
|
|
623
733
|
// resume path, which performs a fresh fact scan at resume time and then either restores the
|
|
624
|
-
// Q4H
|
|
734
|
+
// Q4H waiting-human-input state or keeps driving immediately.
|
|
625
735
|
//
|
|
626
|
-
// Do not "heal" this branch away by prioritizing
|
|
736
|
+
// Do not "heal" this branch away by prioritizing wait facts here; that would collapse the
|
|
627
737
|
// temporary interjection UX and make repeated interjection turns revert too early.
|
|
628
738
|
return {
|
|
629
739
|
kind: 'stopped',
|
|
@@ -638,15 +748,23 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
|
|
|
638
748
|
continueEnabled: true,
|
|
639
749
|
};
|
|
640
750
|
}
|
|
641
|
-
const
|
|
642
|
-
if (
|
|
643
|
-
return
|
|
751
|
+
const waitingHumanInput = waitingHumanInputDisplayState(latest.userWait?.kind === 'awaiting_user_answer');
|
|
752
|
+
if (waitingHumanInput) {
|
|
753
|
+
return waitingHumanInput;
|
|
644
754
|
}
|
|
645
755
|
const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
|
|
646
|
-
if (
|
|
647
|
-
finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
|
|
756
|
+
if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
|
|
648
757
|
return { kind: 'idle_waiting_user' };
|
|
649
758
|
}
|
|
759
|
+
const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
|
|
760
|
+
const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, 'running', activeReplyObligation);
|
|
761
|
+
if (waitingSideDialog) {
|
|
762
|
+
return waitingSideDialog;
|
|
763
|
+
}
|
|
764
|
+
const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
|
|
765
|
+
if (pendingReplyObligation) {
|
|
766
|
+
return pendingReplyObligation;
|
|
767
|
+
}
|
|
650
768
|
if (latest.executionMarker?.kind === 'interrupted' &&
|
|
651
769
|
latest.executionMarker.reason.kind !== 'pending_reply_obligation') {
|
|
652
770
|
return {
|
|
@@ -790,7 +908,10 @@ async function reconcileDisplayStatesAfterRestart() {
|
|
|
790
908
|
if (!nextIdle) {
|
|
791
909
|
continue;
|
|
792
910
|
}
|
|
793
|
-
const next = nextIdle.kind === 'blocked' ||
|
|
911
|
+
const next = nextIdle.kind === 'blocked' ||
|
|
912
|
+
nextIdle.kind === 'waiting_side_dialog' ||
|
|
913
|
+
nextIdle.kind === 'stopped' ||
|
|
914
|
+
nextIdle.kind === 'dead'
|
|
794
915
|
? nextIdle
|
|
795
916
|
: {
|
|
796
917
|
kind: 'stopped',
|
package/dist/dialog-fork.js
CHANGED
|
@@ -272,6 +272,10 @@ function countFunctionCalls(events) {
|
|
|
272
272
|
return count;
|
|
273
273
|
}
|
|
274
274
|
function computeRootForkDisplayState(args) {
|
|
275
|
+
const topFrame = args.askerStack?.askerStack[args.askerStack.askerStack.length - 1];
|
|
276
|
+
if (topFrame?.tellaskReplyObligation !== undefined) {
|
|
277
|
+
return { kind: 'proceeding' };
|
|
278
|
+
}
|
|
275
279
|
if (args.action.kind === 'draft_user_text') {
|
|
276
280
|
return { kind: 'idle_waiting_user' };
|
|
277
281
|
}
|
|
@@ -281,6 +285,13 @@ function computeRootForkDisplayState(args) {
|
|
|
281
285
|
}
|
|
282
286
|
return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
|
|
283
287
|
}
|
|
288
|
+
function computeSideDialogForkDisplayState(askerStack) {
|
|
289
|
+
const topFrame = askerStack?.askerStack[askerStack.askerStack.length - 1];
|
|
290
|
+
if (topFrame?.tellaskReplyObligation !== undefined) {
|
|
291
|
+
return { kind: 'proceeding' };
|
|
292
|
+
}
|
|
293
|
+
return { kind: 'idle_waiting_user' };
|
|
294
|
+
}
|
|
284
295
|
async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
|
|
285
296
|
const sourceDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(sourceId, sourceStatus), 'artifacts');
|
|
286
297
|
const targetDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(targetId, 'running'), 'artifacts');
|
|
@@ -535,32 +546,14 @@ async function persistForkPlan(args) {
|
|
|
535
546
|
if (sourceAskerStack.askerStack.length > 0) {
|
|
536
547
|
await persistence_1.DialogPersistence.saveDialogAskerStack(plan.targetId, rewriteSideDialogAskerStackStateForFork(sourceAskerStack, plan.sourceId.rootId, plan.targetId.rootId), 'running');
|
|
537
548
|
}
|
|
538
|
-
for (const course of plan.retainedCourses) {
|
|
539
|
-
for (const event of course.events) {
|
|
540
|
-
await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
|
|
544
|
-
await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
|
|
545
|
-
await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
|
|
546
|
-
for (const record of plan.activeCalleeDispatches) {
|
|
547
|
-
await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
|
|
548
|
-
}
|
|
549
|
-
await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
|
|
550
|
-
key: entry.key,
|
|
551
|
-
sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
|
|
552
|
-
agentId: entry.agentId,
|
|
553
|
-
sessionSlug: entry.sessionSlug,
|
|
554
|
-
})), 'running');
|
|
555
|
-
await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
|
|
556
|
-
await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
|
|
557
549
|
const currentCourseEvents = plan.retainedCourses.find((item) => item.course === plan.currentCourse)?.events ?? [];
|
|
558
550
|
const displayState = plan.targetId.selfId === plan.targetId.rootId
|
|
559
551
|
? computeRootForkDisplayState({
|
|
560
552
|
action: args.action,
|
|
561
553
|
questions: plan.questions,
|
|
554
|
+
askerStack: sourceAskerStack,
|
|
562
555
|
})
|
|
563
|
-
:
|
|
556
|
+
: computeSideDialogForkDisplayState(sourceAskerStack);
|
|
564
557
|
await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, () => ({
|
|
565
558
|
kind: 'replace',
|
|
566
559
|
next: {
|
|
@@ -581,6 +574,38 @@ async function persistForkPlan(args) {
|
|
|
581
574
|
: undefined,
|
|
582
575
|
},
|
|
583
576
|
}));
|
|
577
|
+
for (const course of plan.retainedCourses) {
|
|
578
|
+
for (const event of course.events) {
|
|
579
|
+
await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
|
|
583
|
+
await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
|
|
584
|
+
await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
|
|
585
|
+
for (const record of plan.activeCalleeDispatches) {
|
|
586
|
+
await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
|
|
587
|
+
}
|
|
588
|
+
await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
|
|
589
|
+
key: entry.key,
|
|
590
|
+
sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
|
|
591
|
+
agentId: entry.agentId,
|
|
592
|
+
sessionSlug: entry.sessionSlug,
|
|
593
|
+
})), 'running');
|
|
594
|
+
await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
|
|
595
|
+
await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
|
|
596
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, (previous) => ({
|
|
597
|
+
kind: 'patch',
|
|
598
|
+
patch: {
|
|
599
|
+
currentCourse: plan.currentCourse,
|
|
600
|
+
messageCount: countMessages(currentCourseEvents),
|
|
601
|
+
functionCallCount: countFunctionCalls(currentCourseEvents),
|
|
602
|
+
sideDialogCount: plan.childCount,
|
|
603
|
+
displayState,
|
|
604
|
+
executionMarker: displayState.kind === 'stopped'
|
|
605
|
+
? { kind: 'interrupted', reason: displayState.reason }
|
|
606
|
+
: previous.executionMarker,
|
|
607
|
+
},
|
|
608
|
+
}));
|
|
584
609
|
}
|
|
585
610
|
async function forkMainDialogTreeAtGeneration(args) {
|
|
586
611
|
const sourceRootId = args.sourceRootId.trim();
|
|
@@ -25,11 +25,12 @@ function isInterruptionReasonManualResumeEligible(reason) {
|
|
|
25
25
|
case 'emergency_stop':
|
|
26
26
|
case 'server_restart':
|
|
27
27
|
case 'pending_runtime_prompt':
|
|
28
|
-
case 'pending_reply_obligation':
|
|
29
28
|
case 'fork_continue_ready':
|
|
30
29
|
case 'system_stop':
|
|
31
30
|
case 'llm_retry_stopped':
|
|
32
31
|
return true;
|
|
32
|
+
case 'pending_reply_obligation':
|
|
33
|
+
return false;
|
|
33
34
|
default: {
|
|
34
35
|
const _exhaustive = reason;
|
|
35
36
|
return _exhaustive;
|
package/dist/dialog.d.ts
CHANGED
|
@@ -375,6 +375,8 @@ export declare abstract class Dialog {
|
|
|
375
375
|
hasQueuedPrompt(): boolean;
|
|
376
376
|
peekQueuedPrompt(): DialogQueuedPromptState | undefined;
|
|
377
377
|
takeQueuedPrompt(): DialogQueuedPromptState | undefined;
|
|
378
|
+
removeQueuedPromptByMsgId(msgId: string): boolean;
|
|
379
|
+
removeQueuedPromptsMatching(predicate: (prompt: DialogQueuedPromptState) => boolean): number;
|
|
378
380
|
setActiveRunControlSpec(spec?: DialogRunControlSpec): void;
|
|
379
381
|
getActiveRunControlSpec(): DialogRunControlSpec | undefined;
|
|
380
382
|
setNewCourseHook(hook?: NewCourseHook): void;
|
|
@@ -459,6 +461,7 @@ export declare abstract class Dialog {
|
|
|
459
461
|
persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number, rawId?: string): Promise<void>;
|
|
460
462
|
persistTellaskCall(id: string, name: TellaskCallRecordName, rawArgumentsText: string, genseq: number, options?: {
|
|
461
463
|
deliveryMode?: 'tellask_call_start' | 'func_call_requested';
|
|
464
|
+
replyDirective?: TellaskReplyDirective;
|
|
462
465
|
}): Promise<void>;
|
|
463
466
|
/**
|
|
464
467
|
* Post sideDialog completion response to this dialog.
|
|
@@ -693,6 +696,7 @@ export declare abstract class DialogStore {
|
|
|
693
696
|
persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number, _rawId?: string): Promise<void>;
|
|
694
697
|
persistTellaskCall(_dialog: Dialog, _id: string, _name: TellaskCallRecordName, _rawArgumentsText: string, _genseq: number, _options?: {
|
|
695
698
|
deliveryMode?: 'tellask_call_start' | 'func_call_requested';
|
|
699
|
+
replyDirective?: TellaskReplyDirective;
|
|
696
700
|
}): Promise<void>;
|
|
697
701
|
/**
|
|
698
702
|
* Start a new course in storage
|
package/dist/dialog.js
CHANGED
|
@@ -1186,6 +1186,20 @@ class Dialog {
|
|
|
1186
1186
|
takeQueuedPrompt() {
|
|
1187
1187
|
return this._queuedPrompts.shift();
|
|
1188
1188
|
}
|
|
1189
|
+
removeQueuedPromptByMsgId(msgId) {
|
|
1190
|
+
const normalized = msgId.trim();
|
|
1191
|
+
if (normalized === '') {
|
|
1192
|
+
return false;
|
|
1193
|
+
}
|
|
1194
|
+
const before = this._queuedPrompts.length;
|
|
1195
|
+
this._queuedPrompts = this._queuedPrompts.filter((prompt) => prompt.msgId !== normalized);
|
|
1196
|
+
return this._queuedPrompts.length !== before;
|
|
1197
|
+
}
|
|
1198
|
+
removeQueuedPromptsMatching(predicate) {
|
|
1199
|
+
const before = this._queuedPrompts.length;
|
|
1200
|
+
this._queuedPrompts = this._queuedPrompts.filter((prompt) => !predicate(prompt));
|
|
1201
|
+
return before - this._queuedPrompts.length;
|
|
1202
|
+
}
|
|
1189
1203
|
setActiveRunControlSpec(spec) {
|
|
1190
1204
|
this._activeRunControlSpec = spec;
|
|
1191
1205
|
}
|
package/dist/llm/gen/mock.d.ts
CHANGED
|
@@ -65,6 +65,7 @@ export declare class MockGen implements LlmGenerator {
|
|
|
65
65
|
private responseMatchesContext;
|
|
66
66
|
private normalizeFuncCallArgs;
|
|
67
67
|
private extractLastAssistantSaying;
|
|
68
|
+
private extractCurrentPromptMsgId;
|
|
68
69
|
private buildReplyToolReminderAutoResponse;
|
|
69
70
|
/**
|
|
70
71
|
* Find matching response using EXACT last message only.
|
package/dist/llm/gen/mock.js
CHANGED
|
@@ -276,6 +276,16 @@ class MockGen {
|
|
|
276
276
|
}
|
|
277
277
|
return null;
|
|
278
278
|
}
|
|
279
|
+
extractCurrentPromptMsgId(context) {
|
|
280
|
+
for (let index = context.length - 1; index >= 0; index -= 1) {
|
|
281
|
+
const msg = context[index];
|
|
282
|
+
if (msg?.type === 'prompting_msg') {
|
|
283
|
+
const trimmed = msg.msgId.trim();
|
|
284
|
+
return trimmed === '' ? undefined : trimmed;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
279
289
|
buildReplyToolReminderAutoResponse(input, role, context) {
|
|
280
290
|
if (role !== 'user' || !(0, reply_prompt_copy_1.isReplyToolReminderPromptContent)(input)) {
|
|
281
291
|
return null;
|
|
@@ -288,12 +298,14 @@ class MockGen {
|
|
|
288
298
|
if (!replyContent) {
|
|
289
299
|
return null;
|
|
290
300
|
}
|
|
301
|
+
const promptMsgId = this.extractCurrentPromptMsgId(context);
|
|
291
302
|
return {
|
|
292
303
|
message: input,
|
|
293
304
|
role,
|
|
294
305
|
response: '',
|
|
295
306
|
funcCalls: [
|
|
296
307
|
{
|
|
308
|
+
id: promptMsgId ? `mock_reply_${promptMsgId}` : undefined,
|
|
297
309
|
name: toolMatch[1],
|
|
298
310
|
arguments: { replyContent },
|
|
299
311
|
},
|