@modusensus/dsh-mneme 0.6.8 → 0.6.9

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.
Files changed (138) hide show
  1. package/.github/workflows/test.yml +32 -0
  2. package/.release-notes-v0.6.9.md +13 -0
  3. package/CHANGELOG.md +89 -0
  4. package/README.md +148 -392
  5. package/SECURITY.md +544 -0
  6. package/docs/devlog/2026-08-14-dsh-mneme-dev-log.md +247 -0
  7. package/docs/devlog/2026-08-15-dsh-mneme-audit-stress-dev-log.md +145 -0
  8. package/docs/devlog/2026-08-15-dsh-mneme-pipeline-dev-log.md +56 -0
  9. package/docs/devlog/2026-08-15-dsh-mneme-reflection-dev-log.md +77 -0
  10. package/docs/devlog/2026-08-15-dsh-mneme-review-fixes-dev-log.md +64 -0
  11. package/docs/devlog/2026-08-15-dsh-mneme-semantic-dev-log.md +90 -0
  12. package/dsh-mneme/CHANGELOG.md +248 -0
  13. package/dsh-mneme/LICENSE +21 -0
  14. package/dsh-mneme/README.md +465 -0
  15. package/dsh-mneme/docs/AGENT_MEMORY_RESEARCH.md +183 -0
  16. package/dsh-mneme/docs/ENTITIES.md +245 -0
  17. package/dsh-mneme/docs/LOCAL_MODEL.md +141 -0
  18. package/dsh-mneme/docs/MIGRATION.md +127 -0
  19. package/dsh-mneme/docs/SEMANTIC.md +256 -0
  20. package/dsh-mneme/docs/SLEEP.md +163 -0
  21. package/{lib → dsh-mneme/lib}/config.js +10 -0
  22. package/{src → dsh-mneme/lib}/dream/decisions.js +143 -94
  23. package/{lib → dsh-mneme/lib}/dream.js +32 -9
  24. package/dsh-mneme/package-lock.json +1936 -0
  25. package/dsh-mneme/package.json +80 -0
  26. package/{src → dsh-mneme/src}/config.js +10 -0
  27. package/{lib → dsh-mneme/src}/dream/decisions.js +143 -94
  28. package/{src → dsh-mneme/src}/dream.js +32 -9
  29. package/{test → dsh-mneme/test}/dream.test.js +157 -0
  30. package/package.json +58 -80
  31. package//346/250/252/345/271/205.png +0 -0
  32. /package/{cordis.patch.yml → dsh-mneme/cordis.patch.yml} +0 -0
  33. /package/{lib → dsh-mneme/lib}/api.js +0 -0
  34. /package/{lib → dsh-mneme/lib}/client.js +0 -0
  35. /package/{lib → dsh-mneme/lib}/commands.js +0 -0
  36. /package/{lib → dsh-mneme/lib}/dream/clustering.js +0 -0
  37. /package/{lib → dsh-mneme/lib}/dream/sleep.js +0 -0
  38. /package/{lib → dsh-mneme/lib}/dream/tag-extractor.js +0 -0
  39. /package/{lib → dsh-mneme/lib}/embedding.js +0 -0
  40. /package/{lib → dsh-mneme/lib}/entities/extractor.js +0 -0
  41. /package/{lib → dsh-mneme/lib}/hot-memory.js +0 -0
  42. /package/{lib → dsh-mneme/lib}/index.js +0 -0
  43. /package/{lib → dsh-mneme/lib}/inject.js +0 -0
  44. /package/{lib → dsh-mneme/lib}/local-embedder.js +0 -0
  45. /package/{lib → dsh-mneme/lib}/mirror.js +0 -0
  46. /package/{lib → dsh-mneme/lib}/parser/tag.js +0 -0
  47. /package/{lib → dsh-mneme/lib}/parser/wiki-link.js +0 -0
  48. /package/{lib → dsh-mneme/lib}/quality-filter.js +0 -0
  49. /package/{lib → dsh-mneme/lib}/reranker.js +0 -0
  50. /package/{lib → dsh-mneme/lib}/search/adaptive.js +0 -0
  51. /package/{lib → dsh-mneme/lib}/search/bm25.js +0 -0
  52. /package/{lib → dsh-mneme/lib}/search/tag-boost.js +0 -0
  53. /package/{lib → dsh-mneme/lib}/service.js +0 -0
  54. /package/{lib → dsh-mneme/lib}/settings.js +0 -0
  55. /package/{lib → dsh-mneme/lib}/store.js +0 -0
  56. /package/{lib → dsh-mneme/lib}/summarize.js +0 -0
  57. /package/{lib → dsh-mneme/lib}/tools.js +0 -0
  58. /package/{lib → dsh-mneme/lib}/vector-index.js +0 -0
  59. /package/{scripts → dsh-mneme/scripts}/benchmark-embed.js +0 -0
  60. /package/{scripts → dsh-mneme/scripts}/benchmark-recall.js +0 -0
  61. /package/{scripts → dsh-mneme/scripts}/benchmark-rerank.js +0 -0
  62. /package/{scripts → dsh-mneme/scripts}/e2e-dsh.js +0 -0
  63. /package/{scripts → dsh-mneme/scripts}/stress-dsh.js +0 -0
  64. /package/{scripts → dsh-mneme/scripts}/sync-lib.js +0 -0
  65. /package/{src → dsh-mneme/src}/api.js +0 -0
  66. /package/{src → dsh-mneme/src}/commands.js +0 -0
  67. /package/{src → dsh-mneme/src}/dream/clustering.js +0 -0
  68. /package/{src → dsh-mneme/src}/dream/sleep.js +0 -0
  69. /package/{src → dsh-mneme/src}/dream/tag-extractor.js +0 -0
  70. /package/{src → dsh-mneme/src}/embedding.js +0 -0
  71. /package/{src → dsh-mneme/src}/entities/extractor.js +0 -0
  72. /package/{src → dsh-mneme/src}/hot-memory.js +0 -0
  73. /package/{src → dsh-mneme/src}/index.js +0 -0
  74. /package/{src → dsh-mneme/src}/inject.js +0 -0
  75. /package/{src → dsh-mneme/src}/local-embedder.js +0 -0
  76. /package/{src → dsh-mneme/src}/mirror.js +0 -0
  77. /package/{src → dsh-mneme/src}/parser/tag.js +0 -0
  78. /package/{src → dsh-mneme/src}/parser/wiki-link.js +0 -0
  79. /package/{src → dsh-mneme/src}/quality-filter.js +0 -0
  80. /package/{src → dsh-mneme/src}/reranker.js +0 -0
  81. /package/{src → dsh-mneme/src}/search/adaptive.js +0 -0
  82. /package/{src → dsh-mneme/src}/search/bm25.js +0 -0
  83. /package/{src → dsh-mneme/src}/search/tag-boost.js +0 -0
  84. /package/{src → dsh-mneme/src}/service.js +0 -0
  85. /package/{src → dsh-mneme/src}/settings.js +0 -0
  86. /package/{src → dsh-mneme/src}/store.js +0 -0
  87. /package/{src → dsh-mneme/src}/summarize.js +0 -0
  88. /package/{src → dsh-mneme/src}/tools.js +0 -0
  89. /package/{src → dsh-mneme/src}/vector-index.js +0 -0
  90. /package/{test → dsh-mneme/test}/api.test.js +0 -0
  91. /package/{test → dsh-mneme/test}/audit.test.js +0 -0
  92. /package/{test → dsh-mneme/test}/benchmark.test.js +0 -0
  93. /package/{test → dsh-mneme/test}/boundary-v0625.test.js +0 -0
  94. /package/{test → dsh-mneme/test}/client.test.js +0 -0
  95. /package/{test → dsh-mneme/test}/clustering.test.js +0 -0
  96. /package/{test → dsh-mneme/test}/commands.test.js +0 -0
  97. /package/{test → dsh-mneme/test}/config.test.js +0 -0
  98. /package/{test → dsh-mneme/test}/conflict-freeze.test.js +0 -0
  99. /package/{test → dsh-mneme/test}/directory.test.js +0 -0
  100. /package/{test → dsh-mneme/test}/entities.test.js +0 -0
  101. /package/{test → dsh-mneme/test}/epistemic.test.js +0 -0
  102. /package/{test → dsh-mneme/test}/fnew-0112.test.js +0 -0
  103. /package/{test → dsh-mneme/test}/fnew-03.test.js +0 -0
  104. /package/{test → dsh-mneme/test}/graph-api.test.js +0 -0
  105. /package/{test → dsh-mneme/test}/helpers/dream-mock.js +0 -0
  106. /package/{test → dsh-mneme/test}/hot-memory.test.js +0 -0
  107. /package/{test → dsh-mneme/test}/inject.test.js +0 -0
  108. /package/{test → dsh-mneme/test}/llm-audit.test.js +0 -0
  109. /package/{test → dsh-mneme/test}/local-embedder.test.js +0 -0
  110. /package/{test → dsh-mneme/test}/mirror-dirty.test.js +0 -0
  111. /package/{test → dsh-mneme/test}/mirror-edit-digest.test.js +0 -0
  112. /package/{test → dsh-mneme/test}/mirror-generation.test.js +0 -0
  113. /package/{test → dsh-mneme/test}/mirror.test.js +0 -0
  114. /package/{test → dsh-mneme/test}/normalize-decisions.test.js +0 -0
  115. /package/{test → dsh-mneme/test}/peer-blockers.test.js +0 -0
  116. /package/{test → dsh-mneme/test}/policy-epoch.test.js +0 -0
  117. /package/{test → dsh-mneme/test}/provenance.test.js +0 -0
  118. /package/{test → dsh-mneme/test}/quality-filter.test.js +0 -0
  119. /package/{test → dsh-mneme/test}/reasoning-effort.test.js +0 -0
  120. /package/{test → dsh-mneme/test}/recall-evals.test.js +0 -0
  121. /package/{test → dsh-mneme/test}/recall-layer.test.js +0 -0
  122. /package/{test → dsh-mneme/test}/receipt-chain.test.js +0 -0
  123. /package/{test → dsh-mneme/test}/reflection.test.js +0 -0
  124. /package/{test → dsh-mneme/test}/reranker.test.js +0 -0
  125. /package/{test → dsh-mneme/test}/search-fusion.test.js +0 -0
  126. /package/{test → dsh-mneme/test}/semantic.test.js +0 -0
  127. /package/{test → dsh-mneme/test}/service-search.test.js +0 -0
  128. /package/{test → dsh-mneme/test}/service.test.js +0 -0
  129. /package/{test → dsh-mneme/test}/settings.test.js +0 -0
  130. /package/{test → dsh-mneme/test}/sleep.test.js +0 -0
  131. /package/{test → dsh-mneme/test}/store.test.js +0 -0
  132. /package/{test → dsh-mneme/test}/stress.test.js +0 -0
  133. /package/{test → dsh-mneme/test}/summarize.test.js +0 -0
  134. /package/{test → dsh-mneme/test}/tag-boost.test.js +0 -0
  135. /package/{test → dsh-mneme/test}/tag.test.js +0 -0
  136. /package/{test → dsh-mneme/test}/tools.test.js +0 -0
  137. /package/{test → dsh-mneme/test}/vector-index.test.js +0 -0
  138. /package/{test → dsh-mneme/test}/wiki-link.test.js +0 -0
