dsh-mnemon-source-runtime 0.5.8 → 0.5.10
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 +2 -0
- package/lib/client.js +3 -3
- package/lib/index.d.ts +1 -1
- package/lib/index.js +24 -41
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +14 -8
- package/presentation/page.module.css +55 -53
- package/presentation/sidebar.module.css +7 -41
package/README.md
CHANGED
|
@@ -19,6 +19,8 @@ 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.
|
|
23
|
+
|
|
22
24
|
## Source-owned UI and tests
|
|
23
25
|
|
|
24
26
|
The optional `./client` entry is an ordinary DSH Client plugin. This package owns its pages and `presentation/` resources and uses `dsh-mnemon/client` for the shared frame and scoped management client. It never receives a Host Context, credentials or another Source's controller.
|
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
|
|
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_runtimeComposerActions select,.IIa07q_runtimeEntry select{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);min-width:136px;height:32px;color:var(--mn-text);background:var(--mn-input);outline:0;padding:0 10px;font-size:13px}.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{border:.5px solid var(--mn-field-line);border-radius:var(--dsw-radius-md);background:var(--mn-input);align-items:center;gap:6px;width:min(320px,42%);min-width:210px;padding:0 10px;display:flex}.IIa07q_runtimeFilterQuery:focus-within{border-color:var(--mn-accent)}.IIa07q_runtimeFilterQuery>span{color:var(--mn-faint)}.IIa07q_runtimeFilterQuery input{width:100%;min-width:0;height:32px;color:var(--mn-text);background:0 0;border:0;outline:0;font-size:13px}.IIa07q_runtimeFilterQuery input::placeholder{color:var(--dsw-alias-label-dimmed)}.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:32px;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_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;min-height:40px;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 select,.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) + "]");
|
|
@@ -141,7 +141,7 @@ window.__ModuleLoader__.load({
|
|
|
141
141
|
};
|
|
142
142
|
//#endregion
|
|
143
143
|
//#region \0source-css:/home/runner/work/dsh-mnemon/dsh-mnemon/plugins/dsh-mnemon-source-runtime/presentation/sidebar.module.css.mjs
|
|
144
|
-
const css$1 = "._Bh55G_shell ._Bh55G_modal form[class*=runtimeComposer]{background:0 0;border:0;border-radius:0;margin:0;padding:0}._Bh55G_shell ._Bh55G_modal form[class*=runtimeComposer]>[class*=runtimeComposerHeading]{display:none}._Bh55G_shell [class*=
|
|
144
|
+
const css$1 = "._Bh55G_shell ._Bh55G_modal form[class*=runtimeComposer]{background:0 0;border:0;border-radius:0;margin:0;padding:0}._Bh55G_shell ._Bh55G_modal form[class*=runtimeComposer]>[class*=runtimeComposerHeading]{display:none}._Bh55G_shell [class*=runtimeEntryBadges]>span{border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}._Bh55G_shell [class*=runtimeEntryBadges]>[class*=runtimeEntryTarget]{color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent);font-family:var(--dsw-font-family)}._Bh55G_shell [class*=runtimeEntry][data-importance=critical] [class*=runtimeEntryBadges]>span:last-child{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent)}";
|
|
145
145
|
const id = "dsh-mnemon-source-runtime/presentation/sidebar.module.css";
|
|
146
146
|
if (typeof document !== "undefined") {
|
|
147
147
|
let tag = document.querySelector("style[data-plugin-css=" + JSON.stringify(id) + "]");
|
|
@@ -746,7 +746,7 @@ window.__ModuleLoader__.load({
|
|
|
746
746
|
}
|
|
747
747
|
const inject = ["slots", "locale"];
|
|
748
748
|
function apply(ctx) {
|
|
749
|
-
installRuntimeMemoryUI(ctx, ctx.locale
|
|
749
|
+
installRuntimeMemoryUI(ctx, ctx.locale.bind("mnemon"));
|
|
750
750
|
}
|
|
751
751
|
//#endregion
|
|
752
752
|
exports.RuntimePage = RuntimePage;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RUNTIME_ENTRY_DELIMITER, RUNTIME_MEMORY_LIMITS, RUNTIME_MEMORY_VERSION, RuntimeMemoryAction, RuntimeMemoryCompactedEntry, RuntimeMemoryEntry, RuntimeMemoryImportance, RuntimeMemoryLimits, RuntimeMemoryMaintenancePlan, RuntimeMemoryMutation, RuntimeMemoryMutationResult, RuntimeMemorySnapshot, RuntimeMemoryTarget, RuntimeMemoryTargetView, RuntimeMemoryUsage } from "./contracts.js";
|
|
2
|
-
import z from "schemastery";
|
|
2
|
+
import z from "@deepseek-ai/schemastery";
|
|
3
3
|
import { MemorySourceDefinition } from "dsh-mnemon/contracts";
|
|
4
4
|
import { Context } from "@deepseek-ai/cordis";
|
|
5
5
|
//#region src/config.d.ts
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { n as RUNTIME_MEMORY_LIMITS, o as MAX_RUNTIME_MEMORY_LIMIT_BYTES, t as R
|
|
|
2
2
|
import { createMemoryMutationReceipt, defineMemoryPlugin, defineMemorySource, installMemory, memoryConfigurationDigest, memoryInputRecord, memoryInputStringArray, memoryInputText, truncateMemoryText } from "dsh-mnemon/extension-sdk";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { basename, isAbsolute, join } from "node:path";
|
|
5
|
-
import z from "schemastery";
|
|
5
|
+
import z from "@deepseek-ai/schemastery";
|
|
6
6
|
import { COMPOSABLE_MEMORY_API_VERSION } from "dsh-mnemon/contracts";
|
|
7
7
|
import { execFileSync } from "node:child_process";
|
|
8
8
|
import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
@@ -162,6 +162,16 @@ function markdown(entries, target) {
|
|
|
162
162
|
const content = entries.filter((entry) => entry.target === target).map((entry) => entry.content).join(RUNTIME_ENTRY_DELIMITER);
|
|
163
163
|
return content === "" ? "" : `${content}\n`;
|
|
164
164
|
}
|
|
165
|
+
function age(timestamp, projectedAt) {
|
|
166
|
+
const time = Date.parse(timestamp);
|
|
167
|
+
if (!Number.isFinite(time)) return "unknown";
|
|
168
|
+
if (time > projectedAt) return "future";
|
|
169
|
+
return `${Math.floor((projectedAt - time) / 864e5)}d`;
|
|
170
|
+
}
|
|
171
|
+
/** Prompt-only annotations; stored content, matching and capacity stay unchanged. */
|
|
172
|
+
function contextMarkdown(entries, target, projectedAt) {
|
|
173
|
+
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);
|
|
174
|
+
}
|
|
165
175
|
function revision(file) {
|
|
166
176
|
return createHash("sha256").update(JSON.stringify(file)).digest("hex");
|
|
167
177
|
}
|
|
@@ -299,7 +309,7 @@ function sleepSync(milliseconds) {
|
|
|
299
309
|
}
|
|
300
310
|
/**
|
|
301
311
|
* Single authority for hot memory. JSON is the durable source of truth;
|
|
302
|
-
* Markdown files
|
|
312
|
+
* Markdown files retain plain content; prompt projections add recorded metadata.
|
|
303
313
|
*/
|
|
304
314
|
var RuntimeMemoryController = class RuntimeMemoryController {
|
|
305
315
|
now;
|
|
@@ -340,9 +350,6 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
340
350
|
entries: [...global.entries.filter((entry) => entry.target === "user"), ...local.entries.filter((entry) => entry.target === "memory")]
|
|
341
351
|
});
|
|
342
352
|
}
|
|
343
|
-
contextText(branch) {
|
|
344
|
-
return this.contextProjection(branch).text;
|
|
345
|
-
}
|
|
346
353
|
/**
|
|
347
354
|
* Read the exact Runtime revision and its prompt projection from each
|
|
348
355
|
* configured authority root.
|
|
@@ -352,8 +359,9 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
352
359
|
*/
|
|
353
360
|
contextProjection(branch) {
|
|
354
361
|
const branchScope = scopeBranch(branch);
|
|
355
|
-
const
|
|
356
|
-
const
|
|
362
|
+
const projectedAt = this.now().getTime();
|
|
363
|
+
const local = this.localContextProjection(projectedAt, branchScope);
|
|
364
|
+
const global = this.userController?.localContextProjection(projectedAt);
|
|
357
365
|
const user = global?.user ?? local.user;
|
|
358
366
|
const memory = local.memory;
|
|
359
367
|
const entries = global === void 0 ? local.snapshot.entries : [...global.snapshot.entries.filter((entry) => entry.target === "user"), ...local.snapshot.entries.filter((entry) => entry.target === "memory")];
|
|
@@ -366,7 +374,7 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
366
374
|
version: 1,
|
|
367
375
|
entries
|
|
368
376
|
}),
|
|
369
|
-
generatedAt:
|
|
377
|
+
generatedAt: new Date(projectedAt).toISOString(),
|
|
370
378
|
entries,
|
|
371
379
|
targets: {
|
|
372
380
|
memory: {
|
|
@@ -392,6 +400,7 @@ var RuntimeMemoryController = class RuntimeMemoryController {
|
|
|
392
400
|
totalEntries: entries.length,
|
|
393
401
|
text: `MNEMON RUNTIME MEMORY SNAPSHOT
|
|
394
402
|
Revision: ${snapshot.revision}${branchLine}
|
|
403
|
+
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.
|
|
395
404
|
|
|
396
405
|
Contents of USER.md (user profile; entries: ${visibleUser.entryCount}; UTF-8 bytes: ${storeUser.used}/${storeUser.limit})
|
|
397
406
|
<runtime-memory-file name="USER.md">
|
|
@@ -404,7 +413,7 @@ ${memory || "(empty)"}
|
|
|
404
413
|
</runtime-memory-file>`
|
|
405
414
|
};
|
|
406
415
|
}
|
|
407
|
-
localContextProjection(branch) {
|
|
416
|
+
localContextProjection(projectedAt, branch) {
|
|
408
417
|
const branchScope = scopeBranch(branch);
|
|
409
418
|
return this.withLock(() => {
|
|
410
419
|
const file = this.readSource();
|
|
@@ -416,15 +425,15 @@ ${memory || "(empty)"}
|
|
|
416
425
|
directory: this.directory,
|
|
417
426
|
sourcePath: this.sourcePath,
|
|
418
427
|
revision: revision(file),
|
|
419
|
-
generatedAt:
|
|
428
|
+
generatedAt: new Date(projectedAt).toISOString(),
|
|
420
429
|
entries,
|
|
421
430
|
targets: {
|
|
422
431
|
memory: this.targetView(visible, "memory"),
|
|
423
432
|
user: this.targetView(visible, "user")
|
|
424
433
|
}
|
|
425
434
|
},
|
|
426
|
-
user:
|
|
427
|
-
memory:
|
|
435
|
+
user: contextMarkdown(visible, "user", projectedAt),
|
|
436
|
+
memory: contextMarkdown(visible, "memory", projectedAt),
|
|
428
437
|
hidden: branchScope === void 0 ? 0 : entries.length - visible.length
|
|
429
438
|
};
|
|
430
439
|
});
|
|
@@ -492,32 +501,6 @@ ${memory || "(empty)"}
|
|
|
492
501
|
this.queue = operation.catch(() => void 0);
|
|
493
502
|
return operation;
|
|
494
503
|
}
|
|
495
|
-
/** Apply an LLM-produced compaction only to the exact snapshot it reviewed. */
|
|
496
|
-
compactTarget(expectedRevision, target, compacted, maxBytes) {
|
|
497
|
-
if (target === "user" && this.userController !== void 0) return this.userController.compactTarget(expectedRevision, target, compacted, maxBytes).then(() => this.snapshot());
|
|
498
|
-
const operation = this.queue.then(() => this.withLock(() => {
|
|
499
|
-
const file = this.readSource();
|
|
500
|
-
if (revision(file) !== expectedRevision) throw new RuntimeMemoryConflictError();
|
|
501
|
-
const byteBudget = maxBytes ?? this.limits[target];
|
|
502
|
-
if (!Number.isInteger(byteBudget) || byteBudget < 0 || byteBudget > this.limits[target]) throw new Error("compaction byte budget is invalid");
|
|
503
|
-
const now = this.now().toISOString();
|
|
504
|
-
const fitted = packCompactionCandidates(compactionCandidates(compacted, file.entries.filter((entry) => entry.target === target), target, now), target, byteBudget);
|
|
505
|
-
const entries = [...file.entries.filter((entry) => entry.target !== target), ...fitted];
|
|
506
|
-
const used = byteCount(entries, target);
|
|
507
|
-
const limit = this.limits[target];
|
|
508
|
-
if (used > limit) throw new RuntimeMemoryCapacityError(target, byteCount(file.entries, target), used, limit);
|
|
509
|
-
this.persist({
|
|
510
|
-
version: 1,
|
|
511
|
-
entries
|
|
512
|
-
});
|
|
513
|
-
return this.snapshotUnlocked({
|
|
514
|
-
version: 1,
|
|
515
|
-
entries
|
|
516
|
-
});
|
|
517
|
-
}));
|
|
518
|
-
this.queue = operation.catch(() => void 0);
|
|
519
|
-
return this.userController === void 0 ? operation : operation.then(() => this.snapshot());
|
|
520
|
-
}
|
|
521
504
|
initialize() {
|
|
522
505
|
mkdirSync(this.directory, {
|
|
523
506
|
recursive: true,
|
|
@@ -737,7 +720,7 @@ function createRuntimeMemorySource(config = {}) {
|
|
|
737
720
|
content: { type: "string" },
|
|
738
721
|
oldText: {
|
|
739
722
|
type: "string",
|
|
740
|
-
description: "Full content of the existing entry, or a unique substring. A unique full-content match takes precedence within the selected target. Required for replace and remove."
|
|
723
|
+
description: "Full content of the existing entry, or a unique substring, excluding the generated metadata line. A unique full-content match takes precedence within the selected target. Required for replace and remove."
|
|
741
724
|
},
|
|
742
725
|
importance: {
|
|
743
726
|
type: "string",
|
|
@@ -879,8 +862,8 @@ const memoryPlugin = defineMemoryPlugin({
|
|
|
879
862
|
"zh-CN": "运行时记忆"
|
|
880
863
|
},
|
|
881
864
|
description: {
|
|
882
|
-
en: "
|
|
883
|
-
"zh-CN": "
|
|
865
|
+
en: "Bounded, deterministic hot memory injected directly into every eligible turn.",
|
|
866
|
+
"zh-CN": "有界且确定的热记忆,在每个符合条件的回合中直接注入。"
|
|
884
867
|
},
|
|
885
868
|
roles: ["source"],
|
|
886
869
|
provides: [{ id: "source" }, { id: "source.working-context" }]
|
package/locale/en.json
ADDED
package/locale/zh.json
ADDED
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.10",
|
|
4
4
|
"description": "Self-contained runtime Source for Composable View Memory.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"default": "./lib/index.js"
|
|
14
14
|
},
|
|
15
15
|
"./package.json": "./package.json",
|
|
16
|
+
"./locale/*.json": "./locale/*.json",
|
|
16
17
|
"./client": {
|
|
17
18
|
"types": "./lib/types/client.d.ts",
|
|
18
19
|
"default": "./lib/client.js"
|
|
@@ -27,14 +28,12 @@
|
|
|
27
28
|
},
|
|
28
29
|
"files": [
|
|
29
30
|
"lib",
|
|
31
|
+
"locale",
|
|
30
32
|
"README.md",
|
|
31
33
|
"presentation"
|
|
32
34
|
],
|
|
33
35
|
"dsh": {
|
|
34
36
|
"client": {
|
|
35
|
-
"inject": [
|
|
36
|
-
"slots"
|
|
37
|
-
],
|
|
38
37
|
"platform": "web",
|
|
39
38
|
"external": [
|
|
40
39
|
"dsh-mnemon/client"
|
|
@@ -48,7 +47,7 @@
|
|
|
48
47
|
"verify": "pnpm typecheck && pnpm test && pnpm build"
|
|
49
48
|
},
|
|
50
49
|
"dependencies": {
|
|
51
|
-
"schemastery": "^3.18.
|
|
50
|
+
"@deepseek-ai/schemastery": "^3.18.4"
|
|
52
51
|
},
|
|
53
52
|
"peerDependencies": {
|
|
54
53
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
@@ -56,12 +55,12 @@
|
|
|
56
55
|
"react": "^18.2.0"
|
|
57
56
|
},
|
|
58
57
|
"devDependencies": {
|
|
59
|
-
"@deepseek-ai/dsh-client-ui-primitives": "0.1.
|
|
58
|
+
"@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.2",
|
|
60
59
|
"@testing-library/react": "^16.3.0",
|
|
61
60
|
"@types/node": "^22.0.0",
|
|
62
61
|
"@types/react": "^18.3.0",
|
|
63
62
|
"@types/react-dom": "^18.3.0",
|
|
64
|
-
"dsh-mnemon": "^0.5.
|
|
63
|
+
"dsh-mnemon": "^0.5.17",
|
|
65
64
|
"jsdom": "^26.0.0",
|
|
66
65
|
"react": "^18.2.0",
|
|
67
66
|
"react-dom": "^18.2.0",
|
|
@@ -84,7 +83,14 @@
|
|
|
84
83
|
"micromark-util-classify-character": "^2.0.1",
|
|
85
84
|
"micromark-util-sanitize-uri": "^2.0.1",
|
|
86
85
|
"micromark-util-symbol": "^2.0.1",
|
|
87
|
-
"shiki": "^4.3.1"
|
|
86
|
+
"shiki": "^4.3.1",
|
|
87
|
+
"@deepseek-ai/dsh-client-store": "0.1.7-rc.2",
|
|
88
|
+
"@deepseek-ai/dsh-util-code-language": "0.1.7-rc.2",
|
|
89
|
+
"@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.2",
|
|
90
|
+
"diff": "^9.0.0",
|
|
91
|
+
"immer": "^10.1.1",
|
|
92
|
+
"simple-icons": "16.31.0",
|
|
93
|
+
"zustand": "~4.4.7"
|
|
88
94
|
},
|
|
89
95
|
"peerDependenciesMeta": {
|
|
90
96
|
"react": {
|
|
@@ -1,68 +1,70 @@
|
|
|
1
|
-
.runtimeComposer { border:
|
|
2
|
-
.runtimeComposer { margin-bottom:
|
|
3
|
-
.runtimeComposerHeading { display: flex; align-items: flex-start; justify-content: space-between; gap:
|
|
4
|
-
.runtimeComposerHeading h3 { margin: 0 0 2px; font-size: 14px; }
|
|
5
|
-
.runtimeComposerHeading p { margin: 0; color: var(--mn-
|
|
6
|
-
.runtimeComposerHeading > span { flex: 0 0 auto; padding:
|
|
1
|
+
.runtimeComposer { border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-lg); }
|
|
2
|
+
.runtimeComposer { margin-bottom: 12px; padding: 16px; }
|
|
3
|
+
.runtimeComposerHeading { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 12px; }
|
|
4
|
+
.runtimeComposerHeading h3 { margin: 0 0 2px; font-size: 14px; font-weight: 500; line-height: 22px; }
|
|
5
|
+
.runtimeComposerHeading p { margin: 0; color: var(--mn-faint); font-size: 12px; line-height: 18px; }
|
|
6
|
+
.runtimeComposerHeading > span { flex: 0 0 auto; padding: 1px 8px; border-radius: 999px; color: var(--mn-muted); background: var(--mn-fill); font-size: 11px; font-weight: 500; line-height: 17px; }
|
|
7
7
|
.runtimeComposer > textarea,
|
|
8
|
-
.runtimeEntry textarea { width: 100%; resize: vertical; border:
|
|
8
|
+
.runtimeEntry textarea { width: 100%; resize: vertical; border: .5px solid var(--mn-field-line); border-radius: var(--dsw-radius-md); outline: 0; padding: 8px 10px; color: var(--mn-text); background: var(--mn-input); font-size: 13px; line-height: 20px; }
|
|
9
9
|
.runtimeComposer > textarea:focus,
|
|
10
10
|
.runtimeEntry textarea:focus { border-color: var(--mn-accent); }
|
|
11
|
-
.runtimeComposerActions { display: flex; align-items: flex-end; justify-content: flex-end; gap:
|
|
12
|
-
.runtimeComposerActions label { display: grid; gap:
|
|
11
|
+
.runtimeComposerActions { display: flex; align-items: flex-end; justify-content: flex-end; gap: 8px; margin-top: 12px; }
|
|
12
|
+
.runtimeComposerActions label { display: grid; gap: 6px; color: var(--mn-muted); font-size: 12px; font-weight: 500; line-height: 18px; }
|
|
13
13
|
.runtimeComposerActions select,
|
|
14
|
-
.runtimeEntry select { min-width:
|
|
15
|
-
.runtimeReadOnly { margin-bottom:
|
|
16
|
-
.
|
|
17
|
-
.
|
|
18
|
-
.
|
|
19
|
-
.
|
|
20
|
-
|
|
21
|
-
.runtimeScopeFilter { display: flex; flex-wrap: wrap; align-items: center; gap: 3px; }
|
|
22
|
-
.runtimeScopeFilter button { min-height:
|
|
23
|
-
.runtimeScopeFilter button:hover {
|
|
24
|
-
.runtimeScopeFilter button[data-active] {
|
|
25
|
-
.runtimeScopeFilter b { margin-left:
|
|
26
|
-
.runtimeFilterQuery { display: flex; width: min(320px, 42%); min-width: 210px; align-items: center; gap:
|
|
14
|
+
.runtimeEntry select { min-width: 136px; height: 32px; border: .5px solid var(--mn-field-line); border-radius: var(--dsw-radius-md); outline: 0; padding: 0 10px; color: var(--mn-text); background: var(--mn-input); font-size: 13px; }
|
|
15
|
+
.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; }
|
|
16
|
+
.runtimeSummaryGrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
|
|
17
|
+
.runtimeSummaryCard { min-width: 0; border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-lg); }
|
|
18
|
+
.runtimeBrowser { overflow: hidden; border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-lg); }
|
|
19
|
+
.runtimeBrowserToolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 12px; border-bottom: .5px solid var(--mn-line); }
|
|
20
|
+
/* Scope filter, as the DSH SegmentedControl. */
|
|
21
|
+
.runtimeScopeFilter { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px; padding: 3px; border-radius: var(--dsw-radius-md); background: var(--mn-hover); }
|
|
22
|
+
.runtimeScopeFilter button { min-height: 28px; border: 0; border-radius: var(--dsw-radius-sm); padding: 0 12px; color: var(--mn-muted); background: transparent; font-size: 13px; font-weight: 500; line-height: 20px; cursor: pointer; }
|
|
23
|
+
.runtimeScopeFilter button:hover { color: var(--mn-text); }
|
|
24
|
+
.runtimeScopeFilter button[data-active] { color: var(--mn-text); background: var(--mn-layer-1); box-shadow: var(--dsw-elevation-soft); }
|
|
25
|
+
.runtimeScopeFilter b { margin-left: 6px; color: var(--mn-faint); font-size: 12px; font-weight: 400; font-variant-numeric: tabular-nums; }
|
|
26
|
+
.runtimeFilterQuery { display: flex; width: min(320px, 42%); min-width: 210px; align-items: center; gap: 6px; border: .5px solid var(--mn-field-line); border-radius: var(--dsw-radius-md); padding: 0 10px; background: var(--mn-input); }
|
|
27
|
+
.runtimeFilterQuery:focus-within { border-color: var(--mn-accent); }
|
|
27
28
|
.runtimeFilterQuery > span { color: var(--mn-faint); }
|
|
28
|
-
.runtimeFilterQuery input { width: 100%; min-width: 0; height: 32px; border: 0; outline: 0; color: var(--mn-text); background: transparent; }
|
|
29
|
-
.
|
|
30
|
-
.
|
|
31
|
-
.
|
|
32
|
-
.runtimeEntryMeta .
|
|
33
|
-
.
|
|
34
|
-
.runtimeComposerBranch
|
|
29
|
+
.runtimeFilterQuery input { width: 100%; min-width: 0; height: 32px; border: 0; outline: 0; color: var(--mn-text); background: transparent; font-size: 13px; }
|
|
30
|
+
.runtimeFilterQuery input::placeholder { color: var(--dsw-alias-label-dimmed); }
|
|
31
|
+
.runtimeUnifiedList { display: grid; grid-template-columns: 1fr; gap: 8px; padding: 12px; }
|
|
32
|
+
.runtimeEntryBadges { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
33
|
+
.runtimeEntryMeta .runtimeEntryTarget { color: var(--mn-accent); background: color-mix(in srgb, var(--mn-accent) 10%, transparent); }
|
|
34
|
+
.runtimeEntryMeta .runtimeEntryBranch { max-width: 140px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--mn-muted); background: var(--mn-fill); font-family: var(--mn-code); }
|
|
35
|
+
.runtimeComposerBranch { display: grid; gap: 6px; color: var(--mn-muted); font-size: 12px; font-weight: 500; line-height: 18px; }
|
|
36
|
+
.runtimeComposerBranch input { width: 100%; height: 32px; border: .5px solid var(--mn-field-line); border-radius: var(--dsw-radius-md); outline: 0; padding: 0 10px; color: var(--mn-text); background: var(--mn-input); font-size: 13px; font-weight: 400; }
|
|
35
37
|
.runtimeComposerBranch input:focus { border-color: var(--mn-accent); }
|
|
36
|
-
.bodyEditBranch { display: grid; gap:
|
|
37
|
-
.bodyEditBranch input { width: 100%; border:
|
|
38
|
+
.bodyEditBranch { display: grid; gap: 6px; color: var(--mn-muted); font-size: 12px; font-weight: 500; line-height: 18px; }
|
|
39
|
+
.bodyEditBranch input { width: 100%; height: 32px; border: .5px solid var(--mn-field-line); border-radius: var(--dsw-radius-md); outline: 0; padding: 0 10px; color: var(--mn-text); background: var(--mn-input); font-size: 13px; font-weight: 400; }
|
|
38
40
|
.bodyEditBranch input:focus { border-color: var(--mn-accent); }
|
|
39
|
-
.bodyEditBranch small { color: var(--mn-faint); font-size:
|
|
40
|
-
.runtimeTargetHeader { display: flex; align-items: center; justify-content: space-between; gap:
|
|
41
|
-
.runtimeTargetHeader > div { display: grid; gap:
|
|
42
|
-
.runtimeTargetHeader span { color: var(--mn-faint); font:
|
|
43
|
-
.runtimeTargetHeader h3 { margin: 0; font-size:
|
|
44
|
-
.runtimeTargetHeader > strong {
|
|
45
|
-
.capacityLine { display: flex; align-items: center; gap:
|
|
46
|
-
.capacityLine > div { height: 4px; flex: 1; overflow: hidden; border-radius: 999px; background: var(--mn-
|
|
47
|
-
.capacityLine i { display: block; height: 100%; border-radius: inherit; background: var(--
|
|
48
|
-
.capacityLine > span { min-width: 88px; color: var(--mn-faint); font:
|
|
49
|
-
.runtimeTargetDescription { min-height:
|
|
50
|
-
.runtimeEntry { --mn-provider-color: var(--mn-accent); position: relative; padding:
|
|
41
|
+
.bodyEditBranch small { color: var(--mn-faint); font-size: 12px; font-weight: 400; }
|
|
42
|
+
.runtimeTargetHeader { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px 16px 8px; }
|
|
43
|
+
.runtimeTargetHeader > div { display: grid; gap: 0; }
|
|
44
|
+
.runtimeTargetHeader span { color: var(--mn-faint); font-family: var(--mn-code); font-size: 11px; line-height: 16px; }
|
|
45
|
+
.runtimeTargetHeader h3 { margin: 0; font-size: 14px; font-weight: 500; line-height: 22px; }
|
|
46
|
+
.runtimeTargetHeader > strong { padding: 1px 8px; border-radius: 999px; color: var(--mn-muted); background: var(--mn-fill); font-size: 11px; font-weight: 500; line-height: 17px; font-variant-numeric: tabular-nums; }
|
|
47
|
+
.capacityLine { display: flex; align-items: center; gap: 10px; padding: 0 16px; }
|
|
48
|
+
.capacityLine > div { height: 4px; flex: 1; overflow: hidden; border-radius: 999px; background: var(--mn-fill); }
|
|
49
|
+
.capacityLine i { display: block; height: 100%; border-radius: inherit; background: var(--dsw-alias-brand-primary); transition: width .25s ease; }
|
|
50
|
+
.capacityLine > span { min-width: 88px; color: var(--mn-faint); font-size: 11px; text-align: right; font-variant-numeric: tabular-nums; }
|
|
51
|
+
.runtimeTargetDescription { min-height: 36px; margin: 8px 16px 14px; color: var(--mn-faint); font-size: 12px; line-height: 18px; }
|
|
52
|
+
.runtimeEntry { --mn-provider-color: var(--mn-accent); position: relative; padding: 12px 14px 10px; border: .5px solid var(--mn-card-line); border-radius: var(--dsw-radius-md); }
|
|
51
53
|
.runtimeEntry[data-importance="critical"] { --mn-provider-color: var(--mn-priority); }
|
|
52
54
|
.runtimeEntry[data-importance="low"] { --mn-provider-color: var(--mn-faint); }
|
|
53
55
|
.runtimeEntryMeta { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
|
|
54
56
|
.runtimeEntryMeta > span,
|
|
55
|
-
.runtimeEntryBadges > span { padding:
|
|
57
|
+
.runtimeEntryBadges > span { padding: 1px 8px; border-radius: 999px; color: var(--mn-muted); background: var(--mn-fill); font-size: 11px; font-weight: 500; line-height: 17px; }
|
|
56
58
|
.runtimeEntry[data-importance="critical"] .runtimeEntryMeta > span,
|
|
57
|
-
.runtimeEntry[data-importance="critical"] .runtimeEntryBadges > span:not(.runtimeEntryTarget) { color: var(--mn-
|
|
58
|
-
.runtimeEntryMeta time { overflow: hidden; color: var(--mn-faint); font:
|
|
59
|
-
.runtimeEntry > p { min-height:
|
|
60
|
-
.runtimeEntry > select { margin-top:
|
|
61
|
-
.runtimeEntry footer { display: flex; min-height:
|
|
62
|
-
.runtimeEntry footer > span { margin-right: auto; color: var(--mn-danger); font-size:
|
|
63
|
-
.runtimeEmpty { display: grid; min-height:
|
|
64
|
-
.runtimeEmpty > span { font:
|
|
65
|
-
.runtimeEmpty p { margin: 0; font-size:
|
|
59
|
+
.runtimeEntry[data-importance="critical"] .runtimeEntryBadges > span:not(.runtimeEntryTarget) { color: var(--mn-warn); background: color-mix(in srgb, var(--mn-warn) 12%, transparent); }
|
|
60
|
+
.runtimeEntryMeta time { overflow: hidden; color: var(--mn-faint); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
61
|
+
.runtimeEntry > p { min-height: 40px; margin: 8px 0; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; line-height: 22px; }
|
|
62
|
+
.runtimeEntry > select { margin-top: 8px; }
|
|
63
|
+
.runtimeEntry footer { display: flex; min-height: 32px; align-items: center; justify-content: flex-end; gap: 8px; margin-top: 8px; padding-top: 8px; border-top: .5px solid var(--mn-line); }
|
|
64
|
+
.runtimeEntry footer > span { margin-right: auto; color: var(--mn-danger); font-size: 12px; }
|
|
65
|
+
.runtimeEmpty { display: grid; min-height: 128px; place-items: center; align-content: center; gap: 6px; color: var(--mn-faint); text-align: center; }
|
|
66
|
+
.runtimeEmpty > span { font-size: 20px; line-height: 1; }
|
|
67
|
+
.runtimeEmpty p { margin: 0; font-size: 13px; line-height: 20px; }
|
|
66
68
|
|
|
67
69
|
@media (max-width: 1000px) {
|
|
68
70
|
.runtimeSummaryGrid { grid-template-columns: 1fr; }
|
|
@@ -7,56 +7,22 @@
|
|
|
7
7
|
}
|
|
8
8
|
.shell .modal form[class*='runtimeComposer'] > [class*='runtimeComposerHeading'] { display: none; }
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
gap: 5px;
|
|
12
|
-
color: var(--dsw-alias-label-secondary);
|
|
13
|
-
font-size: 12px;
|
|
14
|
-
font-weight: 500;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.shell [class*='runtimeComposer'] > textarea,
|
|
18
|
-
.shell [class*='runtimeComposerActions'] select,
|
|
19
|
-
.shell [class*='runtimeEntry'] select {
|
|
20
|
-
min-height: 34px;
|
|
21
|
-
border: 1px solid var(--dsw-alias-border-l2);
|
|
22
|
-
border-radius: 8px;
|
|
23
|
-
padding: 7px 10px;
|
|
24
|
-
color: var(--dsw-alias-label-primary);
|
|
25
|
-
background: var(--dsw-specific-input-major);
|
|
26
|
-
font-size: 13px;
|
|
27
|
-
font-weight: 400;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.shell [class*='runtimeTargetDescription'] { font-size: 12px; }
|
|
31
|
-
|
|
32
|
-
.shell [class*='runtimeEntryMeta'] > span,
|
|
33
|
-
.shell [class*='runtimeEntryBadges'] > span,
|
|
34
|
-
.shell [class*='runtimeEntryMeta'] time { font-size: 11px; }
|
|
35
|
-
|
|
36
|
-
.shell [class*='runtimeEntry'] > p { font-size: 13px; }
|
|
10
|
+
/* Runtime metadata reads as DSH Tags; the target is the one informational tone. */
|
|
37
11
|
.shell [class*='runtimeEntryBadges'] > span {
|
|
38
12
|
display: inline-flex;
|
|
39
|
-
min-height: 22px;
|
|
40
13
|
align-items: center;
|
|
41
|
-
border: 1px solid var(--dsw-alias-border-l1);
|
|
42
14
|
border-radius: 999px;
|
|
43
|
-
padding:
|
|
44
|
-
color: var(--dsw-alias-label-secondary);
|
|
45
|
-
background: var(--dsw-alias-bg-layer-1);
|
|
15
|
+
padding: 1px 8px;
|
|
46
16
|
font-size: 11px;
|
|
47
|
-
font-weight:
|
|
48
|
-
line-height:
|
|
17
|
+
font-weight: 500;
|
|
18
|
+
line-height: 17px;
|
|
49
19
|
}
|
|
50
20
|
.shell [class*='runtimeEntryBadges'] > [class*='runtimeEntryTarget'] {
|
|
51
|
-
border-color: color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-border-l1));
|
|
52
21
|
color: var(--dsw-alias-state-business-primary);
|
|
53
|
-
background: color-mix(in srgb, var(--dsw-alias-state-business-primary)
|
|
22
|
+
background: color-mix(in srgb, var(--dsw-alias-state-business-primary) 10%, transparent);
|
|
54
23
|
font-family: var(--dsw-font-family);
|
|
55
|
-
font-weight: 500;
|
|
56
24
|
}
|
|
57
25
|
.shell [class*='runtimeEntry'][data-importance='critical'] [class*='runtimeEntryBadges'] > span:last-child {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 6%, var(--dsw-alias-bg-layer-1));
|
|
26
|
+
color: var(--dsw-alias-state-warn-primary);
|
|
27
|
+
background: color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);
|
|
61
28
|
}
|
|
62
|
-
.shell [class*='runtimeEntry'] footer { gap: 6px; }
|