dominds 1.25.13 → 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 (110) 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.js +1 -9
  5. package/dist/server/api-routes.js +5 -8
  6. package/dist/server/websocket-handler.js +5 -15
  7. package/dist/tools/cmd-runner-protocol.d.ts +1 -0
  8. package/dist/tools/cmd-runner-protocol.js +8 -1
  9. package/dist/tools/cmd-runner.js +33 -6
  10. package/dist/tools/os.js +13 -8
  11. package/dist/tools/process-kill.d.ts +4 -0
  12. package/dist/tools/process-kill.js +48 -0
  13. package/dist/tools/prompts/os/en/tools.md +2 -2
  14. package/dist/tools/prompts/os/zh/tools.md +2 -2
  15. package/package.json +4 -4
  16. package/webapp/dist/assets/{_basePickBy-B1-brAPU.js → _basePickBy-xJw0ZLXb.js} +3 -3
  17. package/webapp/dist/assets/{_basePickBy-B1-brAPU.js.map → _basePickBy-xJw0ZLXb.js.map} +1 -1
  18. package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js → _baseUniq-BwH1mnxt.js} +2 -2
  19. package/webapp/dist/assets/{_baseUniq-BuB0jmKD.js.map → _baseUniq-BwH1mnxt.js.map} +1 -1
  20. package/webapp/dist/assets/{arc-CvsBvjnB.js → arc-CXDyEAks.js} +2 -2
  21. package/webapp/dist/assets/{arc-CvsBvjnB.js.map → arc-CXDyEAks.js.map} +1 -1
  22. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js → architectureDiagram-2XIMDMQ5-CQfjSekJ.js} +7 -7
  23. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B-xGuLbb.js.map → architectureDiagram-2XIMDMQ5-CQfjSekJ.js.map} +1 -1
  24. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js → blockDiagram-WCTKOSBZ-DFTd-DGC.js} +7 -7
  25. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Bu53fwsa.js.map → blockDiagram-WCTKOSBZ-DFTd-DGC.js.map} +1 -1
  26. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js → c4Diagram-IC4MRINW-DS_zRetl.js} +3 -3
  27. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D9-FJ4LB.js.map → c4Diagram-IC4MRINW-DS_zRetl.js.map} +1 -1
  28. package/webapp/dist/assets/{channel-D1VPurpu.js → channel-BbTmwKgX.js} +2 -2
  29. package/webapp/dist/assets/{channel-D1VPurpu.js.map → channel-BbTmwKgX.js.map} +1 -1
  30. package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js → chunk-4BX2VUAB-CwosIBGF.js} +2 -2
  31. package/webapp/dist/assets/{chunk-4BX2VUAB-DB14wcWS.js.map → chunk-4BX2VUAB-CwosIBGF.js.map} +1 -1
  32. package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js → chunk-55IACEB6-Cwh90dP4.js} +2 -2
  33. package/webapp/dist/assets/{chunk-55IACEB6-C5KCE85A.js.map → chunk-55IACEB6-Cwh90dP4.js.map} +1 -1
  34. package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js → chunk-FMBD7UC4-BNnil15z.js} +2 -2
  35. package/webapp/dist/assets/{chunk-FMBD7UC4-Bb6zm0iH.js.map → chunk-FMBD7UC4-BNnil15z.js.map} +1 -1
  36. package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js → chunk-JSJVCQXG-DimIImfv.js} +2 -2
  37. package/webapp/dist/assets/{chunk-JSJVCQXG-CJPrv6fM.js.map → chunk-JSJVCQXG-DimIImfv.js.map} +1 -1
  38. package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js → chunk-KX2RTZJC-iWTw8TpU.js} +2 -2
  39. package/webapp/dist/assets/{chunk-KX2RTZJC-8J1Swk7E.js.map → chunk-KX2RTZJC-iWTw8TpU.js.map} +1 -1
  40. package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js → chunk-NQ4KR5QH-vej7OjjD.js} +4 -4
  41. package/webapp/dist/assets/{chunk-NQ4KR5QH-DySHY4x9.js.map → chunk-NQ4KR5QH-vej7OjjD.js.map} +1 -1
  42. package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js → chunk-QZHKN3VN-UTOcRcah.js} +2 -2
  43. package/webapp/dist/assets/{chunk-QZHKN3VN-CTO5Z-4P.js.map → chunk-QZHKN3VN-UTOcRcah.js.map} +1 -1
  44. package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js → chunk-WL4C6EOR-BPG9Okux.js} +6 -6
  45. package/webapp/dist/assets/{chunk-WL4C6EOR-Ci_Ec8Ax.js.map → chunk-WL4C6EOR-BPG9Okux.js.map} +1 -1
  46. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js → classDiagram-VBA2DB6C-BY0IlgU0.js} +7 -7
  47. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CxAxBvv7.js.map → classDiagram-VBA2DB6C-BY0IlgU0.js.map} +1 -1
  48. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js → classDiagram-v2-RAHNMMFH-BY0IlgU0.js} +7 -7
  49. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CxAxBvv7.js.map → classDiagram-v2-RAHNMMFH-BY0IlgU0.js.map} +1 -1
  50. package/webapp/dist/assets/{clone-ePiNaiNY.js → clone-HAPhhkfG.js} +2 -2
  51. package/webapp/dist/assets/{clone-ePiNaiNY.js.map → clone-HAPhhkfG.js.map} +1 -1
  52. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js → cose-bilkent-S5V4N54A-BQlr3U5G.js} +2 -2
  53. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-j-Ex-Sef.js.map → cose-bilkent-S5V4N54A-BQlr3U5G.js.map} +1 -1
  54. package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js → dagre-KLK3FWXG-DphPFDYz.js} +7 -7
  55. package/webapp/dist/assets/{dagre-KLK3FWXG-ihZ2wOCM.js.map → dagre-KLK3FWXG-DphPFDYz.js.map} +1 -1
  56. package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js → diagram-E7M64L7V-Bv4UxxXd.js} +8 -8
  57. package/webapp/dist/assets/{diagram-E7M64L7V-Cp4GQGS7.js.map → diagram-E7M64L7V-Bv4UxxXd.js.map} +1 -1
  58. package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js → diagram-IFDJBPK2-y1CGHto0.js} +7 -7
  59. package/webapp/dist/assets/{diagram-IFDJBPK2-B70cgyS5.js.map → diagram-IFDJBPK2-y1CGHto0.js.map} +1 -1
  60. package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js → diagram-P4PSJMXO-IXiebzDc.js} +7 -7
  61. package/webapp/dist/assets/{diagram-P4PSJMXO-DMOv7eKE.js.map → diagram-P4PSJMXO-IXiebzDc.js.map} +1 -1
  62. package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js → erDiagram-INFDFZHY-DgVQi2c7.js} +5 -5
  63. package/webapp/dist/assets/{erDiagram-INFDFZHY-BKpXWjIc.js.map → erDiagram-INFDFZHY-DgVQi2c7.js.map} +1 -1
  64. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js → flowDiagram-PKNHOUZH-Ccs_iaLm.js} +7 -7
  65. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DgrItj0h.js.map → flowDiagram-PKNHOUZH-Ccs_iaLm.js.map} +1 -1
  66. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js → ganttDiagram-A5KZAMGK-BOlky6CI.js} +3 -3
  67. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-7-8hlYsT.js.map → ganttDiagram-A5KZAMGK-BOlky6CI.js.map} +1 -1
  68. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js} +8 -8
  69. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-cPSaCUUk.js.map → gitGraphDiagram-K3NZZRJ6-loEvdSsO.js.map} +1 -1
  70. package/webapp/dist/assets/{graph-CAlg3tEk.js → graph-CbpUBil5.js} +3 -3
  71. package/webapp/dist/assets/{graph-CAlg3tEk.js.map → graph-CbpUBil5.js.map} +1 -1
  72. package/webapp/dist/assets/{index-DLTS_eOh.js → index-BiFvaOdQ.js} +139 -51
  73. package/webapp/dist/assets/{index-DLTS_eOh.js.map → index-BiFvaOdQ.js.map} +1 -1
  74. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js → infoDiagram-LFFYTUFH-hytR8L_9.js} +6 -6
  75. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CHJHvxMC.js.map → infoDiagram-LFFYTUFH-hytR8L_9.js.map} +1 -1
  76. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js → ishikawaDiagram-PHBUUO56-C-58-pR6.js} +2 -2
  77. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-S8N-XZ8E.js.map → ishikawaDiagram-PHBUUO56-C-58-pR6.js.map} +1 -1
  78. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js → journeyDiagram-4ABVD52K-DlW9wE_9.js} +5 -5
  79. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-ChHNpMtH.js.map → journeyDiagram-4ABVD52K-DlW9wE_9.js.map} +1 -1
  80. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js → kanban-definition-K7BYSVSG-DMwi6h6F.js} +3 -3
  81. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cqxd99wZ.js.map → kanban-definition-K7BYSVSG-DMwi6h6F.js.map} +1 -1
  82. package/webapp/dist/assets/{layout-uOLcVthp.js → layout-m0UN-laA.js} +5 -5
  83. package/webapp/dist/assets/{layout-uOLcVthp.js.map → layout-m0UN-laA.js.map} +1 -1
  84. package/webapp/dist/assets/{linear-Ga_f4H_w.js → linear-Dl3WyCTF.js} +2 -2
  85. package/webapp/dist/assets/{linear-Ga_f4H_w.js.map → linear-Dl3WyCTF.js.map} +1 -1
  86. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js → mindmap-definition-YRQLILUH-CY7MDfxd.js} +4 -4
  87. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-TSH7wOlZ.js.map → mindmap-definition-YRQLILUH-CY7MDfxd.js.map} +1 -1
  88. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js → pieDiagram-SKSYHLDU-BcpxKyhx.js} +8 -8
  89. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DPXszqns.js.map → pieDiagram-SKSYHLDU-BcpxKyhx.js.map} +1 -1
  90. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js → quadrantDiagram-337W2JSQ-BgNfCvPO.js} +3 -3
  91. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-BgA_GVhR.js.map → quadrantDiagram-337W2JSQ-BgNfCvPO.js.map} +1 -1
  92. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js → requirementDiagram-Z7DCOOCP-CvBkuXMk.js} +4 -4
  93. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CM-47daj.js.map → requirementDiagram-Z7DCOOCP-CvBkuXMk.js.map} +1 -1
  94. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js} +2 -2
  95. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CxDCwHAj.js.map → sankeyDiagram-WA2Y5GQK-cCG4yz8C.js.map} +1 -1
  96. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js → sequenceDiagram-2WXFIKYE-DAWnxFqU.js} +4 -4
  97. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-1UJP6Fff.js.map → sequenceDiagram-2WXFIKYE-DAWnxFqU.js.map} +1 -1
  98. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js → stateDiagram-RAJIS63D-rtvr6jfW.js} +9 -9
  99. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B2aqr0KQ.js.map → stateDiagram-RAJIS63D-rtvr6jfW.js.map} +1 -1
  100. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js} +5 -5
  101. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DvmkevVb.js.map → stateDiagram-v2-FVOUBMTO-G6IcG_Il.js.map} +1 -1
  102. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js → timeline-definition-YZTLITO2-BZ-h_t5V.js} +3 -3
  103. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CaOrqzT1.js.map → timeline-definition-YZTLITO2-BZ-h_t5V.js.map} +1 -1
  104. package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js → treemap-KZPCXAKY-BZyhJ20s.js} +5 -5
  105. package/webapp/dist/assets/{treemap-KZPCXAKY-CWs_8GJm.js.map → treemap-KZPCXAKY-BZyhJ20s.js.map} +1 -1
  106. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js → vennDiagram-LZ73GAT5-x92Elcin.js} +2 -2
  107. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BuBxFDz6.js.map → vennDiagram-LZ73GAT5-x92Elcin.js.map} +1 -1
  108. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js → xychartDiagram-JWTSCODW-gYBO5I1F.js} +3 -3
  109. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-ChjL-_2b.js.map → xychartDiagram-JWTSCODW-gYBO5I1F.js.map} +1 -1
  110. 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();
