dsh-mnemon-source-runtime 0.5.15 → 0.5.17
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 +1 -1
- package/lib/client.js +2 -2
- package/lib/index.js +39 -24
- package/package.json +2 -2
- package/presentation/page.module.css +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ Choose an existing data authority deliberately. Without `dataDir`, each stable S
|
|
|
19
19
|
|
|
20
20
|
Disabling participation does not delete stored entries. Source data remains separate from the current turn's projection and access grants.
|
|
21
21
|
|
|
22
|
-
Model projections
|
|
22
|
+
Model projections omit default `importance=normal` and whole-day ages of `0d`; they annotate entries only when non-default fields remain, for example `[importance=critical; created=14d; updated=2d]`, followed by the exact content. Future timestamps show `future`; unparseable ones show `unknown`. Ages are captured once per projection and remain fixed for that turn. Annotations count toward the Strategy's projection budget, but do not change stored JSON/Markdown, content matching or storage capacity. For replacement/removal, use only the entry content. Current instructions retain priority. Model-facing text omits revision hashes and quota/count statistics, while the Source protocol and management/UI retain them. File boundaries and all visible content remain; no low-importance entry is automatically hidden.
|
|
23
23
|
|
|
24
24
|
## Storage files
|
|
25
25
|
|
package/lib/client.js
CHANGED
|
@@ -104,7 +104,7 @@ window.__ModuleLoader__.load({
|
|
|
104
104
|
};
|
|
105
105
|
//#endregion
|
|
106
106
|
//#region \0source-css:/home/runner/work/dsh-mnemon/dsh-mnemon/plugins/dsh-mnemon-source-runtime/presentation/page.module.css.mjs
|
|
107
|
-
const css$2 = ".IIa07q_runtimeComposer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:12px;padding:16px}.IIa07q_runtimeComposerHeading{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:12px;display:flex}.IIa07q_runtimeComposerHeading h3{margin:0 0 2px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_runtimeComposerHeading p{color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_runtimeComposerHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_runtimeComposer>textarea,.IIa07q_runtimeEntry textarea{resize:vertical;border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;color:var(--mn-text);background:var(--mn-input);outline:0;padding:8px 10px;font-size:13px;line-height:20px}.IIa07q_runtimeComposer>textarea:focus,.IIa07q_runtimeEntry textarea:focus{border-color:var(--mn-accent)}.IIa07q_runtimeComposerActions{justify-content:flex-end;align-items:flex-end;gap:8px;margin-top:12px;display:flex}.IIa07q_runtimeComposerActions label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_runtimeChoice button{min-width:136px}.IIa07q_runtimeReadOnly{border-radius:var(--dsw-radius-md);color:var(--mn-muted);background:var(--mn-fill);margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeSummaryGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-bottom:12px;display:grid}.IIa07q_runtimeSummaryCard{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-width:0}.IIa07q_runtimeBrowser{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);overflow:hidden}.IIa07q_runtimeBrowserToolbar{border-bottom:.5px solid var(--mn-line);justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}.IIa07q_runtimeScopeFilter{border-radius:var(--dsw-radius-md);background:var(--mn-hover);flex-wrap:wrap;align-items:center;gap:2px;padding:3px;display:inline-flex}.IIa07q_runtimeScopeFilter button{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;padding:0 12px;font-size:13px;font-weight:500;line-height:20px}.IIa07q_runtimeScopeFilter button:hover{color:var(--mn-text)}.IIa07q_runtimeScopeFilter button[data-active]{color:var(--mn-text);background:var(--mn-layer-1);box-shadow:var(--dsw-elevation-soft)}.IIa07q_runtimeScopeFilter b{color:var(--mn-faint);font-variant-numeric:tabular-nums;margin-left:6px;font-size:12px;font-weight:400}.IIa07q_runtimeFilterQuery{width:min(320px,42%);min-width:210px}.IIa07q_runtimeUnifiedList{grid-template-columns:1fr;gap:8px;padding:12px;display:grid}.IIa07q_runtimeEntryBadges{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.IIa07q_runtimeEntryMeta .IIa07q_runtimeEntryTarget{color:var(--mn-accent);background:color-mix(in srgb, var(--mn-accent) 10%, transparent)}.IIa07q_runtimeEntryMeta .IIa07q_runtimeEntryBranch{text-overflow:ellipsis;white-space:nowrap;max-width:140px;color:var(--mn-muted);background:var(--mn-fill);font-family:var(--mn-code);overflow:hidden}.IIa07q_runtimeComposerBranch{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_runtimeComposerBranch input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;height:36px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:0 10px;font-size:13px;font-weight:400}.IIa07q_runtimeComposerBranch input:focus{border-color:var(--mn-accent)}.IIa07q_bodyEditBranch{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEditBranch input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:0 10px;font-size:13px;font-weight:400}.IIa07q_bodyEditBranch input:focus{border-color:var(--mn-accent)}.IIa07q_bodyEditBranch small{color:var(--mn-faint);font-size:12px;font-weight:400}.IIa07q_runtimeTargetHeader{justify-content:space-between;align-items:center;gap:16px;padding:14px 16px 8px;display:flex}.IIa07q_runtimeTargetHeader>div{gap:0;display:grid}.IIa07q_runtimeTargetHeader span{color:var(--mn-faint);font-family:var(--mn-code);font-size:11px;line-height:16px}.IIa07q_runtimeTargetHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_runtimeTargetHeader>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_capacityLine{align-items:center;gap:10px;padding:0 16px;display:flex}.IIa07q_capacityLine>div{background:var(--mn-fill);border-radius:999px;flex:1;height:4px;overflow:hidden}.IIa07q_capacityLine i{border-radius:inherit;background:var(--dsw-alias-brand-primary);height:100%;transition:width .25s;display:block}.IIa07q_capacityLine>span{min-width:88px;color:var(--mn-faint);text-align:right;font-variant-numeric:tabular-nums;font-size:11px}.IIa07q_runtimeTargetDescription{min-height:36px;color:var(--mn-faint);margin:8px 16px 14px;font-size:12px;line-height:18px}.IIa07q_runtimeEntry{--mn-provider-color:var(--mn-accent);border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);padding:12px 14px 10px;position:relative}.IIa07q_runtimeEntry[data-importance=critical]{--mn-provider-color:var(--mn-priority)}.IIa07q_runtimeEntry[data-importance=low]{--mn-provider-color:var(--mn-faint)}.IIa07q_runtimeEntry[data-focused]{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}.IIa07q_runtimeEntryMeta{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_runtimeEntryMeta>span,.IIa07q_runtimeEntryBadges>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_runtimeEntry[data-importance=critical] .IIa07q_runtimeEntryMeta>span,.IIa07q_runtimeEntry[data-importance=critical] .IIa07q_runtimeEntryBadges>span:not(.IIa07q_runtimeEntryTarget){color:var(--mn-warn);background:color-mix(in srgb, var(--mn-warn) 12%, transparent)}.IIa07q_runtimeEntryMeta time{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;overflow:hidden}.IIa07q_runtimeEntry>p{white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0;font-size:14px;line-height:22px}.IIa07q_runtimeEntry>select{margin-top:8px}.IIa07q_runtimeEntry footer{border-top:.5px solid var(--mn-line);justify-content:flex-end;align-items:center;gap:8px;min-height:32px;margin-top:8px;padding-top:8px;display:flex}.IIa07q_runtimeEntry footer>span{color:var(--mn-danger);margin-right:auto;font-size:12px}.IIa07q_runtimeEmpty{min-height:128px;color:var(--mn-faint);text-align:center;align-content:center;place-items:center;gap:6px;display:grid}.IIa07q_runtimeEmpty>span{font-size:20px;line-height:1}.IIa07q_runtimeEmpty p{margin:0;font-size:13px;line-height:20px}@media (width<=1000px){.IIa07q_runtimeSummaryGrid{grid-template-columns:1fr}}@media (width<=760px){.IIa07q_runtimeComposerHeading,.IIa07q_runtimeComposerActions{flex-direction:column;align-items:stretch}.IIa07q_runtimeComposerActions>*,.IIa07q_runtimeComposerActions button{width:100%}.IIa07q_runtimeBrowserToolbar{flex-direction:column;align-items:stretch}.IIa07q_runtimeFilterQuery{width:100%;min-width:0}}";
|
|
107
|
+
const css$2 = ".IIa07q_runtimeComposer{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);margin-bottom:12px;padding:16px}.IIa07q_runtimeComposerHeading{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:12px;display:flex}.IIa07q_runtimeComposerHeading h3{margin:0 0 2px;font-size:14px;font-weight:500;line-height:22px}.IIa07q_runtimeComposerHeading p{color:var(--mn-faint);margin:0;font-size:12px;line-height:18px}.IIa07q_runtimeComposerHeading>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;flex:none;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_runtimeComposer>textarea,.IIa07q_runtimeEntry textarea{resize:vertical;border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;color:var(--mn-text);background:var(--mn-input);outline:0;padding:8px 10px;font-size:13px;line-height:20px}.IIa07q_runtimeComposer>textarea:focus,.IIa07q_runtimeEntry textarea:focus{border-color:var(--mn-accent)}.IIa07q_runtimeComposerActions{justify-content:flex-end;align-items:flex-end;gap:8px;margin-top:12px;display:flex}.IIa07q_runtimeComposerActions label{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_runtimeChoice button{min-width:136px}.IIa07q_runtimeReadOnly{border-radius:var(--dsw-radius-md);color:var(--mn-muted);background:var(--mn-block-fill,var(--mn-fill));margin-bottom:12px;padding:8px 12px;font-size:12px;line-height:18px}.IIa07q_runtimeSummaryGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-bottom:12px;display:grid}.IIa07q_runtimeSummaryCard{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);min-width:0}.IIa07q_runtimeBrowser{border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-lg);overflow:hidden}.IIa07q_runtimeBrowserToolbar{border-bottom:.5px solid var(--mn-line);justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}.IIa07q_runtimeScopeFilter{border-radius:var(--dsw-radius-md);background:var(--mn-hover);flex-wrap:wrap;align-items:center;gap:2px;padding:3px;display:inline-flex}.IIa07q_runtimeScopeFilter button{border-radius:var(--dsw-radius-sm);min-height:28px;color:var(--mn-muted);cursor:pointer;background:0 0;border:0;padding:0 12px;font-size:13px;font-weight:500;line-height:20px}.IIa07q_runtimeScopeFilter button:hover{color:var(--mn-text)}.IIa07q_runtimeScopeFilter button[data-active]{color:var(--mn-text);background:var(--mn-layer-1);box-shadow:var(--dsw-elevation-soft)}.IIa07q_runtimeScopeFilter b{color:var(--mn-faint);font-variant-numeric:tabular-nums;margin-left:6px;font-size:12px;font-weight:400}.IIa07q_runtimeFilterQuery{width:min(320px,42%);min-width:210px}.IIa07q_runtimeUnifiedList{grid-template-columns:1fr;gap:8px;padding:12px;display:grid}.IIa07q_runtimeEntryBadges{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.IIa07q_runtimeEntryMeta .IIa07q_runtimeEntryTarget{color:var(--mn-accent);background:color-mix(in srgb, var(--mn-accent) 10%, transparent)}.IIa07q_runtimeEntryMeta .IIa07q_runtimeEntryBranch{text-overflow:ellipsis;white-space:nowrap;max-width:140px;color:var(--mn-muted);background:var(--mn-fill);font-family:var(--mn-code);overflow:hidden}.IIa07q_runtimeComposerBranch{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_runtimeComposerBranch input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;height:36px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:0 10px;font-size:13px;font-weight:400}.IIa07q_runtimeComposerBranch input:focus{border-color:var(--mn-accent)}.IIa07q_bodyEditBranch{color:var(--mn-muted);gap:6px;font-size:12px;font-weight:500;line-height:18px;display:grid}.IIa07q_bodyEditBranch input{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);width:100%;height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:0 10px;font-size:13px;font-weight:400}.IIa07q_bodyEditBranch input:focus{border-color:var(--mn-accent)}.IIa07q_bodyEditBranch small{color:var(--mn-faint);font-size:12px;font-weight:400}.IIa07q_runtimeTargetHeader{justify-content:space-between;align-items:center;gap:16px;padding:14px 16px 8px;display:flex}.IIa07q_runtimeTargetHeader>div{gap:0;display:grid}.IIa07q_runtimeTargetHeader span{color:var(--mn-faint);font-family:var(--mn-code);font-size:11px;line-height:16px}.IIa07q_runtimeTargetHeader h3{margin:0;font-size:14px;font-weight:500;line-height:22px}.IIa07q_runtimeTargetHeader>strong{color:var(--mn-muted);background:var(--mn-fill);font-variant-numeric:tabular-nums;border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_capacityLine{align-items:center;gap:10px;padding:0 16px;display:flex}.IIa07q_capacityLine>div{background:var(--mn-fill);border-radius:999px;flex:1;height:4px;overflow:hidden}.IIa07q_capacityLine i{border-radius:inherit;background:var(--dsw-alias-brand-primary);height:100%;transition:width .25s;display:block}.IIa07q_capacityLine>span{min-width:88px;color:var(--mn-faint);text-align:right;font-variant-numeric:tabular-nums;font-size:11px}.IIa07q_runtimeTargetDescription{min-height:36px;color:var(--mn-faint);margin:8px 16px 14px;font-size:12px;line-height:18px}.IIa07q_runtimeEntry{--mn-provider-color:var(--mn-accent);border:.5px solid var(--mn-card-line);border-radius:var(--dsw-radius-md);padding:12px 14px 10px;position:relative}.IIa07q_runtimeEntry[data-importance=critical]{--mn-provider-color:var(--mn-priority)}.IIa07q_runtimeEntry[data-importance=low]{--mn-provider-color:var(--mn-faint)}.IIa07q_runtimeEntry[data-focused]{border-color:color-mix(in srgb, var(--mn-accent) 60%, var(--mn-card-line));box-shadow:0 0 0 2px color-mix(in srgb, var(--mn-accent) 14%, transparent)}.IIa07q_runtimeEntryMeta{justify-content:space-between;align-items:center;gap:12px;display:flex}.IIa07q_runtimeEntryMeta>span,.IIa07q_runtimeEntryBadges>span{color:var(--mn-muted);background:var(--mn-fill);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px}.IIa07q_runtimeEntry[data-importance=critical] .IIa07q_runtimeEntryMeta>span,.IIa07q_runtimeEntry[data-importance=critical] .IIa07q_runtimeEntryBadges>span:not(.IIa07q_runtimeEntryTarget){color:var(--mn-warn);background:color-mix(in srgb, var(--mn-warn) 12%, transparent)}.IIa07q_runtimeEntryMeta time{color:var(--mn-faint);text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;overflow:hidden}.IIa07q_runtimeEntry>p{white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0;font-size:14px;line-height:22px}.IIa07q_runtimeEntry>select{margin-top:8px}.IIa07q_runtimeEntry footer{border-top:.5px solid var(--mn-line);justify-content:flex-end;align-items:center;gap:8px;min-height:32px;margin-top:8px;padding-top:8px;display:flex}.IIa07q_runtimeEntry footer>span{color:var(--mn-danger);margin-right:auto;font-size:12px}.IIa07q_runtimeEmpty{min-height:128px;color:var(--mn-faint);text-align:center;align-content:center;place-items:center;gap:6px;display:grid}.IIa07q_runtimeEmpty>span{font-size:20px;line-height:1}.IIa07q_runtimeEmpty p{margin:0;font-size:13px;line-height:20px}@media (width<=1000px){.IIa07q_runtimeSummaryGrid{grid-template-columns:1fr}}@media (width<=760px){.IIa07q_runtimeComposerHeading,.IIa07q_runtimeComposerActions{flex-direction:column;align-items:stretch}.IIa07q_runtimeComposerActions>*,.IIa07q_runtimeComposerActions button{width:100%}.IIa07q_runtimeBrowserToolbar{flex-direction:column;align-items:stretch}.IIa07q_runtimeFilterQuery{width:100%;min-width:0}}";
|
|
108
108
|
const id$1 = "dsh-mnemon-source-runtime/presentation/page.module.css";
|
|
109
109
|
if (typeof document !== "undefined") {
|
|
110
110
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(id$1) + "]");
|
|
@@ -706,7 +706,7 @@ window.__ModuleLoader__.load({
|
|
|
706
706
|
function runtimePageClient(management) {
|
|
707
707
|
const client = (0, dsh_mnemon_client.createMemorySourcePageClient)(management);
|
|
708
708
|
return {
|
|
709
|
-
runtimeMemory: () => client.read("snapshot"),
|
|
709
|
+
runtimeMemory: () => client.read("snapshot", null, { coalesce: true }),
|
|
710
710
|
mutateRuntimeMemory: (input) => client.canAssist("mutate") ? client.assist("mutate", {
|
|
711
711
|
...input,
|
|
712
712
|
...input.old_text === void 0 ? {} : { oldText: input.old_text }
|
package/lib/index.js
CHANGED
|
@@ -183,12 +183,20 @@ function age(timestamp, projectedAt) {
|
|
|
183
183
|
}
|
|
184
184
|
/** Prompt-only annotations; stored content, matching and capacity stay unchanged. */
|
|
185
185
|
function contextMarkdown(entries, target, projectedAt) {
|
|
186
|
-
return entries.filter((entry) => entry.target === target).map((entry) =>
|
|
186
|
+
return entries.filter((entry) => entry.target === target).map((entry) => {
|
|
187
|
+
const annotations = [];
|
|
188
|
+
if (entry.importance !== "normal") annotations.push(`importance=${entry.importance}`);
|
|
189
|
+
for (const [name, timestamp] of [["created", entry.created_at], ["updated", entry.updated_at]]) {
|
|
190
|
+
const elapsed = age(timestamp, projectedAt);
|
|
191
|
+
if (elapsed !== "0d") annotations.push(`${name}=${elapsed}`);
|
|
192
|
+
}
|
|
193
|
+
return `${annotations.length === 0 ? "" : `[${annotations.join("; ")}]\n`}${entry.content}`;
|
|
194
|
+
}).join(RUNTIME_ENTRY_DELIMITER);
|
|
187
195
|
}
|
|
188
196
|
function revision(file) {
|
|
189
197
|
return createHash("sha256").update(JSON.stringify(file)).digest("hex");
|
|
190
198
|
}
|
|
191
|
-
function prepareMutation(before, request, now) {
|
|
199
|
+
function prepareMutation(before, request, now, preserveImportance = false) {
|
|
192
200
|
if (!isTarget(request.target)) throw new Error("target must be memory or user");
|
|
193
201
|
if (![
|
|
194
202
|
"add",
|
|
@@ -240,12 +248,19 @@ function prepareMutation(before, request, now) {
|
|
|
240
248
|
const previous = entries[index];
|
|
241
249
|
const compactableEntries = entries.filter((entry, entryIndex) => entry.target === request.target && entryIndex !== index);
|
|
242
250
|
if (request.action === "replace") {
|
|
251
|
+
const ranks = {
|
|
252
|
+
low: 0,
|
|
253
|
+
normal: 1,
|
|
254
|
+
critical: 2
|
|
255
|
+
};
|
|
256
|
+
const requested = request.importance ?? previous.importance;
|
|
257
|
+
const importance = preserveImportance && ranks[requested] < ranks[previous.importance] ? previous.importance : requested;
|
|
243
258
|
const content = normalizeContent(request.content, "content");
|
|
244
259
|
const pendingEntry = {
|
|
245
260
|
...previous,
|
|
246
261
|
content,
|
|
247
262
|
updated_at: now,
|
|
248
|
-
importance
|
|
263
|
+
importance
|
|
249
264
|
};
|
|
250
265
|
if (branchScope !== void 0) {
|
|
251
266
|
if (branchScope.length === 0) delete pendingEntry.branches;
|
|
@@ -259,7 +274,7 @@ function prepareMutation(before, request, now) {
|
|
|
259
274
|
pendingEntry,
|
|
260
275
|
excludedEntry: previous,
|
|
261
276
|
fields: {
|
|
262
|
-
message: "Entry replaced.",
|
|
277
|
+
message: importance === requested ? "Entry replaced." : "Entry replaced; original importance preserved.",
|
|
263
278
|
replaced: {
|
|
264
279
|
from: previous.content,
|
|
265
280
|
to: content
|
|
@@ -414,8 +429,6 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
414
429
|
}
|
|
415
430
|
}
|
|
416
431
|
};
|
|
417
|
-
const storeMemory = this.targetView(entries, "memory");
|
|
418
|
-
const storeUser = this.targetView(entries, "user");
|
|
419
432
|
const visibleEntries = branchScope === void 0 ? entries : entries.filter((entry) => entry.target === "user" || entryMatchesBranch(entry, branchScope));
|
|
420
433
|
const branchLine = branchScope === void 0 ? "" : `\nGit branch: ${branchScope}${local.hidden > 0 ? ` (${local.hidden} branch-scoped entr${local.hidden === 1 ? "y" : "ies"} hidden)` : ""}`;
|
|
421
434
|
return {
|
|
@@ -426,15 +439,14 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
426
439
|
})),
|
|
427
440
|
totalEntries: entries.length,
|
|
428
441
|
text: `MNEMON RUNTIME MEMORY SNAPSHOT
|
|
429
|
-
|
|
430
|
-
Metadata lines are annotations; created/updated are ages at projection in whole days (future/unknown for future/invalid timestamps). Current instructions win. For old_text/oldText, use entry content only.
|
|
442
|
+
Entry annotations default to importance=normal and ages=0d (whole days at projection; future/unknown for future/invalid timestamps). Current instructions win. For old_text/oldText, use entry content only.${branchLine}
|
|
431
443
|
|
|
432
|
-
|
|
444
|
+
USER.md (user profile)
|
|
433
445
|
<runtime-memory-file name="USER.md">
|
|
434
446
|
${user || "(empty)"}
|
|
435
447
|
</runtime-memory-file>
|
|
436
448
|
|
|
437
|
-
|
|
449
|
+
MEMORY.md (working reference)
|
|
438
450
|
<runtime-memory-file name="MEMORY.md">
|
|
439
451
|
${memory || "(empty)"}
|
|
440
452
|
</runtime-memory-file>`
|
|
@@ -465,18 +477,18 @@ ${memory || "(empty)"}
|
|
|
465
477
|
};
|
|
466
478
|
});
|
|
467
479
|
}
|
|
468
|
-
mutate(request) {
|
|
469
|
-
if (request.target === "user" && this.userController !== void 0) return this.userController.mutate(request);
|
|
470
|
-
const operation = this.queue.then(() => this.withLock(() => this.mutateLocked(request)));
|
|
480
|
+
mutate(request, options = {}) {
|
|
481
|
+
if (request.target === "user" && this.userController !== void 0) return this.userController.mutate(request, options);
|
|
482
|
+
const operation = this.queue.then(() => this.withLock(() => this.mutateLocked(request, options.preserveImportance)));
|
|
471
483
|
this.queue = operation.catch(() => void 0);
|
|
472
484
|
return operation;
|
|
473
485
|
}
|
|
474
486
|
/** Resolve exactly which committed entries survive a blocked mutation and are safe to compact. */
|
|
475
|
-
planMaintenance(request) {
|
|
476
|
-
if (request.target === "user" && this.userController !== void 0) return this.userController.planMaintenance(request);
|
|
487
|
+
planMaintenance(request, options = {}) {
|
|
488
|
+
if (request.target === "user" && this.userController !== void 0) return this.userController.planMaintenance(request, options);
|
|
477
489
|
const operation = this.queue.then(() => this.withLock(() => {
|
|
478
490
|
const file = this.readSource();
|
|
479
|
-
const prepared = prepareMutation(file.entries, request, this.now().toISOString());
|
|
491
|
+
const prepared = prepareMutation(file.entries, request, this.now().toISOString(), options.preserveImportance);
|
|
480
492
|
const used = runtimeBytes(file.entries, request.target);
|
|
481
493
|
const projected = runtimeBytes(prepared.projectedEntries, request.target);
|
|
482
494
|
const limit = this.limits[request.target];
|
|
@@ -506,13 +518,13 @@ ${memory || "(empty)"}
|
|
|
506
518
|
* local archive first, so a limit with no Memory Space to archive into never loses memory.
|
|
507
519
|
*/
|
|
508
520
|
compactAndMutate(expectedRevision, request, compacted, maxCompactedBytes, options = {}) {
|
|
509
|
-
if (request.target === "user" && this.userController !== void 0) return this.userController.compactAndMutate(expectedRevision, request, compacted, maxCompactedBytes);
|
|
521
|
+
if (request.target === "user" && this.userController !== void 0) return this.userController.compactAndMutate(expectedRevision, request, compacted, maxCompactedBytes, options);
|
|
510
522
|
const operation = this.queue.then(() => this.withLock(() => {
|
|
511
523
|
const file = this.readSource();
|
|
512
524
|
const beforeRevision = revision(file);
|
|
513
525
|
if (beforeRevision !== expectedRevision) throw new RuntimeMemoryConflictError();
|
|
514
526
|
const now = this.now().toISOString();
|
|
515
|
-
const prepared = prepareMutation(file.entries, request, now);
|
|
527
|
+
const prepared = prepareMutation(file.entries, request, now, options.preserveImportance);
|
|
516
528
|
const compactedByteBudget = maxCompactedBytes ?? this.limits[request.target];
|
|
517
529
|
if (!Number.isInteger(compactedByteBudget) || compactedByteBudget < 0 || compactedByteBudget > this.limits[request.target]) throw new Error("compaction byte budget is invalid");
|
|
518
530
|
if (!prepared.changed) return this.result(request.target, prepared.projectedEntries, prepared.fields);
|
|
@@ -580,9 +592,9 @@ ${memory || "(empty)"}
|
|
|
580
592
|
this.persist(file);
|
|
581
593
|
});
|
|
582
594
|
}
|
|
583
|
-
mutateLocked(request) {
|
|
595
|
+
mutateLocked(request, preserveImportance = false) {
|
|
584
596
|
const file = this.readSource();
|
|
585
|
-
const prepared = prepareMutation(file.entries, request, this.now().toISOString());
|
|
597
|
+
const prepared = prepareMutation(file.entries, request, this.now().toISOString(), preserveImportance);
|
|
586
598
|
if (!prepared.changed) return this.result(request.target, prepared.projectedEntries, prepared.fields);
|
|
587
599
|
const used = runtimeBytes(prepared.projectedEntries, request.target);
|
|
588
600
|
const limit = this.limits[request.target];
|
|
@@ -881,7 +893,7 @@ function createRuntimeMemorySource(config = {}) {
|
|
|
881
893
|
if (request.mode === "read") {
|
|
882
894
|
let value;
|
|
883
895
|
if (request.operation === "snapshot") value = controller.snapshot();
|
|
884
|
-
else if (request.operation === "maintenance-plan") value = await controller.planMaintenance(runtimeMutation(request.input));
|
|
896
|
+
else if (request.operation === "maintenance-plan") value = await controller.planMaintenance(runtimeMutation(request.input), { preserveImportance: input.preserveImportance === true });
|
|
885
897
|
else throw new Error("unsupported Runtime management read operation: " + request.operation);
|
|
886
898
|
return {
|
|
887
899
|
revision: controller.snapshot().revision,
|
|
@@ -890,7 +902,7 @@ function createRuntimeMemorySource(config = {}) {
|
|
|
890
902
|
}
|
|
891
903
|
if (!request.confirmed) throw new Error("Runtime management mutation requires explicit confirmation");
|
|
892
904
|
let result;
|
|
893
|
-
if (request.operation === "mutate") result = await controller.mutate(runtimeMutation(request.input));
|
|
905
|
+
if (request.operation === "mutate") result = await controller.mutate(runtimeMutation(request.input), { preserveImportance: input.preserveImportance === true });
|
|
894
906
|
else if (request.operation === "compact-and-mutate") {
|
|
895
907
|
if (!Array.isArray(input.compacted)) throw new Error("compacted must be an array");
|
|
896
908
|
const compacted = input.compacted.map((value) => {
|
|
@@ -904,7 +916,10 @@ function createRuntimeMemorySource(config = {}) {
|
|
|
904
916
|
};
|
|
905
917
|
});
|
|
906
918
|
if (input.archive !== void 0 && input.archive !== "local") throw new Error("archive must be \"local\" when given");
|
|
907
|
-
result = await controller.compactAndMutate(memoryInputText(input.revision, "revision", 300), runtimeMutation(input.mutation), compacted, typeof input.maxBytes === "number" ? input.maxBytes : void 0,
|
|
919
|
+
result = await controller.compactAndMutate(memoryInputText(input.revision, "revision", 300), runtimeMutation(input.mutation), compacted, typeof input.maxBytes === "number" ? input.maxBytes : void 0, {
|
|
920
|
+
...input.archive === "local" ? { archive: "local" } : {},
|
|
921
|
+
preserveImportance: input.preserveImportance === true
|
|
922
|
+
});
|
|
908
923
|
} else throw new Error("unsupported Runtime management mutation operation: " + request.operation);
|
|
909
924
|
return {
|
|
910
925
|
revision: controller.snapshot().revision,
|
|
@@ -912,7 +927,7 @@ function createRuntimeMemorySource(config = {}) {
|
|
|
912
927
|
};
|
|
913
928
|
},
|
|
914
929
|
async mutate(request) {
|
|
915
|
-
const result = await controller.mutate(runtimeMutation(request.input));
|
|
930
|
+
const result = await controller.mutate(runtimeMutation(request.input), { preserveImportance: true });
|
|
916
931
|
const revision = controller.snapshot().revision;
|
|
917
932
|
return createMemoryMutationReceipt(request.view.id, request.offer.id, context.sourceInstanceKey, revision, result, "committed");
|
|
918
933
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-mnemon-source-runtime",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.17",
|
|
4
4
|
"description": "Self-contained runtime Source for Composable View Memory.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@types/node": "^22.0.0",
|
|
61
61
|
"@types/react": "^18.3.0",
|
|
62
62
|
"@types/react-dom": "^18.3.0",
|
|
63
|
-
"dsh-mnemon": "^0.5.
|
|
63
|
+
"dsh-mnemon": "^0.5.38",
|
|
64
64
|
"jsdom": "^26.0.0",
|
|
65
65
|
"react": "^18.2.0",
|
|
66
66
|
"react-dom": "^18.2.0",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
.runtimeComposerActions { display: flex; align-items: flex-end; justify-content: flex-end; gap: 8px; margin-top: 12px; }
|
|
12
12
|
.runtimeComposerActions label { display: grid; gap: 6px; color: var(--mn-muted); font-size: 12px; font-weight: 500; line-height: 18px; }
|
|
13
13
|
.runtimeChoice button { min-width: 136px; }
|
|
14
|
-
.runtimeReadOnly { margin-bottom: 12px; padding: 8px 12px; border-radius: var(--dsw-radius-md); color: var(--mn-muted); background: var(--mn-fill); font-size: 12px; line-height: 18px; }
|
|
14
|
+
.runtimeReadOnly { margin-bottom: 12px; padding: 8px 12px; border-radius: var(--dsw-radius-md); color: var(--mn-muted); background: var(--mn-block-fill, var(--mn-fill)); font-size: 12px; line-height: 18px; }
|
|
15
15
|
.runtimeSummaryGrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
|
|
16
16
|
.runtimeSummaryCard { min-width: 0; border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-lg); }
|
|
17
17
|
.runtimeBrowser { overflow: hidden; border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-lg); }
|