dominds 0.6.7 → 0.7.1

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 (129) hide show
  1. package/dist/agent-priming.js +169 -31
  2. package/dist/docs/drive-logic-context-refactor-plan.zh.md +201 -105
  3. package/dist/docs/keep-going.zh.md +162 -0
  4. package/dist/docs/showing-by-doing.md +208 -0
  5. package/dist/docs/showing-by-doing.zh.md +177 -0
  6. package/dist/llm/driver-entry.js +52 -0
  7. package/dist/llm/driver-v2/context-health.js +27 -0
  8. package/dist/llm/driver-v2/context.js +58 -0
  9. package/dist/llm/driver-v2/core.js +1015 -0
  10. package/dist/llm/driver-v2/index.js +21 -0
  11. package/dist/llm/driver-v2/orchestrator.js +94 -0
  12. package/dist/llm/driver-v2/policy.js +135 -0
  13. package/dist/llm/driver-v2/round.js +166 -0
  14. package/dist/llm/driver-v2/runtime-utils.js +362 -0
  15. package/dist/llm/driver-v2/saying-events.js +58 -0
  16. package/dist/llm/driver-v2/subdialog-txn.js +42 -0
  17. package/dist/llm/driver-v2/supdialog-response.js +239 -0
  18. package/dist/llm/driver-v2/tellask-bridge.js +1057 -0
  19. package/dist/llm/driver-v2/types.js +10 -0
  20. package/dist/llm/driver.js +65 -75
  21. package/dist/llm/gen/mock.js +129 -8
  22. package/dist/log.js +12 -8
  23. package/dist/mcp/supervisor.js +1 -4
  24. package/dist/minds/promptdocs.js +263 -0
  25. package/dist/persistence.js +8 -38
  26. package/dist/server/api-routes.js +13 -5
  27. package/dist/server/websocket-handler.js +7 -7
  28. package/dist/server.js +2 -2
  29. package/dist/showing-by-doing.js +34 -31
  30. package/dist/snippets/README.en.md +3 -0
  31. package/dist/static/assets/{_baseUniq-DucuKHj3.js → _baseUniq-BxKNVs_E.js} +2 -2
  32. package/dist/static/assets/{_baseUniq-DucuKHj3.js.map → _baseUniq-BxKNVs_E.js.map} +1 -1
  33. package/dist/static/assets/{arc-CNlZ9dTp.js → arc-SobL0GO-.js} +2 -2
  34. package/dist/static/assets/{arc-CNlZ9dTp.js.map → arc-SobL0GO-.js.map} +1 -1
  35. package/dist/static/assets/{architectureDiagram-VXUJARFQ-BXkEOfVt.js → architectureDiagram-VXUJARFQ-MMDS1QOC.js} +6 -6
  36. package/dist/static/assets/{architectureDiagram-VXUJARFQ-BXkEOfVt.js.map → architectureDiagram-VXUJARFQ-MMDS1QOC.js.map} +1 -1
  37. package/dist/static/assets/{blockDiagram-VD42YOAC-CyxI2bRF.js → blockDiagram-VD42YOAC-BOsSirNK.js} +7 -7
  38. package/dist/static/assets/{blockDiagram-VD42YOAC-CyxI2bRF.js.map → blockDiagram-VD42YOAC-BOsSirNK.js.map} +1 -1
  39. package/dist/static/assets/{c4Diagram-YG6GDRKO-sS8T1IDn.js → c4Diagram-YG6GDRKO-D4jQkzwx.js} +3 -3
  40. package/dist/static/assets/{c4Diagram-YG6GDRKO-sS8T1IDn.js.map → c4Diagram-YG6GDRKO-D4jQkzwx.js.map} +1 -1
  41. package/dist/static/assets/{channel-DBu0JRwo.js → channel-CNJ5IKbI.js} +2 -2
  42. package/dist/static/assets/{channel-DBu0JRwo.js.map → channel-CNJ5IKbI.js.map} +1 -1
  43. package/dist/static/assets/{chunk-4BX2VUAB-D499BCnz.js → chunk-4BX2VUAB-Dzp3xxyo.js} +2 -2
  44. package/dist/static/assets/{chunk-4BX2VUAB-D499BCnz.js.map → chunk-4BX2VUAB-Dzp3xxyo.js.map} +1 -1
  45. package/dist/static/assets/{chunk-55IACEB6-Dbe3sqC4.js → chunk-55IACEB6-CbmixuSI.js} +2 -2
  46. package/dist/static/assets/{chunk-55IACEB6-Dbe3sqC4.js.map → chunk-55IACEB6-CbmixuSI.js.map} +1 -1
  47. package/dist/static/assets/{chunk-B4BG7PRW-BHkSNS9y.js → chunk-B4BG7PRW-CdpmYjdb.js} +5 -5
  48. package/dist/static/assets/{chunk-B4BG7PRW-BHkSNS9y.js.map → chunk-B4BG7PRW-CdpmYjdb.js.map} +1 -1
  49. package/dist/static/assets/{chunk-DI55MBZ5-idwTV08g.js → chunk-DI55MBZ5-wBUIgR3h.js} +4 -4
  50. package/dist/static/assets/{chunk-DI55MBZ5-idwTV08g.js.map → chunk-DI55MBZ5-wBUIgR3h.js.map} +1 -1
  51. package/dist/static/assets/{chunk-FMBD7UC4-DLYv0YzD.js → chunk-FMBD7UC4-l62jcBz-.js} +2 -2
  52. package/dist/static/assets/{chunk-FMBD7UC4-DLYv0YzD.js.map → chunk-FMBD7UC4-l62jcBz-.js.map} +1 -1
  53. package/dist/static/assets/{chunk-QN33PNHL-DIC5_nYD.js → chunk-QN33PNHL-BXfKZUpE.js} +2 -2
  54. package/dist/static/assets/{chunk-QN33PNHL-DIC5_nYD.js.map → chunk-QN33PNHL-BXfKZUpE.js.map} +1 -1
  55. package/dist/static/assets/{chunk-QZHKN3VN-DM_s2fcN.js → chunk-QZHKN3VN-BYB4VxWj.js} +2 -2
  56. package/dist/static/assets/{chunk-QZHKN3VN-DM_s2fcN.js.map → chunk-QZHKN3VN-BYB4VxWj.js.map} +1 -1
  57. package/dist/static/assets/{chunk-TZMSLE5B-BjrSLFBO.js → chunk-TZMSLE5B-CvlWEnXl.js} +2 -2
  58. package/dist/static/assets/{chunk-TZMSLE5B-BjrSLFBO.js.map → chunk-TZMSLE5B-CvlWEnXl.js.map} +1 -1
  59. package/dist/static/assets/{classDiagram-2ON5EDUG-CSPkR9uh.js → classDiagram-2ON5EDUG-x2kw_AQY.js} +6 -6
  60. package/dist/static/assets/{classDiagram-2ON5EDUG-CSPkR9uh.js.map → classDiagram-2ON5EDUG-x2kw_AQY.js.map} +1 -1
  61. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CSPkR9uh.js → classDiagram-v2-WZHVMYZB-x2kw_AQY.js} +6 -6
  62. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CSPkR9uh.js.map → classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map} +1 -1
  63. package/dist/static/assets/{clone-DO2rSUBP.js → clone-CfBpi3MU.js} +2 -2
  64. package/dist/static/assets/{clone-DO2rSUBP.js.map → clone-CfBpi3MU.js.map} +1 -1
  65. package/dist/static/assets/{cose-bilkent-S5V4N54A-CyS4z2hF.js → cose-bilkent-S5V4N54A-DQSzPb7y.js} +2 -2
  66. package/dist/static/assets/{cose-bilkent-S5V4N54A-CyS4z2hF.js.map → cose-bilkent-S5V4N54A-DQSzPb7y.js.map} +1 -1
  67. package/dist/static/assets/{dagre-6UL2VRFP-CvybKTFb.js → dagre-6UL2VRFP-BuBo_U3J.js} +7 -7
  68. package/dist/static/assets/{dagre-6UL2VRFP-CvybKTFb.js.map → dagre-6UL2VRFP-BuBo_U3J.js.map} +1 -1
  69. package/dist/static/assets/{diagram-PSM6KHXK-Cl2rD6o-.js → diagram-PSM6KHXK-J2z13Z5A.js} +7 -7
  70. package/dist/static/assets/{diagram-PSM6KHXK-Cl2rD6o-.js.map → diagram-PSM6KHXK-J2z13Z5A.js.map} +1 -1
  71. package/dist/static/assets/{diagram-QEK2KX5R-RCrqu1G0.js → diagram-QEK2KX5R-x8XUGykE.js} +6 -6
  72. package/dist/static/assets/{diagram-QEK2KX5R-RCrqu1G0.js.map → diagram-QEK2KX5R-x8XUGykE.js.map} +1 -1
  73. package/dist/static/assets/{diagram-S2PKOQOG-BeHOCxq7.js → diagram-S2PKOQOG-BE6Nr1BM.js} +6 -6
  74. package/dist/static/assets/{diagram-S2PKOQOG-BeHOCxq7.js.map → diagram-S2PKOQOG-BE6Nr1BM.js.map} +1 -1
  75. package/dist/static/assets/{erDiagram-Q2GNP2WA-MdKfm7lU.js → erDiagram-Q2GNP2WA-D3qVnFAh.js} +5 -5
  76. package/dist/static/assets/{erDiagram-Q2GNP2WA-MdKfm7lU.js.map → erDiagram-Q2GNP2WA-D3qVnFAh.js.map} +1 -1
  77. package/dist/static/assets/{flowDiagram-NV44I4VS-DNo7ZxVC.js → flowDiagram-NV44I4VS-Cjp9Rt9t.js} +6 -6
  78. package/dist/static/assets/{flowDiagram-NV44I4VS-DNo7ZxVC.js.map → flowDiagram-NV44I4VS-Cjp9Rt9t.js.map} +1 -1
  79. package/dist/static/assets/{ganttDiagram-JELNMOA3-Bxs02jb2.js → ganttDiagram-JELNMOA3-D_hc66FC.js} +3 -3
  80. package/dist/static/assets/{ganttDiagram-JELNMOA3-Bxs02jb2.js.map → ganttDiagram-JELNMOA3-D_hc66FC.js.map} +1 -1
  81. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BJsaVPOp.js → gitGraphDiagram-NY62KEGX-1I_zaTtz.js} +7 -7
  82. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BJsaVPOp.js.map → gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map} +1 -1
  83. package/dist/static/assets/{graph-DBSDya0j.js → graph-K6mmQESm.js} +3 -3
  84. package/dist/static/assets/{graph-DBSDya0j.js.map → graph-K6mmQESm.js.map} +1 -1
  85. package/dist/static/assets/{index-gn-aSKfG.js → index-RV1MEt3b.js} +35 -34
  86. package/dist/static/assets/index-RV1MEt3b.js.map +1 -0
  87. package/dist/static/assets/{infoDiagram-WHAUD3N6-D4Hvl0bK.js → infoDiagram-WHAUD3N6-CqazW4ov.js} +5 -5
  88. package/dist/static/assets/{infoDiagram-WHAUD3N6-D4Hvl0bK.js.map → infoDiagram-WHAUD3N6-CqazW4ov.js.map} +1 -1
  89. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-B3YmIoCv.js → journeyDiagram-XKPGCS4Q-CCwUViz2.js} +5 -5
  90. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-B3YmIoCv.js.map → journeyDiagram-XKPGCS4Q-CCwUViz2.js.map} +1 -1
  91. package/dist/static/assets/{kanban-definition-3W4ZIXB7-dGCbR9Ty.js → kanban-definition-3W4ZIXB7-BKj9P06Z.js} +3 -3
  92. package/dist/static/assets/{kanban-definition-3W4ZIXB7-dGCbR9Ty.js.map → kanban-definition-3W4ZIXB7-BKj9P06Z.js.map} +1 -1
  93. package/dist/static/assets/{layout-D7y0xA6C.js → layout-BcrPlYah.js} +5 -5
  94. package/dist/static/assets/{layout-D7y0xA6C.js.map → layout-BcrPlYah.js.map} +1 -1
  95. package/dist/static/assets/{linear-Cep1oHAS.js → linear-DYXbzldi.js} +2 -2
  96. package/dist/static/assets/{linear-Cep1oHAS.js.map → linear-DYXbzldi.js.map} +1 -1
  97. package/dist/static/assets/{min-DWRXZ2qP.js → min-CAfJrdkg.js} +3 -3
  98. package/dist/static/assets/{min-DWRXZ2qP.js.map → min-CAfJrdkg.js.map} +1 -1
  99. package/dist/static/assets/{mindmap-definition-VGOIOE7T-FO6xgPgW.js → mindmap-definition-VGOIOE7T-CXWJYrd0.js} +4 -4
  100. package/dist/static/assets/{mindmap-definition-VGOIOE7T-FO6xgPgW.js.map → mindmap-definition-VGOIOE7T-CXWJYrd0.js.map} +1 -1
  101. package/dist/static/assets/{pieDiagram-ADFJNKIX-ChJaCst9.js → pieDiagram-ADFJNKIX-DjKlsPYr.js} +7 -7
  102. package/dist/static/assets/{pieDiagram-ADFJNKIX-ChJaCst9.js.map → pieDiagram-ADFJNKIX-DjKlsPYr.js.map} +1 -1
  103. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B8KuqHte.js → quadrantDiagram-AYHSOK5B-fcJtlyUO.js} +3 -3
  104. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B8KuqHte.js.map → quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map} +1 -1
  105. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DoJMxEmX.js → requirementDiagram-UZGBJVZJ-DmB9Ezaa.js} +4 -4
  106. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DoJMxEmX.js.map → requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map} +1 -1
  107. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CsLnys5W.js → sankeyDiagram-TZEHDZUN-CdGDwaMo.js} +2 -2
  108. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CsLnys5W.js.map → sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map} +1 -1
  109. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CT4FY3X1.js → sequenceDiagram-WL72ISMW-C-jiKkhi.js} +4 -4
  110. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CT4FY3X1.js.map → sequenceDiagram-WL72ISMW-C-jiKkhi.js.map} +1 -1
  111. package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3IXupz6.js → stateDiagram-FKZM4ZOC-M9808W5W.js} +9 -9
  112. package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3IXupz6.js.map → stateDiagram-FKZM4ZOC-M9808W5W.js.map} +1 -1
  113. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C80vDn17.js → stateDiagram-v2-4FDKWEC3-JE0YQyVh.js} +5 -5
  114. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C80vDn17.js.map → stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map} +1 -1
  115. package/dist/static/assets/{timeline-definition-IT6M3QCI-Bk2mvjhh.js → timeline-definition-IT6M3QCI-a2Rh8B62.js} +3 -3
  116. package/dist/static/assets/{timeline-definition-IT6M3QCI-Bk2mvjhh.js.map → timeline-definition-IT6M3QCI-a2Rh8B62.js.map} +1 -1
  117. package/dist/static/assets/{treemap-KMMF4GRG-mWi2Ai-0.js → treemap-KMMF4GRG-D3tvybuo.js} +4 -4
  118. package/dist/static/assets/{treemap-KMMF4GRG-mWi2Ai-0.js.map → treemap-KMMF4GRG-D3tvybuo.js.map} +1 -1
  119. package/dist/static/assets/{xychartDiagram-PRI3JC2R-B5-7mQpW.js → xychartDiagram-PRI3JC2R-kmwKLP3Y.js} +3 -3
  120. package/dist/static/assets/{xychartDiagram-PRI3JC2R-B5-7mQpW.js.map → xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map} +1 -1
  121. package/dist/static/index.html +1 -1
  122. package/dist/tools/context-health.js +7 -7
  123. package/dist/tools/env.js +11 -3
  124. package/dist/utils/task-doc.js +16 -16
  125. package/package.json +1 -1
  126. package/dist/minds/builtin/cmdr/persona.md +0 -3
  127. package/dist/minds/builtin/dijiang/knowledge.md +0 -287
  128. package/dist/minds/builtin/dijiang/persona.md +0 -7
  129. package/dist/static/assets/index-gn-aSKfG.js.map +0 -1
