dominds 1.23.6 → 1.23.8

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 (119) hide show
  1. package/dist/apps-host/client.d.ts +2 -3
  2. package/dist/apps-host/host.js +5 -7
  3. package/dist/apps-host/ipc-types.d.ts +2 -3
  4. package/dist/dialog-display-state.js +79 -12
  5. package/dist/docs/dialog-system.md +3 -0
  6. package/dist/docs/dialog-system.zh.md +3 -0
  7. package/dist/docs/diligence-push.md +9 -7
  8. package/dist/llm/api-quirks.d.ts +1 -0
  9. package/dist/llm/api-quirks.js +74 -1
  10. package/dist/llm/gen/openai-compatible.js +2 -3
  11. package/dist/llm/kernel-driver/drive.js +16 -0
  12. package/dist/llm/kernel-driver/flow.js +39 -104
  13. package/dist/llm/kernel-driver/runtime.js +3 -1
  14. package/dist/llm/kernel-driver/types.d.ts +1 -0
  15. package/dist/persistence.js +6 -0
  16. package/dist/runtime/driver-messages.d.ts +1 -0
  17. package/dist/runtime/driver-messages.js +26 -14
  18. package/dist/server/websocket-handler.js +2 -2
  19. package/dist/tools/app-reminders.js +16 -2
  20. package/dist/tools/mcp.js +4 -2
  21. package/dist/tools/os.js +18 -12
  22. package/dist/tools/pending-tellask-reminder.js +6 -15
  23. package/package.json +3 -3
  24. package/webapp/dist/assets/{_basePickBy-528dB5Tu.js → _basePickBy-BKcCOLIM.js} +3 -3
  25. package/webapp/dist/assets/{_basePickBy-528dB5Tu.js.map → _basePickBy-BKcCOLIM.js.map} +1 -1
  26. package/webapp/dist/assets/{_baseUniq-DkdKmFUs.js → _baseUniq-7-u-sxFw.js} +2 -2
  27. package/webapp/dist/assets/{_baseUniq-DkdKmFUs.js.map → _baseUniq-7-u-sxFw.js.map} +1 -1
  28. package/webapp/dist/assets/{arc-BXvXVeL_.js → arc-d4KSm3Dw.js} +2 -2
  29. package/webapp/dist/assets/{arc-BXvXVeL_.js.map → arc-d4KSm3Dw.js.map} +1 -1
  30. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Ck1IMDXl.js → architectureDiagram-2XIMDMQ5-BRszd4pF.js} +7 -7
  31. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Ck1IMDXl.js.map → architectureDiagram-2XIMDMQ5-BRszd4pF.js.map} +1 -1
  32. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-DLRhkTKE.js → blockDiagram-WCTKOSBZ-BCleQsi6.js} +7 -7
  33. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-DLRhkTKE.js.map → blockDiagram-WCTKOSBZ-BCleQsi6.js.map} +1 -1
  34. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D2Hc1l7q.js → c4Diagram-IC4MRINW-CIPOdGL1.js} +3 -3
  35. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D2Hc1l7q.js.map → c4Diagram-IC4MRINW-CIPOdGL1.js.map} +1 -1
  36. package/webapp/dist/assets/{channel-DuagLVFr.js → channel-D-m6pRdq.js} +2 -2
  37. package/webapp/dist/assets/{channel-DuagLVFr.js.map → channel-D-m6pRdq.js.map} +1 -1
  38. package/webapp/dist/assets/{chunk-4BX2VUAB-BVowxdVQ.js → chunk-4BX2VUAB-BWYOOC08.js} +2 -2
  39. package/webapp/dist/assets/{chunk-4BX2VUAB-BVowxdVQ.js.map → chunk-4BX2VUAB-BWYOOC08.js.map} +1 -1
  40. package/webapp/dist/assets/{chunk-55IACEB6-DOqixome.js → chunk-55IACEB6-DXMYVodl.js} +2 -2
  41. package/webapp/dist/assets/{chunk-55IACEB6-DOqixome.js.map → chunk-55IACEB6-DXMYVodl.js.map} +1 -1
  42. package/webapp/dist/assets/{chunk-FMBD7UC4-BQE3IRbI.js → chunk-FMBD7UC4-ryTUBUk6.js} +2 -2
  43. package/webapp/dist/assets/{chunk-FMBD7UC4-BQE3IRbI.js.map → chunk-FMBD7UC4-ryTUBUk6.js.map} +1 -1
  44. package/webapp/dist/assets/{chunk-JSJVCQXG-BWvy_u2h.js → chunk-JSJVCQXG-DBdXbF3A.js} +2 -2
  45. package/webapp/dist/assets/{chunk-JSJVCQXG-BWvy_u2h.js.map → chunk-JSJVCQXG-DBdXbF3A.js.map} +1 -1
  46. package/webapp/dist/assets/{chunk-KX2RTZJC-DsSmqNSf.js → chunk-KX2RTZJC-DHmRW8Fy.js} +2 -2
  47. package/webapp/dist/assets/{chunk-KX2RTZJC-DsSmqNSf.js.map → chunk-KX2RTZJC-DHmRW8Fy.js.map} +1 -1
  48. package/webapp/dist/assets/{chunk-NQ4KR5QH-B3jQt0DX.js → chunk-NQ4KR5QH-Ct6A6c5Z.js} +4 -4
  49. package/webapp/dist/assets/{chunk-NQ4KR5QH-B3jQt0DX.js.map → chunk-NQ4KR5QH-Ct6A6c5Z.js.map} +1 -1
  50. package/webapp/dist/assets/{chunk-QZHKN3VN-CWST9WcY.js → chunk-QZHKN3VN-J-aYTkDG.js} +2 -2
  51. package/webapp/dist/assets/{chunk-QZHKN3VN-CWST9WcY.js.map → chunk-QZHKN3VN-J-aYTkDG.js.map} +1 -1
  52. package/webapp/dist/assets/{chunk-WL4C6EOR-DjGCVqJN.js → chunk-WL4C6EOR-BH9YAFjs.js} +6 -6
  53. package/webapp/dist/assets/{chunk-WL4C6EOR-DjGCVqJN.js.map → chunk-WL4C6EOR-BH9YAFjs.js.map} +1 -1
  54. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BnjkPcus.js → classDiagram-VBA2DB6C-6_iFdvnA.js} +7 -7
  55. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BnjkPcus.js.map → classDiagram-VBA2DB6C-6_iFdvnA.js.map} +1 -1
  56. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BnjkPcus.js → classDiagram-v2-RAHNMMFH-6_iFdvnA.js} +7 -7
  57. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BnjkPcus.js.map → classDiagram-v2-RAHNMMFH-6_iFdvnA.js.map} +1 -1
  58. package/webapp/dist/assets/{clone-BlToIURl.js → clone-CB_At6rt.js} +2 -2
  59. package/webapp/dist/assets/{clone-BlToIURl.js.map → clone-CB_At6rt.js.map} +1 -1
  60. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BDVnPWt2.js → cose-bilkent-S5V4N54A-Cd8UzjNB.js} +2 -2
  61. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BDVnPWt2.js.map → cose-bilkent-S5V4N54A-Cd8UzjNB.js.map} +1 -1
  62. package/webapp/dist/assets/{dagre-KLK3FWXG-aEZUtpHt.js → dagre-KLK3FWXG-CdwYIQOJ.js} +7 -7
  63. package/webapp/dist/assets/{dagre-KLK3FWXG-aEZUtpHt.js.map → dagre-KLK3FWXG-CdwYIQOJ.js.map} +1 -1
  64. package/webapp/dist/assets/{diagram-E7M64L7V-CvNVSxxk.js → diagram-E7M64L7V-Cst9U1IU.js} +8 -8
  65. package/webapp/dist/assets/{diagram-E7M64L7V-CvNVSxxk.js.map → diagram-E7M64L7V-Cst9U1IU.js.map} +1 -1
  66. package/webapp/dist/assets/{diagram-IFDJBPK2-Cvwaoava.js → diagram-IFDJBPK2-DbpZNhXp.js} +7 -7
  67. package/webapp/dist/assets/{diagram-IFDJBPK2-Cvwaoava.js.map → diagram-IFDJBPK2-DbpZNhXp.js.map} +1 -1
  68. package/webapp/dist/assets/{diagram-P4PSJMXO-ffnT7Lr_.js → diagram-P4PSJMXO-BrJUtC9e.js} +7 -7
  69. package/webapp/dist/assets/{diagram-P4PSJMXO-ffnT7Lr_.js.map → diagram-P4PSJMXO-BrJUtC9e.js.map} +1 -1
  70. package/webapp/dist/assets/{erDiagram-INFDFZHY-DvGIVeJS.js → erDiagram-INFDFZHY-CDgITFMs.js} +5 -5
  71. package/webapp/dist/assets/{erDiagram-INFDFZHY-DvGIVeJS.js.map → erDiagram-INFDFZHY-CDgITFMs.js.map} +1 -1
  72. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-BkQUpSc9.js → flowDiagram-PKNHOUZH-aFGKk-PM.js} +7 -7
  73. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-BkQUpSc9.js.map → flowDiagram-PKNHOUZH-aFGKk-PM.js.map} +1 -1
  74. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BlG96EZZ.js → ganttDiagram-A5KZAMGK-BZ_u2elV.js} +3 -3
  75. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BlG96EZZ.js.map → ganttDiagram-A5KZAMGK-BZ_u2elV.js.map} +1 -1
  76. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CnyjUBR4.js → gitGraphDiagram-K3NZZRJ6-DH6bOdey.js} +8 -8
  77. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CnyjUBR4.js.map → gitGraphDiagram-K3NZZRJ6-DH6bOdey.js.map} +1 -1
  78. package/webapp/dist/assets/{graph-D-OO7MVR.js → graph-CvVYx_lD.js} +3 -3
  79. package/webapp/dist/assets/{graph-D-OO7MVR.js.map → graph-CvVYx_lD.js.map} +1 -1
  80. package/webapp/dist/assets/{index-DvqI98wY.js → index--IEBo-K3.js} +434 -84
  81. package/webapp/dist/assets/index--IEBo-K3.js.map +1 -0
  82. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-Bid564Un.js → infoDiagram-LFFYTUFH-Cwrydc6U.js} +6 -6
  83. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-Bid564Un.js.map → infoDiagram-LFFYTUFH-Cwrydc6U.js.map} +1 -1
  84. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-BoU1GXkx.js → ishikawaDiagram-PHBUUO56-PAaQGWUX.js} +2 -2
  85. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-BoU1GXkx.js.map → ishikawaDiagram-PHBUUO56-PAaQGWUX.js.map} +1 -1
  86. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C-JJRe4y.js → journeyDiagram-4ABVD52K-Dy7G86Ao.js} +5 -5
  87. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C-JJRe4y.js.map → journeyDiagram-4ABVD52K-Dy7G86Ao.js.map} +1 -1
  88. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BPGHC2fL.js → kanban-definition-K7BYSVSG-C76eRxWS.js} +3 -3
  89. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-BPGHC2fL.js.map → kanban-definition-K7BYSVSG-C76eRxWS.js.map} +1 -1
  90. package/webapp/dist/assets/{layout-BFpoiNr0.js → layout-BImZEpEr.js} +5 -5
  91. package/webapp/dist/assets/{layout-BFpoiNr0.js.map → layout-BImZEpEr.js.map} +1 -1
  92. package/webapp/dist/assets/{linear-BwnDVwt9.js → linear-DHdMAAzV.js} +2 -2
  93. package/webapp/dist/assets/{linear-BwnDVwt9.js.map → linear-DHdMAAzV.js.map} +1 -1
  94. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D4aHh1Ye.js → mindmap-definition-YRQLILUH-GOhVsm4O.js} +4 -4
  95. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D4aHh1Ye.js.map → mindmap-definition-YRQLILUH-GOhVsm4O.js.map} +1 -1
  96. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DIp7yy6V.js → pieDiagram-SKSYHLDU-CZvk1jXC.js} +8 -8
  97. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DIp7yy6V.js.map → pieDiagram-SKSYHLDU-CZvk1jXC.js.map} +1 -1
  98. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-uKOhvCPR.js → quadrantDiagram-337W2JSQ-rREIz2-L.js} +3 -3
  99. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-uKOhvCPR.js.map → quadrantDiagram-337W2JSQ-rREIz2-L.js.map} +1 -1
  100. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-Da_5DlcQ.js → requirementDiagram-Z7DCOOCP-C7Ko_VBz.js} +4 -4
  101. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-Da_5DlcQ.js.map → requirementDiagram-Z7DCOOCP-C7Ko_VBz.js.map} +1 -1
  102. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-P3UD1XYS.js → sankeyDiagram-WA2Y5GQK-C4IvqC76.js} +2 -2
  103. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-P3UD1XYS.js.map → sankeyDiagram-WA2Y5GQK-C4IvqC76.js.map} +1 -1
  104. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-jY-eNlAg.js → sequenceDiagram-2WXFIKYE-BFvPV1wQ.js} +4 -4
  105. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-jY-eNlAg.js.map → sequenceDiagram-2WXFIKYE-BFvPV1wQ.js.map} +1 -1
  106. package/webapp/dist/assets/{stateDiagram-RAJIS63D-HMXNbLUd.js → stateDiagram-RAJIS63D-BcXbrOQl.js} +9 -9
  107. package/webapp/dist/assets/{stateDiagram-RAJIS63D-HMXNbLUd.js.map → stateDiagram-RAJIS63D-BcXbrOQl.js.map} +1 -1
  108. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-C-50Qbn8.js → stateDiagram-v2-FVOUBMTO-g15Y_50y.js} +5 -5
  109. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-C-50Qbn8.js.map → stateDiagram-v2-FVOUBMTO-g15Y_50y.js.map} +1 -1
  110. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkiLYjSG.js → timeline-definition-YZTLITO2-CGP_BvY2.js} +3 -3
  111. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkiLYjSG.js.map → timeline-definition-YZTLITO2-CGP_BvY2.js.map} +1 -1
  112. package/webapp/dist/assets/{treemap-KZPCXAKY-DKYYu8t-.js → treemap-KZPCXAKY-B98r-m60.js} +5 -5
  113. package/webapp/dist/assets/{treemap-KZPCXAKY-DKYYu8t-.js.map → treemap-KZPCXAKY-B98r-m60.js.map} +1 -1
  114. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-n9k6D3Up.js → vennDiagram-LZ73GAT5-BO_64ARK.js} +2 -2
  115. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-n9k6D3Up.js.map → vennDiagram-LZ73GAT5-BO_64ARK.js.map} +1 -1
  116. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DJZb5SW1.js → xychartDiagram-JWTSCODW-CD7DBeTl.js} +3 -3
  117. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DJZb5SW1.js.map → xychartDiagram-JWTSCODW-CD7DBeTl.js.map} +1 -1
  118. package/webapp/dist/index.html +1 -1
  119. package/webapp/dist/assets/index-DvqI98wY.js.map +0 -1
