dominds 0.6.0 → 0.6.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 (135) hide show
  1. package/dist/agent-priming.js +1157 -0
  2. package/dist/dialog.js +14 -1
  3. package/dist/docs/OEC-philosophy.md +1 -1
  4. package/dist/docs/OEC-philosophy.zh.md +1 -1
  5. package/dist/docs/context-health.zh.md +1 -1
  6. package/dist/docs/design.md +1 -1
  7. package/dist/docs/design.zh.md +35 -33
  8. package/dist/docs/dialog-persistence.md +2 -0
  9. package/dist/docs/dialog-persistence.zh.md +12 -11
  10. package/dist/docs/dialog-system.md +6 -5
  11. package/dist/docs/dialog-system.zh.md +7 -6
  12. package/dist/docs/dominds-agent-priming.md +52 -14
  13. package/dist/docs/dominds-agent-priming.zh.md +34 -5
  14. package/dist/docs/dominds-terminology.md +5 -2
  15. package/dist/docs/encapsulated-taskdoc.md +1 -0
  16. package/dist/docs/encapsulated-taskdoc.zh.md +27 -25
  17. package/dist/docs/fbr.md +2 -2
  18. package/dist/docs/fbr.zh.md +2 -2
  19. package/dist/docs/memory-system.md +4 -0
  20. package/dist/docs/memory-system.zh.md +4 -0
  21. package/dist/docs/mottos.md +1 -1
  22. package/dist/docs/mottos.zh.md +1 -1
  23. package/dist/docs/roadmap.md +1 -1
  24. package/dist/docs/roadmap.zh.md +1 -1
  25. package/dist/docs/team-mgmt-toolset.md +1 -1
  26. package/dist/docs/team-mgmt-toolset.zh.md +1 -1
  27. package/dist/llm/defaults.yaml +14 -0
  28. package/dist/llm/driver.js +57 -28
  29. package/dist/minds/builtin/cmdr/persona.md +3 -0
  30. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  31. package/dist/minds/builtin/dijiang/persona.md +7 -0
  32. package/dist/server/api-routes.js +10 -10
  33. package/dist/server/websocket-handler.js +16 -14
  34. package/dist/showing-by-doing.js +31 -34
  35. package/dist/static/assets/{_baseUniq-CpmoaIMo.js → _baseUniq-CdB0UAgK.js} +2 -2
  36. package/dist/static/assets/{_baseUniq-CpmoaIMo.js.map → _baseUniq-CdB0UAgK.js.map} +1 -1
  37. package/dist/static/assets/{arc-DfJ83cYY.js → arc-DzvddRQ8.js} +2 -2
  38. package/dist/static/assets/{arc-DfJ83cYY.js.map → arc-DzvddRQ8.js.map} +1 -1
  39. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CS3hogoi.js → architectureDiagram-VXUJARFQ-DXpAGpo_.js} +6 -6
  40. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CS3hogoi.js.map → architectureDiagram-VXUJARFQ-DXpAGpo_.js.map} +1 -1
  41. package/dist/static/assets/{blockDiagram-VD42YOAC-Cy7cUCcT.js → blockDiagram-VD42YOAC-D8upIIKs.js} +7 -7
  42. package/dist/static/assets/{blockDiagram-VD42YOAC-Cy7cUCcT.js.map → blockDiagram-VD42YOAC-D8upIIKs.js.map} +1 -1
  43. package/dist/static/assets/{c4Diagram-YG6GDRKO-BZGMy5fJ.js → c4Diagram-YG6GDRKO-XYcmFpvc.js} +3 -3
  44. package/dist/static/assets/{c4Diagram-YG6GDRKO-BZGMy5fJ.js.map → c4Diagram-YG6GDRKO-XYcmFpvc.js.map} +1 -1
  45. package/dist/static/assets/{channel-B2qLXPmT.js → channel-BDUHM2yY.js} +2 -2
  46. package/dist/static/assets/{channel-B2qLXPmT.js.map → channel-BDUHM2yY.js.map} +1 -1
  47. package/dist/static/assets/{chunk-4BX2VUAB-BXCjFvfq.js → chunk-4BX2VUAB-DTaYhH1x.js} +2 -2
  48. package/dist/static/assets/{chunk-4BX2VUAB-BXCjFvfq.js.map → chunk-4BX2VUAB-DTaYhH1x.js.map} +1 -1
  49. package/dist/static/assets/{chunk-55IACEB6-D40UbVtI.js → chunk-55IACEB6-CgwCmhBR.js} +2 -2
  50. package/dist/static/assets/{chunk-55IACEB6-D40UbVtI.js.map → chunk-55IACEB6-CgwCmhBR.js.map} +1 -1
  51. package/dist/static/assets/{chunk-B4BG7PRW-Ap0xoc4g.js → chunk-B4BG7PRW-CAqVo_tL.js} +5 -5
  52. package/dist/static/assets/{chunk-B4BG7PRW-Ap0xoc4g.js.map → chunk-B4BG7PRW-CAqVo_tL.js.map} +1 -1
  53. package/dist/static/assets/{chunk-DI55MBZ5-BUw_o642.js → chunk-DI55MBZ5-CjQ02SRS.js} +4 -4
  54. package/dist/static/assets/{chunk-DI55MBZ5-BUw_o642.js.map → chunk-DI55MBZ5-CjQ02SRS.js.map} +1 -1
  55. package/dist/static/assets/{chunk-FMBD7UC4-15SP1drI.js → chunk-FMBD7UC4-B9Ur6YX_.js} +2 -2
  56. package/dist/static/assets/{chunk-FMBD7UC4-15SP1drI.js.map → chunk-FMBD7UC4-B9Ur6YX_.js.map} +1 -1
  57. package/dist/static/assets/{chunk-QN33PNHL-esRQTIZP.js → chunk-QN33PNHL-D0kd9M0c.js} +2 -2
  58. package/dist/static/assets/{chunk-QN33PNHL-esRQTIZP.js.map → chunk-QN33PNHL-D0kd9M0c.js.map} +1 -1
  59. package/dist/static/assets/{chunk-QZHKN3VN-72Dk00x0.js → chunk-QZHKN3VN-2MoC4DXd.js} +2 -2
  60. package/dist/static/assets/{chunk-QZHKN3VN-72Dk00x0.js.map → chunk-QZHKN3VN-2MoC4DXd.js.map} +1 -1
  61. package/dist/static/assets/{chunk-TZMSLE5B-BJS5YoPO.js → chunk-TZMSLE5B-DC4kqLSc.js} +2 -2
  62. package/dist/static/assets/{chunk-TZMSLE5B-BJS5YoPO.js.map → chunk-TZMSLE5B-DC4kqLSc.js.map} +1 -1
  63. package/dist/static/assets/{classDiagram-2ON5EDUG-ama2RyKt.js → classDiagram-2ON5EDUG-CA53tL8Y.js} +6 -6
  64. package/dist/static/assets/{classDiagram-2ON5EDUG-ama2RyKt.js.map → classDiagram-2ON5EDUG-CA53tL8Y.js.map} +1 -1
  65. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-ama2RyKt.js → classDiagram-v2-WZHVMYZB-CA53tL8Y.js} +6 -6
  66. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-ama2RyKt.js.map → classDiagram-v2-WZHVMYZB-CA53tL8Y.js.map} +1 -1
  67. package/dist/static/assets/{clone-CEStzIEJ.js → clone-D10XJcB7.js} +2 -2
  68. package/dist/static/assets/{clone-CEStzIEJ.js.map → clone-D10XJcB7.js.map} +1 -1
  69. package/dist/static/assets/{cose-bilkent-S5V4N54A-DvG_gaNr.js → cose-bilkent-S5V4N54A-39I71Yde.js} +2 -2
  70. package/dist/static/assets/{cose-bilkent-S5V4N54A-DvG_gaNr.js.map → cose-bilkent-S5V4N54A-39I71Yde.js.map} +1 -1
  71. package/dist/static/assets/{dagre-6UL2VRFP-BLLeQfN7.js → dagre-6UL2VRFP-DuZkoGVW.js} +7 -7
  72. package/dist/static/assets/{dagre-6UL2VRFP-BLLeQfN7.js.map → dagre-6UL2VRFP-DuZkoGVW.js.map} +1 -1
  73. package/dist/static/assets/{diagram-PSM6KHXK-CiQUKiSQ.js → diagram-PSM6KHXK-B4zg4A9D.js} +7 -7
  74. package/dist/static/assets/{diagram-PSM6KHXK-CiQUKiSQ.js.map → diagram-PSM6KHXK-B4zg4A9D.js.map} +1 -1
  75. package/dist/static/assets/{diagram-QEK2KX5R-Cumwavr8.js → diagram-QEK2KX5R-DTh1CpN4.js} +6 -6
  76. package/dist/static/assets/{diagram-QEK2KX5R-Cumwavr8.js.map → diagram-QEK2KX5R-DTh1CpN4.js.map} +1 -1
  77. package/dist/static/assets/{diagram-S2PKOQOG-DfNKPbo-.js → diagram-S2PKOQOG-DfmK3kZC.js} +6 -6
  78. package/dist/static/assets/{diagram-S2PKOQOG-DfNKPbo-.js.map → diagram-S2PKOQOG-DfmK3kZC.js.map} +1 -1
  79. package/dist/static/assets/{erDiagram-Q2GNP2WA-D0uRhAGb.js → erDiagram-Q2GNP2WA-1w_Cysul.js} +5 -5
  80. package/dist/static/assets/{erDiagram-Q2GNP2WA-D0uRhAGb.js.map → erDiagram-Q2GNP2WA-1w_Cysul.js.map} +1 -1
  81. package/dist/static/assets/{flowDiagram-NV44I4VS-DYdwbihk.js → flowDiagram-NV44I4VS-Bzgk9sGv.js} +6 -6
  82. package/dist/static/assets/{flowDiagram-NV44I4VS-DYdwbihk.js.map → flowDiagram-NV44I4VS-Bzgk9sGv.js.map} +1 -1
  83. package/dist/static/assets/{ganttDiagram-JELNMOA3-B5uGOn1N.js → ganttDiagram-JELNMOA3-CpWs7Bqw.js} +3 -3
  84. package/dist/static/assets/{ganttDiagram-JELNMOA3-B5uGOn1N.js.map → ganttDiagram-JELNMOA3-CpWs7Bqw.js.map} +1 -1
  85. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-Oc3oOKiS.js → gitGraphDiagram-NY62KEGX-CX3Pr3Lw.js} +7 -7
  86. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-Oc3oOKiS.js.map → gitGraphDiagram-NY62KEGX-CX3Pr3Lw.js.map} +1 -1
  87. package/dist/static/assets/{graph-CsabhqEi.js → graph-4vWTdc8T.js} +3 -3
  88. package/dist/static/assets/{graph-CsabhqEi.js.map → graph-4vWTdc8T.js.map} +1 -1
  89. package/dist/static/assets/{index-CfaquUkU.js → index-ChfJPJuY.js} +88 -79
  90. package/dist/static/assets/index-ChfJPJuY.js.map +1 -0
  91. package/dist/static/assets/{infoDiagram-WHAUD3N6-DrhpU5D2.js → infoDiagram-WHAUD3N6-C5hXxuBR.js} +5 -5
  92. package/dist/static/assets/{infoDiagram-WHAUD3N6-DrhpU5D2.js.map → infoDiagram-WHAUD3N6-C5hXxuBR.js.map} +1 -1
  93. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BvHx2Zb6.js → journeyDiagram-XKPGCS4Q-Dq2J-M1J.js} +5 -5
  94. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BvHx2Zb6.js.map → journeyDiagram-XKPGCS4Q-Dq2J-M1J.js.map} +1 -1
  95. package/dist/static/assets/{kanban-definition-3W4ZIXB7-CVIVr87P.js → kanban-definition-3W4ZIXB7-DA_VkoCc.js} +3 -3
  96. package/dist/static/assets/{kanban-definition-3W4ZIXB7-CVIVr87P.js.map → kanban-definition-3W4ZIXB7-DA_VkoCc.js.map} +1 -1
  97. package/dist/static/assets/{layout-Cyi7AY0P.js → layout-LD5CBmsH.js} +5 -5
  98. package/dist/static/assets/{layout-Cyi7AY0P.js.map → layout-LD5CBmsH.js.map} +1 -1
  99. package/dist/static/assets/{linear-CNMZZ9Q3.js → linear-D4067JKp.js} +2 -2
  100. package/dist/static/assets/{linear-CNMZZ9Q3.js.map → linear-D4067JKp.js.map} +1 -1
  101. package/dist/static/assets/{min-zA3pn88k.js → min-BpJsREdr.js} +3 -3
  102. package/dist/static/assets/{min-zA3pn88k.js.map → min-BpJsREdr.js.map} +1 -1
  103. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CDoN9L2P.js → mindmap-definition-VGOIOE7T-DlL2mol_.js} +4 -4
  104. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CDoN9L2P.js.map → mindmap-definition-VGOIOE7T-DlL2mol_.js.map} +1 -1
  105. package/dist/static/assets/{pieDiagram-ADFJNKIX-DDqyS0g6.js → pieDiagram-ADFJNKIX-CaRK34pF.js} +7 -7
  106. package/dist/static/assets/{pieDiagram-ADFJNKIX-DDqyS0g6.js.map → pieDiagram-ADFJNKIX-CaRK34pF.js.map} +1 -1
  107. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DroeWtc0.js → quadrantDiagram-AYHSOK5B-CnCFWXFo.js} +3 -3
  108. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DroeWtc0.js.map → quadrantDiagram-AYHSOK5B-CnCFWXFo.js.map} +1 -1
  109. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DF6-86F6.js → requirementDiagram-UZGBJVZJ-C6m8xSKV.js} +4 -4
  110. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DF6-86F6.js.map → requirementDiagram-UZGBJVZJ-C6m8xSKV.js.map} +1 -1
  111. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-BjmHa_82.js → sankeyDiagram-TZEHDZUN-BgopzerF.js} +2 -2
  112. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-BjmHa_82.js.map → sankeyDiagram-TZEHDZUN-BgopzerF.js.map} +1 -1
  113. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C050gV-9.js → sequenceDiagram-WL72ISMW-B4ZxPRzu.js} +4 -4
  114. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C050gV-9.js.map → sequenceDiagram-WL72ISMW-B4ZxPRzu.js.map} +1 -1
  115. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CbLw-EmI.js → stateDiagram-FKZM4ZOC-OWhZh6Xe.js} +9 -9
  116. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CbLw-EmI.js.map → stateDiagram-FKZM4ZOC-OWhZh6Xe.js.map} +1 -1
  117. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BldhQIZ7.js → stateDiagram-v2-4FDKWEC3-nZ8pUc2P.js} +5 -5
  118. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BldhQIZ7.js.map → stateDiagram-v2-4FDKWEC3-nZ8pUc2P.js.map} +1 -1
  119. package/dist/static/assets/{timeline-definition-IT6M3QCI-DJ1iybP_.js → timeline-definition-IT6M3QCI-DymKY2MB.js} +3 -3
  120. package/dist/static/assets/{timeline-definition-IT6M3QCI-DJ1iybP_.js.map → timeline-definition-IT6M3QCI-DymKY2MB.js.map} +1 -1
  121. package/dist/static/assets/{treemap-KMMF4GRG-CqsakBW5.js → treemap-KMMF4GRG-Im9dqZbg.js} +4 -4
  122. package/dist/static/assets/{treemap-KMMF4GRG-CqsakBW5.js.map → treemap-KMMF4GRG-Im9dqZbg.js.map} +1 -1
  123. package/dist/static/assets/{xychartDiagram-PRI3JC2R-BxNS-hP3.js → xychartDiagram-PRI3JC2R-BUaLj9KU.js} +3 -3
  124. package/dist/static/assets/{xychartDiagram-PRI3JC2R-BxNS-hP3.js.map → xychartDiagram-PRI3JC2R-BUaLj9KU.js.map} +1 -1
  125. package/dist/static/index.html +1 -1
  126. package/dist/team.js +14 -2
  127. package/dist/tools/context-health.js +7 -7
  128. package/dist/tools/team-mgmt.js +4 -2
  129. package/dist/utils/task-doc.js +16 -16
  130. package/package.json +1 -1
  131. package/dist/docs/keep-going.zh.md +0 -162
  132. package/dist/docs/showing-by-doing.md +0 -208
  133. package/dist/docs/showing-by-doing.zh.md +0 -177
  134. package/dist/snippets/README.en.md +0 -3
  135. package/dist/static/assets/index-CfaquUkU.js.map +0 -1