@@ -46,7 +46,7 @@ const fs = __importStar(require("node:fs/promises"));
46
46
  const path = __importStar(require("node:path"));
47
47
  const dialog_1 = require("./dialog");
48
48
  const dialog_run_state_1 = require("./dialog-run-state");
49
- const driver_1 = require("./llm/driver");
49
+ const driver_entry_1 = require("./llm/driver-entry");
50
50
  const log_1 = require("./log");
51
51
  const runtime_language_1 = require("./shared/runtime-language");
52
52
  const id_1 = require("./shared/utils/id");
@@ -57,8 +57,28 @@ const BASELINE_ENV_SNAPSHOT_CMD = 'uname -a';
57
57
  const PRIMING_VCS_SESSION_SLUG = 'rtws-vcs-inventory';
58
58
  const cacheByAgentId = new Map();
59
59
  const inflightByAgentId = new Map();
60
+ class AgentPrimingInterruptedError extends Error {
61
+ constructor(reason) {
62
+ super(`Agent Priming interrupted: ${reason}`);
63
+ this.name = 'AgentPrimingInterruptedError';
64
+ this.reason = reason;
65
+ }
66
+ }
67
+ function isAgentPrimingInterruptedError(error) {
68
+ return error instanceof AgentPrimingInterruptedError;
69
+ }
70
+ function throwIfAgentPrimingStopped(dlg, abortSignal) {
71
+ if (!abortSignal.aborted) {
72
+ return;
73
+ }
74
+ const reason = (0, dialog_run_state_1.getStopRequestedReason)(dlg.id);
75
+ if (reason === 'emergency_stop' || reason === 'user_stop') {
76
+ throw new AgentPrimingInterruptedError(reason);
77
+ }
78
+ throw new AgentPrimingInterruptedError('user_stop');
79
+ }
60
80
  async function emitSayingEventsAndPersist(dlg, content) {
61
- const calls = await (0, driver_1.emitSayingEvents)(dlg, content);
81
+ const calls = await (0, driver_entry_1.emitSayingEvents)(dlg, content);
62
82
  const genseq = dlg.activeGenSeqOrUndefined;
63
83
  if (dlg.generationStarted &&
64
84
  typeof genseq === 'number' &&
@@ -156,8 +176,23 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
156
176
  }
157
177
  // mode === 'do': wait for in-flight then run again for this dialog.
158
178
  if (options.mode === 'do') {
159
- return runAgentPrimingLive(dlg).then((next) => {
179
+ return runAgentPrimingLive(dlg)
180
+ .then((next) => {
160
181
  cacheByAgentId.set(agentId, next);
182
+ })
183
+ .catch((err) => {
184
+ if (isAgentPrimingInterruptedError(err)) {
185
+ log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
186
+ agentId,
187
+ reason: err.reason,
188
+ });
189
+ }
190
+ else {
191
+ log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, {
192
+ agentId,
193
+ });
194
+ }
195
+ return undefined;
161
196
  });
162
197
  }
