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
package/dist/tools/os.js CHANGED
@@ -13,6 +13,7 @@ exports.getDaemonOutputTool = exports.stopDaemonTool = exports.readonlyShellTool
13
13
  exports.resetTrackedDaemonsForTests = resetTrackedDaemonsForTests;
14
14
  const time_1 = require("@longrun-ai/kernel/utils/time");
15
15
  const child_process_1 = require("child_process");
16
+ const crypto_1 = __importDefault(require("crypto"));
16
17
  const fs_1 = __importDefault(require("fs"));
17
18
  const module_1 = require("module");
18
19
  const net_1 = __importDefault(require("net"));
@@ -288,16 +289,22 @@ function isShellCmdReminder(reminder) {
288
289
  return ((0, tool_1.reminderOwnedBy)(reminder, exports.shellCmdReminderOwner.name) && isShellCmdReminderMeta(reminder.meta));
289
290
  }
290
291
  function buildShellCmdReminderMeta(previousMeta, daemon, options) {
292
+ const outputFingerprint = buildDaemonOutputFingerprint(daemon);
291
293
  const nextMeta = {
292
294
  kind: 'daemon',
293
295
  pid: daemon.pid,
294
296
  initialCommandLine: previousMeta.initialCommandLine,
295
297
  shell: previousMeta.shell,
296
298
  startTime: previousMeta.startTime,
297
- delete: {
298
- altInstruction: `stop_daemon({ "pid": ${daemon.pid} })`,
299
+ update: {
300
+ altInstruction: `get_daemon_output({ "pid": ${daemon.pid} })`,
299
301
  },
300
302
  };
303
+ if (!options?.completed) {
304
+ nextMeta['delete'] = {
305
+ altInstruction: `stop_daemon({ "pid": ${daemon.pid} })`,
306
+ };
307
+ }
301
308
  nextMeta['daemonCommandLine'] = daemon.daemonCommandLine;
302
309
  nextMeta['runnerPid'] = daemon.runnerPid;
303
310
  nextMeta['runnerEndpoint'] = daemon.runnerEndpoint;
@@ -313,12 +320,90 @@ function buildShellCmdReminderMeta(previousMeta, daemon, options) {
313
320
  if (options?.lastUpdated !== undefined) {
314
321
  nextMeta['lastUpdated'] = options.lastUpdated;
315
322
  }
323
+ nextMeta['stdoutDigestSha256'] = outputFingerprint.stdoutDigestSha256;
324
+ nextMeta['stdoutLinesScrolledOut'] = outputFingerprint.stdoutLinesScrolledOut;
325
+ nextMeta['stderrDigestSha256'] = outputFingerprint.stderrDigestSha256;
326
+ nextMeta['stderrLinesScrolledOut'] = outputFingerprint.stderrLinesScrolledOut;
316
327
  return nextMeta;
317
328
  }
329
+ function sha256HexUtf8(text) {
330
+ return crypto_1.default.createHash('sha256').update(text, 'utf8').digest('hex');
331
+ }
332
+ function buildDaemonOutputFingerprint(daemon) {
333
+ return {
334
+ stdoutDigestSha256: sha256HexUtf8(daemon.stdoutContent),
335
+ stdoutLinesScrolledOut: daemon.stdoutLinesScrolledOut,
336
+ stderrDigestSha256: sha256HexUtf8(daemon.stderrContent),
337
+ stderrLinesScrolledOut: daemon.stderrLinesScrolledOut,
338
+ };
339
+ }
340
+ function daemonOutputFingerprintMatchesReminder(meta, daemon) {
341
+ const current = buildDaemonOutputFingerprint(daemon);
342
+ return (meta.stdoutDigestSha256 === current.stdoutDigestSha256 &&
343
+ meta.stdoutLinesScrolledOut === current.stdoutLinesScrolledOut &&
344
+ meta.stderrDigestSha256 === current.stderrDigestSha256 &&
345
+ meta.stderrLinesScrolledOut === current.stderrLinesScrolledOut);
346
+ }
347
+ function buildShellCmdRecoveryErrorMeta(previousMeta, errorText, lastUpdated) {
348
+ return {
349
+ ...previousMeta,
350
+ recoveryErrorText: errorText,
351
+ lastUpdated,
352
+ };
353
+ }
354
+ function buildShellCmdFinalizedMeta(previousMeta, lastUpdated) {
355
+ const { delete: _delete, recoveryErrorText: _recoveryErrorText, ...rest } = previousMeta;
356
+ return {
357
+ ...rest,
358
+ kind: 'daemon',
359
+ completed: true,
360
+ lastUpdated,
361
+ update: {
362
+ altInstruction: `get_daemon_output({ "pid": ${previousMeta.pid} })`,
363
+ },
364
+ };
365
+ }
366
+ function formatDaemonLifecyclePhaseSummary(command, phase, language) {
367
+ if (language === 'zh') {
368
+ return phase === 'running'
369
+ ? `🟢 ${command} 运行中(系统维护 / 实时真源 / 不可删除)`
370
+ : `🟡 ${command} 已退出(退出事件提示 / 确认看到后可删除)`;
371
+ }
372
+ return phase === 'running'
373
+ ? `🟢 ${command} running (system-maintained / live source of truth / not deletable)`
374
+ : `🟡 ${command} exited (exit event notice / delete after acknowledgment)`;
375
+ }
376
+ function formatExitedDaemonReminderContent(command, pid, language, lastKnownSnapshot) {
377
+ const phaseSummary = formatDaemonLifecyclePhaseSummary(command, 'exited', language);
378
+ return language === 'zh'
379
+ ? `${phaseSummary}
380
+
381
+ 如需核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下保留的是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
382
+
383
+ 最后一次已知状态快照:
384
+ ${lastKnownSnapshot}`
385
+ : `${phaseSummary}
386
+
387
+ If you need to verify 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.
388
+
389
+ Last known status snapshot:
390
+ ${lastKnownSnapshot}`;
391
+ }
392
+ function stripDaemonLifecyclePhaseSummary(content) {
393
+ const normalized = content.replace(/\r\n/g, '\n');
394
+ if (!normalized.startsWith('🟢 ') && !normalized.startsWith('🟡 ')) {
395
+ return content;
396
+ }
397
+ const separatorIndex = normalized.indexOf('\n\n');
398
+ if (separatorIndex === -1) {
399
+ return content;
400
+ }
401
+ return normalized.slice(separatorIndex + 2);
402
+ }
318
403
  function getOsToolMessages(language) {
319
404
  if (language === 'zh') {
320
405
  return {
321
- daemonStarted: (pid, timeoutSeconds, _command) => `🔄 命令已作为守护进程启动(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,已在后台继续运行。\n已添加提醒以跟踪其进度。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
406
+ daemonStarted: (pid, timeoutSeconds, command) => `🟢 ${command} 已转入后台持续运行(PID: ${pid})\n该进程在 ${timeoutSeconds} 秒内未完成,现已作为守护进程继续执行。你将看到同一张生命周期状态卡持续刷新:系统维护 / 实时真源 / 不可删除。\n\n需要时可使用 stop_daemon({"pid": ${pid}}) 终止该进程。`,
322
407
  commandCompleted: (exitCode, scrollNotice) => `✅ 命令已完成(退出码:${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
323
408
  scrolledLinesNotice: (lines) => `\n⚠️ 执行期间有 ${lines} 行已滚出可视范围`,
324
409
  stdoutLabel: '📤 stdout:',
@@ -333,7 +418,7 @@ function getOsToolMessages(language) {
333
418
  };
334
419
  }
335
420
  return {
336
- daemonStarted: (pid, timeoutSeconds, _command) => `🔄 Command started as daemon process (PID: ${pid})\nThe process didn't complete within ${timeoutSeconds} seconds and is now running in the background.\nA reminder has been added to track its progress.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
421
+ 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 card keep updating: system-maintained / live source of truth / not deletable.\n\nUse stop_daemon({"pid": ${pid}}) to terminate it when needed.`,
337
422
  commandCompleted: (exitCode, scrollNotice) => `✅ Command completed (exit code: ${exitCode ?? 'unknown'})${scrollNotice}\n\n`,
338
423
  scrolledLinesNotice: (lines) => `\n⚠️ ${lines} lines scrolled out of view during execution`,
339
424
  stdoutLabel: '📤 stdout:',
@@ -789,7 +874,7 @@ async function resolveDaemonFromMeta(meta) {
789
874
  };
790
875
  }
791
876
  }
792
- function formatRunnerBackedDaemonStatus(daemon, language) {
877
+ function formatRunnerBackedDaemonStatusDetails(daemon, language) {
793
878
  const uptime = Math.floor((Date.now() - daemon.startTime.getTime()) / 1000);
794
879
  const status = language === 'zh'
795
880
  ? daemon.isRunning
@@ -828,14 +913,14 @@ Shell: ${daemon.shell}
828
913
  已运行: ${uptime}s
829
914
  启动时间: ${(0, time_1.formatUnifiedTimestamp)(daemon.startTime)}${stdoutNotice}${stderrNotice}
830
915
 
831
- stdout 缓冲区快照:
916
+ stderr 缓冲区快照:
832
917
  ${fenceConsole}
833
- ${stdoutContent}
918
+ ${stderrContent}
834
919
  ${fenceEnd}
835
920
 
836
- stderr 缓冲区快照:
921
+ stdout 缓冲区快照:
837
922
  ${fenceConsole}
838
- ${stderrContent}
923
+ ${stdoutContent}
839
924
  ${fenceEnd}`
840
925
  : `Daemon PID: ${daemon.pid}
841
926
  Command: ${daemon.command}
@@ -844,16 +929,22 @@ Lifecycle status: ${status}
844
929
  Uptime: ${uptime}s
845
930
  Started at: ${(0, time_1.formatUnifiedTimestamp)(daemon.startTime)}${stdoutNotice}${stderrNotice}
846
931
 
847
- Stdout buffer snapshot:
932
+ Stderr buffer snapshot:
848
933
  ${fenceConsole}
849
- ${stdoutContent}
934
+ ${stderrContent}
850
935
  ${fenceEnd}
851
936
 
852
- Stderr buffer snapshot:
937
+ Stdout buffer snapshot:
853
938
  ${fenceConsole}
854
- ${stderrContent}
939
+ ${stdoutContent}
855
940
  ${fenceEnd}`;
856
941
  }
942
+ function formatRunnerBackedDaemonStatus(daemon, language) {
943
+ const phaseSummary = formatDaemonLifecyclePhaseSummary(daemon.command, 'running', language);
944
+ return `${phaseSummary}
945
+
946
+ ${formatRunnerBackedDaemonStatusDetails(daemon, language)}`;
947
+ }
857
948
  function formatRunnerRecoveryError(pid, errorText, language) {
858
949
  return language === 'zh'
859
950
  ? `⚠️ 守护进程 ${pid} 的 runner 恢复失败:${errorText}`
@@ -980,14 +1071,14 @@ Shell: ${daemon.shell}
980
1071
  已运行: ${uptime}s
981
1072
  启动时间: ${(0, time_1.formatUnifiedTimestamp)(daemon.startTime)}${scrollNotice}
982
1073
 
983
- stdout 缓冲区快照:
1074
+ stderr 缓冲区快照:
984
1075
  ${fenceConsole}
985
- ${stdoutContent}
1076
+ ${stderrContent}
986
1077
  ${fenceEnd}
987
1078
 
988
- stderr 缓冲区快照:
1079
+ stdout 缓冲区快照:
989
1080
  ${fenceConsole}
990
- ${stderrContent}
1081
+ ${stdoutContent}
991
1082
  ${fenceEnd}`
992
1083
  : `Daemon PID: ${daemon.pid}
993
1084
  Command: ${daemon.command}
@@ -996,14 +1087,14 @@ Lifecycle status: ${status}
996
1087
  Uptime: ${uptime}s
997
1088
  Started at: ${(0, time_1.formatUnifiedTimestamp)(daemon.startTime)}${scrollNotice}
998
1089
 
999
- Stdout buffer snapshot:
1090
+ Stderr buffer snapshot:
1000
1091
  ${fenceConsole}
1001
- ${stdoutContent}
1092
+ ${stderrContent}
1002
1093
  ${fenceEnd}
1003
1094
 
1004
- Stderr buffer snapshot:
1095
+ Stdout buffer snapshot:
1005
1096
  ${fenceConsole}
1006
- ${stderrContent}
1097
+ ${stdoutContent}
1007
1098
  ${fenceEnd}`;
1008
1099
  }
1009
1100
  // ReminderOwner implementation for shell command tool
@@ -1016,29 +1107,53 @@ exports.shellCmdReminderOwner = {
1016
1107
  const pid = reminder.meta.pid;
1017
1108
  const resolved = await resolveDaemonFromMeta(reminder.meta);
1018
1109
  if (resolved.kind === 'gone') {
1019
- return { treatment: 'drop' };
1110
+ const isTrackedDaemon = reminder.meta.completed === true ||
1111
+ reminder.meta.runnerEndpoint !== undefined ||
1112
+ reminder.meta.runnerPid !== undefined;
1113
+ if (!isTrackedDaemon) {
1114
+ return { treatment: 'drop' };
1115
+ }
1116
+ if (reminder.meta.completed === true) {
1117
+ return { treatment: 'keep' };
1118
+ }
1119
+ return {
1120
+ treatment: 'update',
1121
+ updatedContent: formatExitedDaemonReminderContent(reminder.meta.initialCommandLine, pid, (0, work_language_1.getWorkLanguage)(), stripDaemonLifecyclePhaseSummary(reminder.content)),
1122
+ updatedMeta: buildShellCmdFinalizedMeta(reminder.meta, (0, time_1.formatUnifiedTimestamp)(new Date())),
1123
+ };
1020
1124
  }
1021
1125
  if (resolved.kind === 'error') {
1126
+ const errorContent = formatRunnerRecoveryError(pid, resolved.errorText, (0, work_language_1.getWorkLanguage)());
1127
+ if (reminder.meta.recoveryErrorText === resolved.errorText &&
1128
+ reminder.content === errorContent) {
1129
+ return { treatment: 'keep' };
1130
+ }
1022
1131
  return {
1023
1132
  treatment: 'update',
1024
- updatedContent: formatRunnerRecoveryError(pid, resolved.errorText, (0, work_language_1.getWorkLanguage)()),
1025
- updatedMeta: {
1026
- ...reminder.meta,
1027
- lastUpdated: (0, time_1.formatUnifiedTimestamp)(new Date()),
1028
- },
1133
+ updatedContent: errorContent,
1134
+ updatedMeta: buildShellCmdRecoveryErrorMeta(reminder.meta, resolved.errorText, (0, time_1.formatUnifiedTimestamp)(new Date())),
1029
1135
  };
1030
1136
  }
1031
1137
  const daemon = resolved.daemon;
1032
1138
  if (!daemon.isRunning) {
1139
+ const completedContent = formatExitedDaemonReminderContent(daemon.command, pid, (0, work_language_1.getWorkLanguage)(), formatRunnerBackedDaemonStatusDetails(daemon, (0, work_language_1.getWorkLanguage)()));
1140
+ if (reminder.meta.completed === true &&
1141
+ daemonOutputFingerprintMatchesReminder(reminder.meta, daemon) &&
1142
+ reminder.content === completedContent) {
1143
+ return { treatment: 'keep' };
1144
+ }
1033
1145
  return {
1034
1146
  treatment: 'update',
1035
- updatedContent: `🏁 Process ${pid} has completed:\n\n${formatRunnerBackedDaemonStatus(daemon, (0, work_language_1.getWorkLanguage)())}`,
1147
+ updatedContent: completedContent,
1036
1148
  updatedMeta: buildShellCmdReminderMeta(reminder.meta, daemon, {
1037
1149
  completed: true,
1038
1150
  lastUpdated: (0, time_1.formatUnifiedTimestamp)(new Date()),
1039
1151
  }),
1040
1152
  };
1041
1153
  }
1154
+ if (daemonOutputFingerprintMatchesReminder(reminder.meta, daemon)) {
1155
+ return { treatment: 'keep' };
1156
+ }
1042
1157
  return {
1043
1158
  treatment: 'update',
1044
1159
  updatedContent: formatRunnerBackedDaemonStatus(daemon, (0, work_language_1.getWorkLanguage)()),
@@ -1056,12 +1171,12 @@ exports.shellCmdReminderOwner = {
1056
1171
  type: 'environment_msg',
1057
1172
  role: 'user',
1058
1173
  content: language === 'zh'
1059
- ? `${prefix} 后台进程状态提醒 [${reminder.id}]
1060
- 这是系统维护的后台进程状态快照。把它当成环境信号,不是你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒会随进程生命周期自动更新或删除。
1174
+ ? `${prefix} 后台进程生命周期状态卡 [${reminder.id}]
1175
+ 这是系统维护的后台进程状态快照。把它当成环境信号,不是你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
1061
1176
  ---
1062
1177
  ${reminder.content}`
1063
- : `${prefix} Background process status reminder [${reminder.id}]
1064
- This is a system-maintained background process snapshot. Treat it as an environment signal, not a 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 will update or disappear automatically with the process lifecycle.
1178
+ : `${prefix} Background process lifecycle card [${reminder.id}]
1179
+ This is a system-maintained background process snapshot. Treat it as an environment signal, not a 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.
1065
1180
  ---
1066
1181
  ${reminder.content}`,
1067
1182
  };
@@ -1069,14 +1184,33 @@ ${reminder.content}`,
1069
1184
  const pid = reminder.meta.pid;
1070
1185
  const resolved = await resolveDaemonFromMeta(reminder.meta);
1071
1186
  if (resolved.kind === 'gone') {
1187
+ const isTrackedDaemon = reminder.meta.completed === true ||
1188
+ reminder.meta.runnerEndpoint !== undefined ||
1189
+ reminder.meta.runnerPid !== undefined;
1190
+ if (isTrackedDaemon) {
1191
+ const exitedSummary = formatDaemonLifecyclePhaseSummary(reminder.meta.initialCommandLine, 'exited', language);
1192
+ return {
1193
+ type: 'environment_msg',
1194
+ role: 'user',
1195
+ content: language === 'zh'
1196
+ ? `${prefix} 守护进程生命周期状态卡 [${reminder.id}] - ${exitedSummary}|PID ${pid}
1197
+ 该后台进程已退出。若需要再核对最后 stdout/stderr,可先按需调用 get_daemon_output({ "pid": ${pid} });若该调用已不可用,则以下是最后一次已知快照。确认已知悉后,请手动删除这条提醒。
1198
+ ---
1199
+ ${reminder.content}`
1200
+ : `${prefix} Daemon lifecycle card [${reminder.id}] - ${exitedSummary} | PID ${pid}
1201
+ 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.
1202
+ ---
1203
+ ${reminder.content}`,
1204
+ };
1205
+ }
1072
1206
  return {
1073
1207
  type: 'environment_msg',
1074
1208
  role: 'user',
1075
1209
  content: language === 'zh'
1076
1210
  ? `${prefix} 进程生命周期提醒 [${reminder.id}] - 后台进程已结束(PID ${pid})
1077
- 该后台进程的生命周期已经结束,当前不再运行。这条提醒应当很快自动消失;你也可以直接忽略它。`
1211
+ 该后台进程的生命周期已经结束,当前不再运行。`
1078
1212
  : `${prefix} Process lifecycle reminder [${reminder.id}] - daemon terminated (PID ${pid})
1079
- This daemon process has finished its lifecycle and is no longer running. This reminder should disappear automatically soon, and you may also ignore it.`,
1213
+ This daemon process has finished its lifecycle and is no longer running.`,
1080
1214
  };
1081
1215
  }
1082
1216
  if (resolved.kind === 'error') {
@@ -1093,17 +1227,18 @@ This daemon process has finished its lifecycle and is no longer running. This re
1093
1227
  : uptime < 3600
1094
1228
  ? `${Math.floor(uptime / 60)}m ${uptime % 60}s`
1095
1229
  : `${Math.floor(uptime / 3600)}h ${Math.floor((uptime % 3600) / 60)}m`;
1096
- const statusInfo = formatRunnerBackedDaemonStatus(daemon, language);
1230
+ const statusInfo = formatRunnerBackedDaemonStatusDetails(daemon, language);
1231
+ const runningSummary = formatDaemonLifecyclePhaseSummary(daemon.command, 'running', language);
1097
1232
  return {
1098
1233
  type: 'environment_msg',
1099
1234
  role: 'user',
1100
1235
  content: language === 'zh'
1101
- ? `🔄 ${prefix} 运行中后台进程状态 [${reminder.id}] - PID ${pid}(已运行 ${uptimeStr}
1236
+ ? `🔄 ${prefix} 守护进程生命周期状态卡 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
1102
1237
  这是系统维护的状态快照,不是新的用户诉求,也不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
1103
1238
 
1104
1239
  **状态快照:**
1105
1240
  ${statusInfo}`
1106
- : `🔄 ${prefix} Active daemon state [${reminder.id}] - PID ${pid} (uptime: ${uptimeStr})
1241
+ : `🔄 ${prefix} Daemon lifecycle card [${reminder.id}] - ${runningSummary} | PID ${pid}, uptime: ${uptimeStr}
1107
1242
  This is a system-maintained snapshot, not a new user request 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”.
1108
1243
 
1109
1244
  **State snapshot:**
@@ -1184,6 +1319,7 @@ exports.shellCmdTool = {
1184
1319
  owner: exports.shellCmdReminderOwner,
1185
1320
  meta: reminderMeta,
1186
1321
  scope: 'agent_shared',
1322
+ renderMode: 'markdown',
1187
1323
  });
1188
1324
  try {
1189
1325
  await (0, shared_reminders_1.mutateAgentSharedReminders)(dlg.agentId, (reminders) => {
@@ -1,4 +1,4 @@
1
- import type { Dialog } from '../dialog';
1
+ import { type Dialog } from '../dialog';
2
2
  import type { ReminderOwner } from '../tool';
3
3
  export declare function syncPendingTellaskReminderState(dlg: Dialog): Promise<boolean>;
4
4
  export declare const pendingTellaskReminderOwner: ReminderOwner;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.pendingTellaskReminderOwner = void 0;
4
4
  exports.syncPendingTellaskReminderState = syncPendingTellaskReminderState;
5
5
  const time_1 = require("@longrun-ai/kernel/utils/time");
6
+ const dialog_1 = require("../dialog");
6
7
  const persistence_1 = require("../persistence");
7
8
  const driver_messages_1 = require("../runtime/driver-messages");
8
9
  const tellask_labels_1 = require("../runtime/tellask-labels");
@@ -79,8 +80,13 @@ function makePendingSignature(pending) {
79
80
  .sort()
80
81
  .join('||');
81
82
  }
82
- function buildReminderMeta(pending) {
83
+ function buildReminderMeta(pending, previousMeta) {
83
84
  const language = (0, work_language_1.getWorkLanguage)();
85
+ const latestActivityAt = pending.length === 0
86
+ ? previousMeta?.pendingCount === 0
87
+ ? previousMeta.updatedAt
88
+ : (0, time_1.formatUnifiedTimestamp)(new Date())
89
+ : pending.reduce((latest, entry) => (entry.latestActivityAt > latest ? entry.latestActivityAt : latest), pending[0]?.latestActivityAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()));
84
90
  const deleteMeta = pending.length === 0
85
91
  ? {}
86
92
  : {
@@ -92,7 +98,7 @@ function buildReminderMeta(pending) {
92
98
  kind: 'pending_tellask',
93
99
  pendingCount: pending.length,
94
100
  pendingSignature: makePendingSignature(pending),
95
- updatedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
101
+ updatedAt: latestActivityAt,
96
102
  update: {
97
103
  altInstruction: getPendingTellaskUpdateAltInstruction(language),
98
104
  },
@@ -144,14 +150,19 @@ function assertSingleOwnedReminder(dlg) {
144
150
  }
145
151
  async function loadPendingSubdialogView(dlg) {
146
152
  const pending = await persistence_1.DialogPersistence.loadPendingSubdialogs(dlg.id, dlg.status);
147
- return pending.map((p) => ({
148
- subdialogId: p.subdialogId,
149
- mentionList: p.mentionList,
150
- tellaskContent: p.tellaskContent,
151
- targetAgentId: p.targetAgentId,
152
- callType: p.callType,
153
- callName: p.callName,
154
- sessionSlug: p.sessionSlug,
153
+ return await Promise.all(pending.map(async (p) => {
154
+ const subdialogId = new dialog_1.DialogID(p.subdialogId, dlg.id.rootId);
155
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(subdialogId, dlg.status);
156
+ return {
157
+ subdialogId: p.subdialogId,
158
+ latestActivityAt: latest?.lastModified ?? p.createdAt,
159
+ mentionList: p.mentionList,
160
+ tellaskContent: p.tellaskContent,
161
+ targetAgentId: p.targetAgentId,
162
+ callType: p.callType,
163
+ callName: p.callName,
164
+ sessionSlug: p.sessionSlug,
165
+ };
155
166
  }));
156
167
  }
157
168
  async function withDialogLockIfNeeded(dlg, fn) {
@@ -166,23 +177,30 @@ async function syncPendingTellaskReminderState(dlg) {
166
177
  const reminderIndex = assertSingleOwnedReminder(dlg);
167
178
  const language = (0, work_language_1.getWorkLanguage)();
168
179
  const content = buildReminderContent(language, pending);
169
- const nextMeta = buildReminderMeta(pending);
180
+ const currentReminder = reminderIndex === null ? undefined : dlg.reminders[reminderIndex];
181
+ const currentMeta = isPendingTellaskReminderMeta(currentReminder?.meta)
182
+ ? currentReminder.meta
183
+ : undefined;
184
+ const nextMeta = buildReminderMeta(pending, currentMeta);
170
185
  if (reminderIndex === null) {
171
186
  if (pending.length === 0) {
172
187
  return false;
173
188
  }
174
- dlg.addReminder(content, exports.pendingTellaskReminderOwner, nextMeta, 0);
189
+ dlg.addReminder(content, exports.pendingTellaskReminderOwner, nextMeta, 0, {
190
+ renderMode: 'markdown',
191
+ });
175
192
  return true;
176
193
  }
177
194
  const current = dlg.reminders[reminderIndex];
178
- const currentMeta = current?.meta;
195
+ const persistedMeta = current?.meta;
179
196
  const unchanged = current?.content === content &&
180
- isPendingTellaskReminderMeta(currentMeta) &&
181
- currentMeta.pendingSignature === nextMeta.pendingSignature &&
182
- currentMeta.pendingCount === nextMeta.pendingCount;
197
+ isPendingTellaskReminderMeta(persistedMeta) &&
198
+ persistedMeta.pendingSignature === nextMeta.pendingSignature &&
199
+ persistedMeta.pendingCount === nextMeta.pendingCount &&
200
+ persistedMeta.updatedAt === nextMeta.updatedAt;
183
201
  if (unchanged)
184
202
  return false;
185
- dlg.updateReminder(reminderIndex, content, nextMeta);
203
+ dlg.updateReminder(reminderIndex, content, nextMeta, { renderMode: 'markdown' });
186
204
  return true;
187
205
  });
188
206
  }
@@ -195,11 +213,13 @@ exports.pendingTellaskReminderOwner = {
195
213
  const pending = await loadPendingSubdialogView(dlg);
196
214
  const language = (0, work_language_1.getWorkLanguage)();
197
215
  const updatedContent = buildReminderContent(language, pending);
198
- const updatedMeta = buildReminderMeta(pending);
216
+ const currentMeta = isPendingTellaskReminderMeta(reminder.meta) ? reminder.meta : undefined;
217
+ const updatedMeta = buildReminderMeta(pending, currentMeta);
199
218
  const unchanged = reminder.content === updatedContent &&
200
219
  isPendingTellaskReminderMeta(reminder.meta) &&
201
220
  reminder.meta.pendingSignature === updatedMeta.pendingSignature &&
202
- reminder.meta.pendingCount === updatedMeta.pendingCount;
221
+ reminder.meta.pendingCount === updatedMeta.pendingCount &&
222
+ reminder.meta.updatedAt === updatedMeta.updatedAt;
203
223
  if (unchanged) {
204
224
  return { treatment: 'keep' };
205
225
  }
@@ -0,0 +1,2 @@
1
+ import type { LanguageCode } from '@longrun-ai/kernel/types/language';
2
+ export declare function renderTeamMgmtGuideContent(language: LanguageCode, topicsRaw?: readonly string[]): Promise<string>;