@coralai/sps-cli 0.65.31 → 0.65.33

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 (140) hide show
  1. package/README-CN.md +3 -3
  2. package/README.md +3 -3
  3. package/dist/commands/modelCommand.d.ts.map +1 -1
  4. package/dist/commands/modelCommand.js +5 -92
  5. package/dist/commands/modelCommand.js.map +1 -1
  6. package/dist/commands/pipelineTick.d.ts.map +1 -1
  7. package/dist/commands/pipelineTick.js +0 -9
  8. package/dist/commands/pipelineTick.js.map +1 -1
  9. package/dist/commands/projectInit.d.ts +1 -1
  10. package/dist/commands/setup.d.ts.map +1 -1
  11. package/dist/commands/setup.js +0 -3
  12. package/dist/commands/setup.js.map +1 -1
  13. package/dist/commands/tick.d.ts.map +1 -1
  14. package/dist/commands/tick.js +0 -12
  15. package/dist/commands/tick.js.map +1 -1
  16. package/dist/console/index.d.ts.map +1 -1
  17. package/dist/console/index.js +27 -4
  18. package/dist/console/index.js.map +1 -1
  19. package/dist/console/routes/audit.d.ts.map +1 -1
  20. package/dist/console/routes/audit.js +4 -1
  21. package/dist/console/routes/audit.js.map +1 -1
  22. package/dist/console/routes/chat.d.ts.map +1 -1
  23. package/dist/console/routes/chat.js +14 -21
  24. package/dist/console/routes/chat.js.map +1 -1
  25. package/dist/console/routes/health.d.ts +14 -0
  26. package/dist/console/routes/health.d.ts.map +1 -0
  27. package/dist/console/routes/health.js +60 -0
  28. package/dist/console/routes/health.js.map +1 -0
  29. package/dist/console/routes/projects.js +1 -1
  30. package/dist/console/routes/projects.js.map +1 -1
  31. package/dist/console/routes/providers.d.ts.map +1 -1
  32. package/dist/console/routes/providers.js +2 -6
  33. package/dist/console/routes/providers.js.map +1 -1
  34. package/dist/console/routes/workers.d.ts.map +1 -1
  35. package/dist/console/routes/workers.js +19 -0
  36. package/dist/console/routes/workers.js.map +1 -1
  37. package/dist/console-assets/assets/{ShowcasePage-GF_0kvZG.js → ShowcasePage-NmXybDqC.js} +1 -1
  38. package/dist/console-assets/assets/{index-lgFYFfCi.js → index-DCAnGMiQ.js} +207 -217
  39. package/dist/console-assets/index.html +1 -1
  40. package/dist/core/activityStream.d.ts +42 -0
  41. package/dist/core/activityStream.d.ts.map +1 -0
  42. package/dist/core/activityStream.js +208 -0
  43. package/dist/core/activityStream.js.map +1 -0
  44. package/dist/core/agents/workerModelEnv.d.ts +2 -3
  45. package/dist/core/agents/workerModelEnv.d.ts.map +1 -1
  46. package/dist/core/agents/workerModelEnv.js +4 -17
  47. package/dist/core/agents/workerModelEnv.js.map +1 -1
  48. package/dist/core/markerFile.d.ts.map +1 -1
  49. package/dist/core/markerFile.js +3 -2
  50. package/dist/core/markerFile.js.map +1 -1
  51. package/dist/core/memory2/config.d.ts +11 -2
  52. package/dist/core/memory2/config.d.ts.map +1 -1
  53. package/dist/core/memory2/config.js +28 -4
  54. package/dist/core/memory2/config.js.map +1 -1
  55. package/dist/core/memory2/distill.d.ts.map +1 -1
  56. package/dist/core/memory2/distill.js +7 -5
  57. package/dist/core/memory2/distill.js.map +1 -1
  58. package/dist/core/queue.d.ts.map +1 -1
  59. package/dist/core/queue.js +2 -1
  60. package/dist/core/queue.js.map +1 -1
  61. package/dist/core/reclaimConfig.d.ts.map +1 -1
  62. package/dist/core/reclaimConfig.js +14 -2
  63. package/dist/core/reclaimConfig.js.map +1 -1
  64. package/dist/core/skills/SkillsManager.d.ts +5 -1
  65. package/dist/core/skills/SkillsManager.d.ts.map +1 -1
  66. package/dist/core/skills/SkillsManager.js +41 -2
  67. package/dist/core/skills/SkillsManager.js.map +1 -1
  68. package/dist/daemon/daemonClient.d.ts.map +1 -1
  69. package/dist/daemon/daemonClient.js +15 -1
  70. package/dist/daemon/daemonClient.js.map +1 -1
  71. package/dist/daemon/orphanReclaim.d.ts +34 -0
  72. package/dist/daemon/orphanReclaim.d.ts.map +1 -0
  73. package/dist/daemon/orphanReclaim.js +64 -0
  74. package/dist/daemon/orphanReclaim.js.map +1 -0
  75. package/dist/daemon/runGovernor.d.ts +11 -0
  76. package/dist/daemon/runGovernor.d.ts.map +1 -1
  77. package/dist/daemon/runGovernor.js +28 -0
  78. package/dist/daemon/runGovernor.js.map +1 -1
  79. package/dist/daemon/sessionDaemon.d.ts +8 -0
  80. package/dist/daemon/sessionDaemon.d.ts.map +1 -1
  81. package/dist/daemon/sessionDaemon.js +129 -6
  82. package/dist/daemon/sessionDaemon.js.map +1 -1
  83. package/dist/engines/MonitorEngine.d.ts.map +1 -1
  84. package/dist/engines/MonitorEngine.js +27 -7
  85. package/dist/engines/MonitorEngine.js.map +1 -1
  86. package/dist/infra/filesystem.d.ts +5 -0
  87. package/dist/infra/filesystem.d.ts.map +1 -1
  88. package/dist/infra/filesystem.js +13 -1
  89. package/dist/infra/filesystem.js.map +1 -1
  90. package/dist/main.js +1 -6
  91. package/dist/main.js.map +1 -1
  92. package/dist/openai-agent/runWorker.d.ts.map +1 -1
  93. package/dist/openai-agent/runWorker.js +10 -6
  94. package/dist/openai-agent/runWorker.js.map +1 -1
  95. package/dist/openai-agent/storage/toolLedger.d.ts +9 -1
  96. package/dist/openai-agent/storage/toolLedger.d.ts.map +1 -1
  97. package/dist/openai-agent/storage/toolLedger.js +11 -2
  98. package/dist/openai-agent/storage/toolLedger.js.map +1 -1
  99. package/dist/providers/RuntimeSessionRuntime.d.ts.map +1 -1
  100. package/dist/providers/RuntimeSessionRuntime.js +14 -1
  101. package/dist/providers/RuntimeSessionRuntime.js.map +1 -1
  102. package/dist/providers/llm/workerTools.d.ts.map +1 -1
  103. package/dist/providers/llm/workerTools.js +9 -3
  104. package/dist/providers/llm/workerTools.js.map +1 -1
  105. package/dist/providers/mcp/spsMcpServer.d.ts +4 -0
  106. package/dist/providers/mcp/spsMcpServer.d.ts.map +1 -1
  107. package/dist/providers/mcp/spsMcpServer.js +7 -1
  108. package/dist/providers/mcp/spsMcpServer.js.map +1 -1
  109. package/dist/runtime/backends/process/ExternalProcessBackend.d.ts +4 -0
  110. package/dist/runtime/backends/process/ExternalProcessBackend.d.ts.map +1 -1
  111. package/dist/runtime/backends/process/ExternalProcessBackend.js +49 -5
  112. package/dist/runtime/backends/process/ExternalProcessBackend.js.map +1 -1
  113. package/dist/runtime/service/AgentRuntime.d.ts.map +1 -1
  114. package/dist/runtime/service/AgentRuntime.js +8 -4
  115. package/dist/runtime/service/AgentRuntime.js.map +1 -1
  116. package/dist/runtime/service/FileRecordStore.d.ts +13 -0
  117. package/dist/runtime/service/FileRecordStore.d.ts.map +1 -1
  118. package/dist/runtime/service/FileRecordStore.js +90 -3
  119. package/dist/runtime/service/FileRecordStore.js.map +1 -1
  120. package/dist/services/ChatService.d.ts +1 -1
  121. package/dist/services/ChatService.d.ts.map +1 -1
  122. package/dist/services/ProjectService.d.ts +1 -1
  123. package/dist/services/ProjectService.d.ts.map +1 -1
  124. package/dist/services/WorkerService.d.ts +21 -0
  125. package/dist/services/WorkerService.d.ts.map +1 -1
  126. package/dist/services/WorkerService.js +35 -0
  127. package/dist/services/WorkerService.js.map +1 -1
  128. package/package.json +1 -1
  129. package/dist/commands/codexProxyCommand.d.ts +0 -2
  130. package/dist/commands/codexProxyCommand.d.ts.map +0 -1
  131. package/dist/commands/codexProxyCommand.js +0 -81
  132. package/dist/commands/codexProxyCommand.js.map +0 -1
  133. package/dist/console/routes/codexProxy.d.ts +0 -11
  134. package/dist/console/routes/codexProxy.d.ts.map +0 -1
  135. package/dist/console/routes/codexProxy.js +0 -68
  136. package/dist/console/routes/codexProxy.js.map +0 -1
  137. package/dist/core/agents/sidecar/CodexProxyManager.d.ts +0 -79
  138. package/dist/core/agents/sidecar/CodexProxyManager.d.ts.map +0 -1
  139. package/dist/core/agents/sidecar/CodexProxyManager.js +0 -359
  140. package/dist/core/agents/sidecar/CodexProxyManager.js.map +0 -1
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
10
  <link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
