dominds 1.17.2 → 1.17.4

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 (125) hide show
  1. package/dist/apps-host/host.js +13 -2
  2. package/dist/apps-host/ipc-types.js +18 -1
  3. package/dist/dialog-fork.js +1 -0
  4. package/dist/dialog.js +5 -0
  5. package/dist/docs/mcp-support.md +4 -1
  6. package/dist/docs/team_mgmt-toolset.md +8 -7
  7. package/dist/docs/team_mgmt-toolset.zh.md +6 -5
  8. package/dist/mcp/manual-problems.d.ts +33 -0
  9. package/dist/mcp/manual-problems.js +323 -0
  10. package/dist/mcp/supervisor.js +23 -1
  11. package/dist/persistence.js +12 -0
  12. package/dist/priming.js +7 -0
  13. package/dist/shared-reminders.js +2 -0
  14. package/dist/tool.d.ts +5 -0
  15. package/dist/tool.js +66 -4
  16. package/dist/tools/app-reminders.js +20 -3
  17. package/dist/tools/ctrl.js +43 -4
  18. package/dist/tools/manual/output-limit.d.ts +9 -0
  19. package/dist/tools/manual/output-limit.js +12 -0
  20. package/dist/tools/os.js +173 -37
  21. package/dist/tools/pending-tellask-reminder.d.ts +1 -1
  22. package/dist/tools/pending-tellask-reminder.js +39 -19
  23. package/dist/tools/team_mgmt-manual.d.ts +2 -0
  24. package/dist/tools/team_mgmt-manual.js +160 -0
  25. package/dist/tools/team_mgmt-mcp-manual.d.ts +27 -0
  26. package/dist/tools/team_mgmt-mcp-manual.js +643 -0
  27. package/dist/tools/team_mgmt.d.ts +11 -1
  28. package/dist/tools/team_mgmt.js +22 -867
  29. package/dist/tools/toolset-manual.js +5 -5
  30. package/package.json +4 -4
  31. package/webapp/dist/assets/{_basePickBy-EK9iGcOl.js → _basePickBy-CgM-M_q8.js} +3 -3
  32. package/webapp/dist/assets/{_basePickBy-EK9iGcOl.js.map → _basePickBy-CgM-M_q8.js.map} +1 -1
  33. package/webapp/dist/assets/{_baseUniq-BHtz-XvO.js → _baseUniq-B06twih4.js} +2 -2
  34. package/webapp/dist/assets/{_baseUniq-BHtz-XvO.js.map → _baseUniq-B06twih4.js.map} +1 -1
  35. package/webapp/dist/assets/{arc-NqUmMwkS.js → arc-CoXJvjeB.js} +2 -2
  36. package/webapp/dist/assets/{arc-NqUmMwkS.js.map → arc-CoXJvjeB.js.map} +1 -1
  37. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CJ7Jb15a.js → architectureDiagram-2XIMDMQ5-BLFRWTKn.js} +7 -7
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CJ7Jb15a.js.map → architectureDiagram-2XIMDMQ5-BLFRWTKn.js.map} +1 -1
  39. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-RNM7ujN4.js → blockDiagram-WCTKOSBZ-CYRE6deu.js} +7 -7
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-RNM7ujN4.js.map → blockDiagram-WCTKOSBZ-CYRE6deu.js.map} +1 -1
  41. package/webapp/dist/assets/{c4Diagram-IC4MRINW-DKra5-za.js → c4Diagram-IC4MRINW-B26QTIJt.js} +3 -3
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-DKra5-za.js.map → c4Diagram-IC4MRINW-B26QTIJt.js.map} +1 -1
  43. package/webapp/dist/assets/{channel-CxE9sL_E.js → channel-C5U2W0P9.js} +2 -2
  44. package/webapp/dist/assets/{channel-CxE9sL_E.js.map → channel-C5U2W0P9.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-4BX2VUAB-BlyIt9uv.js → chunk-4BX2VUAB-7z2PgnSv.js} +2 -2
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-BlyIt9uv.js.map → chunk-4BX2VUAB-7z2PgnSv.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-55IACEB6-DsPShmjL.js → chunk-55IACEB6-6sRVmXqs.js} +2 -2
  48. package/webapp/dist/assets/{chunk-55IACEB6-DsPShmjL.js.map → chunk-55IACEB6-6sRVmXqs.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-FMBD7UC4-C2i0rEFF.js → chunk-FMBD7UC4-BwYp8OtY.js} +2 -2
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-C2i0rEFF.js.map → chunk-FMBD7UC4-BwYp8OtY.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-JSJVCQXG-CK8inzJx.js → chunk-JSJVCQXG-CRq8LK53.js} +2 -2
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-CK8inzJx.js.map → chunk-JSJVCQXG-CRq8LK53.js.map} +1 -1
  53. package/webapp/dist/assets/{chunk-KX2RTZJC-BjEK5_oI.js → chunk-KX2RTZJC-CzFE355P.js} +2 -2
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-BjEK5_oI.js.map → chunk-KX2RTZJC-CzFE355P.js.map} +1 -1
  55. package/webapp/dist/assets/{chunk-NQ4KR5QH-Clf489xc.js → chunk-NQ4KR5QH-3cQSOzCt.js} +4 -4
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-Clf489xc.js.map → chunk-NQ4KR5QH-3cQSOzCt.js.map} +1 -1
  57. package/webapp/dist/assets/{chunk-QZHKN3VN-CMikir3s.js → chunk-QZHKN3VN-DWkpxb-w.js} +2 -2
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-CMikir3s.js.map → chunk-QZHKN3VN-DWkpxb-w.js.map} +1 -1
  59. package/webapp/dist/assets/{chunk-WL4C6EOR-1gtCLicd.js → chunk-WL4C6EOR-DkpfoQzK.js} +6 -6
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-1gtCLicd.js.map → chunk-WL4C6EOR-DkpfoQzK.js.map} +1 -1
  61. package/webapp/dist/assets/{classDiagram-VBA2DB6C-kzzlkQ_D.js → classDiagram-VBA2DB6C-mVfJeuZL.js} +7 -7
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-kzzlkQ_D.js.map → classDiagram-VBA2DB6C-mVfJeuZL.js.map} +1 -1
  63. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-kzzlkQ_D.js → classDiagram-v2-RAHNMMFH-mVfJeuZL.js} +7 -7
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-kzzlkQ_D.js.map → classDiagram-v2-RAHNMMFH-mVfJeuZL.js.map} +1 -1
  65. package/webapp/dist/assets/{clone-XglJh1R0.js → clone-5uLJc7AC.js} +2 -2
  66. package/webapp/dist/assets/{clone-XglJh1R0.js.map → clone-5uLJc7AC.js.map} +1 -1
  67. package/webapp/dist/assets/{cose-bilkent-S5V4N54A--gZrh2tG.js → cose-bilkent-S5V4N54A-CoiJzdQi.js} +2 -2
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A--gZrh2tG.js.map → cose-bilkent-S5V4N54A-CoiJzdQi.js.map} +1 -1
  69. package/webapp/dist/assets/{dagre-KLK3FWXG-D_JMhNNL.js → dagre-KLK3FWXG-DU_3BSOq.js} +7 -7
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-D_JMhNNL.js.map → dagre-KLK3FWXG-DU_3BSOq.js.map} +1 -1
  71. package/webapp/dist/assets/{diagram-E7M64L7V-HkYhqJDL.js → diagram-E7M64L7V-DgqOvF1U.js} +8 -8
  72. package/webapp/dist/assets/{diagram-E7M64L7V-HkYhqJDL.js.map → diagram-E7M64L7V-DgqOvF1U.js.map} +1 -1
  73. package/webapp/dist/assets/{diagram-IFDJBPK2-BFv5iU5U.js → diagram-IFDJBPK2-CFWMc1oD.js} +7 -7
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-BFv5iU5U.js.map → diagram-IFDJBPK2-CFWMc1oD.js.map} +1 -1
  75. package/webapp/dist/assets/{diagram-P4PSJMXO-Dg46tTnk.js → diagram-P4PSJMXO-lrqvXDXp.js} +7 -7
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-Dg46tTnk.js.map → diagram-P4PSJMXO-lrqvXDXp.js.map} +1 -1
  77. package/webapp/dist/assets/{erDiagram-INFDFZHY-BzJClUtq.js → erDiagram-INFDFZHY-C28KjRkA.js} +5 -5
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-BzJClUtq.js.map → erDiagram-INFDFZHY-C28KjRkA.js.map} +1 -1
  79. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-IBGgxeki.js → flowDiagram-PKNHOUZH-DkxGh-JF.js} +7 -7
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-IBGgxeki.js.map → flowDiagram-PKNHOUZH-DkxGh-JF.js.map} +1 -1
  81. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DdxgzFKe.js → ganttDiagram-A5KZAMGK-BmZnHD96.js} +3 -3
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DdxgzFKe.js.map → ganttDiagram-A5KZAMGK-BmZnHD96.js.map} +1 -1
  83. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C14OpSSI.js → gitGraphDiagram-K3NZZRJ6-xiHqomZC.js} +8 -8
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C14OpSSI.js.map → gitGraphDiagram-K3NZZRJ6-xiHqomZC.js.map} +1 -1
  85. package/webapp/dist/assets/{graph-BrKKvSVx.js → graph-ozb0amP0.js} +3 -3
  86. package/webapp/dist/assets/{graph-BrKKvSVx.js.map → graph-ozb0amP0.js.map} +1 -1
  87. package/webapp/dist/assets/{index-BV_dDe3L.js → index-Cyx7eev_.js} +700 -165
  88. package/webapp/dist/assets/{index-BV_dDe3L.js.map → index-Cyx7eev_.js.map} +1 -1
  89. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-k0Yv94VI.js → infoDiagram-LFFYTUFH-fLl_TA1F.js} +6 -6
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-k0Yv94VI.js.map → infoDiagram-LFFYTUFH-fLl_TA1F.js.map} +1 -1
  91. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-C3EYBxjN.js → ishikawaDiagram-PHBUUO56-ZL9tBKUr.js} +2 -2
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-C3EYBxjN.js.map → ishikawaDiagram-PHBUUO56-ZL9tBKUr.js.map} +1 -1
  93. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BnSlOrbq.js → journeyDiagram-4ABVD52K--aRyymZs.js} +5 -5
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BnSlOrbq.js.map → journeyDiagram-4ABVD52K--aRyymZs.js.map} +1 -1
  95. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CNYH0HDF.js → kanban-definition-K7BYSVSG-BO_QdW_O.js} +3 -3
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CNYH0HDF.js.map → kanban-definition-K7BYSVSG-BO_QdW_O.js.map} +1 -1
  97. package/webapp/dist/assets/{layout-NtmBC9CZ.js → layout-Bu3Xw0z2.js} +5 -5
  98. package/webapp/dist/assets/{layout-NtmBC9CZ.js.map → layout-Bu3Xw0z2.js.map} +1 -1
  99. package/webapp/dist/assets/{linear-BrqwApt9.js → linear-Bq77itJm.js} +2 -2
  100. package/webapp/dist/assets/{linear-BrqwApt9.js.map → linear-Bq77itJm.js.map} +1 -1
  101. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DcknQb8H.js → mindmap-definition-YRQLILUH-CHB8qv8L.js} +4 -4
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DcknQb8H.js.map → mindmap-definition-YRQLILUH-CHB8qv8L.js.map} +1 -1
  103. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-wydKHXzN.js → pieDiagram-SKSYHLDU-Cxg_wh4K.js} +8 -8
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-wydKHXzN.js.map → pieDiagram-SKSYHLDU-Cxg_wh4K.js.map} +1 -1
  105. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D6i3VaFO.js → quadrantDiagram-337W2JSQ-DFguuaS9.js} +3 -3
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D6i3VaFO.js.map → quadrantDiagram-337W2JSQ-DFguuaS9.js.map} +1 -1
  107. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-C0sBwH6H.js → requirementDiagram-Z7DCOOCP--tJ_dfsT.js} +4 -4
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-C0sBwH6H.js.map → requirementDiagram-Z7DCOOCP--tJ_dfsT.js.map} +1 -1
  109. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-33jPg4PK.js → sankeyDiagram-WA2Y5GQK-f0zWimMc.js} +2 -2
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-33jPg4PK.js.map → sankeyDiagram-WA2Y5GQK-f0zWimMc.js.map} +1 -1
  111. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CJsKHnh5.js → sequenceDiagram-2WXFIKYE-dwXRRnyq.js} +4 -4
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CJsKHnh5.js.map → sequenceDiagram-2WXFIKYE-dwXRRnyq.js.map} +1 -1
  113. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B6A5jTdU.js → stateDiagram-RAJIS63D-DToxcEC2.js} +9 -9
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-B6A5jTdU.js.map → stateDiagram-RAJIS63D-DToxcEC2.js.map} +1 -1
  115. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-6YIjpVKr.js → stateDiagram-v2-FVOUBMTO-BY5hDUqz.js} +5 -5
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-6YIjpVKr.js.map → stateDiagram-v2-FVOUBMTO-BY5hDUqz.js.map} +1 -1
  117. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BQS5KHfj.js → timeline-definition-YZTLITO2-CT3WRcFt.js} +3 -3
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BQS5KHfj.js.map → timeline-definition-YZTLITO2-CT3WRcFt.js.map} +1 -1
  119. package/webapp/dist/assets/{treemap-KZPCXAKY-DB1uUX8l.js → treemap-KZPCXAKY-Lnkh2bpd.js} +5 -5
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-DB1uUX8l.js.map → treemap-KZPCXAKY-Lnkh2bpd.js.map} +1 -1
  121. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BtcfWZJx.js → vennDiagram-LZ73GAT5-CYSLSh1w.js} +2 -2
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BtcfWZJx.js.map → vennDiagram-LZ73GAT5-CYSLSh1w.js.map} +1 -1
  123. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CfIdcI74.js → xychartDiagram-JWTSCODW-DgvaqrGO.js} +3 -3
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CfIdcI74.js.map → xychartDiagram-JWTSCODW-DgvaqrGO.js.map} +1 -1
  125. package/webapp/dist/index.html +1 -1
