@kanadego/dsh-heartbeat 1.6.0 → 1.6.2
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/README.md +17 -1
- package/config/profile-schema.json +253 -15
- package/dist/{chunk-5TNGUHIR.js → chunk-QAJ2D445.js} +2 -5
- package/dist/chunk-QAJ2D445.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/dist/index.js +49 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-5TNGUHIR.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
scanPending,
|
|
23
23
|
sendNewMessageHint,
|
|
24
24
|
userPresetRoot
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-QAJ2D445.js";
|
|
26
26
|
import {
|
|
27
27
|
getRuntime,
|
|
28
28
|
setRuntime
|
|
@@ -1392,7 +1392,11 @@ function buildRuminationPrompt(input) {
|
|
|
1392
1392
|
"## \u4EFB\u52A1\u680F\u7A97\u53E3(\u8F85\u52A9\u5224\u65AD)",
|
|
1393
1393
|
input.screen.windows.length > 0 ? input.screen.windows.map((w) => `- ${w}`).join("\n") : "(\u65E0)",
|
|
1394
1394
|
"",
|
|
1395
|
-
'doing = \u4F9D\u636E\u753B\u9762\u4E0E\u7A97\u53E3,\u7528\u4E00\u53E5\u8BDD\u5BA2\u89C2\u603B\u7ED3\u4ED6\u6B64\u523B\u5728\u5E72\u4EC0\u4E48(\u5982"\u6B63\u5728\u722C\u5854(\u6740\u622E\u5C16\u58542)""\u5728\u5199\u6587\u6863,\u770B\u8D77\u6765\u6709\u70B9\u5FD9");\u4E0D\u63A8\u6D4B\u60C5\u7EEA,\u4E0D\u63D0\u53CA\u672C\u63D0\u793A\u3002'
|
|
1395
|
+
'doing = \u4F9D\u636E\u753B\u9762\u4E0E\u7A97\u53E3,\u7528\u4E00\u53E5\u8BDD\u5BA2\u89C2\u603B\u7ED3\u4ED6\u6B64\u523B\u5728\u5E72\u4EC0\u4E48(\u5982"\u6B63\u5728\u722C\u5854(\u6740\u622E\u5C16\u58542)""\u5728\u5199\u6587\u6863,\u770B\u8D77\u6765\u6709\u70B9\u5FD9");\u4E0D\u63A8\u6D4B\u60C5\u7EEA,\u4E0D\u63D0\u53CA\u672C\u63D0\u793A\u3002',
|
|
1396
|
+
// 2026-09-19: a decision turn that goes wandering over the screen
|
|
1397
|
+
// description (web_search loops) burns past the whenIdle budget — the
|
|
1398
|
+
// picture is for the doing line ONLY.
|
|
1399
|
+
"\u753B\u9762\u548C\u7A97\u53E3\u53EA\u7528\u4E8E\u5199 doing:\u5373\u4F7F\u753B\u9762\u91CC\u51FA\u73B0\u8BA9\u4F60\u60F3\u67E5\u7684\u4E1C\u897F,\u4E5F\u4E0D\u8981\u53D1\u8D77\u4EFB\u4F55\u641C\u7D22\u3001\u4E0D\u8981\u4F7F\u7528\u4EFB\u4F55\u5DE5\u5177,\u76F4\u63A5\u8F93\u51FA JSON\u3002"
|
|
1396
1400
|
);
|
|
1397
1401
|
} else {
|
|
1398
1402
|
lines.push('doing = \u56FA\u5B9A\u8F93\u51FA\u7A7A\u5B57\u7B26\u4E32 ""(\u672C\u6B21\u6CA1\u6709\u753B\u9762\u4FE1\u606F,\u4E0D\u8981\u7F16\u9020\u4ED6\u5728\u5E72\u4EC0\u4E48)\u3002');
|
|
@@ -1496,14 +1500,22 @@ var RULES = [
|
|
|
1496
1500
|
'\u53EA\u8F93\u51FA\u4E00\u4E2A JSON \u6570\u7EC4\uFF0C\u5143\u7D20\u5F62\u5982 {"op":"ADD"|"UPDATE"|"INVALIDATE"|"NOOP"|...,..}\u3002'
|
|
1497
1501
|
].join("\n");
|
|
1498
1502
|
var CHAT_SEED_RULE = '\u804A\u5929\u79CD\u5B50\uFF08spec \u2467\uFF09\uFF1A\u4ECE\u89C2\u5BDF\u91CC\u6311"\u503C\u5F97\u4E3B\u52A8\u804A\u7684\u8BDD\u9898"\u2014\u2014\u53EA\u6311\u4ED6\u771F\u6B63\u8868\u73B0\u51FA\u5174\u8DA3\u7684\u3001\u65B0\u51FA\u73B0\u7684\u4E8B\u7269\u6216\u4ED6\u60F3\u6DF1\u5165\u7684\u8BDD\u9898\uFF1B\u666E\u901A\u5BD2\u6684\u3001\u5BA2\u5957\u3001\u5DF2\u5B8C\u7ED3\u7684\u5C0F\u4E8B\u4E0D\u8BB0\u3002\u6BCF\u6761\u8F93\u51FA\u4E3A {"op":"CHAT_SEED","text":"\u4E00\u53E5\u8BDD\u7D20\u6750(<=60\u5B57)"}\uFF08topic \u53EF\u9009\uFF09\u3002\u6CA1\u6709\u5408\u9002\u7684\u5C31\u4E0D\u6311\u3002';
|
|
1499
|
-
function buildConsolidationPrompt(entriesView, observations) {
|
|
1503
|
+
function buildConsolidationPrompt(entriesView, observations, schema) {
|
|
1500
1504
|
const notes = observations.map((o) => `- [${o.kind} ${o.at}] ${o.note} (ref=${o.kind}#${o.ref})`).join("\n");
|
|
1505
|
+
const whitelist = schema ? renderSchemaWhitelist(schema) : "";
|
|
1501
1506
|
return [
|
|
1502
1507
|
"\u4F60\u662F\u7528\u6237\u753B\u50CF\u7684\u5408\u5E76\u88C1\u51B3\u5668\u3002\u4E0B\u9762\u662F\u5F53\u524D\u753B\u50CF\u6761\u76EE\u4E0E\u65B0\u89C2\u5BDF\u3002\u8BF7\u4EA7\u51FA\u7ED3\u6784\u5316\u64CD\u4F5C\u3002",
|
|
1503
1508
|
"\u88C1\u51B3\u89C4\u5219\uFF1A",
|
|
1504
1509
|
RULES,
|
|
1505
1510
|
CHAT_SEED_RULE,
|
|
1506
1511
|
"",
|
|
1512
|
+
"## \u5206\u533A\u767D\u540D\u5355\uFF08\u5FC5\u987B\u4E25\u683C\u9075\u5B88\uFF09",
|
|
1513
|
+
"partition/topic/subTopic \u53EA\u80FD\u4ECE\u4E0B\u9762\u8FD9\u4EFD\u6E05\u5355\u91CC\u9009\uFF0C\u9010\u5B57\u5339\u914D\uFF0C\u7981\u6B62\u81EA\u521B\u3001\u7981\u6B62\u6539\u5199\u6210\u522B\u7684\u540D\u5B57\uFF1A",
|
|
1514
|
+
whitelist || "(\u65E0 schema \u767D\u540D\u5355\u2014\u2014\u4F46\u5206\u533A\u5FC5\u987B\u5C5E\u4E8E interest/projects/comm/psy \u56DB\u8005\u4E4B\u4E00)",
|
|
1515
|
+
"",
|
|
1516
|
+
"## temporal \u53D6\u503C",
|
|
1517
|
+
"temporal \u53EA\u80FD\u586B stable \u6216 volatile\uFF08\u6BCF\u4E2A sub_topic \u6709\u81EA\u5DF1\u7684\u5141\u8BB8\u96C6\uFF0C\u89C1\u4E0A\u9762\u62EC\u53F7\u6807\u6CE8\uFF1B\u6CA1\u6807\u6CE8\u7684\u9ED8\u8BA4 stable\uFF09\u3002",
|
|
1518
|
+
"",
|
|
1507
1519
|
"## \u5F53\u524D\u6761\u76EE\uFF08\u4EC5\u975E psy \u5206\u533A\uFF1B\u5B57\u6BB5\uFF1Aid/partition/topic/subTopic/content/confidence\uFF09",
|
|
1508
1520
|
entriesView || "(\u7A7A)",
|
|
1509
1521
|
"",
|
|
@@ -1511,9 +1523,24 @@ function buildConsolidationPrompt(entriesView, observations) {
|
|
|
1511
1523
|
notes || "(\u7A7A)",
|
|
1512
1524
|
"",
|
|
1513
1525
|
"\u8F93\u51FA\uFF1A\u4E00\u4E2A JSON \u6570\u7EC4\u7684 ops\u3002ADD \u9700\u542B partition/topic/subTopic/content/temporal/evidence[{kind,at,ref}]\uFF1B",
|
|
1514
|
-
"UPDATE \u9700\u542B id/changes\uFF1BINVALIDATE \u9700\u542B id/why\u3002
|
|
1526
|
+
"UPDATE \u9700\u542B id/changes\uFF1BINVALIDATE \u9700\u542B id/why\u3002",
|
|
1527
|
+
'evidence[].ref \u5FC5\u987B\u662F\u80FD\u89E3\u6790\u7684\u6570\u636E\u6587\u4EF6\u5B9A\u4F4D\u7B26\uFF0C\u683C\u5F0F\u4E3A "<data\u4E0B\u7684\u6587\u4EF6>#<\u5B9A\u4F4D>"\uFF0C\u4F8B\u5982 "cursors.json#2026-09-06T08:32:51.185Z"\u3002',
|
|
1528
|
+
'\u4E0D\u8981\u5728 ref \u524D\u9762\u52A0 "chat#" \u7B49\u591A\u4F59\u524D\u7F00\u2014\u2014\u90A3\u4F1A\u5BFC\u81F4\u8BC1\u636E\u65E0\u6CD5\u89E3\u6790\u800C\u88AB\u62D2\u3002',
|
|
1529
|
+
"\u4E0D\u8981\u8F93\u51FA\u6570\u7EC4\u4EE5\u5916\u7684\u4EFB\u4F55\u5185\u5BB9\u3002"
|
|
1515
1530
|
].join("\n");
|
|
1516
1531
|
}
|
|
1532
|
+
function renderSchemaWhitelist(schema) {
|
|
1533
|
+
const rows = [];
|
|
1534
|
+
for (const [partition, p] of Object.entries(schema.partitions ?? {})) {
|
|
1535
|
+
for (const [topic, t] of Object.entries(p?.topics ?? {})) {
|
|
1536
|
+
for (const [subTopic, st] of Object.entries(t?.subtopics ?? {})) {
|
|
1537
|
+
const allowed = (st?.allowed && st.allowed.length ? st.allowed : ["stable"]).join("|");
|
|
1538
|
+
rows.push(`- ${partition}/${topic}/${subTopic} (temporal: ${allowed})`);
|
|
1539
|
+
}
|
|
1540
|
+
}
|
|
1541
|
+
}
|
|
1542
|
+
return rows.join("\n");
|
|
1543
|
+
}
|
|
1517
1544
|
var MAX_CHAT_SEEDS_PER_RUN = 3;
|
|
1518
1545
|
function splitChatSeedOps(raw) {
|
|
1519
1546
|
const chatSeeds = [];
|
|
@@ -1543,7 +1570,7 @@ async function runConsolidation(guard, paths, policy, llm, now = Date.now()) {
|
|
|
1543
1570
|
const doc = loadProfile(guard, paths.dataDir + "/profile.json");
|
|
1544
1571
|
const all = dedupeItems(inboxDrain(guard, inboxFilePath(paths.dataDir)));
|
|
1545
1572
|
const entriesView = ["interest", "projects", "comm"].flatMap((p) => doc.partitions[p].entries.filter((e) => e.validTo === null).map((e) => `${e.id} [${e.partition}/${e.topic}/${e.subTopic}] conf=${e.confidence} (${e.temporal}): ${e.content}`)).filter(Boolean).join("\n");
|
|
1546
|
-
const prompt = buildConsolidationPrompt(entriesView, all);
|
|
1573
|
+
const prompt = buildConsolidationPrompt(entriesView, all, schema);
|
|
1547
1574
|
let ops = null;
|
|
1548
1575
|
let lastError = "";
|
|
1549
1576
|
for (let attempt = 0; attempt < 2 && ops === null; attempt++) {
|
|
@@ -2197,7 +2224,23 @@ async function expressionPhases(bc) {
|
|
|
2197
2224
|
max: 3,
|
|
2198
2225
|
...screen ? { screen } : {}
|
|
2199
2226
|
});
|
|
2200
|
-
const raw = await
|
|
2227
|
+
const raw = await (async () => {
|
|
2228
|
+
try {
|
|
2229
|
+
return await agentTurn(bc.deps, bc.agent, ruminationPrompt, "decision");
|
|
2230
|
+
} catch (e) {
|
|
2231
|
+
try {
|
|
2232
|
+
bc.agent.cancel?.();
|
|
2233
|
+
} catch {
|
|
2234
|
+
}
|
|
2235
|
+
appendAuditLine(paths.logsDir + "/heartbeat.jsonl", {
|
|
2236
|
+
event: "decision_deferred",
|
|
2237
|
+
reason: String(e).slice(0, 160)
|
|
2238
|
+
});
|
|
2239
|
+
noteBeat("silent", { reason: "\u51B3\u7B56\u8F6E\u8D85\u65F6\uFF0C\u7D20\u6750\u7559\u5230\u4E0B\u4E00\u8DF3" });
|
|
2240
|
+
return null;
|
|
2241
|
+
}
|
|
2242
|
+
})();
|
|
2243
|
+
if (raw === null) return;
|
|
2201
2244
|
let parsed;
|
|
2202
2245
|
try {
|
|
2203
2246
|
parsed = parseJsonBlock(raw);
|