@@ -81,6 +81,7 @@ function isNonIdleDisplayProjection(state) {
81
81
  return state !== undefined && state.kind !== 'idle_waiting_user';
82
82
  }
83
83
  function resolveDirectFallbackResponse(args) {
84
+ let saying;
84
85
  if (args.driveResult.lastAssistantSayingContent !== null &&
85
86
  args.driveResult.lastAssistantSayingContent.trim() !== '') {
86
87
  if (typeof args.driveResult.lastAssistantSayingGenseq !== 'number' ||
@@ -88,16 +89,22 @@ function resolveDirectFallbackResponse(args) {
88
89
  args.driveResult.lastAssistantSayingGenseq <= 0) {
89
90
  throw new Error(`Direct reply fallback invariant violation: missing lastAssistantSayingGenseq for dialog=${args.dialog.id.valueOf()}`);
90
91
  }
91
- return {
92
+ saying = {
92
93
  responseText: args.driveResult.lastAssistantSayingContent,
93
94
  responseGenseq: Math.floor(args.driveResult.lastAssistantSayingGenseq),
94
95
  source: 'saying',
95
96
  };
96
97
  }
97
- // Thinking-only output is intentionally a fallback candidate: some providers/models can finish a
98
- // Side Dialog with useful content in thinking and no public saying. This helper only extracts the
99
- // candidate; callers below must still reject it when a same-round function/tellask call needs
100
- // auto-continuation, when the dialog is suspended, or when another follow-up prompt is queued.
98
+ // Thinking output is intentionally a fallback candidate: some providers/models can finish a
99
+ // Side Dialog with useful content in thinking and no public saying. Pick the newest non-empty
100
+ // assistant generation candidate across the whole drive, preferring public saying over thinking
101
+ // on the same generation. A post-tool thinking segment must not be shadowed by an older pre-tool
102
+ // saying segment from an earlier generation iteration.
103
+ //
104
+ // This helper only extracts the candidate; callers below must still reject it when a same-round
105
+ // function/tellask call needs auto-continuation, when the dialog is suspended, or when another
106
+ // follow-up prompt is queued.
107
+ let thinking;
101
108
  if (args.driveResult.lastAssistantThinkingContent !== null &&
102
109
  args.driveResult.lastAssistantThinkingContent.trim() !== '') {
103
110
  if (typeof args.driveResult.lastAssistantThinkingGenseq !== 'number' ||
@@ -105,13 +112,16 @@ function resolveDirectFallbackResponse(args) {
105
112
  args.driveResult.lastAssistantThinkingGenseq <= 0) {
106
113
  throw new Error(`Direct reply fallback invariant violation: missing lastAssistantThinkingGenseq for dialog=${args.dialog.id.valueOf()}`);
107
114
  }
108
- return {
115
+ thinking = {
109
116
  responseText: args.driveResult.lastAssistantThinkingContent,
110
117
  responseGenseq: Math.floor(args.driveResult.lastAssistantThinkingGenseq),
111
118
  source: 'thinking_only',
112
119
  };
113
120
  }
114
- return undefined;
121
+ if (saying !== undefined && thinking !== undefined) {
122
+ return saying.responseGenseq >= thinking.responseGenseq ? saying : thinking;
123
+ }
124
+ return saying ?? thinking;
115
125
  }
116
126
  async function buildReplyToolReminderPrompt(args) {
117
127
  return (0, reply_prompt_copy_1.buildReplyToolReminderText)({
@@ -209,79 +219,6 @@ async function loadPendingDiagnosticsSnapshot(args) {
209
219
  };
210
220
  }
211
221
  }
212
- async function hasAssistantOutputAfterAssignmentAnchor(args) {
213
- const events = await persistence_1.DialogPersistence.loadCourseEvents(args.dialog.id, args.dialog.currentCourse, args.dialog.status);
214
- let assignmentGenseq;
215
- for (const event of events) {
216
- if (event.type === 'tellask_anchor_record' &&
217
- event.anchorRole === 'assignment' &&
218
- event.callId === args.callId) {
219
- assignmentGenseq = event.genseq;
220
- continue;
221
- }
222
- if (assignmentGenseq !== undefined &&
223
- (event.type === 'agent_thought_record' || event.type === 'agent_words_record') &&
224
- event.genseq >= assignmentGenseq &&
225
- event.content.trim() !== '') {
226
- return true;
227
- }
228
- }
229
- return false;
230
- }
231
- async function resolveStrandedSideDialogReplyReminderFollowUp(args) {
232
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(args.dialog.id, args.dialog.status);
233
- const displayState = latest?.displayState;
234
- const isRecoverableProjection = displayState?.kind === 'idle_waiting_user' ||
235
- (displayState?.kind === 'stopped' && displayState.reason.kind === 'pending_reply_obligation');
236
- if (!latest ||
237
- !isRecoverableProjection ||
238
- latest.pendingCourseStartPrompt !== undefined ||
239
- latest.executionMarker?.kind === 'dead') {
240
- return undefined;
241
- }
242
- const directive = await (0, tellask_special_1.loadActiveTellaskReplyDirective)(args.dialog);
243
- if (!directive) {
244
- return undefined;
245
- }
246
- const ownerDialogId = directive.targetDialogId.trim();
247
- if (ownerDialogId === '') {
248
- throw new Error(`stranded sideDialog reply recovery invariant violation: empty targetDialogId ` +
249
- `(dialogId=${args.dialog.id.valueOf()}, targetCallId=${directive.targetCallId})`);
250
- }
251
- const pending = await persistence_1.DialogPersistence.loadPendingSideDialogs(new dialog_1.DialogID(ownerDialogId, args.dialog.id.rootId), args.dialog.status);
252
- const pendingRecord = pending.find((record) => record.sideDialogId === args.dialog.id.selfId && record.callId === directive.targetCallId);
253
- if (!pendingRecord) {
254
- return undefined;
255
- }
256
- if (!(await hasAssistantOutputAfterAssignmentAnchor({
257
- dialog: args.dialog,
258
- callId: pendingRecord.callId,
259
- }))) {
260
- return undefined;
261
- }
262
- const language = (0, work_language_1.getWorkLanguage)();
263
- const sideDialogReplyTarget = {
264
- ownerDialogId,
265
- callType: pendingRecord.callType,
266
- callId: pendingRecord.callId,
267
- callSiteCourse: pendingRecord.callSiteCourse,
268
- callSiteGenseq: pendingRecord.callSiteGenseq,
269
- };
270
- return {
271
- kind: 'runtime_sideDialog_reply_reminder',
272
- prompt: await buildReplyToolReminderPrompt({
273
- dlg: args.dialog,
274
- directive,
275
- language,
276
- }),
277
- msgId: (0, id_1.generateShortId)(),
278
- grammar: 'markdown',
279
- origin: 'runtime',
280
- userLanguageCode: language,
281
- tellaskReplyDirective: directive,
282
- sideDialogReplyTarget,
283
- };
284
- }
285
222
  async function clearConsumedDeferredRootQueueIfIdle(dialog) {
286
223
  if (dialog.id.selfId !== dialog.id.rootId) {
287
224
  return;
@@ -658,6 +595,7 @@ async function executeDriveRound(args) {
658
595
  let activeRunPrimed = false;
659
596
  let ownsActiveRun = false;
660
597
  let interruptedBySignal = false;
598
+ let shouldRefreshDisplayStateAfterActiveRunCleared = false;
661
599
  let followUp;
662
600
  let driveResult;
663
601
  let sideDialogReplyTarget;
@@ -740,29 +678,6 @@ async function executeDriveRound(args) {
740
678
  // suspended by pending Q4H or sideDialogs. This prevents duplicate generations when
741
679
  // multiple wake-ups race around the same sideDialog completion boundary.
742
680
  if (!humanPrompt) {
743
- if (dialog instanceof dialog_1.SideDialog && !dialog.hasUpNext()) {
744
- const strandedReplyReminder = await resolveStrandedSideDialogReplyReminderFollowUp({
745
- dialog,
746
- });
747
- if (strandedReplyReminder !== undefined) {
748
- await queueReplyReminderFollowUp({ dialog, followUp: strandedReplyReminder });
749
- args.scheduleDrive(dialog, {
750
- waitInQue: true,
751
- driveOptions: {
752
- source: 'kernel_driver_follow_up',
753
- reason: 'follow_up_prompt',
754
- },
755
- });
756
- log_1.log.warn('kernel-driver recovered stranded sideDialog reply obligation by queueing reply reminder', undefined, {
757
- dialogId: dialog.id.valueOf(),
758
- rootId: dialog.id.rootId,
759
- selfId: dialog.id.selfId,
760
- targetCallId: strandedReplyReminder.tellaskReplyDirective.targetCallId,
761
- targetOwnerDialogId: strandedReplyReminder.sideDialogReplyTarget.ownerDialogId,
762
- });
763
- return;
764
- }
765
- }
766
681
  if (dialog instanceof dialog_1.SideDialog && !dialog.hasUpNext()) {
767
682
  try {
768
683
  const inspection = await inspectNoPromptSideDialogDrive({ dialog, driveOptions });
@@ -1022,12 +937,20 @@ async function executeDriveRound(args) {
1022
937
  (driveResult.fbrConclusion !== undefined ||
1023
938
  resolveDirectFallbackResponse({ driveResult, dialog }) !== undefined)) {
1024
939
  if (driveResult.fbrConclusion) {
1025
- await (0, sideDialog_1.supplySideDialogResponseToAssignedAskerIfPendingV2)({
940
+ const suppliedFbrConclusion = await (0, sideDialog_1.supplySideDialogResponseToAssignedAskerIfPendingV2)({
1026
941
  sideDialog: dialog,
1027
942
  responseText: driveResult.fbrConclusion.responseText,
1028
943
  responseGenseq: driveResult.fbrConclusion.responseGenseq,
944
+ replyResolution: {
945
+ callId: driveResult.fbrConclusion.replyResolutionCallId,
946
+ replyCallName: 'replyTellaskSessionless',
947
+ },
1029
948
  scheduleDrive: args.scheduleDrive,
1030
949
  });
950
+ if (!suppliedFbrConclusion) {
951
+ throw new Error(`FBR conclusion delivery invariant violation: no pending asker target for dialog=${dialog.id.valueOf()}`);
952
+ }
953
+ shouldRefreshDisplayStateAfterActiveRunCleared = true;
1031
954
  }
1032
955
  else {
1033
956
  const directFallbackResponse = resolveDirectFallbackResponse({ driveResult, dialog });
@@ -1334,6 +1257,18 @@ async function executeDriveRound(args) {
1334
1257
  if (activeRunPrimed && ownsActiveRun) {
1335
1258
  (0, dialog_display_state_1.clearActiveRun)(dialog.id);
1336
1259
  }
1260
+ if (shouldRefreshDisplayStateAfterActiveRunCleared && !(0, dialog_display_state_1.hasActiveRun)(dialog.id)) {
1261
+ try {
1262
+ await (0, dialog_display_state_1.setDialogDisplayState)(dialog.id, await (0, dialog_display_state_1.computeIdleDisplayState)(dialog));
1263
+ }
1264
+ catch (error) {
1265
+ log_1.log.warn('kernel-driver failed to refresh display state after FBR auto-delivery', error, {
1266
+ dialogId: dialog.id.valueOf(),
1267
+ rootId: dialog.id.rootId,
1268
+ selfId: dialog.id.selfId,
1269
+ });
1270
+ }
1271
+ }
1337
1272
  release();
1338
1273
  (0, idle_reminder_wake_1.maybeStartIdleReminderWake)(dialog, {
1339
1274
  scheduleDrive: args.scheduleDrive,
@@ -867,6 +867,8 @@ async function runLlmRequestWithRetry(params) {
867
867
  errorText: detail,
868
868
  },
869
869
  });
870
+ }
871
+ if (failure.kind === 'rejected' && handledFailure.handling.kind !== 'give_up') {
870
872
  let streamErrorEmitted = false;
871
873
  try {
872
874
  await params.dlg.streamError(detail);
@@ -941,7 +943,7 @@ async function runLlmRequestWithRetry(params) {
941
943
  reason: interruptionReason,
942
944
  });
943
945
  }
944
- log_1.log.warn('LLM retriable failure stopped retry flow', undefined, {
946
+ log_1.log.warn('LLM failure stopped retry flow', undefined, {
945
947
  provider: params.provider,
946
948
  dialogId: params.dlg.id.valueOf(),
947
949
  rootId: params.dlg.id.rootId,
@@ -114,6 +114,7 @@ export type KernelDriverCoreResult = {
114
114
  fbrConclusion?: {
115
115
  responseText: string;
116
116
  responseGenseq: number;
117
+ replyResolutionCallId: string;
117
118
  };
118
119
  };
119
120
  export declare function createKernelDriverRuntimeState(): KernelDriverRuntimeState;
@@ -520,6 +520,12 @@ function parseDialogLlmRetryRecoveryAction(value) {
520
520
  return { kind: 'none' };
521
521
  case 'diligence_push_once':
522
522
  return { kind: 'diligence_push_once' };
523
+ case 'runtime_prompt_once': {
524
+ const content = value.content;
525
+ if (typeof content !== 'string' || content.trim() === '')
526
+ return null;
527
+ return { kind: 'runtime_prompt_once', content };
528
+ }
523
529
  default:
524
530
  return null;
525
531
  }
@@ -1,5 +1,6 @@
1
1
  import { type LanguageCode } from '@longrun-ai/kernel/types/language';
2
2
  export declare function formatSystemNoticePrefix(language: LanguageCode): string;
3
+ export declare function formatAutoMaintainedReminderManualMirrorBan(language: LanguageCode): string;
3
4
  export declare function formatCurrentUserLanguagePreference(workingLanguage: LanguageCode, uiLanguage: LanguageCode): string;
4
5
  export declare function formatUserLanguagePreferenceChangedNotice(workingLanguage: LanguageCode, previousUiLanguage: LanguageCode, nextUiLanguage: LanguageCode): string;
5
6
  export declare function formatRegisteredTellaskTellaskerUpdateNotice(language: LanguageCode): string;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.formatSystemNoticePrefix = formatSystemNoticePrefix;
4
+ exports.formatAutoMaintainedReminderManualMirrorBan = formatAutoMaintainedReminderManualMirrorBan;
4
5
  exports.formatCurrentUserLanguagePreference = formatCurrentUserLanguagePreference;
5
6
  exports.formatUserLanguagePreferenceChangedNotice = formatUserLanguagePreferenceChangedNotice;
6
7
  exports.formatRegisteredTellaskTellaskerUpdateNotice = formatRegisteredTellaskTellaskerUpdateNotice;
@@ -23,6 +24,11 @@ const language_1 = require("@longrun-ai/kernel/types/language");
23
24
  function formatSystemNoticePrefix(language) {
24
25
  return language === 'zh' ? '【系统提示】' : '[System notice]';
25
26
  }
27
+ function formatAutoMaintainedReminderManualMirrorBan(language) {
28
+ return language === 'zh'
29
+ ? '这条状态由系统维护;禁止把它抄进、改写进、或同步维护到你手工创建的提醒项里。'
30
+ : 'This state is system-maintained; do not copy, rewrite, or separately maintain it in manual reminders.';
31
+ }
26
32
  function formatCurrentUserLanguagePreference(workingLanguage, uiLanguage) {
27
33
  const uiName = (0, language_1.formatLanguageName)(uiLanguage, workingLanguage);
28
34
  const workingName = (0, language_1.formatLanguageName)(workingLanguage, workingLanguage);
@@ -290,15 +296,15 @@ function formatReminderItemGuide(language, reminderId, content, options) {
290
296
  : undefined;
291
297
  const deleteInstruction = language === 'zh'
292
298
  ? deleteAltInstruction
293
- ? `如果你要删除这条提醒项,不能用 delete_reminder;请执行:${deleteAltInstruction}`
299
+ ? `删除通道:不要用 delete_reminder;请执行:${deleteAltInstruction}`
294
300
  : isPendingTellaskReminder && pendingTellaskCount === 0
295
- ? `如果你已确认这里只是清理噪音、并非要推进动作,可执行:delete_reminder({ "reminder_id": "${reminderId}" })`
296
- : `如果你要删除这条提醒项,可执行:delete_reminder({ "reminder_id": "${reminderId}" })`
301
+ ? `清理噪音时可删除:delete_reminder({ "reminder_id": "${reminderId}" })`
302
+ : `删除通道:delete_reminder({ "reminder_id": "${reminderId}" })`
297
303
  : deleteAltInstruction
298
- ? `If you need to delete this reminder, do not use delete_reminder; run: ${deleteAltInstruction}`
304
+ ? `Delete path: do not use delete_reminder; run: ${deleteAltInstruction}`
299
305
  : isPendingTellaskReminder && pendingTellaskCount === 0
300
- ? `If you have confirmed this is only noise cleanup and not an action step, you may run: delete_reminder({ "reminder_id": "${reminderId}" })`
301
- : `If you need to delete this reminder, run: delete_reminder({ "reminder_id": "${reminderId}" })`;
306
+ ? `Noise cleanup delete path: delete_reminder({ "reminder_id": "${reminderId}" })`
307
+ : `Delete path: delete_reminder({ "reminder_id": "${reminderId}" })`;
302
308
  const projectionNote = formatReminderItemProjectionNote(language);
303
309
  const enProjectionPrefix = `${projectionNote} `;
304
310
  const systemPrefix = formatSystemNoticePrefix(language);
@@ -309,12 +315,13 @@ function formatReminderItemGuide(language, reminderId, content, options) {
309
315
  `${systemPrefix} 提醒项 [${reminderId}](工具状态)`,
310
316
  '',
311
317
  `${projectionNote}当前运行环境中有一条由工具 ${managementTool} 管理的状态提醒项。请把它当作环境/工具状态参考,不要当作你自己写的工作便签。`,
318
+ formatAutoMaintainedReminderManualMirrorBan(language),
312
319
  '',
313
320
  '默认不要在对外回复里专门确认、复述或总结它;只有它实际改变你的判断、计划或风险时,才提炼真正相关的部分。',
314
321
  '',
315
- `这条提醒项由工具 ${managementTool} 管理;如果你要调整它,就用 ${managementTool}(不要用 update_reminder)。`,
322
+ `调整通道:使用 ${managementTool};不要用 update_reminder。`,
316
323
  '',
317
- `如果你要更新这条提醒项,可执行:${updateInstructionSafe}`,
324
+ `更新通道:${updateInstructionSafe}`,
318
325
  deleteInstruction,
319
326
  '',
320
327
  '---',
@@ -326,8 +333,9 @@ function formatReminderItemGuide(language, reminderId, content, options) {
326
333
  `${systemPrefix} 提醒项 [${reminderId}]`,
327
334
  '',
328
335
  `${projectionNote}当前运行环境中有一条带有 meta 控制更新规则的提醒项。请把它当作状态参考,不要用 update_reminder 直接改写内容。`,
336
+ formatAutoMaintainedReminderManualMirrorBan(language),
329
337
  '',
330
- `如果你要更新这条提醒项,不能用 update_reminder;请按此处理:${updateInstruction}`,
338
+ `更新通道:不要用 update_reminder;请按此处理:${updateInstruction}`,
331
339
  deleteInstruction,
332
340
  '',
333
341
  '---',
@@ -373,11 +381,13 @@ function formatReminderItemGuide(language, reminderId, content, options) {
373
381
 
374
382
  ${enProjectionPrefix}The current runtime environment has a tool-managed state reminder from ${managementTool}. Treat it as environment/tool state, not as your self-authored work note.
375
383
 
384
+ ${formatAutoMaintainedReminderManualMirrorBan(language)}
385
+
376
386
  By default, do not explicitly acknowledge, restate, or summarize it in your outward reply; only extract the parts that materially change your current judgment, plan, or risk.
377
387
 
378
- This reminder is managed by tool ${managementTool}; if you need to change it, use ${managementTool} instead of update_reminder.
388
+ Change path: use ${managementTool}; do not use update_reminder.
379
389
 
380
- If you need to update this reminder, run: ${updateInstructionSafe}
390
+ Update path: ${updateInstructionSafe}
381
391
  ${deleteInstruction}
382
392
  ---
383
393
  ${content}`;
@@ -387,7 +397,9 @@ ${content}`;
387
397
 
388
398
  ${enProjectionPrefix}The current runtime environment has a reminder with a meta-controlled update path. Treat it as state/reference, and do not rewrite it directly with update_reminder.
389
399
 
390
- If you need to update this reminder, do not use update_reminder; follow instead: ${updateInstruction}
400
+ ${formatAutoMaintainedReminderManualMirrorBan(language)}
401
+
402
+ Update path: do not use update_reminder; follow instead: ${updateInstruction}
391
403
  ${deleteInstruction}
392
404
  ---
393
405
  ${content}`;
@@ -399,7 +411,7 @@ ${enProjectionPrefix}You set a continuation reminder so the runtime system can r
399
411
 
400
412
  Keep the next step, key pointers, run/verify info, and easy-to-lose volatile details here. Do not duplicate Taskdoc content. In the new course, your first step is to review and rewrite this with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress it into a high-quality reminder. If this is only a rough bridge note, reconcile it early in the new course.
401
413
 
402
- If you need to update this package, run: update_reminder({ "reminder_id": "${reminderId}", "content": "..." })
414
+ Update path: update_reminder({ "reminder_id": "${reminderId}", "content": "..." })
403
415
  ${deleteInstruction}
404
416
  ---
405
417
  ${content}`;
@@ -414,7 +426,7 @@ ${scope === 'personal'
414
426
  ? 'Keep it concise, refresh it when needed, and delete it when obsolete. If it is only useful for the current dialog, rewrite it into dialog scope instead of letting personal scope accumulate noise.'
415
427
  : 'Keep it concise, refresh it when needed, and delete it when obsolete. If you are preparing a new course, you can also rewrite it into a continuation package.'}
416
428
 
417
- If you need to update this reminder, run: update_reminder({ "reminder_id": "${reminderId}", "content": "..." })
429
+ Update path: update_reminder({ "reminder_id": "${reminderId}", "content": "..." })
418
430
  ${deleteInstruction}
419
431
  ---
420
432
  ${content}`;
@@ -597,8 +597,8 @@ async function handleDeclareSideDialogDead(ws, packet) {
597
597
  const responseTextWithNote = note === ''
598
598
  ? responseText
599
599
  : (0, work_language_1.getWorkLanguage)() === 'zh'
600
- ? `${responseText}\n\n使用者补充(来自输入框):\n${note}`
601
- : `${responseText}\n\nUser note (from the input box):\n${note}`;
600
+ ? `${responseText}\n\n人类用户补充:\n${note}`
601
+ : `${responseText}\n\nHuman user note:\n${note}`;
602
602
  await (0, kernel_driver_1.supplyResponseToAskerDialog)(parentDialog, dialogIdObj, responseTextWithNote, pendingRecord.callType, assignmentFromAsker.callId, 'failed');
603
603
  }
604
604
  async function handleSetDiligencePush(ws, packet) {
@@ -168,6 +168,18 @@ function fallbackRenderedReminder(reminder) {
168
168
  }),
169
169
  };
170
170
  }
171
+ function formatAppReminderWrapperPrelude(language) {
172
+ return language === 'zh'
173
+ ? `这是 app 自动维护的状态提醒,不是你自己写的工作便签。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`
174
+ : `This is app-maintained state, not a work note you wrote. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`;
175
+ }
176
+ function wrapAppRenderedReminder(message, language) {
177
+ return {
178
+ type: 'environment_msg',
179
+ role: 'user',
180
+ content: `${formatAppReminderWrapperPrelude(language)}\n\n${message.content}`,
181
+ };
182
+ }
171
183
  async function persistAndPublishReminders(dlg) {
172
184
  await dlg.dlgStore.persistReminders(dlg, dlg.reminders);
173
185
  const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(dlg.agentId);
@@ -229,12 +241,14 @@ function createAppReminderOwner(params) {
229
241
  }
230
242
  try {
231
243
  const client = await resolveHostClient();
232
- return await client.renderReminder(descriptor.appId, descriptor.ownerRef, {
244
+ const language = (0, work_language_1.getWorkLanguage)();
245
+ const rendered = await client.renderReminder(descriptor.appId, descriptor.ownerRef, {
233
246
  dialogId: dlg.id.selfId,
234
247
  reminder: toReminderState(reminder),
235
248
  reminderId: reminder.id,
236
- workLanguage: (0, work_language_1.getWorkLanguage)(),
249
+ workLanguage: language,
237
250
  });
251
+ return wrapAppRenderedReminder(rendered, language);
238
252
  }
239
253
  catch (error) {
240
254
  log_1.log.warn('App reminder render failed; using generic reminder rendering', error, {
package/dist/tools/mcp.js CHANGED
@@ -198,8 +198,8 @@ exports.mcpLeaseReminderOwner = {
198
198
  type: 'environment_msg',
199
199
  role: 'user',
200
200
  content: workLanguage === 'zh'
201
- ? `${prefix} MCP 工具集租约提醒 [${reminder.id}]\n你正在查看系统维护的 MCP 租约状态,不要把它当成你自己写的工作便签。\n\n${reminder.content}`
202
- : `${prefix} MCP toolset lease reminder [${reminder.id}]\nYou are looking at system-maintained MCP lease state. Do not treat it as a self-authored work note.\n\n${reminder.content}`,
201
+ ? `${prefix} MCP 工具集租约提醒 [${reminder.id}]\n这是系统自动维护的 MCP 租约状态,不是你自己写的工作便签。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(workLanguage)}\n\n${reminder.content}`
202
+ : `${prefix} MCP toolset lease reminder [${reminder.id}]\nThis is system-maintained MCP lease state, not a work note you wrote. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(workLanguage)}\n\n${reminder.content}`,
203
203
  };
204
204
  }
205
205
  const serverId = reminder.meta.serverId;
@@ -211,6 +211,7 @@ exports.mcpLeaseReminderOwner = {
211
211
  `${prefix} MCP 工具集租约 [${reminder.id}]: \`${serverId}\``,
212
212
  '',
213
213
  `你当前看到的是系统维护的 MCP 租约状态。该 MCP server 被视为非“真正无状态”;当前对话持有一个 MCP 运行时实例(HTTP 连接或 stdio 进程)。`,
214
+ (0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(workLanguage),
214
215
  '',
215
216
  `当你确认近期不再需要这个运行时实例时,请释放它,以停止/回收底层 MCP 进程或连接:`,
216
217
  `- \`mcp_release({\"serverId\":\"${serverId}\"})\``,
@@ -221,6 +222,7 @@ exports.mcpLeaseReminderOwner = {
221
222
  `${prefix} MCP toolset lease [${reminder.id}]: \`${serverId}\``,
222
223
  '',
223
224
  `You are looking at system-maintained MCP lease state. This MCP server is treated as non-stateless, and the current dialog holds one MCP runtime instance for it (an HTTP connection or stdio process).`,
225
+ (0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(workLanguage),
224
226
  '',
225
227
  `When you are confident you will not need this runtime instance soon, release it to stop the underlying MCP process/connection:`,
226
228
  `- \`mcp_release({\"serverId\":\"${serverId}\"})\``,
package/dist/tools/os.js CHANGED
@@ -547,7 +547,7 @@ async function waitForShellCmdReminderWakeEvent(reminder, signal) {
547
547
  function getOsToolMessages(language) {
548
548
  if (language === 'zh') {
549
549
  return {
550
- daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一条生命周期提醒持续刷新:系统维护 / 实时真源 / 不可删除。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
550
+ daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一条生命周期提醒持续刷新:系统维护 / 实时真源 / 不可删除。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
551
551
  commandCompleted: (exitCode, scrollNotice) => `✅ 命令已完成(退出码:${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
552
552
  scrolledLinesNotice: (lines) => `\n⚠️ 执行期间有 ${lines} 行已滚出可视范围`,
553
553
  stdoutLabel: '📤 stdout:',
@@ -562,7 +562,7 @@ function getOsToolMessages(language) {
562
562
  };
563
563
  }
564
564
  return {
565
- daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle reminder keep updating: system-maintained / live source of truth / not deletable.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
565
+ daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} is now running in the background (PID: ${pid})\nThe process did not finish within ${timeoutSeconds} seconds and has transitioned into a daemon. You will see the same lifecycle reminder keep updating: system-maintained / live source of truth / not deletable. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
566
566
  commandCompleted: (exitCode, scrollNotice) => `✅ Command completed (exit code: ${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
567
567
  scrolledLinesNotice: (lines) => `\n⚠️ ${lines} lines scrolled out of view during execution`,
568
568
  stdoutLabel: '📤 stdout:',
@@ -1091,8 +1091,8 @@ ${formatRunnerBackedDaemonStatusDetails(daemon, language)}`;
1091
1091
  }
1092
1092
  function formatRunnerRecoveryError(pid, errorText, language) {
1093
1093
  return language === 'zh'
1094
- ? `⚠️ 守护进程 ${pid} 的 runner 恢复失败:${errorText}`
1095
- : `⚠️ Failed to recover runner for daemon ${pid}: ${errorText}`;
1094
+ ? `⚠️ 守护进程 ${pid} 的 runner 恢复失败:${errorText}\n这是系统维护的后台进程状态。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`
1095
+ : `⚠️ Failed to recover runner for daemon ${pid}: ${errorText}\nThis is system-maintained background-process state. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`;
1096
1096
  }
1097
1097
  // JSON Schema for shell_cmd parameters
1098
1098
  const shellCmdSchema = {
@@ -1369,11 +1369,13 @@ exports.shellCmdReminderOwner = {
1369
1369
  role: 'user',
1370
1370
  content: language === 'zh'
1371
1371
  ? `${prefix} 后台进程生命周期提醒 [${reminder.id}]
1372
- 当前运行环境中有一条系统维护的后台进程状态提醒。请把它当成环境信号,不要当成你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
1372
+ 当前运行环境中有一条系统维护的后台进程状态提醒。请把它当成环境信号,不要当成你自己写的工作便签。
1373
+ ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}
1374
+ 若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
1373
1375
  ---
1374
1376
  ${reminder.content}`
1375
1377
  : `${prefix} Background process lifecycle reminder [${reminder.id}]
1376
- The current runtime environment has a system-maintained background-process state reminder. Treat it as an environment signal, not as your self-authored work note. If it does not materially change your judgment/plan/risk, make no user-visible reply at all (do not send filler like "silently noted" or "received"); only reflect it inside the next substantive reply when it actually affects the next action. This reminder auto-updates while the process is running; after exit it keeps the terminal state until you delete it manually.
1378
+ The current runtime environment has a system-maintained background-process state reminder. Treat it as an environment signal, not as your self-authored work note. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)} If it does not materially change your judgment/plan/risk, make no user-visible reply at all (do not send filler like "silently noted" or "received"); only reflect it inside the next substantive reply when it actually affects the next action. This reminder auto-updates while the process is running; after exit it keeps the terminal state until you delete it manually.
1377
1379
  ---
1378
1380
  ${reminder.content}`,
1379
1381
  };
@@ -1391,11 +1393,13 @@ ${reminder.content}`,
1391
1393
  role: 'user',
1392
1394
  content: language === 'zh'
1393
1395
  ? `${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${exitedSummary}|PID ${pid}
1394
- 当前运行环境中 daemon 已退出。若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
1396
+ 当前运行环境中 daemon 已退出。
1397
+ ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}
1398
+ 若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
1395
1399
  ---
1396
1400
  ${reminder.content}`
1397
1401
  : `${prefix} Daemon lifecycle reminder [${reminder.id}] - ${exitedSummary} | PID ${pid}
1398
- The current runtime environment shows that this daemon has exited. If you still need to inspect the final stdout/stderr, first call get_daemon_output({ "pid": ${pid} }) if it is still available; otherwise use the last known snapshot below. After you have acknowledged the exit, delete this reminder manually.
1402
+ The current runtime environment shows that this daemon has exited. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)} If you still need to inspect the final stdout/stderr, first call get_daemon_output({ "pid": ${pid} }) if it is still available; otherwise use the last known snapshot below. After you have acknowledged the exit, delete this reminder manually.
1399
1403
  ---
1400
1404
  ${reminder.content}`,
1401
1405
  };
@@ -1405,9 +1409,9 @@ ${reminder.content}`,
1405
1409
  role: 'user',
1406
1410
  content: language === 'zh'
1407
1411
  ? `${prefix} 进程生命周期提醒 [${reminder.id}] - 后台进程已结束(PID ${pid})
1408
- 当前运行环境中该后台进程的生命周期已经结束,当前不再运行。`
1412
+ 当前运行环境中该后台进程的生命周期已经结束,当前不再运行。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`
1409
1413
  : `${prefix} Process lifecycle reminder [${reminder.id}] - daemon terminated (PID ${pid})
1410
- The current runtime environment shows that this daemon process has finished its lifecycle and is no longer running.`,
1414
+ The current runtime environment shows that this daemon process has finished its lifecycle and is no longer running. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}`,
1411
1415
  };
1412
1416
  }
1413
1417
  if (resolved.kind === 'error') {
@@ -1431,12 +1435,14 @@ The current runtime environment shows that this daemon process has finished its
1431
1435
  role: 'user',
1432
1436
  content: language === 'zh'
1433
1437
  ? `🔄 ${prefix} 守护进程生命周期提醒 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
1434
- 当前运行环境中 daemon 仍在运行。这是系统维护的状态提醒,不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
1438
+ 当前运行环境中 daemon 仍在运行。这是系统维护的状态提醒,不是默认需要单独汇报的事项。
1439
+ ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}
1440
+ 若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
1435
1441
 
1436
1442
  **状态快照:**
1437
1443
  ${statusInfo}`
1438
1444
  : `🔄 ${prefix} Daemon lifecycle reminder [${reminder.id}] - ${runningSummary} | PID ${pid}, uptime: ${uptimeStr}
1439
- The current runtime environment shows that this daemon is still running. This is a system-maintained state reminder and not something that normally deserves a standalone mention. If the information below does not materially change your judgment, plan, risk, or require a daemon-management action, make no user-visible reply at all; if it does matter, reflect it only inside the next substantive reply instead of sending filler like "silently noted" or "received".
1445
+ The current runtime environment shows that this daemon is still running. This is a system-maintained state reminder and not something that normally deserves a standalone mention. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)} If the information below does not materially change your judgment, plan, risk, or require a daemon-management action, make no user-visible reply at all; if it does matter, reflect it only inside the next substantive reply instead of sending filler like "silently noted" or "received".
1440
1446
 
1441
1447
  **State snapshot:**
1442
1448
  ${statusInfo}`,
@@ -36,13 +36,13 @@ function isPendingTellaskReminderMeta(value) {
36
36
  }
37
37
  function getPendingTellaskUpdateAltInstruction(language) {
38
38
  return language === 'zh'
39
- ? '不要手改这条系统提醒。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
40
- : 'Do not hand-edit this system reminder. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
39
+ ? '不要手改这条系统提醒。诉请更改通道:只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
40
+ : 'Do not hand-edit this system reminder. Tellask change path: only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
41
41
  }
42
42
  function getPendingTellaskDeleteAltInstruction(language) {
43
43
  return language === 'zh'
44
- ? '这条系统提醒不可删除。若要改变某一路诉请,只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
45
- : 'This system reminder is not deletable. If you need to change one tellask, only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
44
+ ? '这条系统提醒不可删除。诉请更改通道:只有长线诉请(`tellask` + `sessionSlug`)才能更新那一路诉请的“任务安排”:复用同一 `sessionSlug` 再发 `tellask`,让对应主理人按最新安排自行最终回复并自然结束。一次性诉请(`tellaskSessionless`)没有这个通道;新开一个 `tellaskSessionless` 只会再创建新的瞬态支线,不能要求旧主理人停止。其余情况等待系统按真实诉请状态自动刷新。'
45
+ : 'This system reminder is not deletable. Tellask change path: only a sessioned tellask (`tellask` + `sessionSlug`) can be updated in place: send another `tellask` with the same `sessionSlug` so the tellaskee can finish naturally under the latest assignment. A one-shot tellask (`tellaskSessionless`) has no such channel; another `tellaskSessionless` only creates a new transient Side Dialog and cannot tell the earlier owner to stop. Otherwise wait for system refresh from real tellask state.';
46
46
  }
47
47
  function callKindLabel(language, view) {
48
48
  if (view.callType === 'A') {
@@ -234,21 +234,12 @@ exports.pendingTellaskReminderOwner = {
234
234
  async renderReminder(_dlg, reminder) {
235
235
  const language = (0, work_language_1.getWorkLanguage)();
236
236
  const prefix = (0, driver_messages_1.formatSystemNoticePrefix)(language);
237
- if (reminder.owner !== exports.pendingTellaskReminderOwner) {
238
- return {
239
- type: 'environment_msg',
240
- role: 'user',
241
- content: language === 'zh'
242
- ? `${prefix} 自动维护诉请状态提醒 [${reminder.id}]\n你正在查看系统自动维护的诉请状态,不要把它当成你自己写的工作便签。\n\n${reminder.content}`
243
- : `${prefix} Auto-maintained tellask status reminder [${reminder.id}]\nYou are looking at system-maintained tellask state. Do not treat it as a self-authored work note.\n\n${reminder.content}`,
244
- };
245
- }
246
237
  return {
247
238
  type: 'environment_msg',
248
239
  role: 'user',
249
240
  content: language === 'zh'
250
- ? `${prefix} 自动维护诉请状态提醒 [${reminder.id}]\n你正在查看系统自动维护的诉请状态,不要把它当成你自己写的工作便签。\n\n${reminder.content}`
251
- : `${prefix} Auto-maintained tellask status reminder [${reminder.id}]\nYou are looking at system-maintained tellask state. Do not treat it as a self-authored work note.\n\n${reminder.content}`,
241
+ ? `${prefix} 自动维护诉请状态提醒 [${reminder.id}]\n这是系统自动维护的诉请状态,不是你自己写的工作便签。${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}\n\n${reminder.content}`
242
+ : `${prefix} Auto-maintained tellask status reminder [${reminder.id}]\nThis is system-maintained tellask state, not a work note you wrote. ${(0, driver_messages_1.formatAutoMaintainedReminderManualMirrorBan)(language)}\n\n${reminder.content}`,
252
243
  };
253
244
  },
254
245
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "1.23.6",
3
+ "version": "1.23.8",
4
4
  "description": "Dominds CLI and aggregation shell for the LongRun AI kernel/runtime packages.",
5
5
  "type": "commonjs",
6
6
  "publishConfig": {
@@ -53,8 +53,8 @@
53
53
  "yaml": "^2.8.2",
54
54
  "zod": "^4.3.6",
55
55
  "@longrun-ai/codex-auth": "0.13.0",
56
- "@longrun-ai/kernel": "1.13.3",
57
- "@longrun-ai/shell": "1.13.3"
56
+ "@longrun-ai/kernel": "1.13.5",
57
+ "@longrun-ai/shell": "1.13.5"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/node": "^25.3.5",
@@ -1,5 +1,5 @@
1
- import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-DkdKmFUs.js";
2
- import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index-DvqI98wY.js";
1
+ import { e as isSymbol, c as baseFlatten, g as baseIteratee, k as keys, h as baseFindIndex, j as baseEach, l as arrayMap, m as hasPath, n as castPath, t as toKey, o as baseGet } from "./_baseUniq-7-u-sxFw.js";
2
+ import { aU as isObject, aC as baseRest, aV as isIterateeCall, aW as keysIn, aX as eq, aY as isArrayLike, aZ as isArray, a_ as identity, a$ as isIndex, b0 as assignValue } from "./index--IEBo-K3.js";
3
3
  var reWhitespace = /\s/;
4
4
  function trimmedEndIndex(string) {
5
5
  var index = string.length;
@@ -193,4 +193,4 @@ export {
193
193
  map as m,
194
194
  toFinite as t
195
195
  };
196
- //# sourceMappingURL=_basePickBy-528dB5Tu.js.map
196
+ //# sourceMappingURL=_basePickBy-BKcCOLIM.js.map