dsh-memu-memory 1.1.3 → 1.2.0

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 (173) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +31 -2
  3. package/README.zh.md +30 -2
  4. package/docs/active-memory-ab.md +385 -0
  5. package/docs/binding-lifecycle.md +99 -0
  6. package/docs/contributing.md +1 -1
  7. package/docs/emotion-model-spec.md +281 -0
  8. package/docs/host-api.md +2 -2
  9. package/docs/memory-semantics.md +12 -10
  10. package/docs/recall-benchmark.md +238 -0
  11. package/docs/troubleshooting.md +395 -395
  12. package/lib/active-memory.js +165 -0
  13. package/lib/activity-log.js +1 -1
  14. package/lib/binding-diagnostics.js +8 -3
  15. package/lib/client.js +33 -11
  16. package/lib/consolidation-ledger.js +347 -0
  17. package/lib/consolidation-receipt.js +284 -0
  18. package/lib/consolidation-snapshot.js +274 -0
  19. package/lib/consolidation-worker.js +115 -0
  20. package/lib/cycle.js +40 -6
  21. package/lib/inject.js +104 -76
  22. package/lib/local-embedding-manager.js +24 -6
  23. package/lib/memory.js +221 -19
  24. package/lib/mood.js +268 -39
  25. package/lib/preset-scope.js +1 -1
  26. package/lib/private.js +335 -40
  27. package/lib/prompts/private-consolidation.coding.md +1 -0
  28. package/lib/prompts/private-consolidation.md +1 -0
  29. package/lib/prompts/private-consolidation.mixed.md +1 -0
  30. package/lib/prompts/private-consolidation.rp.md +1 -0
  31. package/lib/prompts.js +4 -4
  32. package/lib/remote-summary.js +51 -25
  33. package/lib/rpc.js +9 -1
  34. package/lib/state.js +29 -12
  35. package/lib/tools.js +49 -2
  36. package/lib/vector-profile.js +27 -0
  37. package/package.json +2 -1
  38. package/scripts/acceptance-local.mjs +2 -1
  39. package/scripts/active-memory-ab-live.mjs +655 -0
  40. package/scripts/active-memory-ab.mjs +1302 -0
  41. package/scripts/chain-matrix.mjs +11 -1
  42. package/scripts/check-all.mjs +10 -1
  43. package/tests/activation.test.mjs +89 -0
  44. package/tests/active-memory-ab.test.mjs +745 -0
  45. package/tests/active-memory.test.mjs +129 -0
  46. package/tests/activity-log.test.mjs +126 -0
  47. package/tests/activity-wiring.test.mjs +103 -0
  48. package/tests/appendix-b.test.mjs +212 -0
  49. package/tests/appendix-b2.test.mjs +166 -0
  50. package/tests/audit-regression.test.mjs +272 -0
  51. package/tests/audit-safety.test.mjs +227 -0
  52. package/tests/backend-compensation.test.mjs +272 -0
  53. package/tests/backup.test.mjs +793 -0
  54. package/tests/binding-diagnostics.test.mjs +720 -0
  55. package/tests/browser.test.mjs +366 -0
  56. package/tests/client-render.test.mjs +892 -0
  57. package/tests/coalesce.test.mjs +113 -0
  58. package/tests/config.test.mjs +159 -0
  59. package/tests/consolidation-credential.test.mjs +320 -0
  60. package/tests/consolidation-fork.test.mjs +357 -0
  61. package/tests/consolidation-ledger.test.mjs +298 -0
  62. package/tests/consolidation-snapshot.test.mjs +321 -0
  63. package/tests/consolidation-value.test.mjs +89 -0
  64. package/tests/context-scope.test.mjs +40 -0
  65. package/tests/cue.test.mjs +44 -0
  66. package/tests/curator-probe.test.mjs +433 -0
  67. package/tests/curator.test.mjs +150 -0
  68. package/tests/cycle.test.mjs +411 -0
  69. package/tests/disclosure.test.mjs +231 -0
  70. package/tests/doc-drift.test.mjs +222 -0
  71. package/tests/embedding-catalog.test.mjs +266 -0
  72. package/tests/embedding-download.test.mjs +391 -0
  73. package/tests/embedding-runtime.test.mjs +389 -0
  74. package/tests/emotion-chain.test.mjs +84 -0
  75. package/tests/emotion-contract.test.mjs +445 -0
  76. package/tests/engine.test.mjs +35 -0
  77. package/tests/fixtures/active-memory-ab/README.md +56 -0
  78. package/tests/fixtures/active-memory-ab/cases/01-clean-dense-turn.json +351 -0
  79. package/tests/fixtures/active-memory-ab/cases/02-clean-thin-turn.json +122 -0
  80. package/tests/fixtures/active-memory-ab/cases/03-clean-starved-small.json +125 -0
  81. package/tests/fixtures/active-memory-ab/cases/04-clean-large-thin.json +137 -0
  82. package/tests/fixtures/active-memory-ab/cases/05-clean-half-step.json +166 -0
  83. package/tests/fixtures/active-memory-ab/cases/06-clean-duplicate-reread.json +197 -0
  84. package/tests/fixtures/active-memory-ab/cases/07-clean-recent-recall.json +125 -0
  85. package/tests/fixtures/active-memory-ab/cases/08-global-relevant.json +111 -0
  86. package/tests/fixtures/active-memory-ab/cases/09-global-irrelevant-conflict.json +158 -0
  87. package/tests/fixtures/active-memory-ab/cases/10-no-human-turn.json +97 -0
  88. package/tests/fixtures/active-memory-ab/cases/11-clean-scale-100.json +137 -0
  89. package/tests/fixtures/active-memory-ab/cases/12-clean-scale-1000.json +137 -0
  90. package/tests/fixtures/active-memory-ab/cases/13-clean-scale-5000.json +137 -0
  91. package/tests/fixtures/active-memory-ab/cases/14-clean-scale-20000.json +137 -0
  92. package/tests/fixtures/active-memory-ab/lead-ai-reviewed-reference.json +191 -0
  93. package/tests/fixtures/active-memory-ab/manifest.json +199 -0
  94. package/tests/fixtures/recall-bench/01-paraphrase.json +184 -0
  95. package/tests/fixtures/recall-bench/02-exact.json +153 -0
  96. package/tests/fixtures/recall-bench/03-negation.json +173 -0
  97. package/tests/fixtures/recall-bench/04-no-answer.json +162 -0
  98. package/tests/fixtures/recall-bench/05-conflict.json +194 -0
  99. package/tests/fixtures/recall-bench/06-boundary.json +273 -0
  100. package/tests/fixtures/recall-bench/07-secret.json +191 -0
  101. package/tests/fixtures/recall-bench/08-coding.json +164 -0
  102. package/tests/fixtures/recall-bench-gold-candidates/01-paraphrase.json +193 -0
  103. package/tests/fixtures/recall-bench-gold-candidates/02-exact.json +197 -0
  104. package/tests/fixtures/recall-bench-gold-candidates/03-negation.json +244 -0
  105. package/tests/fixtures/recall-bench-gold-candidates/04-no-answer.json +189 -0
  106. package/tests/fixtures/recall-bench-gold-candidates/05-conflict.json +245 -0
  107. package/tests/fixtures/recall-bench-gold-candidates/06-boundary.json +279 -0
  108. package/tests/fixtures/recall-bench-gold-candidates/07-secret.json +224 -0
  109. package/tests/fixtures/recall-bench-gold-candidates/08-coding.json +218 -0
  110. package/tests/fixtures/repetition-eval/01-zh-rp.json +93 -0
  111. package/tests/fixtures/repetition-eval/02-en.json +97 -0
  112. package/tests/fixtures/repetition-eval/03-code.json +91 -0
  113. package/tests/fixtures/repetition-eval/04-names.json +116 -0
  114. package/tests/fixtures/repetition-eval/05-user-quote.json +96 -0
  115. package/tests/fixtures/repetition-eval/06-agreement.json +86 -0
  116. package/tests/graph-view.test.mjs +187 -0
  117. package/tests/graph.test.mjs +77 -0
  118. package/tests/hook-order.test.mjs +72 -0
  119. package/tests/humanlike.test.mjs +232 -0
  120. package/tests/hybrid-recall.test.mjs +92 -0
  121. package/tests/inbound.test.mjs +393 -0
  122. package/tests/inject-guide.test.mjs +364 -0
  123. package/tests/inject.test.mjs +222 -0
  124. package/tests/injection-budget-settings.test.mjs +35 -0
  125. package/tests/injection-budget.test.mjs +64 -0
  126. package/tests/injection-chain.test.mjs +191 -0
  127. package/tests/loader-register.mjs +3 -0
  128. package/tests/loader.mjs +12 -0
  129. package/tests/local-embedding-entry.test.mjs +95 -0
  130. package/tests/local-embedding-manager.test.mjs +476 -0
  131. package/tests/local-embedding-protocol.test.mjs +95 -0
  132. package/tests/local-embedding-worker.test.mjs +346 -0
  133. package/tests/managed-memory.test.mjs +536 -0
  134. package/tests/managed-runtime.test.mjs +40 -0
  135. package/tests/media.test.mjs +132 -0
  136. package/tests/migration-payload.test.mjs +42 -0
  137. package/tests/mood.test.mjs +109 -0
  138. package/tests/multiprocess.test.mjs +29 -0
  139. package/tests/new-session-gate.test.mjs +361 -0
  140. package/tests/package-shipping.test.mjs +84 -0
  141. package/tests/preset-scope.test.mjs +212 -0
  142. package/tests/prompts.test.mjs +250 -0
  143. package/tests/react-snapshot.test.mjs +23 -0
  144. package/tests/recall-bench.test.mjs +306 -0
  145. package/tests/remote.test.mjs +140 -0
  146. package/tests/rename.test.mjs +30 -0
  147. package/tests/repetition-detector-snapshot.test.mjs +231 -0
  148. package/tests/repetition-eval-live.test.mjs +177 -0
  149. package/tests/repetition-eval.test.mjs +373 -0
  150. package/tests/salient-date.test.mjs +142 -0
  151. package/tests/settings-beat.test.mjs +221 -0
  152. package/tests/short-term.test.mjs +166 -0
  153. package/tests/sidebar-beat.test.mjs +208 -0
  154. package/tests/sidebar-refresh.test.mjs +123 -0
  155. package/tests/sidebar.test.mjs +70 -0
  156. package/tests/snippet.test.mjs +47 -0
  157. package/tests/source-kind.test.mjs +52 -0
  158. package/tests/state.test.mjs +150 -0
  159. package/tests/stats.test.mjs +112 -0
  160. package/tests/storage.test.mjs +125 -0
  161. package/tests/stubs/dsh-llm.js +5 -0
  162. package/tests/stubs/dsh-session.js +7 -0
  163. package/tests/stubs/dsh-tools.js +101 -0
  164. package/tests/tool-schema.test.mjs +73 -0
  165. package/tests/tools.test.mjs +184 -0
  166. package/tests/ui-defaults.test.mjs +57 -0
  167. package/tests/update-fields.test.mjs +138 -0
  168. package/tests/vector-migration.test.mjs +733 -0
  169. package/tests/vector-profile.test.mjs +425 -0
  170. package/tests/visibility-migration.test.mjs +152 -0
  171. package/tests/webui-auth.test.mjs +454 -0
  172. package/tests/webui.test.mjs +164 -0
  173. package/tests/windows-env.test.mjs +89 -0
