grix-connector 4.0.2 → 4.2.0
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/adapter/acp/acp-adapter.js +3 -3
- package/dist/adapter/acp/session-activity.js +1 -1
- package/dist/adapter/claude/claude-bridge-server.js +1 -0
- package/dist/adapter/claude/claude-tools.js +1 -0
- package/dist/adapter/claude/claude-worker-client.js +1 -0
- package/dist/adapter/claude/mcp-http-launcher.js +2 -0
- package/dist/adapter/claude/result-timeout.js +1 -0
- package/dist/adapter/deepseek/deepseek-adapter.js +6 -0
- package/dist/adapter/deepseek/index.js +1 -0
- package/dist/adapter/qwen/index.js +1 -0
- package/dist/adapter/qwen/qwen-adapter.js +4 -0
- package/dist/aibot/client.js +1 -0
- package/dist/aibot/index.js +1 -0
- package/dist/aibot/types.js +0 -0
- package/dist/assets/dsh-bridge/grix-dsh-bridge-4.2.0.tgz +0 -0
- package/dist/assets/dsh-bridge/manifest.json +5 -5
- package/dist/audit/adapters/agy/agy-audit-adapter.js +1 -1
- package/dist/audit/adapters/agy/agy-gen-metadata.js +1 -0
- package/dist/bridge/bridge.js +7 -7
- package/dist/bridge/lifecycle-barrier.js +1 -1
- package/dist/core/access/allowlist-gate.js +1 -0
- package/dist/core/access/allowlist-store.js +1 -0
- package/dist/core/access/index.js +1 -0
- package/dist/core/aibot/connection-manager.js +1 -1
- package/dist/core/config/agent-config-repository.js +2 -0
- package/dist/core/file-ops/handler.js +1 -0
- package/dist/core/file-ops/list-files.js +1 -0
- package/dist/core/file-ops/types.js +0 -0
- package/dist/core/installer/npm-registry.js +4 -4
- package/dist/core/runtime/health.js +1 -1
- package/dist/core/skill-sync/skill-syncer.js +1 -1
- package/dist/core/upgrade/npm-upgrader.js +2 -2
- package/dist/core/upgrade/upgrade-checker.js +1 -1
- package/dist/default-skills/grix-agent-dispatch/SKILL.md +9 -9
- package/dist/grix.js +7 -7
- package/dist/log.js +3 -0
- package/dist/main.js +31 -0
- package/dist/manager.js +1 -2
- package/dist/mcp/stream-http/config.js +1 -0
- package/dist/mcp/stream-http/connection-binding.js +1 -0
- package/dist/mcp/stream-http/event-tool-executor.js +1 -0
- package/dist/mcp/stream-http/gateway.js +1 -0
- package/dist/mcp/stream-http/index.js +1 -0
- package/dist/mcp/stream-http/security.js +1 -0
- package/dist/mcp/stream-http/session-manager.js +1 -0
- package/dist/mcp/stream-http/tool-executor.js +1 -0
- package/dist/mcp/stream-http/tool-registry.js +1 -0
- package/dist/mcp/stream-http/tool-schemas.js +1 -0
- package/dist/service/platform-adapter.js +25 -24
- package/dist/service/process-control.js +1 -1
- package/dist/service/service-manager.js +3 -3
- package/dist/service/service-paths.js +2 -2
- package/dist/service/windows-wrapper-migration.js +1 -0
- package/dist/session/index.js +1 -0
- package/dist/session/manager.js +1 -0
- package/dist/transport/index.js +1 -0
- package/dist/transport/json-rpc.js +3 -0
- package/openclaw-plugin/audit-recorder-worker.js +496 -54
- package/package.json +2 -1
- package/scripts/install-guardian.mjs +35 -19
- package/scripts/upgrade-guardian.mjs +1345 -0
- package/scripts/upgrade-guardian.sh +100 -75
- package/dist/assets/dsh-bridge/grix-dsh-bridge-4.0.2.tgz +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# upgrade-guardian.sh — post-upgrade health monitor
|
|
3
3
|
# Started by daemon after npm install, runs as detached background process.
|
|
4
|
-
# Monitors healthz for 90s
|
|
4
|
+
# Monitors healthz for 90s and rolls back on failure. The decision is
|
|
5
|
+
# single-run: nothing relaunches this guardian after it exits, so any
|
|
6
|
+
# crash-count threshold above one run could never be reached.
|
|
5
7
|
# This file is NOT inside the npm package — installed once to ~/.grix/bin/.
|
|
6
8
|
|
|
7
9
|
GRIX_HOME="${GRIX_CONNECTOR_HOME:-$HOME/.grix}"
|
|
8
10
|
PENDING_FILE="$GRIX_HOME/data/upgrade-pending.json"
|
|
9
11
|
LOCK_FILE="$GRIX_HOME/upgrade-guardian.lock"
|
|
10
12
|
LOG_FILE="$GRIX_HOME/log/upgrade.log"
|
|
11
|
-
MAX_CRASHES=3
|
|
12
13
|
HEALTH_TIMEOUT=90
|
|
13
14
|
HEALTH_PORT_FILE="$GRIX_HOME/data/health-port"
|
|
14
15
|
HEALTH_PORT=$(cat "$HEALTH_PORT_FILE" 2>/dev/null || echo "19579")
|
|
@@ -38,22 +39,43 @@ if [ ! -f "$PENDING_FILE" ]; then
|
|
|
38
39
|
exit 0
|
|
39
40
|
fi
|
|
40
41
|
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
# 用 node 解析 pending:grep/cut 拼 JSON 对转义和 schema 演进都脆弱,而 guardian
|
|
43
|
+
# 的激活与回滚本来就依赖 node,可用性等价。输出为单引号安全的 shell 赋值。
|
|
44
|
+
PENDING_VARS=$(node -e '
|
|
45
|
+
const f = JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"));
|
|
46
|
+
const q = (v) => "\x27" + String(v ?? "").replace(/\x27/g, "\x27\\\x27\x27") + "\x27";
|
|
47
|
+
process.stdout.write([
|
|
48
|
+
"FROM_VERSION=" + q(f.from_version),
|
|
49
|
+
"TARGET_VERSION=" + q(f.target_version),
|
|
50
|
+
"CRASH_COUNT=" + q(f.crash_count ?? 0),
|
|
51
|
+
"PACKAGE_DIR=" + q(f.package_dir),
|
|
52
|
+
"BACKUP_DIR=" + q(f.backup_dir),
|
|
53
|
+
].join("\n"));
|
|
54
|
+
' "$PENDING_FILE" 2>> "$LOG_FILE") || PENDING_VARS=""
|
|
55
|
+
if [ -z "$PENDING_VARS" ]; then
|
|
56
|
+
log "pending file corrupt or unreadable, removing"
|
|
57
|
+
rm -f "$PENDING_FILE"
|
|
58
|
+
exit 0
|
|
59
|
+
fi
|
|
60
|
+
eval "$PENDING_VARS"
|
|
49
61
|
|
|
50
62
|
# Validate pending file
|
|
51
|
-
if [ -z "$FROM_VERSION" ]; then
|
|
52
|
-
log "pending file corrupt, missing from_version, removing"
|
|
63
|
+
if [ -z "$FROM_VERSION" ] || [ -z "$TARGET_VERSION" ]; then
|
|
64
|
+
log "pending file corrupt, missing from_version/target_version, removing"
|
|
53
65
|
rm -f "$PENDING_FILE"
|
|
54
66
|
exit 0
|
|
55
67
|
fi
|
|
56
68
|
|
|
69
|
+
# healthz 必须由目标版本的进程应答才算健康。只看 HTTP 200 会把仍在跑的旧进程
|
|
70
|
+
# (或激活间隙被 launchd 拉起的旧 runtime)误判为升级成功。
|
|
71
|
+
target_healthy() {
|
|
72
|
+
RESP=$(curl -sf --max-time 5 "$HEALTH_URL" 2>/dev/null) || return 1
|
|
73
|
+
case "$RESP" in
|
|
74
|
+
*"\"version\":\"$TARGET_VERSION\""*) return 0 ;;
|
|
75
|
+
*) return 1 ;;
|
|
76
|
+
esac
|
|
77
|
+
}
|
|
78
|
+
|
|
57
79
|
log "started: from=$FROM_VERSION target=$TARGET_VERSION crash_count=$CRASH_COUNT"
|
|
58
80
|
|
|
59
81
|
# Wait for old daemon to exit (SIGTERM + shutdown + restart)
|
|
@@ -74,16 +96,16 @@ else
|
|
|
74
96
|
log "forward activation failed for target $TARGET_VERSION; treating as startup failure"
|
|
75
97
|
fi
|
|
76
98
|
|
|
77
|
-
# Monitor loop: wait for healthz to
|
|
99
|
+
# Monitor loop: wait for healthz to report the target version (only after successful activation)
|
|
78
100
|
if [ $ACTIVATED -eq 1 ]; then
|
|
79
101
|
ELAPSED=0
|
|
80
102
|
while [ $ELAPSED -lt $HEALTH_TIMEOUT ]; do
|
|
81
|
-
if
|
|
103
|
+
if target_healthy; then
|
|
82
104
|
# healthz 通过=新版健康。这里不删 pending:删了会抢在新进程的
|
|
83
105
|
# handlePendingOnStartup 之前,使其读不到 pending、success 回执发不出去
|
|
84
106
|
# (后端只见 installed 不见 success)。交由新进程上报 success 后自行删 pending,
|
|
85
107
|
# guardian 只负责崩溃回滚。
|
|
86
|
-
log "healthz passed, upgrade healthy; leaving pending for in-process success report"
|
|
108
|
+
log "healthz passed for $TARGET_VERSION, upgrade healthy; leaving pending for in-process success report"
|
|
87
109
|
exit 0
|
|
88
110
|
fi
|
|
89
111
|
sleep 3
|
|
@@ -92,75 +114,78 @@ if [ $ACTIVATED -eq 1 ]; then
|
|
|
92
114
|
|
|
93
115
|
# Extra grace period for slow systems
|
|
94
116
|
sleep 15
|
|
95
|
-
if
|
|
117
|
+
if target_healthy; then
|
|
96
118
|
# 同上:不删 pending,交由进程内 handlePendingOnStartup 上报 success 并删除。
|
|
97
|
-
log "healthz passed (delayed), upgrade healthy; leaving pending for in-process success report"
|
|
119
|
+
log "healthz passed for $TARGET_VERSION (delayed), upgrade healthy; leaving pending for in-process success report"
|
|
98
120
|
exit 0
|
|
99
121
|
fi
|
|
100
122
|
fi
|
|
101
123
|
|
|
102
|
-
# Health check failed (or forward activation failed)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
124
|
+
# Health check failed (or forward activation failed). This guardian runs exactly
|
|
125
|
+
# once per upgrade — no supervisor relaunches it — so the verdict is made here:
|
|
126
|
+
# roll back now instead of counting crashes toward a threshold that can never
|
|
127
|
+
# be reached again.
|
|
128
|
+
# 回滚前用 node 原位递增并持久化 crash_count:保留 pending 里的其余字段
|
|
129
|
+
# (transaction_id、路径等),恢复后的旧运行时上报 rolled_back 时要带真实计数。
|
|
130
|
+
CRASH_COUNT=$(node -e '
|
|
131
|
+
const fs = require("fs");
|
|
132
|
+
const file = process.argv[1];
|
|
133
|
+
const f = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
134
|
+
f.crash_count = (Number(f.crash_count) || 0) + 1;
|
|
135
|
+
const tmp = file + ".tmp";
|
|
136
|
+
fs.writeFileSync(tmp, JSON.stringify(f));
|
|
137
|
+
fs.renameSync(tmp, file);
|
|
138
|
+
process.stdout.write(String(f.crash_count));
|
|
139
|
+
' "$PENDING_FILE" 2>> "$LOG_FILE") || CRASH_COUNT=$((CRASH_COUNT + 1))
|
|
140
|
+
log "healthz timeout or forward activation failed, crash_count=$CRASH_COUNT; rolling back"
|
|
141
|
+
|
|
142
|
+
# 新版升级器会把完整旧包保留在同文件系统的固定备份目录。优先原子恢复,
|
|
143
|
+
# 不依赖网络/npm,也不会再次制造全局 bin 缺失窗口。
|
|
144
|
+
case "$PACKAGE_DIR" in
|
|
145
|
+
*/node_modules/*)
|
|
146
|
+
if [ -n "$BACKUP_DIR" ] && [ "$BACKUP_DIR" = "${PACKAGE_DIR}.grix-upgrade-backup" ] && [ -d "$BACKUP_DIR" ]; then
|
|
147
|
+
FAILED_DIR="${PACKAGE_DIR}.grix-upgrade-failed-$$"
|
|
148
|
+
log "atomic rollback: restoring $BACKUP_DIR"
|
|
149
|
+
rm -rf "$FAILED_DIR"
|
|
150
|
+
if { [ ! -e "$PACKAGE_DIR" ] || mv "$PACKAGE_DIR" "$FAILED_DIR"; } \
|
|
151
|
+
&& mv "$BACKUP_DIR" "$PACKAGE_DIR"; then
|
|
114
152
|
rm -rf "$FAILED_DIR"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
log "atomic rollback failed; restoring current package before npm fallback"
|
|
131
|
-
if [ ! -e "$PACKAGE_DIR" ] && [ -e "$FAILED_DIR" ]; then
|
|
132
|
-
mv "$FAILED_DIR" "$PACKAGE_DIR" 2>/dev/null || true
|
|
133
|
-
fi
|
|
153
|
+
# 原子恢复只换回全局包;macOS 服务跑的是受管 runtime 副本,必须用
|
|
154
|
+
# 旧包 CLI start 刷新副本并触发重启,激活成功才删 pending。
|
|
155
|
+
NPM_ROOT="$(npm root -g 2>> "$LOG_FILE")"
|
|
156
|
+
ROLLBACK_CLI="$NPM_ROOT/$NPM_PACKAGE/dist/grix.js"
|
|
157
|
+
if [ -n "$NPM_ROOT" ] && [ -f "$ROLLBACK_CLI" ] \
|
|
158
|
+
&& node "$ROLLBACK_CLI" start >> "$LOG_FILE" 2>&1; then
|
|
159
|
+
log "atomic rollback succeeded and managed runtime activated; leaving pending for rollback report"
|
|
160
|
+
exit 0
|
|
161
|
+
fi
|
|
162
|
+
# 激活失败不退出:落到下面的 npm 回滚路径再试一次(npm install 旧版幂等)。
|
|
163
|
+
log "atomic rollback package restored but managed runtime activation failed; falling through to npm rollback"
|
|
164
|
+
else
|
|
165
|
+
log "atomic rollback failed; restoring current package before npm fallback"
|
|
166
|
+
if [ ! -e "$PACKAGE_DIR" ] && [ -e "$FAILED_DIR" ]; then
|
|
167
|
+
mv "$FAILED_DIR" "$PACKAGE_DIR" 2>/dev/null || true
|
|
134
168
|
fi
|
|
135
169
|
fi
|
|
136
|
-
;;
|
|
137
|
-
esac
|
|
138
|
-
|
|
139
|
-
log "rollback: installing ${NPM_PACKAGE}@${FROM_VERSION}"
|
|
140
|
-
# P5: 先用默认源,失败再显式回退官方 npm(默认源可能是淘宝镜像,旧版若没同步同样会失败)。
|
|
141
|
-
if npm install -g "${NPM_PACKAGE}@${FROM_VERSION}" --prefer-online --no-audit --no-fund >> "$LOG_FILE" 2>&1 \
|
|
142
|
-
|| { log "rollback via default registry failed, retrying official npm"; \
|
|
143
|
-
npm install -g "${NPM_PACKAGE}@${FROM_VERSION}" --registry https://registry.npmjs.org --prefer-online --no-audit --no-fund >> "$LOG_FILE" 2>&1; }; then
|
|
144
|
-
log "rollback package installed; activating managed runtime"
|
|
145
|
-
NPM_ROOT="$(npm root -g 2>> "$LOG_FILE")"
|
|
146
|
-
ROLLBACK_CLI="$NPM_ROOT/$NPM_PACKAGE/dist/grix.js"
|
|
147
|
-
if [ -n "$NPM_ROOT" ] && [ -f "$ROLLBACK_CLI" ] \
|
|
148
|
-
&& node "$ROLLBACK_CLI" start >> "$LOG_FILE" 2>&1; then
|
|
149
|
-
log "rollback succeeded and managed runtime activated; leaving pending for rollback report"
|
|
150
|
-
else
|
|
151
|
-
log "ROLLBACK ACTIVATION FAILED — package restored but managed runtime was not switched"
|
|
152
170
|
fi
|
|
171
|
+
;;
|
|
172
|
+
esac
|
|
173
|
+
|
|
174
|
+
log "rollback: installing ${NPM_PACKAGE}@${FROM_VERSION}"
|
|
175
|
+
# P5: 先用默认源,失败再显式回退官方 npm(默认源可能是淘宝镜像,旧版若没同步同样会失败)。
|
|
176
|
+
if npm install -g "${NPM_PACKAGE}@${FROM_VERSION}" --prefer-online --no-audit --no-fund >> "$LOG_FILE" 2>&1 \
|
|
177
|
+
|| { log "rollback via default registry failed, retrying official npm"; \
|
|
178
|
+
npm install -g "${NPM_PACKAGE}@${FROM_VERSION}" --registry https://registry.npmjs.org --prefer-online --no-audit --no-fund >> "$LOG_FILE" 2>&1; }; then
|
|
179
|
+
log "rollback package installed; activating managed runtime"
|
|
180
|
+
NPM_ROOT="$(npm root -g 2>> "$LOG_FILE")"
|
|
181
|
+
ROLLBACK_CLI="$NPM_ROOT/$NPM_PACKAGE/dist/grix.js"
|
|
182
|
+
if [ -n "$NPM_ROOT" ] && [ -f "$ROLLBACK_CLI" ] \
|
|
183
|
+
&& node "$ROLLBACK_CLI" start >> "$LOG_FILE" 2>&1; then
|
|
184
|
+
log "rollback succeeded and managed runtime activated; leaving pending for rollback report"
|
|
153
185
|
else
|
|
154
|
-
log "ROLLBACK FAILED —
|
|
186
|
+
log "ROLLBACK ACTIVATION FAILED — package restored but managed runtime was not switched"
|
|
155
187
|
fi
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
# Under threshold — update crash_count and exit, let process manager restart
|
|
160
|
-
PATH_FIELDS=""
|
|
161
|
-
if [ -n "$PACKAGE_DIR" ] && [ -n "$BACKUP_DIR" ]; then
|
|
162
|
-
PATH_FIELDS=",\"package_dir\":\"$PACKAGE_DIR\",\"backup_dir\":\"$BACKUP_DIR\""
|
|
188
|
+
else
|
|
189
|
+
log "ROLLBACK FAILED — manual intervention required"
|
|
163
190
|
fi
|
|
164
|
-
|
|
165
|
-
mv "$PENDING_FILE.tmp" "$PENDING_FILE"
|
|
166
|
-
log "updated crash_count to $CRASH_COUNT, exiting"
|
|
191
|
+
exit 0
|
|
Binary file
|