@@ -137,6 +137,100 @@ test("merge across types rejects", () => {
137
137
  assert.ok(errors.some((e) => e.includes("multiple types")), "multi-type error present");
138
138
  });
139
139
 
140
+ // --- Issue #26 (P0): skipInvalid — 单条非法决策跳过,合法子集照常应用 ---------
141
+
142
+ test("validateDecisions skipInvalid: a single invalid decision is skipped, valid subset survives", () => {
143
+ const snap = new Map([
144
+ ["p", { id: "p", type: "preference", title: "语言", content: "中文", importance: 3, archived: false, forgotten: false }],
145
+ ["j", { id: "j", type: "project", title: "插件", content: "内容", importance: 3, archived: false, forgotten: false }],
146
+ ["a", { id: "a", type: "project", title: "旧A", content: "过时A", importance: 3, archived: false, forgotten: false }],
147
+ ["b", { id: "b", type: "project", title: "旧B", content: "过时B", importance: 3, archived: false, forgotten: false }]
148
+ ]);
149
+ const decisions = [
150
+ { action: "merge", ids: ["p", "j"], keepSource: "p", title: "跨类型", content: "不应合并", importance: 4 },
151
+ { action: "archive", ids: ["a"], reason: "stale" },
152
+ { action: "archive", ids: ["b"], reason: "stale" }
153
+ ];
154
+ const { ok, errors, skipped } = validateDecisions(decisions, snap, { skipInvalid: true });
155
+ assert.equal(ok, true, `valid subset should survive, got: ${errors.join("; ")}`);
156
+ assert.equal(skipped.length, 1, "cross-type merge recorded as skipped");
157
+ assert.equal(skipped[0].index, 0, "the skipped one is the cross-type merge");
158
+ assert.match(skipped[0].error, /multiple types/, "skip reason mentions types");
159
+ // invalid merge spliced out of the caller's array; valid archives + implicit
160
+ // keeps for p/j survive (p/j were left unclaimed by the skipped merge)
161
+ assert.deepEqual(decisions.map((d) => d.action), ["archive", "archive", "keep", "keep"]);
162
+ assert.deepEqual(decisions[0].ids, ["a"]);
163
+ assert.ok(decisions.some((d) => d.action === "keep" && d.ids.includes("p")), "p auto-kept");
164
+ assert.ok(decisions.some((d) => d.action === "keep" && d.ids.includes("j")), "j auto-kept");
165
+ });
166
+
167
+ test("validateDecisions skipInvalid: an all-invalid batch still rejects (coverage floor guards truncation)", () => {
168
+ const snap = new Map([
169
+ ["p", { id: "p", type: "preference", title: "语言", content: "中文", importance: 3, archived: false, forgotten: false }],
170
+ ["j", { id: "j", type: "project", title: "插件", content: "内容", importance: 3, archived: false, forgotten: false }],
171
+ ["d1", { id: "d1", type: "decision", title: "决定", content: "内容D", importance: 3, archived: false, forgotten: false }],
172
+ ["b", { id: "b", type: "project", title: "旧B", content: "过时B", importance: 3, archived: false, forgotten: false }]
173
+ ]);
174
+ // both decisions are cross-type merges → both skipped → valid claims = 0
175
+ const decisions = [
176
+ { action: "merge", ids: ["p", "j"], keepSource: "p", title: "跨类型", content: "不应合并", importance: 4 },
177
+ { action: "merge", ids: ["d1", "b"], keepSource: "d1", title: "跨类型2", content: "不应合并", importance: 4 }
178
+ ];
179
+ const { ok, errors, skipped } = validateDecisions(decisions, snap, { skipInvalid: true });
180
+ assert.equal(ok, false, "no valid decisions left → whole batch rejected");
181
+ assert.equal(skipped.length, 2);
182
+ assert.ok(errors.some((e) => e.includes("coverage")), "coverage error present");
183
+ assert.equal(decisions.length, 2, "rejected batch left untouched (splice only on the success path)");
184
+ });
185
+
186
+ test("validateDecisions skipInvalid: runaway update count still rejects the whole batch (global cap)", () => {
187
+ const snap = new Map([
188
+ ["a", { id: "a", type: "project", title: "A", content: "旧A", importance: 3, archived: false, forgotten: false, created_at: "2020-01-01T00:00:00.000Z" }],
189
+ ["b", { id: "b", type: "project", title: "B", content: "旧B", importance: 3, archived: false, forgotten: false, created_at: "2020-01-01T00:00:00.000Z" }],
190
+ ["c", { id: "c", type: "project", title: "C", content: "旧C", importance: 3, archived: false, forgotten: false, created_at: "2020-01-01T00:00:00.000Z" }]
191
+ ]);
192
+ const decisions = [
193
+ { action: "update", ids: ["a"], content: "新A" },
194
+ { action: "update", ids: ["b"], content: "新B" },
195
+ { action: "update", ids: ["c"], content: "新C" }
196
+ ];
197
+ const { ok, errors } = validateDecisions(decisions, snap, { skipInvalid: true });
198
+ assert.equal(ok, false, "3 updates > default cap 2 → still rejects");
199
+ assert.ok(errors.some((e) => e.includes("too many update decisions")), "global cap error present");
200
+ });
201
+
202
+ // --- Issue #26 (P1): allowCrossTypeMerge — 显式放宽跨类型合并 -----------------
203
+
204
+ test("validateDecisions allowCrossTypeMerge: cross-type merge is allowed when the flag is on", () => {
205
+ const snap = new Map([
206
+ ["p", { id: "p", type: "preference", title: "语言", content: "中文", importance: 3, archived: false, forgotten: false }],
207
+ ["j", { id: "j", type: "project", title: "插件", content: "内容", importance: 3, archived: false, forgotten: false }]
208
+ ]);
209
+ const decisions = [
210
+ { action: "merge", ids: ["p", "j"], keepSource: "p", title: "合并", content: "合并内容", importance: 4 }
211
+ ];
212
+ const { ok, errors } = validateDecisions(decisions, snap, { allowCrossTypeMerge: true });
213
+ assert.equal(ok, true, `cross-type merge allowed with the flag, got: ${errors.join("; ")}`);
214
+ assert.equal(decisions.length, 1, "no keep appended (both snapshot ids claimed)");
215
+ });
216
+
217
+ test("validateDecisions allowCrossTypeMerge off + skipInvalid: cross-type merge is skipped, not applied", () => {
218
+ const snap = new Map([
219
+ ["p", { id: "p", type: "preference", title: "语言", content: "中文", importance: 3, archived: false, forgotten: false }],
220
+ ["j", { id: "j", type: "project", title: "插件", content: "内容", importance: 3, archived: false, forgotten: false }],
221
+ ["a", { id: "a", type: "project", title: "旧A", content: "过时A", importance: 3, archived: false, forgotten: false }],
222
+ ["b", { id: "b", type: "project", title: "旧B", content: "过时B", importance: 3, archived: false, forgotten: false }]
223
+ ]);
224
+ const decisions = [
225
+ { action: "merge", ids: ["p", "j"], keepSource: "p", title: "跨类型", content: "不应合并", importance: 4 },
226
+ { action: "archive", ids: ["a"], reason: "stale" },
227
+ { action: "archive", ids: ["b"], reason: "stale" }
228
+ ];
229
+ const { ok, skipped } = validateDecisions(decisions, snap, { skipInvalid: true, allowCrossTypeMerge: false });
230
+ assert.equal(ok, true);
231
+ assert.equal(skipped.length, 1, "flag off → cross-type merge still skipped");
232
+ });
233
+
140
234
  function dreamSetup() {
141
235
  const store = createStore(":memory:");
142
236
  const service = createService({ store, mirror: null, config: {} });
@@ -483,6 +577,69 @@ test("runDream fails safe on invalid decisions", async () => {
483
577
  store.close();
484
578
  });
485
579
 
580
+ // --- Issue #26: 部分非法决策 → 跳过非法、应用合法子集、run 记为 degraded ----
581
+
582
+ test("runDream applies the valid subset and records degraded when some decisions are invalid (Issue #26)", async () => {
583
+ const { store, service } = dreamSetup();
584
+ const a = service.saveWithDedupe({ type: "project", title: "项目A", content: "内容A", importance: 3 });
585
+ const b = service.saveWithDedupe({ type: "project", title: "项目B", content: "内容B", importance: 3 });
586
+ const c = service.saveWithDedupe({ type: "preference", title: "偏好C", content: "内容C", importance: 3 });
587
+ const d = service.saveWithDedupe({ type: "preference", title: "偏好D", content: "内容D", importance: 3 });
588
+ // 2 个合法同类型 merge + 1 个非法跨类型 merge(a×c,且 a/c 已被合法决策占用)
589
+ const decisions = [
590
+ { action: "merge", ids: [a.memory.id, b.memory.id], title: "项目总览", content: "AB 合并", importance: 4, keepSource: a.memory.id },
591
+ { action: "merge", ids: [c.memory.id, d.memory.id], title: "偏好总览", content: "CD 合并", importance: 4, keepSource: c.memory.id },
592
+ { action: "merge", ids: [a.memory.id, c.memory.id], title: "非法跨类型", content: "不应合并", importance: 4, keepSource: a.memory.id }
593
+ ];
594
+ const warnings = [];
595
+ const ctx = mockCtx({ onConsolidation: () => JSON.stringify(decisions) });
596
+ ctx.logger.warn = (m) => warnings.push(m);
597
+ const dream = createDreamScheduler({ thresholdCount: 1, thresholdChars: 0, delayMs: 0 });
598
+ const result = await dream.runDream(ctx, service, { dreamProvider: "deepseek", dreamModel: "deepseek-chat" });
599
+ assert.equal(result.status, "degraded", "partial-invalid run recorded as degraded");
600
+ assert.equal(result.ok, true, "degraded is ok for the scheduler baseline");
601
+ assert.equal(result.applied, 2, "2 valid merges applied");
602
+ assert.equal(result.skipped.length, 1, "cross-type merge skipped");
603
+ // valid merges landed
604
+ assert.equal(store.getById(a.memory.id).title, "项目总览", "keeper A updated");
605
+ assert.equal(store.getById(b.memory.id).archived, true, "B archived");
606
+ assert.equal(store.getById(c.memory.id).title, "偏好总览", "keeper C updated");
607
+ assert.equal(store.getById(d.memory.id).archived, true, "D archived");
608
+ // audit row records degraded + the skipped decision, never a fake ok
609
+ const run = store.listDreamRuns()[0];
610
+ assert.equal(run.status, "degraded", "audit row records degraded");
611
+ assert.equal(run.applied, 2, "audit row applied count");
612
+ assert.equal(run.outcome.skipped.length, 1, "audit outcome records the skipped decision");
613
+ assert.match(run.error, /skipped 1 invalid decision/, "audit error explains the skip");
614
+ assert.ok(warnings.some((m) => m.includes("skipping invalid decision")), "skip logged");
615
+ store.close();
616
+ });
617
+
618
+ test("runDream with dreamSkipInvalid=false keeps the old whole-batch rejection (Issue #26 opt-out)", async () => {
619
+ const { store, service } = dreamSetup();
620
+ const a = service.saveWithDedupe({ type: "project", title: "项目A", content: "内容A", importance: 3 });
621
+ const b = service.saveWithDedupe({ type: "project", title: "项目B", content: "内容B", importance: 3 });
622
+ const c = service.saveWithDedupe({ type: "preference", title: "偏好C", content: "内容C", importance: 3 });
623
+ const d = service.saveWithDedupe({ type: "preference", title: "偏好D", content: "内容D", importance: 3 });
624
+ const decisions = [
625
+ { action: "merge", ids: [a.memory.id, c.memory.id], title: "非法跨类型", content: "不应合并", importance: 4, keepSource: a.memory.id },
626
+ { action: "merge", ids: [b.memory.id, d.memory.id], title: "项目B", content: "合并", importance: 4, keepSource: b.memory.id }
627
+ ];
628
+ const warnings = [];
629
+ const ctx = mockCtx({ onConsolidation: () => JSON.stringify(decisions) });
630
+ ctx.logger.warn = (m) => warnings.push(m);
631
+ const dream = createDreamScheduler({ thresholdCount: 1, thresholdChars: 0, delayMs: 0 });
632
+ const result = await dream.runDream(ctx, service, {
633
+ dreamProvider: "deepseek", dreamModel: "deepseek-chat",
634
+ dreamSkipInvalid: false
635
+ });
636
+ assert.equal(result.ok, false, "opt-out rejects the whole batch");
637
+ assert.equal(store.listDreamRuns()[0].status, "failed", "audited as failed");
638
+ assert.equal(store.getById(a.memory.id).content, "内容A", "nothing changed");
639
+ assert.equal(store.getById(b.memory.id).archived, false, "valid-looking decision also not applied");
640
+ store.close();
641
+ });
642
+
486
643
  // --- item ①: CAS guard against concurrent edits ----------------------------
487
644
 
488
645
  test("applyDecisions CAS: merge onto a concurrently-edited target is skipped as a conflict, not applied", () => {
package/package.json CHANGED
@@ -1,80 +1,58 @@
1
- {
2
- "name": "@modusensus/dsh-mneme",
3
- "description": "Cross-session memory plugin for DeepSeek Harness with autoDream consolidation: SQLite store, Markdown mirrors, 7 model tools, automatic injection, session summarization, user profile/rules, custom slash commands, vector (semantic) search, and a Web GUI panel",
4
- "version": "0.6.8",
5
- "license": "MIT",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/modusensus/dsh-mneme.git"
9
- },
10
- "homepage": "https://github.com/modusensus/dsh-mneme#readme",
11
- "bugs": {
12
- "url": "https://github.com/modusensus/dsh-mneme/issues"
13
- },
14
- "type": "module",
15
- "main": "lib/index.js",
16
- "exports": {
17
- ".": {
18
- "default": "./lib/index.js"
19
- },
20
- "./client": {
21
- "default": "./lib/client.js"
22
- },
23
- "./package.json": "./package.json"
24
- },
25
- "files": [
26
- "lib",
27
- "src",
28
- "scripts",
29
- "test",
30
- "cordis.patch.yml"
31
- ],
32
- "dsh": {
33
- "client": {
34
- "inject": [
35
- "slots",
36
- "locale",
37
- "layout",
38
- "connection"
39
- ],
40
- "platform": "web"
41
- },
42
- "bundle": {
43
- "patch": "./cordis.patch.yml"
44
- }
45
- },
46
- "peerDependencies": {
47
- "@deepseek-ai/cordis": "^4.0.1",
48
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
49
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
50
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
51
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
52
- "@deepseek-ai/schemastery": "^3.18.1"
53
- },
54
- "devDependencies": {
55
- "@deepseek-ai/cordis": "^4.0.1",
56
- "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
57
- "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
58
- "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
59
- "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
60
- "@deepseek-ai/schemastery": "^3.18.1",
61
- "c8": "^12.0.0"
62
- },
63
- "scripts": {
64
- "sync": "node scripts/sync-lib.js",
65
- "prepack": "npm run sync",
66
- "test": "node --test test/*.test.js",
67
- "test:coverage": "c8 node --test test/*.test.js",
68
- "e2e": "node scripts/e2e-dsh.js",
69
- "stress": "node scripts/stress-dsh.js"
70
- },
71
- "dependencies": {
72
- "@huggingface/transformers": "^4.2.0"
73
- },
74
- "overrides": {
75
- "adm-zip": "0.6.0"
76
- },
77
- "c8": {
78
- "reporter": ["text", "lcov"]
79
- }
80
- }
1
+ {
2
+ "name": "@modusensus/dsh-mneme",
3
+ "version": "0.6.9",
4
+ "description": "Structured memory engine for DeepSeek Harness. Offline semantic search, entity-attribute-timeline, autoDream self-consolidation, and human-editable Markdown storage.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/modusensus/dsh-mneme.git"
9
+ },
10
+ "homepage": "https://github.com/modusensus/dsh-mneme#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/modusensus/dsh-mneme/issues"
13
+ },
14
+ "type": "module",
15
+ "main": "./dsh-mneme/lib/index.js",
16
+ "exports": {
17
+ ".": {
18
+ "default": "./dsh-mneme/lib/index.js"
19
+ },
20
+ "./client": {
21
+ "default": "./dsh-mneme/lib/client.js"
22
+ },
23
+ "./package.json": "./dsh-mneme/package.json"
24
+ },
25
+ "dsh": {
26
+ "client": {
27
+ "inject": [
28
+ "slots",
29
+ "locale",
30
+ "layout",
31
+ "connection"
32
+ ],
33
+ "platform": "web"
34
+ },
35
+ "bundle": {
36
+ "patch": "./dsh-mneme/cordis.patch.yml"
37
+ },
38
+ "marketplace": {
39
+ "profiles": [
40
+ "web"
41
+ ],
42
+ "requiresBuildApproval": false,
43
+ "requiresRestart": true,
44
+ "manualSteps": false
45
+ }
46
+ },
47
+ "scripts": {
48
+ "prepublishOnly": "node -e \"const fs=require('fs');const v=JSON.parse(fs.readFileSync('./dsh-mneme/package.json','utf8')).version;const p=JSON.parse(fs.readFileSync('./package.json','utf8'));p.version=v;fs.writeFileSync('./package.json',JSON.stringify(p,null,2)+'\\n')\""
49
+ },
50
+ "peerDependencies": {
51
+ "@deepseek-ai/cordis": "^4.0.1",
52
+ "@deepseek-ai/dsh-host-webserver": "^0.1.0-rc.6",
53
+ "@deepseek-ai/dsh-llm": "^0.1.0-rc.6",
54
+ "@deepseek-ai/dsh-system-prompt": "^0.1.0-rc.6",
55
+ "@deepseek-ai/dsh-tools": "^0.1.0-rc.6",
56
+ "@deepseek-ai/schemastery": "^3.18.1"
57
+ }
58
+ }
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes