@jsonstudio/rcc 0.90.429 → 0.90.701

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 (118) hide show
  1. package/dist/build-info.js +2 -2
  2. package/dist/cli/commands/heartbeat.js +138 -0
  3. package/dist/cli/commands/heartbeat.js.map +1 -1
  4. package/dist/cli/commands/launcher/types.d.ts +1 -0
  5. package/dist/cli/commands/launcher/utils.js +28 -2
  6. package/dist/cli/commands/launcher/utils.js.map +1 -1
  7. package/dist/cli/commands/launcher-kernel.js +61 -9
  8. package/dist/cli/commands/launcher-kernel.js.map +1 -1
  9. package/dist/cli.js +1 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config/system-prompts/codex-cli.txt +1 -1
  12. package/dist/config/user-data-paths.d.ts +1 -0
  13. package/dist/config/user-data-paths.js +29 -0
  14. package/dist/config/user-data-paths.js.map +1 -1
  15. package/dist/manager/modules/quota/antigravity-quota-persistence.js +18 -10
  16. package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -1
  17. package/dist/manager/quota/provider-quota-store.js +17 -9
  18. package/dist/manager/quota/provider-quota-store.js.map +1 -1
  19. package/dist/modules/llmswitch/bridge/index.d.ts +2 -2
  20. package/dist/modules/llmswitch/bridge/index.js +2 -2
  21. package/dist/modules/llmswitch/bridge/index.js.map +1 -1
  22. package/dist/modules/llmswitch/bridge/snapshot-recorder.d.ts +1 -0
  23. package/dist/modules/llmswitch/bridge/snapshot-recorder.js +223 -23
  24. package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
  25. package/dist/modules/llmswitch/bridge/state-integrations.d.ts +18 -0
  26. package/dist/modules/llmswitch/bridge/state-integrations.js +34 -1
  27. package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
  28. package/dist/modules/llmswitch/bridge.d.ts +2 -2
  29. package/dist/modules/llmswitch/bridge.js +2 -2
  30. package/dist/modules/llmswitch/bridge.js.map +1 -1
  31. package/dist/providers/auth/apikey-auth.d.ts +1 -0
  32. package/dist/providers/auth/apikey-auth.js +7 -2
  33. package/dist/providers/auth/apikey-auth.js.map +1 -1
  34. package/dist/providers/core/runtime/provider-factory-helpers.js +25 -3
  35. package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -1
  36. package/dist/providers/core/runtime/transport/request-header-builder.d.ts +8 -0
  37. package/dist/providers/core/runtime/transport/request-header-builder.js +129 -9
  38. package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -1
  39. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.d.ts +2 -1
  40. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +28 -2
  41. package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -1
  42. package/dist/providers/core/utils/snapshot-writer.js +10 -11
  43. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  44. package/dist/providers/mock/mock-provider-runtime.js +1 -1
  45. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  46. package/dist/server/handlers/handler-response-utils.js +134 -10
  47. package/dist/server/handlers/handler-response-utils.js.map +1 -1
  48. package/dist/server/handlers/handler-utils.js +2 -2
  49. package/dist/server/handlers/handler-utils.js.map +1 -1
  50. package/dist/server/handlers/types.d.ts +4 -0
  51. package/dist/server/runtime/http-server/clock-runtime-hooks.js +134 -35
  52. package/dist/server/runtime/http-server/clock-runtime-hooks.js.map +1 -1
  53. package/dist/server/runtime/http-server/executor/provider-response-converter.js +34 -8
  54. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
  55. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +11 -1
  56. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
  57. package/dist/server/runtime/http-server/executor-metadata.js +31 -1
  58. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  59. package/dist/server/runtime/http-server/executor-pipeline.js +24 -1
  60. package/dist/server/runtime/http-server/executor-pipeline.js.map +1 -1
  61. package/dist/server/runtime/http-server/executor-provider.js +1 -1
  62. package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
  63. package/dist/server/runtime/http-server/heartbeat-runtime-hooks.js +128 -20
  64. package/dist/server/runtime/http-server/heartbeat-runtime-hooks.js.map +1 -1
  65. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +6 -2
  66. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -1
  67. package/dist/server/runtime/http-server/http-server-lifecycle.js +16 -0
  68. package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
  69. package/dist/server/runtime/http-server/http-server-runtime-providers.js +14 -0
  70. package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
  71. package/dist/server/runtime/http-server/http-server-session-daemon.js +14 -7
  72. package/dist/server/runtime/http-server/http-server-session-daemon.js.map +1 -1
  73. package/dist/server/runtime/http-server/index.js +18 -1
  74. package/dist/server/runtime/http-server/index.js.map +1 -1
  75. package/dist/server/runtime/http-server/request-executor.js +27 -1
  76. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  77. package/dist/server/runtime/http-server/session-client-registry.js +6 -1
  78. package/dist/server/runtime/http-server/session-client-registry.js.map +1 -1
  79. package/dist/server/runtime/http-server/session-client-routes.js +83 -5
  80. package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
  81. package/dist/server/runtime/http-server/session-execution-state.d.ts +47 -0
  82. package/dist/server/runtime/http-server/session-execution-state.js +328 -0
  83. package/dist/server/runtime/http-server/session-execution-state.js.map +1 -0
  84. package/dist/server/runtime/http-server/session-scope-resolution.d.ts +2 -0
  85. package/dist/server/runtime/http-server/session-scope-resolution.js +98 -4
  86. package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -1
  87. package/dist/server/runtime/http-server/session-storage-cleanup.d.ts +2 -0
  88. package/dist/server/runtime/http-server/session-storage-cleanup.js +74 -0
  89. package/dist/server/runtime/http-server/session-storage-cleanup.js.map +1 -1
  90. package/dist/server/runtime/http-server/tmux-injection-history.d.ts +12 -0
  91. package/dist/server/runtime/http-server/tmux-injection-history.js +94 -0
  92. package/dist/server/runtime/http-server/tmux-injection-history.js.map +1 -0
  93. package/dist/server/runtime/http-server/tmux-injection-runtime-config.d.ts +42 -0
  94. package/dist/server/runtime/http-server/tmux-injection-runtime-config.js +245 -0
  95. package/dist/server/runtime/http-server/tmux-injection-runtime-config.js.map +1 -0
  96. package/dist/server/runtime/http-server/tmux-session-probe.d.ts +1 -0
  97. package/dist/server/runtime/http-server/tmux-session-probe.js +89 -2
  98. package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
  99. package/dist/server/utils/request-id-manager.d.ts +8 -0
  100. package/dist/server/utils/request-id-manager.js +116 -27
  101. package/dist/server/utils/request-id-manager.js.map +1 -1
  102. package/dist/server/utils/request-log-color.d.ts +1 -0
  103. package/dist/server/utils/request-log-color.js +12 -1
  104. package/dist/server/utils/request-log-color.js.map +1 -1
  105. package/dist/server/utils/stage-logger.js +37 -3
  106. package/dist/server/utils/stage-logger.js.map +1 -1
  107. package/dist/utils/errorsamples.js +181 -1
  108. package/dist/utils/errorsamples.js.map +1 -1
  109. package/dist/utils/snapshot-writer.js +2 -6
  110. package/dist/utils/snapshot-writer.js.map +1 -1
  111. package/docs/ARCHITECTURE.md +8 -0
  112. package/docs/design/heartbeat-session-execution-state.md +227 -0
  113. package/docs/reports/apply-patch-errorsamples-classification.md +144 -0
  114. package/package.json +3 -2
  115. package/scripts/ci/repo-sanity.mjs +3 -1
  116. package/scripts/install-global.sh +17 -40
  117. package/scripts/install-release.sh +16 -0
  118. package/scripts/link-global-llms-local.mjs +108 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsonstudio/rcc",
