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.
Files changed (63) hide show
  1. package/dist/adapter/acp/acp-adapter.js +3 -3
  2. package/dist/adapter/acp/session-activity.js +1 -1
  3. package/dist/adapter/claude/claude-bridge-server.js +1 -0
  4. package/dist/adapter/claude/claude-tools.js +1 -0
  5. package/dist/adapter/claude/claude-worker-client.js +1 -0
  6. package/dist/adapter/claude/mcp-http-launcher.js +2 -0
  7. package/dist/adapter/claude/result-timeout.js +1 -0
  8. package/dist/adapter/deepseek/deepseek-adapter.js +6 -0
  9. package/dist/adapter/deepseek/index.js +1 -0
  10. package/dist/adapter/qwen/index.js +1 -0
  11. package/dist/adapter/qwen/qwen-adapter.js +4 -0
  12. package/dist/aibot/client.js +1 -0
  13. package/dist/aibot/index.js +1 -0
  14. package/dist/aibot/types.js +0 -0
  15. package/dist/assets/dsh-bridge/grix-dsh-bridge-4.2.0.tgz +0 -0
  16. package/dist/assets/dsh-bridge/manifest.json +5 -5
  17. package/dist/audit/adapters/agy/agy-audit-adapter.js +1 -1
  18. package/dist/audit/adapters/agy/agy-gen-metadata.js +1 -0
  19. package/dist/bridge/bridge.js +7 -7
  20. package/dist/bridge/lifecycle-barrier.js +1 -1
  21. package/dist/core/access/allowlist-gate.js +1 -0
  22. package/dist/core/access/allowlist-store.js +1 -0
  23. package/dist/core/access/index.js +1 -0
  24. package/dist/core/aibot/connection-manager.js +1 -1
  25. package/dist/core/config/agent-config-repository.js +2 -0
  26. package/dist/core/file-ops/handler.js +1 -0
  27. package/dist/core/file-ops/list-files.js +1 -0
  28. package/dist/core/file-ops/types.js +0 -0
  29. package/dist/core/installer/npm-registry.js +4 -4
  30. package/dist/core/runtime/health.js +1 -1
  31. package/dist/core/skill-sync/skill-syncer.js +1 -1
  32. package/dist/core/upgrade/npm-upgrader.js +2 -2
  33. package/dist/core/upgrade/upgrade-checker.js +1 -1
  34. package/dist/default-skills/grix-agent-dispatch/SKILL.md +9 -9
  35. package/dist/grix.js +7 -7
  36. package/dist/log.js +3 -0
  37. package/dist/main.js +31 -0
  38. package/dist/manager.js +1 -2
  39. package/dist/mcp/stream-http/config.js +1 -0
  40. package/dist/mcp/stream-http/connection-binding.js +1 -0
  41. package/dist/mcp/stream-http/event-tool-executor.js +1 -0
  42. package/dist/mcp/stream-http/gateway.js +1 -0
  43. package/dist/mcp/stream-http/index.js +1 -0
  44. package/dist/mcp/stream-http/security.js +1 -0
  45. package/dist/mcp/stream-http/session-manager.js +1 -0
  46. package/dist/mcp/stream-http/tool-executor.js +1 -0
  47. package/dist/mcp/stream-http/tool-registry.js +1 -0
  48. package/dist/mcp/stream-http/tool-schemas.js +1 -0
  49. package/dist/service/platform-adapter.js +25 -24
  50. package/dist/service/process-control.js +1 -1
  51. package/dist/service/service-manager.js +3 -3
  52. package/dist/service/service-paths.js +2 -2
  53. package/dist/service/windows-wrapper-migration.js +1 -0
  54. package/dist/session/index.js +1 -0
  55. package/dist/session/manager.js +1 -0
  56. package/dist/transport/index.js +1 -0
  57. package/dist/transport/json-rpc.js +3 -0
  58. package/openclaw-plugin/audit-recorder-worker.js +496 -54
  59. package/package.json +2 -1
  60. package/scripts/install-guardian.mjs +35 -19
  61. package/scripts/upgrade-guardian.mjs +1345 -0
  62. package/scripts/upgrade-guardian.sh +100 -75
  63. 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, rolls back on crash_count >= 3.
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
- # Extract fields from JSON (portable: no jq dependency)
42
- FROM_VERSION=$(cat "$PENDING_FILE" | grep -o '"from_version":"[^"]*"' | cut -d'"' -f4)
43
- TARGET_VERSION=$(cat "$PENDING_FILE" | grep -o '"target_version":"[^"]*"' | cut -d'"' -f4)
44
- UPGRADED_AT=$(cat "$PENDING_FILE" | grep -o '"upgraded_at":"[^"]*"' | cut -d'"' -f4)
45
- CRASH_COUNT=$(cat "$PENDING_FILE" | grep -o '"crash_count":[0-9]*' | cut -d: -f2)
46
- CRASH_COUNT=${CRASH_COUNT:-0}
47
- PACKAGE_DIR=$(cat "$PENDING_FILE" | grep -o '"package_dir":"[^"]*"' | cut -d'"' -f4)
48
- BACKUP_DIR=$(cat "$PENDING_FILE" | grep -o '"backup_dir":"[^"]*"' | cut -d'"' -f4)
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 return 200 (only after successful activation)
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 curl -sf "$HEALTH_URL" > /dev/null 2>&1; then
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 curl -sf "$HEALTH_URL" > /dev/null 2>&1; then
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
- CRASH_COUNT=$((CRASH_COUNT + 1))
104
- log "healthz timeout or forward activation failed, crash_count=$CRASH_COUNT"
105
-
106
- if [ $CRASH_COUNT -ge $MAX_CRASHES ]; then
107
- # 新版升级器会把完整旧包保留在同文件系统的固定备份目录。优先原子恢复,
108
- # 不依赖网络/npm,也不会再次制造全局 bin 缺失窗口。
109
- case "$PACKAGE_DIR" in
110
- */node_modules/*)
111
- if [ -n "$BACKUP_DIR" ] && [ "$BACKUP_DIR" = "${PACKAGE_DIR}.grix-upgrade-backup" ] && [ -d "$BACKUP_DIR" ]; then
112
- FAILED_DIR="${PACKAGE_DIR}.grix-upgrade-failed-$$"
113
- log "atomic rollback: restoring $BACKUP_DIR"
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
- if { [ ! -e "$PACKAGE_DIR" ] || mv "$PACKAGE_DIR" "$FAILED_DIR"; } \
116
- && mv "$BACKUP_DIR" "$PACKAGE_DIR"; then
117
- rm -rf "$FAILED_DIR"
118
- # 原子恢复只换回全局包;macOS 服务跑的是受管 runtime 副本,必须用
119
- # 旧包 CLI start 刷新副本并触发重启,激活成功才删 pending。
120
- NPM_ROOT="$(npm root -g 2>> "$LOG_FILE")"
121
- ROLLBACK_CLI="$NPM_ROOT/$NPM_PACKAGE/dist/grix.js"
122
- if [ -n "$NPM_ROOT" ] && [ -f "$ROLLBACK_CLI" ] \
123
- && node "$ROLLBACK_CLI" start >> "$LOG_FILE" 2>&1; then
124
- log "atomic rollback succeeded and managed runtime activated; leaving pending for rollback report"
125
- exit 0
126
- fi
127
- # 激活失败不退出:落到下面的 npm 回滚路径再试一次(npm install 旧版幂等)。
128
- log "atomic rollback package restored but managed runtime activation failed; falling through to npm rollback"
129
- else
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 — manual intervention required"
186
+ log "ROLLBACK ACTIVATION FAILED — package restored but managed runtime was not switched"
155
187
  fi
156
- exit 0
157
- fi
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
- echo "{\"from_version\":\"$FROM_VERSION\",\"target_version\":\"$TARGET_VERSION\",\"upgraded_at\":\"$UPGRADED_AT\",\"crash_count\":$CRASH_COUNT$PATH_FIELDS}" > "$PENDING_FILE.tmp"
165
- mv "$PENDING_FILE.tmp" "$PENDING_FILE"
166
- log "updated crash_count to $CRASH_COUNT, exiting"
191
+ exit 0