@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.
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/heartbeat.js +138 -0
- package/dist/cli/commands/heartbeat.js.map +1 -1
- package/dist/cli/commands/launcher/types.d.ts +1 -0
- package/dist/cli/commands/launcher/utils.js +28 -2
- package/dist/cli/commands/launcher/utils.js.map +1 -1
- package/dist/cli/commands/launcher-kernel.js +61 -9
- package/dist/cli/commands/launcher-kernel.js.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/system-prompts/codex-cli.txt +1 -1
- package/dist/config/user-data-paths.d.ts +1 -0
- package/dist/config/user-data-paths.js +29 -0
- package/dist/config/user-data-paths.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-persistence.js +18 -10
- package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -1
- package/dist/manager/quota/provider-quota-store.js +17 -9
- package/dist/manager/quota/provider-quota-store.js.map +1 -1
- package/dist/modules/llmswitch/bridge/index.d.ts +2 -2
- package/dist/modules/llmswitch/bridge/index.js +2 -2
- package/dist/modules/llmswitch/bridge/index.js.map +1 -1
- package/dist/modules/llmswitch/bridge/snapshot-recorder.d.ts +1 -0
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js +223 -23
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
- package/dist/modules/llmswitch/bridge/state-integrations.d.ts +18 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js +34 -1
- package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +2 -2
- package/dist/modules/llmswitch/bridge.js +2 -2
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/providers/auth/apikey-auth.d.ts +1 -0
- package/dist/providers/auth/apikey-auth.js +7 -2
- package/dist/providers/auth/apikey-auth.js.map +1 -1
- package/dist/providers/core/runtime/provider-factory-helpers.js +25 -3
- package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -1
- package/dist/providers/core/runtime/transport/request-header-builder.d.ts +8 -0
- package/dist/providers/core/runtime/transport/request-header-builder.js +129 -9
- package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.d.ts +2 -1
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js +28 -2
- package/dist/providers/core/runtime/vercel-ai-sdk/openai-sdk-transport.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer.js +10 -11
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/mock/mock-provider-runtime.js +1 -1
- package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
- package/dist/server/handlers/handler-response-utils.js +134 -10
- package/dist/server/handlers/handler-response-utils.js.map +1 -1
- package/dist/server/handlers/handler-utils.js +2 -2
- package/dist/server/handlers/handler-utils.js.map +1 -1
- package/dist/server/handlers/types.d.ts +4 -0
- package/dist/server/runtime/http-server/clock-runtime-hooks.js +134 -35
- package/dist/server/runtime/http-server/clock-runtime-hooks.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +34 -8
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +11 -1
- package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -1
- package/dist/server/runtime/http-server/executor-metadata.js +31 -1
- package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
- package/dist/server/runtime/http-server/executor-pipeline.js +24 -1
- package/dist/server/runtime/http-server/executor-pipeline.js.map +1 -1
- package/dist/server/runtime/http-server/executor-provider.js +1 -1
- package/dist/server/runtime/http-server/executor-provider.js.map +1 -1
- package/dist/server/runtime/http-server/heartbeat-runtime-hooks.js +128 -20
- package/dist/server/runtime/http-server/heartbeat-runtime-hooks.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +6 -2
- package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-lifecycle.js +16 -0
- package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-providers.js +14 -0
- package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-session-daemon.js +14 -7
- package/dist/server/runtime/http-server/http-server-session-daemon.js.map +1 -1
- package/dist/server/runtime/http-server/index.js +18 -1
- package/dist/server/runtime/http-server/index.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +27 -1
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-registry.js +6 -1
- package/dist/server/runtime/http-server/session-client-registry.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-routes.js +83 -5
- package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
- package/dist/server/runtime/http-server/session-execution-state.d.ts +47 -0
- package/dist/server/runtime/http-server/session-execution-state.js +328 -0
- package/dist/server/runtime/http-server/session-execution-state.js.map +1 -0
- package/dist/server/runtime/http-server/session-scope-resolution.d.ts +2 -0
- package/dist/server/runtime/http-server/session-scope-resolution.js +98 -4
- package/dist/server/runtime/http-server/session-scope-resolution.js.map +1 -1
- package/dist/server/runtime/http-server/session-storage-cleanup.d.ts +2 -0
- package/dist/server/runtime/http-server/session-storage-cleanup.js +74 -0
- package/dist/server/runtime/http-server/session-storage-cleanup.js.map +1 -1
- package/dist/server/runtime/http-server/tmux-injection-history.d.ts +12 -0
- package/dist/server/runtime/http-server/tmux-injection-history.js +94 -0
- package/dist/server/runtime/http-server/tmux-injection-history.js.map +1 -0
- package/dist/server/runtime/http-server/tmux-injection-runtime-config.d.ts +42 -0
- package/dist/server/runtime/http-server/tmux-injection-runtime-config.js +245 -0
- package/dist/server/runtime/http-server/tmux-injection-runtime-config.js.map +1 -0
- package/dist/server/runtime/http-server/tmux-session-probe.d.ts +1 -0
- package/dist/server/runtime/http-server/tmux-session-probe.js +89 -2
- package/dist/server/runtime/http-server/tmux-session-probe.js.map +1 -1
- package/dist/server/utils/request-id-manager.d.ts +8 -0
- package/dist/server/utils/request-id-manager.js +116 -27
- package/dist/server/utils/request-id-manager.js.map +1 -1
- package/dist/server/utils/request-log-color.d.ts +1 -0
- package/dist/server/utils/request-log-color.js +12 -1
- package/dist/server/utils/request-log-color.js.map +1 -1
- package/dist/server/utils/stage-logger.js +37 -3
- package/dist/server/utils/stage-logger.js.map +1 -1
- package/dist/utils/errorsamples.js +181 -1
- package/dist/utils/errorsamples.js.map +1 -1
- package/dist/utils/snapshot-writer.js +2 -6
- package/dist/utils/snapshot-writer.js.map +1 -1
- package/docs/ARCHITECTURE.md +8 -0
- package/docs/design/heartbeat-session-execution-state.md +227 -0
- package/docs/reports/apply-patch-errorsamples-classification.md +144 -0
- package/package.json +3 -2
- package/scripts/ci/repo-sanity.mjs +3 -1
- package/scripts/install-global.sh +17 -40
- package/scripts/install-release.sh +16 -0
- 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.
|
|
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.
|
|
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
|
+
|