@@ -358,6 +358,7 @@ function serializeReminderSnapshot(reminder) {
358
358
  meta: reminder.meta,
359
359
  echoback: reminder.echoback,
360
360
  scope: reminder.scope ?? 'dialog',
361
+ renderMode: reminder.renderMode ?? 'markdown',
361
362
  createdAt: reminder.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
362
363
  priority: reminder.priority ?? 'medium',
363
364
  };
@@ -370,6 +371,7 @@ function cloneReminderSnapshot(snapshot) {
370
371
  meta: snapshot.meta,
371
372
  echoback: snapshot.echoback,
372
373
  scope: snapshot.scope,
374
+ renderMode: snapshot.renderMode,
373
375
  createdAt: snapshot.createdAt,
374
376
  priority: snapshot.priority,
375
377
  };
@@ -1202,6 +1204,9 @@ function isReminderPriority(value) {
1202
1204
  function isReminderScope(value) {
1203
1205
  return value === 'dialog' || value === 'personal' || value === 'agent_shared';
1204
1206
  }
1207
+ function isReminderRenderMode(value) {
1208
+ return value === 'plain' || value === 'markdown';
1209
+ }
1205
1210
  function isReminderStateFile(value) {
1206
1211
  if (!isRecord(value))
1207
1212
  return false;
@@ -1222,6 +1227,8 @@ function isReminderStateFile(value) {
1222
1227
  return false;
1223
1228
  if (entry.scope !== undefined && !isReminderScope(entry.scope))
1224
1229
  return false;
1230
+ if (entry.renderMode !== undefined && !isReminderRenderMode(entry.renderMode))
1231
+ return false;
1225
1232
  if (typeof entry.createdAt !== 'string')
1226
1233
  return false;
1227
1234
  if (!isReminderPriority(entry.priority))
@@ -4437,6 +4444,9 @@ class DialogPersistence {
4437
4444
  try {
4438
4445
  const dialogPath = this.getDialogEventsPath(dialogId, status);
4439
4446
  const remindersFilePath = path.join(dialogPath, 'reminders.json');
4447
+ // The dialog directory must already exist from the normal dialog lifecycle.
4448
+ // Do not create it here just to save reminders: missing directories should stay loud
4449
+ // so stale-path/status-transition bugs cannot silently recreate an old dialog location.
4440
4450
  const reminderState = {
4441
4451
  reminders: reminders.map((r) => ({
4442
4452
  id: r.id,
@@ -4445,6 +4455,7 @@ class DialogPersistence {
4445
4455
  meta: r.meta,
4446
4456
  echoback: r.echoback,
4447
4457
  scope: r.scope ?? 'dialog',
4458
+ renderMode: r.renderMode ?? 'markdown',
4448
4459
  createdAt: r.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
4449
4460
  priority: r.priority ?? 'medium',
4450
4461
  })),
@@ -4497,6 +4508,7 @@ class DialogPersistence {
4497
4508
  meta: r.meta,
4498
4509
  echoback: r.echoback,
4499
4510
  scope: r.scope ?? 'dialog',
4511
+ renderMode: r.renderMode ?? 'markdown',
4500
4512
  createdAt: r.createdAt,
4501
4513
  priority: r.priority,
4502
4514
  });
package/dist/priming.js CHANGED
@@ -186,6 +186,10 @@ function parseReminderSnapshots(frontmatter) {
186
186
  if (createdAt !== undefined && typeof createdAt !== 'string') {
187
187
  throw new Error(`${context}.createdAt must be a string when provided`);
188
188
  }
189
+ const renderMode = item['renderMode'];
190
+ if (renderMode !== undefined && renderMode !== 'plain' && renderMode !== 'markdown') {
191
+ throw new Error(`${context}.renderMode must be "plain" or "markdown" when provided`);
192
+ }
189
193
  const priority = parseReminderPriority(item['priority'], context);
190
194
  reminders.push({
191
195
  id: typeof id === 'string' ? id : undefined,
@@ -194,6 +198,7 @@ function parseReminderSnapshots(frontmatter) {
194
198
  meta,
195
199
  echoback,
196
200
  scope: scope === 'dialog' || scope === 'personal' || scope === 'agent_shared' ? scope : undefined,
201
+ renderMode: renderMode === 'plain' || renderMode === 'markdown' ? renderMode : undefined,
197
202
  createdAt: typeof createdAt === 'string' ? createdAt : undefined,
198
203
  priority,
199
204
  });
@@ -208,6 +213,7 @@ function reminderToSnapshot(reminder) {
208
213
  meta: reminder.meta,
209
214
  echoback: reminder.echoback,
210
215
  scope: reminder.scope,
216
+ renderMode: reminder.renderMode ?? 'markdown',
211
217
  createdAt: reminder.createdAt,
212
218
  priority: reminder.priority,
213
219
  };
@@ -229,6 +235,7 @@ function materializeReminderSnapshot(snapshot, context) {
229
235
  meta: snapshot.meta,
230
236
  echoback: snapshot.echoback,
231
237
  scope: snapshot.scope,
238
+ renderMode: snapshot.renderMode ?? 'markdown',
232
239
  createdAt: snapshot.createdAt,
233
240
  priority: snapshot.priority,
234
241
  });
@@ -74,6 +74,7 @@ function serializeReminder(reminder) {
74
74
  meta: reminder.meta,
75
75
  echoback: reminder.echoback,
76
76
  scope: reminder.scope ?? 'agent_shared',
77
+ renderMode: reminder.renderMode ?? 'markdown',
77
78
  createdAt: reminder.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
78
79
  priority: reminder.priority ?? 'medium',
79
80
  };
@@ -89,6 +90,7 @@ function materializeStoredReminder(snapshot) {
89
90
  meta: snapshot.meta,
90
91
  echoback: snapshot.echoback,
91
92
  scope: snapshot.scope ?? 'agent_shared',
93
+ renderMode: snapshot.renderMode ?? 'markdown',
92
94
  createdAt: snapshot.createdAt,
93
95
  priority: snapshot.priority,
94
96
  });
package/dist/tool.d.ts CHANGED
@@ -51,8 +51,10 @@ type PreparedRawToolArguments = Readonly<{
51
51
  export interface ReminderOptions {
52
52
  readonly echoback?: boolean;
53
53
  readonly scope?: ReminderScope;
54
+ readonly renderMode?: ReminderRenderMode;
54
55
  }
55
56
  export type ReminderScope = 'dialog' | 'personal' | 'agent_shared';
57
+ export type ReminderRenderMode = 'plain' | 'markdown';
56
58
  export type ReminderPriority = 'high' | 'medium' | 'low';
57
59
  export interface Reminder extends ReminderOptions {
58
60
  readonly id: string;
@@ -61,6 +63,7 @@ export interface Reminder extends ReminderOptions {
61
63
  readonly meta?: JsonValue;
62
64
  readonly createdAt?: string;
63
65
  readonly priority?: ReminderPriority;
66
+ readonly renderMode?: ReminderRenderMode;
64
67
  }
65
68
  export declare function reminderEchoBackEnabled(reminder: Reminder): boolean;
66
69
  export declare function reminderIsVirtual(reminder: Reminder): boolean;
@@ -75,8 +78,10 @@ export declare function materializeReminder(input: Readonly<{
75
78
  scope?: ReminderScope;
76
79
  createdAt?: string;
77
80
  priority?: ReminderPriority;
81
+ renderMode?: ReminderRenderMode;
78
82
  }>): Reminder;
79
83
  export declare function cloneReminder(reminder: Reminder): Reminder;
84
+ export declare function computeReminderRenderRevision(reminder: Reminder): string;
80
85
  export declare function compareReminderDisplayOrder(a: Reminder, b: Reminder): number;
81
86
  export declare function getReminderOwnerName(reminder: Pick<Reminder, 'owner'>): string | undefined;
82
87
  export declare function reminderOwnedBy(reminder: Reminder, owner: ReminderOwner | string): boolean;
package/dist/tool.js CHANGED
@@ -10,6 +10,7 @@ exports.reminderIsListed = reminderIsListed;
10
10
  exports.generateReminderId = generateReminderId;
11
11
  exports.materializeReminder = materializeReminder;
12
12
  exports.cloneReminder = cloneReminder;
13
+ exports.computeReminderRenderRevision = computeReminderRenderRevision;
13
14
  exports.compareReminderDisplayOrder = compareReminderDisplayOrder;
14
15
  exports.getReminderOwnerName = getReminderOwnerName;
15
16
  exports.reminderOwnedBy = reminderOwnedBy;
@@ -18,6 +19,7 @@ exports.formatToolArgumentsForContext = formatToolArgumentsForContext;
18
19
  exports.prepareRawToolArguments = prepareRawToolArguments;
19
20
  exports.resolveFuncToolInvocationArguments = resolveFuncToolInvocationArguments;
20
21
  const id_1 = require("@longrun-ai/kernel/utils/id");
22
+ const crypto_1 = require("crypto");
21
23
  function toolResult(content, outcome, contentItems) {
22
24
  return {
23
25
  content,
@@ -69,6 +71,7 @@ function materializeReminder(input) {
69
71
  scope: input.scope ?? 'dialog',
70
72
  createdAt: input.createdAt,
71
73
  priority: input.priority,
74
+ renderMode: input.renderMode ?? 'markdown',
72
75
  };
73
76
  }
74
77
  function cloneReminder(reminder) {
@@ -81,16 +84,75 @@ function cloneReminder(reminder) {
81
84
  scope: reminder.scope,
82
85
  createdAt: reminder.createdAt,
83
86
  priority: reminder.priority,
87
+ renderMode: reminder.renderMode,
84
88
  });
85
89
  }
90
+ function computeReminderRenderRevision(reminder) {
91
+ const payload = JSON.stringify({
92
+ id: reminder.id,
93
+ content: reminder.content,
94
+ meta: reminder.meta ?? null,
95
+ echoback: reminder.echoback ?? true,
96
+ scope: reminder.scope ?? 'dialog',
97
+ renderMode: reminder.renderMode ?? 'markdown',
98
+ });
99
+ return `sha256:${(0, crypto_1.createHash)('sha256').update(payload, 'utf8').digest('hex')}`;
100
+ }
101
+ function extractReminderDisplayTimestamp(reminder) {
102
+ let displayTs = reminder.createdAt ?? '';
103
+ let displayTsMs = parseReminderSortTimestamp(displayTs);
104
+ const meta = reminder.meta;
105
+ if (typeof meta !== 'object' || meta === null || Array.isArray(meta)) {
106
+ return { raw: displayTs, ms: displayTsMs };
107
+ }
108
+ const updatedAt = meta['updatedAt'];
109
+ if (typeof updatedAt === 'string') {
110
+ const updatedAtMs = parseReminderSortTimestamp(updatedAt);
111
+ if (updatedAtMs !== null && (displayTsMs === null || updatedAtMs > displayTsMs)) {
112
+ displayTs = updatedAt;
113
+ displayTsMs = updatedAtMs;
114
+ }
115
+ }
116
+ const lastUpdated = meta['lastUpdated'];
117
+ if (typeof lastUpdated === 'string') {
118
+ const lastUpdatedMs = parseReminderSortTimestamp(lastUpdated);
119
+ if (lastUpdatedMs !== null && (displayTsMs === null || lastUpdatedMs > displayTsMs)) {
120
+ displayTs = lastUpdated;
121
+ displayTsMs = lastUpdatedMs;
122
+ }
123
+ }
124
+ return { raw: displayTs, ms: displayTsMs };
125
+ }
126
+ function parseReminderSortTimestamp(value) {
127
+ const trimmed = value.trim();
128
+ if (trimmed === '')
129
+ return null;
130
+ const unifiedMatch = trimmed.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/);
131
+ if (unifiedMatch) {
132
+ const [, year, month, day, hour, minute, second] = unifiedMatch;
133
+ const parsed = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second)).getTime();
134
+ return Number.isNaN(parsed) ? null : parsed;
135
+ }
136
+ const parsed = Date.parse(trimmed);
137
+ return Number.isNaN(parsed) ? null : parsed;
138
+ }
86
139
  // Reminder presentation order is a framework-level concern distinct from owner semantics.
87
140
  // Keep it centralized so dialog-local reminders and agent-shared reminders stay in the same
88
141
  // newest-first order everywhere they are merged, rendered, or injected.
89
142
  function compareReminderDisplayOrder(a, b) {
90
- const aCreatedAt = a.createdAt ?? '';
91
- const bCreatedAt = b.createdAt ?? '';
92
- if (aCreatedAt !== bCreatedAt) {
93
- return bCreatedAt.localeCompare(aCreatedAt);
143
+ const aDisplayTs = extractReminderDisplayTimestamp(a);
144
+ const bDisplayTs = extractReminderDisplayTimestamp(b);
145
+ if (aDisplayTs.ms !== null || bDisplayTs.ms !== null) {
146
+ if (aDisplayTs.ms === null)
147
+ return 1;
148
+ if (bDisplayTs.ms === null)
149
+ return -1;
150
+ if (aDisplayTs.ms !== bDisplayTs.ms) {
151
+ return bDisplayTs.ms - aDisplayTs.ms;
152
+ }
153
+ }
154
+ if (aDisplayTs.raw !== bDisplayTs.raw) {
155
+ return bDisplayTs.raw.localeCompare(aDisplayTs.raw);
94
156
  }
95
157
  return b.id.localeCompare(a.id);
96
158
  }
@@ -7,6 +7,7 @@ exports.applyAppReminderRequests = applyAppReminderRequests;
7
7
  const evt_registry_1 = require("../evt-registry");
8
8
  const driver_messages_1 = require("../runtime/driver-messages");
9
9
  const work_language_1 = require("../runtime/work-language");
10
+ const shared_reminders_1 = require("../shared-reminders");
10
11
  const tool_1 = require("../tool");
11
12
  const registry_1 = require("./registry");
12
13
  const APP_REMINDER_META_KEYS = new Set([
@@ -137,6 +138,7 @@ function toReminderState(reminder) {
137
138
  content: reminder.content,
138
139
  meta: extractOwnerMeta(reminder.meta),
139
140
  echoback: reminder.echoback,
141
+ renderMode: reminder.renderMode ?? 'markdown',
140
142
  };
141
143
  }
142
144
  function findOwnedReminderEntries(dlg, descriptor, owner) {
@@ -167,12 +169,20 @@ function fallbackRenderedReminder(reminder) {
167
169
  }
168
170
  async function persistAndPublishReminders(dlg) {
169
171
  await dlg.dlgStore.persistReminders(dlg, dlg.reminders);
170
- const reminders = dlg.reminders.map((reminder) => ({
172
+ const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(dlg.agentId);
173
+ const visibleReminders = [
174
+ ...dlg.reminders.map((reminder) => (0, tool_1.cloneReminder)(reminder)),
175
+ ...sharedReminders,
176
+ ];
177
+ visibleReminders.sort(tool_1.compareReminderDisplayOrder);
178
+ const reminders = visibleReminders.map((reminder) => ({
171
179
  content: reminder.content,
172
180
  meta: isRecord(reminder.meta) ? reminder.meta : undefined,
173
181
  reminder_id: reminder.id,
182
+ renderRevision: (0, tool_1.computeReminderRenderRevision)(reminder),
174
183
  echoback: (0, tool_1.reminderEchoBackEnabled)(reminder),
175
184
  scope: reminder.scope,
185
+ renderMode: reminder.renderMode ?? 'markdown',
176
186
  }));
177
187
  const evt = { type: 'full_reminders_update', reminders };
178
188
  (0, evt_registry_1.postDialogEvent)(dlg, evt);
@@ -276,7 +286,10 @@ async function applyAppReminderRequests(dlg, params) {
276
286
  case 'noop':
277
287
  break;
278
288
  case 'add': {
279
- dlg.addReminder(result.reminder.content, owner, buildAppReminderMeta(descriptor, result.reminder.meta), normalizeInsertPosition(dlg.reminders.length, result.position), { echoback: result.reminder.echoback });
289
+ dlg.addReminder(result.reminder.content, owner, buildAppReminderMeta(descriptor, result.reminder.meta), normalizeInsertPosition(dlg.reminders.length, result.position), {
290
+ echoback: result.reminder.echoback,
291
+ renderMode: result.reminder.renderMode ?? 'markdown',
292
+ });
280
293
  changed = true;
281
294
  break;
282
295
  }
@@ -285,7 +298,11 @@ async function applyAppReminderRequests(dlg, params) {
285
298
  if (!target) {
286
299
  throw new Error(`App '${params.appId}' reminder owner '${request.ownerRef}' returned invalid ownedIndex=${result.ownedIndex}`);
287
300
  }
288
- dlg.updateReminder(target.index, result.reminder.content, buildAppReminderMeta(descriptor, result.reminder.meta), { echoback: result.reminder.echoback });
301
+ dlg.updateReminder(target.index, result.reminder.content, buildAppReminderMeta(descriptor, result.reminder.meta), {
302
+ echoback: result.reminder.echoback,
303
+ // Preserve the existing render mode when the app does not explicitly override it.
304
+ renderMode: result.reminder.renderMode ?? target.reminder.renderMode ?? 'markdown',
305
+ });
289
306
  changed = true;
290
307
  break;
291
308
  }
@@ -181,6 +181,11 @@ function computeReminderInsertIndex(reminders, positionValue, predicate) {
181
181
  }
182
182
  return insertIndex;
183
183
  }
184
+ function parseReminderRenderMode(value) {
185
+ if (value === undefined)
186
+ return 'markdown';
187
+ return value === 'plain' || value === 'markdown' ? value : null;
188
+ }
184
189
  function getContinuationPackageContextHealthLevel(snapshot) {
185
190
  if (snapshot?.kind !== 'available') {
186
191
  return undefined;
@@ -380,6 +385,11 @@ exports.addReminderTool = {
380
385
  enum: ['dialog', 'personal'],
381
386
  description: 'Reminder visibility scope. Defaults to dialog.',
382
387
  },
388
+ render_mode: {
389
+ type: 'string',
390
+ enum: ['markdown', 'plain'],
391
+ description: 'How the reminder should render in WebUI. Defaults to markdown.',
392
+ },
383
393
  },
384
394
  },
385
395
  argsValidation: 'dominds',
@@ -399,6 +409,10 @@ exports.addReminderTool = {
399
409
  if (reminderScope === null) {
400
410
  return (0, tool_1.toolFailure)(t.invalidFormatAdd);
401
411
  }
412
+ const reminderRenderMode = parseReminderRenderMode(args['render_mode']);
413
+ if (reminderRenderMode === null) {
414
+ return (0, tool_1.toolFailure)(t.invalidFormatAdd);
415
+ }
402
416
  const positionValue = args['position'];
403
417
  const contextHealthLevel = getContinuationPackageContextHealthLevel(dlg.getLastContextHealth());
404
418
  const reminderMeta = contextHealthLevel === undefined
@@ -410,7 +424,10 @@ exports.addReminderTool = {
410
424
  if (reminderScope === 'dialog') {
411
425
  try {
412
426
  const insertIndex = computeReminderInsertIndex(dlg.reminders, positionValue, () => true);
413
- dlg.addReminder(reminderContent, undefined, reminderMeta, insertIndex, { scope: 'dialog' });
427
+ dlg.addReminder(reminderContent, undefined, reminderMeta, insertIndex, {
428
+ scope: 'dialog',
429
+ renderMode: reminderRenderMode,
430
+ });
414
431
  return (0, tool_result_messages_1.formatToolActionResult)(language, 'added');
415
432
  }
416
433
  catch (error) {
@@ -432,6 +449,7 @@ exports.addReminderTool = {
432
449
  content: reminderContent,
433
450
  meta: reminderMeta,
434
451
  scope: 'personal',
452
+ renderMode: reminderRenderMode,
435
453
  });
436
454
  reminders.push(reminder);
437
455
  });
@@ -467,6 +485,11 @@ exports.updateReminderTool = {
467
485
  properties: {
468
486
  reminder_id: { type: 'string', description: 'Stable reminder id.' },
469
487
  content: { type: 'string', description: 'New reminder content.' },
488
+ render_mode: {
489
+ type: 'string',
490
+ enum: ['markdown', 'plain'],
491
+ description: 'Optional render mode override. Defaults to preserving current mode.',
492
+ },
470
493
  },
471
494
  },
472
495
  argsValidation: 'dominds',
@@ -498,12 +521,21 @@ exports.updateReminderTool = {
498
521
  const reminderContent = typeof contentValue === 'string' ? contentValue.trim() : '';
499
522
  if (!reminderContent)
500
523
  return (0, tool_1.toolFailure)(t.reminderContentEmpty);
524
+ const requestedRenderMode = args['render_mode'];
525
+ const reminderRenderMode = requestedRenderMode === undefined
526
+ ? reminder.renderMode
527
+ : parseReminderRenderMode(requestedRenderMode);
528
+ if (reminderRenderMode === null) {
529
+ return (0, tool_1.toolFailure)(t.invalidFormatUpdate);
530
+ }
501
531
  const contextHealthLevel = getContinuationPackageContextHealthLevel(dlg.getLastContextHealth());
502
532
  if (contextHealthLevel === undefined) {
503
533
  const stripResult = removeContinuationPackageReminderMeta(reminder?.meta);
504
534
  if (stripResult.changed) {
505
535
  if (resolved.target.source === 'dialog') {
506
- dlg.updateReminder(resolved.target.index, reminderContent, stripResult.nextMeta);
536
+ dlg.updateReminder(resolved.target.index, reminderContent, stripResult.nextMeta, {
537
+ renderMode: reminderRenderMode,
538
+ });
507
539
  }
508
540
  else {
509
541
  await (0, shared_reminders_1.mutateAgentSharedReminders)(resolved.target.agentId, (reminders) => {
@@ -511,6 +543,7 @@ exports.updateReminderTool = {
511
543
  ...reminders[resolved.target.index],
512
544
  content: reminderContent,
513
545
  meta: stripResult.nextMeta,
546
+ renderMode: reminderRenderMode ?? reminders[resolved.target.index]?.renderMode,
514
547
  };
515
548
  });
516
549
  dlg.touchReminders();
@@ -518,13 +551,16 @@ exports.updateReminderTool = {
518
551
  return (0, tool_result_messages_1.formatToolActionResult)(language, 'updated');
519
552
  }
520
553
  if (resolved.target.source === 'dialog') {
521
- dlg.updateReminder(resolved.target.index, reminderContent);
554
+ dlg.updateReminder(resolved.target.index, reminderContent, undefined, {
555
+ renderMode: reminderRenderMode,
556
+ });
522
557
  }
523
558
  else {
524
559
  await (0, shared_reminders_1.mutateAgentSharedReminders)(resolved.target.agentId, (reminders) => {
525
560
  reminders[resolved.target.index] = {
526
561
  ...reminders[resolved.target.index],
527
562
  content: reminderContent,
563
+ renderMode: reminderRenderMode ?? reminders[resolved.target.index]?.renderMode,
528
564
  };
529
565
  });
530
566
  dlg.touchReminders();
@@ -537,7 +573,9 @@ exports.updateReminderTool = {
537
573
  contextHealthLevel,
538
574
  });
539
575
  if (resolved.target.source === 'dialog') {
540
- dlg.updateReminder(resolved.target.index, reminderContent, reminderMeta);
576
+ dlg.updateReminder(resolved.target.index, reminderContent, reminderMeta, {
577
+ renderMode: reminderRenderMode,
578
+ });
541
579
  }
542
580
  else {
543
581
  await (0, shared_reminders_1.mutateAgentSharedReminders)(resolved.target.agentId, (reminders) => {
@@ -545,6 +583,7 @@ exports.updateReminderTool = {
545
583
  ...reminders[resolved.target.index],
546
584
  content: reminderContent,
547
585
  meta: reminderMeta,
586
+ renderMode: reminderRenderMode ?? reminders[resolved.target.index]?.renderMode,
548
587
  };
549
588
  });
550
589
  dlg.touchReminders();
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Budget for a single directly readable manual request.
3
+ *
4
+ * This is a product budget, not a measured runtime maximum: build-time validation can only see
5
+ * statically known manual surfaces, while rtws-specific app/MCP manuals are discovered later.
6
+ * Keep enough headroom for legitimate long-form chapters, but still fail obviously bloated
7
+ * handbook content during build instead of discovering it only at runtime.
8
+ */
9
+ export declare const MANUAL_SINGLE_REQUEST_CHAR_LIMIT = 25000;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MANUAL_SINGLE_REQUEST_CHAR_LIMIT = void 0;
4
+ /**
5
+ * Budget for a single directly readable manual request.
6
+ *
7
+ * This is a product budget, not a measured runtime maximum: build-time validation can only see
8
+ * statically known manual surfaces, while rtws-specific app/MCP manuals are discovered later.
9
+ * Keep enough headroom for legitimate long-form chapters, but still fail obviously bloated
10
+ * handbook content during build instead of discovering it only at runtime.
11
+ */
12
+ exports.MANUAL_SINGLE_REQUEST_CHAR_LIMIT = 25000;