@coralai/sps-cli 0.58.13 → 0.58.15
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 -14
- package/dist/commands/agentCommand.d.ts.map +1 -1
- package/dist/commands/agentCommand.js +29 -26
- package/dist/commands/agentCommand.js.map +1 -1
- package/dist/commands/memoryCommand.d.ts +2 -0
- package/dist/commands/memoryCommand.d.ts.map +1 -0
- package/dist/commands/memoryCommand.js +263 -0
- package/dist/commands/memoryCommand.js.map +1 -0
- package/dist/commands/projectInit.d.ts.map +1 -1
- package/dist/commands/projectInit.js +21 -0
- package/dist/commands/projectInit.js.map +1 -1
- package/dist/commands/tick.d.ts.map +1 -1
- package/dist/commands/tick.js +1 -19
- package/dist/commands/tick.js.map +1 -1
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +2 -0
- package/dist/console/index.js.map +1 -1
- package/dist/console/routes/chat.d.ts.map +1 -1
- package/dist/console/routes/chat.js +22 -23
- package/dist/console/routes/chat.js.map +1 -1
- package/dist/console/routes/memory.d.ts +11 -0
- package/dist/console/routes/memory.d.ts.map +1 -0
- package/dist/console/routes/memory.js +63 -0
- package/dist/console/routes/memory.js.map +1 -0
- package/dist/console/routes/system.d.ts.map +1 -1
- package/dist/console/routes/system.js +6 -3
- package/dist/console/routes/system.js.map +1 -1
- package/dist/console-assets/assets/index-DENsMsFy.css +10 -0
- package/dist/console-assets/assets/{index-BiGbp-FL.js → index-R6Y8wve3.js} +194 -194
- package/dist/console-assets/index.html +2 -2
- package/dist/core/agents/AcpBackend.d.ts +2 -0
- package/dist/core/agents/AcpBackend.d.ts.map +1 -1
- package/dist/core/agents/AcpBackend.js +5 -0
- package/dist/core/agents/AcpBackend.js.map +1 -1
- package/dist/core/agents/ClaudeSdkBackend.d.ts +0 -1
- package/dist/core/agents/ClaudeSdkBackend.d.ts.map +1 -1
- package/dist/core/agents/ClaudeSdkBackend.js +1 -1
- package/dist/core/agents/ClaudeSdkBackend.js.map +1 -1
- package/dist/core/agents/CodexAppServerBackend.d.ts +0 -1
- package/dist/core/agents/CodexAppServerBackend.d.ts.map +1 -1
- package/dist/core/agents/CodexAppServerBackend.js +1 -1
- package/dist/core/agents/CodexAppServerBackend.js.map +1 -1
- package/dist/core/agents/OpenAiAgentBackend.d.ts +0 -2
- package/dist/core/agents/OpenAiAgentBackend.d.ts.map +1 -1
- package/dist/core/agents/OpenAiAgentBackend.js +5 -4
- package/dist/core/agents/OpenAiAgentBackend.js.map +1 -1
- package/dist/core/agents/resolveBackend.d.ts +0 -1
- package/dist/core/agents/resolveBackend.d.ts.map +1 -1
- package/dist/core/agents/resolveBackend.js +3 -4
- package/dist/core/agents/resolveBackend.js.map +1 -1
- package/dist/core/codegraph/claudeMdRule.d.ts +7 -0
- package/dist/core/codegraph/claudeMdRule.d.ts.map +1 -0
- package/dist/core/codegraph/claudeMdRule.js +79 -0
- package/dist/core/codegraph/claudeMdRule.js.map +1 -0
- package/dist/core/memory2/capture.d.ts +33 -0
- package/dist/core/memory2/capture.d.ts.map +1 -0
- package/dist/core/memory2/capture.js +91 -0
- package/dist/core/memory2/capture.js.map +1 -0
- package/dist/core/memory2/claudeMdRule.d.ts +7 -0
- package/dist/core/memory2/claudeMdRule.d.ts.map +1 -0
- package/dist/core/memory2/claudeMdRule.js +65 -0
- package/dist/core/memory2/claudeMdRule.js.map +1 -0
- package/dist/core/memory2/config.d.ts +20 -0
- package/dist/core/memory2/config.d.ts.map +1 -0
- package/dist/core/memory2/config.js +26 -0
- package/dist/core/memory2/config.js.map +1 -0
- package/dist/core/memory2/digest.d.ts +16 -0
- package/dist/core/memory2/digest.d.ts.map +1 -0
- package/dist/core/memory2/digest.js +52 -0
- package/dist/core/memory2/digest.js.map +1 -0
- package/dist/core/memory2/gc.d.ts +9 -0
- package/dist/core/memory2/gc.d.ts.map +1 -0
- package/dist/core/memory2/gc.js +45 -0
- package/dist/core/memory2/gc.js.map +1 -0
- package/dist/core/memory2/inject.d.ts +16 -0
- package/dist/core/memory2/inject.d.ts.map +1 -0
- package/dist/core/memory2/inject.js +45 -0
- package/dist/core/memory2/inject.js.map +1 -0
- package/dist/core/memory2/lock.d.ts +7 -0
- package/dist/core/memory2/lock.d.ts.map +1 -0
- package/dist/core/memory2/lock.js +59 -0
- package/dist/core/memory2/lock.js.map +1 -0
- package/dist/core/memory2/migrate.d.ts +12 -0
- package/dist/core/memory2/migrate.d.ts.map +1 -0
- package/dist/core/memory2/migrate.js +119 -0
- package/dist/core/memory2/migrate.js.map +1 -0
- package/dist/core/memory2/redact.d.ts +21 -0
- package/dist/core/memory2/redact.d.ts.map +1 -0
- package/dist/core/memory2/redact.js +116 -0
- package/dist/core/memory2/redact.js.map +1 -0
- package/dist/core/memory2/retrieve.d.ts +16 -0
- package/dist/core/memory2/retrieve.d.ts.map +1 -0
- package/dist/core/memory2/retrieve.js +70 -0
- package/dist/core/memory2/retrieve.js.map +1 -0
- package/dist/core/memory2/store.d.ts +30 -0
- package/dist/core/memory2/store.d.ts.map +1 -0
- package/dist/core/memory2/store.js +217 -0
- package/dist/core/memory2/store.js.map +1 -0
- package/dist/core/memory2/types.d.ts +53 -0
- package/dist/core/memory2/types.d.ts.map +1 -0
- package/dist/core/memory2/types.js +12 -0
- package/dist/core/memory2/types.js.map +1 -0
- package/dist/engines/StageEngine.d.ts.map +1 -1
- package/dist/engines/StageEngine.js +13 -8
- package/dist/engines/StageEngine.js.map +1 -1
- package/dist/main.js +17 -154
- package/dist/main.js.map +1 -1
- package/dist/manager/worker-manager-impl.d.ts +10 -0
- package/dist/manager/worker-manager-impl.d.ts.map +1 -1
- package/dist/manager/worker-manager-impl.js +50 -5
- package/dist/manager/worker-manager-impl.js.map +1 -1
- package/dist/providers/llm/workerTools.js +1 -1
- package/dist/providers/mcp/spsMcpServer.d.ts +13 -7
- package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
- package/dist/providers/mcp/spsMcpServer.js +90 -28
- package/dist/providers/mcp/spsMcpServer.js.map +1 -1
- package/dist/providers/mcp/spsMcpStdio.js +3 -15
- package/dist/providers/mcp/spsMcpStdio.js.map +1 -1
- package/dist/providers/mcp/spsMcpStdioConfig.d.ts +2 -1
- package/dist/providers/mcp/spsMcpStdioConfig.d.ts.map +1 -1
- package/dist/providers/mcp/spsMcpStdioConfig.js +3 -1
- package/dist/providers/mcp/spsMcpStdioConfig.js.map +1 -1
- package/dist/services/MemoryService.d.ts +69 -0
- package/dist/services/MemoryService.d.ts.map +1 -0
- package/dist/services/MemoryService.js +178 -0
- package/dist/services/MemoryService.js.map +1 -0
- package/dist/services/SystemService.d.ts +17 -3
- package/dist/services/SystemService.d.ts.map +1 -1
- package/dist/services/SystemService.js +75 -17
- package/dist/services/SystemService.js.map +1 -1
- package/dist/services/container.d.ts +2 -0
- package/dist/services/container.d.ts.map +1 -1
- package/dist/services/container.js +2 -0
- package/dist/services/container.js.map +1 -1
- package/package.json +1 -2
- package/project-template/.claude/CLAUDE.md +0 -23
- package/skills/sps-pipeline/SKILL.md +12 -15
- package/dist/console-assets/assets/index-BHtTCxMY.css +0 -10
- package/dist/core/memory.d.ts +0 -85
- package/dist/core/memory.d.ts.map +0 -1
- package/dist/core/memory.js +0 -374
- package/dist/core/memory.js.map +0 -1
- package/dist/core/memoryIngest.d.ts +0 -18
- package/dist/core/memoryIngest.d.ts.map +0 -1
- package/dist/core/memoryIngest.js +0 -56
- package/dist/core/memoryIngest.js.map +0 -1
- package/dist/core/memoryProvider.d.ts +0 -63
- package/dist/core/memoryProvider.d.ts.map +0 -1
- package/dist/core/memoryProvider.js +0 -205
- package/dist/core/memoryProvider.js.map +0 -1
- package/dist/core/transcriptIngest.d.ts +0 -37
- package/dist/core/transcriptIngest.d.ts.map +0 -1
- package/dist/core/transcriptIngest.js +0 -137
- package/dist/core/transcriptIngest.js.map +0 -1
- package/skills/sps-memory/SKILL.md +0 -51
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { type UnifiedAddInput } from './memoryProvider.js';
|
|
2
|
-
/** 把增量文本切成「记忆大小」的条目:按空行分段,过滤过短。 */
|
|
3
|
-
export declare function segmentMemory(text: string): string[];
|
|
4
|
-
export interface IngestOpts {
|
|
5
|
-
/** 注入 sink(默认 addMemoryUnified);测试 / 换后端用。 */
|
|
6
|
-
add?: (project: string, input: UnifiedAddInput, raw: Record<string, string>) => Promise<{
|
|
7
|
-
ok: boolean;
|
|
8
|
-
}>;
|
|
9
|
-
/** 覆盖记忆目录(默认 getProjectMemoryDir);测试用。 */
|
|
10
|
-
memoryDir?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 摄取一个项目 MEMORY.md 的新增量到 agentmemory。幂等:cursor(已摄取字节数)存在记忆目录,
|
|
14
|
-
* 只搬 cursor 之后的内容;文件被截断/重写(长度 < cursor)→ 归零重头(agentmemory 去重兜底)。
|
|
15
|
-
* @returns 本次新摄取的条目数。
|
|
16
|
-
*/
|
|
17
|
-
export declare function ingestProjectMemory(project: string, raw: Record<string, string>, opts?: IngestOpts): Promise<number>;
|
|
18
|
-
//# sourceMappingURL=memoryIngest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryIngest.d.ts","sourceRoot":"","sources":["../../src/core/memoryIngest.ts"],"names":[],"mappings":"AAYA,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKpD;AAED,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,CACJ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KACxB,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/memoryIngest
|
|
3
|
-
* @description 记忆摄取层 v1(写·解耦):把 worker 自己写的 **MEMORY.md 增量**同步进跨项目记忆库
|
|
4
|
-
* (agentmemory)。agent 零额外负担——它只管写 MEMORY.md,本层用 cursor 记位、只搬新增量。
|
|
5
|
-
* MEMORY.md 已是策展内容,免蒸馏;下游去重/压缩交给 agentmemory。
|
|
6
|
-
* transcript(.jsonl/session.json)源 = v2(需分段,留后续)。设计:docs/adapters/memory-layer.md。
|
|
7
|
-
* @layer core
|
|
8
|
-
* @boundedContext memory
|
|
9
|
-
*/
|
|
10
|
-
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
11
|
-
import { resolve } from 'node:path';
|
|
12
|
-
import { getProjectMemoryDir } from './memory.js';
|
|
13
|
-
import { addMemoryUnified } from './memoryProvider.js';
|
|
14
|
-
/** 把增量文本切成「记忆大小」的条目:按空行分段,过滤过短。 */
|
|
15
|
-
export function segmentMemory(text) {
|
|
16
|
-
return text
|
|
17
|
-
.split(/\n\s*\n/)
|
|
18
|
-
.map((s) => s.trim())
|
|
19
|
-
.filter((s) => s.length >= 8);
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 摄取一个项目 MEMORY.md 的新增量到 agentmemory。幂等:cursor(已摄取字节数)存在记忆目录,
|
|
23
|
-
* 只搬 cursor 之后的内容;文件被截断/重写(长度 < cursor)→ 归零重头(agentmemory 去重兜底)。
|
|
24
|
-
* @returns 本次新摄取的条目数。
|
|
25
|
-
*/
|
|
26
|
-
export async function ingestProjectMemory(project, raw, opts = {}) {
|
|
27
|
-
const dir = opts.memoryDir ?? getProjectMemoryDir(project);
|
|
28
|
-
const md = resolve(dir, 'MEMORY.md');
|
|
29
|
-
if (!existsSync(md))
|
|
30
|
-
return 0;
|
|
31
|
-
const add = opts.add ?? addMemoryUnified;
|
|
32
|
-
const content = readFileSync(md, 'utf-8');
|
|
33
|
-
const cursorFile = resolve(dir, '.sps-ingest-cursor');
|
|
34
|
-
let cursor = 0;
|
|
35
|
-
if (existsSync(cursorFile)) {
|
|
36
|
-
cursor = Number.parseInt(readFileSync(cursorFile, 'utf-8').trim(), 10) || 0;
|
|
37
|
-
}
|
|
38
|
-
if (content.length < cursor)
|
|
39
|
-
cursor = 0; // 文件被重写/截断 → 重头
|
|
40
|
-
const entries = segmentMemory(content.slice(cursor));
|
|
41
|
-
let n = 0;
|
|
42
|
-
for (const e of entries) {
|
|
43
|
-
const name = (e.split('\n')[0] ?? e).slice(0, 80);
|
|
44
|
-
try {
|
|
45
|
-
const r = await add(project, { type: 'note', name, body: e }, raw);
|
|
46
|
-
if (r.ok)
|
|
47
|
-
n++;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
/* 单条失败不阻塞其余;cursor 仍前进,避免下轮重灌已成功的 */
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
writeFileSync(cursorFile, String(content.length));
|
|
54
|
-
return n;
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=memoryIngest.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryIngest.js","sourceRoot":"","sources":["../../src/core/memoryIngest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAE7E,mCAAmC;AACnC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAaD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe,EACf,GAA2B,EAC3B,OAAmB,EAAE;IAErB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,gBAAgB,CAAC;IAEzC,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACtD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;QAAE,MAAM,GAAG,CAAC,CAAC,CAAC,gBAAgB;IAEzD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACnE,IAAI,CAAC,CAAC,EAAE;gBAAE,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IACD,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module memoryProvider
|
|
3
|
-
* @description 记忆后端的 sps-cli 侧装配:注册 builtin(进程内复用 core/memory 文件记忆)、
|
|
4
|
-
* 解析全局配置(SPS_MEMORY_PROVIDER / SPS_MEMORY_URL)、给 worker 透传 env、
|
|
5
|
-
* 以及按后端产出「写记忆」引导(leg ③)。
|
|
6
|
-
*
|
|
7
|
-
* @role util
|
|
8
|
-
* @layer core
|
|
9
|
-
* @boundedContext memory
|
|
10
|
-
*
|
|
11
|
-
* 设计见交接记忆 sps-cli-memory-plugin:cc-agent 的 createMemoryProvider 跑在 daemon 进程内,
|
|
12
|
-
* 故 builtin 直接进程内注入,复用 buildMemoryContext,不复制逻辑、不走 socket。
|
|
13
|
-
*/
|
|
14
|
-
export type MemoryProviderName = 'none' | 'builtin' | 'agentmemory' | 'custom';
|
|
15
|
-
export interface MemoryConfig {
|
|
16
|
-
provider: string;
|
|
17
|
-
/** custom/agentmemory 的后端 URL(空 = 用默认)。 */
|
|
18
|
-
url: string;
|
|
19
|
-
}
|
|
20
|
-
/** 幂等:在 daemon 进程内注册宿主提供的后端(builtin)。spawn worker 前调用一次。 */
|
|
21
|
-
export declare function ensureMemoryProvidersRegistered(): void;
|
|
22
|
-
/** 从配置(项目 conf 合并全局 env,或纯全局 env)解析记忆后端。默认 agentmemory。 */
|
|
23
|
-
export declare function resolveMemoryConfig(raw: Record<string, string>): MemoryConfig;
|
|
24
|
-
/** 透传给 cc-agent 工厂的 worker env(extraEnv)。 */
|
|
25
|
-
export declare function memoryEnv(cfg: MemoryConfig): Record<string, string>;
|
|
26
|
-
/**
|
|
27
|
-
* leg ③:**统一**的 worker 写记忆引导(不分后端,none → 空串)。
|
|
28
|
-
* agent 无论后端是什么,都只用 `sps memory search/add` 这一套 CLI;由 CLI 内部按
|
|
29
|
-
* SPS_MEMORY_PROVIDER 分发到 builtin/agentmemory/custom。
|
|
30
|
-
*/
|
|
31
|
-
export declare function buildWorkerMemoryInstructions(project: string, provider: string): string;
|
|
32
|
-
export interface UnifiedAddInput {
|
|
33
|
-
type: string;
|
|
34
|
-
name: string;
|
|
35
|
-
description?: string;
|
|
36
|
-
body: string;
|
|
37
|
-
}
|
|
38
|
-
/** 统一写:builtin→文件;agentmemory/custom→REST /remember;none→跳过。 */
|
|
39
|
-
export declare function addMemoryUnified(project: string, input: UnifiedAddInput, raw: Record<string, string>): Promise<{
|
|
40
|
-
ok: boolean;
|
|
41
|
-
message: string;
|
|
42
|
-
}>;
|
|
43
|
-
export interface AuditGroup {
|
|
44
|
-
key: string;
|
|
45
|
-
count: number;
|
|
46
|
-
items: string[];
|
|
47
|
-
}
|
|
48
|
-
export interface AuditResult {
|
|
49
|
-
provider: string;
|
|
50
|
-
total: number;
|
|
51
|
-
duplicateGroups: AuditGroup[];
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Runtime 事后审计(v1:只读去重报告)。按归一化标题分组,报告重复组。
|
|
55
|
-
* agent 直接写(propose)后,这里事后扫库找重复供清理。实际删除待验证后端 forget 端点(v2)。
|
|
56
|
-
*/
|
|
57
|
-
export declare function auditMemoryUnified(project: string, raw: Record<string, string>, limit?: number): Promise<AuditResult>;
|
|
58
|
-
/** 统一搜索:builtin→文件包含匹配;agentmemory/custom→REST smart-search;none→空。 */
|
|
59
|
-
export declare function searchMemoryUnified(project: string, query: string, raw: Record<string, string>, limit?: number): Promise<{
|
|
60
|
-
provider: string;
|
|
61
|
-
hits: string[];
|
|
62
|
-
}>;
|
|
63
|
-
//# sourceMappingURL=memoryProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryProvider.d.ts","sourceRoot":"","sources":["../../src/core/memoryProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;CACb;AAID,4DAA4D;AAC5D,wBAAgB,+BAA+B,IAAI,IAAI,CAiBtD;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,YAAY,CAK7E;AAED,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAInE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQvF;AAqCD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B3C;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AACD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,UAAU,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,SAAM,GACV,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAED,uEAAuE;AACvE,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,KAAK,SAAI,GACR,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8B/C"}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module memoryProvider
|
|
3
|
-
* @description 记忆后端的 sps-cli 侧装配:注册 builtin(进程内复用 core/memory 文件记忆)、
|
|
4
|
-
* 解析全局配置(SPS_MEMORY_PROVIDER / SPS_MEMORY_URL)、给 worker 透传 env、
|
|
5
|
-
* 以及按后端产出「写记忆」引导(leg ③)。
|
|
6
|
-
*
|
|
7
|
-
* @role util
|
|
8
|
-
* @layer core
|
|
9
|
-
* @boundedContext memory
|
|
10
|
-
*
|
|
11
|
-
* 设计见交接记忆 sps-cli-memory-plugin:cc-agent 的 createMemoryProvider 跑在 daemon 进程内,
|
|
12
|
-
* 故 builtin 直接进程内注入,复用 buildMemoryContext,不复制逻辑、不走 socket。
|
|
13
|
-
*/
|
|
14
|
-
import { registerMemoryProvider } from '@coralai/claude-code-agent';
|
|
15
|
-
import { addMemory, buildMemoryContext, getProjectMemoryDir, readMemoryFile, scanMemoryFiles, } from './memory.js';
|
|
16
|
-
let registered = false;
|
|
17
|
-
/** 幂等:在 daemon 进程内注册宿主提供的后端(builtin)。spawn worker 前调用一次。 */
|
|
18
|
-
export function ensureMemoryProvidersRegistered() {
|
|
19
|
-
if (registered)
|
|
20
|
-
return;
|
|
21
|
-
registered = true;
|
|
22
|
-
// builtin = 本地文件记忆。recall=项目记忆上下文;不自动捕获(文件记忆不堆原始事件),
|
|
23
|
-
// 写靠 agent 收尾 `sps memory add`;不挂 MCP(用 CLI)。
|
|
24
|
-
registerMemoryProvider('builtin', ({ project }) => ({
|
|
25
|
-
async recall() {
|
|
26
|
-
const ctx = buildMemoryContext(project);
|
|
27
|
-
return ctx ? `<builtin-memory-recall>\n${ctx}\n</builtin-memory-recall>` : null;
|
|
28
|
-
},
|
|
29
|
-
onUpdate() {
|
|
30
|
-
/* no-op:文件记忆按精华条目存,不自动堆原始工具事件 */
|
|
31
|
-
},
|
|
32
|
-
end() {
|
|
33
|
-
/* no-op */
|
|
34
|
-
},
|
|
35
|
-
}));
|
|
36
|
-
}
|
|
37
|
-
/** 从配置(项目 conf 合并全局 env,或纯全局 env)解析记忆后端。默认 agentmemory。 */
|
|
38
|
-
export function resolveMemoryConfig(raw) {
|
|
39
|
-
let provider = (raw.SPS_MEMORY_PROVIDER || 'agentmemory').trim();
|
|
40
|
-
// 兼容旧开关:ENABLE_MEMORY=false 强制关闭。
|
|
41
|
-
if (raw.ENABLE_MEMORY === 'false')
|
|
42
|
-
provider = 'none';
|
|
43
|
-
return { provider, url: (raw.SPS_MEMORY_URL || '').trim() };
|
|
44
|
-
}
|
|
45
|
-
/** 透传给 cc-agent 工厂的 worker env(extraEnv)。 */
|
|
46
|
-
export function memoryEnv(cfg) {
|
|
47
|
-
const env = { SPS_MEMORY_PROVIDER: cfg.provider };
|
|
48
|
-
if (cfg.url)
|
|
49
|
-
env.SPS_MEMORY_URL = cfg.url;
|
|
50
|
-
return env;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* leg ③:**统一**的 worker 写记忆引导(不分后端,none → 空串)。
|
|
54
|
-
* agent 无论后端是什么,都只用 `sps memory search/add` 这一套 CLI;由 CLI 内部按
|
|
55
|
-
* SPS_MEMORY_PROVIDER 分发到 builtin/agentmemory/custom。
|
|
56
|
-
*/
|
|
57
|
-
export function buildWorkerMemoryInstructions(project, provider) {
|
|
58
|
-
if (provider === 'none')
|
|
59
|
-
return '';
|
|
60
|
-
// 触发规则都在 sps-memory skill 的 use-when 里,这里只指路 + 给项目名(skill 用 $SPS_PROJECT)。
|
|
61
|
-
return `# 记忆 / 经验
|
|
62
|
-
|
|
63
|
-
本环境接了跨项目记忆库。上文**若出现** \`<recalled-memory>\` 块,即本卡自动召回的相关历史经验/约定/坑,先看它。
|
|
64
|
-
工作中想查"以前怎么做的 / 这坑踩过没",随时主动召回:有 \`recall\` 工具就用工具,否则用 \`sps memory search\` CLI;
|
|
65
|
-
完成后把值得长期记的精华用 \`append_memory\` / \`sps memory add\` 记一句。项目名 \`${project}\`(亦在 \`$SPS_PROJECT\`)。`;
|
|
66
|
-
}
|
|
67
|
-
// ─── 统一读写(CLI 入口按后端分发)──────────────────────────────
|
|
68
|
-
async function postJson(url, body) {
|
|
69
|
-
try {
|
|
70
|
-
const r = await fetch(url, {
|
|
71
|
-
method: 'POST',
|
|
72
|
-
headers: { 'content-type': 'application/json' },
|
|
73
|
-
body: JSON.stringify(body),
|
|
74
|
-
signal: AbortSignal.timeout(4000),
|
|
75
|
-
});
|
|
76
|
-
if (!r.ok)
|
|
77
|
-
return null;
|
|
78
|
-
return (await r.json());
|
|
79
|
-
}
|
|
80
|
-
catch {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
async function getJson(url) {
|
|
85
|
-
try {
|
|
86
|
-
const r = await fetch(url, { signal: AbortSignal.timeout(4000) });
|
|
87
|
-
if (!r.ok)
|
|
88
|
-
return null;
|
|
89
|
-
return (await r.json());
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function restBase(url) {
|
|
96
|
-
return (url || process.env.AGENTMEMORY_URL || 'http://127.0.0.1:3111').replace(/\/$/, '');
|
|
97
|
-
}
|
|
98
|
-
function normalizeTitle(s) {
|
|
99
|
-
return s.toLowerCase().replace(/\s+/g, ' ').trim();
|
|
100
|
-
}
|
|
101
|
-
/** 统一写:builtin→文件;agentmemory/custom→REST /remember;none→跳过。 */
|
|
102
|
-
export async function addMemoryUnified(project, input, raw) {
|
|
103
|
-
const { provider, url } = resolveMemoryConfig(raw);
|
|
104
|
-
if (provider === 'none')
|
|
105
|
-
return { ok: true, message: '记忆已关闭(none),未写入。' };
|
|
106
|
-
if (provider === 'builtin') {
|
|
107
|
-
const filePath = addMemory(project, {
|
|
108
|
-
name: input.name,
|
|
109
|
-
description: input.description || input.name,
|
|
110
|
-
type: input.type,
|
|
111
|
-
body: input.body || input.name,
|
|
112
|
-
});
|
|
113
|
-
return { ok: true, message: `Memory saved (builtin): ${filePath}` };
|
|
114
|
-
}
|
|
115
|
-
// agentmemory / custom → REST /remember(注意:concepts 必须是数组;且要校验 body.success,
|
|
116
|
-
// 后端对坏请求返回 HTTP 201 但 success:false,只看状态码会假阳性)。
|
|
117
|
-
const content = input.body && input.body !== input.name ? `${input.name}\n\n${input.body}` : input.name;
|
|
118
|
-
const res = await postJson(`${restBase(url)}/agentmemory/remember`, {
|
|
119
|
-
content,
|
|
120
|
-
type: input.type,
|
|
121
|
-
concepts: input.name ? [input.name] : [],
|
|
122
|
-
project,
|
|
123
|
-
});
|
|
124
|
-
if (res && res.success !== false) {
|
|
125
|
-
return { ok: true, message: `Memory saved (${provider}).` };
|
|
126
|
-
}
|
|
127
|
-
const reason = res && typeof res.error === 'string' ? res.error : '后端不可达';
|
|
128
|
-
return { ok: false, message: `写入 ${provider} 失败:${reason}` };
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Runtime 事后审计(v1:只读去重报告)。按归一化标题分组,报告重复组。
|
|
132
|
-
* agent 直接写(propose)后,这里事后扫库找重复供清理。实际删除待验证后端 forget 端点(v2)。
|
|
133
|
-
*/
|
|
134
|
-
export async function auditMemoryUnified(project, raw, limit = 200) {
|
|
135
|
-
const { provider, url } = resolveMemoryConfig(raw);
|
|
136
|
-
if (provider === 'none')
|
|
137
|
-
return { provider, total: 0, duplicateGroups: [] };
|
|
138
|
-
// 收集 (key=归一化标题, label) 列表
|
|
139
|
-
let entries = [];
|
|
140
|
-
if (provider === 'builtin') {
|
|
141
|
-
entries = scanMemoryFiles(getProjectMemoryDir(project)).map((h) => ({
|
|
142
|
-
key: normalizeTitle(h.name ?? h.filename),
|
|
143
|
-
label: h.name ?? h.filename,
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
const r = await getJson(`${restBase(url)}/agentmemory/memories?limit=${limit}`);
|
|
148
|
-
const mems = Array.isArray(r?.memories) ? r.memories : [];
|
|
149
|
-
entries = mems
|
|
150
|
-
.filter((m) => (m.project ?? project) === project)
|
|
151
|
-
.map((m) => {
|
|
152
|
-
const title = typeof m.title === 'string' ? m.title : typeof m.content === 'string' ? m.content : '';
|
|
153
|
-
const id = typeof m.id === 'string' ? m.id : '?';
|
|
154
|
-
return { key: normalizeTitle(title), label: `${title.slice(0, 50)} (${id})` };
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
const groups = new Map();
|
|
158
|
-
for (const e of entries) {
|
|
159
|
-
if (!e.key)
|
|
160
|
-
continue;
|
|
161
|
-
const arr = groups.get(e.key) ?? [];
|
|
162
|
-
arr.push(e.label);
|
|
163
|
-
groups.set(e.key, arr);
|
|
164
|
-
}
|
|
165
|
-
const duplicateGroups = [...groups.entries()]
|
|
166
|
-
.filter(([, items]) => items.length > 1)
|
|
167
|
-
.map(([key, items]) => ({ key, count: items.length, items }));
|
|
168
|
-
return { provider, total: entries.length, duplicateGroups };
|
|
169
|
-
}
|
|
170
|
-
/** 统一搜索:builtin→文件包含匹配;agentmemory/custom→REST smart-search;none→空。 */
|
|
171
|
-
export async function searchMemoryUnified(project, query, raw, limit = 6) {
|
|
172
|
-
const { provider, url } = resolveMemoryConfig(raw);
|
|
173
|
-
if (provider === 'none')
|
|
174
|
-
return { provider, hits: [] };
|
|
175
|
-
if (provider === 'builtin') {
|
|
176
|
-
const q = query.toLowerCase();
|
|
177
|
-
const hits = scanMemoryFiles(getProjectMemoryDir(project))
|
|
178
|
-
.filter((h) => {
|
|
179
|
-
const hay = `${h.name ?? ''} ${h.description ?? ''}`.toLowerCase();
|
|
180
|
-
if (hay.includes(q))
|
|
181
|
-
return true;
|
|
182
|
-
try {
|
|
183
|
-
return readMemoryFile(h.filePath).toLowerCase().includes(q);
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
})
|
|
189
|
-
.slice(0, limit)
|
|
190
|
-
.map((h) => `${h.name ?? h.filename}${h.description ? ` — ${h.description}` : ''}`);
|
|
191
|
-
return { provider, hits };
|
|
192
|
-
}
|
|
193
|
-
const res = await postJson(`${restBase(url)}/agentmemory/smart-search`, {
|
|
194
|
-
query: query.slice(0, 1200),
|
|
195
|
-
limit,
|
|
196
|
-
});
|
|
197
|
-
const hits = Array.isArray(res?.results)
|
|
198
|
-
? res.results
|
|
199
|
-
.map((r) => (typeof r?.title === 'string' ? r.title : ''))
|
|
200
|
-
.filter(Boolean)
|
|
201
|
-
.slice(0, limit)
|
|
202
|
-
: [];
|
|
203
|
-
return { provider, hits };
|
|
204
|
-
}
|
|
205
|
-
//# sourceMappingURL=memoryProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memoryProvider.js","sourceRoot":"","sources":["../../src/core/memoryProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { type UnifiedAddInput } from './memoryProvider.js';
|
|
2
|
-
/** claude 把 cwd 编码成 jsonl 目录名:'/'、'\'、':'、'.' 全替成 '-'(实测含隐藏目录如 .coral)。 */
|
|
3
|
-
export declare function encodeClaudeDir(cwd: string): string;
|
|
4
|
-
/**
|
|
5
|
-
* 从 claude jsonl 文本里抽 assistant 说的话(content[].type==='text')。
|
|
6
|
-
* 跳过 thinking / tool_use / user;过滤 trim 后长度 < minLen 的(噪声 / "Acknowledged." 类)。
|
|
7
|
-
*/
|
|
8
|
-
export declare function extractAssistantTexts(jsonl: string, minLen?: number): string[];
|
|
9
|
-
/**
|
|
10
|
-
* 从 openai Agents SDK 的 session 项(AgentInputItem[])里抽 assistant 说的话。
|
|
11
|
-
* 结构:{type:'message', role:'assistant', content:[{type:'output_text', text}]}。
|
|
12
|
-
*/
|
|
13
|
-
export declare function extractAssistantTextsFromItems(items: unknown[], minLen?: number): string[];
|
|
14
|
-
export interface TranscriptIngestOpts {
|
|
15
|
-
/** worker cwd(repo dir)→ 定位 claude jsonl 目录。 */
|
|
16
|
-
repoDir: string;
|
|
17
|
-
/** cursor 存这(<runtimeDir>/.transcript-cursor.json);也是 openai worker-session.json 所在。 */
|
|
18
|
-
runtimeDir: string;
|
|
19
|
-
add?: (project: string, input: UnifiedAddInput, raw: Record<string, string>) => Promise<{
|
|
20
|
-
ok: boolean;
|
|
21
|
-
}>;
|
|
22
|
-
/** 覆盖 jsonl 目录(测试用)。 */
|
|
23
|
-
jsonlDir?: string;
|
|
24
|
-
/** 覆盖 openai session 文件(默认 <runtimeDir>/worker-session.json;测试用)。 */
|
|
25
|
-
sessionFile?: string;
|
|
26
|
-
/** 每文件每次最多摄取条数(防灌,默认 5,取最近的)。 */
|
|
27
|
-
cap?: number;
|
|
28
|
-
/** 过滤短文本阈值(默认 40)。 */
|
|
29
|
-
minLen?: number;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 摄取一个项目的会话 transcript 新增量 → agentmemory:claude jsonl(按行数 cursor)+ openai
|
|
33
|
-
* worker-session.json(按 item 数 cursor)。幂等;文件截断→该源归零重读。
|
|
34
|
-
* @returns 本次新摄取条目数。
|
|
35
|
-
*/
|
|
36
|
-
export declare function ingestProjectTranscripts(project: string, raw: Record<string, string>, opts: TranscriptIngestOpts): Promise<number>;
|
|
37
|
-
//# sourceMappingURL=transcriptIngest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcriptIngest.d.ts","sourceRoot":"","sources":["../../src/core/transcriptIngest.ts"],"names":[],"mappings":"AAaA,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE7E,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAqB1E;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,SAAK,GAAG,MAAM,EAAE,CAYtF;AAED,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACzG,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,MAAM,CAAC,CA4DjB"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module core/transcriptIngest
|
|
3
|
-
* @description 记忆摄取层 v2(写·全解耦):把 worker 的 **claude 会话 transcript(.jsonl)** 增量
|
|
4
|
-
* 里 agent 自己说的话(assistant text 块)摄取进 agentmemory。transcript 是 SDK
|
|
5
|
-
* **永远自动写**的,所以这是"无论 agent 配不配合、记忆一定攒得上"的唯一可靠源。
|
|
6
|
-
* 只取 assistant 的 text(跳过 thinking / tool_use),过短的丢(顺带滤掉 "Acknowledged." 类噪声);
|
|
7
|
-
* 不重蒸馏——下游交给 agentmemory 的 compress/consolidate。设计:docs/adapters/memory-layer.md。
|
|
8
|
-
* @layer core
|
|
9
|
-
* @boundedContext memory
|
|
10
|
-
*/
|
|
11
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
-
import { homedir } from 'node:os';
|
|
13
|
-
import { dirname, resolve } from 'node:path';
|
|
14
|
-
import { addMemoryUnified } from './memoryProvider.js';
|
|
15
|
-
/** claude 把 cwd 编码成 jsonl 目录名:'/'、'\'、':'、'.' 全替成 '-'(实测含隐藏目录如 .coral)。 */
|
|
16
|
-
export function encodeClaudeDir(cwd) {
|
|
17
|
-
return cwd.replace(/[/\\:.]/g, '-');
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 从 claude jsonl 文本里抽 assistant 说的话(content[].type==='text')。
|
|
21
|
-
* 跳过 thinking / tool_use / user;过滤 trim 后长度 < minLen 的(噪声 / "Acknowledged." 类)。
|
|
22
|
-
*/
|
|
23
|
-
export function extractAssistantTexts(jsonl, minLen = 40) {
|
|
24
|
-
const out = [];
|
|
25
|
-
for (const line of jsonl.split('\n')) {
|
|
26
|
-
if (!line.trim())
|
|
27
|
-
continue;
|
|
28
|
-
let rec;
|
|
29
|
-
try {
|
|
30
|
-
rec = JSON.parse(line);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
if (rec.type !== 'assistant' || rec.message?.role !== 'assistant')
|
|
36
|
-
continue;
|
|
37
|
-
const content = rec.message.content;
|
|
38
|
-
if (!Array.isArray(content))
|
|
39
|
-
continue;
|
|
40
|
-
for (const block of content) {
|
|
41
|
-
if (block?.type === 'text' && typeof block.text === 'string') {
|
|
42
|
-
const t = block.text.trim();
|
|
43
|
-
if (t.length >= minLen)
|
|
44
|
-
out.push(t);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return out;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* 从 openai Agents SDK 的 session 项(AgentInputItem[])里抽 assistant 说的话。
|
|
52
|
-
* 结构:{type:'message', role:'assistant', content:[{type:'output_text', text}]}。
|
|
53
|
-
*/
|
|
54
|
-
export function extractAssistantTextsFromItems(items, minLen = 40) {
|
|
55
|
-
const out = [];
|
|
56
|
-
for (const it of items) {
|
|
57
|
-
if (it?.type !== 'message' || it.role !== 'assistant' || !Array.isArray(it.content))
|
|
58
|
-
continue;
|
|
59
|
-
for (const block of it.content) {
|
|
60
|
-
if (block?.type === 'output_text' && typeof block.text === 'string') {
|
|
61
|
-
const t = block.text.trim();
|
|
62
|
-
if (t.length >= minLen)
|
|
63
|
-
out.push(t);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return out;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* 摄取一个项目的会话 transcript 新增量 → agentmemory:claude jsonl(按行数 cursor)+ openai
|
|
71
|
-
* worker-session.json(按 item 数 cursor)。幂等;文件截断→该源归零重读。
|
|
72
|
-
* @returns 本次新摄取条目数。
|
|
73
|
-
*/
|
|
74
|
-
export async function ingestProjectTranscripts(project, raw, opts) {
|
|
75
|
-
const dir = opts.jsonlDir ?? resolve(homedir(), '.claude', 'projects', encodeClaudeDir(opts.repoDir));
|
|
76
|
-
const add = opts.add ?? addMemoryUnified;
|
|
77
|
-
const cap = opts.cap ?? 5;
|
|
78
|
-
const cursorFile = resolve(opts.runtimeDir, '.transcript-cursor.json');
|
|
79
|
-
let cursors = {};
|
|
80
|
-
if (existsSync(cursorFile)) {
|
|
81
|
-
try {
|
|
82
|
-
cursors = JSON.parse(readFileSync(cursorFile, 'utf-8'));
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
cursors = {};
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
let total = 0;
|
|
89
|
-
const feed = async (texts) => {
|
|
90
|
-
for (const t of texts.slice(-cap)) {
|
|
91
|
-
try {
|
|
92
|
-
const r = await add(project, { type: 'transcript', name: (t.split('\n')[0] ?? t).slice(0, 80), body: t }, raw);
|
|
93
|
-
if (r.ok)
|
|
94
|
-
total++;
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
/* 单条失败不阻塞 */
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
// claude 后端:目录下每个 .jsonl,按行数 cursor。
|
|
102
|
-
if (existsSync(dir)) {
|
|
103
|
-
for (const name of readdirSync(dir)) {
|
|
104
|
-
if (!name.endsWith('.jsonl'))
|
|
105
|
-
continue;
|
|
106
|
-
const lines = readFileSync(resolve(dir, name), 'utf-8').split('\n').filter(Boolean);
|
|
107
|
-
const seen = Math.min(cursors[name] ?? 0, lines.length); // 截断兜底
|
|
108
|
-
if (lines.length === seen)
|
|
109
|
-
continue;
|
|
110
|
-
await feed(extractAssistantTexts(lines.slice(seen).join('\n'), opts.minLen));
|
|
111
|
-
cursors[name] = lines.length;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// openai 后端:worker-session.json(AgentInputItem 数组),按 item 数 cursor。
|
|
115
|
-
const sessionFile = opts.sessionFile ?? resolve(opts.runtimeDir, 'worker-session.json');
|
|
116
|
-
if (existsSync(sessionFile)) {
|
|
117
|
-
let items = [];
|
|
118
|
-
try {
|
|
119
|
-
const parsed = JSON.parse(readFileSync(sessionFile, 'utf-8'));
|
|
120
|
-
if (Array.isArray(parsed))
|
|
121
|
-
items = parsed;
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
/* 坏文件跳过 */
|
|
125
|
-
}
|
|
126
|
-
const key = '__openai_session__';
|
|
127
|
-
const seen = Math.min(cursors[key] ?? 0, items.length);
|
|
128
|
-
if (items.length > seen) {
|
|
129
|
-
await feed(extractAssistantTextsFromItems(items.slice(seen), opts.minLen));
|
|
130
|
-
cursors[key] = items.length;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
mkdirSync(dirname(cursorFile), { recursive: true }); // runtimeDir 可能不存在(如手动 CLI 对未跑过的项目)
|
|
134
|
-
writeFileSync(cursorFile, JSON.stringify(cursors));
|
|
135
|
-
return total;
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=transcriptIngest.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcriptIngest.js","sourceRoot":"","sources":["../../src/core/transcriptIngest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAE7E,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,MAAM,GAAG,EAAE;IAC9D,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,GAAsE,CAAC;QAC3E,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW;YAAE,SAAS;QAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QACtC,KAAK,MAAM,KAAK,IAAI,OAAkD,EAAE,CAAC;YACvE,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,8BAA8B,CAAC,KAAgB,EAAE,MAAM,GAAG,EAAE;IAC1E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,EAAE,IAAI,KAAmE,EAAE,CAAC;QACrF,IAAI,EAAE,EAAE,IAAI,KAAK,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;YAAE,SAAS;QAC9F,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,OAAkD,EAAE,CAAC;YAC1E,IAAI,KAAK,EAAE,IAAI,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAoBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAe,EACf,GAA2B,EAC3B,IAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACtG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,gBAAgB,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAE1B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;IACvE,IAAI,OAAO,GAAY,EAAE,CAAC;IAC1B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAY,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,IAAI,GAAG,KAAK,EAAE,KAAe,EAAiB,EAAE;QACpD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;gBAC/G,IAAI,CAAC,CAAC,EAAE;oBAAE,KAAK,EAAE,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa;YACf,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,qCAAqC;IACrC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAChE,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;gBAAE,SAAS;YACpC,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACxF,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAc,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,KAAK,GAAG,MAAM,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,WAAW;QACb,CAAC;QACD,MAAM,GAAG,GAAG,oBAAoB,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,oCAAoC;IACzF,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sps-memory
|
|
3
|
-
description: 项目级记忆 —— 续作/动手前召回历史经验,完成时记录可复用精华。统一走 `sps memory` CLI,后端(本地文件 / agentmemory / 自定义)由系统全局配置,你无需关心是哪个。召回触发:任务涉及已有项目、用户说"继续/上次/之前"、涉及代码仓库/部署路径/架构决策、需保持用户偏好。记录触发:产生新架构决策、任务/状态变化、发现新约束、用户纠正了你、产生可复用解决方案。(🪸 Coral SPS)
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 项目记忆(sps-memory)
|
|
7
|
-
|
|
8
|
-
统一 CLI 读写,**后端无关**(本地文件 / agentmemory / 自定义由系统全局配置)。
|
|
9
|
-
项目名在环境变量 `$SPS_PROJECT`。开工时系统已自动召回一批注入上文;工作中按下列规则**主动**使用。
|
|
10
|
-
|
|
11
|
-
## 召回(读)
|
|
12
|
-
|
|
13
|
-
**何时(满足任一,就先召回再动手):**
|
|
14
|
-
- 任务涉及已有项目
|
|
15
|
-
- 用户说"继续 / 上次 / 之前"
|
|
16
|
-
- 涉及代码仓库、部署路径、架构决策
|
|
17
|
-
- 需要保持用户偏好
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
sps memory search "$SPS_PROJECT" "<关键词,如 部署路径 / 某模块架构 / 某引擎的坑>"
|
|
21
|
-
```
|
|
22
|
-
返回相关记忆标题;需要细节再据此深入(读文件 / 再检索)。
|
|
23
|
-
|
|
24
|
-
## 记录(写)
|
|
25
|
-
|
|
26
|
-
**何时(满足任一,就记一条):**
|
|
27
|
-
- 产生了新的架构决策
|
|
28
|
-
- 任务 / 状态发生变化
|
|
29
|
-
- 发现了新约束
|
|
30
|
-
- 用户纠正了你
|
|
31
|
-
- 产生了可复用的解决方案
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
sps memory add "$SPS_PROJECT" --type <lesson|decision|convention|reference> \
|
|
35
|
-
--name "<一句话标题>" --body "<要点>"
|
|
36
|
-
```
|
|
37
|
-
- `decision` 架构/技术决策 · `lesson` 踩过的坑/教训 · `convention` 约定/规范 · `reference` 参考/路径
|
|
38
|
-
- 只记**非显然、可复用**的精华,别记流水账。
|
|
39
|
-
- 写入是**提议**——系统会事后去重和审计,轻微重复不必担心。
|
|
40
|
-
|
|
41
|
-
## 不要记
|
|
42
|
-
|
|
43
|
-
代码结构 / 文件路径(Read·Glob 可得)· git 历史 · 临时调试态 · CLAUDE.md/docs 已有的 · 卡/任务状态。
|
|
44
|
-
**不确定就不写** —— 空增长比不增长更糟。
|
|
45
|
-
|
|
46
|
-
## 诚实
|
|
47
|
-
|
|
48
|
-
- 不编造;只记用户说过的或你真发现的。
|
|
49
|
-
- 记错了就改 / 删,别在矛盾上再堆一条。
|
|
50
|
-
|
|
51
|
-
记忆服务不可用时跳过,不阻塞任务。
|