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.
Files changed (117) hide show
  1. package/dist/dialog-display-state.d.ts +4 -2
  2. package/dist/dialog-display-state.js +26 -6
  3. package/dist/llm/kernel-driver/flow.js +3 -0
  4. package/dist/llm/kernel-driver/sideDialog.d.ts +1 -0
  5. package/dist/llm/kernel-driver/sideDialog.js +30 -20
  6. package/dist/llm/kernel-driver/tellask-special.js +3 -0
  7. package/dist/persistence.d.ts +1 -0
  8. package/dist/persistence.js +18 -0
  9. package/dist/server/api-routes.js +70 -8
  10. package/dist/server/dialog-forensics-routes.d.ts +2 -0
  11. package/dist/server/dialog-forensics-routes.js +549 -0
  12. package/dist/server/dominds-self-update.js +54 -31
  13. package/dist/server/websocket-handler.js +5 -15
  14. package/dist/tools/cmd-runner-protocol.d.ts +1 -0
  15. package/dist/tools/cmd-runner-protocol.js +8 -1
  16. package/dist/tools/cmd-runner.js +33 -6
  17. package/dist/tools/os.js +13 -8
  18. package/dist/tools/process-kill.d.ts +4 -0
  19. package/dist/tools/process-kill.js +48 -0
  20. package/dist/tools/prompts/os/en/tools.md +2 -2
  21. package/dist/tools/prompts/os/zh/tools.md +2 -2
  22. package/package.json +3 -3
  23. package/webapp/dist/assets/{_basePickBy-B1-brAPU.js → _basePickBy-xJw0ZLXb.js} +3 -3
  24. package/webapp/dist/assets/{_basePickBy-B1-brAPU.js.map → _basePickBy-xJw0ZLXb.js.map} +1 -1
  25. package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js → _baseUniq-BwH1mnxt.js} +2 -2
  26. package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js.map → _baseUniq-BwH1mnxt.js.map} +1 -1
  27. package/webapp/dist/assets/{arc-CvsBvjnB.js → arc-CXDyEAks.js} +2 -2
  28. package/webapp/dist/assets/{arc-CvsBvjnB.js.map → arc-CXDyEAks.js.map} +1 -1
  29. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js → architectureDiagram-2XIMDMQ5-CQfjSekJ.js} +7 -7
  30. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map → architectureDiagram-2XIMDMQ5-CQfjSekJ.js.map} +1 -1
  31. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js → blockDiagram-WCTKOSBZ-DFTd-DGC.js} +7 -7
  32. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js.map → blockDiagram-WCTKOSBZ-DFTd-DGC.js.map} +1 -1
  33. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js → c4Diagram-IC4MRINW-DS_zRetl.js} +3 -3
  34. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js.map → c4Diagram-IC4MRINW-DS_zRetl.js.map} +1 -1
  35. package/webapp/dist/assets/{channel-D1VPurpu.js → channel-BbTmwKgX.js} +2 -2
  36. package/webapp/dist/assets/{channel-D1VPurpu.js.map → channel-BbTmwKgX.js.map} +1 -1
  37. package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js → chunk-4BX2VUAB-CwosIBGF.js} +2 -2
  38. package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js.map → chunk-4BX2VUAB-CwosIBGF.js.map} +1 -1
  39. package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js → chunk-55IACEB6-Cwh90dP4.js} +2 -2
  40. package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js.map → chunk-55IACEB6-Cwh90dP4.js.map} +1 -1
  41. package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js → chunk-FMBD7UC4-BNnil15z.js} +2 -2
  42. package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js.map → chunk-FMBD7UC4-BNnil15z.js.map} +1 -1
  43. package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js → chunk-JSJVCQXG-DimIImfv.js} +2 -2
  44. package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js.map → chunk-JSJVCQXG-DimIImfv.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js → chunk-KX2RTZJC-iWTw8TpU.js} +2 -2
  46. package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js.map → chunk-KX2RTZJC-iWTw8TpU.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js → chunk-NQ4KR5QH-vej7OjjD.js} +4 -4
  48. package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js.map → chunk-NQ4KR5QH-vej7OjjD.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js → chunk-QZHKN3VN-UTOcRcah.js} +2 -2
  50. package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js.map → chunk-QZHKN3VN-UTOcRcah.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js → chunk-WL4C6EOR-BPG9Okux.js} +6 -6
  52. package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js.map → chunk-WL4C6EOR-BPG9Okux.js.map} +1 -1
  53. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js → classDiagram-VBA2DB6C-BY0IlgU0.js} +7 -7
  54. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js.map → classDiagram-VBA2DB6C-BY0IlgU0.js.map} +1 -1
  55. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js → classDiagram-v2-RAHNMMFH-BY0IlgU0.js} +7 -7
  56. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map → classDiagram-v2-RAHNMMFH-BY0IlgU0.js.map} +1 -1
  57. package/webapp/dist/assets/{clone-ePiNaiNY.js → clone-HAPhhkfG.js} +2 -2
  58. package/webapp/dist/assets/{clone-ePiNaiNY.js.map → clone-HAPhhkfG.js.map} +1 -1
  59. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js → cose-bilkent-S5V4N54A-BQlr3U5G.js} +2 -2
  60. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js.map → cose-bilkent-S5V4N54A-BQlr3U5G.js.map} +1 -1
  61. package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js → dagre-KLK3FWXG-DphPFDYz.js} +7 -7
  62. package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js.map → dagre-KLK3FWXG-DphPFDYz.js.map} +1 -1
  63. package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js → diagram-E7M64L7V-Bv4UxxXd.js} +8 -8
  64. package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js.map → diagram-E7M64L7V-Bv4UxxXd.js.map} +1 -1
  65. package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js → diagram-IFDJBPK2-y1CGHto0.js} +7 -7
  66. package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js.map → diagram-IFDJBPK2-y1CGHto0.js.map} +1 -1
  67. package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js → diagram-P4PSJMXO-IXiebzDc.js} +7 -7
  68. package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js.map → diagram-P4PSJMXO-IXiebzDc.js.map} +1 -1
  69. package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js → erDiagram-INFDFZHY-DgVQi2c7.js} +5 -5
  70. package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js.map → erDiagram-INFDFZHY-DgVQi2c7.js.map} +1 -1
  71. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js → flowDiagram-PKNHOUZH-Ccs_iaLm.js} +7 -7
  72. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js.map → flowDiagram-PKNHOUZH-Ccs_iaLm.js.map} +1 -1
  73. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js → ganttDiagram-A5KZAMGK-BOlky6CI.js} +3 -3
  74. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js.map → ganttDiagram-A5KZAMGK-BOlky6CI.js.map} +1 -1
  75. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js} +8 -8
  76. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js.map} +1 -1
  77. package/webapp/dist/assets/{graph-CAlg3tEk.js → graph-CbpUBil5.js} +3 -3
  78. package/webapp/dist/assets/{graph-CAlg3tEk.js.map → graph-CbpUBil5.js.map} +1 -1
  79. package/webapp/dist/assets/{index-DLTS_eOh.js → index-BiFvaOdQ.js} +139 -51
  80. package/webapp/dist/assets/{index-DLTS_eOh.js.map → index-BiFvaOdQ.js.map} +1 -1
  81. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js → infoDiagram-LFFYTUFH-hytR8L_9.js} +6 -6
  82. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js.map → infoDiagram-LFFYTUFH-hytR8L_9.js.map} +1 -1
  83. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js → ishikawaDiagram-PHBUUO56-C-58-pR6.js} +2 -2
  84. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map → ishikawaDiagram-PHBUUO56-C-58-pR6.js.map} +1 -1
  85. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js → journeyDiagram-4ABVD52K-DlW9wE_9.js} +5 -5
  86. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js.map → journeyDiagram-4ABVD52K-DlW9wE_9.js.map} +1 -1
  87. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js → kanban-definition-K7BYSVSG-DMwi6h6F.js} +3 -3
  88. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js.map → kanban-definition-K7BYSVSG-DMwi6h6F.js.map} +1 -1
  89. package/webapp/dist/assets/{layout-uOLcVthp.js → layout-m0UN-laA.js} +5 -5
  90. package/webapp/dist/assets/{layout-uOLcVthp.js.map → layout-m0UN-laA.js.map} +1 -1
  91. package/webapp/dist/assets/{linear-Ga_f4H_w.js → linear-Dl3WyCTF.js} +2 -2
  92. package/webapp/dist/assets/{linear-Ga_f4H_w.js.map → linear-Dl3WyCTF.js.map} +1 -1
  93. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js → mindmap-definition-YRQLILUH-CY7MDfxd.js} +4 -4
  94. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js.map → mindmap-definition-YRQLILUH-CY7MDfxd.js.map} +1 -1
  95. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js → pieDiagram-SKSYHLDU-BcpxKyhx.js} +8 -8
  96. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js.map → pieDiagram-SKSYHLDU-BcpxKyhx.js.map} +1 -1
  97. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js → quadrantDiagram-337W2JSQ-BgNfCvPO.js} +3 -3
  98. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js.map → quadrantDiagram-337W2JSQ-BgNfCvPO.js.map} +1 -1
  99. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js → requirementDiagram-Z7DCOOCP-CvBkuXMk.js} +4 -4
  100. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js.map → requirementDiagram-Z7DCOOCP-CvBkuXMk.js.map} +1 -1
  101. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js} +2 -2
  102. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js.map} +1 -1
  103. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js → sequenceDiagram-2WXFIKYE-DAWnxFqU.js} +4 -4
  104. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map → sequenceDiagram-2WXFIKYE-DAWnxFqU.js.map} +1 -1
  105. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js → stateDiagram-RAJIS63D-rtvr6jfW.js} +9 -9
  106. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js.map → stateDiagram-RAJIS63D-rtvr6jfW.js.map} +1 -1
  107. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js} +5 -5
  108. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js.map} +1 -1
  109. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js → timeline-definition-YZTLITO2-BZ-h_t5V.js} +3 -3
  110. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js.map → timeline-definition-YZTLITO2-BZ-h_t5V.js.map} +1 -1
  111. package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js → treemap-KZPCXAKY-BZyhJ20s.js} +5 -5
  112. package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js.map → treemap-KZPCXAKY-BZyhJ20s.js.map} +1 -1
  113. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js → vennDiagram-LZ73GAT5-x92Elcin.js} +2 -2
  114. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js.map → vennDiagram-LZ73GAT5-x92Elcin.js.map} +1 -1
  115. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js → xychartDiagram-JWTSCODW-gYBO5I1F.js} +3 -3
  116. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js.map → xychartDiagram-JWTSCODW-gYBO5I1F.js.map} +1 -1
  117. 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 setDisplayStateBroadcaster(fn: (msg: WebSocketMessage) => void): void;
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 broadcastRunControlCountsSnapshot() {
263
- if (!broadcastToClients)
264
- return;
271
+ async function createRunControlCountsMessageUnqueued() {
265
272
  const counts = await getRunControlCountsSnapshot();
266
- broadcastToClients({
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 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);
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
- log_1.log.debug('Skip assigned Type B response supply before updated assignment is rendered locally', undefined, {
659
- rootId: sideDialog.mainDialog.id.rootId,
660
- sideDialogId: sideDialog.id.selfId,
661
- askerDialogId: askerDialog.id.selfId,
662
- callId: activeCalleeDispatch.callId,
663
- responseGenseq,
664
- });
665
- return false;
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 (sideDialog.currentCourse < assignmentAnchorRef.course ||
668
- (sideDialog.currentCourse === assignmentAnchorRef.course &&
669
- responseGenseq < assignmentAnchorRef.genseq)) {
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: [
@@ -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>;
@@ -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.getRunControlCountsSnapshot)();
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 counts = await (0, dialog_display_state_1.getRunControlCountsSnapshot)();
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);
@@ -0,0 +1,2 @@
1
+ import type { ServerResponse } from 'http';
2
+ export declare function handleDialogForensicsZipRoute(reqUrl: string | undefined, res: ServerResponse): Promise<boolean>;