dominds 0.7.0 → 0.7.2

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 (104) hide show
  1. package/dist/agent-priming.js +162 -24
  2. package/dist/docs/dialog-system.md +18 -16
  3. package/dist/docs/dialog-system.zh.md +20 -19
  4. package/dist/llm/driver-v2/core.js +101 -1
  5. package/dist/llm/driver-v2/orchestrator.js +7 -0
  6. package/dist/llm/driver-v2/round.js +114 -4
  7. package/dist/llm/driver-v2/tellask-bridge.js +29 -2
  8. package/dist/llm/driver.js +54 -2
  9. package/dist/persistence.js +20 -0
  10. package/dist/server/websocket-handler.js +99 -7
  11. package/dist/shared/diligence.js +8 -2
  12. package/dist/static/assets/{_baseUniq-BxKNVs_E.js → _baseUniq-C04fddeD.js} +2 -2
  13. package/dist/static/assets/{_baseUniq-BxKNVs_E.js.map → _baseUniq-C04fddeD.js.map} +1 -1
  14. package/dist/static/assets/{arc-SobL0GO-.js → arc-qmZerooe.js} +2 -2
  15. package/dist/static/assets/{arc-SobL0GO-.js.map → arc-qmZerooe.js.map} +1 -1
  16. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js → architectureDiagram-VXUJARFQ-DPAwJ19g.js} +6 -6
  17. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js.map → architectureDiagram-VXUJARFQ-DPAwJ19g.js.map} +1 -1
  18. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js → blockDiagram-VD42YOAC-M0jbEJ-1.js} +7 -7
  19. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js.map → blockDiagram-VD42YOAC-M0jbEJ-1.js.map} +1 -1
  20. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js → c4Diagram-YG6GDRKO-DlF8gwFw.js} +3 -3
  21. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js.map → c4Diagram-YG6GDRKO-DlF8gwFw.js.map} +1 -1
  22. package/dist/static/assets/{channel-CNJ5IKbI.js → channel-B2Ph7be3.js} +2 -2
  23. package/dist/static/assets/{channel-CNJ5IKbI.js.map → channel-B2Ph7be3.js.map} +1 -1
  24. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js → chunk-4BX2VUAB-BZ2L6PK1.js} +2 -2
  25. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js.map → chunk-4BX2VUAB-BZ2L6PK1.js.map} +1 -1
  26. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js → chunk-55IACEB6-COXFmnJW.js} +2 -2
  27. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js.map → chunk-55IACEB6-COXFmnJW.js.map} +1 -1
  28. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js → chunk-B4BG7PRW-B1HiWlBq.js} +5 -5
  29. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js.map → chunk-B4BG7PRW-B1HiWlBq.js.map} +1 -1
  30. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js → chunk-DI55MBZ5-BO3wQRnL.js} +4 -4
  31. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js.map → chunk-DI55MBZ5-BO3wQRnL.js.map} +1 -1
  32. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js → chunk-FMBD7UC4-BdavRHSy.js} +2 -2
  33. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js.map → chunk-FMBD7UC4-BdavRHSy.js.map} +1 -1
  34. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js → chunk-QN33PNHL-DchoUNF7.js} +2 -2
  35. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js.map → chunk-QN33PNHL-DchoUNF7.js.map} +1 -1
  36. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js → chunk-QZHKN3VN-Dr3uVTtK.js} +2 -2
  37. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js.map → chunk-QZHKN3VN-Dr3uVTtK.js.map} +1 -1
  38. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js → chunk-TZMSLE5B-BhOcHZNs.js} +2 -2
  39. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js.map → chunk-TZMSLE5B-BhOcHZNs.js.map} +1 -1
  40. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js → classDiagram-2ON5EDUG-Dep-MR6W.js} +6 -6
  41. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js.map → classDiagram-2ON5EDUG-Dep-MR6W.js.map} +1 -1
  42. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js → classDiagram-v2-WZHVMYZB-Dep-MR6W.js} +6 -6
  43. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map → classDiagram-v2-WZHVMYZB-Dep-MR6W.js.map} +1 -1
  44. package/dist/static/assets/{clone-CfBpi3MU.js → clone-DzoL-dSX.js} +2 -2
  45. package/dist/static/assets/{clone-CfBpi3MU.js.map → clone-DzoL-dSX.js.map} +1 -1
  46. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js → cose-bilkent-S5V4N54A-Bqu_DqDB.js} +2 -2
  47. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js.map → cose-bilkent-S5V4N54A-Bqu_DqDB.js.map} +1 -1
  48. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js → dagre-6UL2VRFP-49InNTzs.js} +7 -7
  49. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js.map → dagre-6UL2VRFP-49InNTzs.js.map} +1 -1
  50. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js → diagram-PSM6KHXK-C1IsQq8m.js} +7 -7
  51. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js.map → diagram-PSM6KHXK-C1IsQq8m.js.map} +1 -1
  52. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js → diagram-QEK2KX5R-DyJeSg_Y.js} +6 -6
  53. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js.map → diagram-QEK2KX5R-DyJeSg_Y.js.map} +1 -1
  54. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js → diagram-S2PKOQOG-aeLjjldp.js} +6 -6
  55. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js.map → diagram-S2PKOQOG-aeLjjldp.js.map} +1 -1
  56. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js → erDiagram-Q2GNP2WA-BUcv4AUq.js} +5 -5
  57. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js.map → erDiagram-Q2GNP2WA-BUcv4AUq.js.map} +1 -1
  58. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js → flowDiagram-NV44I4VS-DfmTKlf_.js} +6 -6
  59. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js.map → flowDiagram-NV44I4VS-DfmTKlf_.js.map} +1 -1
  60. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js → ganttDiagram-JELNMOA3-BpJE8Lhp.js} +3 -3
  61. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js.map → ganttDiagram-JELNMOA3-BpJE8Lhp.js.map} +1 -1
  62. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js → gitGraphDiagram-NY62KEGX-DmznjSYb.js} +7 -7
  63. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map → gitGraphDiagram-NY62KEGX-DmznjSYb.js.map} +1 -1
  64. package/dist/static/assets/{graph-K6mmQESm.js → graph-CcKyIZaL.js} +3 -3
  65. package/dist/static/assets/{graph-K6mmQESm.js.map → graph-CcKyIZaL.js.map} +1 -1
  66. package/dist/static/assets/{index-RV1MEt3b.js → index-CQr8MdPI.js} +77 -44
  67. package/dist/static/assets/index-CQr8MdPI.js.map +1 -0
  68. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js → infoDiagram-WHAUD3N6-DwRPjndM.js} +5 -5
  69. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js.map → infoDiagram-WHAUD3N6-DwRPjndM.js.map} +1 -1
  70. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js → journeyDiagram-XKPGCS4Q-BRAFSgVa.js} +5 -5
  71. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js.map → journeyDiagram-XKPGCS4Q-BRAFSgVa.js.map} +1 -1
  72. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js → kanban-definition-3W4ZIXB7-DlJ7-fgN.js} +3 -3
  73. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js.map → kanban-definition-3W4ZIXB7-DlJ7-fgN.js.map} +1 -1
  74. package/dist/static/assets/{layout-BcrPlYah.js → layout-CcW5-Iee.js} +5 -5
  75. package/dist/static/assets/{layout-BcrPlYah.js.map → layout-CcW5-Iee.js.map} +1 -1
  76. package/dist/static/assets/{linear-DYXbzldi.js → linear-sKdPIuOH.js} +2 -2
  77. package/dist/static/assets/{linear-DYXbzldi.js.map → linear-sKdPIuOH.js.map} +1 -1
  78. package/dist/static/assets/{min-CAfJrdkg.js → min-CQ0AYqmk.js} +3 -3
  79. package/dist/static/assets/{min-CAfJrdkg.js.map → min-CQ0AYqmk.js.map} +1 -1
  80. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js → mindmap-definition-VGOIOE7T-CTRwSlu8.js} +4 -4
  81. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js.map → mindmap-definition-VGOIOE7T-CTRwSlu8.js.map} +1 -1
  82. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js → pieDiagram-ADFJNKIX-DmD5KRKE.js} +7 -7
  83. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js.map → pieDiagram-ADFJNKIX-DmD5KRKE.js.map} +1 -1
  84. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js → quadrantDiagram-AYHSOK5B-C5sqZOBF.js} +3 -3
  85. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map → quadrantDiagram-AYHSOK5B-C5sqZOBF.js.map} +1 -1
  86. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js → requirementDiagram-UZGBJVZJ-DBAUwM-7.js} +4 -4
  87. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map → requirementDiagram-UZGBJVZJ-DBAUwM-7.js.map} +1 -1
  88. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js → sankeyDiagram-TZEHDZUN-CkaxkOo7.js} +2 -2
  89. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map → sankeyDiagram-TZEHDZUN-CkaxkOo7.js.map} +1 -1
  90. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js → sequenceDiagram-WL72ISMW-CJ6wMDXh.js} +4 -4
  91. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js.map → sequenceDiagram-WL72ISMW-CJ6wMDXh.js.map} +1 -1
  92. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js → stateDiagram-FKZM4ZOC-C66ZP2NW.js} +9 -9
  93. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js.map → stateDiagram-FKZM4ZOC-C66ZP2NW.js.map} +1 -1
  94. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js → stateDiagram-v2-4FDKWEC3-DdoOy271.js} +5 -5
  95. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map → stateDiagram-v2-4FDKWEC3-DdoOy271.js.map} +1 -1
  96. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js → timeline-definition-IT6M3QCI-2A2Mqedz.js} +3 -3
  97. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js.map → timeline-definition-IT6M3QCI-2A2Mqedz.js.map} +1 -1
  98. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js → treemap-KMMF4GRG-CTbGSr5o.js} +4 -4
  99. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js.map → treemap-KMMF4GRG-CTbGSr5o.js.map} +1 -1
  100. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js → xychartDiagram-PRI3JC2R-C_S3XXZI.js} +3 -3
  101. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map → xychartDiagram-PRI3JC2R-C_S3XXZI.js.map} +1 -1
  102. package/dist/static/index.html +1 -1
  103. package/package.json +1 -1
  104. package/dist/static/assets/index-RV1MEt3b.js.map +0 -1
@@ -11,6 +11,7 @@ const dialog_instance_registry_1 = require("../dialog-instance-registry");
11
11
  const dialog_run_state_1 = require("../dialog-run-state");
12
12
  const evt_registry_1 = require("../evt-registry");
13
13
  const driver_entry_1 = require("../llm/driver-entry");
14
+ const runtime_utils_1 = require("../llm/driver-v2/runtime-utils");
14
15
  const log_1 = require("../log");
15
16
  const persistence_1 = require("../persistence");
16
17
  const problems_1 = require("../problems");
@@ -42,6 +43,14 @@ const wsLiveDlg = new WeakMap();
42
43
  const wsSub = new WeakMap();
43
44
  const wsUiLanguage = new WeakMap();
44
45
  let broadcastDialogsIndexMessage = null;
46
+ let broadcastRunControlRefreshMessage = null;
47
+ function emitRunControlRefresh(reason) {
48
+ broadcastRunControlRefreshMessage?.({
49
+ type: 'run_control_refresh',
50
+ reason,
51
+ timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
52
+ });
53
+ }
45
54
  async function syncPendingTellaskReminderBestEffort(dialog, where) {
46
55
  try {
47
56
  await (0, pending_tellask_reminder_1.syncPendingTellaskReminderState)(dialog);
@@ -249,6 +258,18 @@ async function handleDeclareSubdialogDead(ws, packet) {
249
258
  }
250
259
  if (!metadata)
251
260
  return;
261
+ if ('tellaskSession' in metadata &&
262
+ typeof metadata.tellaskSession === 'string' &&
263
+ metadata.tellaskSession.trim() !== '') {
264
+ const rootRestored = await restoreDialogForDrive(new dialog_1.DialogID(dialogIdObj.rootId), 'running');
265
+ if (!(rootRestored instanceof dialog_1.RootDialog)) {
266
+ throw new Error(`Expected root dialog instance for ${dialogIdObj.rootId}`);
267
+ }
268
+ const removed = rootRestored.unregisterSubdialog(metadata.agentId, metadata.tellaskSession);
269
+ if (removed) {
270
+ await rootRestored.saveSubdialogRegistry();
271
+ }
272
+ }
252
273
  if (!('assignmentFromSup' in metadata))
253
274
  return;
254
275
  if (!metadata.assignmentFromSup)
@@ -265,8 +286,8 @@ async function handleDeclareSubdialogDead(ws, packet) {
265
286
  }
266
287
  const parentDialog = await restoreDialogForDrive(callerDialogIdObj, 'running');
267
288
  const responseText = (0, runtime_language_1.getWorkLanguage)() === 'zh'
268
- ? `系统反馈:支线对话 ${dialogIdObj.valueOf()} 已被用户宣布卡死(不可逆)。该支线对话不会再回复。`
269
- : `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible). This sideline dialog will not reply further.`;
289
+ ? `系统反馈:支线对话 ${dialogIdObj.valueOf()} 已被用户宣布卡死(不可逆)。后续可以重用相同的 slug 发起全新支线对话;只是之前的上下文已不再,诉请正文请提供最新的完整上下文信息。`
290
+ : `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible). You may reuse the same slug to start a brand-new sideline dialog, but previous context is no longer retained; include the latest complete context in the tellask body.`;
270
291
  const responseTextWithNote = note === ''
271
292
  ? responseText
272
293
  : (0, runtime_language_1.getWorkLanguage)() === 'zh'
@@ -314,6 +335,10 @@ async function handleSetDiligencePush(ws, packet) {
314
335
  ws.send(JSON.stringify({ type: 'error', message: `Dialog ${dialogIdObj.valueOf()} not found` }));
315
336
  return;
316
337
  }
338
+ const latestBefore = await persistence_1.DialogPersistence.loadDialogLatest(dialogIdObj, foundStatus);
339
+ const prevDisableDiligencePush = latestBefore && typeof latestBefore.disableDiligencePush === 'boolean'
340
+ ? latestBefore.disableDiligencePush
341
+ : false;
317
342
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogIdObj, (previous) => ({
318
343
  kind: 'patch',
319
344
  patch: { disableDiligencePush },
@@ -330,6 +355,13 @@ async function handleSetDiligencePush(ws, packet) {
330
355
  timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
331
356
  };
332
357
  ws.send(JSON.stringify(msg));
358
+ const shouldTriggerImmediateDiligence = foundStatus === 'running' &&
359
+ prevDisableDiligencePush &&
360
+ !disableDiligencePush &&
361
+ rootDialog instanceof dialog_1.RootDialog;
362
+ if (shouldTriggerImmediateDiligence) {
363
+ void maybeTriggerImmediateDiligencePrompt(rootDialog);
364
+ }
333
365
  }
334
366
  catch (error) {
335
367
  log.warn('Failed to handle set_diligence_push', error);
@@ -344,6 +376,55 @@ function clampNonNegativeFiniteInt(value, fallback) {
344
376
  return fallback;
345
377
  return Math.max(0, Math.floor(value));
346
378
  }
379
+ async function maybeTriggerImmediateDiligencePrompt(rootDialog) {
380
+ try {
381
+ if (rootDialog.disableDiligencePush) {
382
+ return;
383
+ }
384
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(rootDialog.id, 'running');
385
+ const runState = latest?.runState;
386
+ if (runState && runState.kind !== 'idle_waiting_user') {
387
+ return;
388
+ }
389
+ const suspension = await rootDialog.getSuspensionStatus();
390
+ if (!suspension.canDrive) {
391
+ return;
392
+ }
393
+ const queuedResponses = await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(rootDialog.id);
394
+ if (queuedResponses.length > 0) {
395
+ return;
396
+ }
397
+ const team = await team_1.Team.load();
398
+ const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
399
+ dlg: rootDialog,
400
+ isRootDialog: true,
401
+ remainingBudget: rootDialog.diligencePushRemainingBudget,
402
+ diligencePushMax: resolveMemberDiligencePushMax(team, rootDialog.agentId),
403
+ });
404
+ rootDialog.diligencePushRemainingBudget = prepared.nextRemainingBudget;
405
+ await persistence_1.DialogPersistence.mutateDialogLatest(rootDialog.id, () => ({
406
+ kind: 'patch',
407
+ patch: { diligencePushRemainingBudget: rootDialog.diligencePushRemainingBudget },
408
+ }));
409
+ if (prepared.kind !== 'disabled') {
410
+ (0, evt_registry_1.postDialogEvent)(rootDialog, {
411
+ type: 'diligence_budget_evt',
412
+ maxInjectCount: prepared.maxInjectCount,
413
+ injectedCount: Math.max(0, prepared.maxInjectCount - prepared.nextRemainingBudget),
414
+ remainingCount: Math.max(0, prepared.nextRemainingBudget),
415
+ disableDiligencePush: rootDialog.disableDiligencePush,
416
+ });
417
+ }
418
+ if (prepared.kind === 'prompt') {
419
+ await (0, driver_entry_1.driveDialogStream)(rootDialog, prepared.prompt, true);
420
+ }
421
+ }
422
+ catch (error) {
423
+ log.warn('Failed to trigger immediate diligence prompt after enabling keep-going', error, {
424
+ dialogId: rootDialog.id.valueOf(),
425
+ });
426
+ }
427
+ }
347
428
  async function handleRefillDiligencePushBudget(ws, packet) {
348
429
  const { dialog } = packet;
349
430
  if (!isRecord(dialog)) {
@@ -887,7 +968,7 @@ async function handleUserMsg2Dlg(ws, packet) {
887
968
  existingDialog.status === 'running' &&
888
969
  existingSub &&
889
970
  existingSub.dialogKey === existingDialog.id.valueOf()) {
890
- await (0, driver_entry_1.driveDialogStream)(existingDialog, { content, msgId, grammar: 'tellask', userLanguageCode }, true);
971
+ await (0, driver_entry_1.driveDialogStream)(existingDialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
891
972
  return;
892
973
  }
893
974
  // Dialog not found in wsLiveDlg - drive using the canonical root/subdialog instances.
@@ -907,7 +988,7 @@ async function handleUserMsg2Dlg(ws, packet) {
907
988
  return;
908
989
  }
909
990
  await setupWebSocketSubscription(ws, dialog);
910
- await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode }, true);
991
+ await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
911
992
  return;
912
993
  }
913
994
  catch (restoreError) {
@@ -966,6 +1047,7 @@ async function handleEmergencyStop(ws, packet) {
966
1047
  throw new Error('Internal error: handleEmergencyStop called with non emergency_stop packet');
967
1048
  }
968
1049
  await (0, dialog_run_state_1.requestEmergencyStopAll)();
1050
+ emitRunControlRefresh('emergency_stop');
969
1051
  }
970
1052
  async function handleResumeDialog(ws, packet) {
971
1053
  if (packet.type !== 'resume_dialog') {
@@ -984,7 +1066,7 @@ async function handleResumeDialog(ws, packet) {
984
1066
  return;
985
1067
  }
986
1068
  const restored = await restoreDialogForDrive(dialogIdObj, 'running');
987
- await (0, driver_entry_1.driveDialogStream)(restored, undefined, true);
1069
+ await (0, driver_entry_1.driveDialogStream)(restored, undefined, true, { allowResumeFromInterrupted: true });
988
1070
  }
989
1071
  async function handleResumeAll(ws, packet) {
990
1072
  if (packet.type !== 'resume_all') {
@@ -999,13 +1081,14 @@ async function handleResumeAll(ws, packet) {
999
1081
  void (async () => {
1000
1082
  try {
1001
1083
  const dlg = await restoreDialogForDrive(id, 'running');
1002
- await (0, driver_entry_1.driveDialogStream)(dlg, undefined, true);
1084
+ await (0, driver_entry_1.driveDialogStream)(dlg, undefined, true, { allowResumeFromInterrupted: true });
1003
1085
  }
1004
1086
  catch (err) {
1005
1087
  log.warn('resume_all: failed to resume dialog', err, { dialogId: id.valueOf() });
1006
1088
  }
1007
1089
  })();
1008
1090
  }
1091
+ emitRunControlRefresh('resume_all');
1009
1092
  }
1010
1093
  /**
1011
1094
  * Handle user answer to a Q4H (Questions for Human) question
@@ -1075,7 +1158,7 @@ async function handleUserAnswer2Q4H(ws, packet) {
1075
1158
  };
1076
1159
  (0, evt_registry_1.postDialogEvent)(dialog, answeredEvent);
1077
1160
  // Resume the dialog with the user's answer.
1078
- await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode }, true);
1161
+ await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
1079
1162
  }
1080
1163
  catch (error) {
1081
1164
  log.error('Error processing Q4H user answer:', error);
@@ -1119,6 +1202,15 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage) {
1119
1202
  }
1120
1203
  }
1121
1204
  };
1205
+ // Broadcast global run-control refresh hints so all clients converge from persisted dialog index.
1206
+ broadcastRunControlRefreshMessage = (msg) => {
1207
+ const data = JSON.stringify(msg);
1208
+ for (const ws of clients) {
1209
+ if (ws.readyState === 1) {
1210
+ ws.send(data);
1211
+ }
1212
+ }
1213
+ };
1122
1214
  // Broadcast rtws Problems snapshots to all connected clients.
1123
1215
  (0, problems_1.setProblemsBroadcaster)((msg) => {
1124
1216
  const data = JSON.stringify(msg);
@@ -23,9 +23,12 @@ exports.DILIGENCE_FALLBACK_TEXT = {
23
23
  '扪心自问时,自诉请正文需要包含对当前状况的完整事实性总结(但不要包含差遣牒已有内容);`!?@self` 发起后不要立即下最终行动决策,先等回贴再综合。综合完成后必须立刻执行已确定行动(工具调用/诉请队友),避免停留在“仅汇报决定”的状态。',
24
24
  '',
25
25
  '队友如果回复 “将要/可以” 做 XXX 的,你要审视祂所说是否符合整体/分项任务目标,是否值得继续:',
26
- '',
27
26
  '- 如果祂建议的事情可做可不做,那么就可以忽略,不以琐碎小事安排工作。',
28
27
  '- 如果值得继续,你可加以纠正或鼓励,并立即诉请其继续,不要留祂停在那里等待指令,这是不可接受的。',
28
+ '',
29
+ '系统会把“尚未收到反馈、仍在执行中的诉请”自动展示为提醒项;请以提醒项作为是否仍在执行中的唯一判断依据。',
30
+ '',
31
+ '凡是不在提醒项里的历史诉请,都不要继续等待(通常代表已回贴或已结束当前轮次)。若该工作线仍需推进,必须立即使用同一个 `!tellaskSession <slug>` 再次诉请对应队友,明确要求继续执行下一步。',
29
32
  ].join('\n'),
30
33
  en: [
31
34
  'Do a self-check (run one FBR): does the Taskdoc already contain a sufficiently clear goal definition?',
@@ -47,8 +50,11 @@ exports.DILIGENCE_FALLBACK_TEXT = {
47
50
  'When running FBR, the self-tellask body must include a complete factual summary of the current situation (but do not repeat information already present in the Taskdoc). After `!?@self`, do not finalize the next action immediately; wait for feedback first, then synthesize. Once synthesized, immediately execute the chosen action (tool call / teammate tellask), and avoid staying in a “decision report only” state.',
48
51
  '',
49
52
  'If a teammate replies that they “will/can do X”, examine whether it aligns with the overall/sub-task goals and is worth continuing:',
50
- '',
51
53
  '- If it is optional and low impact, ignore it instead of assigning trivial work.',
52
54
  '- If it is worth continuing, correct or encourage as needed and immediately tellask them to continue; leaving them idle and waiting for instructions is unacceptable.',
55
+ '',
56
+ 'The system automatically surfaces still-running tellasks (those without feedback yet) as reminder items; treat reminders as the single source of truth for whether a tellask is still in progress.',
57
+ '',
58
+ 'For any historical tellask not listed in reminders, do not keep waiting (it usually means the previous round already replied or ended). If that workstream should continue, immediately re-tellask the same teammate with the same `!tellaskSession <slug>` and explicitly ask for the next step.',
53
59
  ].join('\n'),
54
60
  };
@@ -1,4 +1,4 @@
1
- import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-RV1MEt3b.js";
1
+ import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-CQr8MdPI.js";
2
2
  var symbolTag$1 = "[object Symbol]";
3
3
  function isSymbol(value) {
4
4
  return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$1;
@@ -658,4 +658,4 @@ export {
658
658
  hasIn as x,
659
659
  toString as y
660
660
  };
661
- //# sourceMappingURL=_baseUniq-BxKNVs_E.js.map
661
+ //# sourceMappingURL=_baseUniq-C04fddeD.js.map