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.
- package/dist/apps-host/host.js +13 -2
- package/dist/apps-host/ipc-types.js +18 -1
- package/dist/dialog-fork.js +1 -0
- package/dist/dialog.js +5 -0
- package/dist/docs/mcp-support.md +4 -1
- package/dist/docs/team_mgmt-toolset.md +8 -7
- package/dist/docs/team_mgmt-toolset.zh.md +6 -5
- package/dist/mcp/manual-problems.d.ts +33 -0
- package/dist/mcp/manual-problems.js +323 -0
- package/dist/mcp/supervisor.js +23 -1
- package/dist/persistence.js +12 -0
- package/dist/priming.js +7 -0
- package/dist/shared-reminders.js +2 -0
- package/dist/tool.d.ts +5 -0
- package/dist/tool.js +66 -4
- package/dist/tools/app-reminders.js +20 -3
- package/dist/tools/ctrl.js +43 -4
- package/dist/tools/manual/output-limit.d.ts +9 -0
- package/dist/tools/manual/output-limit.js +12 -0
- package/dist/tools/os.js +173 -37
- package/dist/tools/pending-tellask-reminder.d.ts +1 -1
- package/dist/tools/pending-tellask-reminder.js +39 -19
- package/dist/tools/team_mgmt-manual.d.ts +2 -0
- package/dist/tools/team_mgmt-manual.js +160 -0
- package/dist/tools/team_mgmt-mcp-manual.d.ts +27 -0
- package/dist/tools/team_mgmt-mcp-manual.js +643 -0
- package/dist/tools/team_mgmt.d.ts +11 -1
- package/dist/tools/team_mgmt.js +22 -867
- package/dist/tools/toolset-manual.js +5 -5
- package/package.json +4 -4
- package/webapp/dist/assets/{_basePickBy-EK9iGcOl.js → _basePickBy-CgM-M_q8.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-EK9iGcOl.js.map → _basePickBy-CgM-M_q8.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-BHtz-XvO.js → _baseUniq-B06twih4.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-BHtz-XvO.js.map → _baseUniq-B06twih4.js.map} +1 -1
- package/webapp/dist/assets/{arc-NqUmMwkS.js → arc-CoXJvjeB.js} +2 -2
- package/webapp/dist/assets/{arc-NqUmMwkS.js.map → arc-CoXJvjeB.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CJ7Jb15a.js → architectureDiagram-2XIMDMQ5-BLFRWTKn.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CJ7Jb15a.js.map → architectureDiagram-2XIMDMQ5-BLFRWTKn.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-RNM7ujN4.js → blockDiagram-WCTKOSBZ-CYRE6deu.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-RNM7ujN4.js.map → blockDiagram-WCTKOSBZ-CYRE6deu.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-DKra5-za.js → c4Diagram-IC4MRINW-B26QTIJt.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-DKra5-za.js.map → c4Diagram-IC4MRINW-B26QTIJt.js.map} +1 -1
- package/webapp/dist/assets/{channel-CxE9sL_E.js → channel-C5U2W0P9.js} +2 -2
- package/webapp/dist/assets/{channel-CxE9sL_E.js.map → channel-C5U2W0P9.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-BlyIt9uv.js → chunk-4BX2VUAB-7z2PgnSv.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-BlyIt9uv.js.map → chunk-4BX2VUAB-7z2PgnSv.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-DsPShmjL.js → chunk-55IACEB6-6sRVmXqs.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-DsPShmjL.js.map → chunk-55IACEB6-6sRVmXqs.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-C2i0rEFF.js → chunk-FMBD7UC4-BwYp8OtY.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-C2i0rEFF.js.map → chunk-FMBD7UC4-BwYp8OtY.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-CK8inzJx.js → chunk-JSJVCQXG-CRq8LK53.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-CK8inzJx.js.map → chunk-JSJVCQXG-CRq8LK53.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-BjEK5_oI.js → chunk-KX2RTZJC-CzFE355P.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-BjEK5_oI.js.map → chunk-KX2RTZJC-CzFE355P.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-Clf489xc.js → chunk-NQ4KR5QH-3cQSOzCt.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-Clf489xc.js.map → chunk-NQ4KR5QH-3cQSOzCt.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-CMikir3s.js → chunk-QZHKN3VN-DWkpxb-w.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-CMikir3s.js.map → chunk-QZHKN3VN-DWkpxb-w.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-1gtCLicd.js → chunk-WL4C6EOR-DkpfoQzK.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-1gtCLicd.js.map → chunk-WL4C6EOR-DkpfoQzK.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-kzzlkQ_D.js → classDiagram-VBA2DB6C-mVfJeuZL.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-kzzlkQ_D.js.map → classDiagram-VBA2DB6C-mVfJeuZL.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-kzzlkQ_D.js → classDiagram-v2-RAHNMMFH-mVfJeuZL.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-kzzlkQ_D.js.map → classDiagram-v2-RAHNMMFH-mVfJeuZL.js.map} +1 -1
- package/webapp/dist/assets/{clone-XglJh1R0.js → clone-5uLJc7AC.js} +2 -2
- package/webapp/dist/assets/{clone-XglJh1R0.js.map → clone-5uLJc7AC.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A--gZrh2tG.js → cose-bilkent-S5V4N54A-CoiJzdQi.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A--gZrh2tG.js.map → cose-bilkent-S5V4N54A-CoiJzdQi.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-D_JMhNNL.js → dagre-KLK3FWXG-DU_3BSOq.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-D_JMhNNL.js.map → dagre-KLK3FWXG-DU_3BSOq.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-HkYhqJDL.js → diagram-E7M64L7V-DgqOvF1U.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-HkYhqJDL.js.map → diagram-E7M64L7V-DgqOvF1U.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-BFv5iU5U.js → diagram-IFDJBPK2-CFWMc1oD.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-BFv5iU5U.js.map → diagram-IFDJBPK2-CFWMc1oD.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-Dg46tTnk.js → diagram-P4PSJMXO-lrqvXDXp.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-Dg46tTnk.js.map → diagram-P4PSJMXO-lrqvXDXp.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BzJClUtq.js → erDiagram-INFDFZHY-C28KjRkA.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-BzJClUtq.js.map → erDiagram-INFDFZHY-C28KjRkA.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-IBGgxeki.js → flowDiagram-PKNHOUZH-DkxGh-JF.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-IBGgxeki.js.map → flowDiagram-PKNHOUZH-DkxGh-JF.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DdxgzFKe.js → ganttDiagram-A5KZAMGK-BmZnHD96.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DdxgzFKe.js.map → ganttDiagram-A5KZAMGK-BmZnHD96.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C14OpSSI.js → gitGraphDiagram-K3NZZRJ6-xiHqomZC.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-C14OpSSI.js.map → gitGraphDiagram-K3NZZRJ6-xiHqomZC.js.map} +1 -1
- package/webapp/dist/assets/{graph-BrKKvSVx.js → graph-ozb0amP0.js} +3 -3
- package/webapp/dist/assets/{graph-BrKKvSVx.js.map → graph-ozb0amP0.js.map} +1 -1
- package/webapp/dist/assets/{index-BV_dDe3L.js → index-Cyx7eev_.js} +700 -165
- package/webapp/dist/assets/{index-BV_dDe3L.js.map → index-Cyx7eev_.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-k0Yv94VI.js → infoDiagram-LFFYTUFH-fLl_TA1F.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-k0Yv94VI.js.map → infoDiagram-LFFYTUFH-fLl_TA1F.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-C3EYBxjN.js → ishikawaDiagram-PHBUUO56-ZL9tBKUr.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-C3EYBxjN.js.map → ishikawaDiagram-PHBUUO56-ZL9tBKUr.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BnSlOrbq.js → journeyDiagram-4ABVD52K--aRyymZs.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BnSlOrbq.js.map → journeyDiagram-4ABVD52K--aRyymZs.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CNYH0HDF.js → kanban-definition-K7BYSVSG-BO_QdW_O.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CNYH0HDF.js.map → kanban-definition-K7BYSVSG-BO_QdW_O.js.map} +1 -1
- package/webapp/dist/assets/{layout-NtmBC9CZ.js → layout-Bu3Xw0z2.js} +5 -5
- package/webapp/dist/assets/{layout-NtmBC9CZ.js.map → layout-Bu3Xw0z2.js.map} +1 -1
- package/webapp/dist/assets/{linear-BrqwApt9.js → linear-Bq77itJm.js} +2 -2
- package/webapp/dist/assets/{linear-BrqwApt9.js.map → linear-Bq77itJm.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DcknQb8H.js → mindmap-definition-YRQLILUH-CHB8qv8L.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-DcknQb8H.js.map → mindmap-definition-YRQLILUH-CHB8qv8L.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-wydKHXzN.js → pieDiagram-SKSYHLDU-Cxg_wh4K.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-wydKHXzN.js.map → pieDiagram-SKSYHLDU-Cxg_wh4K.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D6i3VaFO.js → quadrantDiagram-337W2JSQ-DFguuaS9.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-D6i3VaFO.js.map → quadrantDiagram-337W2JSQ-DFguuaS9.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-C0sBwH6H.js → requirementDiagram-Z7DCOOCP--tJ_dfsT.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-C0sBwH6H.js.map → requirementDiagram-Z7DCOOCP--tJ_dfsT.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-33jPg4PK.js → sankeyDiagram-WA2Y5GQK-f0zWimMc.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-33jPg4PK.js.map → sankeyDiagram-WA2Y5GQK-f0zWimMc.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CJsKHnh5.js → sequenceDiagram-2WXFIKYE-dwXRRnyq.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-CJsKHnh5.js.map → sequenceDiagram-2WXFIKYE-dwXRRnyq.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-B6A5jTdU.js → stateDiagram-RAJIS63D-DToxcEC2.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-B6A5jTdU.js.map → stateDiagram-RAJIS63D-DToxcEC2.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-6YIjpVKr.js → stateDiagram-v2-FVOUBMTO-BY5hDUqz.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-6YIjpVKr.js.map → stateDiagram-v2-FVOUBMTO-BY5hDUqz.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BQS5KHfj.js → timeline-definition-YZTLITO2-CT3WRcFt.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BQS5KHfj.js.map → timeline-definition-YZTLITO2-CT3WRcFt.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-DB1uUX8l.js → treemap-KZPCXAKY-Lnkh2bpd.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-DB1uUX8l.js.map → treemap-KZPCXAKY-Lnkh2bpd.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BtcfWZJx.js → vennDiagram-LZ73GAT5-CYSLSh1w.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BtcfWZJx.js.map → vennDiagram-LZ73GAT5-CYSLSh1w.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CfIdcI74.js → xychartDiagram-JWTSCODW-DgvaqrGO.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-CfIdcI74.js.map → xychartDiagram-JWTSCODW-DgvaqrGO.js.map} +1 -1
- 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
|
-
|
|
298
|
-
altInstruction: `
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
916
|
+
stderr 缓冲区快照:
|
|
832
917
|
${fenceConsole}
|
|
833
|
-
${
|
|
918
|
+
${stderrContent}
|
|
834
919
|
${fenceEnd}
|
|
835
920
|
|
|
836
|
-
|
|
921
|
+
stdout 缓冲区快照:
|
|
837
922
|
${fenceConsole}
|
|
838
|
-
${
|
|
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
|
-
|
|
932
|
+
Stderr buffer snapshot:
|
|
848
933
|
${fenceConsole}
|
|
849
|
-
${
|
|
934
|
+
${stderrContent}
|
|
850
935
|
${fenceEnd}
|
|
851
936
|
|
|
852
|
-
|
|
937
|
+
Stdout buffer snapshot:
|
|
853
938
|
${fenceConsole}
|
|
854
|
-
${
|
|
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
|
-
|
|
1074
|
+
stderr 缓冲区快照:
|
|
984
1075
|
${fenceConsole}
|
|
985
|
-
${
|
|
1076
|
+
${stderrContent}
|
|
986
1077
|
${fenceEnd}
|
|
987
1078
|
|
|
988
|
-
|
|
1079
|
+
stdout 缓冲区快照:
|
|
989
1080
|
${fenceConsole}
|
|
990
|
-
${
|
|
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
|
-
|
|
1090
|
+
Stderr buffer snapshot:
|
|
1000
1091
|
${fenceConsole}
|
|
1001
|
-
${
|
|
1092
|
+
${stderrContent}
|
|
1002
1093
|
${fenceEnd}
|
|
1003
1094
|
|
|
1004
|
-
|
|
1095
|
+
Stdout buffer snapshot:
|
|
1005
1096
|
${fenceConsole}
|
|
1006
|
-
${
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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}
|
|
1060
|
-
|
|
1174
|
+
? `${prefix} 后台进程生命周期状态卡 [${reminder.id}]
|
|
1175
|
+
这是系统维护的后台进程状态快照。把它当成环境信号,不是你自己写的工作便签。若它没有实质改变你的判断/计划/风险,则禁止做任何用户可见回应(禁止写“静默吸收”“已收到”等占位语句);只有它实际影响后续动作时,才在下一条有实质内容的回复中体现相关事实。该提醒在进程运行期间会自动更新;进程结束后会保留终态,等待你确认后手动删除。
|
|
1061
1176
|
---
|
|
1062
1177
|
${reminder.content}`
|
|
1063
|
-
: `${prefix} Background process
|
|
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
|
|
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
|
|
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 =
|
|
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}
|
|
1236
|
+
? `🔄 ${prefix} 守护进程生命周期状态卡 [${reminder.id}] - ${runningSummary}|PID ${pid},已运行 ${uptimeStr}
|
|
1102
1237
|
这是系统维护的状态快照,不是新的用户诉求,也不是默认需要单独汇报的事项。若下面的信息没有实质改变你的判断、计划、风险,且不需要调用守护进程相关工具,则禁止做任何用户可见回应;若它有实质影响,只在下一条有实质内容的回复中体现,禁止单独发送“静默吸收”“已收到”等占位语句。
|
|
1103
1238
|
|
|
1104
1239
|
**状态快照:**
|
|
1105
1240
|
${statusInfo}`
|
|
1106
|
-
: `🔄 ${prefix}
|
|
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
|
|
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:
|
|
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
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
|
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
|
|
195
|
+
const persistedMeta = current?.meta;
|
|
179
196
|
const unchanged = current?.content === content &&
|
|
180
|
-
isPendingTellaskReminderMeta(
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
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
|
}
|