dominds 1.11.2 → 1.12.0
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/ipc-types.d.ts +1 -1
- package/dist/apps-host/ipc-types.js +4 -7
- package/dist/dialog-fork.js +9 -2
- package/dist/dialog.d.ts +16 -1
- package/dist/dialog.js +107 -43
- package/dist/llm/defaults.yaml +3 -3
- package/dist/llm/kernel-driver/drive.js +8 -13
- package/dist/llm/kernel-driver/runtime.js +12 -4
- package/dist/minds/system-prompt-parts.js +2 -2
- package/dist/persistence.js +16 -9
- package/dist/priming.d.ts +1 -1
- package/dist/priming.js +21 -10
- package/dist/runtime/driver-messages.d.ts +1 -1
- package/dist/runtime/driver-messages.js +21 -21
- package/dist/shared-reminders.d.ts +4 -0
- package/dist/shared-reminders.js +184 -0
- package/dist/tool.d.ts +22 -3
- package/dist/tool.js +48 -14
- package/dist/tools/app-reminders.js +8 -9
- package/dist/tools/ctrl.d.ts +2 -2
- package/dist/tools/ctrl.js +101 -94
- package/dist/tools/mcp.js +5 -5
- package/dist/tools/os.d.ts +1 -0
- package/dist/tools/os.js +144 -66
- package/dist/tools/pending-tellask-reminder.js +5 -5
- package/dist/tools/prompts/control/en/errors.md +1 -1
- package/dist/tools/prompts/control/en/scenarios.md +2 -2
- package/dist/tools/prompts/control/en/tools.md +8 -8
- package/dist/tools/prompts/control/zh/errors.md +1 -1
- package/dist/tools/prompts/control/zh/scenarios.md +2 -2
- package/dist/tools/prompts/control/zh/tools.md +8 -8
- package/package.json +1 -1
- package/webapp/dist/assets/{_basePickBy-VvT_9kRm.js → _basePickBy-DMF7NBah.js} +3 -3
- package/webapp/dist/assets/{_basePickBy-VvT_9kRm.js.map → _basePickBy-DMF7NBah.js.map} +1 -1
- package/webapp/dist/assets/{_baseUniq-D9_-G6c9.js → _baseUniq-DeiPg60R.js} +2 -2
- package/webapp/dist/assets/{_baseUniq-D9_-G6c9.js.map → _baseUniq-DeiPg60R.js.map} +1 -1
- package/webapp/dist/assets/{arc-BbofkRAx.js → arc-f0CvrI__.js} +2 -2
- package/webapp/dist/assets/{arc-BbofkRAx.js.map → arc-f0CvrI__.js.map} +1 -1
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Dn2yTFsM.js → architectureDiagram-2XIMDMQ5-CrjP1jdI.js} +7 -7
- package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-Dn2yTFsM.js.map → architectureDiagram-2XIMDMQ5-CrjP1jdI.js.map} +1 -1
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BT13QjyS.js → blockDiagram-WCTKOSBZ-BQMfXYC9.js} +7 -7
- package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-BT13QjyS.js.map → blockDiagram-WCTKOSBZ-BQMfXYC9.js.map} +1 -1
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-CDSHxATH.js → c4Diagram-IC4MRINW-UmHA8MkS.js} +3 -3
- package/webapp/dist/assets/{c4Diagram-IC4MRINW-CDSHxATH.js.map → c4Diagram-IC4MRINW-UmHA8MkS.js.map} +1 -1
- package/webapp/dist/assets/{channel-frrfgRkc.js → channel-DC4CexVY.js} +2 -2
- package/webapp/dist/assets/{channel-frrfgRkc.js.map → channel-DC4CexVY.js.map} +1 -1
- package/webapp/dist/assets/{chunk-4BX2VUAB-DfC5GXR7.js → chunk-4BX2VUAB-DdX7m7QE.js} +2 -2
- package/webapp/dist/assets/{chunk-4BX2VUAB-DfC5GXR7.js.map → chunk-4BX2VUAB-DdX7m7QE.js.map} +1 -1
- package/webapp/dist/assets/{chunk-55IACEB6-DSJQfcDq.js → chunk-55IACEB6-DmhQbxLG.js} +2 -2
- package/webapp/dist/assets/{chunk-55IACEB6-DSJQfcDq.js.map → chunk-55IACEB6-DmhQbxLG.js.map} +1 -1
- package/webapp/dist/assets/{chunk-FMBD7UC4-BWQBo1hf.js → chunk-FMBD7UC4-SJ7NGBwq.js} +2 -2
- package/webapp/dist/assets/{chunk-FMBD7UC4-BWQBo1hf.js.map → chunk-FMBD7UC4-SJ7NGBwq.js.map} +1 -1
- package/webapp/dist/assets/{chunk-JSJVCQXG-BzT1-gT-.js → chunk-JSJVCQXG-DCLKNp5s.js} +2 -2
- package/webapp/dist/assets/{chunk-JSJVCQXG-BzT1-gT-.js.map → chunk-JSJVCQXG-DCLKNp5s.js.map} +1 -1
- package/webapp/dist/assets/{chunk-KX2RTZJC-Bn-AG8vE.js → chunk-KX2RTZJC-CCgbTx2V.js} +2 -2
- package/webapp/dist/assets/{chunk-KX2RTZJC-Bn-AG8vE.js.map → chunk-KX2RTZJC-CCgbTx2V.js.map} +1 -1
- package/webapp/dist/assets/{chunk-NQ4KR5QH-yj2oxjjl.js → chunk-NQ4KR5QH-1wLPI2Hu.js} +4 -4
- package/webapp/dist/assets/{chunk-NQ4KR5QH-yj2oxjjl.js.map → chunk-NQ4KR5QH-1wLPI2Hu.js.map} +1 -1
- package/webapp/dist/assets/{chunk-QZHKN3VN-CEKD-_TP.js → chunk-QZHKN3VN-C6JKbhyt.js} +2 -2
- package/webapp/dist/assets/{chunk-QZHKN3VN-CEKD-_TP.js.map → chunk-QZHKN3VN-C6JKbhyt.js.map} +1 -1
- package/webapp/dist/assets/{chunk-WL4C6EOR-Dp55vgWB.js → chunk-WL4C6EOR-Cs1vNkue.js} +6 -6
- package/webapp/dist/assets/{chunk-WL4C6EOR-Dp55vgWB.js.map → chunk-WL4C6EOR-Cs1vNkue.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-D4N8D7Nj.js → classDiagram-VBA2DB6C-DVGl2GYa.js} +7 -7
- package/webapp/dist/assets/{classDiagram-VBA2DB6C-D4N8D7Nj.js.map → classDiagram-VBA2DB6C-DVGl2GYa.js.map} +1 -1
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D4N8D7Nj.js → classDiagram-v2-RAHNMMFH-DVGl2GYa.js} +7 -7
- package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-D4N8D7Nj.js.map → classDiagram-v2-RAHNMMFH-DVGl2GYa.js.map} +1 -1
- package/webapp/dist/assets/{clone-DQAXOciv.js → clone-DZkqssLU.js} +2 -2
- package/webapp/dist/assets/{clone-DQAXOciv.js.map → clone-DZkqssLU.js.map} +1 -1
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Dn19M4ir.js → cose-bilkent-S5V4N54A-B0iqLjQo.js} +2 -2
- package/webapp/dist/assets/{cose-bilkent-S5V4N54A-Dn19M4ir.js.map → cose-bilkent-S5V4N54A-B0iqLjQo.js.map} +1 -1
- package/webapp/dist/assets/{dagre-KLK3FWXG-C92c6zqC.js → dagre-KLK3FWXG-CPyJxHzG.js} +7 -7
- package/webapp/dist/assets/{dagre-KLK3FWXG-C92c6zqC.js.map → dagre-KLK3FWXG-CPyJxHzG.js.map} +1 -1
- package/webapp/dist/assets/{diagram-E7M64L7V-Cjyz7QMT.js → diagram-E7M64L7V-CJFjs8vW.js} +8 -8
- package/webapp/dist/assets/{diagram-E7M64L7V-Cjyz7QMT.js.map → diagram-E7M64L7V-CJFjs8vW.js.map} +1 -1
- package/webapp/dist/assets/{diagram-IFDJBPK2-D8dhOH6X.js → diagram-IFDJBPK2-BroetsVc.js} +7 -7
- package/webapp/dist/assets/{diagram-IFDJBPK2-D8dhOH6X.js.map → diagram-IFDJBPK2-BroetsVc.js.map} +1 -1
- package/webapp/dist/assets/{diagram-P4PSJMXO-DWPLWoKQ.js → diagram-P4PSJMXO-Bh1Ix0CA.js} +7 -7
- package/webapp/dist/assets/{diagram-P4PSJMXO-DWPLWoKQ.js.map → diagram-P4PSJMXO-Bh1Ix0CA.js.map} +1 -1
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Liu3Eiqm.js → erDiagram-INFDFZHY-y3jE2GhO.js} +5 -5
- package/webapp/dist/assets/{erDiagram-INFDFZHY-Liu3Eiqm.js.map → erDiagram-INFDFZHY-y3jE2GhO.js.map} +1 -1
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-BcJzc7PE.js → flowDiagram-PKNHOUZH-Dbj0amdk.js} +7 -7
- package/webapp/dist/assets/{flowDiagram-PKNHOUZH-BcJzc7PE.js.map → flowDiagram-PKNHOUZH-Dbj0amdk.js.map} +1 -1
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-Dj17R6YC.js → ganttDiagram-A5KZAMGK-z46SRQdq.js} +3 -3
- package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-Dj17R6YC.js.map → ganttDiagram-A5KZAMGK-z46SRQdq.js.map} +1 -1
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js → gitGraphDiagram-K3NZZRJ6-Byh8x6U3.js} +8 -8
- package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js.map → gitGraphDiagram-K3NZZRJ6-Byh8x6U3.js.map} +1 -1
- package/webapp/dist/assets/{graph-G5shJbct.js → graph-1b2bXlyQ.js} +3 -3
- package/webapp/dist/assets/{graph-G5shJbct.js.map → graph-1b2bXlyQ.js.map} +1 -1
- package/webapp/dist/assets/{index-BEmR85VP.js → index-DuC83Z7v.js} +40 -37
- package/webapp/dist/assets/{index-BEmR85VP.js.map → index-DuC83Z7v.js.map} +1 -1
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-B55ho_w2.js → infoDiagram-LFFYTUFH-DeJTilk1.js} +6 -6
- package/webapp/dist/assets/{infoDiagram-LFFYTUFH-B55ho_w2.js.map → infoDiagram-LFFYTUFH-DeJTilk1.js.map} +1 -1
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D0bkA7bh.js → ishikawaDiagram-PHBUUO56-9wW_cCA_.js} +2 -2
- package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-D0bkA7bh.js.map → ishikawaDiagram-PHBUUO56-9wW_cCA_.js.map} +1 -1
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-COLepLN1.js → journeyDiagram-4ABVD52K-Ds6Mi8Fd.js} +5 -5
- package/webapp/dist/assets/{journeyDiagram-4ABVD52K-COLepLN1.js.map → journeyDiagram-4ABVD52K-Ds6Mi8Fd.js.map} +1 -1
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cj4QwKRR.js → kanban-definition-K7BYSVSG-21p94fVM.js} +3 -3
- package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Cj4QwKRR.js.map → kanban-definition-K7BYSVSG-21p94fVM.js.map} +1 -1
- package/webapp/dist/assets/{layout-eWbM7aoc.js → layout-oxTVuSAI.js} +5 -5
- package/webapp/dist/assets/{layout-eWbM7aoc.js.map → layout-oxTVuSAI.js.map} +1 -1
- package/webapp/dist/assets/{linear-D4qe60-s.js → linear-C-ktuT2j.js} +2 -2
- package/webapp/dist/assets/{linear-D4qe60-s.js.map → linear-C-ktuT2j.js.map} +1 -1
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ICouzfF0.js → mindmap-definition-YRQLILUH-C2OBFt0m.js} +4 -4
- package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ICouzfF0.js.map → mindmap-definition-YRQLILUH-C2OBFt0m.js.map} +1 -1
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-D4ZVmXtl.js → pieDiagram-SKSYHLDU-BnlbMX50.js} +8 -8
- package/webapp/dist/assets/{pieDiagram-SKSYHLDU-D4ZVmXtl.js.map → pieDiagram-SKSYHLDU-BnlbMX50.js.map} +1 -1
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-1ymuNQzm.js → quadrantDiagram-337W2JSQ-CCZwkFSq.js} +3 -3
- package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-1ymuNQzm.js.map → quadrantDiagram-337W2JSQ-CCZwkFSq.js.map} +1 -1
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CTK5MmAU.js → requirementDiagram-Z7DCOOCP-CknHzpb9.js} +4 -4
- package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CTK5MmAU.js.map → requirementDiagram-Z7DCOOCP-CknHzpb9.js.map} +1 -1
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BYqSklsK.js → sankeyDiagram-WA2Y5GQK-dnzSk8ya.js} +2 -2
- package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BYqSklsK.js.map → sankeyDiagram-WA2Y5GQK-dnzSk8ya.js.map} +1 -1
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BrXIJ8YR.js → sequenceDiagram-2WXFIKYE-CYPr_LFs.js} +4 -4
- package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-BrXIJ8YR.js.map → sequenceDiagram-2WXFIKYE-CYPr_LFs.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-BO202mAM.js → stateDiagram-RAJIS63D-CY72bpXz.js} +9 -9
- package/webapp/dist/assets/{stateDiagram-RAJIS63D-BO202mAM.js.map → stateDiagram-RAJIS63D-CY72bpXz.js.map} +1 -1
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-hN3JtobY.js → stateDiagram-v2-FVOUBMTO-BVaL7PC4.js} +5 -5
- package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-hN3JtobY.js.map → stateDiagram-v2-FVOUBMTO-BVaL7PC4.js.map} +1 -1
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BmxM2CZh.js → timeline-definition-YZTLITO2-DaVyxe1k.js} +3 -3
- package/webapp/dist/assets/{timeline-definition-YZTLITO2-BmxM2CZh.js.map → timeline-definition-YZTLITO2-DaVyxe1k.js.map} +1 -1
- package/webapp/dist/assets/{treemap-KZPCXAKY-Btqy2bjG.js → treemap-KZPCXAKY-DDbREGp8.js} +5 -5
- package/webapp/dist/assets/{treemap-KZPCXAKY-Btqy2bjG.js.map → treemap-KZPCXAKY-DDbREGp8.js.map} +1 -1
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-C5MQpm3y.js → vennDiagram-LZ73GAT5-BDQOvFmI.js} +2 -2
- package/webapp/dist/assets/{vennDiagram-LZ73GAT5-C5MQpm3y.js.map → vennDiagram-LZ73GAT5-BDQOvFmI.js.map} +1 -1
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DppnWtyj.js → xychartDiagram-JWTSCODW-BdduRgQG.js} +3 -3
- package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DppnWtyj.js.map → xychartDiagram-JWTSCODW-BdduRgQG.js.map} +1 -1
- package/webapp/dist/index.html +1 -1
|
@@ -319,15 +319,12 @@ function parseAppsHostMessageFromKernel(v) {
|
|
|
319
319
|
if (!isRecord(ctx))
|
|
320
320
|
throw new Error('Invalid reminder_render message: ctx must be object');
|
|
321
321
|
const dialogId = asString(ctx['dialogId']);
|
|
322
|
-
const
|
|
323
|
-
const reminderNo = typeof reminderNoRaw === 'number' && Number.isFinite(reminderNoRaw)
|
|
324
|
-
? Math.floor(reminderNoRaw)
|
|
325
|
-
: null;
|
|
322
|
+
const reminderId = asString(ctx['reminderId']);
|
|
326
323
|
const workLanguage = asLanguageCode(ctx['workLanguage']);
|
|
327
324
|
if (!dialogId)
|
|
328
325
|
throw new Error('Invalid reminder_render message: ctx.dialogId required');
|
|
329
|
-
if (
|
|
330
|
-
throw new Error('Invalid reminder_render message: ctx.
|
|
326
|
+
if (!reminderId) {
|
|
327
|
+
throw new Error('Invalid reminder_render message: ctx.reminderId required');
|
|
331
328
|
}
|
|
332
329
|
if (!workLanguage)
|
|
333
330
|
throw new Error('Invalid reminder_render message: ctx.workLanguage invalid');
|
|
@@ -339,7 +336,7 @@ function parseAppsHostMessageFromKernel(v) {
|
|
|
339
336
|
ctx: {
|
|
340
337
|
dialogId,
|
|
341
338
|
reminder: parseReminderState(ctx['reminder'], 'reminder_render.ctx.reminder'),
|
|
342
|
-
|
|
339
|
+
reminderId,
|
|
343
340
|
workLanguage,
|
|
344
341
|
},
|
|
345
342
|
};
|
package/dist/dialog-fork.js
CHANGED
|
@@ -10,6 +10,7 @@ const storage_1 = require("@longrun-ai/kernel/types/storage");
|
|
|
10
10
|
const time_1 = require("@longrun-ai/kernel/utils/time");
|
|
11
11
|
const dialog_1 = require("./dialog");
|
|
12
12
|
const persistence_1 = require("./persistence");
|
|
13
|
+
const tool_1 = require("./tool");
|
|
13
14
|
const id_1 = require("./utils/id");
|
|
14
15
|
const FORK_BASELINE_ANCHOR = (0, storage_1.toRootGenerationAnchor)({
|
|
15
16
|
rootCourse: 1,
|
|
@@ -30,12 +31,16 @@ function anchorAtOrBefore(candidate, cutoff) {
|
|
|
30
31
|
return compareRootAnchor(candidate, cutoff) <= 0;
|
|
31
32
|
}
|
|
32
33
|
function cloneReminderSnapshot(snapshot) {
|
|
33
|
-
return {
|
|
34
|
+
return (0, tool_1.materializeReminder)({
|
|
35
|
+
id: snapshot.id,
|
|
34
36
|
content: snapshot.content,
|
|
35
37
|
owner: undefined,
|
|
36
38
|
meta: snapshot.meta,
|
|
37
39
|
echoback: snapshot.echoback,
|
|
38
|
-
|
|
40
|
+
scope: snapshot.scope ?? 'dialog',
|
|
41
|
+
createdAt: snapshot.createdAt,
|
|
42
|
+
priority: snapshot.priority,
|
|
43
|
+
});
|
|
39
44
|
}
|
|
40
45
|
function cloneQuestions(questions) {
|
|
41
46
|
return questions.map((question) => ({
|
|
@@ -425,10 +430,12 @@ async function appendForkBaselineState(plan, baselineSubdialogCreatedRecords) {
|
|
|
425
430
|
type: 'reminders_reconciled_record',
|
|
426
431
|
...FORK_BASELINE_ANCHOR,
|
|
427
432
|
reminders: plan.reminders.map((reminder) => ({
|
|
433
|
+
id: reminder.id,
|
|
428
434
|
content: reminder.content,
|
|
429
435
|
ownerName: reminder.owner?.name,
|
|
430
436
|
meta: reminder.meta,
|
|
431
437
|
echoback: reminder.echoback,
|
|
438
|
+
scope: reminder.scope ?? 'dialog',
|
|
432
439
|
createdAt: reminder.createdAt ?? baselineTs,
|
|
433
440
|
priority: reminder.priority ?? 'medium',
|
|
434
441
|
})),
|
package/dist/dialog.d.ts
CHANGED
|
@@ -107,6 +107,16 @@ export interface DialogInitParams {
|
|
|
107
107
|
contextHealth?: ContextHealthSnapshot;
|
|
108
108
|
};
|
|
109
109
|
}
|
|
110
|
+
export type VisibleReminderTarget = Readonly<{
|
|
111
|
+
source: 'dialog';
|
|
112
|
+
index: number;
|
|
113
|
+
reminder: Reminder;
|
|
114
|
+
}> | Readonly<{
|
|
115
|
+
source: 'agent_shared';
|
|
116
|
+
index: number;
|
|
117
|
+
reminder: Reminder;
|
|
118
|
+
agentId: string;
|
|
119
|
+
}>;
|
|
110
120
|
/**
|
|
111
121
|
* Assignment from supdialog for subdialogs
|
|
112
122
|
*/
|
|
@@ -161,6 +171,7 @@ export declare abstract class Dialog {
|
|
|
161
171
|
getLastContextHealth(): ContextHealthSnapshot | undefined;
|
|
162
172
|
getLastContextHealthGenseq(): number | undefined;
|
|
163
173
|
get remindersVer(): number;
|
|
174
|
+
touchReminders(): void;
|
|
164
175
|
get supdialog(): Dialog | undefined;
|
|
165
176
|
getUiLanguage(): LanguageCode;
|
|
166
177
|
setUiLanguage(language: LanguageCode): void;
|
|
@@ -250,10 +261,14 @@ export declare abstract class Dialog {
|
|
|
250
261
|
* Post a dialog event using the standard event registry.
|
|
251
262
|
*/
|
|
252
263
|
postEvent(event: DialogEvent): void;
|
|
253
|
-
addReminder(content: string, owner?: ReminderOwner, meta?: JsonValue, position?: number, options?: ReminderOptions):
|
|
264
|
+
addReminder(content: string, owner?: ReminderOwner, meta?: JsonValue, position?: number, options?: ReminderOptions): Reminder;
|
|
254
265
|
deleteReminder(index: number): Reminder;
|
|
255
266
|
updateReminder(index: number, content: string, meta?: JsonValue, options?: ReminderOptions): Reminder;
|
|
256
267
|
clearReminders(): void;
|
|
268
|
+
listVisibleReminderTargets(): Promise<VisibleReminderTarget[]>;
|
|
269
|
+
listVisibleReminders(): Promise<Reminder[]>;
|
|
270
|
+
resolveReminderTargetById(reminderId: string): Promise<VisibleReminderTarget | null>;
|
|
271
|
+
private processReminderCollection;
|
|
257
272
|
/**
|
|
258
273
|
* Process reminder updates before LLM generation.
|
|
259
274
|
* Calls updateReminder on each tool that owns reminders to allow them to update/drop/keep their reminders.
|
package/dist/dialog.js
CHANGED
|
@@ -10,6 +10,7 @@ const async_fifo_mutex_1 = require("./runtime/async-fifo-mutex");
|
|
|
10
10
|
const driver_messages_1 = require("./runtime/driver-messages");
|
|
11
11
|
const inter_dialog_format_1 = require("./runtime/inter-dialog-format");
|
|
12
12
|
const work_language_1 = require("./runtime/work-language");
|
|
13
|
+
const shared_reminders_1 = require("./shared-reminders");
|
|
13
14
|
const tool_1 = require("./tool");
|
|
14
15
|
const id_2 = require("./utils/id");
|
|
15
16
|
class DialogID {
|
|
@@ -146,6 +147,10 @@ class Dialog {
|
|
|
146
147
|
get remindersVer() {
|
|
147
148
|
return this._remindersVer;
|
|
148
149
|
}
|
|
150
|
+
touchReminders() {
|
|
151
|
+
this._updatedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
|
|
152
|
+
this._remindersVer++;
|
|
153
|
+
}
|
|
149
154
|
get supdialog() {
|
|
150
155
|
return undefined;
|
|
151
156
|
}
|
|
@@ -325,29 +330,27 @@ class Dialog {
|
|
|
325
330
|
//
|
|
326
331
|
// Reminder management methods
|
|
327
332
|
addReminder(content, owner, meta, position, options) {
|
|
328
|
-
const reminder = {
|
|
333
|
+
const reminder = (0, tool_1.materializeReminder)({
|
|
329
334
|
content,
|
|
330
335
|
owner,
|
|
331
336
|
meta,
|
|
332
337
|
echoback: options?.echoback,
|
|
333
|
-
|
|
338
|
+
scope: options?.scope ?? 'dialog',
|
|
339
|
+
});
|
|
334
340
|
const insertIndex = position !== undefined ? position : this.reminders.length;
|
|
335
341
|
if (insertIndex < 0 || insertIndex > this.reminders.length) {
|
|
336
342
|
throw new Error(`Invalid reminder position ${insertIndex}. Valid range: 0-${this.reminders.length}`);
|
|
337
343
|
}
|
|
338
344
|
this.reminders.splice(insertIndex, 0, reminder);
|
|
339
|
-
this.
|
|
340
|
-
|
|
341
|
-
this._remindersVer++;
|
|
345
|
+
this.touchReminders();
|
|
346
|
+
return reminder;
|
|
342
347
|
}
|
|
343
348
|
deleteReminder(index) {
|
|
344
349
|
if (index < 0 || index >= this.reminders.length) {
|
|
345
350
|
throw new Error(`Reminder index ${index} does not exist. Available reminders: 0-${this.reminders.length - 1}`);
|
|
346
351
|
}
|
|
347
352
|
const deleted = this.reminders.splice(index, 1)[0];
|
|
348
|
-
this.
|
|
349
|
-
// Increment version for conditional event emission in driver
|
|
350
|
-
this._remindersVer++;
|
|
353
|
+
this.touchReminders();
|
|
351
354
|
return deleted;
|
|
352
355
|
}
|
|
353
356
|
updateReminder(index, content, meta, options) {
|
|
@@ -355,34 +358,64 @@ class Dialog {
|
|
|
355
358
|
throw new Error(`Reminder index ${index} does not exist. Available reminders: 0-${this.reminders.length - 1}`);
|
|
356
359
|
}
|
|
357
360
|
const oldReminder = this.reminders[index];
|
|
358
|
-
const updatedReminder = {
|
|
361
|
+
const updatedReminder = (0, tool_1.materializeReminder)({
|
|
362
|
+
id: oldReminder.id,
|
|
359
363
|
content,
|
|
360
364
|
owner: oldReminder.owner,
|
|
361
365
|
meta: meta !== undefined ? meta : oldReminder.meta,
|
|
362
366
|
echoback: options?.echoback ?? oldReminder.echoback,
|
|
363
|
-
|
|
367
|
+
scope: oldReminder.scope,
|
|
368
|
+
createdAt: oldReminder.createdAt,
|
|
369
|
+
priority: oldReminder.priority,
|
|
370
|
+
});
|
|
364
371
|
this.reminders[index] = updatedReminder;
|
|
365
|
-
this.
|
|
366
|
-
// Increment version for conditional event emission in driver
|
|
367
|
-
this._remindersVer++;
|
|
372
|
+
this.touchReminders();
|
|
368
373
|
return oldReminder;
|
|
369
374
|
}
|
|
370
375
|
clearReminders() {
|
|
371
376
|
this.reminders.length = 0;
|
|
372
|
-
this.
|
|
373
|
-
// Increment version for conditional event emission in driver
|
|
374
|
-
this._remindersVer++;
|
|
377
|
+
this.touchReminders();
|
|
375
378
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
379
|
+
async listVisibleReminderTargets() {
|
|
380
|
+
const targets = this.reminders.map((reminder, index) => ({
|
|
381
|
+
source: 'dialog',
|
|
382
|
+
index,
|
|
383
|
+
reminder,
|
|
384
|
+
}));
|
|
385
|
+
const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(this.agentId);
|
|
386
|
+
for (let index = 0; index < sharedReminders.length; index += 1) {
|
|
387
|
+
const reminder = sharedReminders[index];
|
|
388
|
+
if (!reminder)
|
|
389
|
+
continue;
|
|
390
|
+
targets.push({
|
|
391
|
+
source: 'agent_shared',
|
|
392
|
+
index,
|
|
393
|
+
reminder,
|
|
394
|
+
agentId: this.agentId,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
return targets;
|
|
398
|
+
}
|
|
399
|
+
async listVisibleReminders() {
|
|
400
|
+
return (await this.listVisibleReminderTargets()).map((target) => target.reminder);
|
|
401
|
+
}
|
|
402
|
+
async resolveReminderTargetById(reminderId) {
|
|
403
|
+
const trimmed = reminderId.trim();
|
|
404
|
+
if (trimmed === '')
|
|
405
|
+
return null;
|
|
406
|
+
const visibleTargets = await this.listVisibleReminderTargets();
|
|
407
|
+
for (const target of visibleTargets) {
|
|
408
|
+
if (target.reminder.id === trimmed) {
|
|
409
|
+
return target;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
async processReminderCollection(reminders) {
|
|
415
|
+
let changed = false;
|
|
382
416
|
const indicesToRemove = [];
|
|
383
|
-
for (let i = 0; i <
|
|
384
|
-
const reminder =
|
|
385
|
-
// Skip if the reminder has no owner or the owner doesn't have an updateReminder method
|
|
417
|
+
for (let i = 0; i < reminders.length; i++) {
|
|
418
|
+
const reminder = reminders[i];
|
|
386
419
|
if (!reminder.owner || !reminder.owner.updateReminder) {
|
|
387
420
|
continue;
|
|
388
421
|
}
|
|
@@ -391,34 +424,53 @@ class Dialog {
|
|
|
391
424
|
switch (result.treatment) {
|
|
392
425
|
case 'drop':
|
|
393
426
|
indicesToRemove.push(i);
|
|
427
|
+
changed = true;
|
|
394
428
|
break;
|
|
395
|
-
case 'update':
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
429
|
+
case 'update': {
|
|
430
|
+
const nextContent = result.updatedContent ?? reminder.content;
|
|
431
|
+
const nextMeta = result.updatedMeta !== undefined ? result.updatedMeta : reminder.meta;
|
|
432
|
+
const updatedReminder = (0, tool_1.materializeReminder)({
|
|
433
|
+
id: reminder.id,
|
|
434
|
+
content: nextContent,
|
|
435
|
+
owner: reminder.owner,
|
|
436
|
+
meta: nextMeta,
|
|
437
|
+
echoback: reminder.echoback,
|
|
438
|
+
scope: reminder.scope,
|
|
439
|
+
createdAt: reminder.createdAt,
|
|
440
|
+
priority: reminder.priority,
|
|
441
|
+
});
|
|
442
|
+
const contentChanged = updatedReminder.content !== reminder.content;
|
|
443
|
+
const metaChanged = updatedReminder.meta !== reminder.meta;
|
|
444
|
+
if (contentChanged || metaChanged) {
|
|
445
|
+
reminders[i] = updatedReminder;
|
|
446
|
+
changed = true;
|
|
404
447
|
}
|
|
405
448
|
break;
|
|
449
|
+
}
|
|
406
450
|
case 'keep':
|
|
407
|
-
// No action needed
|
|
408
451
|
break;
|
|
409
452
|
}
|
|
410
453
|
}
|
|
411
454
|
catch (error) {
|
|
412
455
|
log_1.log.error(`Error updating reminder from tool ${reminder.owner}:`, error);
|
|
413
|
-
// Continue processing other reminders even if one fails
|
|
414
456
|
}
|
|
415
457
|
}
|
|
416
|
-
// Remove reminders marked for deletion (in reverse order to maintain indices)
|
|
417
458
|
for (let i = indicesToRemove.length - 1; i >= 0; i--) {
|
|
418
|
-
|
|
459
|
+
reminders.splice(indicesToRemove[i], 1);
|
|
419
460
|
}
|
|
420
|
-
|
|
421
|
-
|
|
461
|
+
return changed;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Process reminder updates before LLM generation.
|
|
465
|
+
* Calls updateReminder on each tool that owns reminders to allow them to update/drop/keep their reminders.
|
|
466
|
+
* Returns reminder contents with metadata for the frontend.
|
|
467
|
+
*/
|
|
468
|
+
async processReminderUpdates() {
|
|
469
|
+
const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(this.agentId);
|
|
470
|
+
const localChanged = await this.processReminderCollection(this.reminders);
|
|
471
|
+
const sharedChanged = await this.processReminderCollection(sharedReminders);
|
|
472
|
+
if (localChanged || sharedChanged) {
|
|
473
|
+
this.touchReminders();
|
|
422
474
|
}
|
|
423
475
|
// Centralized persistence - called when emitting event.
|
|
424
476
|
// Must be awaited to preserve ordering (avoid out-of-date writes winning).
|
|
@@ -428,11 +480,23 @@ class Dialog {
|
|
|
428
480
|
catch (err) {
|
|
429
481
|
log_1.log.warn('Failed to persist reminders', err, { dialogId: this.id.valueOf() });
|
|
430
482
|
}
|
|
431
|
-
|
|
432
|
-
|
|
483
|
+
try {
|
|
484
|
+
await (0, shared_reminders_1.replaceAgentSharedReminders)(this.agentId, sharedReminders);
|
|
485
|
+
}
|
|
486
|
+
catch (err) {
|
|
487
|
+
log_1.log.warn('Failed to persist agent-shared reminders', err, {
|
|
488
|
+
dialogId: this.id.valueOf(),
|
|
489
|
+
agentId: this.agentId,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
const visibleReminders = [
|
|
493
|
+
...this.reminders.map((reminder) => (0, tool_1.cloneReminder)(reminder)),
|
|
494
|
+
...sharedReminders,
|
|
495
|
+
];
|
|
496
|
+
const reminders = visibleReminders.map((r) => ({
|
|
433
497
|
content: r.content,
|
|
434
498
|
meta: r.meta,
|
|
435
|
-
|
|
499
|
+
reminder_id: r.id,
|
|
436
500
|
echoback: (0, tool_1.reminderEchoBackEnabled)(r),
|
|
437
501
|
}));
|
|
438
502
|
// Emit full_reminders_update event with complete reminder list including metadata
|
package/dist/llm/defaults.yaml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Optional provider-level retry controls for kernel dialog driving:
|
|
2
|
-
# - llm_retry_max_retries: extra retries after the initial attempt (default
|
|
2
|
+
# - llm_retry_max_retries: extra retries after the initial attempt (default 99; ~41.2h total retry window with current backoff defaults).
|
|
3
3
|
# - llm_retry_initial_delay_ms: delay before the 1st retry (default 1000).
|
|
4
|
-
# - llm_retry_backoff_multiplier: exponential factor between retries (default
|
|
5
|
-
# - llm_retry_max_delay_ms: upper bound for retry delay (default
|
|
4
|
+
# - llm_retry_backoff_multiplier: exponential factor between retries (default 1.5).
|
|
5
|
+
# - llm_retry_max_delay_ms: upper bound for retry delay (default 1800000 / 30m).
|
|
6
6
|
# - tool_result_max_chars: optional transport-level cap for a single tool-result text payload
|
|
7
7
|
# before Dominds projects it into the provider request. Use this when a provider/gateway enforces
|
|
8
8
|
# a stricter per-item string limit than Dominds' built-in defaults.
|
|
@@ -28,10 +28,10 @@ const reply_guidance_1 = require("./reply-guidance");
|
|
|
28
28
|
const runtime_1 = require("./runtime");
|
|
29
29
|
const tellask_special_1 = require("./tellask-special");
|
|
30
30
|
const KERNEL_DRIVER_DEFAULT_RETRY_POLICY = {
|
|
31
|
-
maxRetries:
|
|
31
|
+
maxRetries: 99, // long total retry window to survive major down-time by llm providers
|
|
32
32
|
initialDelayMs: 1000,
|
|
33
|
-
backoffMultiplier:
|
|
34
|
-
maxDelayMs:
|
|
33
|
+
backoffMultiplier: 1.5,
|
|
34
|
+
maxDelayMs: 30 * 60 * 1000, // 30 minutes
|
|
35
35
|
};
|
|
36
36
|
const KERNEL_DRIVER_EMPTY_LLM_RESPONSE_ERROR_CODE = 'DOMINDS_LLM_EMPTY_RESPONSE';
|
|
37
37
|
class KernelDriverInterruptedError extends Error {
|
|
@@ -487,28 +487,23 @@ function resolveUpNextPrompt(dlg) {
|
|
|
487
487
|
};
|
|
488
488
|
}
|
|
489
489
|
async function renderRemindersForContext(dlg) {
|
|
490
|
-
|
|
490
|
+
const reminders = await dlg.listVisibleReminders();
|
|
491
|
+
if (reminders.length === 0)
|
|
491
492
|
return [];
|
|
492
493
|
const language = (0, work_language_1.getWorkLanguage)();
|
|
493
|
-
const reminderNoByIndex = (0, tool_1.computeReminderNoByIndex)(dlg.reminders);
|
|
494
494
|
const rendered = [];
|
|
495
|
-
for (
|
|
496
|
-
const reminder = dlg.reminders[index];
|
|
495
|
+
for (const reminder of reminders) {
|
|
497
496
|
if (!reminder || !(0, tool_1.reminderEchoBackEnabled)(reminder)) {
|
|
498
497
|
continue;
|
|
499
498
|
}
|
|
500
|
-
const reminderNo = reminderNoByIndex.get(index);
|
|
501
|
-
if (reminderNo === undefined) {
|
|
502
|
-
continue;
|
|
503
|
-
}
|
|
504
499
|
if (reminder.owner) {
|
|
505
|
-
rendered.push(await reminder.owner.renderReminder(dlg, reminder
|
|
500
|
+
rendered.push(await reminder.owner.renderReminder(dlg, reminder));
|
|
506
501
|
continue;
|
|
507
502
|
}
|
|
508
503
|
rendered.push({
|
|
509
504
|
type: 'transient_guide_msg',
|
|
510
505
|
role: 'assistant',
|
|
511
|
-
content: (0, driver_messages_1.formatReminderItemGuide)(language,
|
|
506
|
+
content: (0, driver_messages_1.formatReminderItemGuide)(language, reminder.id, reminder.content, {
|
|
512
507
|
meta: reminder.meta,
|
|
513
508
|
}),
|
|
514
509
|
});
|
|
@@ -354,10 +354,18 @@ async function sleepWithAbort(ms, abortSignal) {
|
|
|
354
354
|
if (abortSignal?.aborted) {
|
|
355
355
|
throw new Error('AbortError');
|
|
356
356
|
}
|
|
357
|
-
await new Promise((resolve) =>
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
357
|
+
await new Promise((resolve, reject) => {
|
|
358
|
+
const timer = setTimeout(() => {
|
|
359
|
+
abortSignal?.removeEventListener('abort', onAbort);
|
|
360
|
+
resolve();
|
|
361
|
+
}, ms);
|
|
362
|
+
const onAbort = () => {
|
|
363
|
+
clearTimeout(timer);
|
|
364
|
+
abortSignal?.removeEventListener('abort', onAbort);
|
|
365
|
+
reject(new Error('AbortError'));
|
|
366
|
+
};
|
|
367
|
+
abortSignal?.addEventListener('abort', onAbort, { once: true });
|
|
368
|
+
});
|
|
361
369
|
}
|
|
362
370
|
function normalizeRetryInitialDelayMs(value) {
|
|
363
371
|
if (!Number.isFinite(value))
|
|
@@ -167,7 +167,7 @@ function getMemoryPromptCopy(ctx) {
|
|
|
167
167
|
progressLine: '- 更新 `progress` 时:它必须始终是可供全队扫读的完整当前快照,而不是只追加自己这一轮的零散笔记。',
|
|
168
168
|
injectedTaskdocLine: '- 重要:差遣牒内容会被系统以内联形式注入到上下文中(本轮生成视角下即为最新;注入内容不包括全局约束)。需要回顾时请直接基于上下文里的差遣牒内容回顾与决策,不要试图用通用文件工具读取 `*.tsk/` 下的文件(会被拒绝)。',
|
|
169
169
|
constraintsLine: '- 约定:`constraints` 只写任务特有的硬要求,不得写入系统提示/工具文档里已明确且由系统强制执行的通用规则(例如 `*.tsk/` 封装禁止通用文件工具)。一经发现重复,必须删除并告知用户。',
|
|
170
|
-
remindersLine: '-
|
|
170
|
+
remindersLine: '- 提醒项(以 `reminder_id` 标识,工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);默认保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。准备 `clear_mind` 开启新一程对话时,默认整理成“结构化接续包提醒项”;其中只保留差遣牒未覆盖、但恢复工作容易丢的细节(如第一步、关键定位、运行/验证信息、临时 ids/路径)。若系统已把当前程切到吃紧/告急处置态,则允许先保留多条粗略提醒项把信息带过桥;当前程只做保信息 + clear_mind;只有系统实际开启新一程后,第一步才是以清醒头脑复核并整理这些接续包/粗略提醒项:删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项。',
|
|
171
171
|
teamMemoryLine: '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。',
|
|
172
172
|
personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;记忆会在每次生成时自动注入上下文,应保持少量且准确(关键文档/代码的精确路径 + 最小必要事实)。不要记录具体任务状态。',
|
|
173
173
|
subdialogDutyLine: `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
|
|
@@ -191,7 +191,7 @@ function getMemoryPromptCopy(ctx) {
|
|
|
191
191
|
progressLine: '- When updating `progress`, keep it as a complete, team-scannable current snapshot instead of appending only your own latest notes.',
|
|
192
192
|
injectedTaskdocLine: '- Important: the Taskdoc content is injected inline into the context (the latest as of this generation; injected content excludes global constraints). Review the injected Taskdoc instead of trying to read files under `*.tsk/` via general file tools (they will be rejected).',
|
|
193
193
|
constraintsLine: '- Convention: Taskdoc `constraints` must contain task-specific requirements only; do not include global, system-enforced rules already stated in system prompt/tool docs (e.g. `.tsk/` encapsulation bans general file tools). If duplication is found, you MUST remove it and notify the user.',
|
|
194
|
-
remindersLine: '- Reminders (
|
|
194
|
+
remindersLine: '- Reminders (addressed by `reminder_id`, working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small by default (often 1–3 items), prefer `update_reminder` to compress/merge, and delete when obsolete. When preparing `clear_mind` to start a new course, default to a structured continuation-package reminder that keeps only details not already covered by Taskdoc but easy to lose during resume (first step, key pointers, run/verify info, volatile ids/paths). If the system has already put the current course into caution/critical remediation, rough multi-reminder bridge notes are acceptable; in the current course, only preserve volatile information and clear_mind. Only after the system actually starts the new course does the mandatory first step become reviewing and rewriting those continuation/rough reminders with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders.',
|
|
195
195
|
teamMemoryLine: '- Team memory: stable shared conventions (cross-task).',
|
|
196
196
|
personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Memory is automatically injected into context on each generation: keep it small and accurate (exact key doc/code paths + minimal key facts); do not store per-task state.',
|
|
197
197
|
subdialogDutyLine: `You are currently in a subdialog: \`change_mind\` is not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with a fully merged replacement draft (full-section replacement). Do not claim it is updated until you see a receipt.`,
|
package/dist/persistence.js
CHANGED
|
@@ -52,6 +52,7 @@ const log_1 = require("./log");
|
|
|
52
52
|
const async_fifo_mutex_1 = require("./runtime/async-fifo-mutex");
|
|
53
53
|
const reply_prompt_copy_1 = require("./runtime/reply-prompt-copy");
|
|
54
54
|
const work_language_1 = require("./runtime/work-language");
|
|
55
|
+
const tool_1 = require("./tool");
|
|
55
56
|
const registry_1 = require("./tools/registry");
|
|
56
57
|
function getErrorCode(error) {
|
|
57
58
|
if (typeof error !== 'object' || error === null)
|
|
@@ -63,22 +64,25 @@ function isRecord(value) {
|
|
|
63
64
|
return typeof value === 'object' && value !== null;
|
|
64
65
|
}
|
|
65
66
|
function serializeReminderSnapshot(reminder) {
|
|
66
|
-
const persistedReminder = reminder;
|
|
67
67
|
return {
|
|
68
|
+
id: reminder.id,
|
|
68
69
|
content: reminder.content,
|
|
69
70
|
ownerName: reminder.owner?.name,
|
|
70
71
|
meta: reminder.meta,
|
|
71
72
|
echoback: reminder.echoback,
|
|
72
|
-
|
|
73
|
-
|
|
73
|
+
scope: reminder.scope ?? 'dialog',
|
|
74
|
+
createdAt: reminder.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
75
|
+
priority: reminder.priority ?? 'medium',
|
|
74
76
|
};
|
|
75
77
|
}
|
|
76
78
|
function cloneReminderSnapshot(snapshot) {
|
|
77
79
|
return {
|
|
80
|
+
id: snapshot.id,
|
|
78
81
|
content: snapshot.content,
|
|
79
82
|
ownerName: snapshot.ownerName,
|
|
80
83
|
meta: snapshot.meta,
|
|
81
84
|
echoback: snapshot.echoback,
|
|
85
|
+
scope: snapshot.scope,
|
|
82
86
|
createdAt: snapshot.createdAt,
|
|
83
87
|
priority: snapshot.priority,
|
|
84
88
|
};
|
|
@@ -3471,14 +3475,15 @@ class DialogPersistence {
|
|
|
3471
3475
|
await fs.promises.mkdir(dialogPath, { recursive: true });
|
|
3472
3476
|
const remindersFilePath = path.join(dialogPath, 'reminders.json');
|
|
3473
3477
|
const reminderState = {
|
|
3474
|
-
reminders: reminders.map((r
|
|
3475
|
-
id:
|
|
3478
|
+
reminders: reminders.map((r) => ({
|
|
3479
|
+
id: r.id,
|
|
3476
3480
|
content: r.content,
|
|
3477
3481
|
ownerName: r.owner ? r.owner.name : undefined,
|
|
3478
3482
|
meta: r.meta,
|
|
3479
3483
|
echoback: r.echoback,
|
|
3480
|
-
|
|
3481
|
-
|
|
3484
|
+
scope: r.scope ?? 'dialog',
|
|
3485
|
+
createdAt: r.createdAt ?? (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
3486
|
+
priority: r.priority ?? 'medium',
|
|
3482
3487
|
})),
|
|
3483
3488
|
updatedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
3484
3489
|
};
|
|
@@ -3505,16 +3510,18 @@ class DialogPersistence {
|
|
|
3505
3510
|
const reminderState = JSON.parse(content);
|
|
3506
3511
|
return reminderState.reminders.map((r) => {
|
|
3507
3512
|
const ownerNameFromFile = typeof r.ownerName === 'string' ? r.ownerName : undefined;
|
|
3513
|
+
// Reminder metadata is owner-private. Rebind strictly through persisted ownerName.
|
|
3508
3514
|
const owner = ownerNameFromFile ? (0, registry_1.getReminderOwner)(ownerNameFromFile) : undefined;
|
|
3509
|
-
return {
|
|
3515
|
+
return (0, tool_1.materializeReminder)({
|
|
3510
3516
|
id: r.id,
|
|
3511
3517
|
content: r.content,
|
|
3512
3518
|
owner,
|
|
3513
3519
|
meta: r.meta,
|
|
3514
3520
|
echoback: r.echoback,
|
|
3521
|
+
scope: r.scope ?? 'dialog',
|
|
3515
3522
|
createdAt: r.createdAt,
|
|
3516
3523
|
priority: r.priority,
|
|
3517
|
-
};
|
|
3524
|
+
});
|
|
3518
3525
|
});
|
|
3519
3526
|
}
|
|
3520
3527
|
catch (error) {
|
package/dist/priming.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { PersistedDialogRecord } from '@longrun-ai/kernel/types/storage';
|
|
|
3
3
|
import type { DialogPrimingInput, DialogStatusKind } from '@longrun-ai/kernel/types/wire';
|
|
4
4
|
import type { Dialog } from './dialog';
|
|
5
5
|
import { DialogID } from './dialog';
|
|
6
|
-
import type
|
|
6
|
+
import { type Reminder } from './tool';
|
|
7
7
|
type StripTs<T> = T extends {
|
|
8
8
|
ts: string;
|
|
9
9
|
} ? Omit<T, 'ts'> : never;
|
package/dist/priming.js
CHANGED
|
@@ -22,6 +22,7 @@ const path_1 = __importDefault(require("path"));
|
|
|
22
22
|
const yaml_1 = __importDefault(require("yaml"));
|
|
23
23
|
const frontmatter_1 = require("./markdown/frontmatter");
|
|
24
24
|
const persistence_1 = require("./persistence");
|
|
25
|
+
const tool_1 = require("./tool");
|
|
25
26
|
const registry_1 = require("./tools/registry");
|
|
26
27
|
const PRIMING_ROOT_DIR = path_1.default.resolve(process.cwd(), '.minds', 'priming');
|
|
27
28
|
const PRIMING_INDIVIDUAL_DIR = path_1.default.resolve(PRIMING_ROOT_DIR, 'individual');
|
|
@@ -158,6 +159,10 @@ function parseReminderSnapshots(frontmatter) {
|
|
|
158
159
|
if (content.trim() === '') {
|
|
159
160
|
throw new Error(`${context}.content must be a non-empty string`);
|
|
160
161
|
}
|
|
162
|
+
const id = item['id'];
|
|
163
|
+
if (id !== undefined && typeof id !== 'string') {
|
|
164
|
+
throw new Error(`${context}.id must be a string when provided`);
|
|
165
|
+
}
|
|
161
166
|
const ownerName = item['ownerName'];
|
|
162
167
|
if (ownerName !== undefined && (typeof ownerName !== 'string' || ownerName.trim() === '')) {
|
|
163
168
|
throw new Error(`${context}.ownerName must be a non-empty string when provided`);
|
|
@@ -170,16 +175,22 @@ function parseReminderSnapshots(frontmatter) {
|
|
|
170
175
|
if (echoback !== undefined && typeof echoback !== 'boolean') {
|
|
171
176
|
throw new Error(`${context}.echoback must be a boolean when provided`);
|
|
172
177
|
}
|
|
178
|
+
const scope = item['scope'];
|
|
179
|
+
if (scope !== undefined && scope !== 'dialog' && scope !== 'agent_shared') {
|
|
180
|
+
throw new Error(`${context}.scope must be "dialog" or "agent_shared" when provided`);
|
|
181
|
+
}
|
|
173
182
|
const createdAt = item['createdAt'];
|
|
174
183
|
if (createdAt !== undefined && typeof createdAt !== 'string') {
|
|
175
184
|
throw new Error(`${context}.createdAt must be a string when provided`);
|
|
176
185
|
}
|
|
177
186
|
const priority = parseReminderPriority(item['priority'], context);
|
|
178
187
|
reminders.push({
|
|
188
|
+
id: typeof id === 'string' ? id : undefined,
|
|
179
189
|
content,
|
|
180
190
|
ownerName: typeof ownerName === 'string' ? ownerName.trim() : undefined,
|
|
181
191
|
meta,
|
|
182
192
|
echoback,
|
|
193
|
+
scope: scope === 'dialog' || scope === 'agent_shared' ? scope : undefined,
|
|
183
194
|
createdAt: typeof createdAt === 'string' ? createdAt : undefined,
|
|
184
195
|
priority,
|
|
185
196
|
});
|
|
@@ -187,14 +198,15 @@ function parseReminderSnapshots(frontmatter) {
|
|
|
187
198
|
return reminders;
|
|
188
199
|
}
|
|
189
200
|
function reminderToSnapshot(reminder) {
|
|
190
|
-
const persistedReminder = reminder;
|
|
191
201
|
return {
|
|
202
|
+
id: reminder.id,
|
|
192
203
|
content: reminder.content,
|
|
193
204
|
ownerName: reminder.owner?.name,
|
|
194
205
|
meta: reminder.meta,
|
|
195
206
|
echoback: reminder.echoback,
|
|
196
|
-
|
|
197
|
-
|
|
207
|
+
scope: reminder.scope,
|
|
208
|
+
createdAt: reminder.createdAt,
|
|
209
|
+
priority: reminder.priority,
|
|
198
210
|
};
|
|
199
211
|
}
|
|
200
212
|
function materializeReminderSnapshot(snapshot, context) {
|
|
@@ -207,17 +219,16 @@ function materializeReminderSnapshot(snapshot, context) {
|
|
|
207
219
|
}
|
|
208
220
|
return resolved;
|
|
209
221
|
})();
|
|
210
|
-
|
|
222
|
+
return (0, tool_1.materializeReminder)({
|
|
223
|
+
id: snapshot.id,
|
|
211
224
|
content: snapshot.content,
|
|
212
225
|
owner,
|
|
213
226
|
meta: snapshot.meta,
|
|
214
227
|
echoback: snapshot.echoback,
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
reminder.priority = snapshot.priority;
|
|
220
|
-
return reminder;
|
|
228
|
+
scope: snapshot.scope,
|
|
229
|
+
createdAt: snapshot.createdAt,
|
|
230
|
+
priority: snapshot.priority,
|
|
231
|
+
});
|
|
221
232
|
}
|
|
222
233
|
function isPrimingRecordType(raw) {
|
|
223
234
|
return (raw === 'agent_thought_record' ||
|
|
@@ -9,7 +9,7 @@ export declare function formatNewCourseStartPrompt(language: LanguageCode, args:
|
|
|
9
9
|
source: 'clear_mind' | 'critical_auto_clear';
|
|
10
10
|
}): string;
|
|
11
11
|
export declare function formatDiligenceAutoContinuePrompt(language: LanguageCode, diligenceText: string): string;
|
|
12
|
-
export declare function formatReminderItemGuide(language: LanguageCode,
|
|
12
|
+
export declare function formatReminderItemGuide(language: LanguageCode, reminderId: string, content: string, options?: {
|
|
13
13
|
meta?: unknown;
|
|
14
14
|
}): string;
|
|
15
15
|
export declare function formatQ4HDiligencePushBudgetExhausted(language: LanguageCode, args: {
|