@@ -0,0 +1,1157 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getAgentPrimingCacheStatus = getAgentPrimingCacheStatus;
37
+ exports.scheduleAgentPrimingForNewDialog = scheduleAgentPrimingForNewDialog;
38
+ const dialog_run_state_1 = require("./dialog-run-state");
39
+ const driver_1 = require("./llm/driver");
40
+ const log_1 = require("./log");
41
+ const runtime_language_1 = require("./shared/runtime-language");
42
+ const id_1 = require("./shared/utils/id");
43
+ const inter_dialog_format_1 = require("./shared/utils/inter-dialog-format");
44
+ const time_1 = require("./shared/utils/time");
45
+ const team_1 = require("./team");
46
+ const BASELINE_ENV_SNAPSHOT_CMD = 'uname -a';
47
+ const cacheByAgentId = new Map();
48
+ const inflightByAgentId = new Map();
49
+ async function emitSayingEventsAndPersist(dlg, content) {
50
+ const calls = await (0, driver_1.emitSayingEvents)(dlg, content);
51
+ const genseq = dlg.activeGenSeqOrUndefined;
52
+ if (dlg.generationStarted &&
53
+ typeof genseq === 'number' &&
54
+ Number.isFinite(genseq) &&
55
+ genseq > 0 &&
56
+ content.trim()) {
57
+ try {
58
+ await dlg.persistAgentMessage(content, genseq, 'saying_msg');
59
+ }
60
+ catch (err) {
61
+ log_1.log.warn('Failed to persist Agent Priming synthetic saying content (best-effort)', err, {
62
+ dialogId: dlg.id.valueOf(),
63
+ genseq,
64
+ });
65
+ }
66
+ }
67
+ return calls;
68
+ }
69
+ async function emitUiOnlyMarkdownEventsAndPersist(dlg, content) {
70
+ const trimmed = content.trim();
71
+ if (!trimmed)
72
+ return;
73
+ await dlg.markdownStart();
74
+ await dlg.markdownChunk(content);
75
+ await dlg.markdownFinish();
76
+ const genseq = dlg.activeGenSeqOrUndefined;
77
+ if (dlg.generationStarted &&
78
+ typeof genseq === 'number' &&
79
+ Number.isFinite(genseq) &&
80
+ genseq > 0) {
81
+ try {
82
+ await dlg.persistUiOnlyMarkdown(content, genseq);
83
+ }
84
+ catch (err) {
85
+ log_1.log.warn('Failed to persist UI-only markdown (best-effort)', err, {
86
+ dialogId: dlg.id.valueOf(),
87
+ genseq,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ function parseUnifiedTimestamp(value) {
93
+ const m = value.trim().match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/);
94
+ if (!m)
95
+ return null;
96
+ const year = Number(m[1]);
97
+ const month = Number(m[2]);
98
+ const day = Number(m[3]);
99
+ const hour = Number(m[4]);
100
+ const minute = Number(m[5]);
101
+ const second = Number(m[6]);
102
+ if (!Number.isFinite(year) ||
103
+ !Number.isFinite(month) ||
104
+ !Number.isFinite(day) ||
105
+ !Number.isFinite(hour) ||
106
+ !Number.isFinite(minute) ||
107
+ !Number.isFinite(second)) {
108
+ return null;
109
+ }
110
+ return new Date(year, month - 1, day, hour, minute, second);
111
+ }
112
+ function getAgentPrimingCacheStatus(agentId) {
113
+ const entry = cacheByAgentId.get(agentId);
114
+ if (!entry)
115
+ return { hasCache: false };
116
+ const createdAt = entry.createdAt;
117
+ const parsed = parseUnifiedTimestamp(createdAt);
118
+ const ageSeconds = parsed === null ? 0 : Math.max(0, Math.floor((Date.now() - parsed.getTime()) / 1000));
119
+ return { hasCache: true, createdAt, ageSeconds };
120
+ }
121
+ function scheduleAgentPrimingForNewDialog(dlg, options) {
122
+ if (options.mode === 'skip')
123
+ return;
124
+ const agentId = dlg.agentId;
125
+ const existing = cacheByAgentId.get(agentId);
126
+ if (options.mode === 'reuse' && existing) {
127
+ dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(existing));
128
+ void replayAgentPriming(dlg, existing);
129
+ return;
130
+ }
131
+ const inflight = inflightByAgentId.get(agentId);
132
+ if (inflight) {
133
+ void inflight.then((entry) => {
134
+ if (options.mode === 'reuse' && entry) {
135
+ dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(entry));
136
+ return replayAgentPriming(dlg, entry);
137
+ }
138
+ // mode === 'do': wait for in-flight then run again for this dialog.
139
+ if (options.mode === 'do') {
140
+ return runAgentPrimingLive(dlg).then((next) => {
141
+ cacheByAgentId.set(agentId, next);
142
+ });
143
+ }
144
+ return;
145
+ });
146
+ return;
147
+ }
148
+ const task = runAgentPrimingLive(dlg)
149
+ .then((entry) => {
150
+ cacheByAgentId.set(agentId, entry);
151
+ return entry;
152
+ })
153
+ .catch((err) => {
154
+ // Best-effort: avoid unhandled rejections; the dialog itself is already marked interrupted.
155
+ log_1.log.warn('Agent Priming live run failed; will retry on next dialog', err, { agentId });
156
+ return null;
157
+ })
158
+ .finally(() => {
159
+ inflightByAgentId.delete(agentId);
160
+ });
161
+ inflightByAgentId.set(agentId, task);
162
+ void task;
163
+ }
164
+ function prefixTellaskBodyLines(text) {
165
+ const lines = text.replace(/\r\n/g, '\n').split('\n');
166
+ return lines.map((line) => `!? ${line}`).join('\n');
167
+ }
168
+ function takeFirstNonEmptyLine(text) {
169
+ const lines = text.replace(/\r\n/g, '\n').split('\n');
170
+ for (const line of lines) {
171
+ const trimmed = line.trim();
172
+ if (trimmed)
173
+ return trimmed;
174
+ }
175
+ return null;
176
+ }
177
+ function extractLastAssistantSaying(messages) {
178
+ for (let i = messages.length - 1; i >= 0; i--) {
179
+ const msg = messages[i];
180
+ if (msg.type === 'saying_msg' && typeof msg.content === 'string' && msg.content.trim()) {
181
+ return msg.content;
182
+ }
183
+ }
184
+ for (let i = messages.length - 1; i >= 0; i--) {
185
+ const msg = messages[i];
186
+ if (msg.type === 'thinking_msg' && typeof msg.content === 'string' && msg.content.trim()) {
187
+ return msg.content;
188
+ }
189
+ }
190
+ return '';
191
+ }
192
+ function extractLastShellCmdResultText(messages) {
193
+ for (let i = messages.length - 1; i >= 0; i--) {
194
+ const msg = messages[i];
195
+ if (typeof msg !== 'object' || msg === null)
196
+ continue;
197
+ if (!('type' in msg) || !('name' in msg) || !('content' in msg))
198
+ continue;
199
+ const type = msg.type;
200
+ const name = msg.name;
201
+ const content = msg.content;
202
+ if (type !== 'func_result_msg')
203
+ continue;
204
+ if (name !== 'shell_cmd')
205
+ continue;
206
+ if (typeof content !== 'string')
207
+ continue;
208
+ if (!content.trim())
209
+ continue;
210
+ return content;
211
+ }
212
+ return null;
213
+ }
214
+ async function runUnameA() {
215
+ const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
216
+ return await new Promise((resolveUname) => {
217
+ const child = spawn('uname', ['-a'], { stdio: ['ignore', 'pipe', 'pipe'] });
218
+ let out = '';
219
+ let err = '';
220
+ child.stdout.on('data', (buf) => {
221
+ out += buf.toString();
222
+ });
223
+ child.stderr.on('data', (buf) => {
224
+ err += buf.toString();
225
+ });
226
+ child.on('close', (code) => {
227
+ const trimmedOut = out.trim();
228
+ const trimmedErr = err.trim();
229
+ if (code === 0 && trimmedOut) {
230
+ resolveUname(trimmedOut);
231
+ return;
232
+ }
233
+ const fallback = trimmedErr ? trimmedErr : `uname exited with code ${String(code)}`;
234
+ resolveUname(fallback);
235
+ });
236
+ child.on('error', (e) => {
237
+ resolveUname(e instanceof Error ? e.message : String(e));
238
+ });
239
+ });
240
+ }
241
+ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
242
+ const shellSpecialistMention = shellSpecialistId && shellSpecialistId.trim()
243
+ ? `@${shellSpecialistId.trim()}`
244
+ : '@<shell specialist>';
245
+ const shellPolicyLinesZh = shellPolicy === 'specialist_only'
246
+ ? [
247
+ '规则:此智能体**不执行任何 shell 命令**。所有 shell 命令必须由 shell 专员执行并回传。',
248
+ `下面将诉请 shell 专员(${shellSpecialistMention})仅执行一个低风险命令:\`uname -a\`。`,
249
+ ]
250
+ : shellPolicy === 'self_is_specialist'
251
+ ? [
252
+ '本次对话主理人属于 `shell_specialists`,将略去 shell 诉请环节。',
253
+ '由 Dominds 运行时执行一个基线命令:`uname -a`,随后进入 `!?@self` FBR。',
254
+ ]
255
+ : [
256
+ '本团队未配置 shell 专员。',
257
+ '规则:此智能体必须**不执行任何 shell 命令**(不能“自己跑一下看看”)。',
258
+ '后续只能通过文件读写等非 shell 工具推进;同时要结合环境快照留意系统相关注意事项。',
259
+ '由 Dominds 运行时仅执行一个基线命令:`uname -a`,随后进入 `!?@self` FBR。',
260
+ ];
261
+ const shellPolicyLinesEn = shellPolicy === 'specialist_only'
262
+ ? [
263
+ 'Rule: this agent must **not run any shell commands**. All shell commands must be executed by the shell specialist and returned.',
264
+ `Next, we Tellask the shell specialist (${shellSpecialistMention}) to run one low-risk command only: \`uname -a\`.`,
265
+ ]
266
+ : shellPolicy === 'self_is_specialist'
267
+ ? [
268
+ 'The dialog owner is a member of `shell_specialists`, so we skip the shell Tellask step.',
269
+ 'Dominds runtime runs one baseline command: `uname -a`, then we enter `!?@self` FBR.',
270
+ ]
271
+ : [
272
+ 'This team has no configured shell specialist.',
273
+ 'Rule: this agent must **not run any shell commands** (no “just try it locally”).',
274
+ 'We can only proceed with non-shell tools like file read/write; still, we must watch out for environment-specific constraints.',
275
+ 'Dominds runtime runs one baseline command only: `uname -a`, then we enter `!?@self` FBR.',
276
+ ];
277
+ if (language === 'zh') {
278
+ return reused
279
+ ? [
280
+ '## Prelude:智能体启动(复用缓存)',
281
+ '',
282
+ '这段序幕用于把“诉请 + 回传 + FBR + 综合提炼”变成体感(引导祂做给自己看)。',
283
+ '本次对话复用了本进程内缓存:未重复执行命令。',
284
+ '',
285
+ ...shellPolicyLinesZh,
286
+ '',
287
+ ].join('\n')
288
+ : [
289
+ '## Prelude:智能体启动',
290
+ '',
291
+ '这段序幕用于把“诉请 + 回传 + FBR + 综合提炼”变成体感(引导祂做给自己看)。',
292
+ '',
293
+ ...shellPolicyLinesZh,
294
+ '',
295
+ ].join('\n');
296
+ }
297
+ return reused
298
+ ? [
299
+ '## Prelude: Agent Priming (Reused)',
300
+ '',
301
+ 'This prelude makes Tellask + return + FBR + distillation feel real (guiding the agent to show it to itself).',
302
+ 'This dialog reused the in-process cache (no commands were re-run).',
303
+ '',
304
+ ...shellPolicyLinesEn,
305
+ '',
306
+ ].join('\n')
307
+ : [
308
+ '## Prelude: Agent Priming',
309
+ '',
310
+ 'This prelude makes Tellask + return + FBR + distillation feel real (guiding the agent to show it to itself).',
311
+ '',
312
+ ...shellPolicyLinesEn,
313
+ '',
314
+ ].join('\n');
315
+ }
316
+ function formatShellTellaskBody(language, shellSpecialistId) {
317
+ const shellSpecialistMention = shellSpecialistId && shellSpecialistId.trim() ? `@${shellSpecialistId.trim()}` : undefined;
318
+ if (language === 'zh') {
319
+ return [
320
+ `你是 shell 专员${shellSpecialistMention ? `(${shellSpecialistMention})` : ''}:请代我执行 \`uname -a\` 获取当前运行环境的基本信息。`,
321
+ '',
322
+ '背景规则:对话主理人不得执行任何 shell 命令;所有 shell 命令必须通过你执行并回传。',
323
+ '请不要建议我“自己在本地跑一下”。',
324
+ '收到回传后,我将基于该环境信息做一次 `!?@self` 扪心自问(FBR),并最终形成一条可复用的“智能体启动(Agent Priming)”笔记。',
325
+ '',
326
+ '要求:',
327
+ '- 通过 shell 工具执行:uname -a(只执行这一条)',
328
+ '- 原样返回输出(不要改写/解释)',
329
+ '- 若命令不可用/失败:返回错误信息,并给出一个安全的替代命令',
330
+ '',
331
+ '输出格式:优先只给出原始输出,其次才是必要的简短说明。',
332
+ ].join('\n');
333
+ }
334
+ return [
335
+ `You are the shell specialist${shellSpecialistMention ? ` (${shellSpecialistMention})` : ''}: please run \`uname -a\` on my behalf to capture the basic runtime environment.`,
336
+ '',
337
+ 'Rule: the dialog owner must not run any shell commands; all shell commands must be executed by you and returned.',
338
+ 'Do not suggest that I “just run it locally”.',
339
+ 'After I receive your output, I will run `!?@self` Fresh Boots Reasoning (FBR) on this environment, then produce a reusable “Agent Priming” note.',
340
+ '',
341
+ 'Requirements:',
342
+ '- Use shell tools to run exactly: uname -a (and only this command)',
343
+ '- Return the raw output verbatim (no paraphrase)',
344
+ '- If the command fails: include the error and suggest one safe alternative command',
345
+ '',
346
+ 'Output format: prefer raw output only; keep any explanation minimal.',
347
+ ].join('\n');
348
+ }
349
+ function formatFbrSelfTeaser(language) {
350
+ if (language === 'zh') {
351
+ return '(我会在收到全部 FBR 支线反馈后进行综合提炼,并在主线对话中输出一条可复用的“智能体启动(Agent Priming)”笔记。)';
352
+ }
353
+ return '(After I receive all FBR sideline feedback, I will distill it into a reusable “Agent Priming” note.)';
354
+ }
355
+ function formatFbrTellaskBody(language, snapshotCmd, snapshotText, shellPolicy, shellSpecialistId, options) {
356
+ const shellSpecialistMention = shellSpecialistId && shellSpecialistId.trim()
357
+ ? `@${shellSpecialistId.trim()}`
358
+ : '@<shell specialist>';
359
+ const shellPolicyTailZh = shellPolicy === 'specialist_only'
360
+ ? [
361
+ '',
362
+ `约束提醒:后续如需任何 shell 命令,必须诉请 shell 专员(${shellSpecialistMention})执行并回传;此智能体不应自行执行。`,
363
+ ].join('\n')
364
+ : shellPolicy === 'no_specialist'
365
+ ? [
366
+ '',
367
+ '约束提醒:本团队无 shell 专员,因此后续**不能执行任意 shell 命令**;只能通过文件读写等非 shell 工具推进。',
368
+ ].join('\n')
369
+ : '';
370
+ const shellPolicyTailEn = shellPolicy === 'specialist_only'
371
+ ? [
372
+ '',
373
+ `Constraint: if we need any shell command later, we must Tellask the shell specialist (${shellSpecialistMention}) to run it and return; this agent must not run it directly.`,
374
+ ].join('\n')
375
+ : shellPolicy === 'no_specialist'
376
+ ? [
377
+ '',
378
+ 'Constraint: this team has no shell specialist, so we must **not run arbitrary shell commands**; proceed only with non-shell tools like file read/write.',
379
+ ].join('\n')
380
+ : '';
381
+ const effortLineZh = options.fbrEffort >= 1
382
+ ? '运行时提示:运行时会生成多份“初心自我”独立推理草稿,供上游对话综合提炼(这些草稿之间没有稳定映射关系,不要把它们当作固定身份)。请给出你这一份独立分析。'
383
+ : '运行时提示:本成员已禁用 FBR。';
384
+ const effortLineEn = options.fbrEffort >= 1
385
+ ? 'Runtime note: the runtime will generate multiple independent “fresh boots” drafts for the upstream dialog to distill (no stable mapping—do not treat them as fixed identities). Please produce your own independent analysis.'
386
+ : 'Runtime note: FBR is disabled for this member.';
387
+ const tellaskBackHintZh = (() => {
388
+ if (shellPolicy === 'specialist_only') {
389
+ return [
390
+ '提示:如果你还想知道更多系统细节(`uname -a` 之外),可在本 FBR 支线对话中用 `!?@tellasker` 回问诉请者(上游对话)——例如“请补充哪些日志/配置/报错、以及你希望我重点评估哪些风险”。',
391
+ `诉请者可据此选择不违反安全协议的命令,并交由 shell 专员(${shellSpecialistMention})执行回传。`,
392
+ '(当前这次 FBR 请不要真的发起任何诉请;只需说明你会回问什么。)',
393
+ ].join('\n');
394
+ }
395
+ if (shellPolicy === 'no_specialist') {
396
+ return [
397
+ '提示:如果你还想知道更多系统细节(`uname -a` 之外),可在本 FBR 支线对话中用 `!?@tellasker` 回问诉请者(上游对话)补充信息。',
398
+ '注意:本团队无 shell 专员,因此仍然**不得执行任意 shell 命令**;只能请求补充文本材料(文件片段/日志/配置/运行报错等)。',
399
+ '(当前这次 FBR 请不要真的发起任何诉请;只需说明你会回问什么。)',
400
+ ].join('\n');
401
+ }
402
+ return [
403
+ '提示:如果你还想知道更多系统细节(`uname -a` 之外),可在本 FBR 支线对话中用 `!?@tellasker` 回问诉请者(上游对话)。',
404
+ '(当前这次 FBR 请不要真的发起任何诉请;只需说明你会回问什么。)',
405
+ ].join('\n');
406
+ })();
407
+ const tellaskBackHintEn = (() => {
408
+ if (shellPolicy === 'specialist_only') {
409
+ return [
410
+ 'Hint: if you want more system details beyond `uname -a`, ask back in this FBR sideline dialog via `!?@tellasker` (to the upstream tellasker dialog).',
411
+ `Then the tellasker can choose safety-compliant follow-up commands and have the shell specialist (${shellSpecialistMention}) run and return them.`,
412
+ '(In this FBR run, do not actually emit any tellasks; just state what you would ask back.)',
413
+ ].join('\n');
414
+ }
415
+ if (shellPolicy === 'no_specialist') {
416
+ return [
417
+ 'Hint: if you want more system details beyond `uname -a`, ask back in this FBR sideline dialog via `!?@tellasker` (to the upstream tellasker dialog).',
418
+ 'Note: there is no shell specialist in this team, so do **not** run arbitrary shell commands; request additional text materials only (file snippets/logs/configs/errors).',
419
+ '(In this FBR run, do not actually emit any tellasks; just state what you would ask back.)',
420
+ ].join('\n');
421
+ }
422
+ return [
423
+ 'Hint: if you want more system details beyond `uname -a`, ask back in this FBR sideline dialog via `!?@tellasker` (to the upstream tellasker dialog).',
424
+ '(In this FBR run, do not actually emit any tellasks; just state what you would ask back.)',
425
+ ].join('\n');
426
+ })();
427
+ if (language === 'zh') {
428
+ return [
429
+ '你正在进行一次“扪心自问”(FBR)。你**没有任何工具**:不能调用工具,只能使用本文本推理。',
430
+ effortLineZh,
431
+ '',
432
+ tellaskBackHintZh,
433
+ '',
434
+ '请基于下面环境信息回答:',
435
+ '- 在这个环境里要注意些什么?',
436
+ '- 优先利用哪些命令行工具,为什么?',
437
+ '',
438
+ `环境信息(当前 Dominds 运行时真实环境快照;来自命令:\`${snapshotCmd}\`):`,
439
+ snapshotText,
440
+ shellPolicyTailZh,
441
+ ].join('\n');
442
+ }
443
+ return [
444
+ 'You are doing Fresh Boots Reasoning (FBR). You have **no tools**: do not call tools; reason with text only.',
445
+ effortLineEn,
446
+ '',
447
+ tellaskBackHintEn,
448
+ '',
449
+ 'Based on the environment info below, answer:',
450
+ '- What should we watch out for in this environment?',
451
+ '- Which CLI tools should we prioritize, and why?',
452
+ '',
453
+ `Environment info (a real snapshot of the current Dominds runtime; from \`${snapshotCmd}\`):`,
454
+ snapshotText,
455
+ shellPolicyTailEn,
456
+ ].join('\n');
457
+ }
458
+ async function generatePrimingNoteViaMainlineAgent(options) {
459
+ const { dlg, shellSnapshotText, shellResponseText, fbrResponses, fbrTellaskHead, fbrCallId } = options;
460
+ // Trigger a normal drive and rely on driver.ts context assembly.
461
+ // Agent Priming must not trigger Diligence Push (“鞭策”); it should be best-effort
462
+ // one-shot distillation with no keep-going injection.
463
+ const prevDisableDiligencePush = dlg.disableDiligencePush;
464
+ try {
465
+ dlg.disableDiligencePush = true;
466
+ const beforeMsgs = dlg.msgs.length;
467
+ const language = (0, runtime_language_1.getWorkLanguage)();
468
+ // IMPORTANT: include shell snapshot + FBR drafts in the internal prompt itself.
469
+ // - Must be non-persisted (persistMode: 'internal')
470
+ // - Must be robust even if the driver loop iterates (context health remediation)
471
+ // - Must avoid relying on the subdialog-response queue
472
+ const evidenceParts = [];
473
+ const snapshotTrimmed = shellSnapshotText.trim();
474
+ if (snapshotTrimmed) {
475
+ evidenceParts.push(language === 'zh'
476
+ ? ['环境快照(来自 `uname -a`):', snapshotTrimmed].join('\n')
477
+ : ['Environment snapshot (from `uname -a`):', snapshotTrimmed].join('\n'));
478
+ }
479
+ const shellReturnTrimmed = typeof shellResponseText === 'string' ? shellResponseText.trim() : '';
480
+ if (shellReturnTrimmed && shellReturnTrimmed !== snapshotTrimmed) {
481
+ evidenceParts.push(language === 'zh'
482
+ ? ['Shell 反馈(完整回传):', shellReturnTrimmed].join('\n')
483
+ : ['Shell feedback (full return):', shellReturnTrimmed].join('\n'));
484
+ }
485
+ const maxDrafts = Math.min(6, fbrResponses.length);
486
+ for (let i = 0; i < maxDrafts; i++) {
487
+ const r = fbrResponses[i];
488
+ const trimmed = r.response.trim();
489
+ if (!trimmed)
490
+ continue;
491
+ const cap = 4000;
492
+ const capped = trimmed.length <= cap
493
+ ? trimmed
494
+ : language === 'zh'
495
+ ? `${trimmed.slice(0, cap).trimEnd()}\n\n(已截断:仅显示前 ${cap} 字符)`
496
+ : `${trimmed.slice(0, cap).trimEnd()}\n\n(truncated: first ${cap} chars only)`;
497
+ const fbrLabel = (() => {
498
+ const head = fbrTellaskHead.trim();
499
+ const callId = fbrCallId.trim();
500
+ if (head && callId) {
501
+ return language === 'zh'
502
+ ? `FBR 草稿 #${i + 1}(tellaskHead: ${head};callId: ${callId})`
503
+ : `FBR draft #${i + 1} (tellaskHead: ${head}; callId: ${callId})`;
504
+ }
505
+ if (head) {
506
+ return language === 'zh'
507
+ ? `FBR 草稿 #${i + 1}(tellaskHead: ${head})`
508
+ : `FBR draft #${i + 1} (tellaskHead: ${head})`;
509
+ }
510
+ if (callId) {
511
+ return language === 'zh'
512
+ ? `FBR 草稿 #${i + 1}(callId: ${callId})`
513
+ : `FBR draft #${i + 1} (callId: ${callId})`;
514
+ }
515
+ return language === 'zh' ? `FBR 草稿 #${i + 1}` : `FBR draft #${i + 1}`;
516
+ })();
517
+ evidenceParts.push([fbrLabel, capped].join('\n'));
518
+ }
519
+ const evidenceBlock = evidenceParts.length > 0 ? evidenceParts.join('\n\n---\n\n') : '';
520
+ if (!evidenceBlock.trim()) {
521
+ throw new Error('Missing evidence for Agent Priming distillation (snapshot + FBR drafts are empty).');
522
+ }
523
+ const internalPrompt = language === 'zh'
524
+ ? [
525
+ '你正在进行智能体启动(Agent Priming)的“综合提炼”步骤。',
526
+ '请基于下方提供的环境快照(以及可选的 `!?@self` FBR 草稿),综合提炼出一条可复用的“智能体启动(Agent Priming)笔记”。',
527
+ '',
528
+ '证据材料(仅供综合提炼;不要逐条复述):',
529
+ evidenceBlock ? evidenceBlock : '(无)',
530
+ '',
531
+ '重要:只提炼“本次运行环境相关”的结论(例如:OS/架构、shell userland 差异、文件系统、端口/防火墙、全局链接/工具链等)。',
532
+ '禁止:输出元话语、推理过程,或复述实现细节(例如 driver/缓存/持久化等)。',
533
+ '若某条结论无法从环境快照或 FBR 草稿中直接支撑,请省略。',
534
+ '',
535
+ '要求:',
536
+ '- 去重并消解冲突,只保留最关键的结论',
537
+ '- 用 6~12 条 bullet points 输出(每条尽量短)',
538
+ '- 只写结论要点;不要输出推理过程,也不要出现“我在考虑/我将要/让我们检查”等元话语',
539
+ ].join('\n')
540
+ : [
541
+ 'You are in the Agent Priming distillation step.',
542
+ 'Based on the environment snapshot (and optional `!?@self` FBR drafts) below, distill a reusable “Agent Priming note”.',
543
+ '',
544
+ 'Evidence (for distillation only; do not repeat draft-by-draft):',
545
+ evidenceBlock ? evidenceBlock : '(empty)',
546
+ '',
547
+ 'Important: output only conclusions about this runtime environment (e.g., OS/arch, shell userland differences, filesystem behavior, ports/firewall, global links/toolchain).',
548
+ 'Do NOT include meta talk, reasoning narration, or implementation details (e.g. driver/caching/persistence).',
549
+ 'If a point is not directly supported by the environment snapshot or the FBR drafts, omit it.',
550
+ '',
551
+ 'Requirements:',
552
+ '- Dedupe and reconcile conflicts; keep only the key conclusions',
553
+ '- Output 6–12 concise bullet points',
554
+ '- Conclusion bullets only; no reasoning narration or meta talk (e.g. “I think / I will / let’s inspect”)',
555
+ ].join('\n');
556
+ // IMPORTANT: this is an internal (non-persisted) prompt. driver.ts will inject it into
557
+ // the LLM context for this drive only, without polluting dialog history.
558
+ await (0, driver_1.driveDialogStream)(dlg, {
559
+ content: internalPrompt,
560
+ msgId: (0, id_1.generateShortId)(),
561
+ grammar: 'markdown',
562
+ persistMode: 'internal',
563
+ skipTaskdoc: true,
564
+ }, true);
565
+ const afterMsgs = dlg.msgs.length;
566
+ if (afterMsgs <= beforeMsgs) {
567
+ throw new Error('Agent Priming distillation produced no new messages.');
568
+ }
569
+ const saying = extractLastAssistantSaying(dlg.msgs).trim();
570
+ if (!saying) {
571
+ throw new Error('Agent Priming distillation produced empty output.');
572
+ }
573
+ return saying;
574
+ }
575
+ finally {
576
+ dlg.disableDiligencePush = prevDisableDiligencePush;
577
+ }
578
+ }
579
+ function buildCoursePrefixMsgs(entry) {
580
+ const language = entry.workLanguage;
581
+ const header = (() => {
582
+ if (language === 'zh') {
583
+ if (entry.shellPolicy === 'specialist_only') {
584
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已真实跑通一次“诉请(shell 专员)+ 回传 + `!?@self` FBR + 综合提炼”。以下为压缩转录,作为每一程对话的开头上下文注入。';
585
+ }
586
+ if (entry.shellPolicy === 'no_specialist') {
587
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `!?@self` FBR + 综合提炼(无 shell 专员;不得执行任意 shell 命令)。以下为压缩转录,作为每一程对话的开头上下文注入。';
588
+ }
589
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `!?@self` FBR + 综合提炼。以下为压缩转录,作为每一程对话的开头上下文注入。';
590
+ }
591
+ if (entry.shellPolicy === 'specialist_only') {
592
+ return 'Agent Priming context: this process already ran a real Tellask (shell specialist) + return + `!?@self` FBR + distillation at dialog creation. The condensed transcript below is injected at the start of each course.';
593
+ }
594
+ if (entry.shellPolicy === 'no_specialist') {
595
+ return 'Agent Priming context: this process captured an environment snapshot and ran `!?@self` FBR + distillation at dialog creation (no shell specialist; do not run arbitrary shell commands). The condensed transcript below is injected at the start of each course.';
596
+ }
597
+ return 'Agent Priming context: this process captured an environment snapshot and ran `!?@self` FBR + distillation at dialog creation. The condensed transcript below is injected at the start of each course.';
598
+ })();
599
+ const shellSnapshotLabel = language === 'zh'
600
+ ? 'Shell 环境快照(当前 Dominds 运行时;来自 `uname -a`)'
601
+ : 'Shell environment snapshot (current Dominds runtime; `uname -a`)';
602
+ const shellSnapshot = entry.shell.snapshotText.trim()
603
+ ? entry.shell.snapshotText.trim()
604
+ : language === 'zh'
605
+ ? '(无)'
606
+ : '(empty)';
607
+ const effort = Math.max(0, Math.floor(entry.fbr.effort));
608
+ const fbrLabel = language === 'zh' ? 'FBR 输出(摘要)' : 'FBR outputs (summary)';
609
+ const previewCap = Math.min(entry.fbr.responses.length, Math.max(0, Math.min(6, effort)));
610
+ const previewResponses = previewCap > 0 ? entry.fbr.responses.slice(0, previewCap) : [];
611
+ const blocks = [];
612
+ for (let i = 0; i < previewResponses.length; i++) {
613
+ const raw = previewResponses[i] ?? '';
614
+ const trimmed = raw.trim();
615
+ const cap = 4000;
616
+ const capped = trimmed.length <= cap
617
+ ? trimmed
618
+ : language === 'zh'
619
+ ? `${trimmed.slice(0, cap).trimEnd()}\n\n(已截断:仅显示前 ${cap} 字符)`
620
+ : `${trimmed.slice(0, cap).trimEnd()}\n\n(truncated: first ${cap} chars only)`;
621
+ blocks.push(language === 'zh'
622
+ ? [`### FBR 草稿 #${i + 1}`, '', capped || '(无)'].join('\n')
623
+ : [`### FBR draft #${i + 1}`, '', capped || '(empty)'].join('\n'));
624
+ }
625
+ const fbrPreview = effort < 1
626
+ ? language === 'zh'
627
+ ? '(已跳过:已禁用)'
628
+ : '(skipped: disabled)'
629
+ : blocks.length < 1
630
+ ? language === 'zh'
631
+ ? '(无)'
632
+ : '(empty)'
633
+ : blocks.join('\n\n---\n\n');
634
+ const priming = entry.primingNote.trim();
635
+ const out = [
636
+ { type: 'transient_guide_msg', role: 'assistant', content: header },
637
+ {
638
+ type: 'environment_msg',
639
+ role: 'user',
640
+ content: `${shellSnapshotLabel}:\n\n${shellSnapshot}`,
641
+ },
642
+ {
643
+ type: 'environment_msg',
644
+ role: 'user',
645
+ content: language === 'zh' ? `${fbrLabel}:\n\n${fbrPreview}` : `${fbrLabel}:\n\n${fbrPreview}`,
646
+ },
647
+ ];
648
+ if (entry.shell.kind === 'specialist_tellask') {
649
+ const fullReturn = entry.shell.responseText.trim();
650
+ const snapshot = entry.shell.snapshotText.trim();
651
+ if (fullReturn && fullReturn !== snapshot) {
652
+ out.push({
653
+ type: 'environment_msg',
654
+ role: 'user',
655
+ content: language === 'zh'
656
+ ? `Shell 反馈(完整回传):\n\n${fullReturn}`
657
+ : `Shell feedback (full return):\n\n${fullReturn}`,
658
+ });
659
+ }
660
+ }
661
+ if (priming) {
662
+ out.push({
663
+ type: 'environment_msg',
664
+ role: 'user',
665
+ content: language === 'zh'
666
+ ? `智能体启动(Agent Priming)笔记(综合提炼):\n\n${priming}`
667
+ : `Agent Priming note (distilled):\n\n${priming}`,
668
+ });
669
+ }
670
+ return out;
671
+ }
672
+ async function replayAgentPriming(dlg, entry) {
673
+ const release = await dlg.acquire();
674
+ try {
675
+ const language = (0, runtime_language_1.getWorkLanguage)();
676
+ dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(entry));
677
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
678
+ // Phase 1: shell ask (and optional prelude intro)
679
+ let shellCallId = null;
680
+ let shellTellaskHead = null;
681
+ try {
682
+ await dlg.notifyGeneratingStart();
683
+ await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, true, entry.shellPolicy, entry.shell.kind === 'specialist_tellask' ? entry.shell.specialistId : null));
684
+ if (entry.shell.kind === 'specialist_tellask') {
685
+ const shellCallContent = [
686
+ `!?@${entry.shell.specialistId}`,
687
+ ...prefixTellaskBodyLines(entry.shell.tellaskBody).split('\n'),
688
+ '',
689
+ ].join('\n');
690
+ const shellCalls = await emitSayingEventsAndPersist(dlg, shellCallContent);
691
+ const shellCall = shellCalls.find((c) => c.validation.kind === 'valid');
692
+ if (shellCall) {
693
+ shellCallId = shellCall.callId;
694
+ shellTellaskHead = shellCall.tellaskHead;
695
+ }
696
+ }
697
+ else {
698
+ await emitSayingEventsAndPersist(dlg, entry.shell.directNoteMarkdown);
699
+ }
700
+ }
701
+ finally {
702
+ try {
703
+ await dlg.notifyGeneratingFinish();
704
+ }
705
+ catch (_finishErr) {
706
+ // best-effort
707
+ }
708
+ }
709
+ // Phase 2: shell response (separate bubble)
710
+ if (entry.shell.kind === 'specialist_tellask' && shellCallId && shellTellaskHead) {
711
+ await dlg.receiveTeammateResponse(entry.shell.specialistId, shellTellaskHead, 'completed', dlg.id, {
712
+ response: entry.shell.responseText,
713
+ agentId: entry.shell.specialistId,
714
+ callId: shellCallId,
715
+ originMemberId: dlg.agentId,
716
+ });
717
+ }
718
+ // Phase 3: FBR ask (call bubble)
719
+ let fbrCallId = null;
720
+ let fbrTellaskHead = null;
721
+ const effort = Math.max(0, Math.floor(entry.fbr.effort));
722
+ if (effort >= 1 && entry.fbr.responses.length > 0) {
723
+ try {
724
+ await dlg.notifyGeneratingStart();
725
+ const fbrCallBody = [entry.fbr.selfTeaser, '', entry.fbr.tellaskBody].join('\n');
726
+ const fbrCallContent = [
727
+ '!?@self',
728
+ ...prefixTellaskBodyLines(fbrCallBody).split('\n'),
729
+ '',
730
+ ].join('\n');
731
+ const fbrCalls = await emitSayingEventsAndPersist(dlg, fbrCallContent);
732
+ const fbrCall = fbrCalls.find((c) => c.validation.kind === 'valid');
733
+ if (fbrCall) {
734
+ fbrCallId = fbrCall.callId;
735
+ fbrTellaskHead = fbrCall.tellaskHead;
736
+ }
737
+ }
738
+ finally {
739
+ try {
740
+ await dlg.notifyGeneratingFinish();
741
+ }
742
+ catch (_finishErr) {
743
+ // best-effort
744
+ }
745
+ }
746
+ // Phase 4: FBR responses (separate bubbles, in stable index order)
747
+ if (fbrCallId && fbrTellaskHead) {
748
+ const normalized = Math.max(1, effort);
749
+ const responses = entry.fbr.responses.slice(0, normalized);
750
+ for (let i = 0; i < responses.length; i++) {
751
+ const raw = responses[i] ?? '';
752
+ await dlg.receiveTeammateResponse(entry.fbr.responderAgentId, fbrTellaskHead, 'completed', dlg.id, {
753
+ response: raw,
754
+ agentId: entry.fbr.responderAgentId,
755
+ callId: fbrCallId,
756
+ originMemberId: dlg.agentId,
757
+ });
758
+ }
759
+ }
760
+ }
761
+ // Phase 5: summary bubble
762
+ try {
763
+ await dlg.notifyGeneratingStart();
764
+ await emitSayingEventsAndPersist(dlg, entry.primingNote);
765
+ }
766
+ finally {
767
+ try {
768
+ await dlg.notifyGeneratingFinish();
769
+ }
770
+ catch (_finishErr) {
771
+ // best-effort
772
+ }
773
+ }
774
+ }
775
+ catch (err) {
776
+ log_1.log.warn('Agent Priming replay failed (best-effort)', err, { dialogId: dlg.id.valueOf() });
777
+ }
778
+ finally {
779
+ let nextIdle = { kind: 'idle_waiting_user' };
780
+ try {
781
+ nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
782
+ }
783
+ catch (err) {
784
+ log_1.log.warn('Failed to compute idle runState after Agent Priming replay; falling back', err, {
785
+ dialogId: dlg.id.valueOf(),
786
+ });
787
+ }
788
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
789
+ release();
790
+ }
791
+ }
792
+ async function runAgentPrimingLive(dlg) {
793
+ const createdAt = (0, time_1.formatUnifiedTimestamp)(new Date());
794
+ const language = (0, runtime_language_1.getWorkLanguage)();
795
+ let fatalRunState = null;
796
+ let shellPolicy = 'no_specialist';
797
+ let specialistId = null;
798
+ let shellTellaskBody = '';
799
+ let shellResponseText = '';
800
+ let snapshotText = '';
801
+ let directNoteMarkdown = '';
802
+ let fbrCallBody = '';
803
+ let selfTeaser = '';
804
+ let fbrEffort = 0;
805
+ const fbrResponsesForCache = [];
806
+ const fbrResponsesForInjection = [];
807
+ try {
808
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
809
+ const team = await team_1.Team.load();
810
+ const member = team.getMember(dlg.agentId);
811
+ const specialists = team.shellSpecialists
812
+ .filter((s) => typeof s === 'string')
813
+ .map((s) => s.trim())
814
+ .filter((s) => s !== '');
815
+ const selfIsShellSpecialist = specialists.includes(dlg.agentId);
816
+ specialistId = specialists.find((s) => s !== dlg.agentId) ?? null;
817
+ shellPolicy =
818
+ specialists.length < 1
819
+ ? 'no_specialist'
820
+ : selfIsShellSpecialist
821
+ ? 'self_is_specialist'
822
+ : 'specialist_only';
823
+ shellTellaskBody = formatShellTellaskBody(language, specialistId);
824
+ let shellCallId = null;
825
+ let shellTellaskHead = null;
826
+ let shellTellaskBodyForSubdialog = null;
827
+ // Phase 1: shell ask (and optional prelude intro)
828
+ if (shellPolicy === 'specialist_only' && specialistId !== null) {
829
+ await dlg.withLock(async () => {
830
+ try {
831
+ await dlg.notifyGeneratingStart();
832
+ await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, false, shellPolicy, specialistId));
833
+ const shellCallSaying = [
834
+ `!?@${specialistId}`,
835
+ ...prefixTellaskBodyLines(shellTellaskBody).split('\n'),
836
+ '',
837
+ ].join('\n');
838
+ const calls = await emitSayingEventsAndPersist(dlg, shellCallSaying);
839
+ const call = calls.find((c) => c.validation.kind === 'valid');
840
+ if (!call) {
841
+ throw new Error('Failed to emit shell specialist tellask call');
842
+ }
843
+ shellCallId = call.callId;
844
+ shellTellaskHead = call.tellaskHead;
845
+ shellTellaskBodyForSubdialog = call.body;
846
+ }
847
+ finally {
848
+ try {
849
+ await dlg.notifyGeneratingFinish();
850
+ }
851
+ catch (_finishErr) {
852
+ // best-effort
853
+ }
854
+ }
855
+ });
856
+ }
857
+ else {
858
+ // Either no shell specialist is configured, or the dialog owner is itself a shell specialist.
859
+ // In both cases we skip the shell Tellask step and let the runtime capture a baseline snapshot.
860
+ // Keep it safe and deterministic: no network, no writes.
861
+ const unameOutput = await runUnameA();
862
+ shellResponseText = unameOutput;
863
+ snapshotText = unameOutput;
864
+ const directNote = (() => {
865
+ if (shellPolicy === 'self_is_specialist') {
866
+ return language === 'zh'
867
+ ? ['由 Dominds 运行时执行:`uname -a`', '', '```console', unameOutput, '```', ''].join('\n')
868
+ : ['Dominds runtime ran: `uname -a`', '', '```console', unameOutput, '```', ''].join('\n');
869
+ }
870
+ return language === 'zh'
871
+ ? [
872
+ '未配置 shell 专员:由 Dominds 运行时仅执行基线命令 `uname -a` 以获取环境快照。',
873
+ '约束:后续**不得执行任意 shell 命令**;只能通过文件读写等非 shell 工具推进。',
874
+ '',
875
+ '```console',
876
+ unameOutput,
877
+ '```',
878
+ '',
879
+ ].join('\n')
880
+ : [
881
+ 'No shell specialist configured: Dominds runtime ran only the baseline command `uname -a` to capture an environment snapshot.',
882
+ 'Constraint: do **not** run arbitrary shell commands; proceed only with non-shell tools like file read/write.',
883
+ '',
884
+ '```console',
885
+ unameOutput,
886
+ '```',
887
+ '',
888
+ ].join('\n');
889
+ })();
890
+ directNoteMarkdown = directNote;
891
+ await dlg.withLock(async () => {
892
+ try {
893
+ await dlg.notifyGeneratingStart();
894
+ await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, false, shellPolicy, specialistId));
895
+ await emitSayingEventsAndPersist(dlg, directNoteMarkdown);
896
+ }
897
+ finally {
898
+ try {
899
+ await dlg.notifyGeneratingFinish();
900
+ }
901
+ catch (_finishErr) {
902
+ // best-effort
903
+ }
904
+ }
905
+ });
906
+ }
907
+ // Phase 2: shell response (separate bubble)
908
+ if (shellPolicy === 'specialist_only' &&
909
+ specialistId !== null &&
910
+ shellCallId &&
911
+ shellTellaskHead) {
912
+ const ensuredSpecialistId = specialistId;
913
+ if (ensuredSpecialistId === null) {
914
+ throw new Error('Missing shell specialist id');
915
+ }
916
+ const ensuredShellCallId = shellCallId;
917
+ if (!ensuredShellCallId) {
918
+ throw new Error('Missing shell callId');
919
+ }
920
+ const ensuredShellTellaskHead = shellTellaskHead;
921
+ if (!ensuredShellTellaskHead) {
922
+ throw new Error('Missing shell tellaskHead');
923
+ }
924
+ const tellaskBody = shellTellaskBodyForSubdialog ?? shellTellaskBody;
925
+ const sub = await dlg.withLock(async () => {
926
+ return await dlg.createSubDialog(ensuredSpecialistId, ensuredShellTellaskHead, tellaskBody, {
927
+ originMemberId: dlg.agentId,
928
+ callerDialogId: dlg.id.selfId,
929
+ callId: ensuredShellCallId,
930
+ collectiveTargets: [ensuredSpecialistId],
931
+ });
932
+ });
933
+ const initPrompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
934
+ fromAgentId: dlg.agentId,
935
+ toAgentId: sub.agentId,
936
+ tellaskHead: ensuredShellTellaskHead,
937
+ tellaskBody,
938
+ language,
939
+ collectiveTargets: [ensuredSpecialistId],
940
+ });
941
+ await (0, driver_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown' }, true);
942
+ shellResponseText = extractLastAssistantSaying(sub.msgs);
943
+ const toolResult = extractLastShellCmdResultText(sub.msgs);
944
+ snapshotText = toolResult ? toolResult : shellResponseText;
945
+ if (!snapshotText.trim()) {
946
+ // Specialist produced no usable output (misconfigured tools, provider issues, etc.).
947
+ // Fall back to a runtime-executed `uname -a` so we can still proceed to FBR.
948
+ snapshotText = await runUnameA();
949
+ }
950
+ await dlg.withLock(async () => {
951
+ await dlg.receiveTeammateResponse(ensuredSpecialistId, ensuredShellTellaskHead, 'completed', sub.id, {
952
+ response: shellResponseText,
953
+ agentId: ensuredSpecialistId,
954
+ callId: ensuredShellCallId,
955
+ originMemberId: dlg.agentId,
956
+ });
957
+ });
958
+ }
959
+ const rawFbrEffort = member ? member.fbr_effort : undefined;
960
+ fbrEffort = (() => {
961
+ if (typeof rawFbrEffort !== 'number' || !Number.isFinite(rawFbrEffort))
962
+ return 3;
963
+ const n = Math.floor(rawFbrEffort);
964
+ if (n < 0)
965
+ return 0;
966
+ if (n > 100) {
967
+ throw new Error('Invalid fbr_effort: must be <= 100');
968
+ }
969
+ return n;
970
+ })();
971
+ fbrCallBody = formatFbrTellaskBody(language, BASELINE_ENV_SNAPSHOT_CMD, snapshotText, shellPolicy, specialistId, { fbrEffort });
972
+ selfTeaser = formatFbrSelfTeaser(language);
973
+ let fbrCallId = null;
974
+ let fbrTellaskHead = null;
975
+ // Phase 3: FBR ask (call bubble)
976
+ if (fbrEffort >= 1) {
977
+ await dlg.withLock(async () => {
978
+ try {
979
+ await dlg.notifyGeneratingStart();
980
+ const fbrSaying = [
981
+ selfTeaser,
982
+ '',
983
+ '!?@self',
984
+ ...prefixTellaskBodyLines(fbrCallBody).split('\n'),
985
+ '',
986
+ ].join('\n');
987
+ const fbrCalls = await emitSayingEventsAndPersist(dlg, fbrSaying);
988
+ const fbrCall = fbrCalls.find((c) => c.validation.kind === 'valid');
989
+ if (!fbrCall) {
990
+ throw new Error('Failed to emit FBR tellask call');
991
+ }
992
+ fbrCallId = fbrCall.callId;
993
+ fbrTellaskHead = fbrCall.tellaskHead;
994
+ }
995
+ finally {
996
+ try {
997
+ await dlg.notifyGeneratingFinish();
998
+ }
999
+ catch (_finishErr) {
1000
+ // best-effort
1001
+ }
1002
+ }
1003
+ });
1004
+ // Phase 4: FBR responses (separate bubbles; order is not meaningful)
1005
+ if (!fbrCallId || !fbrTellaskHead) {
1006
+ throw new Error('Missing FBR callId/tellaskHead');
1007
+ }
1008
+ const ensuredFbrCallId = fbrCallId;
1009
+ const ensuredFbrTellaskHead = fbrTellaskHead;
1010
+ const perInstance = Array.from({ length: fbrEffort }, (_, idx) => idx + 1);
1011
+ const created = await Promise.all(perInstance.map(async (i) => {
1012
+ const instanceBody = fbrEffort > 1
1013
+ ? [
1014
+ fbrCallBody,
1015
+ '',
1016
+ language === 'zh'
1017
+ ? '提示:请尽量提供与其它 FBR 草稿不同的视角(例如安全/限制/可验证性/工具优先级/风险点)。'
1018
+ : 'Hint: try to provide a distinct angle vs other FBR drafts (e.g. security/constraints/verifiability/tool priority/risk).',
1019
+ ].join('\n')
1020
+ : fbrCallBody;
1021
+ const sub = await dlg.withLock(async () => {
1022
+ return await dlg.createSubDialog(dlg.agentId, ensuredFbrTellaskHead, instanceBody, {
1023
+ originMemberId: dlg.agentId,
1024
+ callerDialogId: dlg.id.selfId,
1025
+ callId: ensuredFbrCallId,
1026
+ collectiveTargets: [dlg.agentId],
1027
+ });
1028
+ });
1029
+ const initPrompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1030
+ fromAgentId: dlg.agentId,
1031
+ toAgentId: sub.agentId,
1032
+ tellaskHead: ensuredFbrTellaskHead,
1033
+ tellaskBody: instanceBody,
1034
+ language,
1035
+ collectiveTargets: [dlg.agentId],
1036
+ });
1037
+ await (0, driver_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown' }, true);
1038
+ const responseText = extractLastAssistantSaying(sub.msgs);
1039
+ return { sub, responseText };
1040
+ }));
1041
+ for (const r of created) {
1042
+ const responseText = r.responseText;
1043
+ fbrResponsesForCache.push(responseText);
1044
+ fbrResponsesForInjection.push({ subdialogId: r.sub.id.selfId, response: responseText });
1045
+ await dlg.withLock(async () => {
1046
+ await dlg.receiveTeammateResponse(dlg.agentId, ensuredFbrTellaskHead, 'completed', r.sub.id, {
1047
+ response: responseText,
1048
+ agentId: dlg.agentId,
1049
+ callId: ensuredFbrCallId,
1050
+ originMemberId: dlg.agentId,
1051
+ });
1052
+ });
1053
+ }
1054
+ }
1055
+ if (!fbrCallId || !fbrTellaskHead) {
1056
+ if (fbrEffort >= 1) {
1057
+ throw new Error('Missing FBR callId/tellaskHead for Agent Priming distillation.');
1058
+ }
1059
+ // FBR disabled (fbr_effort == 0): distill from shell snapshot only.
1060
+ fbrCallId = '';
1061
+ fbrTellaskHead = '@self';
1062
+ }
1063
+ const primingNote = await generatePrimingNoteViaMainlineAgent({
1064
+ dlg,
1065
+ shellSnapshotText: snapshotText,
1066
+ shellResponseText: shellResponseText,
1067
+ fbrResponses: fbrResponsesForInjection,
1068
+ fbrTellaskHead: fbrTellaskHead,
1069
+ fbrCallId: fbrCallId,
1070
+ });
1071
+ const entry = {
1072
+ createdAt,
1073
+ workLanguage: language,
1074
+ shellPolicy,
1075
+ shell: shellPolicy === 'specialist_only' && specialistId !== null
1076
+ ? {
1077
+ kind: 'specialist_tellask',
1078
+ specialistId,
1079
+ tellaskBody: shellTellaskBody,
1080
+ responseText: shellResponseText,
1081
+ snapshotText,
1082
+ }
1083
+ : {
1084
+ kind: 'direct_shell',
1085
+ directNoteMarkdown,
1086
+ snapshotText,
1087
+ },
1088
+ fbr: {
1089
+ tellaskHead: '@self',
1090
+ tellaskBody: fbrCallBody,
1091
+ selfTeaser,
1092
+ responderAgentId: dlg.agentId,
1093
+ effort: fbrEffort,
1094
+ responses: fbrResponsesForCache,
1095
+ },
1096
+ primingNote,
1097
+ };
1098
+ await dlg.withLock(async () => {
1099
+ dlg.setCoursePrefixMsgs(buildCoursePrefixMsgs(entry));
1100
+ });
1101
+ return entry;
1102
+ }
1103
+ catch (err) {
1104
+ const errText = err instanceof Error ? (err.stack ?? err.message) : String(err);
1105
+ const errTextTrimmed = errText.trim().slice(0, 4000);
1106
+ fatalRunState = {
1107
+ kind: 'interrupted',
1108
+ reason: { kind: 'system_stop', detail: `Agent Priming failed: ${errTextTrimmed}` },
1109
+ };
1110
+ log_1.log.warn('Agent Priming live run failed (fatal)', err, { dialogId: dlg.id.valueOf() });
1111
+ const msg = language === 'zh'
1112
+ ? [
1113
+ '错误:智能体启动(Agent Priming)失败;无法继续对话。',
1114
+ '',
1115
+ '根因(详细信息):',
1116
+ '```text',
1117
+ errTextTrimmed,
1118
+ '```',
1119
+ ].join('\n')
1120
+ : [
1121
+ 'Error: Agent Priming failed; cannot continue this dialog.',
1122
+ '',
1123
+ 'Root cause (details):',
1124
+ '```text',
1125
+ errTextTrimmed,
1126
+ '```',
1127
+ ].join('\n');
1128
+ try {
1129
+ await dlg.withLock(async () => {
1130
+ await dlg.notifyGeneratingStart();
1131
+ await emitSayingEventsAndPersist(dlg, msg);
1132
+ await dlg.notifyGeneratingFinish();
1133
+ });
1134
+ }
1135
+ catch (_emitErr) {
1136
+ // best-effort
1137
+ }
1138
+ throw err;
1139
+ }
1140
+ finally {
1141
+ if (fatalRunState) {
1142
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, fatalRunState);
1143
+ }
1144
+ else {
1145
+ let nextIdle = { kind: 'idle_waiting_user' };
1146
+ try {
1147
+ nextIdle = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
1148
+ }
1149
+ catch (err) {
1150
+ log_1.log.warn('Failed to compute idle runState after Agent Priming live run; falling back', err, {
1151
+ dialogId: dlg.id.valueOf(),
1152
+ });
1153
+ }
1154
+ await (0, dialog_run_state_1.setDialogRunState)(dlg.id, nextIdle);
1155
+ }
1156
+ }
1157
+ }