@coralai/sps-cli 0.89.21 → 0.90.1

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 (154) hide show
  1. package/assembly/base.yml +0 -7
  2. package/dist/commands/agentCommand.d.ts.map +1 -1
  3. package/dist/commands/agentCommand.js +2 -1
  4. package/dist/commands/agentCommand.js.map +1 -1
  5. package/dist/commands/cardDashboard.js +1 -1
  6. package/dist/commands/cardDashboard.js.map +1 -1
  7. package/dist/commands/cardMarkComplete.d.ts +24 -0
  8. package/dist/commands/cardMarkComplete.d.ts.map +1 -1
  9. package/dist/commands/cardMarkComplete.js +1 -1
  10. package/dist/commands/cardMarkComplete.js.map +1 -1
  11. package/dist/commands/cardMarkStarted.d.ts +23 -0
  12. package/dist/commands/cardMarkStarted.d.ts.map +1 -1
  13. package/dist/commands/cardMarkStarted.js +1 -1
  14. package/dist/commands/cardMarkStarted.js.map +1 -1
  15. package/dist/commands/hookCommand.js +1 -1
  16. package/dist/commands/hookCommand.js.map +1 -1
  17. package/dist/commands/memoryCommand.d.ts.map +1 -1
  18. package/dist/commands/memoryCommand.js +45 -34
  19. package/dist/commands/memoryCommand.js.map +1 -1
  20. package/dist/commands/pipelineTick.js +1 -1
  21. package/dist/commands/pipelineTick.js.map +1 -1
  22. package/dist/commands/qaTick.js +1 -1
  23. package/dist/commands/qaTick.js.map +1 -1
  24. package/dist/commands/tick.d.ts.map +1 -1
  25. package/dist/commands/tick.js +3 -2
  26. package/dist/commands/tick.js.map +1 -1
  27. package/dist/commands/workerLaunch.js +1 -1
  28. package/dist/commands/workerLaunch.js.map +1 -1
  29. package/dist/console/index.js +3 -3
  30. package/dist/console/index.js.map +1 -1
  31. package/dist/console/routes/chat.d.ts.map +1 -1
  32. package/dist/console/routes/chat.js +1 -1
  33. package/dist/console/routes/chat.js.map +1 -1
  34. package/dist/console/routes/help.js +1 -1
  35. package/dist/console/routes/help.js.map +1 -1
  36. package/dist/console/routes/projectConfig.js +1 -1
  37. package/dist/console/routes/projectConfig.js.map +1 -1
  38. package/dist/core/agents/ClaudeSdkBackend.d.ts +9 -0
  39. package/dist/core/agents/ClaudeSdkBackend.d.ts.map +1 -1
  40. package/dist/core/agents/ClaudeSdkBackend.js +5 -0
  41. package/dist/core/agents/ClaudeSdkBackend.js.map +1 -1
  42. package/dist/core/memory2/capture.d.ts +15 -12
  43. package/dist/core/memory2/capture.d.ts.map +1 -1
  44. package/dist/core/memory2/capture.js +32 -22
  45. package/dist/core/memory2/capture.js.map +1 -1
  46. package/dist/core/memory2/config.d.ts +3 -7
  47. package/dist/core/memory2/config.d.ts.map +1 -1
  48. package/dist/core/memory2/config.js +3 -13
  49. package/dist/core/memory2/config.js.map +1 -1
  50. package/dist/core/memory2/digest.d.ts +20 -14
  51. package/dist/core/memory2/digest.d.ts.map +1 -1
  52. package/dist/core/memory2/digest.js +15 -44
  53. package/dist/core/memory2/digest.js.map +1 -1
  54. package/dist/core/memory2/fakeStore.d.ts +26 -0
  55. package/dist/core/memory2/fakeStore.d.ts.map +1 -0
  56. package/dist/core/memory2/fakeStore.js +36 -0
  57. package/dist/core/memory2/fakeStore.js.map +1 -0
  58. package/dist/core/memory2/inject.d.ts +21 -2
  59. package/dist/core/memory2/inject.d.ts.map +1 -1
  60. package/dist/core/memory2/inject.js +4 -18
  61. package/dist/core/memory2/inject.js.map +1 -1
  62. package/dist/core/memory2/types.d.ts +8 -47
  63. package/dist/core/memory2/types.d.ts.map +1 -1
  64. package/dist/core/memory2/types.js +10 -10
  65. package/dist/core/memory2/types.js.map +1 -1
  66. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  67. package/dist/engines/MonitorEngine.js +1 -1
  68. package/dist/engines/MonitorEngine.js.map +1 -1
  69. package/dist/engines/StageEngine.d.ts.map +1 -1
  70. package/dist/engines/StageEngine.js +4 -2
  71. package/dist/engines/StageEngine.js.map +1 -1
  72. package/dist/main.js +1 -1
  73. package/dist/main.js.map +1 -1
  74. package/dist/manager/worker-manager-impl.d.ts +1 -1
  75. package/dist/manager/worker-manager-impl.d.ts.map +1 -1
  76. package/dist/manager/worker-manager-impl.js +12 -10
  77. package/dist/manager/worker-manager-impl.js.map +1 -1
  78. package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
  79. package/dist/providers/mcp/spsMcpServer.js +124 -116
  80. package/dist/providers/mcp/spsMcpServer.js.map +1 -1
  81. package/dist/providers/media/mediaProviders.js +1 -1
  82. package/dist/providers/media/mediaProviders.js.map +1 -1
  83. package/dist/seams/agents-builtin/index.d.ts.map +1 -1
  84. package/dist/seams/agents-builtin/index.js +66 -51
  85. package/dist/seams/agents-builtin/index.js.map +1 -1
  86. package/dist/seams/memory/index.d.ts +91 -28
  87. package/dist/seams/memory/index.d.ts.map +1 -1
  88. package/dist/seams/memory/index.js +113 -9
  89. package/dist/seams/memory/index.js.map +1 -1
  90. package/dist/seams/memory/optional.d.ts +43 -0
  91. package/dist/seams/memory/optional.d.ts.map +1 -0
  92. package/dist/seams/memory/optional.js +32 -0
  93. package/dist/seams/memory/optional.js.map +1 -0
  94. package/dist/services/MemoryService.d.ts +1 -2
  95. package/dist/services/MemoryService.d.ts.map +1 -1
  96. package/dist/services/MemoryService.js +67 -25
  97. package/dist/services/MemoryService.js.map +1 -1
  98. package/dist/services/SystemService.d.ts +6 -0
  99. package/dist/services/SystemService.d.ts.map +1 -1
  100. package/dist/services/SystemService.js +6 -0
  101. package/dist/services/SystemService.js.map +1 -1
  102. package/dist/services/container.d.ts.map +1 -1
  103. package/dist/services/container.js +1 -0
  104. package/dist/services/container.js.map +1 -1
  105. package/dist/services/executors.d.ts.map +1 -1
  106. package/dist/services/executors.js +1 -1
  107. package/dist/services/executors.js.map +1 -1
  108. package/dist/services/promptPreview.d.ts.map +1 -1
  109. package/dist/services/promptPreview.js +2 -1
  110. package/dist/services/promptPreview.js.map +1 -1
  111. package/docs/help/02-commands.md +2 -2
  112. package/docs/help/05-api.md +2 -2
  113. package/package.json +2 -1
  114. package/dist/core/memory2/claudeMdRule.d.ts +0 -7
  115. package/dist/core/memory2/claudeMdRule.d.ts.map +0 -1
  116. package/dist/core/memory2/claudeMdRule.js +0 -73
  117. package/dist/core/memory2/claudeMdRule.js.map +0 -1
  118. package/dist/core/memory2/ftsIndex.d.ts +0 -8
  119. package/dist/core/memory2/ftsIndex.d.ts.map +0 -1
  120. package/dist/core/memory2/ftsIndex.js +0 -172
  121. package/dist/core/memory2/ftsIndex.js.map +0 -1
  122. package/dist/core/memory2/gc.d.ts +0 -9
  123. package/dist/core/memory2/gc.d.ts.map +0 -1
  124. package/dist/core/memory2/gc.js +0 -45
  125. package/dist/core/memory2/gc.js.map +0 -1
  126. package/dist/core/memory2/lock.d.ts +0 -12
  127. package/dist/core/memory2/lock.d.ts.map +0 -1
  128. package/dist/core/memory2/lock.js +0 -61
  129. package/dist/core/memory2/lock.js.map +0 -1
  130. package/dist/core/memory2/migrate.d.ts +0 -12
  131. package/dist/core/memory2/migrate.d.ts.map +0 -1
  132. package/dist/core/memory2/migrate.js +0 -119
  133. package/dist/core/memory2/migrate.js.map +0 -1
  134. package/dist/core/memory2/recallResult.d.ts +0 -19
  135. package/dist/core/memory2/recallResult.d.ts.map +0 -1
  136. package/dist/core/memory2/recallResult.js +0 -33
  137. package/dist/core/memory2/recallResult.js.map +0 -1
  138. package/dist/core/memory2/redact.d.ts +0 -21
  139. package/dist/core/memory2/redact.d.ts.map +0 -1
  140. package/dist/core/memory2/redact.js +0 -116
  141. package/dist/core/memory2/redact.js.map +0 -1
  142. package/dist/core/memory2/retrieve.d.ts +0 -29
  143. package/dist/core/memory2/retrieve.d.ts.map +0 -1
  144. package/dist/core/memory2/retrieve.js +0 -79
  145. package/dist/core/memory2/retrieve.js.map +0 -1
  146. package/dist/core/memory2/store.d.ts +0 -35
  147. package/dist/core/memory2/store.d.ts.map +0 -1
  148. package/dist/core/memory2/store.js +0 -240
  149. package/dist/core/memory2/store.js.map +0 -1
  150. package/dist/seams/memory-local/client.js +0 -135
  151. package/dist/seams/memory-local/index.d.ts +0 -34
  152. package/dist/seams/memory-local/index.d.ts.map +0 -1
  153. package/dist/seams/memory-local/index.js +0 -58
  154. package/dist/seams/memory-local/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"recallResult.js","sourceRoot":"","sources":["../../../src/core/memory2/recallResult.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAgBvC,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,KAAa,EACb,OAA4C,EAAE;IAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,EAAE,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,OAAgB;QACxB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QACpB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACnC,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;QACpB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ;QAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;KACnB,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1,21 +0,0 @@
1
- /** 测试用:清空追加规则缓存(改了 SPS_MEMORY_ROOT/redact.rules 后调用)。 */
2
- export declare function resetRedactCache(): void;
3
- export interface RedactResult {
4
- title: string;
5
- body: string;
6
- /** true=命中高危,整条应丢弃(title/body 不可用)。 */
7
- dropped: boolean;
8
- /** 命中的规则 label(去重),供调 debug 日志——不含原文。 */
9
- reasons: string[];
10
- }
11
- /**
12
- * 对一条记忆(title+body 合起来判)做脱敏。命中 drop 规则→dropped=true;否则对命中 mask 规则的片段打码。
13
- * SPS_MEMORY_REDACT=off 时原样返回。
14
- */
15
- export declare function redactEntry(title: string, body: string): RedactResult;
16
- /** 写入被拒(命中高危):调用方据此提示"已丢弃"。 */
17
- export declare class RedactedEntryDropped extends Error {
18
- readonly reasons: string[];
19
- constructor(reasons: string[]);
20
- }
21
- //# sourceMappingURL=redact.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/redact.ts"],"names":[],"mappings":"AAuEA,yDAAyD;AACzD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CA+BrE;AAED,+BAA+B;AAC/B,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE;CAK9B"}
@@ -1,116 +0,0 @@
1
- /**
2
- * @module core/memory2/redact
3
- * @description 写入前敏感信息过滤(设计 §5.1,**默认必开**)。自动捕获 + agent 主动 memory_save
4
- * 都经此:命中密钥/凭据/私有路径 → 打码 [REDACTED];命中高危(私钥/AWS key)→ 整条丢弃。
5
- * 规则可经 ~/.coral/memory/redact.rules 追加;SPS_MEMORY_REDACT=off 关(不建议)。
6
- * 纯正则、零 LLM——不依赖模型自觉。
7
- * @layer core
8
- * @boundedContext memory
9
- */
10
- import { existsSync, readFileSync } from 'node:fs';
11
- import { join } from 'node:path';
12
- import { memoryRoot } from './store.js';
13
- const MASK = '[REDACTED]';
14
- /** 高危:命中即丢弃整条(不打码,连带上下文一起弃)。 */
15
- const DROP_RULES = [
16
- { re: /-----BEGIN (?:[A-Z ]+ )?PRIVATE KEY-----/g, kind: 'drop', label: 'private-key' },
17
- { re: /\bAKIA[0-9A-Z]{16}\b/g, kind: 'drop', label: 'aws-access-key' },
18
- ];
19
- /** 打码:命中片段替换为 [REDACTED]。 */
20
- const MASK_RULES = [
21
- // 密钥/令牌前缀
22
- { re: /\bsk-[A-Za-z0-9_-]{16,}\b/g, kind: 'mask', label: 'sk-token' },
23
- { re: /\bgh[oprsu]_[A-Za-z0-9]{16,}\b/g, kind: 'mask', label: 'github-token' },
24
- { re: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g, kind: 'mask', label: 'slack-token' },
25
- { re: /\bBearer\s+[A-Za-z0-9._~+/-]{12,}=*/g, kind: 'mask', label: 'bearer' },
26
- // 凭据 URL:scheme://user:pass@host
27
- { re: /\b[a-z][a-z0-9+.-]*:\/\/[^\s:@/]+:[^\s:@/]+@[^\s/]+/g, kind: 'mask', label: 'credential-url' },
28
- // .env 式 KEY=value(仅敏感键名)
29
- { re: /\b[A-Z0-9_]*(?:SECRET|TOKEN|API[_-]?KEY|PASSWORD|PASSWD|PASS|DSN|PRIVATE[_-]?KEY|ACCESS[_-]?KEY)[A-Z0-9_]*\s*[=:]\s*['"]?[^\s'"]+/gi, kind: 'mask', label: 'env-secret' },
30
- // 私有绝对路径
31
- { re: /\/Users\/[^/\s'"]+/g, kind: 'mask', label: 'macos-home' },
32
- { re: /\/home\/[^/\s'"]+/g, kind: 'mask', label: 'linux-home' },
33
- // 内网 IP(RFC1918 + loopback)
34
- { re: /\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/g, kind: 'mask', label: 'internal-ip' },
35
- ];
36
- let extraCache = null;
37
- /**
38
- * 读 ~/.coral/memory/redact.rules 的追加规则。每行一条正则,`drop:` 前缀=高危丢弃;
39
- * `#` 开头=注释。非法正则跳过。惰性加载 + 缓存(SPS_MEMORY_ROOT 变了会失效由测试用 resetRedactCache 处理)。
40
- */
41
- function loadExtraRules() {
42
- if (extraCache)
43
- return extraCache;
44
- extraCache = [];
45
- const p = join(memoryRoot(), 'redact.rules');
46
- if (!existsSync(p))
47
- return extraCache;
48
- for (const raw of readFileSync(p, 'utf-8').split(/\r?\n/)) {
49
- const line = raw.trim();
50
- if (!line || line.startsWith('#'))
51
- continue;
52
- const drop = line.startsWith('drop:');
53
- const src = drop ? line.slice(5).trim() : line;
54
- try {
55
- extraCache.push({ re: new RegExp(src, 'g'), kind: drop ? 'drop' : 'mask', label: `custom:${src.slice(0, 24)}` });
56
- }
57
- catch {
58
- /* 非法正则跳过 */
59
- }
60
- }
61
- return extraCache;
62
- }
63
- /** 测试用:清空追加规则缓存(改了 SPS_MEMORY_ROOT/redact.rules 后调用)。 */
64
- export function resetRedactCache() {
65
- extraCache = null;
66
- }
67
- function isOff() {
68
- return (process.env.SPS_MEMORY_REDACT ?? '').toLowerCase() === 'off';
69
- }
70
- /**
71
- * 对一条记忆(title+body 合起来判)做脱敏。命中 drop 规则→dropped=true;否则对命中 mask 规则的片段打码。
72
- * SPS_MEMORY_REDACT=off 时原样返回。
73
- */
74
- export function redactEntry(title, body) {
75
- if (isOff())
76
- return { title, body, dropped: false, reasons: [] };
77
- const rules = [...DROP_RULES, ...MASK_RULES, ...loadExtraRules()];
78
- const reasons = new Set();
79
- const combined = `${title}\n${body}`;
80
- // 先判高危丢弃(任一 drop 规则命中整条 → 弃)。
81
- for (const r of rules) {
82
- if (r.kind !== 'drop')
83
- continue;
84
- r.re.lastIndex = 0;
85
- if (r.re.test(combined))
86
- reasons.add(r.label);
87
- }
88
- if (reasons.size > 0) {
89
- return { title: '', body: '', dropped: true, reasons: [...reasons] };
90
- }
91
- // 再逐条 mask。
92
- let t = title;
93
- let b = body;
94
- for (const r of rules) {
95
- if (r.kind !== 'mask')
96
- continue;
97
- r.re.lastIndex = 0;
98
- if (r.re.test(t) || r.re.test(b)) {
99
- reasons.add(r.label);
100
- r.re.lastIndex = 0;
101
- t = t.replace(r.re, MASK);
102
- b = b.replace(r.re, MASK);
103
- }
104
- }
105
- return { title: t, body: b, dropped: false, reasons: [...reasons] };
106
- }
107
- /** 写入被拒(命中高危):调用方据此提示"已丢弃"。 */
108
- export class RedactedEntryDropped extends Error {
109
- reasons;
110
- constructor(reasons) {
111
- super(`记忆写入被拒:命中敏感信息(${reasons.join(', ')})`);
112
- this.name = 'RedactedEntryDropped';
113
- this.reasons = reasons;
114
- }
115
- }
116
- //# sourceMappingURL=redact.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/core/memory2/redact.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- /**
2
- * @module core/memory2/retrieve
3
- * @description 纯内存相关性检索(修旧系统 C1 的零相关性)。BM25 + tag 过滤 + salience 加权。
4
- * 零 DB、零依赖,任何 Node 可跑(设计 §4);store 大且 node:sqlite 可用时,recall() 自动
5
- * 切 FTS5 预筛(见 ftsIndex.ts),精排仍用本文件的 searchEntries —— 结果一致、只更快。
6
- * 中文按单字分词 + 拉丁按词——小规模够用。
7
- * @layer core
8
- * @boundedContext memory
9
- */
10
- import type { MemoryEntry, ScopeRef } from './types.js';
11
- export interface SearchHit {
12
- entry: MemoryEntry;
13
- score: number;
14
- }
15
- export interface SearchOpts {
16
- tags?: string[];
17
- limit?: number;
18
- }
19
- /** 分词:拉丁词 + 数字 + 单个 CJK 字。 */
20
- export declare function tokenize(s: string): string[];
21
- /** 对给定条目集按 query 做 BM25 + tag 过滤 + salience 加权排序。纯函数(便于测试/组合)。 */
22
- export declare function searchEntries(entries: MemoryEntry[], query: string, opts?: SearchOpts): SearchHit[];
23
- /**
24
- * 跨多个作用域检索(如 worker = project + global)。
25
- * 门控:store 大且 node:sqlite 可用 → 走 FTS5 预筛(设计 §4 第二级);否则/异常 → 纯内存全扫。
26
- * 两条路都用 searchEntries 精排,结果一致。
27
- */
28
- export declare function recall(refs: ScopeRef[], query: string, opts?: SearchOpts): SearchHit[];
29
- //# sourceMappingURL=retrieve.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrieve.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/retrieve.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8BAA8B;AAC9B,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5C;AAKD,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,SAAS,EAAE,CA6CvG;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,SAAS,EAAE,CAK1F"}
@@ -1,79 +0,0 @@
1
- /**
2
- * @module core/memory2/retrieve
3
- * @description 纯内存相关性检索(修旧系统 C1 的零相关性)。BM25 + tag 过滤 + salience 加权。
4
- * 零 DB、零依赖,任何 Node 可跑(设计 §4);store 大且 node:sqlite 可用时,recall() 自动
5
- * 切 FTS5 预筛(见 ftsIndex.ts),精排仍用本文件的 searchEntries —— 结果一致、只更快。
6
- * 中文按单字分词 + 拉丁按词——小规模够用。
7
- * @layer core
8
- * @boundedContext memory
9
- */
10
- import { ftsRecall } from './ftsIndex.js';
11
- import { listEntries } from './store.js';
12
- /** 分词:拉丁词 + 数字 + 单个 CJK 字。 */
13
- export function tokenize(s) {
14
- const lower = s.toLowerCase();
15
- const latin = lower.match(/[a-z0-9]+/g) ?? [];
16
- const cjk = lower.match(/[一-鿿]/g) ?? [];
17
- return [...latin, ...cjk];
18
- }
19
- const K1 = 1.5;
20
- const B = 0.75;
21
- /** 对给定条目集按 query 做 BM25 + tag 过滤 + salience 加权排序。纯函数(便于测试/组合)。 */
22
- export function searchEntries(entries, query, opts = {}) {
23
- const limit = opts.limit ?? 6;
24
- let cand = entries;
25
- if (opts.tags?.length) {
26
- const want = new Set(opts.tags.map((t) => t.toLowerCase()));
27
- cand = cand.filter((e) => e.tags.some((t) => want.has(t.toLowerCase())));
28
- }
29
- const qTokens = tokenize(query);
30
- if (qTokens.length === 0) {
31
- // 无查询词 → 按 salience 再新鲜度
32
- return cand
33
- .slice()
34
- .sort((a, b) => b.salience - a.salience || b.updated.localeCompare(a.updated))
35
- .slice(0, limit)
36
- .map((entry) => ({ entry, score: 0 }));
37
- }
38
- const N = cand.length;
39
- const docs = cand.map((e) => tokenize(`${e.title} ${e.tags.join(' ')} ${e.body}`));
40
- const avgdl = N ? docs.reduce((s, d) => s + d.length, 0) / N : 0;
41
- const df = new Map();
42
- for (const d of docs)
43
- for (const t of new Set(d))
44
- df.set(t, (df.get(t) ?? 0) + 1);
45
- const hits = cand.map((entry, i) => {
46
- const d = docs[i];
47
- const dl = d.length;
48
- const tf = new Map();
49
- for (const t of d)
50
- tf.set(t, (tf.get(t) ?? 0) + 1);
51
- let bm = 0;
52
- for (const t of qTokens) {
53
- const f = tf.get(t) ?? 0;
54
- if (!f)
55
- continue;
56
- const n = df.get(t) ?? 0;
57
- const idf = Math.log(1 + (N - n + 0.5) / (n + 0.5));
58
- bm += idf * ((f * (K1 + 1)) / (f + K1 * (1 - B + (B * dl) / (avgdl || 1))));
59
- }
60
- return { entry, score: bm * (0.8 + 0.1 * entry.salience) };
61
- });
62
- return hits
63
- .filter((h) => h.score > 0)
64
- .sort((a, b) => b.score - a.score)
65
- .slice(0, limit);
66
- }
67
- /**
68
- * 跨多个作用域检索(如 worker = project + global)。
69
- * 门控:store 大且 node:sqlite 可用 → 走 FTS5 预筛(设计 §4 第二级);否则/异常 → 纯内存全扫。
70
- * 两条路都用 searchEntries 精排,结果一致。
71
- */
72
- export function recall(refs, query, opts = {}) {
73
- const viaFts = ftsRecall(refs, query, opts); // null = 未启用/不可用 → 回退内存
74
- if (viaFts)
75
- return viaFts;
76
- const all = refs.flatMap((r) => listEntries(r));
77
- return searchEntries(all, query, opts);
78
- }
79
- //# sourceMappingURL=retrieve.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../../src/core/memory2/retrieve.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- import { type MemoryEntry, type SaveInput, type ScopeRef } from './types.js';
2
- /** 记忆根目录。`SPS_MEMORY_ROOT` 可覆盖(测试用),否则 ~/.coral/memory。 */
3
- export declare function memoryRoot(): string;
4
- /** 某作用域的存储目录。project/agent 缺参数会抛(调用方保证)。 */
5
- export declare function scopeDir(ref: ScopeRef): string;
6
- /** 生成裸 id:m-<10 hex>。 */
7
- export declare function newMemoryId(): string;
8
- /**
9
- * 保存:无 id → 新建(分配 id + created);有 id → 更新(保 created,刷 updated)。原子落盘。
10
- * 写入前必过脱敏(§5.1,默认开):打码敏感片段;命中高危 → 抛 RedactedEntryDropped(调用方提示丢弃)。
11
- */
12
- export declare function saveEntry(ref: ScopeRef, input: SaveInput): MemoryEntry;
13
- /** 读一条;不存在 / 已 tombstone 返回 null。 */
14
- export declare function readEntry(ref: ScopeRef, id: string): MemoryEntry | null;
15
- /**
16
- * uses+1(agent 真去 memory_read 全文 = 真被用)。原子写回;不刷 updated(uses 不算"内容变更")。
17
- * best-effort:读不到/写不了都静默返回,绝不阻断 memory_read。
18
- */
19
- export declare function bumpUses(ref: ScopeRef, id: string): void;
20
- /** 列该作用域全部 entry(跳过 tombstone;坏文件跳过)。 */
21
- export declare function listEntries(ref: ScopeRef): MemoryEntry[];
22
- /** 软删:`<id>.md` → `<id>.md.deleted`(tombstone);list/reindex 不再见到。返回是否删了。 */
23
- export declare function deleteEntry(ref: ScopeRef, id: string): boolean;
24
- /** 枚举 store 里所有存在的作用域(global + 每个 project + 每个 agent),供跨搜/gc 遍历。 */
25
- export declare function listAllScopes(): ScopeRef[];
26
- /**
27
- * 提升/搬移一条记忆到另一作用域(设计 §2,仅手动)。读源 → 以新 id 写入目标(经 saveEntry 过脱敏,
28
- * 命中高危会抛 RedactedEntryDropped)→ move 时软删源。返回落到目标的新 entry;源不存在返回 null。
29
- */
30
- export declare function promoteEntry(from: ScopeRef, id: string, to: ScopeRef, opts?: {
31
- move?: boolean;
32
- }): MemoryEntry | null;
33
- /** 硬删所有 tombstone(gc 用)。返回清理数。 */
34
- export declare function purgeTombstones(ref: ScopeRef): number;
35
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/store.ts"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAEpB,2DAA2D;AAC3D,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,4CAA4C;AAC5C,wBAAgB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAY9C;AAUD,yBAAyB;AACzB,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAqED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW,CAqBtE;AAED,qCAAqC;AACrC,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQvE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAQxD;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE,CAcxD;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAK9D;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,QAAQ,EAAE,CAa1C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,WAAW,GAAG,IAAI,CASxH;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAWrD"}
@@ -1,240 +0,0 @@
1
- /**
2
- * @module core/memory2/store
3
- * @description 本地记忆 v2 存储核心:entry 的 CRUD + 原子落盘 + id 分配 + 作用域路径。
4
- * markdown 是唯一真源;frontmatter 走健壮的 flatfile/frontmatter(修旧系统 C4)。
5
- * 无冲突并发:一条一 `<id>.md`(randomUUID)+ temp 写 + rename(见 §6)。
6
- * 删除 = 软 tombstone(`<id>.md.deleted`),list/reindex 只认 `.md`;gc 再硬删。
7
- * @layer core
8
- * @boundedContext memory
9
- */
10
- import { randomUUID } from 'node:crypto';
11
- import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
12
- import { homedir } from 'node:os';
13
- import { join, resolve } from 'node:path';
14
- import { joinFrontmatter, parseFrontmatter } from '../flatfile/frontmatter.js';
15
- import { RedactedEntryDropped, redactEntry } from './redact.js';
16
- import { MEMORY_CATEGORIES, MEMORY_SOURCES, } from './types.js';
17
- /** 记忆根目录。`SPS_MEMORY_ROOT` 可覆盖(测试用),否则 ~/.coral/memory。 */
18
- export function memoryRoot() {
19
- return process.env.SPS_MEMORY_ROOT || resolve(homedir(), '.coral', 'memory');
20
- }
21
- /** 某作用域的存储目录。project/agent 缺参数会抛(调用方保证)。 */
22
- export function scopeDir(ref) {
23
- const root = memoryRoot();
24
- switch (ref.scope) {
25
- case 'global':
26
- return join(root, 'global');
27
- case 'project':
28
- if (!ref.project)
29
- throw new Error('project scope requires project name');
30
- return join(root, 'projects', ref.project);
31
- case 'agent':
32
- if (!ref.agentId)
33
- throw new Error('agent scope requires agentId');
34
- return join(root, 'agents', ref.agentId);
35
- }
36
- }
37
- function entriesDir(ref) {
38
- return join(scopeDir(ref), 'entries');
39
- }
40
- function entryPath(ref, id) {
41
- return join(entriesDir(ref), `${id}.md`);
42
- }
43
- /** 生成裸 id:m-<10 hex>。 */
44
- export function newMemoryId() {
45
- return `m-${randomUUID().replace(/-/g, '').slice(0, 10)}`;
46
- }
47
- /** 原子写文件:写 tmp 再 rename(POSIX 原子);跨写者不冲突(不同 id 不同文件)。 */
48
- function atomicWrite(path, content) {
49
- mkdirSync(join(path, '..'), { recursive: true });
50
- const tmp = `${path}.tmp-${randomUUID().slice(0, 8)}`;
51
- writeFileSync(tmp, content);
52
- renameSync(tmp, path);
53
- }
54
- function coerceCategory(v) {
55
- return MEMORY_CATEGORIES.includes(v) ? v : 'note';
56
- }
57
- function coerceSource(v) {
58
- return MEMORY_SOURCES.includes(v) ? v : 'agent';
59
- }
60
- function coerceTags(v) {
61
- if (Array.isArray(v))
62
- return v.map((t) => String(t)).filter(Boolean);
63
- if (typeof v === 'string' && v.trim())
64
- return v.split(',').map((t) => t.trim()).filter(Boolean);
65
- return [];
66
- }
67
- function coerceSalience(v) {
68
- const n = Number(v);
69
- return Number.isFinite(n) ? Math.min(5, Math.max(1, Math.round(n))) : 3;
70
- }
71
- /** uses 计数:非负整数,缺省 0(旧条目无此字段)。 */
72
- function coerceUses(v) {
73
- const n = Number(v);
74
- return Number.isFinite(n) && n > 0 ? Math.round(n) : 0;
75
- }
76
- /** 序列化 entry → markdown(frontmatter + 正文)。 */
77
- function serialize(e) {
78
- const data = {
79
- id: e.id,
80
- title: e.title,
81
- scope: e.scope,
82
- category: e.category,
83
- tags: e.tags,
84
- salience: e.salience,
85
- uses: e.uses,
86
- source: e.source,
87
- ...(e.project ? { project: e.project } : {}),
88
- created: e.created,
89
- updated: e.updated,
90
- };
91
- return joinFrontmatter(data, e.body.endsWith('\n') ? e.body : `${e.body}\n`);
92
- }
93
- /** 反序列化 markdown → entry(缺字段给默认;坏 frontmatter 不阻塞)。 */
94
- function deserialize(scope, id, md) {
95
- const { data, body } = parseFrontmatter(md);
96
- return {
97
- id: typeof data.id === 'string' ? data.id : id,
98
- title: typeof data.title === 'string' ? data.title : id,
99
- scope: data.scope ?? scope,
100
- category: coerceCategory(data.category),
101
- tags: coerceTags(data.tags),
102
- salience: coerceSalience(data.salience),
103
- uses: coerceUses(data.uses),
104
- source: coerceSource(data.source),
105
- project: typeof data.project === 'string' ? data.project : undefined,
106
- created: typeof data.created === 'string' ? data.created : new Date().toISOString(),
107
- updated: typeof data.updated === 'string' ? data.updated : new Date().toISOString(),
108
- body: body.trim(),
109
- };
110
- }
111
- /**
112
- * 保存:无 id → 新建(分配 id + created);有 id → 更新(保 created,刷 updated)。原子落盘。
113
- * 写入前必过脱敏(§5.1,默认开):打码敏感片段;命中高危 → 抛 RedactedEntryDropped(调用方提示丢弃)。
114
- */
115
- export function saveEntry(ref, input) {
116
- const now = new Date().toISOString();
117
- const red = redactEntry(input.title, input.body);
118
- if (red.dropped)
119
- throw new RedactedEntryDropped(red.reasons);
120
- const existing = input.id ? readEntry(ref, input.id) : null;
121
- const entry = {
122
- id: input.id ?? newMemoryId(),
123
- title: red.title,
124
- scope: ref.scope,
125
- category: input.category ?? existing?.category ?? 'note',
126
- tags: input.tags ?? existing?.tags ?? [],
127
- salience: input.salience ?? existing?.salience ?? 3,
128
- uses: existing?.uses ?? 0,
129
- source: input.source ?? existing?.source ?? 'agent',
130
- project: input.project ?? existing?.project ?? (ref.scope === 'project' ? ref.project : ref.scope === 'agent' ? ref.agentId : undefined),
131
- created: existing?.created ?? now,
132
- updated: now,
133
- body: red.body,
134
- };
135
- atomicWrite(entryPath(ref, entry.id), serialize(entry));
136
- return entry;
137
- }
138
- /** 读一条;不存在 / 已 tombstone 返回 null。 */
139
- export function readEntry(ref, id) {
140
- const p = entryPath(ref, id);
141
- if (!existsSync(p))
142
- return null;
143
- try {
144
- return deserialize(ref.scope, id, readFileSync(p, 'utf-8'));
145
- }
146
- catch {
147
- return null;
148
- }
149
- }
150
- /**
151
- * uses+1(agent 真去 memory_read 全文 = 真被用)。原子写回;不刷 updated(uses 不算"内容变更")。
152
- * best-effort:读不到/写不了都静默返回,绝不阻断 memory_read。
153
- */
154
- export function bumpUses(ref, id) {
155
- try {
156
- const e = readEntry(ref, id);
157
- if (!e)
158
- return;
159
- atomicWrite(entryPath(ref, id), serialize({ ...e, uses: e.uses + 1 }));
160
- }
161
- catch {
162
- /* best effort */
163
- }
164
- }
165
- /** 列该作用域全部 entry(跳过 tombstone;坏文件跳过)。 */
166
- export function listEntries(ref) {
167
- const dir = entriesDir(ref);
168
- if (!existsSync(dir))
169
- return [];
170
- const out = [];
171
- for (const name of readdirSync(dir)) {
172
- if (!name.endsWith('.md'))
173
- continue; // .md.deleted / .tmp-* 天然跳过
174
- const id = name.slice(0, -3);
175
- try {
176
- out.push(deserialize(ref.scope, id, readFileSync(join(dir, name), 'utf-8')));
177
- }
178
- catch {
179
- /* 坏文件跳过 */
180
- }
181
- }
182
- return out;
183
- }
184
- /** 软删:`<id>.md` → `<id>.md.deleted`(tombstone);list/reindex 不再见到。返回是否删了。 */
185
- export function deleteEntry(ref, id) {
186
- const p = entryPath(ref, id);
187
- if (!existsSync(p))
188
- return false;
189
- renameSync(p, `${p}.deleted`);
190
- return true;
191
- }
192
- /** 枚举 store 里所有存在的作用域(global + 每个 project + 每个 agent),供跨搜/gc 遍历。 */
193
- export function listAllScopes() {
194
- const root = memoryRoot();
195
- const refs = [];
196
- if (existsSync(join(root, 'global')))
197
- refs.push({ scope: 'global' });
198
- const projectsDir = join(root, 'projects');
199
- if (existsSync(projectsDir)) {
200
- for (const p of readdirSync(projectsDir))
201
- refs.push({ scope: 'project', project: p });
202
- }
203
- const agentsDir = join(root, 'agents');
204
- if (existsSync(agentsDir)) {
205
- for (const a of readdirSync(agentsDir))
206
- refs.push({ scope: 'agent', agentId: a });
207
- }
208
- return refs;
209
- }
210
- /**
211
- * 提升/搬移一条记忆到另一作用域(设计 §2,仅手动)。读源 → 以新 id 写入目标(经 saveEntry 过脱敏,
212
- * 命中高危会抛 RedactedEntryDropped)→ move 时软删源。返回落到目标的新 entry;源不存在返回 null。
213
- */
214
- export function promoteEntry(from, id, to, opts = {}) {
215
- const src = readEntry(from, id);
216
- if (!src)
217
- return null;
218
- const saved = saveEntry(to, {
219
- title: src.title, body: src.body, category: src.category, tags: src.tags,
220
- salience: src.salience, source: src.source,
221
- });
222
- if (opts.move)
223
- deleteEntry(from, id);
224
- return saved;
225
- }
226
- /** 硬删所有 tombstone(gc 用)。返回清理数。 */
227
- export function purgeTombstones(ref) {
228
- const dir = entriesDir(ref);
229
- if (!existsSync(dir))
230
- return 0;
231
- let n = 0;
232
- for (const name of readdirSync(dir)) {
233
- if (name.endsWith('.md.deleted')) {
234
- rmSync(join(dir, name));
235
- n++;
236
- }
237
- }
238
- return n;
239
- }
240
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/memory2/store.ts"],"names":[],"mappings":"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"}