11
- <script type="module" crossorigin src="/assets/index-lgFYFfCi.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-DCAnGMiQ.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-cxN7rD-p.css">
13
13
  </head>
14
14
  <body>
@@ -0,0 +1,42 @@
1
+ /** 归一后的原始活动事件。字段稳定;不含任何展示语义。 */
2
+ export type ActivityEvent = {
3
+ seq: number;
4
+ ts: string | null;
5
+ type: 'text';
6
+ text: string;
7
+ } | {
8
+ seq: number;
9
+ ts: string | null;
10
+ type: 'thinking';
11
+ text: string;
12
+ } | {
13
+ seq: number;
14
+ ts: string | null;
15
+ type: 'tool_call';
16
+ /** 配对用;与后续 tool_result 的 toolId 相同。 */
17
+ toolId: string;
18
+ /** **后端原生**工具名(Read / Edit / Bash / exec_command / apply_patch …),不翻译。 */
19
+ name: string;
20
+ /** 原始入参(已脱敏/截断超大值),不美化。 */
21
+ input: unknown;
22
+ } | {
23
+ seq: number;
24
+ ts: string | null;
25
+ type: 'tool_result';
26
+ toolId: string;
27
+ ok: boolean;
28
+ /** 结果摘要文本(可能为空);产品自行决定展示与否。 */
29
+ text?: string;
30
+ };
31
+ export type ActivityBackend = 'claude' | 'openai';
32
+ export interface ReadActivityInput {
33
+ backend: ActivityBackend;
34
+ /** claude 需要(用于定位 transcript);openai 不需要。 */
35
+ cwd?: string | null;
36
+ sessionId: string;
37
+ /** 只取最后 N 条(默认 500;0 = 不限)。 */
38
+ limit?: number;
39
+ }
40
+ /** 按后端读取归一活动流。未知/缺数据一律返回空数组,不抛。 */
41
+ export declare function readActivity(input: ReadActivityInput): ActivityEvent[];
42
+ //# sourceMappingURL=activityStream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityStream.d.ts","sourceRoot":"","sources":["../../src/core/activityStream.ts"],"names":[],"mappings":"AA4BA,gCAAgC;AAChC,MAAM,MAAM,aAAa,GACrB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClE;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,CAAC;IACzB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsMD,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,EAAE,CAStE"}
@@ -0,0 +1,208 @@
1
+ /**
2
+ * @module core/activityStream
3
+ * @description **后端无关的 worker 活动流**——把 claude / openai 各自的产出归一成同一套
4
+ * 原始事件,供上层产品(gameforge 的「制作过程」、console 等)消费。
5
+ *
6
+ * 🔴 为什么要有这层:此前 gameforge 只拿到 `currentTranscriptPath`,然后**自己去解析 Claude Code
7
+ * 的原生 jsonl**(按 claude 的 schema 拆 assistant/tool_use/tool_result)。这既让产品侧耦合了
8
+ * 某个后端的内部格式,也让 openai worker 的产出**完全看不见**(格式和位置都不同)。
9
+ * CLAUDE.md 的红线写着:"读 worker 产出要走 service API,别新写扫 jsonl;现存直读是历史遗留,
10
+ * 只减不增" —— 本模块就是那个 service 侧的归一层。
11
+ *
12
+ * 🔴 契约只定在「原始事件层」,不定在「展示层」:
13
+ * - 归一化(懂各后端 schema)= 引擎的事 → 本模块
14
+ * - 中文标签 / 标题截断 / 取 basename / 图标 = 产品的展示逻辑 → **不进契约,引擎不碰**
15
+ * 因此这里的工具名是**后端原生名**(`Read`/`Edit`/`exec_command`/`apply_patch`…),入参是**原始入参**,
16
+ * 不翻译、不美化。产品各自维护自己的展示映射,引擎改归一不会动到任何产品的 UI。
17
+ *
18
+ * 已知限制(如实标注,不伪造):**openai 侧没有 thinking 事件** —— 其进程协议
19
+ * (AgentProcessEventPayloadsV1)只有 assistant.delta / assistant.message / tool.call /
20
+ * tool.result,不含思考过程。claude 侧有。产品端需按"可能缺失"处理,而不是假定两边对称。
21
+ * @layer core
22
+ * @boundedContext agents
23
+ */
24
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
25
+ import { resolve } from 'node:path';
26
+ import { claudeJsonlFile, sessionsDir } from '../shared/runtimePaths.js';
27
+ import { sanitizeToolInput } from './claudeJsonl.js';
28
+ const DEFAULT_LIMIT = 500;
29
+ const MAX_TEXT = 20_000;
30
+ function clip(text) {
31
+ return text.length > MAX_TEXT ? `${text.slice(0, MAX_TEXT)}…` : text;
32
+ }
33
+ /** 把 JsonValue 结果压成一段可读摘要(产品要不要展示由它自己定)。 */
34
+ function summarize(output) {
35
+ if (output == null)
36
+ return undefined;
37
+ if (typeof output === 'string')
38
+ return clip(output);
39
+ try {
40
+ return clip(JSON.stringify(output));
41
+ }
42
+ catch {
43
+ return undefined;
44
+ }
45
+ }
46
+ function readClaudeActivity(cwd, sessionId) {
47
+ const path = claudeJsonlFile(cwd, sessionId);
48
+ if (!existsSync(path))
49
+ return [];
50
+ let raw;
51
+ try {
52
+ raw = readFileSync(path, 'utf-8');
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ const out = [];
58
+ let seq = 0;
59
+ for (const line of raw.split('\n')) {
60
+ if (!line.trim())
61
+ continue;
62
+ let rec;
63
+ try {
64
+ rec = JSON.parse(line);
65
+ }
66
+ catch {
67
+ continue; // 半截行(正在写)跳过
68
+ }
69
+ const ts = rec.timestamp ?? null;
70
+ for (const block of rec.message?.content ?? []) {
71
+ if (rec.type === 'assistant' && block.type === 'text' && block.text) {
72
+ out.push({ seq: seq++, ts, type: 'text', text: clip(block.text) });
73
+ }
74
+ else if (rec.type === 'assistant' && block.type === 'thinking' && block.thinking) {
75
+ out.push({ seq: seq++, ts, type: 'thinking', text: clip(block.thinking) });
76
+ }
77
+ else if (rec.type === 'assistant' && block.type === 'tool_use' && block.id && block.name) {
78
+ out.push({
79
+ seq: seq++,
80
+ ts,
81
+ type: 'tool_call',
82
+ toolId: block.id,
83
+ name: block.name,
84
+ input: sanitizeToolInput(block.input),
85
+ });
86
+ }
87
+ else if (rec.type === 'user' && block.type === 'tool_result' && block.tool_use_id) {
88
+ out.push({
89
+ seq: seq++,
90
+ ts,
91
+ type: 'tool_result',
92
+ toolId: block.tool_use_id,
93
+ ok: block.is_error !== true,
94
+ ...(summarize(block.content) ? { text: summarize(block.content) } : {}),
95
+ });
96
+ }
97
+ }
98
+ }
99
+ return out;
100
+ }
101
+ function readOpenAiActivity(sessionId) {
102
+ if (!/^[A-Za-z0-9_-]+$/.test(sessionId))
103
+ return [];
104
+ const runsDir = resolve(sessionsDir(), 'openai', sessionId, 'runs');
105
+ if (!existsSync(runsDir))
106
+ return [];
107
+ let runDirs;
108
+ try {
109
+ runDirs = readdirSync(runsDir, { withFileTypes: true })
110
+ .filter((d) => d.isDirectory())
111
+ .map((d) => resolve(runsDir, d.name))
112
+ .sort((a, b) => statSync(a).mtimeMs - statSync(b).mtimeMs);
113
+ }
114
+ catch {
115
+ return [];
116
+ }
117
+ const out = [];
118
+ let seq = 0;
119
+ // assistant.delta 是逐段的:合并连续的 delta 成一条 text,避免产品端拿到几百个碎片。
120
+ let pendingText = '';
121
+ let pendingTs = null;
122
+ const flushText = () => {
123
+ if (!pendingText)
124
+ return;
125
+ out.push({ seq: seq++, ts: pendingTs, type: 'text', text: clip(pendingText) });
126
+ pendingText = '';
127
+ pendingTs = null;
128
+ };
129
+ for (const dir of runDirs) {
130
+ const file = resolve(dir, 'events.jsonl');
131
+ if (!existsSync(file))
132
+ continue;
133
+ let raw;
134
+ try {
135
+ raw = readFileSync(file, 'utf-8');
136
+ }
137
+ catch {
138
+ continue;
139
+ }
140
+ for (const line of raw.split('\n')) {
141
+ if (!line.trim())
142
+ continue;
143
+ let ev;
144
+ try {
145
+ ev = JSON.parse(line);
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ const ts = ev.timestamp ?? null;
151
+ switch (ev.type) {
152
+ case 'assistant.delta':
153
+ if (ev.payload?.delta) {
154
+ pendingTs ??= ts;
155
+ pendingText += ev.payload.delta;
156
+ }
157
+ break;
158
+ case 'assistant.message':
159
+ flushText();
160
+ if (ev.payload?.text) {
161
+ out.push({ seq: seq++, ts, type: 'text', text: clip(ev.payload.text) });
162
+ }
163
+ break;
164
+ case 'tool.call':
165
+ flushText();
166
+ if (ev.payload?.toolCallId && ev.payload.toolName) {
167
+ out.push({
168
+ seq: seq++,
169
+ ts,
170
+ type: 'tool_call',
171
+ toolId: ev.payload.toolCallId,
172
+ name: ev.payload.toolName,
173
+ input: sanitizeToolInput(ev.payload.input),
174
+ });
175
+ }
176
+ break;
177
+ case 'tool.result':
178
+ flushText();
179
+ if (ev.payload?.toolCallId) {
180
+ out.push({
181
+ seq: seq++,
182
+ ts,
183
+ type: 'tool_result',
184
+ toolId: ev.payload.toolCallId,
185
+ ok: ev.payload.status !== 'failed',
186
+ ...(summarize(ev.payload.output) ? { text: summarize(ev.payload.output) } : {}),
187
+ });
188
+ }
189
+ break;
190
+ default:
191
+ break; // session.started / capabilities / usage / run.* 不属于活动流
192
+ }
193
+ }
194
+ }
195
+ flushText();
196
+ return out;
197
+ }
198
+ /** 按后端读取归一活动流。未知/缺数据一律返回空数组,不抛。 */
199
+ export function readActivity(input) {
200
+ const all = input.backend === 'openai'
201
+ ? readOpenAiActivity(input.sessionId)
202
+ : input.cwd
203
+ ? readClaudeActivity(input.cwd, input.sessionId)
204
+ : [];
205
+ const limit = input.limit ?? DEFAULT_LIMIT;
206
+ return limit > 0 && all.length > limit ? all.slice(-limit) : all;
207
+ }
208
+ //# sourceMappingURL=activityStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityStream.js","sourceRoot":"","sources":["../../src/core/activityStream.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * 由 model + providerId 解析出 worker 该带的 env:
3
3
  * - `ANTHROPIC_MODEL = model`(有 model 才设)
4
- * - `providerId === 'codex-proxy'`BASE_URL 指本地 proxy + AUTH_TOKEN='sps-local'
5
- * - 第三方 anthropic 端点(既非 codex-proxy 也非 official/空)→ 从 providers.json 取 baseUrl/apiKey
4
+ * - 第三方 anthropic 端点(非 official/空) providers.json baseUrl/apiKey
6
5
  * - `providerId === 'official'` 或空 → 只设 ANTHROPIC_MODEL(用官方订阅端点)
7
- * - 任意第三方端点(codex-proxy / 三方)额外设 `CLAUDE_CODE_ATTRIBUTION_HEADER=0`(改善第三方缓存命中)
6
+ * - 第三方端点额外设 `CLAUDE_CODE_ATTRIBUTION_HEADER=0`(改善第三方缓存命中)
8
7
  *
9
8
  * 空对象 = 无需注入(既没 model 也没自定义端点)。
10
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"workerModelEnv.d.ts","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAaA;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiDxB"}
1
+ {"version":3,"file":"workerModelEnv.d.ts","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwCxB"}
@@ -6,17 +6,14 @@
6
6
  * @layer core
7
7
  * @boundedContext worker-lifecycle
8
8
  *
9
- * 与已删的 workerAnthropicEnv 的区别:那个读全局 agents.worker、只认 codex-proxy;这个纯入参驱动。
10
9
  */
11
- import { CODEX_PROXY_ID, codexProxyBaseUrl } from './sidecar/CodexProxyManager.js';
12
10
  import { getProvider } from '../../providers/llm/providers.js';
13
11
  /**
14
12
  * 由 model + providerId 解析出 worker 该带的 env:
15
13
  * - `ANTHROPIC_MODEL = model`(有 model 才设)
16
- * - `providerId === 'codex-proxy'`BASE_URL 指本地 proxy + AUTH_TOKEN='sps-local'
17
- * - 第三方 anthropic 端点(既非 codex-proxy 也非 official/空)→ 从 providers.json 取 baseUrl/apiKey
14
+ * - 第三方 anthropic 端点(非 official/空) providers.json baseUrl/apiKey
18
15
  * - `providerId === 'official'` 或空 → 只设 ANTHROPIC_MODEL(用官方订阅端点)
19
- * - 任意第三方端点(codex-proxy / 三方)额外设 `CLAUDE_CODE_ATTRIBUTION_HEADER=0`(改善第三方缓存命中)
16
+ * - 第三方端点额外设 `CLAUDE_CODE_ATTRIBUTION_HEADER=0`(改善第三方缓存命中)
20
17
  *
21
18
  * 空对象 = 无需注入(既没 model 也没自定义端点)。
22
19
  */
@@ -26,17 +23,7 @@ export function resolveWorkerModelEnv(model, providerId) {
26
23
  if (m)
27
24
  env.ANTHROPIC_MODEL = m;
28
25
  const pid = providerId?.trim();
29
- if (pid === CODEX_PROXY_ID) {
30
- env.ANTHROPIC_BASE_URL = codexProxyBaseUrl();
31
- env.ANTHROPIC_AUTH_TOKEN = 'sps-local';
32
- // claude-code-proxy 要求(否则 Claude Code 启动/后台任务打空 proxy 未实现的端点 → worker 挂):
33
- // 小/快模型也走 proxy;禁非必要流量(warmup/telemetry 等)。
34
- // 🔴 SMALL_FAST 必须落在与主模型同一后端(proxy 按 model 路由):gpt-* → codex 的 mini;
35
- // kimi/cursor 等非 gpt 主模型 → 用主模型自身兜底(保证可路由、不误触发 codex 登录)。
36
- env.ANTHROPIC_SMALL_FAST_MODEL = m && !/^gpt-/i.test(m) ? m : 'gpt-5.4-mini';
37
- env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = '1';
38
- }
39
- else if (pid && pid !== 'official') {
26
+ if (pid && pid !== 'official') {
40
27
  const provider = getProvider(pid);
41
28
  if (provider?.baseUrl)
42
29
  env.ANTHROPIC_BASE_URL = provider.baseUrl;
@@ -62,7 +49,7 @@ export function resolveWorkerModelEnv(model, providerId) {
62
49
  }
63
50
  }
64
51
  }
65
- // 第三方端点(codex-proxy / 三方 anthropic 兼容)→ 关掉逐请求变化的归因头。
52
+ // 第三方 anthropic 兼容端点 → 关掉逐请求变化的归因头。
66
53
  // Claude Code 2.1.x 把 `x-anthropic-billing-header`(含每请求都变的 cc_prev_req)作为一段
67
54
  // 系统提示词注入;第三方 API 会把它算进 prompt-cache key → 每次 key 不同 → 缓存命中率归零、
68
55
  // token 暴涨、变慢。设 CLAUDE_CODE_ATTRIBUTION_HEADER=0 让 Claude Code 不注入该段。
@@ -1 +1 @@
1
- {"version":3,"file":"workerModelEnv.js","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAAmB;IAEnB,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC;QAAE,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAE/B,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;QAC3B,GAAG,CAAC,kBAAkB,GAAG,iBAAiB,EAAE,CAAC;QAC7C,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC;QACvC,0EAA0E;QAC1E,4CAA4C;QAC5C,qEAAqE;QACrE,6DAA6D;QAC7D,GAAG,CAAC,0BAA0B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QAC7E,GAAG,CAAC,wCAAwC,GAAG,GAAG,CAAC;IACrD,CAAC;SAAM,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,OAAO;YAAE,GAAG,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjE,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACtB,wDAAwD;YACxD,wDAAwD;YACxD,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC;YACvC,GAAG,CAAC,4BAA4B,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,kEAAkE;QAClE,kEAAkE;QAClE,MAAM,KAAK,GAAI,QAA+C,EAAE,QAAQ,CAAC;QACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBACtE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,4EAA4E;IAC5E,gEAAgE;IAChE,sEAAsE;IACtE,mDAAmD;IACnD,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"workerModelEnv.js","sourceRoot":"","sources":["../../../src/core/agents/workerModelEnv.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAc,EACd,UAAmB;IAEnB,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,MAAM,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC;QAAE,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;IAE/B,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/B,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,OAAO;YAAE,GAAG,CAAC,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjE,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACtB,wDAAwD;YACxD,wDAAwD;YACxD,GAAG,CAAC,oBAAoB,GAAG,QAAQ,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC;YACN,4DAA4D;YAC5D,GAAG,CAAC,6BAA6B,GAAG,CAAC,CAAC;YACtC,GAAG,CAAC,8BAA8B,GAAG,CAAC,CAAC;YACvC,GAAG,CAAC,4BAA4B,GAAG,CAAC,CAAC;YACrC,GAAG,CAAC,0BAA0B,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,kEAAkE;QAClE,kEAAkE;QAClE,MAAM,KAAK,GAAI,QAA+C,EAAE,QAAQ,CAAC;QACzE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBACtE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,4EAA4E;IAC5E,gEAAgE;IAChE,sEAAsE;IACtE,mDAAmD;IACnD,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"markerFile.d.ts","sourceRoot":"","sources":["../../src/core/markerFile.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,EAChC,KAAK,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,IAAI,CAeN;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC/B,IAAI,CAeN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiB7F"}
1
+ {"version":3,"file":"markerFile.d.ts","sourceRoot":"","sources":["../../src/core/markerFile.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sFAAsF;IACtF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,EAChC,KAAK,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,IAAI,CAeN;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3C,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC/B,IAAI,CAeN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiB7F"}
@@ -17,6 +17,7 @@
17
17
  * - 原因:claude 子进程 env 在 spawn 时冻结;多卡复用时 env 会 stale。hook
18
18
  * 脚本必须通过文件反查当前卡,不能信 env。
19
19
  */
20
+ import { uniqueTmpPath } from '../infra/filesystem.js';
20
21
  import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
21
22
  import { dirname, resolve } from 'node:path';
22
23
  import { workerMarkerFile } from '../shared/runtimePaths.js';
@@ -44,7 +45,7 @@ export function getMarkerPathFromStateFile(stateFile, slot) {
44
45
  */
45
46
  export function writeCurrentCardFile(finalPath, cardId, stage, onError, extra) {
46
47
  try {
47
- const tmpPath = `${finalPath}.tmp`;
48
+ const tmpPath = uniqueTmpPath(finalPath); // 唯一名:见 filesystem.uniqueTmpPath
48
49
  const payload = {
49
50
  cardId,
50
51
  stage,
@@ -74,7 +75,7 @@ export function patchCurrentCardFile(finalPath, patch, onError) {
74
75
  ...(patch.sessionId ? { sessionId: patch.sessionId } : {}),
75
76
  ...(patch.pid !== undefined ? { pid: patch.pid } : {}),
76
77
  };
77
- const tmpPath = `${finalPath}.tmp`;
78
+ const tmpPath = uniqueTmpPath(finalPath); // 唯一名:见 filesystem.uniqueTmpPath
78
79
  writeFileSync(tmpPath, JSON.stringify(merged));
79
80
  renameSync(tmpPath, finalPath);
80
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"markerFile.js","sourceRoot":"","sources":["../../src/core/markerFile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markerFile.js","sourceRoot":"","sources":["../../src/core/markerFile.ts"],"names":[],"mappings":"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"}
@@ -23,8 +23,17 @@ export declare function memoryMode(): MemoryMode;
23
23
  export declare function isMemoryOff(): boolean;
24
24
  /** 是否启用 LLM 蒸馏捕获(SPS_MEMORY_DISTILL=on)。关则走规则版(取末尾结论段)。 */
25
25
  export declare function distillEnabled(): boolean;
26
- /** 蒸馏用的 LLM 端点(Anthropic 兼容)。默认 claude-code-proxy(ChatGPT 订阅)。 */
26
+ /**
27
+ * 蒸馏用的 LLM 端点(Anthropic 兼容)。**无缺省**——必须显式配 SPS_MEMORY_DISTILL_URL,
28
+ * 未配则蒸馏不生效(回落规则版)。历史上缺省指向 claude-code-proxy,该 sidecar 已移除;
29
+ * 蒸馏是后台高频杂活,配一个便宜的第三方 key 端点即可,别占订阅配额。
30
+ */
27
31
  export declare function distillUrl(): string;
28
- /** 蒸馏模型名。默认便宜快的 claude-haiku-4-5。 */
32
+ /** 蒸馏模型名(随端点定,无缺省)。 */
29
33
  export declare function distillModel(): string;
34
+ /**
35
+ * 蒸馏端点的 API key:优先 SPS_MEMORY_DISTILL_KEY,否则从 LLM provider 注册表按 baseUrl
36
+ * 匹配取(密钥单一真源在注册表,不用手抄一份到 env)。取不到返空串。
37
+ */
38
+ export declare function distillApiKey(): string;
30
39
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,MAAM,CAAC;AAW1E,wDAAwD;AACxD,wBAAgB,mBAAmB,IAAI,IAAI,CAAqB;AAEhE,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzD;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,IAAI,UAAU,CAIvC;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAID,2DAA2D;AAC3D,wBAAgB,cAAc,IAAI,OAAO,CAExC;AACD,kEAAkE;AAClE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AACD,qCAAqC;AACrC,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,gBAAgB,GAAG,UAAU,GAAG,MAAM,CAAC;AAW1E,wDAAwD;AACxD,wBAAgB,mBAAmB,IAAI,IAAI,CAAqB;AAEhE,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzD;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,IAAI,UAAU,CAIvC;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAID,2DAA2D;AAC3D,wBAAgB,cAAc,IAAI,OAAO,CAExC;AACD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AACD,uBAAuB;AACvB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AACD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAWtC"}
@@ -13,6 +13,7 @@
13
13
  * @boundedContext memory
14
14
  */
15
15
  import { loadGlobalEnv } from '../config.js';
16
+ import { listProviders } from '../../providers/llm/providers.js';
16
17
  // ~/.coral/env 的缓存:console/daemon/CLI 启动不会把它注入 process.env,故 memory 配置需自己回落读它。
17
18
  // 但显式设了 SPS_MEMORY_ROOT(测试/隔离场景)则不回落全局 env,避免读到真实配置污染隔离环境。
18
19
  let _fileEnv = null;
@@ -51,12 +52,35 @@ export function isMemoryOff() {
51
52
  export function distillEnabled() {
52
53
  return (memoryEnv('SPS_MEMORY_DISTILL') ?? '').toLowerCase() === 'on';
53
54
  }
54
- /** 蒸馏用的 LLM 端点(Anthropic 兼容)。默认 claude-code-proxy(ChatGPT 订阅)。 */
55
+ /**
56
+ * 蒸馏用的 LLM 端点(Anthropic 兼容)。**无缺省**——必须显式配 SPS_MEMORY_DISTILL_URL,
57
+ * 未配则蒸馏不生效(回落规则版)。历史上缺省指向 claude-code-proxy,该 sidecar 已移除;
58
+ * 蒸馏是后台高频杂活,配一个便宜的第三方 key 端点即可,别占订阅配额。
59
+ */
55
60
  export function distillUrl() {
56
- return (memoryEnv('SPS_MEMORY_DISTILL_URL') ?? 'http://127.0.0.1:18765').replace(/\/+$/, '');
61
+ return (memoryEnv('SPS_MEMORY_DISTILL_URL') ?? '').replace(/\/+$/, '');
57
62
  }
58
- /** 蒸馏模型名。默认便宜快的 claude-haiku-4-5。 */
63
+ /** 蒸馏模型名(随端点定,无缺省)。 */
59
64
  export function distillModel() {
60
- return memoryEnv('SPS_MEMORY_DISTILL_MODEL') ?? 'claude-haiku-4-5';
65
+ return memoryEnv('SPS_MEMORY_DISTILL_MODEL') ?? '';
66
+ }
67
+ /**
68
+ * 蒸馏端点的 API key:优先 SPS_MEMORY_DISTILL_KEY,否则从 LLM provider 注册表按 baseUrl
69
+ * 匹配取(密钥单一真源在注册表,不用手抄一份到 env)。取不到返空串。
70
+ */
71
+ export function distillApiKey() {
72
+ const explicit = memoryEnv('SPS_MEMORY_DISTILL_KEY');
73
+ if (explicit)
74
+ return explicit;
75
+ const url = distillUrl();
76
+ if (!url)
77
+ return '';
78
+ try {
79
+ const hit = listProviders('anthropic').find((p) => (p.baseUrl ?? '').replace(/\/+$/, '') === url);
80
+ return hit?.apiKey ?? '';
81
+ }
82
+ catch {
83
+ return '';
84
+ }
61
85
  }
62
86
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/memory2/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C,+EAA+E;AAC/E,2DAA2D;AAC3D,IAAI,QAAQ,GAAkC,IAAI,CAAC;AACnD,SAAS,OAAO;IACd,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC;QAAC,QAAQ,GAAG,aAAa,EAA4B,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC;IAAC,CAAC;IACtF,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,KAAW,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;AAEhE,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,gBAAgB;QAAE,OAAO,GAAG,CAAC;IACjF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,EAAE,KAAK,MAAM,CAAC;AACjC,CAAC;AAED,iDAAiD;AAEjD,2DAA2D;AAC3D,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;AACxE,CAAC;AACD,kEAAkE;AAClE,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,SAAS,CAAC,wBAAwB,CAAC,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/F,CAAC;AACD,qCAAqC;AACrC,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,0BAA0B,CAAC,IAAI,kBAAkB,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/memory2/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAIjE,+EAA+E;AAC/E,2DAA2D;AAC3D,IAAI,QAAQ,GAAkC,IAAI,CAAC;AACnD,SAAS,OAAO;IACd,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,EAAE,CAAC;IAC3C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC;QAAC,QAAQ,GAAG,aAAa,EAA4B,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC;IAAC,CAAC;IACtF,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,KAAW,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;AAEhE,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,gBAAgB;QAAE,OAAO,GAAG,CAAC;IACjF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,EAAE,KAAK,MAAM,CAAC;AACjC,CAAC;AAED,iDAAiD;AAEjD,2DAA2D;AAC3D,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;AACxE,CAAC;AACD;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,SAAS,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AACD,uBAAuB;AACvB,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC;AACD;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;QAClG,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/distill.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyCD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAuB3F"}
1
+ {"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../../src/core/memory2/distill.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAyCD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,CAwB3F"}
@@ -2,12 +2,13 @@
2
2
  * @module core/memory2/distill
3
3
  * @description LLM 蒸馏(设计 §5,SPS_MEMORY_DISTILL=on):把一张卡/会话的**完整归一化叙述**交给便宜 LLM,
4
4
  * 提炼成 0–N 条**可复用、耐用**的原子记忆(决策/约定/坑/模式/架构),而非规则版只取末尾一段。
5
- * 走 Anthropic 兼容端点(默认 claude-code-proxy :18765 / claude-haiku-4-5,即用户 ChatGPT 订阅)。
5
+ * 走 **显式配置**的 Anthropic 兼容端点(SPS_MEMORY_DISTILL_URL/_MODEL,key provider
6
+ * 注册表按 baseUrl 取)。未配端点 = 蒸馏不生效,调用方回落规则版。
6
7
  * 红线:输入来自 subscribe 的归一化文本,不碰 jsonl。任何失败 → 返 null,调用方回退规则版。
7
8
  * @layer core
8
9
  * @boundedContext memory
9
10
  */
10
- import { distillModel, distillUrl } from './config.js';
11
+ import { distillApiKey, distillModel, distillUrl } from './config.js';
11
12
  import { MEMORY_CATEGORIES } from './types.js';
12
13
  const MAX_INPUT_CHARS = 20000; // 太长取末尾(结论/近期决策在后)
13
14
  const REQUEST_TIMEOUT_MS = 30000;
@@ -60,7 +61,8 @@ function parseMemories(text) {
60
61
  */
61
62
  export async function distillNarrative(narrative) {
62
63
  const url = distillUrl();
63
- if (!url || !narrative.trim())
64
+ const model = distillModel();
65
+ if (!url || !model || !narrative.trim())
64
66
  return null;
65
67
  const input = narrative.length > MAX_INPUT_CHARS ? narrative.slice(-MAX_INPUT_CHARS) : narrative;
66
68
  const ac = new AbortController();
@@ -68,8 +70,8 @@ export async function distillNarrative(narrative) {
68
70
  try {
69
71
  const r = await fetch(`${url}/v1/messages`, {
70
72
  method: 'POST',
71
- headers: { 'content-type': 'application/json', 'x-api-key': 'sps-memory-distill', 'anthropic-version': '2023-06-01' },
72
- body: JSON.stringify({ model: distillModel(), max_tokens: 1500, messages: [{ role: 'user', content: PROMPT(input) }] }),
73
+ headers: { 'content-type': 'application/json', 'x-api-key': distillApiKey(), 'anthropic-version': '2023-06-01' },
74
+ body: JSON.stringify({ model, max_tokens: 1500, messages: [{ role: 'user', content: PROMPT(input) }] }),
73
75
  signal: ac.signal,
74
76
  });
75
77
  if (!r.ok)
@@ -1 +1 @@
1
- {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../../src/core/memory2/distill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"distill.js","sourceRoot":"","sources":["../../../src/core/memory2/distill.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAUpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMnE"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAUpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMnE"}
@@ -13,6 +13,7 @@
13
13
  * @layer core
14
14
  * @boundedContext pipeline
15
15
  */
16
+ import { uniqueTmpPath } from '../infra/filesystem.js';
16
17
  import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
17
18
  /**
18
19
  * Read pipeline_order.json — a pure array of seq numbers.
@@ -36,7 +37,7 @@ export function readQueue(filePath) {
36
37
  * Atomic write of pipeline_order.json.
37
38
  */
38
39
  export function writeQueue(filePath, queue) {
39
- const tmpFile = filePath + '.tmp';
40
+ const tmpFile = uniqueTmpPath(filePath); // 唯一名:固定 .tmp 在并发写下会撕裂
40
41
  writeFileSync(tmpFile, JSON.stringify(queue, null, 2) + '\n');
41
42
  renameSync(tmpFile, filePath);
42
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9E;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAe;IAC1D,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/core/queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE9E;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,KAAe;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB;IAChE,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAW;IAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACpC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reclaimConfig.d.ts","sourceRoot":"","sources":["../../src/core/reclaimConfig.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,oBAAoB;AACpB,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAED,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGvD"}
1
+ {"version":3,"file":"reclaimConfig.d.ts","sourceRoot":"","sources":["../../src/core/reclaimConfig.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAQ1C,oBAAoB;AACpB,wBAAgB,iBAAiB,IAAI,MAAM,CAgB1C;AAED,4BAA4B;AAC5B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIvD"}