@@ -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');
@@ -2282,12 +2282,15 @@ async function handleGetDialogs(res, status) {
2282
2282
  }
2283
2283
  async function handleGetRunControlCounts(res) {
2284
2284
  try {
2285
- const counts = await (0, dialog_display_state_1.getRunControlCountsSnapshot)();
2285
+ const counts = await (0, dialog_display_state_1.createRunControlCountsMessage)();
2286
2286
  respondJson(res, 200, {
2287
2287
  success: true,
2288
2288
  counts: {
2289
2289
  proceeding: counts.proceeding,
2290
2290
  resumable: counts.resumable,
2291
+ snapshotEpoch: counts.snapshotEpoch,
2292
+ snapshotSeq: counts.snapshotSeq,
2293
+ timestamp: counts.timestamp,
2291
2294
  },
2292
2295
  });
2293
2296
  return true;
@@ -2771,13 +2774,7 @@ function broadcastDialogDeletes(clients, message) {
2771
2774
  async function broadcastRunControlCounts(clients) {
2772
2775
  if (!clients)
2773
2776
  return;
2774
- const counts = await (0, dialog_display_state_1.getRunControlCountsSnapshot)();
2775
- const data = JSON.stringify({
2776
- type: 'run_control_counts_evt',
2777
- proceeding: counts.proceeding,
2778
- resumable: counts.resumable,
2779
- timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
2780
- });
2777
+ const data = JSON.stringify(await (0, dialog_display_state_1.createRunControlCountsMessage)());
2781
2778
  for (const ws of clients) {
2782
2779
  if (ws.readyState === 1) {
2783
2780
  ws.send(data);
@@ -1908,14 +1908,9 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage, mod
1908
1908
  if (msg.fromStatus !== 'running') {
1909
1909
  return;
1910
1910
  }
1911
- void (0, dialog_display_state_1.getRunControlCountsSnapshot)()
1912
- .then((counts) => {
1913
- broadcastToClients({
1914
- type: 'run_control_counts_evt',
1915
- proceeding: counts.proceeding,
1916
- resumable: counts.resumable,
1917
- timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
1918
- });
1911
+ void (0, dialog_display_state_1.createRunControlCountsMessage)()
1912
+ .then((message) => {
1913
+ broadcastToClients(message);
1919
1914
  })
1920
1915
  .catch((error) => {
1921
1916
  log.warn('Failed to broadcast run-control counts after dialog quarantine', error, {
@@ -1977,6 +1972,7 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage, mod
1977
1972
  message: 'Connected to dialog server',
1978
1973
  serverWorkLanguage,
1979
1974
  supportedLanguageCodes: [...language_1.supportedLanguageCodes],
1975
+ runControlCountsSnapshotEpoch: (0, dialog_display_state_1.getRunControlCountsSnapshotEpoch)(),
1980
1976
  runtimeStatus,
1981
1977
  timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
1982
1978
  }));
@@ -2005,13 +2001,7 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage, mod
2005
2001
  }
2006
2002
  })();
2007
2003
  try {
2008
- const counts = await (0, dialog_display_state_1.getRunControlCountsSnapshot)();
2009
- ws.send(JSON.stringify({
2010
- type: 'run_control_counts_evt',
2011
- proceeding: counts.proceeding,
2012
- resumable: counts.resumable,
2013
- timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
2014
- }));
2004
+ ws.send(JSON.stringify(await (0, dialog_display_state_1.createRunControlCountsMessage)()));
2015
2005
  }
2016
2006
  catch (error) {
2017
2007
  log.warn('Failed to send initial run-control counts snapshot', error);
@@ -40,6 +40,7 @@ export type CmdRunnerRequest = Readonly<{
40
40
  stderr: boolean;
41
41
  }> | Readonly<{
42
42
  type: 'stop';
43
+ entirePg: boolean;
43
44
  }>;
44
45
  export type CmdRunnerStreamSnapshot = Readonly<{
45
46
  content: string;
@@ -226,9 +226,16 @@ function parseCmdRunnerRequestLine(line) {
226
226
  throw new Error('Invalid cmd_runner request: expected object');
227
227
  }
228
228
  const type = asString(raw['type']);
229
- if (type === 'ping' || type === 'get_status' || type === 'stop') {
229
+ if (type === 'ping' || type === 'get_status') {
230
230
  return { type };
231
231
  }
232
+ if (type === 'stop') {
233
+ const entirePg = asBoolean(raw['entirePg']);
234
+ if (entirePg === null) {
235
+ throw new Error('Invalid cmd_runner stop request: entirePg must be boolean');
236
+ }
237
+ return { type, entirePg };
238
+ }
232
239
  if (type === 'get_output') {
233
240
  const stdout = asBoolean(raw['stdout']);
234
241
  const stderr = asBoolean(raw['stderr']);
@@ -10,6 +10,7 @@ const node_net_1 = __importDefault(require("node:net"));
10
10
  const node_path_1 = __importDefault(require("node:path"));
11
11
  const node_util_1 = require("node:util");
12
12
  const cmd_runner_protocol_1 = require("./cmd-runner-protocol");
13
+ const process_kill_1 = require("./process-kill");
13
14
  const shell_capture_env_1 = require("./shell-capture-env");
14
15
  const execFileAsync = (0, node_util_1.promisify)(child_process_1.execFile);
15
16
  class ScrollingBuffer {
@@ -113,8 +114,8 @@ async function ensureSocketParentDir(endpoint) {
113
114
  }
114
115
  }
115
116
  }
116
- function writeSocketResponse(socket, response) {
117
- socket.end(`${JSON.stringify(response)}\n`);
117
+ function writeSocketResponse(socket, response, callback) {
118
+ socket.end(`${JSON.stringify(response)}\n`, callback);
118
119
  }
119
120
  function isProcessAlive(pid) {
120
121
  try {
@@ -126,6 +127,11 @@ function isProcessAlive(pid) {
126
127
  return code !== 'ESRCH';
127
128
  }
128
129
  }
130
+ function markDaemonMissing(state) {
131
+ state.isRunning = false;
132
+ state.exitCode = null;
133
+ state.exitSignal = 'SIGKILL';
134
+ }
129
135
  async function main() {
130
136
  const initMessage = await new Promise((resolve, reject) => {
131
137
  const timeout = setTimeout(() => {
@@ -335,11 +341,12 @@ async function main() {
335
341
  return;
336
342
  }
337
343
  await handleStopRequest(request, state, childProcess);
344
+ const shouldExitAfterResponse = !state.isRunning;
338
345
  writeSocketResponse(socket, {
339
346
  type: 'stop_result',
340
347
  ok: true,
341
348
  ...buildStatusPayload(state),
342
- });
349
+ }, shouldExitAfterResponse ? () => closeServerAndExit(0) : undefined);
343
350
  }
344
351
  catch (error) {
345
352
  writeSocketResponse(socket, {
@@ -412,8 +419,24 @@ async function handleStopRequest(request, state, childProcess) {
412
419
  if (!state.isRunning) {
413
420
  return;
414
421
  }
415
- process.kill(state.daemonPid, 'SIGTERM');
416
- await new Promise((resolve) => setTimeout(resolve, 1000));
422
+ if (request.entirePg && process.platform === 'win32') {
423
+ await (0, process_kill_1.bestEffortKillWindowsProcessTree)(state.daemonPid);
424
+ await (0, process_kill_1.sleepMs)(100);
425
+ if (!state.isRunning || !isProcessAlive(state.daemonPid)) {
426
+ if (!state.isRunning) {
427
+ return;
428
+ }
429
+ markDaemonMissing(state);
430
+ return;
431
+ }
432
+ }
433
+ try {
434
+ process.kill(state.daemonPid, 'SIGTERM');
435
+ }
436
+ catch {
437
+ return;
438
+ }
439
+ await (0, process_kill_1.sleepMs)(1000);
417
440
  if (!state.isRunning) {
418
441
  return;
419
442
  }
@@ -423,13 +446,17 @@ async function handleStopRequest(request, state, childProcess) {
423
446
  catch {
424
447
  // Process may have exited during grace period.
425
448
  }
426
- await new Promise((resolve) => setTimeout(resolve, 100));
449
+ await (0, process_kill_1.sleepMs)(100);
427
450
  if (!state.isRunning) {
428
451
  return;
429
452
  }
430
453
  if (typeof childProcess.kill === 'function') {
431
454
  childProcess.kill('SIGKILL');
432
455
  }
456
+ await (0, process_kill_1.sleepMs)(100);
457
+ if (state.isRunning && !isProcessAlive(state.daemonPid)) {
458
+ markDaemonMissing(state);
459
+ }
433
460
  }
434
461
  void main().catch((error) => {
435
462
  void flushIpc({
package/dist/tools/os.js CHANGED
@@ -31,6 +31,7 @@ const shared_reminders_1 = require("../shared-reminders");
31
31
  const tool_1 = require("../tool");
32
32
  const cmd_runner_protocol_1 = require("./cmd-runner-protocol");
33
33
  const output_limit_1 = require("./output-limit");
34
+ const process_kill_1 = require("./process-kill");
34
35
  const shell_capture_env_1 = require("./shell-capture-env");
35
36
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
36
37
  const requireFn = (0, module_1.createRequire)(__filename);
@@ -794,12 +795,9 @@ function parseStopDaemonArgs(args) {
794
795
  if (entirePg !== undefined && typeof entirePg !== 'boolean') {
795
796
  throw new Error('stop_daemon.entire_pg must be a boolean if provided');
796
797
  }
797
- if (process.platform === 'win32' && entirePg === true) {
798
- throw new Error('stop_daemon.entire_pg=true is unsupported on Windows');
799
- }
800
798
  return {
801
799
  pid,
802
- entirePg: entirePg ?? process.platform !== 'win32',
800
+ entirePg: entirePg ?? true,
803
801
  };
804
802
  }
805
803
  function parseGetDaemonOutputArgs(args) {
@@ -1026,6 +1024,13 @@ async function callRunner(endpoint, request, timeoutMs = 5000) {
1026
1024
  }
1027
1025
  async function bestEffortKillDaemonProcessGroup(meta, options) {
1028
1026
  const includeEntirePg = options?.includeEntirePg ?? true;
1027
+ if (includeEntirePg && process.platform === 'win32') {
1028
+ await (0, process_kill_1.bestEffortKillWindowsProcessTree)(meta.pid);
1029
+ if (meta.runnerPid !== undefined && meta.runnerPid !== meta.pid) {
1030
+ (0, process_kill_1.bestEffortKillPid)(meta.runnerPid);
1031
+ }
1032
+ return;
1033
+ }
1029
1034
  if (includeEntirePg && process.platform !== 'win32' && meta.processGroupId !== undefined) {
1030
1035
  try {
1031
1036
  process.kill(-meta.processGroupId, 'SIGTERM');
@@ -1033,7 +1038,7 @@ async function bestEffortKillDaemonProcessGroup(meta, options) {
1033
1038
  catch {
1034
1039
  // Best effort only.
1035
1040
  }
1036
- await new Promise((resolve) => setTimeout(resolve, 1000));
1041
+ await (0, process_kill_1.sleepMs)(1000);
1037
1042
  try {
1038
1043
  process.kill(-meta.processGroupId, 'SIGKILL');
1039
1044
  }
@@ -1047,7 +1052,7 @@ async function bestEffortKillDaemonProcessGroup(meta, options) {
1047
1052
  catch {
1048
1053
  // Best effort only.
1049
1054
  }
1050
- await new Promise((resolve) => setTimeout(resolve, 250));
1055
+ await (0, process_kill_1.sleepMs)(250);
1051
1056
  try {
1052
1057
  process.kill(meta.pid, 'SIGKILL');
1053
1058
  }
@@ -1216,7 +1221,7 @@ const stopDaemonSchema = {
1216
1221
  },
1217
1222
  entire_pg: {
1218
1223
  type: 'boolean',
1219
- description: 'Whether to signal the entire process group instead of only the tracked PID (default: true on Unix-like systems; false on Windows)',
1224
+ description: 'Whether to stop the entire process group/process tree instead of only the tracked PID (default: true)',
1220
1225
  },
1221
1226
  },
1222
1227
  required: ['pid'],
@@ -2752,7 +2757,7 @@ exports.stopDaemonTool = {
2752
2757
  if (reminder.meta.runnerEndpoint !== undefined &&
2753
2758
  reminder.meta.runnerEndpoint.trim() !== '') {
2754
2759
  try {
2755
- const stopResponse = await callRunner(reminder.meta.runnerEndpoint, { type: 'stop' }, 10000);
2760
+ const stopResponse = await callRunner(reminder.meta.runnerEndpoint, { type: 'stop', entirePg }, 10000);
2756
2761
  if (stopResponse.ok && runnerResponseMatchesReminder(reminder.meta, stopResponse)) {
2757
2762
  if (stopResponse.isRunning) {
2758
2763
  await bestEffortKillDaemonProcessGroup(reminder.meta, { includeEntirePg: entirePg });
@@ -0,0 +1,4 @@
1
+ export declare function sleepMs(milliseconds: number): Promise<void>;
2
+ export declare function buildWindowsTaskkillArgs(pid: number, force: boolean): string[];
3
+ export declare function bestEffortKillWindowsProcessTree(pid: number): Promise<void>;
4
+ export declare function bestEffortKillPid(pid: number): void;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sleepMs = sleepMs;
4
+ exports.buildWindowsTaskkillArgs = buildWindowsTaskkillArgs;
5
+ exports.bestEffortKillWindowsProcessTree = bestEffortKillWindowsProcessTree;
6
+ exports.bestEffortKillPid = bestEffortKillPid;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const node_util_1 = require("node:util");
9
+ const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
10
+ function sleepMs(milliseconds) {
11
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
12
+ }
13
+ function buildWindowsTaskkillArgs(pid, force) {
14
+ assertValidPid(pid);
15
+ return force ? ['/PID', String(pid), '/T', '/F'] : ['/PID', String(pid), '/T'];
16
+ }
17
+ function assertValidPid(pid) {
18
+ if (!Number.isInteger(pid) || pid <= 0) {
19
+ throw new Error(`Invalid process pid: ${String(pid)}`);
20
+ }
21
+ }
22
+ async function bestEffortTaskkill(pid, force) {
23
+ try {
24
+ await execFileAsync('taskkill.exe', buildWindowsTaskkillArgs(pid, force), {
25
+ windowsHide: true,
26
+ maxBuffer: 1024 * 1024,
27
+ });
28
+ }
29
+ catch {
30
+ // Best effort only.
31
+ }
32
+ }
33
+ async function bestEffortKillWindowsProcessTree(pid) {
34
+ assertValidPid(pid);
35
+ await bestEffortTaskkill(pid, false);
36
+ await sleepMs(1000);
37
+ await bestEffortTaskkill(pid, true);
38
+ bestEffortKillPid(pid);
39
+ }
40
+ function bestEffortKillPid(pid) {
41
+ assertValidPid(pid);
42
+ try {
43
+ process.kill(pid, 'SIGKILL');
44
+ }
45
+ catch {
46
+ // Best effort only.
47
+ }
48
+ }
@@ -55,7 +55,7 @@ Stop daemon process.
55
55
  **Parameters:**
56
56
 
57
57
  - `pid` (required): Daemon process ID (number)
58
- - `entire_pg` (optional): Whether to signal the entire process group (default: `true` on Unix-like systems, `false` on Windows; Windows does not support explicitly passing `true`)
58
+ - `entire_pg` (optional): Whether to stop the entire process group/process tree (default: `true`; on Windows this stops the tracked shell process and its child processes)
59
59
 
60
60
  **Returns:**
61
61
 
@@ -151,7 +151,7 @@ stop_daemon({
151
151
  pid: 12345,
152
152
  });
153
153
 
154
- // On Unix-like systems, you can explicitly terminate the whole process group
154
+ // Explicitly stop the whole process group/process tree
155
155
  stop_daemon({
156
156
  pid: 12345,
157
157
  entire_pg: true,
@@ -55,7 +55,7 @@ executed_at: <执行时间戳>
55
55
  **参数:**
56
56
 
57
57
  - `pid`(必需):守护进程 PID(数字)
58
- - `entire_pg`(可选):是否对整个进程组发终止信号(默认:Linux/macOS 为 `true`,Windows `false`;Windows 不支持显式传 `true`)
58
+ - `entire_pg`(可选):是否停止整个进程组/进程树(默认:`true`;Windows 上会停止被追踪的 shell 进程及其子进程)
59
59
 
60
60
  **返回:**
61
61
 
@@ -151,7 +151,7 @@ stop_daemon({
151
151
  pid: 12345,
152
152
  });
153
153
 
154
- // Unix-like 平台可显式要求终止整个进程组
154
+ // 显式要求停止整个进程组/进程树
155
155
  stop_daemon({
156
156
  pid: 12345,
157
157
  entire_pg: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.25.13",
3
+ "version": "1.25.14",
4
4
  "description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
5
5
  "type": "commonjs",
6
6
  "publishConfig": {
@@ -52,9 +52,9 @@
52
52
  "ws": "^8.19.0",
53
53
  "yaml": "^2.8.2",
54
54
  "zod": "^4.3.6",
55
- "@longrun-ai/kernel": "1.15.9",
56
- "@longrun-ai/shell": "1.15.9",
57
- "@longrun-ai/codex-auth": "0.13.0"
55
+ "@longrun-ai/codex-auth": "0.13.0",
56
+ "@longrun-ai/kernel": "1.15.10",
57
+ "@longrun-ai/shell": "1.15.10"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/node": "^25.3.5",
@@ -1,5 +1,5 @@
1
- import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-BuB0jmKD.js";
2
- import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-DLTS_eOh.js";
1
+ import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-BwH1mnxt.js";
2
+ import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-BiFvaOdQ.js";
3
3
  var reWhitespace = /\s/;
4
4
  function trimmedEndIndex(string) {
5
5
  var index = string.length;
@@ -193,4 +193,4 @@ export {
193
193
  map as m,
194
194
  toFinite as t
195
195
  };
196
- //# sourceMappingURL=_basePickBy-B1-brAPU.js.map
196
+ //# sourceMappingURL=_basePickBy-xJw0ZLXb.js.map