3
- "version": "0.90.429",
3
+ "version": "0.90.701",
4
4
  "description": "Multi-provider OpenAI proxy server with anthropic/responses/chat support (release)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -104,6 +104,7 @@
104
104
  "llmswitch:ensure": "node scripts/ensure-llmswitch-mode.mjs",
105
105
  "llmswitch:link": "node scripts/link-llmswitch.mjs",
106
106
  "llmswitch:unlink": "node scripts/link-llmswitch.mjs unlink",
107
+ "llmswitch:link:global": "node scripts/link-global-llms-local.mjs --require-target",
107
108
  "dry-run:responses-provider": "node scripts/tests/responses-provider-dry-run.mjs",
108
109
  "start:verify:fg": "node scripts/start-verify.mjs --mode fg --timeout 90",
109
110
  "rc-config": "node scripts/rc-config.mjs",
@@ -159,7 +160,7 @@
159
160
  "@ai-sdk/anthropic": "^3.0.58",
160
161
  "@ai-sdk/openai": "^3.0.41",
161
162
  "@anthropic-ai/sdk": "^0.65.0",
162
- "@jsonstudio/llms": "0.6.3952",
163
+ "@jsonstudio/llms": "0.6.4291",
163
164
  "@lmstudio/sdk": "^1.5.0",
