@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"codexProxy.d.ts","sourceRoot":"","sources":["../../../src/console/routes/codexProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAY5B,wBAAgB,qBAAqB,IAAI,IAAI,CAyD5C"}
@@ -1,68 +0,0 @@
1
- /**
2
- * @module console/routes/codexProxy
3
- * @description codex-proxy(ChatGPT 订阅→GPT)卡片的后端:状态 / 安装 / 卸载 / browser PKCE 授权。
4
- * console 插件→模型页的 codex-proxy 卡按此状态机渲染。生命周期全在 CodexProxyManager,
5
- * 本路由只做 HTTP 包装 + 单飞锁 + 卸载时回退 worker 配置。
6
- * @layer delivery
7
- * @boundedContext worker-lifecycle
8
- */
9
- import { Hono } from 'hono';
10
- import { loadAgentsConfig, saveAgentsConfig } from '../../core/intel/agentsConfig.js';
11
- import { detectCodexSub } from '../../providers/llm/localSubscription.js';
12
- import { CODEX_PROXY_ID, cancelCodexAuth, codexProxyStatus, installCodexProxy, startCodexAuthBrowser, uninstallCodexProxy, } from '../../core/agents/sidecar/CodexProxyManager.js';
13
- export function createCodexProxyRoute() {
14
- const app = new Hono();
15
- let installing = false; // 单飞:防重复安装
16
- // 卡片状态(前端每次实时查)。本机 Codex 登录与 proxy 独立授权分开报告,避免误判为没有 ChatGPT 订阅。
17
- app.get('/', async (c) => {
18
- const nativeCodex = detectCodexSub();
19
- return c.json({
20
- data: {
21
- ...(await codexProxyStatus()),
22
- installing,
23
- nativeCodex: { available: nativeCodex.available, detail: nativeCodex.detail },
24
- },
25
- });
26
- });
27
- // 安装(跑官方 install.sh;单飞;阻塞返回,前端 spinner)。
28
- app.post('/install', async (c) => {
29
- if (installing)
30
- return c.json({ type: 'conflict', title: '安装进行中', status: 409 }, 409);
31
- installing = true;
32
- try {
33
- const r = await installCodexProxy();
34
- return c.json({ data: r });
35
- }
36
- finally {
37
- installing = false;
38
- }
39
- });
40
- // 卸载:停 proxy + 删二进制;?purgeAuth=1 连授权一并删。若当前 worker=codex-proxy 则回退配置。
41
- app.delete('/', (c) => {
42
- const purgeAuth = c.req.query('purgeAuth') === '1' || c.req.query('purgeAuth') === 'true';
43
- const agents = loadAgentsConfig();
44
- if (agents.worker.providerId === CODEX_PROXY_ID) {
45
- const worker = { ...agents.worker };
46
- delete worker.providerId; // 回落官方订阅,避免悬空
47
- saveAgentsConfig({ ...agents, worker });
48
- }
49
- return c.json({ data: uninstallCodexProxy(purgeAuth) });
50
- });
51
- // 起 browser PKCE 授权流,返回授权 URL(前端展示 + 轮询 status 至 authed)。
52
- app.post('/auth/start', async (c) => {
53
- try {
54
- const info = await startCodexAuthBrowser();
55
- return c.json({ data: info });
56
- }
57
- catch (e) {
58
- return c.json({ type: 'internal', title: e instanceof Error ? e.message : String(e), status: 500 }, 500);
59
- }
60
- });
61
- // 取消授权流(杀子进程)。
62
- app.post('/auth/cancel', (c) => {
63
- cancelCodexAuth();
64
- return c.json({ data: { ok: true } });
65
- });
66
- return app;
67
- }
68
- //# sourceMappingURL=codexProxy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codexProxy.js","sourceRoot":"","sources":["../../../src/console/routes/codexProxy.ts"],"names":[],"mappings":"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"}
@@ -1,79 +0,0 @@
1
- /** provider id:codex-proxy 端点(ChatGPT 订阅经 claude-code-proxy)。console 卡片/端点用。 */
2
- export declare const CODEX_PROXY_ID = "codex-proxy";
3
- /** 官方安装脚本(检测 os/arch→下 release 二进制→/usr/local/bin 或 ~/.local/bin)。 */
4
- export declare const CODEX_PROXY_INSTALL_SH = "https://raw.githubusercontent.com/raine/claude-code-proxy/main/scripts/install.sh";
5
- /** 默认展示的主力模型(用户指定);「显示全部」再列 codexProxyModels().all。 */
6
- export declare const CODEX_PROXY_CURATED_MODELS: string[];
7
- export interface CodexProxyStatus {
8
- running: boolean;
9
- healthy: boolean;
10
- pid: number | null;
11
- baseUrl: string;
12
- binInstalled: boolean;
13
- authed: boolean;
14
- authInProgress: boolean;
15
- authError?: string;
16
- account?: string;
17
- expires?: string;
18
- /** 主力模型(常显)+ 全部 gpt-*(「显示全部」用)。 */
19
- models: {
20
- curated: string[];
21
- all: string[];
22
- };
23
- }
24
- /** 监听端口(可 SPS_CODEX_PROXY_PORT 覆盖)。 */
25
- export declare function codexProxyPort(): number;
26
- /** worker 该指向的本地端点(P0 helper 的默认端点单一来源)。 */
27
- export declare function codexProxyBaseUrl(): string;
28
- /** 找二进制:先 `which`,再兜底扫 install.sh 常落的两处(console 进程 PATH 可能不含)。缺则 null。 */
29
- export declare function codexProxyBinPath(): string | null;
30
- export interface CodexAuth {
31
- authed: boolean;
32
- account?: string;
33
- expires?: string;
34
- }
35
- /** 授权判据:`codex auth status`(exit 0 + Account/Expires)。比查文件准(跨 Keychain)。 */
36
- export declare function codexProxyAuthed(): CodexAuth;
37
- /** 列模型:curated=主力名单;all=`claude-code-proxy models` 的 codex 行里全部 gpt-*。 */
38
- export declare function codexProxyModels(): {
39
- curated: string[];
40
- all: string[];
41
- };
42
- export declare function codexProxyStatus(): Promise<CodexProxyStatus>;
43
- /**
44
- * 幂等确保 proxy 在跑:已健康→直接返回;否则装检→spawn 后台单例→轮询 /healthz。
45
- * @throws 二进制缺失(带安装指引)/ 起后健康检查超时。
46
- */
47
- export declare function ensureCodexProxyRunning(): Promise<{
48
- baseUrl: string;
49
- }>;
50
- /**
51
- * 逐项目保活:项目的 `.claude/settings.local.json` 的 env.ANTHROPIC_BASE_URL 指向本地 proxy 时,
52
- * 确保 proxy 在跑;否则 no-op。codex-proxy 现是"逐项目端点"(写在 settings.local.json),不再全局。
53
- * 读不到/未指向 proxy → 不启动。tick / chat 派活前调。
54
- */
55
- export declare function ensureCodexProxyForCwd(cwd: string | undefined): Promise<void>;
56
- /** 停后台单例(kill + 清 pidfile)。返回是否有实例被停。 */
57
- export declare function stopCodexProxy(): boolean;
58
- /** 跑官方 install.sh(异步捕获输出,不阻塞事件循环)。curl 缺失或失败 → ok=false。 */
59
- export declare function installCodexProxy(): Promise<{
60
- ok: boolean;
61
- output: string;
62
- }>;
63
- /** 卸载:停 proxy + 删二进制;purgeAuth 才连授权目录一并删。best-effort。 */
64
- export declare function uninstallCodexProxy(purgeAuth: boolean): {
65
- ok: boolean;
66
- note?: string;
67
- };
68
- export interface BrowserAuthInfo {
69
- authorizationUrl?: string;
70
- }
71
- /**
72
- * 起 browser PKCE 授权流:spawn `codex auth login`,从 stdout 抓授权 URL 返回给前端。
73
- * 子进程监听 localhost:1455 等待浏览器回调;授权完成后自身退出。前端轮询 status 至 authed。
74
- * 已在跑 → 返回同一个 Promise(幂等)。
75
- */
76
- export declare function startCodexAuthBrowser(): Promise<BrowserAuthInfo>;
77
- /** 取消/回收 device 授权子进程。 */
78
- export declare function cancelCodexAuth(): void;
79
- //# sourceMappingURL=CodexProxyManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexProxyManager.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/sidecar/CodexProxyManager.ts"],"names":[],"mappings":"AAgBA,gFAAgF;AAChF,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAE5C,sEAAsE;AACtE,eAAO,MAAM,sBAAsB,sFAAsF,CAAC;AAE1H,uDAAuD;AACvD,eAAO,MAAM,0BAA0B,UAA0D,CAAC;AAUlG,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC9C;AAED,uCAAuC;AACvC,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CASjD;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,SAAS,CAW5C;AAED,0EAA0E;AAC1E,wBAAgB,gBAAgB,IAAI;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,CAWvE;AA8BD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAkBlE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC5E;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnF;AAED,yCAAyC;AACzC,wBAAgB,cAAc,IAAI,OAAO,CAqBxC;AAID,4DAA4D;AAC5D,wBAAgB,iBAAiB,IAAI,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAY5E;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBtF;AAID,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CA4EhE;AAED,0BAA0B;AAC1B,wBAAgB,eAAe,IAAI,IAAI,CAYtC"}
@@ -1,359 +0,0 @@
1
- /**
2
- * @module core/agents/sidecar/CodexProxyManager
3
- * @description claude-code-proxy(ChatGPT 订阅→Anthropic 兼容翻译)的进程管家。P1:把"保持运行"
4
- * 自动化——按需拉起后台单例 `claude-code-proxy serve`(跨 tick/项目共享),健康检查,停。
5
- * **不含任何翻译逻辑**——翻译全在外部二进制;本管家只做生命周期(装检/授权检/起/健康/停)。
6
- * @layer core
7
- * @boundedContext worker-lifecycle
8
- *
9
- * 边界(尽量解耦):只在进程边界打交道——二进制 `claude-code-proxy` + HTTP `/healthz` + 独立授权。
10
- * 换成别的 sidecar(如 CLIProxyAPI)= 只改本文件的 spawn/健康端点,别处不动。
11
- */
12
- import { spawn, spawnSync } from 'node:child_process';
13
- import { existsSync, mkdirSync, openSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
14
- import { homedir } from 'node:os';
15
- import { join } from 'node:path';
16
- /** provider id:codex-proxy 端点(ChatGPT 订阅经 claude-code-proxy)。console 卡片/端点用。 */
17
- export const CODEX_PROXY_ID = 'codex-proxy';
18
- /** 官方安装脚本(检测 os/arch→下 release 二进制→/usr/local/bin 或 ~/.local/bin)。 */
19
- export const CODEX_PROXY_INSTALL_SH = 'https://raw.githubusercontent.com/raine/claude-code-proxy/main/scripts/install.sh';
20
- /** 默认展示的主力模型(用户指定);「显示全部」再列 codexProxyModels().all。 */
21
- export const CODEX_PROXY_CURATED_MODELS = ['gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.3-codex'];
22
- const BIN = 'claude-code-proxy';
23
- const DEFAULT_PORT = 18765; // claude-code-proxy README 默认
24
- const DIR = join(homedir(), '.coral', 'codex-proxy');
25
- const PID_FILE = join(DIR, 'proxy.pid');
26
- const LOG_FILE = join(DIR, 'proxy.log');
27
- // proxy 自管认证的存储目录(卸载时可选清除)。
28
- const AUTH_DIR = join(homedir(), '.config', 'claude-code-proxy');
29
- /** 监听端口(可 SPS_CODEX_PROXY_PORT 覆盖)。 */
30
- export function codexProxyPort() {
31
- const n = Number(process.env.SPS_CODEX_PROXY_PORT);
32
- return Number.isFinite(n) && n > 0 ? n : DEFAULT_PORT;
33
- }
34
- /** worker 该指向的本地端点(P0 helper 的默认端点单一来源)。 */
35
- export function codexProxyBaseUrl() {
36
- return `http://127.0.0.1:${codexProxyPort()}`;
37
- }
38
- /** 找二进制:先 `which`,再兜底扫 install.sh 常落的两处(console 进程 PATH 可能不含)。缺则 null。 */
39
- export function codexProxyBinPath() {
40
- const r = spawnSync('which', [BIN], { encoding: 'utf-8' });
41
- const p = r.stdout?.trim();
42
- if (r.status === 0 && p)
43
- return p;
44
- for (const dir of [join(homedir(), '.local', 'bin'), '/usr/local/bin']) {
45
- const cand = join(dir, BIN);
46
- if (existsSync(cand))
47
- return cand;
48
- }
49
- return null;
50
- }
51
- /** 授权判据:`codex auth status`(exit 0 + Account/Expires)。比查文件准(跨 Keychain)。 */
52
- export function codexProxyAuthed() {
53
- const bin = codexProxyBinPath();
54
- if (!bin)
55
- return { authed: false };
56
- const r = spawnSync(bin, ['codex', 'auth', 'status'], { encoding: 'utf-8' });
57
- if (r.status !== 0)
58
- return { authed: false };
59
- const out = r.stdout ?? '';
60
- return {
61
- authed: true,
62
- account: /Account:\s*(\S+)/.exec(out)?.[1],
63
- expires: /Expires:\s*(\S+)/.exec(out)?.[1],
64
- };
65
- }
66
- /** 列模型:curated=主力名单;all=`claude-code-proxy models` 的 codex 行里全部 gpt-*。 */
67
- export function codexProxyModels() {
68
- const bin = codexProxyBinPath();
69
- if (!bin)
70
- return { curated: CODEX_PROXY_CURATED_MODELS, all: [] };
71
- const r = spawnSync(bin, ['models'], { encoding: 'utf-8' });
72
- const line = (r.stdout ?? '').split('\n').find((l) => l.trim().startsWith('codex:')) ?? '';
73
- const all = line
74
- .replace(/^\s*codex:\s*/, '')
75
- .split(',')
76
- .map((s) => s.trim())
77
- .filter((m) => m.startsWith('gpt-'));
78
- return { curated: CODEX_PROXY_CURATED_MODELS, all };
79
- }
80
- function readPid() {
81
- try {
82
- const n = Number(readFileSync(PID_FILE, 'utf-8').trim());
83
- return Number.isFinite(n) && n > 0 ? n : null;
84
- }
85
- catch {
86
- return null;
87
- }
88
- }
89
- function alive(pid) {
90
- try {
91
- process.kill(pid, 0);
92
- return true;
93
- }
94
- catch {
95
- return false;
96
- }
97
- }
98
- async function healthz() {
99
- try {
100
- const ctl = AbortSignal.timeout(2000);
101
- const res = await fetch(`${codexProxyBaseUrl()}/healthz`, { signal: ctl });
102
- return res.ok;
103
- }
104
- catch {
105
- return false;
106
- }
107
- }
108
- export async function codexProxyStatus() {
109
- const pid = readPid();
110
- const running = pid != null && alive(pid);
111
- const installed = codexProxyBinPath() != null;
112
- const auth = installed ? codexProxyAuthed() : { authed: false };
113
- return {
114
- running,
115
- healthy: running ? await healthz() : false,
116
- pid,
117
- baseUrl: codexProxyBaseUrl(),
118
- binInstalled: installed,
119
- authed: auth.authed,
120
- authInProgress: authChild != null,
121
- authError,
122
- account: auth.account,
123
- expires: auth.expires,
124
- models: installed && auth.authed ? codexProxyModels() : { curated: CODEX_PROXY_CURATED_MODELS, all: [] },
125
- };
126
- }
127
- /**
128
- * 幂等确保 proxy 在跑:已健康→直接返回;否则装检→spawn 后台单例→轮询 /healthz。
129
- * @throws 二进制缺失(带安装指引)/ 起后健康检查超时。
130
- */
131
- export async function ensureCodexProxyRunning() {
132
- const baseUrl = codexProxyBaseUrl();
133
- if (await healthz())
134
- return { baseUrl }; // 已有健康实例(可能别处起的),复用
135
- const bin = codexProxyBinPath();
136
- if (!bin) {
137
- throw new Error(`未找到 ${BIN}。安装:预编译 release / \`brew install raine/claude-code-proxy/claude-code-proxy\`;` +
138
- `然后授权一次:\`${BIN} codex auth login\``);
139
- }
140
- if (!codexProxyAuthed().authed) {
141
- // 未授权只告警不硬拦(起了也能报错更直观);授权:sps codex-proxy auth。
142
- log(`未授权;若 worker 请求失败请跑 \`${BIN} codex auth login\`(或 sps codex-proxy auth)`);
143
- }
144
- mkdirSync(DIR, { recursive: true });
145
- const out = openSync(LOG_FILE, 'a');
146
- const child = spawn(bin, ['serve'], {
147
- detached: true, // 后台单例,跨 tick 存活
148
- stdio: ['ignore', out, out],
149
- env: { ...process.env, PORT: String(codexProxyPort()), CCP_LOG_STDERR: '1' },
150
- });
151
- child.unref();
152
- if (child.pid)
153
- writeFileSync(PID_FILE, String(child.pid));
154
- log(`已拉起 ${BIN} serve(pid ${child.pid}, ${baseUrl},日志 ${LOG_FILE})`);
155
- // 轮询健康,最多 ~15s
156
- for (let i = 0; i < 30; i++) {
157
- if (await healthz())
158
- return { baseUrl };
159
- await new Promise((r) => setTimeout(r, 500));
160
- }
161
- throw new Error(`${BIN} 起了但 ${baseUrl}/healthz 15s 内未就绪,查日志 ${LOG_FILE}`);
162
- }
163
- /**
164
- * 逐项目保活:项目的 `.claude/settings.local.json` 的 env.ANTHROPIC_BASE_URL 指向本地 proxy 时,
165
- * 确保 proxy 在跑;否则 no-op。codex-proxy 现是"逐项目端点"(写在 settings.local.json),不再全局。
166
- * 读不到/未指向 proxy → 不启动。tick / chat 派活前调。
167
- */
168
- export async function ensureCodexProxyForCwd(cwd) {
169
- if (!cwd)
170
- return;
171
- try {
172
- const p = join(cwd, '.claude', 'settings.local.json');
173
- if (!existsSync(p))
174
- return;
175
- const j = JSON.parse(readFileSync(p, 'utf-8'));
176
- if (j?.env?.ANTHROPIC_BASE_URL === codexProxyBaseUrl())
177
- await ensureCodexProxyRunning();
178
- }
179
- catch {
180
- /* 读不到 / 坏文件 → 不保活 */
181
- }
182
- }
183
- /** 停后台单例(kill + 清 pidfile)。返回是否有实例被停。 */
184
- export function stopCodexProxy() {
185
- const pid = readPid();
186
- if (pid == null || !alive(pid)) {
187
- try {
188
- rmSync(PID_FILE, { force: true });
189
- }
190
- catch {
191
- /* noop */
192
- }
193
- return false;
194
- }
195
- try {
196
- process.kill(pid, 'SIGTERM');
197
- }
198
- catch {
199
- /* 已死 */
200
- }
201
- try {
202
- rmSync(PID_FILE, { force: true });
203
- }
204
- catch {
205
- /* noop */
206
- }
207
- return true;
208
- }
209
- // ── 安装 / 卸载 ─────────────────────────────────────────────────
210
- /** 跑官方 install.sh(异步捕获输出,不阻塞事件循环)。curl 缺失或失败 → ok=false。 */
211
- export function installCodexProxy() {
212
- return new Promise((resolve) => {
213
- if (spawnSync('which', ['curl']).status !== 0) {
214
- return resolve({ ok: false, output: '需要 curl 才能运行官方安装脚本' });
215
- }
216
- let output = '';
217
- const child = spawn('bash', ['-c', `curl -fsSL ${CODEX_PROXY_INSTALL_SH} | bash`], { stdio: ['ignore', 'pipe', 'pipe'] });
218
- child.stdout?.on('data', (d) => (output += d.toString()));
219
- child.stderr?.on('data', (d) => (output += d.toString()));
220
- child.on('close', (code) => resolve({ ok: code === 0 && codexProxyBinPath() != null, output }));
221
- child.on('error', (e) => resolve({ ok: false, output: output + String(e) }));
222
- });
223
- }
224
- /** 卸载:停 proxy + 删二进制;purgeAuth 才连授权目录一并删。best-effort。 */
225
- export function uninstallCodexProxy(purgeAuth) {
226
- stopCodexProxy();
227
- const bin = codexProxyBinPath();
228
- if (bin) {
229
- try {
230
- rmSync(bin, { force: true });
231
- }
232
- catch {
233
- return { ok: false, note: `删除 ${bin} 失败(可能需 sudo)` };
234
- }
235
- }
236
- if (purgeAuth) {
237
- try {
238
- rmSync(AUTH_DIR, { recursive: true, force: true });
239
- }
240
- catch {
241
- /* best-effort */
242
- }
243
- }
244
- return { ok: codexProxyBinPath() == null };
245
- }
246
- let authChild = null;
247
- let authInfo = {};
248
- let authPromise = null;
249
- let authError;
250
- let cancelAuthProcess = null;
251
- function browserAuthFailureMessage(output, fallback) {
252
- return output.trim().replace(/\s+/g, ' ').slice(-800) || fallback;
253
- }
254
- /**
255
- * 起 browser PKCE 授权流:spawn `codex auth login`,从 stdout 抓授权 URL 返回给前端。
256
- * 子进程监听 localhost:1455 等待浏览器回调;授权完成后自身退出。前端轮询 status 至 authed。
257
- * 已在跑 → 返回同一个 Promise(幂等)。
258
- */
259
- export function startCodexAuthBrowser() {
260
- if (authPromise)
261
- return authPromise;
262
- authPromise = new Promise((resolve, reject) => {
263
- const bin = codexProxyBinPath();
264
- if (!bin) {
265
- authPromise = null;
266
- reject(new Error('claude-code-proxy 未安装'));
267
- return;
268
- }
269
- authInfo = {};
270
- authError = undefined;
271
- // stdbuf 强制行缓冲(非 TTY 下二进制会攒着不吐);无 stdbuf 则直调。
272
- const hasStdbuf = spawnSync('which', ['stdbuf']).status === 0;
273
- const child = hasStdbuf
274
- ? spawn('stdbuf', ['-oL', '-eL', bin, 'codex', 'auth', 'login'], { stdio: ['ignore', 'pipe', 'pipe'] })
275
- : spawn(bin, ['codex', 'auth', 'login'], { stdio: ['ignore', 'pipe', 'pipe'] });
276
- authChild = child;
277
- let buf = '';
278
- let settled = false;
279
- let cancelled = false;
280
- let timeout;
281
- const finishResolve = () => {
282
- if (settled)
283
- return;
284
- settled = true;
285
- if (timeout)
286
- clearTimeout(timeout);
287
- resolve({ ...authInfo });
288
- };
289
- const finishReject = (message) => {
290
- if (settled)
291
- return;
292
- settled = true;
293
- if (timeout)
294
- clearTimeout(timeout);
295
- reject(new Error(message));
296
- };
297
- const onData = (d) => {
298
- buf += d.toString();
299
- const url = /Open this URL[^\n]*[\s\S]*?(https?:\/\/\S+)/i.exec(buf)?.[1];
300
- if (url)
301
- authInfo.authorizationUrl = url;
302
- if (authInfo.authorizationUrl)
303
- finishResolve();
304
- };
305
- child.stdout?.on('data', onData);
306
- child.stderr?.on('data', onData);
307
- child.on('exit', (code) => {
308
- authChild = null;
309
- authPromise = null;
310
- cancelAuthProcess = null;
311
- if (!settled) {
312
- finishReject(browserAuthFailureMessage(buf, `claude-code-proxy 启动浏览器授权失败(exit ${code ?? 'unknown'})`));
313
- }
314
- else if (!cancelled && code !== 0) {
315
- authError = browserAuthFailureMessage(buf, `claude-code-proxy 浏览器授权失败(exit ${code ?? 'unknown'})`);
316
- }
317
- });
318
- child.on('error', (e) => {
319
- authChild = null;
320
- authPromise = null;
321
- cancelAuthProcess = null;
322
- finishReject(e.message);
323
- });
324
- cancelAuthProcess = () => {
325
- cancelled = true;
326
- child.kill('SIGTERM');
327
- };
328
- timeout = setTimeout(() => {
329
- if (authChild === child) {
330
- cancelled = true;
331
- child.kill('SIGTERM');
332
- authChild = null;
333
- }
334
- authPromise = null;
335
- cancelAuthProcess = null;
336
- finishReject(browserAuthFailureMessage(buf, '20 秒内未获取到浏览器授权地址,请检查网络后重试'));
337
- }, 20_000);
338
- });
339
- return authPromise;
340
- }
341
- /** 取消/回收 device 授权子进程。 */
342
- export function cancelCodexAuth() {
343
- if (authChild) {
344
- try {
345
- cancelAuthProcess?.();
346
- }
347
- catch {
348
- /* noop */
349
- }
350
- authChild = null;
351
- authPromise = null;
352
- authError = undefined;
353
- cancelAuthProcess = null;
354
- }
355
- }
356
- function log(msg) {
357
- process.stderr.write(`[codex-proxy] ${msg}\n`);
358
- }
359
- //# sourceMappingURL=CodexProxyManager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexProxyManager.js","sourceRoot":"","sources":["../../../../src/core/agents/sidecar/CodexProxyManager.ts"],"names":[],"mappings":"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"}