dominds 1.25.12 → 1.25.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dialog-display-state.d.ts +4 -2
- package/dist/dialog-display-state.js +26 -6
- package/dist/llm/kernel-driver/flow.js +3 -0
- package/dist/llm/kernel-driver/sideDialog.d.ts +1 -0
- package/dist/llm/kernel-driver/sideDialog.js +30 -20
- package/dist/llm/kernel-driver/tellask-special.js +3 -0
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.js +18 -0
- package/dist/server/api-routes.js +70 -8
- package/dist/server/dialog-forensics-routes.d.ts +2 -0
- package/dist/server/dialog-forensics-routes.js +549 -0
- package/dist/server/dominds-self-update.js +54 -31
- package/dist/server/websocket-handler.js +5 -15
- package/dist/tools/cmd-runner-protocol.d.ts +1 -0
- package/dist/tools/cmd-runner-protocol.js +8 -1
- package/dist/tools/cmd-runner.js +33 -6
- package/dist/tools/os.js +13 -8
- package/dist/tools/process-kill.d.ts +4 -0
- package/dist/tools/process-kill.js +48 -0
- package/dist/tools/prompts/os/en/tools.md +2 -2
- package/dist/tools/prompts/os/zh/tools.md +2 -2
- package/package.json +3 -3
- package/webapp/dist/assets/{_basePickBy-B1-brAPU.js → _basePickBy-xJw0ZLXb.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-B1-brAPU.js.map → _basePickBy-xJw0ZLXb.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js → _baseUniq-BwH1mnxt.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js.map → _baseUniq-BwH1mnxt.js.map} +1 -1
- package/webapp/dist/assets/{arc-CvsBvjnB.js → arc-CXDyEAks.js} +2 -2
- package/webapp/dist/assets/{arc-CvsBvjnB.js.map → arc-CXDyEAks.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js → architectureDiagram-2XIMDMQ5-CQfjSekJ.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map → architectureDiagram-2XIMDMQ5-CQfjSekJ.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js → blockDiagram-WCTKOSBZ-DFTd-DGC.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js.map → blockDiagram-WCTKOSBZ-DFTd-DGC.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js → c4Diagram-IC4MRINW-DS_zRetl.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js.map → c4Diagram-IC4MRINW-DS_zRetl.js.map} +1 -1
- package/webapp/dist/assets/{channel-D1VPurpu.js → channel-BbTmwKgX.js} +2 -2
- package/webapp/dist/assets/{channel-D1VPurpu.js.map → channel-BbTmwKgX.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js → chunk-4BX2VUAB-CwosIBGF.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js.map → chunk-4BX2VUAB-CwosIBGF.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js → chunk-55IACEB6-Cwh90dP4.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js.map → chunk-55IACEB6-Cwh90dP4.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js → chunk-FMBD7UC4-BNnil15z.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js.map → chunk-FMBD7UC4-BNnil15z.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js → chunk-JSJVCQXG-DimIImfv.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js.map → chunk-JSJVCQXG-DimIImfv.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js → chunk-KX2RTZJC-iWTw8TpU.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js.map → chunk-KX2RTZJC-iWTw8TpU.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js → chunk-NQ4KR5QH-vej7OjjD.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js.map → chunk-NQ4KR5QH-vej7OjjD.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js → chunk-QZHKN3VN-UTOcRcah.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js.map → chunk-QZHKN3VN-UTOcRcah.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js → chunk-WL4C6EOR-BPG9Okux.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js.map → chunk-WL4C6EOR-BPG9Okux.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js → classDiagram-VBA2DB6C-BY0IlgU0.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js.map → classDiagram-VBA2DB6C-BY0IlgU0.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js → classDiagram-v2-RAHNMMFH-BY0IlgU0.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map → classDiagram-v2-RAHNMMFH-BY0IlgU0.js.map} +1 -1
- package/webapp/dist/assets/{clone-ePiNaiNY.js → clone-HAPhhkfG.js} +2 -2
- package/webapp/dist/assets/{clone-ePiNaiNY.js.map → clone-HAPhhkfG.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js → cose-bilkent-S5V4N54A-BQlr3U5G.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js.map → cose-bilkent-S5V4N54A-BQlr3U5G.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js → dagre-KLK3FWXG-DphPFDYz.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js.map → dagre-KLK3FWXG-DphPFDYz.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js → diagram-E7M64L7V-Bv4UxxXd.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js.map → diagram-E7M64L7V-Bv4UxxXd.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js → diagram-IFDJBPK2-y1CGHto0.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js.map → diagram-IFDJBPK2-y1CGHto0.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js → diagram-P4PSJMXO-IXiebzDc.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js.map → diagram-P4PSJMXO-IXiebzDc.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js → erDiagram-INFDFZHY-DgVQi2c7.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js.map → erDiagram-INFDFZHY-DgVQi2c7.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js → flowDiagram-PKNHOUZH-Ccs_iaLm.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js.map → flowDiagram-PKNHOUZH-Ccs_iaLm.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js → ganttDiagram-A5KZAMGK-BOlky6CI.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js.map → ganttDiagram-A5KZAMGK-BOlky6CI.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js.map} +1 -1
- package/webapp/dist/assets/{graph-CAlg3tEk.js → graph-CbpUBil5.js} +3 -3
- package/webapp/dist/assets/{graph-CAlg3tEk.js.map → graph-CbpUBil5.js.map} +1 -1
- package/webapp/dist/assets/{index-DLTS_eOh.js → index-BiFvaOdQ.js} +139 -51
- package/webapp/dist/assets/{index-DLTS_eOh.js.map → index-BiFvaOdQ.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js → infoDiagram-LFFYTUFH-hytR8L_9.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js.map → infoDiagram-LFFYTUFH-hytR8L_9.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js → ishikawaDiagram-PHBUUO56-C-58-pR6.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map → ishikawaDiagram-PHBUUO56-C-58-pR6.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js → journeyDiagram-4ABVD52K-DlW9wE_9.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js.map → journeyDiagram-4ABVD52K-DlW9wE_9.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js → kanban-definition-K7BYSVSG-DMwi6h6F.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js.map → kanban-definition-K7BYSVSG-DMwi6h6F.js.map} +1 -1
- package/webapp/dist/assets/{layout-uOLcVthp.js → layout-m0UN-laA.js} +5 -5
- package/webapp/dist/assets/{layout-uOLcVthp.js.map → layout-m0UN-laA.js.map} +1 -1
- package/webapp/dist/assets/{linear-Ga_f4H_w.js → linear-Dl3WyCTF.js} +2 -2
- package/webapp/dist/assets/{linear-Ga_f4H_w.js.map → linear-Dl3WyCTF.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js → mindmap-definition-YRQLILUH-CY7MDfxd.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js.map → mindmap-definition-YRQLILUH-CY7MDfxd.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js → pieDiagram-SKSYHLDU-BcpxKyhx.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js.map → pieDiagram-SKSYHLDU-BcpxKyhx.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js → quadrantDiagram-337W2JSQ-BgNfCvPO.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js.map → quadrantDiagram-337W2JSQ-BgNfCvPO.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js → requirementDiagram-Z7DCOOCP-CvBkuXMk.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js.map → requirementDiagram-Z7DCOOCP-CvBkuXMk.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js → sequenceDiagram-2WXFIKYE-DAWnxFqU.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map → sequenceDiagram-2WXFIKYE-DAWnxFqU.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js → stateDiagram-RAJIS63D-rtvr6jfW.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js.map → stateDiagram-RAJIS63D-rtvr6jfW.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js → timeline-definition-YZTLITO2-BZ-h_t5V.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js.map → timeline-definition-YZTLITO2-BZ-h_t5V.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js → treemap-KZPCXAKY-BZyhJ20s.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js.map → treemap-KZPCXAKY-BZyhJ20s.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js → vennDiagram-LZ73GAT5-x92Elcin.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js.map → vennDiagram-LZ73GAT5-x92Elcin.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js → xychartDiagram-JWTSCODW-gYBO5I1F.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js.map → xychartDiagram-JWTSCODW-gYBO5I1F.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
|
@@ -17,19 +17,21 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import type { DialogDisplayState, DialogInterruptionReason } from '@longrun-ai/kernel/types/display-state';
|
|
19
19
|
import type { DialogExecutionMarker, DialogLatestFile } from '@longrun-ai/kernel/types/storage';
|
|
20
|
-
import type { WebSocketMessage } from '@longrun-ai/kernel/types/wire';
|
|
20
|
+
import type { RunControlCountsMessage, WebSocketMessage } from '@longrun-ai/kernel/types/wire';
|
|
21
21
|
import { DialogID, type Dialog } from './dialog';
|
|
22
22
|
type StopRequestedReason = 'user_stop' | 'emergency_stop';
|
|
23
23
|
export type RunControlCountsSnapshot = {
|
|
24
24
|
proceeding: number;
|
|
25
25
|
resumable: number;
|
|
26
26
|
};
|
|
27
|
-
export declare function
|
|
27
|
+
export declare function getRunControlCountsSnapshotEpoch(): string;
|
|
28
|
+
export declare function setDisplayStateBroadcaster(fn: ((msg: WebSocketMessage) => void) | null): void;
|
|
28
29
|
export declare function isStoppedReasonResumable(reason: DialogInterruptionReason): boolean;
|
|
29
30
|
export declare function isDisplayStateResumable(state: DialogDisplayState | undefined): boolean;
|
|
30
31
|
export declare function isExecutionMarkerResumable(executionMarker: DialogExecutionMarker | undefined): boolean;
|
|
31
32
|
export declare function isDialogLatestResumable(latest: DialogLatestFile | null | undefined): boolean;
|
|
32
33
|
export declare function getRunControlCountsSnapshot(): Promise<RunControlCountsSnapshot>;
|
|
34
|
+
export declare function createRunControlCountsMessage(): Promise<RunControlCountsMessage>;
|
|
33
35
|
export declare function broadcastRunControlCountsSnapshot(): Promise<void>;
|
|
34
36
|
export declare function hasActiveRun(dialogId: DialogID): boolean;
|
|
35
37
|
export declare function getActiveRunSignal(dialogId: DialogID): AbortSignal | undefined;
|
|
@@ -17,12 +17,14 @@
|
|
|
17
17
|
* so multi-tab views converge without polling.
|
|
18
18
|
*/
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.getRunControlCountsSnapshotEpoch = getRunControlCountsSnapshotEpoch;
|
|
20
21
|
exports.setDisplayStateBroadcaster = setDisplayStateBroadcaster;
|
|
21
22
|
exports.isStoppedReasonResumable = isStoppedReasonResumable;
|
|
22
23
|
exports.isDisplayStateResumable = isDisplayStateResumable;
|
|
23
24
|
exports.isExecutionMarkerResumable = isExecutionMarkerResumable;
|
|
24
25
|
exports.isDialogLatestResumable = isDialogLatestResumable;
|
|
25
26
|
exports.getRunControlCountsSnapshot = getRunControlCountsSnapshot;
|
|
27
|
+
exports.createRunControlCountsMessage = createRunControlCountsMessage;
|
|
26
28
|
exports.broadcastRunControlCountsSnapshot = broadcastRunControlCountsSnapshot;
|
|
27
29
|
exports.hasActiveRun = hasActiveRun;
|
|
28
30
|
exports.getActiveRunSignal = getActiveRunSignal;
|
|
@@ -44,6 +46,7 @@ exports.reconcileDisplayStatesAfterRestart = reconcileDisplayStatesAfterRestart;
|
|
|
44
46
|
exports.requestInterruptDialog = requestInterruptDialog;
|
|
45
47
|
exports.requestEmergencyStopAll = requestEmergencyStopAll;
|
|
46
48
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
49
|
+
const crypto_1 = require("crypto");
|
|
47
50
|
const dialog_1 = require("./dialog");
|
|
48
51
|
const dialog_generation_run_1 = require("./dialog-generation-run");
|
|
49
52
|
const dialog_global_registry_1 = require("./dialog-global-registry");
|
|
@@ -58,8 +61,14 @@ const log = (0, log_1.createLogger)('dialog-display-state');
|
|
|
58
61
|
let broadcastToClients;
|
|
59
62
|
const activeRunsByDialogKey = new Map();
|
|
60
63
|
const quarantiningMainDialogIds = new Set();
|
|
64
|
+
const runControlCountsSnapshotEpoch = (0, crypto_1.randomUUID)();
|
|
65
|
+
let runControlCountsSnapshotSeq = 0;
|
|
66
|
+
let runControlCountsSnapshotQueue = Promise.resolve();
|
|
67
|
+
function getRunControlCountsSnapshotEpoch() {
|
|
68
|
+
return runControlCountsSnapshotEpoch;
|
|
69
|
+
}
|
|
61
70
|
function setDisplayStateBroadcaster(fn) {
|
|
62
|
-
broadcastToClients = fn;
|
|
71
|
+
broadcastToClients = fn ?? undefined;
|
|
63
72
|
}
|
|
64
73
|
function syncRunControlCountsAfterActiveRunChange(trigger, dialogId) {
|
|
65
74
|
void (async () => {
|
|
@@ -259,16 +268,27 @@ async function getRunControlCountsSnapshot() {
|
|
|
259
268
|
}
|
|
260
269
|
return { proceeding, resumable };
|
|
261
270
|
}
|
|
262
|
-
async function
|
|
263
|
-
if (!broadcastToClients)
|
|
264
|
-
return;
|
|
271
|
+
async function createRunControlCountsMessageUnqueued() {
|
|
265
272
|
const counts = await getRunControlCountsSnapshot();
|
|
266
|
-
|
|
273
|
+
const snapshotSeq = ++runControlCountsSnapshotSeq;
|
|
274
|
+
return {
|
|
267
275
|
type: 'run_control_counts_evt',
|
|
268
276
|
proceeding: counts.proceeding,
|
|
269
277
|
resumable: counts.resumable,
|
|
278
|
+
snapshotEpoch: runControlCountsSnapshotEpoch,
|
|
279
|
+
snapshotSeq,
|
|
270
280
|
timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
271
|
-
}
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function createRunControlCountsMessage() {
|
|
284
|
+
const nextSnapshot = runControlCountsSnapshotQueue.then(() => createRunControlCountsMessageUnqueued());
|
|
285
|
+
runControlCountsSnapshotQueue = nextSnapshot.then(() => undefined, () => undefined);
|
|
286
|
+
return nextSnapshot;
|
|
287
|
+
}
|
|
288
|
+
async function broadcastRunControlCountsSnapshot() {
|
|
289
|
+
if (!broadcastToClients)
|
|
290
|
+
return;
|
|
291
|
+
broadcastToClients(await createRunControlCountsMessage());
|
|
272
292
|
}
|
|
273
293
|
function hasActiveRun(dialogId) {
|
|
274
294
|
return activeRunsByDialogKey.has(dialogId.key());
|
|
@@ -1676,6 +1676,9 @@ async function executeDriveRound(args) {
|
|
|
1676
1676
|
replyContinuationScope.target() ??
|
|
1677
1677
|
calleeDialogReplyTarget;
|
|
1678
1678
|
activeTellaskReplyDirective = activeTellaskReplyDirective ?? replyContinuationScope.directive();
|
|
1679
|
+
if (driveResult.lastFunctionCallGenseq !== null) {
|
|
1680
|
+
activePromptWasReplyToolReminder = false;
|
|
1681
|
+
}
|
|
1679
1682
|
interruptedBySignal = (0, dialog_display_state_1.getActiveRunSignal)(dialog.id)?.aborted === true;
|
|
1680
1683
|
if (!interruptedBySignal) {
|
|
1681
1684
|
const queuedFollowUp = dialog.peekQueuedPrompt();
|
|
@@ -47,5 +47,6 @@ export declare function supplySideDialogResponseToAssignedAskerIfPendingV2(args:
|
|
|
47
47
|
callId: string;
|
|
48
48
|
replyCallName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
|
|
49
49
|
};
|
|
50
|
+
allowExplicitReplyWithoutAssignmentAnchor?: boolean;
|
|
50
51
|
scheduleDrive: ScheduleDriveFn;
|
|
51
52
|
}): Promise<boolean>;
|
|
@@ -381,15 +381,7 @@ async function supplyResponseToAskerDialog(args) {
|
|
|
381
381
|
}), callerDialog.status);
|
|
382
382
|
if (maybeSideDialog) {
|
|
383
383
|
const displayState = await (0, dialog_display_state_1.computeIdleDisplayState)(maybeSideDialog);
|
|
384
|
-
await
|
|
385
|
-
kind: 'patch',
|
|
386
|
-
patch: {
|
|
387
|
-
displayState,
|
|
388
|
-
executionMarker: displayState.kind === 'stopped'
|
|
389
|
-
? { kind: 'interrupted', reason: displayState.reason }
|
|
390
|
-
: undefined,
|
|
391
|
-
},
|
|
392
|
-
}), callerDialog.status);
|
|
384
|
+
await (0, dialog_display_state_1.setDialogDisplayState)(sideDialogId, displayState, callerDialog.status);
|
|
393
385
|
}
|
|
394
386
|
}
|
|
395
387
|
await syncPendingTellaskReminderBestEffort(callerDialog, 'kernel-driver:supplyResponseToAskerDialog');
|
|
@@ -655,18 +647,36 @@ async function supplySideDialogResponseToAssignedAskerIfPendingV2(args) {
|
|
|
655
647
|
status: sideDialog.status,
|
|
656
648
|
});
|
|
657
649
|
if (!assignmentAnchorRef) {
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
650
|
+
const replyResolution = args.replyResolution;
|
|
651
|
+
if (args.allowExplicitReplyWithoutAssignmentAnchor === true &&
|
|
652
|
+
args.deliveryMode === 'reply_tool' &&
|
|
653
|
+
replyResolution !== undefined) {
|
|
654
|
+
log_1.log.warn('Delivering assigned Type B reply without local assignment anchor', undefined, {
|
|
655
|
+
rootId: sideDialog.mainDialog.id.rootId,
|
|
656
|
+
sideDialogId: sideDialog.id.selfId,
|
|
657
|
+
askerDialogId: askerDialog.id.selfId,
|
|
658
|
+
callId: activeCalleeDispatch.callId,
|
|
659
|
+
replyCallId: replyResolution.callId,
|
|
660
|
+
replyCallName: replyResolution.replyCallName,
|
|
661
|
+
responseCourse: sideDialog.currentCourse,
|
|
662
|
+
responseGenseq,
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
else {
|
|
666
|
+
log_1.log.debug('Skip assigned Type B response supply before updated assignment is rendered locally', undefined, {
|
|
667
|
+
rootId: sideDialog.mainDialog.id.rootId,
|
|
668
|
+
sideDialogId: sideDialog.id.selfId,
|
|
669
|
+
askerDialogId: askerDialog.id.selfId,
|
|
670
|
+
callId: activeCalleeDispatch.callId,
|
|
671
|
+
responseGenseq,
|
|
672
|
+
});
|
|
673
|
+
return false;
|
|
674
|
+
}
|
|
666
675
|
}
|
|
667
|
-
if (
|
|
668
|
-
(sideDialog.currentCourse
|
|
669
|
-
|
|
676
|
+
if (assignmentAnchorRef !== undefined &&
|
|
677
|
+
(sideDialog.currentCourse < assignmentAnchorRef.course ||
|
|
678
|
+
(sideDialog.currentCourse === assignmentAnchorRef.course &&
|
|
679
|
+
responseGenseq < assignmentAnchorRef.genseq))) {
|
|
670
680
|
log_1.log.debug('Skip assigned stale Type B response supply from before latest local assignment', undefined, {
|
|
671
681
|
rootId: sideDialog.mainDialog.id.rootId,
|
|
672
682
|
sideDialogId: sideDialog.id.selfId,
|
|
@@ -1957,13 +1957,16 @@ async function executeReplyTellaskCall(args) {
|
|
|
1957
1957
|
sideDialog: args.dlg,
|
|
1958
1958
|
responseText: args.call.replyContent,
|
|
1959
1959
|
responseGenseq: genseq,
|
|
1960
|
+
deliveryMode: 'reply_tool',
|
|
1960
1961
|
replyResolution: {
|
|
1961
1962
|
callId: args.call.callId,
|
|
1962
1963
|
replyCallName: args.call.callName,
|
|
1963
1964
|
},
|
|
1965
|
+
allowExplicitReplyWithoutAssignmentAnchor: true,
|
|
1964
1966
|
scheduleDrive: args.callbacks.scheduleDrive,
|
|
1965
1967
|
});
|
|
1966
1968
|
if (!supplied) {
|
|
1969
|
+
await persistence_1.DialogPersistence.clearPendingReplyDeliveryForCall(args.dlg.id, args.call.callId, args.dlg.status);
|
|
1967
1970
|
return {
|
|
1968
1971
|
delivered: false,
|
|
1969
1972
|
messages: [
|
package/dist/persistence.d.ts
CHANGED
|
@@ -660,6 +660,7 @@ export declare class DialogPersistence {
|
|
|
660
660
|
static loadActiveTellaskReplyObligation(dialogId: DialogID, status?: DialogStatusKind): Promise<TellaskReplyDirective | undefined>;
|
|
661
661
|
static markReplyDeliveryDelivered(dialogId: DialogID, replyCallId: string, deliveredAt: string, status?: DialogStatusKind): Promise<void>;
|
|
662
662
|
static markReplyDeliveryToolResultRecorded(dialogId: DialogID, replyCallId: string, status?: DialogStatusKind): Promise<void>;
|
|
663
|
+
static clearPendingReplyDeliveryForCall(dialogId: DialogID, replyCallId: string, status?: DialogStatusKind): Promise<void>;
|
|
663
664
|
static lookupRecordedTellaskCall(dialogId: DialogID, callId: string, status?: DialogStatusKind): Promise<DialogTellaskCallState['calls'][number] | undefined>;
|
|
664
665
|
static recordTellaskCall(dialogId: DialogID, record: TellaskCallRecord, course: number, status?: DialogStatusKind): Promise<void>;
|
|
665
666
|
static hasRecordedTellaskResult(dialogId: DialogID, callId: string, status?: DialogStatusKind): Promise<boolean>;
|
package/dist/persistence.js
CHANGED
|
@@ -8431,6 +8431,24 @@ class DialogPersistence {
|
|
|
8431
8431
|
};
|
|
8432
8432
|
}, status);
|
|
8433
8433
|
}
|
|
8434
|
+
static async clearPendingReplyDeliveryForCall(dialogId, replyCallId, status = 'running') {
|
|
8435
|
+
await this.mutateDialogLatest(dialogId, (previous) => {
|
|
8436
|
+
const replyDelivery = previous.replyDelivery;
|
|
8437
|
+
if (!replyDelivery ||
|
|
8438
|
+
replyDelivery.replyCallId !== replyCallId ||
|
|
8439
|
+
replyDelivery.status !== 'pending') {
|
|
8440
|
+
return { kind: 'noop' };
|
|
8441
|
+
}
|
|
8442
|
+
return {
|
|
8443
|
+
kind: 'patch',
|
|
8444
|
+
patch: {
|
|
8445
|
+
replyDelivery: undefined,
|
|
8446
|
+
nextStep: removeNextStepTrigger(previous.nextStep, (trigger) => trigger.kind === 'reply_delivery_recovery' &&
|
|
8447
|
+
trigger.replyDeliveryId === replyDelivery.replyDeliveryId),
|
|
8448
|
+
},
|
|
8449
|
+
};
|
|
8450
|
+
}, status);
|
|
8451
|
+
}
|
|
8434
8452
|
static async lookupRecordedTellaskCall(dialogId, callId, status = 'running') {
|
|
8435
8453
|
const normalizedCallId = callId.trim();
|
|
8436
8454
|
if (normalizedCallId === '') {
|
|
@@ -66,6 +66,7 @@ const id_1 = require("../utils/id");
|
|
|
66
66
|
const taskdoc_search_1 = require("../utils/taskdoc-search");
|
|
67
67
|
const taskdoc_search_worker_client_1 = require("../utils/taskdoc-search-worker-client");
|
|
68
68
|
const create_dialog_contract_1 = require("./create-dialog-contract");
|
|
69
|
+
const dialog_forensics_routes_1 = require("./dialog-forensics-routes");
|
|
69
70
|
const dominds_runtime_status_1 = require("./dominds-runtime-status");
|
|
70
71
|
const dominds_self_update_1 = require("./dominds-self-update");
|
|
71
72
|
const mime_types_1 = require("./mime-types");
|
|
@@ -1063,6 +1064,12 @@ async function handleApiRoute(req, res, pathname, context) {
|
|
|
1063
1064
|
if (pathname === '/api/info' && req.method === 'GET') {
|
|
1064
1065
|
return await handleGetRuntimeInfo(res, context);
|
|
1065
1066
|
}
|
|
1067
|
+
if (pathname === '/api/dialog-forensics.zip' && req.method === 'GET') {
|
|
1068
|
+
return await (0, dialog_forensics_routes_1.handleDialogForensicsZipRoute)(req.url, res);
|
|
1069
|
+
}
|
|
1070
|
+
if (pathname === '/api/rtws/raw' && req.method === 'GET') {
|
|
1071
|
+
return await handleGetRtwsRaw(req, res);
|
|
1072
|
+
}
|
|
1066
1073
|
if (pathname === '/api/dominds/self-update' && req.method === 'POST') {
|
|
1067
1074
|
const body = await readRequestBody(req);
|
|
1068
1075
|
let parsed;
|
|
@@ -1407,6 +1414,64 @@ async function handleApiRoute(req, res, pathname, context) {
|
|
|
1407
1414
|
return true;
|
|
1408
1415
|
}
|
|
1409
1416
|
}
|
|
1417
|
+
function encodeContentDispositionFilenameStar(name) {
|
|
1418
|
+
return encodeURIComponent(name).replace(/['()*]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
1419
|
+
}
|
|
1420
|
+
function contentDispositionInlineFilename(name) {
|
|
1421
|
+
const fallback = name.replace(/[^\x20-\x7e]|[\r\n\\"]/g, '_');
|
|
1422
|
+
return `inline; filename="${fallback}"; filename*=UTF-8''${encodeContentDispositionFilenameStar(name)}`;
|
|
1423
|
+
}
|
|
1424
|
+
async function handleGetRtwsRaw(req, res) {
|
|
1425
|
+
const urlObj = new URL(req.url ?? '', 'http://127.0.0.1');
|
|
1426
|
+
const rawPath = urlObj.searchParams.get('path');
|
|
1427
|
+
if (rawPath === null || rawPath.trim() === '') {
|
|
1428
|
+
respondJson(res, 400, { success: false, error: '`path` is required' });
|
|
1429
|
+
return true;
|
|
1430
|
+
}
|
|
1431
|
+
const pathRel = normalizeRtwsRelativePath(rawPath, { allowRoot: false });
|
|
1432
|
+
if (pathRel === null) {
|
|
1433
|
+
respondJson(res, 400, { success: false, error: 'Invalid rtws path' });
|
|
1434
|
+
return true;
|
|
1435
|
+
}
|
|
1436
|
+
try {
|
|
1437
|
+
const resolved = await resolveWorkspacePreviewPath(pathRel);
|
|
1438
|
+
const stat = await promises_1.default.stat(resolved.candidateAbsPath);
|
|
1439
|
+
if (!stat.isFile()) {
|
|
1440
|
+
respondJson(res, 400, {
|
|
1441
|
+
success: false,
|
|
1442
|
+
error: 'Path must resolve to a file',
|
|
1443
|
+
path: pathRel,
|
|
1444
|
+
});
|
|
1445
|
+
return true;
|
|
1446
|
+
}
|
|
1447
|
+
const headBytes = await readFileHead(resolved.candidateAbsPath, 512);
|
|
1448
|
+
const mimeType = (0, mime_types_1.sniffMimeType)(pathRel, headBytes);
|
|
1449
|
+
const data = await promises_1.default.readFile(resolved.candidateAbsPath);
|
|
1450
|
+
res.writeHead(200, {
|
|
1451
|
+
'Content-Type': mimeType,
|
|
1452
|
+
'Content-Length': data.byteLength,
|
|
1453
|
+
'Content-Disposition': contentDispositionInlineFilename(path.basename(pathRel)),
|
|
1454
|
+
'Cache-Control': 'no-store',
|
|
1455
|
+
'X-Content-Type-Options': 'nosniff',
|
|
1456
|
+
});
|
|
1457
|
+
res.end(data);
|
|
1458
|
+
return true;
|
|
1459
|
+
}
|
|
1460
|
+
catch (error) {
|
|
1461
|
+
const code = getErrorCode(error);
|
|
1462
|
+
if (code === 'ENOENT') {
|
|
1463
|
+
respondJson(res, 404, { success: false, error: 'Path not found', path: pathRel });
|
|
1464
|
+
return true;
|
|
1465
|
+
}
|
|
1466
|
+
if (code === 'OUTSIDE_RTWS') {
|
|
1467
|
+
respondJson(res, 403, { success: false, error: 'Path resolves outside rtws', path: pathRel });
|
|
1468
|
+
return true;
|
|
1469
|
+
}
|
|
1470
|
+
log.error('Failed to read rtws raw file', error, { path: pathRel });
|
|
1471
|
+
respondJson(res, 500, { success: false, error: 'Failed to read rtws raw file', path: pathRel });
|
|
1472
|
+
return true;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1410
1475
|
function resolveRtwsDiligencePath(lang) {
|
|
1411
1476
|
const parsed = typeof lang === 'string' ? (0, language_1.normalizeLanguageCode)(lang) : null;
|
|
1412
1477
|
if (parsed === 'zh')
|
|
@@ -2217,12 +2282,15 @@ async function handleGetDialogs(res, status) {
|
|
|
2217
2282
|
}
|
|
2218
2283
|
async function handleGetRunControlCounts(res) {
|
|
2219
2284
|
try {
|
|
2220
|
-
const counts = await (0, dialog_display_state_1.
|
|
2285
|
+
const counts = await (0, dialog_display_state_1.createRunControlCountsMessage)();
|
|
2221
2286
|
respondJson(res, 200, {
|
|
2222
2287
|
success: true,
|
|
2223
2288
|
counts: {
|
|
2224
2289
|
proceeding: counts.proceeding,
|
|
2225
2290
|
resumable: counts.resumable,
|
|
2291
|
+
snapshotEpoch: counts.snapshotEpoch,
|
|
2292
|
+
snapshotSeq: counts.snapshotSeq,
|
|
2293
|
+
timestamp: counts.timestamp,
|
|
2226
2294
|
},
|
|
2227
2295
|
});
|
|
2228
2296
|
return true;
|
|
@@ -2706,13 +2774,7 @@ function broadcastDialogDeletes(clients, message) {
|
|
|
2706
2774
|
async function broadcastRunControlCounts(clients) {
|
|
2707
2775
|
if (!clients)
|
|
2708
2776
|
return;
|
|
2709
|
-
const
|
|
2710
|
-
const data = JSON.stringify({
|
|
2711
|
-
type: 'run_control_counts_evt',
|
|
2712
|
-
proceeding: counts.proceeding,
|
|
2713
|
-
resumable: counts.resumable,
|
|
2714
|
-
timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
2715
|
-
});
|
|
2777
|
+
const data = JSON.stringify(await (0, dialog_display_state_1.createRunControlCountsMessage)());
|
|
2716
2778
|
for (const ws of clients) {
|
|
2717
2779
|
if (ws.readyState === 1) {
|
|
2718
2780
|
ws.send(data);
|