164
165
  "@radix-ui/react-switch": "^1.2.6",
165
166
  "@types/socket.io": "^3.0.1",
@@ -27,7 +27,7 @@ function listRootEntries() {
27
27
 
28
28
  function isForbiddenRootFile(p) {
29
29
  const base = path.posix.basename(p);
30
- const allow = new Set(['AGENTS.md', 'README.md', 'MEMORY.md', 'task.md']);
30
+ const allow = new Set(['AGENTS.md', 'README.md', 'MEMORY.md', 'HEARTBEAT.md', 'DELIVERY.md', 'task.md']);
31
31
  if (allow.has(base)) return false;
32
32
  if (/^test-.*\.(mjs|js|ts|py)$/i.test(base)) return true;
33
33
  if (/^debug-.*\.(mjs|js|ts)$/i.test(base)) return true;
@@ -73,6 +73,8 @@ function checkRootLayout() {
73
73
  '.gitattributes',
74
74
  '.gitignore',
75
75
  'AGENTS.md',
76
+ 'HEARTBEAT.md',
77
+ 'DELIVERY.md',
76
78
  'README.md',
77
79
  'MEMORY.md',
78
80
  'config',
@@ -45,6 +45,21 @@ check_node() {
45
45
  echo "✅ Node.js: $(node -v)"
46
46
  }
47
47
 
48
+ check_tmux() {
49
+ if command -v tmux &> /dev/null; then
50
+ echo "✅ tmux: $(tmux -V 2>/dev/null || echo tmux)"
51
+ return
52
+ fi
53
+
54
+ echo "❌ tmux 未安装"
55
+ echo "💡 RouteCodex 的 tmux 会话管理 / 注入 / heartbeat 依赖 tmux"
56
+ echo "💡 请先安装 tmux 后再执行全局安装,例如:"
57
+ echo " macOS(Homebrew): brew install tmux"
58
+ echo " Ubuntu/Debian: apt-get install -y tmux"
59
+ echo " CentOS/RHEL: yum install -y tmux"
60
+ exit 1
61
+ }
62
+
48
63
  # 构建项目
49
64
  build_project() {
50
65
  echo "🔨 构建项目..."
@@ -140,46 +155,7 @@ global_install() {
140
155
 
141
156
  link_global_llms_dev() {
142
157
  echo "🔗 链接全局 @jsonstudio/llms 到本地 sharedmodule (dev 模式)..."
143
-
144
- local npm_prefix
145
- local global_node_modules
146
- npm_prefix=$(npm config get prefix)
147
- global_node_modules=$(npm root -g 2>/dev/null || true)
148
- if [ -z "${global_node_modules:-}" ]; then
149
- global_node_modules="$npm_prefix/lib/node_modules"
150
- fi
151
-
152
- local global_routecodex
153
- local local_llms
154
- local global_llms_parent
155
- local global_llms_link
156
-
157
- global_routecodex="$global_node_modules/routecodex"
158
- local_llms="$PWD/sharedmodule/llmswitch-core"
159
- global_llms_parent="$global_routecodex/node_modules/@jsonstudio"
160
- global_llms_link="$global_llms_parent/llms"
161
-
162
- if [ ! -d "$global_routecodex" ]; then
163
- echo "❌ 未找到全局 routecodex 安装目录: $global_routecodex"
164
- exit 1
165
- fi
166
- if [ ! -d "$local_llms" ] || [ ! -f "$local_llms/package.json" ]; then
167
- echo "❌ 未找到本地 llmswitch-core: $local_llms"
168
- exit 1
169
- fi
170
- if [ ! -d "$local_llms/dist" ]; then
171
- echo "❌ 本地 llmswitch-core 尚未构建 (缺少 dist/): $local_llms"
172
- echo "💡 请先在 sharedmodule/llmswitch-core 执行 npm run build"
173
- exit 1
174
- fi
175
-
176
- mkdir -p "$global_llms_parent"
177
- rm -rf "$global_llms_link"
178
- ln -s "$local_llms" "$global_llms_link"
179
-
180
- local resolved_target
181
- resolved_target=$(readlink "$global_llms_link" || true)
182
- echo "✅ 全局 llms 已链接: $global_llms_link -> $resolved_target"
158
+ node scripts/link-global-llms-local.mjs --package routecodex --require-target
183
159
  }
184
160
 
185
161
  # 验证安装
@@ -266,6 +242,7 @@ cleanup_old_install() {
266
242
  # 主函数
267
243
  main() {
268
244
  check_node
245
+ check_tmux
269
246
  cleanup_old_install
270
247
  node scripts/cleanup-stale-server-pids.mjs --quiet || true
271
248
  build_project
@@ -14,6 +14,18 @@ fi
14
14
  VERSION=$(node -p "require('./package.json').version" 2>/dev/null || echo "0.0.0")
15
15
  echo "📦 当前源码版本: routecodex@${VERSION}"
16
16
 
17
+ if command -v tmux >/dev/null 2>&1; then
18
+ echo "✅ tmux: $(tmux -V 2>/dev/null || echo tmux)"
19
+ else
20
+ echo "❌ tmux 未安装"
21
+ echo "💡 RouteCodex/RCC 的 tmux 会话管理 / 注入 / heartbeat 依赖 tmux"
22
+ echo "💡 请先安装 tmux 后再执行 release 安装,例如:"
23
+ echo " macOS(Homebrew): brew install tmux"
24
+ echo " Ubuntu/Debian: apt-get install -y tmux"
25
+ echo " CentOS/RHEL: yum install -y tmux"
26
+ exit 1
27
+ fi
28
+
17
29
  echo "🔨 构建源码..."
18
30
  # release 包:显式使用 BUILD_MODE=release 以便在编译期区分 dev/release
19
31
  BUILD_MODE=release npm run build
@@ -75,10 +87,14 @@ npm uninstall -g @jsonstudio/rcc >/dev/null 2>&1 || true
75
87
  echo "🌍 全局安装 @jsonstudio/rcc (release)..."
76
88
  npm install -g "${RCC_TARBALL}" --no-audit --no-fund
77
89
 
90
+ echo "🔗 固定全局 rcc 的 @jsonstudio/llms 到本地 sharedmodule/llmswitch-core..."
91
+ node scripts/link-global-llms-local.mjs --package @jsonstudio/rcc --require-target
92
+
78
93
  echo "🔍 验证 rcc 安装..."
79
94
  if command -v rcc >/dev/null 2>&1; then
80
95
  echo "✅ @jsonstudio/rcc 已全局安装:$(command -v rcc)"
81
96
  rcc --version || true
97
+ node -e "const fs=require('fs');const path=require('path');const cp=require('child_process');const root=cp.execSync('npm root -g').toString().trim();const llmsPath=path.join(root,'@jsonstudio','rcc','node_modules','@jsonstudio','llms');const pkgPath=path.join(llmsPath,'package.json');const link=fs.existsSync(llmsPath)&&fs.lstatSync(llmsPath).isSymbolicLink();const target=link?fs.readlinkSync(llmsPath):'(not-symlink)';const version=fs.existsSync(pkgPath)?JSON.parse(fs.readFileSync(pkgPath,'utf8')).version:'unknown';console.log('🔎 全局 rcc @jsonstudio/llms:',version,'link=',link,'target=',target);"
82
98
  else
83
99
  echo "❌ 未找到 rcc 命令,请检查 npm 全局安装路径"
84
100
  exit 1
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const projectRoot = path.resolve(__dirname, '..');
9
+ const localLlms = path.join(projectRoot, 'sharedmodule', 'llmswitch-core');
10
+
11
+ function parseArgs(argv) {
12
+ const out = {
13
+ packageNames: [],
14
+ requireTarget: false
15
+ };
16
+ for (let i = 2; i < argv.length; i += 1) {
17
+ const arg = String(argv[i] || '').trim();
18
+ if (!arg) continue;
19
+ if (arg === '--require-target') {
20
+ out.requireTarget = true;
21
+ continue;
22
+ }
23
+ if (arg === '--package' || arg === '-p') {
24
+ const value = String(argv[i + 1] || '').trim();
25
+ i += 1;
26
+ if (value) out.packageNames.push(value);
27
+ continue;
28
+ }
29
+ if (arg.startsWith('--package=')) {
30
+ const value = arg.slice('--package='.length).trim();
31
+ if (value) out.packageNames.push(value);
32
+ continue;
33
+ }
34
+ }
35
+ return out;
36
+ }
37
+
38
+ function npmRootGlobal() {
39
+ const res = spawnSync('npm', ['root', '-g'], { encoding: 'utf8' });
40
+ if ((res.status ?? 1) === 0) {
41
+ const value = String(res.stdout || '').trim();
42
+ if (value) return value;
43
+ }
44
+ const prefix = spawnSync('npm', ['config', 'get', 'prefix'], { encoding: 'utf8' });
45
+ const fallbackPrefix = (prefix.status ?? 1) === 0 ? String(prefix.stdout || '').trim() : '';
46
+ if (!fallbackPrefix) {
47
+ throw new Error('unable to resolve npm global root');
48
+ }
49
+ return path.join(fallbackPrefix, 'lib', 'node_modules');
50
+ }
51
+
52
+ function ensureLocalLlmsReady() {
53
+ if (!fs.existsSync(localLlms) || !fs.existsSync(path.join(localLlms, 'package.json'))) {
54
+ throw new Error(`local llmswitch-core not found: ${localLlms}`);
55
+ }
56
+ if (!fs.existsSync(path.join(localLlms, 'dist'))) {
57
+ throw new Error(`local llmswitch-core dist missing: ${path.join(localLlms, 'dist')}`);
58
+ }
59
+ }
60
+
61
+ function linkForPackage(globalRoot, packageName) {
62
+ const pkgRoot = path.join(globalRoot, ...packageName.split('/'));
63
+ if (!fs.existsSync(pkgRoot)) {
64
+ return { packageName, changed: false, skipped: true, reason: 'package-not-installed' };
65
+ }
66
+ const scopeDir = path.join(pkgRoot, 'node_modules', '@jsonstudio');
67
+ const linkPath = path.join(scopeDir, 'llms');
68
+ fs.mkdirSync(scopeDir, { recursive: true });
69
+ fs.rmSync(linkPath, { recursive: true, force: true });
70
+ fs.symlinkSync(localLlms, linkPath, 'junction');
71
+ const linkedTo = fs.readlinkSync(linkPath);
72
+ return { packageName, changed: true, skipped: false, linkPath, linkedTo };
73
+ }
74
+
75
+ function main() {
76
+ const args = parseArgs(process.argv);
77
+ const targets = args.packageNames.length > 0 ? args.packageNames : ['@jsonstudio/rcc', 'routecodex'];
78
+ ensureLocalLlmsReady();
79
+ const globalRoot = npmRootGlobal();
80
+ const results = targets.map((name) => linkForPackage(globalRoot, name));
81
+ const changed = results.filter((it) => it.changed);
82
+
83
+ if (args.requireTarget && changed.length <= 0) {
84
+ const detail = results
85
+ .map((it) => `${it.packageName}:${it.skipped ? it.reason : 'unknown'}`)
86
+ .join(', ');
87
+ throw new Error(`no eligible global package found to link @jsonstudio/llms (${detail})`);
88
+ }
89
+
90
+ for (const row of results) {
91
+ if (row.changed) {
92
+ console.log(
93
+ `[link-global-llms-local] linked ${row.packageName} -> ${row.linkPath} => ${row.linkedTo}`
94
+ );
95
+ } else if (row.skipped) {
96
+ console.log(`[link-global-llms-local] skip ${row.packageName} (${row.reason})`);
97
+ }
98
+ }
99
+ }
100
+
101
+ try {
102
+ main();
103
+ } catch (error) {
104
+ const reason = error instanceof Error ? error.message : String(error);
105
+ console.error(`[link-global-llms-local] failed: ${reason}`);
106
+ process.exit(1);
107
+ }
108
+