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 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 annotate each entry with its recorded importance and elapsed whole-day ages, 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.
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) => `[importance=${entry.importance}; created=${age(entry.created_at, projectedAt)}; updated=${age(entry.updated_at, projectedAt)}]\n${entry.content}`).join(RUNTIME_ENTRY_DELIMITER);
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: request.importance ?? previous.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
- Revision: ${snapshot.revision}${branchLine}
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
- Contents of USER.md (user profile; entries: ${visibleUser.entryCount}; UTF-8 bytes: ${storeUser.used}/${storeUser.limit})
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
- Contents of MEMORY.md (working reference; entries: ${visibleMemory.entryCount}; UTF-8 bytes: ${storeMemory.used}/${storeMemory.limit})
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, input.archive === "local" ? { archive: "local" } : {});
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.15",
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.32",
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); }