163
198
  return Promise.resolve();
@@ -170,7 +205,15 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
170
205
  })
171
206
  .catch((err) => {
172
207
  // Best-effort: avoid unhandled rejections; the dialog itself is already marked interrupted.
173
- log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, { agentId });
208
+ if (isAgentPrimingInterruptedError(err)) {
209
+ log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
210
+ agentId,
211
+ reason: err.reason,
212
+ });
213
+ }
214
+ else {
215
+ log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, { agentId });
216
+ }
174
217
  return null;
175
218
  })
176
219
  .finally(() => {
@@ -834,7 +877,7 @@ function formatFbrTellaskBody(language, snapshotText, options) {
834
877
  ].join('\n');
835
878
  }
836
879
  async function generatePrimingNoteViaMainlineAgent(options) {
837
- const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrTellaskHead, fbrCallId, } = options;
880
+ const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrTellaskHead, fbrCallId, assertNotStopped, } = options;
838
881
  // Trigger a normal drive and rely on driver.ts context assembly.
839
882
  // Agent Priming must not trigger Diligence Push (“鞭策”); it should be best-effort
840
883
  // one-shot distillation with no keep-going injection.
@@ -949,13 +992,15 @@ async function generatePrimingNoteViaMainlineAgent(options) {
949
992
  ].join('\n');