@@ -0,0 +1,89 @@
1
+ import test from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import fs from 'node:fs'
4
+
5
+ const { windowsSystemEnv } = await import('../lib/paths.js')
6
+ const { childEnvironment } = await import('../lib/local-embedding-manager.js')
7
+
8
+ // 现场事故(2026-10-29/30):仓库里长出字面量目录 `%SystemDrive%/ProgramData/...`。
9
+ // 内容是与 C:\ProgramData 同哈希的搜狗缓存和字体缓存副本 —— 宿主清空 env 之后,
10
+ // 注入进程把没展开的 `%SystemDrive%` 当相对路径写进了 cwd。这里钉住修复:插件拉起的
11
+ // 每个子进程都先补系统变量,再叠加 process.env 和显式 env。
12
+
13
+ test('non-Windows platforms get no overlay at all', () => {
14
+ assert.deepEqual(windowsSystemEnv('linux', {}), {})
15
+ assert.deepEqual(windowsSystemEnv('darwin', {}), {})
16
+ })
17
+
18
+ test('a stripped environment gets the system variables back', () => {
19
+ const overlay = windowsSystemEnv('win32', {})
20
+ assert.equal(overlay.SystemDrive, 'C:')
21
+ assert.equal(overlay.SystemRoot, 'C:/Windows')
22
+ assert.equal(overlay.windir, 'C:/Windows')
23
+ assert.equal(overlay.PATH, 'C:/Windows/system32')
24
+ })
25
+
26
+ test('existing values are never overwritten', () => {
27
+ const env = { SystemDrive: 'D:', SystemRoot: 'D:/Win', windir: 'D:/Win', PATH: 'D:/bin' }
28
+ assert.deepEqual(windowsSystemEnv('win32', env), {})
29
+ })
30
+
31
+ test('HOMEDRIVE and a Windows-style windir are honoured', () => {
32
+ const overlay = windowsSystemEnv('win32', { HOMEDRIVE: 'E:', WINDIR: 'E:\\Win' })
33
+ assert.equal(overlay.SystemDrive, 'E:')
34
+ assert.equal(overlay.SystemRoot, 'E:/Win')
35
+ assert.equal(overlay.windir, undefined, 'WINDIR already exists; adding a second spelling is noise')
36
+ })
37
+
38
+ test('a partial environment only gets the missing keys', () => {
39
+ const overlay = windowsSystemEnv('win32', { SystemDrive: 'C:' })
40
+ assert.equal(overlay.SystemDrive, undefined)
41
+ assert.equal(overlay.SystemRoot, 'C:/Windows')
42
+ })
43
+
44
+ test('every child-process site seeds the overlay before the inherited environment', () => {
45
+ // N7: the local embedding worker is the third spawn site and the one that loads
46
+ // native libraries (onnxruntime/DirectML, tokenizers), so it must be listed here —
47
+ // "both sites" is exactly how it was missed the first time.
48
+ for (const file of ['lib/engine.js', 'lib/memu.js']) {
49
+ const text = fs.readFileSync(new URL('../' + file, import.meta.url), 'utf8')
50
+ assert.match(text, /\.\.\.windowsSystemEnv\(\)/, file + ' must seed the child environment')
51
+ const overlayAt = text.indexOf('...windowsSystemEnv()')
52
+ const inheritedAt = text.indexOf('...process.env', overlayAt)
53
+ assert.ok(inheritedAt > overlayAt, file + ' must let the host environment win over the defaults')
54
+ }
55
+ const worker = fs.readFileSync(new URL('../lib/local-embedding-manager.js', import.meta.url), 'utf8')
56
+ const overlayAt = worker.indexOf('...windowsSystemEnv(')
57
+ const inheritedAt = worker.indexOf('...inherited', overlayAt)
58
+ assert.ok(overlayAt > 0, 'lib/local-embedding-manager.js must seed the child environment')
59
+ assert.ok(inheritedAt > overlayAt, 'the overlay must come first so a real host value wins')
60
+ })
61
+
62
+ test('the worker child gets the system variables back and keeps nothing else', () => {
63
+ const env = childEnvironment(
64
+ { ELECTRON_RUN_AS_NODE: '1', DSH_MEMU_EMBED_TOKEN: 'tok' },
65
+ { platform: 'win32', env: { SystemDrive: 'D:', PATH: 'D:/bin', HTTP_PROXY: 'http://corp:8080', OPENAI_API_KEY: 'sk-x' } },
66
+ )
67
+ assert.equal(env.SystemDrive, 'D:', 'an existing value is never overwritten')
68
+ assert.equal(env.SystemRoot, 'D:/Windows', 'the missing root is rebuilt from the drive the host gave')
69
+ assert.equal(env.windir, 'D:/Windows')
70
+ assert.equal(env.PATH, 'D:/bin', 'the inherited PATH wins over the system32 default')
71
+ assert.equal(env.ELECTRON_RUN_AS_NODE, '1')
72
+ assert.equal(env.DSH_MEMU_EMBED_TOKEN, 'tok')
73
+ assert.equal(env.HTTP_PROXY, undefined, 'an inherited proxy would reroute the loopback call')
74
+ assert.equal(env.OPENAI_API_KEY, undefined, 'the worker must never hold a cloud credential')
75
+ })
76
+
77
+ test('a stripped worker environment is still complete enough to load a native library', () => {
78
+ const env = childEnvironment({}, { platform: 'win32', env: {} })
79
+ assert.equal(env.SystemDrive, 'C:')
80
+ assert.equal(env.SystemRoot, 'C:/Windows')
81
+ assert.equal(env.windir, 'C:/Windows')
82
+ assert.equal(env.PATH, 'C:/Windows/system32')
83
+ })
84
+
85
+ test('a stripped worker environment gets the directory the DLLs are resolved from', () => {
86
+ const env = childEnvironment({}, { platform: 'win32', env: { HOMEDRIVE: 'E:' } })
87
+ assert.equal(env.SystemDrive, 'E:', 'the drive comes from HOMEDRIVE when SystemDrive is gone')
88
+ assert.equal(env.SystemRoot, 'E:/Windows')
89
+ })