950
993
  // IMPORTANT: this is an internal (non-persisted) prompt. driver.ts will inject it into
951
994
  // the LLM context for this drive only, without polluting dialog history.
952
- await (0, driver_1.driveDialogStream)(dlg, {
995
+ assertNotStopped?.();
996
+ await (0, driver_entry_1.driveDialogStream)(dlg, {
953
997
  content: internalPrompt,
954
998
  msgId: (0, id_1.generateShortId)(),
955
999
  grammar: 'markdown',
956
1000
  persistMode: 'internal',
957
1001
  skipTaskdoc: true,
958
1002
  }, true);
1003
+ assertNotStopped?.();
959
1004
  const afterMsgs = dlg.msgs.length;
960
1005
  if (afterMsgs <= beforeMsgs) {
961
1006
  throw new Error('Agent Priming distillation produced no new messages.');
@@ -1077,15 +1122,24 @@ function buildCoursePrefixMsgs(entry) {
1077
1122
  return out;
1078
1123
  }
1079
1124
  async function replayAgentPriming(dlg, entry) {
1125
+ const hadActiveRunBefore = (0, dialog_run_state_1.hasActiveRun)(dlg.id);
1126
+ const primingAbortSignal = (0, dialog_run_state_1.createActiveRun)(dlg.id);
1127
+ const ownsActiveRun = !hadActiveRunBefore;
1128
+ const assertNotStopped = () => {
1129
+ throwIfAgentPrimingStopped(dlg, primingAbortSignal);
1130
+ };
1080
1131
  const release = await dlg.acquire();
1132
+ let interruptedRunState = null;
1081
1133
  try {
1082
1134
  const language = (0, runtime_language_1.getWorkLanguage)();
1083
1135
  dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(entry));
1084
1136
  await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
1137
+ assertNotStopped();
1085
1138
  // Phase 1: shell ask (and optional prelude intro)
1086
1139
  let shellCallId = null;
1087
1140
  let shellTellaskHead = null;
1088
1141
  try {
1142
+ assertNotStopped();
1089
1143
  await dlg.notifyGeneratingStart();
1090
1144
  await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, true, entry.shellPolicy, entry.shell.kind === 'specialist_tellask' ? entry.shell.specialistId : null));
1091
1145
  if (entry.shell.kind === 'specialist_tellask') {
@@ -1115,6 +1169,7 @@ async function replayAgentPriming(dlg, entry) {
1115
1169
  }
1116
1170
  // Phase 2: shell response (separate bubble)
1117
1171
  if (entry.shell.kind === 'specialist_tellask' && shellCallId && shellTellaskHead) {
1172
+ assertNotStopped();
1118
1173
  await dlg.receiveTeammateResponse(entry.shell.specialistId, shellTellaskHead, 'completed', dlg.id, {
1119
1174
  response: entry.shell.responseText,
1120
1175
  agentId: entry.shell.specialistId,
@@ -1129,6 +1184,7 @@ async function replayAgentPriming(dlg, entry) {
1129
1184
  let round2CallId = null;
1130
1185
  let round2TellaskHead = null;
1131
1186
  try {
1187
+ assertNotStopped();
1132
1188
  await dlg.notifyGeneratingStart();
1133
1189
  const round1Content = [
1134
1190
  `!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
@@ -1151,6 +1207,7 @@ async function replayAgentPriming(dlg, entry) {
1151
1207
  }
1152
1208
  }
1153
1209
  if (round1CallId && round1TellaskHead) {
1210
+ assertNotStopped();
1154
1211
  await dlg.receiveTeammateResponse(entry.vcs.specialistId, round1TellaskHead, 'completed', dlg.id, {
1155
1212
  response: entry.vcs.round1.responseText,
1156
1213
  agentId: entry.vcs.specialistId,
@@ -1159,6 +1216,7 @@ async function replayAgentPriming(dlg, entry) {
1159
1216
  });
1160
1217
  }
1161
1218
  try {
1219
+ assertNotStopped();
1162
1220
  await dlg.notifyGeneratingStart();
1163
1221
  const round2Content = [
1164
1222
  `!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
@@ -1181,6 +1239,7 @@ async function replayAgentPriming(dlg, entry) {
1181
1239
  }
1182
1240
  }
1183
1241
  if (round2CallId && round2TellaskHead) {
1242
+ assertNotStopped();
1184
1243
  await dlg.receiveTeammateResponse(entry.vcs.specialistId, round2TellaskHead, 'completed', dlg.id, {
1185
1244
  response: entry.vcs.round2.responseText,
1186
1245
  agentId: entry.vcs.specialistId,
@@ -1191,6 +1250,7 @@ async function replayAgentPriming(dlg, entry) {
1191
1250
  }
1192
1251
  else {
1193
1252
  try {
1253
+ assertNotStopped();
1194
1254
  await dlg.notifyGeneratingStart();
1195
1255
  await emitSayingEventsAndPersist(dlg, entry.vcs.round1NoteMarkdown);
1196
1256
  }
@@ -1203,6 +1263,7 @@ async function replayAgentPriming(dlg, entry) {
1203
1263
  }
1204
1264
  }
1205
1265
  try {
1266
+ assertNotStopped();
1206
1267
  await dlg.notifyGeneratingStart();
1207
1268
  await emitSayingEventsAndPersist(dlg, entry.vcs.round2NoteMarkdown);
1208
1269
  }
@@ -1221,6 +1282,7 @@ async function replayAgentPriming(dlg, entry) {
1221
1282
  const effort = Math.max(0, Math.floor(entry.fbr.effort));
1222
1283
  if (effort >= 1 && entry.fbr.responses.length > 0) {
1223
1284
  try {
1285
+ assertNotStopped();
1224
1286
  await dlg.notifyGeneratingStart();
1225
1287
  const fbrCallBody = [entry.fbr.selfTeaser, '', entry.fbr.tellaskBody].join('\n');
1226
1288
  const fbrCallContent = [
@@ -1248,6 +1310,7 @@ async function replayAgentPriming(dlg, entry) {
1248
1310
  const normalized = Math.max(1, effort);
1249
1311
  const responses = entry.fbr.responses.slice(0, normalized);
1250
1312
  for (let i = 0; i < responses.length; i++) {
1313
+ assertNotStopped();
1251
1314
  const raw = responses[i] ?? '';
1252
1315
  await dlg.receiveTeammateResponse(entry.fbr.responderAgentId, fbrTellaskHead, 'completed', dlg.id, {
1253
1316
  response: raw,
@@ -1260,6 +1323,7 @@ async function replayAgentPriming(dlg, entry) {
1260
1323
  }
1261
1324
  // Phase 5: summary bubble
1262
1325
  try {
1326
+ assertNotStopped();
1263
1327
  await dlg.notifyGeneratingStart();
1264
1328
  await emitSayingEventsAndPersist(dlg, entry.primingNote);
1265
1329
  }
@@ -1273,25 +1337,55 @@ async function replayAgentPriming(dlg, entry) {
1273
1337
  }
1274
1338
  }
1275
1339
  catch (err) {
1276
- log_1.log.warn('Agent Priming replay failed (best-effort)', err, { dialogId: dlg.id.valueOf() });
1340
+ if (isAgentPrimingInterruptedError(err)) {
1341
+ interruptedRunState = {
1342
+ kind: 'interrupted',
1343
+ reason: { kind: err.reason },
1344
+ };
1345
+ log_1.log.info('Agent Priming replay interrupted by stop request', undefined, {
1346
+ dialogId: dlg.id.valueOf(),
1347
+ reason: err.reason,
1348
+ });
1349
+ }
1350
+ else {
1351
+ log_1.log.warn('Agent Priming replay failed (best-effort)', err, { dialogId: dlg.id.valueOf() });
1352
+ }
1277
1353
  }
1278
1354
  finally {
1279
- let nextIdle = { kind: 'idle_waiting_user' };
1280
1355
  try {
1281
- nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
1356
+ if (interruptedRunState) {
1357
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, interruptedRunState);
1358
+ }
1359
+ else {
1360
+ let nextIdle = { kind: 'idle_waiting_user' };
1361
+ try {
1362
+ nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
1363
+ }
1364
+ catch (err) {
1365
+ log_1.log.warn('Failed to compute idle runState after Agent Priming replay; falling back', err, {
1366
+ dialogId: dlg.id.valueOf(),
1367
+ });
1368
+ }
1369
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
1370
+ }
1282
1371
  }
1283
- catch (err) {
1284
- log_1.log.warn('Failed to compute idle runState after Agent Priming replay; falling back', err, {
1285
- dialogId: dlg.id.valueOf(),
1286
- });
1372
+ finally {
1373
+ if (ownsActiveRun) {
1374
+ (0, dialog_run_state_1.clearActiveRun)(dlg.id);
1375
+ }
1376
+ release();
1287
1377
  }
1288
- await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
1289
- release();
1290
1378
  }
1291
1379
  }
1292
1380
  async function runAgentPrimingLive(dlg) {
1293
1381
  const createdAt = (0, time_1.formatUnifiedTimestamp)(new Date());
1294
1382
  const language = (0, runtime_language_1.getWorkLanguage)();
1383
+ const hadActiveRunBefore = (0, dialog_run_state_1.hasActiveRun)(dlg.id);
1384
+ const primingAbortSignal = (0, dialog_run_state_1.createActiveRun)(dlg.id);
1385
+ const ownsActiveRun = !hadActiveRunBefore;
1386
+ const assertNotStopped = () => {
1387
+ throwIfAgentPrimingStopped(dlg, primingAbortSignal);
1388
+ };
1295
1389
  const prevDisableDiligencePush = dlg.disableDiligencePush;
1296
1390
  // Agent Priming is a bounded bootstrap routine; no keep-going injection should appear
1297
1391
  // during the priming lifecycle (including any auto-revive drives triggered by subdialog replies).
@@ -1319,7 +1413,9 @@ async function runAgentPrimingLive(dlg) {
1319
1413
  const fbrResponsesForInjection = [];
1320
1414
  try {
1321
1415
  await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
1416
+ assertNotStopped();
1322
1417
  const team = await team_1.Team.load();
1418
+ assertNotStopped();
1323
1419
  const member = team.getMember(dlg.agentId);
1324
1420
  const specialists = team.shellSpecialists
1325
1421
  .filter((s) => typeof s === 'string')
@@ -1339,6 +1435,7 @@ async function runAgentPrimingLive(dlg) {
1339
1435
  // Phase 1: shell ask (and optional prelude intro)
1340
1436
  if (shellPolicy === 'specialist_only' && specialistId !== null) {
1341
1437
  shellTellaskBody = formatShellTellaskBody(language, specialistId);
1438
+ assertNotStopped();
1342
1439
  await dlg.withLock(async () => {
1343
1440
  try {
1344
1441
  await dlg.notifyGeneratingStart();
@@ -1372,6 +1469,7 @@ async function runAgentPrimingLive(dlg) {
1372
1469
  // In both cases we skip the shell Tellask step and let the runtime capture a baseline snapshot.
1373
1470
  // Keep it safe and deterministic: no network, no writes.
1374
1471
  const unameOutput = await runUnameA();
1472
+ assertNotStopped();
1375
1473
  shellResponseText = unameOutput;
1376
1474
  snapshotText = unameOutput;
1377
1475
  const directNote = (() => {
@@ -1401,6 +1499,7 @@ async function runAgentPrimingLive(dlg) {
1401
1499
  ].join('\n');
1402
1500
  })();
1403
1501
  directNoteMarkdown = directNote;
1502
+ assertNotStopped();
1404
1503
  await dlg.withLock(async () => {
1405
1504
  try {
1406
1505
  await dlg.notifyGeneratingStart();
@@ -1435,6 +1534,7 @@ async function runAgentPrimingLive(dlg) {
1435
1534
  throw new Error('Missing shell tellaskHead');
1436
1535
  }
1437
1536
  const tellaskBody = shellTellaskBodyForSubdialog ?? shellTellaskBody;
1537
+ assertNotStopped();
1438
1538
  const sub = await dlg.withLock(async () => {
1439
1539
  return await dlg.createSubDialog(ensuredSpecialistId, ensuredShellTellaskHead, tellaskBody, {
1440
1540
  originMemberId: dlg.agentId,
@@ -1451,7 +1551,8 @@ async function runAgentPrimingLive(dlg) {
1451
1551
  language,
1452
1552
  collectiveTargets: [ensuredSpecialistId],
1453
1553
  });
1454
- await (0, driver_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown', skipTaskdoc: true }, true);
1554
+ await (0, driver_entry_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown', skipTaskdoc: true }, true);
1555
+ assertNotStopped();
1455
1556
  shellResponseText = extractLastAssistantSaying(sub.msgs);
1456
1557
  const toolResult = extractLastShellCmdResultText(sub.msgs);
1457
1558
  snapshotText = toolResult ? toolResult : shellResponseText;
@@ -1459,7 +1560,9 @@ async function runAgentPrimingLive(dlg) {
1459
1560
  // Specialist produced no usable output (misconfigured tools, provider issues, etc.).
1460
1561
  // Fall back to a runtime-executed `uname -a` so we can still proceed to FBR.
1461
1562
  snapshotText = await runUnameA();
1563
+ assertNotStopped();
1462
1564
  }
1565
+ assertNotStopped();
1463
1566
  await dlg.withLock(async () => {
1464
1567
  await dlg.receiveTeammateResponse(ensuredSpecialistId, ensuredShellTellaskHead, 'completed', sub.id, {
1465
1568
  response: shellResponseText,
@@ -1503,6 +1606,7 @@ async function runAgentPrimingLive(dlg) {
1503
1606
  }
1504
1607
  }
1505
1608
  });
1609
+ assertNotStopped();
1506
1610
  const round1Sub = await dlg.withLock(async () => {
1507
1611
  return await dlg.createSubDialog(ensuredSpecialistId, round1TellaskHead, round1TellaskBodyForSubdialog || vcsRound1Body, {
1508
1612
  originMemberId: dlg.agentId,
@@ -1514,6 +1618,7 @@ async function runAgentPrimingLive(dlg) {
1514
1618
  });
1515
1619
  const rootDialog = dlg instanceof dialog_1.RootDialog ? dlg : dlg instanceof dialog_1.SubDialog ? dlg.rootDialog : undefined;
1516
1620
  if (rootDialog) {
1621
+ assertNotStopped();
1517
1622
  rootDialog.registerSubdialog(round1Sub);
1518
1623
  await rootDialog.saveSubdialogRegistry();
1519
1624
  }
@@ -1525,16 +1630,18 @@ async function runAgentPrimingLive(dlg) {
1525
1630
  language,
1526
1631
  collectiveTargets: [ensuredSpecialistId],
1527
1632
  });
1528
- await (0, driver_1.driveDialogStream)(round1Sub, {
1633
+ await (0, driver_entry_1.driveDialogStream)(round1Sub, {
1529
1634
  content: round1Prompt,
1530
1635
  msgId: (0, id_1.generateShortId)(),
1531
1636
  grammar: 'markdown',
1532
1637
  skipTaskdoc: true,
1533
1638
  }, true);
1639
+ assertNotStopped();
1534
1640
  vcsRound1ResponseText = extractLastAssistantSaying(round1Sub.msgs).trim();
1535
1641
  if (!vcsRound1ResponseText) {
1536
1642
  throw new Error('Specialist VCS session round-1 returned empty output');
1537
1643
  }
1644
+ assertNotStopped();
1538
1645
  await dlg.withLock(async () => {
1539
1646
  await dlg.receiveTeammateResponse(ensuredSpecialistId, round1TellaskHead, 'completed', round1Sub.id, {
1540
1647
  response: vcsRound1ResponseText,
@@ -1581,16 +1688,18 @@ async function runAgentPrimingLive(dlg) {
1581
1688
  language,
1582
1689
  collectiveTargets: [ensuredSpecialistId],
1583
1690
  });
1584
- await (0, driver_1.driveDialogStream)(round1Sub, {
1691
+ await (0, driver_entry_1.driveDialogStream)(round1Sub, {
1585
1692
  content: round2Prompt,
1586
1693
  msgId: (0, id_1.generateShortId)(),
1587
1694
  grammar: 'markdown',
1588
1695
  skipTaskdoc: true,
1589
1696
  }, true);
1697
+ assertNotStopped();
1590
1698
  vcsRound2ResponseText = extractLastAssistantSaying(round1Sub.msgs).trim();
1591
1699
  if (!vcsRound2ResponseText) {
1592
1700
  throw new Error('Specialist VCS session round-2 returned empty output');
1593
1701
  }
1702
+ assertNotStopped();
1594
1703
  await dlg.withLock(async () => {
1595
1704
  await dlg.receiveTeammateResponse(ensuredSpecialistId, round2TellaskHead, 'completed', round1Sub.id, {
1596
1705
  response: vcsRound2ResponseText,
@@ -1609,6 +1718,7 @@ async function runAgentPrimingLive(dlg) {
1609
1718
  }
1610
1719
  }
1611
1720
  const runtimeInventory = await collectRtwsGitInventory();
1721
+ assertNotStopped();
1612
1722
  const runtimeRound1Text = formatRtwsGitInventoryRound1(language, runtimeInventory);
1613
1723
  const runtimeRound2Text = formatRtwsGitInventoryRound2(language, runtimeInventory);
1614
1724
  const runtimeInventoryText = [runtimeRound1Text, '', runtimeRound2Text].join('\n');
@@ -1630,6 +1740,7 @@ async function runAgentPrimingLive(dlg) {
1630
1740
  vcsRound1NoteMarkdown = formatRuntimeVcsRoundNote(language, 1, vcsRound1ResponseText);
1631
1741
  vcsRound2NoteMarkdown = formatRuntimeVcsRoundNote(language, 2, vcsRound2ResponseText);
1632
1742
  vcsInventoryText = runtimeInventoryText;
1743
+ assertNotStopped();
1633
1744
  await dlg.withLock(async () => {
1634
1745
  try {
1635
1746
  await dlg.notifyGeneratingStart();
@@ -1644,6 +1755,7 @@ async function runAgentPrimingLive(dlg) {
1644
1755
  }
1645
1756
  }
1646
1757
  });
1758
+ assertNotStopped();
1647
1759
  await dlg.withLock(async () => {
1648
1760
  try {
1649
1761
  await dlg.notifyGeneratingStart();
@@ -1683,6 +1795,7 @@ async function runAgentPrimingLive(dlg) {
1683
1795
  let fbrTellaskHead = null;
1684
1796
  // Phase 3: FBR ask (call bubble)
1685
1797
  if (fbrEffort >= 1) {
1798
+ assertNotStopped();
1686
1799
  await dlg.withLock(async () => {
1687
1800
  try {
1688
1801
  await dlg.notifyGeneratingStart();
@@ -1718,6 +1831,7 @@ async function runAgentPrimingLive(dlg) {
1718
1831
  const ensuredFbrTellaskHead = fbrTellaskHead;
1719
1832
  const perInstance = Array.from({ length: fbrEffort }, (_, idx) => idx + 1);
1720
1833
  const created = await Promise.all(perInstance.map(async (i) => {
1834
+ assertNotStopped();
1721
1835
  const instanceBody = fbrEffort > 1
1722
1836
  ? [
1723
1837
  fbrCallBody,
@@ -1727,6 +1841,7 @@ async function runAgentPrimingLive(dlg) {
1727
1841
  : 'Hint: try to provide a distinct angle vs other FBR drafts (e.g. security/constraints/verifiability/risk).',
1728
1842
  ].join('\n')
1729
1843
  : fbrCallBody;
1844
+ assertNotStopped();
1730
1845
  const sub = await dlg.withLock(async () => {
1731
1846
  return await dlg.createSubDialog(dlg.agentId, ensuredFbrTellaskHead, instanceBody, {
1732
1847
  originMemberId: dlg.agentId,
@@ -1743,16 +1858,19 @@ async function runAgentPrimingLive(dlg) {
1743
1858
  language,
1744
1859
  collectiveTargets: [dlg.agentId],
1745
1860
  });
1746
- await (0, driver_1.driveDialogStream)(sub, {
1861
+ await (0, driver_entry_1.driveDialogStream)(sub, {
1747
1862
  content: initPrompt,
1748
1863
  msgId: (0, id_1.generateShortId)(),
1749
1864
  grammar: 'markdown',
1750
1865
  skipTaskdoc: true,
1751
1866
  }, true);
1867
+ assertNotStopped();
1752
1868
  const responseText = extractLastAssistantSaying(sub.msgs);
1753
1869
  return { sub, responseText };
1754
1870
  }));
1871
+ assertNotStopped();
1755
1872
  for (const r of created) {
1873
+ assertNotStopped();
1756
1874
  const responseText = r.responseText;
1757
1875
  fbrResponsesForCache.push(responseText);
1758
1876
  fbrResponsesForInjection.push({ subdialogId: r.sub.id.selfId, response: responseText });
@@ -1783,7 +1901,9 @@ async function runAgentPrimingLive(dlg) {
1783
1901
  fbrResponses: fbrResponsesForInjection,
1784
1902
  fbrTellaskHead: fbrTellaskHead,
1785
1903
  fbrCallId: fbrCallId,
1904
+ assertNotStopped,
1786
1905
  });
1906
+ assertNotStopped();
1787
1907
  const entry = {
1788
1908
  createdAt,
1789
1909
  workLanguage: language,
@@ -1844,6 +1964,17 @@ async function runAgentPrimingLive(dlg) {
1844
1964
  return entry;
1845
1965
  }
1846
1966
  catch (err) {
1967
+ if (isAgentPrimingInterruptedError(err)) {
1968
+ fatalRunState = {
1969
+ kind: 'interrupted',
1970
+ reason: { kind: err.reason },
1971
+ };
1972
+ log_1.log.info('Agent Priming live run interrupted by stop request', undefined, {
1973
+ dialogId: dlg.id.valueOf(),
1974
+ reason: err.reason,
1975
+ });
1976
+ throw err;
1977
+ }
1847
1978
  const errText = err instanceof Error ? (err.stack ?? err.message) : String(err);
1848
1979
  const errTextTrimmed = errText.trim().slice(0, 4000);
1849
1980
  fatalRunState = {
@@ -1882,20 +2013,27 @@ async function runAgentPrimingLive(dlg) {
1882
2013
  }
1883
2014
  finally {
1884
2015
  dlg.disableDiligencePush = prevDisableDiligencePush;
1885
- if (fatalRunState) {
1886
- await (0, dialog_run_state_1.setDialogRunState)(dlg.id, fatalRunState);
1887
- }
1888
- else {
1889
- let nextIdle = { kind: 'idle_waiting_user' };
1890
- try {
1891
- nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
2016
+ try {
2017
+ if (fatalRunState) {
2018
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, fatalRunState);
1892
2019
  }
1893
- catch (err) {
1894
- log_1.log.warn('Failed to compute idle runState after Agent Priming live run; falling back', err, {
1895
- dialogId: dlg.id.valueOf(),
1896
- });
2020
+ else {
2021
+ let nextIdle = { kind: 'idle_waiting_user' };
2022
+ try {
2023
+ nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
2024
+ }
2025
+ catch (err) {
2026
+ log_1.log.warn('Failed to compute idle runState after Agent Priming live run; falling back', err, {
2027
+ dialogId: dlg.id.valueOf(),
2028
+ });
2029
+ }
2030
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
2031
+ }
2032
+ }
2033
+ finally {
2034
+ if (ownsActiveRun) {
2035
+ (0, dialog_run_state_1.clearActiveRun)(dlg.id);
1897
2036
  }
1898
- await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
1899
2037
  }
1900
2038
  }
1901
2039
  }