@helmisatria/mcp-chrome-bridge 1.0.30
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/README.md +183 -0
- package/dist/README.md +25 -0
- package/dist/agent/attachment-service.d.ts +83 -0
- package/dist/agent/attachment-service.js +370 -0
- package/dist/agent/attachment-service.js.map +1 -0
- package/dist/agent/ccr-detector.d.ts +59 -0
- package/dist/agent/ccr-detector.js +311 -0
- package/dist/agent/ccr-detector.js.map +1 -0
- package/dist/agent/chat-service.d.ts +50 -0
- package/dist/agent/chat-service.js +439 -0
- package/dist/agent/chat-service.js.map +1 -0
- package/dist/agent/db/client.d.ts +26 -0
- package/dist/agent/db/client.js +244 -0
- package/dist/agent/db/client.js.map +1 -0
- package/dist/agent/db/index.d.ts +5 -0
- package/dist/agent/db/index.js +22 -0
- package/dist/agent/db/index.js.map +1 -0
- package/dist/agent/db/schema.d.ts +711 -0
- package/dist/agent/db/schema.js +121 -0
- package/dist/agent/db/schema.js.map +1 -0
- package/dist/agent/directory-picker.d.ts +11 -0
- package/dist/agent/directory-picker.js +149 -0
- package/dist/agent/directory-picker.js.map +1 -0
- package/dist/agent/engines/claude.d.ts +79 -0
- package/dist/agent/engines/claude.js +1338 -0
- package/dist/agent/engines/claude.js.map +1 -0
- package/dist/agent/engines/codex.d.ts +48 -0
- package/dist/agent/engines/codex.js +822 -0
- package/dist/agent/engines/codex.js.map +1 -0
- package/dist/agent/engines/types.d.ts +133 -0
- package/dist/agent/engines/types.js +3 -0
- package/dist/agent/engines/types.js.map +1 -0
- package/dist/agent/message-service.d.ts +56 -0
- package/dist/agent/message-service.js +198 -0
- package/dist/agent/message-service.js.map +1 -0
- package/dist/agent/open-project.d.ts +25 -0
- package/dist/agent/open-project.js +469 -0
- package/dist/agent/open-project.js.map +1 -0
- package/dist/agent/project-service.d.ts +49 -0
- package/dist/agent/project-service.js +254 -0
- package/dist/agent/project-service.js.map +1 -0
- package/dist/agent/project-types.d.ts +27 -0
- package/dist/agent/project-types.js +3 -0
- package/dist/agent/project-types.js.map +1 -0
- package/dist/agent/session-service.d.ts +198 -0
- package/dist/agent/session-service.js +292 -0
- package/dist/agent/session-service.js.map +1 -0
- package/dist/agent/storage.d.ts +27 -0
- package/dist/agent/storage.js +73 -0
- package/dist/agent/storage.js.map +1 -0
- package/dist/agent/stream-manager.d.ts +42 -0
- package/dist/agent/stream-manager.js +243 -0
- package/dist/agent/stream-manager.js.map +1 -0
- package/dist/agent/tool-bridge.d.ts +44 -0
- package/dist/agent/tool-bridge.js +50 -0
- package/dist/agent/tool-bridge.js.map +1 -0
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +60 -0
- package/dist/constant/index.js +80 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/file-handler.d.ts +41 -0
- package/dist/file-handler.js +295 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mcp-server-stdio.d.ts +72 -0
- package/dist/mcp/mcp-server-stdio.js +143 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +36 -0
- package/dist/mcp/mcp-server.js +26 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/mcp/register-tools.d.ts +2 -0
- package/dist/mcp/register-tools.js +148 -0
- package/dist/mcp/register-tools.js.map +1 -0
- package/dist/mcp/stdio-config.json +3 -0
- package/dist/native-messaging-host.d.ts +42 -0
- package/dist/native-messaging-host.js +312 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +194 -0
- package/dist/run_host.sh +264 -0
- package/dist/scripts/browser-config.d.ts +28 -0
- package/dist/scripts/browser-config.js +229 -0
- package/dist/scripts/browser-config.js.map +1 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +126 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +4 -0
- package/dist/scripts/constant.js +8 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/doctor.d.ts +70 -0
- package/dist/scripts/doctor.js +930 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +246 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/register-dev.d.ts +1 -0
- package/dist/scripts/register-dev.js +5 -0
- package/dist/scripts/register-dev.js.map +1 -0
- package/dist/scripts/register.d.ts +2 -0
- package/dist/scripts/register.js +28 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/report.d.ts +96 -0
- package/dist/scripts/report.js +686 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/utils.d.ts +64 -0
- package/dist/scripts/utils.js +443 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +312 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/agent.d.ts +21 -0
- package/dist/server/routes/agent.js +971 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +9 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/trace-analyzer.d.ts +14 -0
- package/dist/trace-analyzer.js +113 -0
- package/dist/trace-analyzer.js.map +1 -0
- package/dist/util/logger.d.ts +1 -0
- package/dist/util/logger.js +43 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +91 -0
package/dist/run_host.sh
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Configuration
|
|
4
|
+
ENABLE_LOG_ROTATION="true"
|
|
5
|
+
LOG_RETENTION_COUNT=5
|
|
6
|
+
|
|
7
|
+
# Setup paths
|
|
8
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
9
|
+
NODE_SCRIPT="${SCRIPT_DIR}/index.js"
|
|
10
|
+
|
|
11
|
+
# Setup log directory - prefer user-writable locations
|
|
12
|
+
# macOS: ~/Library/Logs/mcp-chrome-bridge
|
|
13
|
+
# Linux: $XDG_STATE_HOME/mcp-chrome-bridge/logs or ~/.local/state/mcp-chrome-bridge/logs
|
|
14
|
+
if [ "$(uname)" = "Darwin" ]; then
|
|
15
|
+
LOG_DIR="${HOME}/Library/Logs/mcp-chrome-bridge"
|
|
16
|
+
else
|
|
17
|
+
LOG_DIR="${XDG_STATE_HOME:-${HOME}/.local/state}/mcp-chrome-bridge/logs"
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Fallback: if user directory is not writable, use package directory
|
|
21
|
+
if ! mkdir -p "${LOG_DIR}" 2>/dev/null; then
|
|
22
|
+
LOG_DIR="${SCRIPT_DIR}/logs"
|
|
23
|
+
mkdir -p "${LOG_DIR}" 2>/dev/null || true
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Log rotation
|
|
27
|
+
if [ "${ENABLE_LOG_ROTATION}" = "true" ]; then
|
|
28
|
+
# Clean up old logs (both legacy _macos_ and new _unix_ naming)
|
|
29
|
+
ls -tp "${LOG_DIR}/native_host_wrapper_"* 2>/dev/null | tail -n +$((LOG_RETENTION_COUNT + 1)) | xargs -I {} rm -- {}
|
|
30
|
+
ls -tp "${LOG_DIR}/native_host_stderr_"* 2>/dev/null | tail -n +$((LOG_RETENTION_COUNT + 1)) | xargs -I {} rm -- {}
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Logging setup
|
|
34
|
+
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
|
35
|
+
WRAPPER_LOG="${LOG_DIR}/native_host_wrapper_unix_${TIMESTAMP}.log"
|
|
36
|
+
STDERR_LOG="${LOG_DIR}/native_host_stderr_unix_${TIMESTAMP}.log"
|
|
37
|
+
|
|
38
|
+
# Initial logging
|
|
39
|
+
{
|
|
40
|
+
echo "--- Wrapper script called at $(date) ---"
|
|
41
|
+
echo "SCRIPT_DIR: ${SCRIPT_DIR}"
|
|
42
|
+
echo "LOG_DIR: ${LOG_DIR}"
|
|
43
|
+
echo "NODE_SCRIPT: ${NODE_SCRIPT}"
|
|
44
|
+
echo "Initial PATH: ${PATH}"
|
|
45
|
+
echo "CHROME_MCP_NODE_PATH: ${CHROME_MCP_NODE_PATH:-<unset>}"
|
|
46
|
+
echo "VOLTA_HOME: ${VOLTA_HOME:-<unset>}"
|
|
47
|
+
echo "ASDF_DATA_DIR: ${ASDF_DATA_DIR:-<unset>}"
|
|
48
|
+
echo "FNM_DIR: ${FNM_DIR:-<unset>}"
|
|
49
|
+
echo "NVM_DIR: ${NVM_DIR:-<unset>}"
|
|
50
|
+
echo "User: $(whoami)"
|
|
51
|
+
echo "Current PWD: $(pwd)"
|
|
52
|
+
} > "${WRAPPER_LOG}"
|
|
53
|
+
|
|
54
|
+
# Node.js discovery
|
|
55
|
+
NODE_EXEC=""
|
|
56
|
+
NODE_EXEC_SOURCE=""
|
|
57
|
+
NODE_PATH_FILE="${SCRIPT_DIR}/node_path.txt"
|
|
58
|
+
|
|
59
|
+
echo "Searching for Node.js..." >> "${WRAPPER_LOG}"
|
|
60
|
+
|
|
61
|
+
# Priority 0: CHROME_MCP_NODE_PATH environment variable override
|
|
62
|
+
echo "[Priority 0] Checking CHROME_MCP_NODE_PATH override" >> "${WRAPPER_LOG}"
|
|
63
|
+
if [ -n "${CHROME_MCP_NODE_PATH:-}" ]; then
|
|
64
|
+
CANDIDATE_NODE="${CHROME_MCP_NODE_PATH}"
|
|
65
|
+
# Expand tilde
|
|
66
|
+
if [[ "${CANDIDATE_NODE}" == "~/"* ]]; then
|
|
67
|
+
CANDIDATE_NODE="${HOME}/${CANDIDATE_NODE#~/}"
|
|
68
|
+
fi
|
|
69
|
+
# If directory, append /node
|
|
70
|
+
if [ -d "${CANDIDATE_NODE}" ]; then
|
|
71
|
+
CANDIDATE_NODE="${CANDIDATE_NODE%/}/node"
|
|
72
|
+
fi
|
|
73
|
+
if [ -x "${CANDIDATE_NODE}" ]; then
|
|
74
|
+
NODE_EXEC="${CANDIDATE_NODE}"
|
|
75
|
+
NODE_EXEC_SOURCE="CHROME_MCP_NODE_PATH"
|
|
76
|
+
echo "Found node via CHROME_MCP_NODE_PATH: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
77
|
+
else
|
|
78
|
+
echo "CHROME_MCP_NODE_PATH is set but not executable: ${CANDIDATE_NODE}" >> "${WRAPPER_LOG}"
|
|
79
|
+
fi
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# Priority 1: Installation-time node path
|
|
83
|
+
echo "[Priority 1] Checking installation-time node path" >> "${WRAPPER_LOG}"
|
|
84
|
+
if [ -z "${NODE_EXEC}" ] && [ -f "${NODE_PATH_FILE}" ]; then
|
|
85
|
+
EXPECTED_NODE=$(cat "${NODE_PATH_FILE}" 2>/dev/null | tr -d '\n\r')
|
|
86
|
+
if [ -n "${EXPECTED_NODE}" ] && [ -x "${EXPECTED_NODE}" ]; then
|
|
87
|
+
NODE_EXEC="${EXPECTED_NODE}"
|
|
88
|
+
NODE_EXEC_SOURCE="node_path.txt"
|
|
89
|
+
echo "Found installation-time node at ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
90
|
+
else
|
|
91
|
+
echo "node_path.txt exists but path invalid or not executable: ${EXPECTED_NODE}" >> "${WRAPPER_LOG}"
|
|
92
|
+
fi
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Priority 1.5: Fallback to relative path
|
|
96
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
97
|
+
EXPECTED_NODE="${SCRIPT_DIR}/../../../bin/node"
|
|
98
|
+
echo "[Priority 1.5] Checking relative path" >> "${WRAPPER_LOG}"
|
|
99
|
+
if [ -x "${EXPECTED_NODE}" ]; then
|
|
100
|
+
NODE_EXEC="${EXPECTED_NODE}"
|
|
101
|
+
NODE_EXEC_SOURCE="relative"
|
|
102
|
+
echo "Found node at relative path: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
103
|
+
fi
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Priority 2: Volta
|
|
107
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
108
|
+
echo "[Priority 2] Checking Volta" >> "${WRAPPER_LOG}"
|
|
109
|
+
VOLTA_HOME_CANDIDATE="${VOLTA_HOME:-$HOME/.volta}"
|
|
110
|
+
VOLTA_NODE="${VOLTA_HOME_CANDIDATE}/bin/node"
|
|
111
|
+
if [ -x "${VOLTA_NODE}" ]; then
|
|
112
|
+
NODE_EXEC="${VOLTA_NODE}"
|
|
113
|
+
NODE_EXEC_SOURCE="volta"
|
|
114
|
+
echo "Found Volta node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
115
|
+
fi
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
# Priority 3: asdf
|
|
119
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
120
|
+
echo "[Priority 3] Checking asdf" >> "${WRAPPER_LOG}"
|
|
121
|
+
ASDF_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
|
|
122
|
+
ASDF_NODEJS_DIR="${ASDF_DIR}/installs/nodejs"
|
|
123
|
+
if [ -d "${ASDF_NODEJS_DIR}" ]; then
|
|
124
|
+
# Find the latest version directory
|
|
125
|
+
LATEST_ASDF_NODE_DIR=$(ls -1d "${ASDF_NODEJS_DIR}/"* 2>/dev/null | sort -V | tail -n 1)
|
|
126
|
+
if [ -n "${LATEST_ASDF_NODE_DIR}" ] && [ -x "${LATEST_ASDF_NODE_DIR}/bin/node" ]; then
|
|
127
|
+
NODE_EXEC="${LATEST_ASDF_NODE_DIR}/bin/node"
|
|
128
|
+
NODE_EXEC_SOURCE="asdf"
|
|
129
|
+
echo "Found asdf node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
130
|
+
fi
|
|
131
|
+
fi
|
|
132
|
+
fi
|
|
133
|
+
|
|
134
|
+
# Priority 4: fnm
|
|
135
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
136
|
+
echo "[Priority 4] Checking fnm" >> "${WRAPPER_LOG}"
|
|
137
|
+
FNM_HOME_CANDIDATE="${FNM_DIR:-$HOME/.fnm}"
|
|
138
|
+
FNM_NODE_VERSIONS_DIR="${FNM_HOME_CANDIDATE}/node-versions"
|
|
139
|
+
if [ -d "${FNM_NODE_VERSIONS_DIR}" ]; then
|
|
140
|
+
# Find the latest version directory
|
|
141
|
+
LATEST_FNM_NODE_DIR=$(ls -1d "${FNM_NODE_VERSIONS_DIR}/"* 2>/dev/null | sort -V | tail -n 1)
|
|
142
|
+
if [ -n "${LATEST_FNM_NODE_DIR}" ] && [ -x "${LATEST_FNM_NODE_DIR}/installation/bin/node" ]; then
|
|
143
|
+
NODE_EXEC="${LATEST_FNM_NODE_DIR}/installation/bin/node"
|
|
144
|
+
NODE_EXEC_SOURCE="fnm"
|
|
145
|
+
echo "Found fnm node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
146
|
+
fi
|
|
147
|
+
fi
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Priority 5: NVM
|
|
151
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
152
|
+
echo "[Priority 5] Checking NVM" >> "${WRAPPER_LOG}"
|
|
153
|
+
NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
|
154
|
+
if [ -d "${NVM_DIR}" ]; then
|
|
155
|
+
# Try default version first (check both symlink and file)
|
|
156
|
+
NVM_DEFAULT_ALIAS="${NVM_DIR}/alias/default"
|
|
157
|
+
if [ -e "${NVM_DEFAULT_ALIAS}" ]; then
|
|
158
|
+
if [ -L "${NVM_DEFAULT_ALIAS}" ]; then
|
|
159
|
+
NVM_DEFAULT_VERSION=$(readlink "${NVM_DEFAULT_ALIAS}")
|
|
160
|
+
else
|
|
161
|
+
NVM_DEFAULT_VERSION=$(cat "${NVM_DEFAULT_ALIAS}" 2>/dev/null | tr -d '\n\r')
|
|
162
|
+
fi
|
|
163
|
+
NVM_DEFAULT_NODE="${NVM_DIR}/versions/node/${NVM_DEFAULT_VERSION}/bin/node"
|
|
164
|
+
if [ -x "${NVM_DEFAULT_NODE}" ]; then
|
|
165
|
+
NODE_EXEC="${NVM_DEFAULT_NODE}"
|
|
166
|
+
NODE_EXEC_SOURCE="nvm-default"
|
|
167
|
+
echo "Found NVM default node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
168
|
+
fi
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
# Fallback to latest version
|
|
172
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
173
|
+
LATEST_NVM_VERSION_PATH=$(ls -d "${NVM_DIR}"/versions/node/v* 2>/dev/null | sort -V | tail -n 1)
|
|
174
|
+
if [ -n "${LATEST_NVM_VERSION_PATH}" ] && [ -x "${LATEST_NVM_VERSION_PATH}/bin/node" ]; then
|
|
175
|
+
NODE_EXEC="${LATEST_NVM_VERSION_PATH}/bin/node"
|
|
176
|
+
NODE_EXEC_SOURCE="nvm-latest"
|
|
177
|
+
echo "Found NVM latest node: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
fi
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
# Priority 6: Common paths
|
|
184
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
185
|
+
echo "[Priority 6] Checking common paths" >> "${WRAPPER_LOG}"
|
|
186
|
+
COMMON_NODE_PATHS=(
|
|
187
|
+
"/opt/homebrew/bin/node"
|
|
188
|
+
"/usr/local/bin/node"
|
|
189
|
+
"/usr/bin/node"
|
|
190
|
+
)
|
|
191
|
+
for path_to_node in "${COMMON_NODE_PATHS[@]}"; do
|
|
192
|
+
if [ -x "${path_to_node}" ]; then
|
|
193
|
+
NODE_EXEC="${path_to_node}"
|
|
194
|
+
NODE_EXEC_SOURCE="common"
|
|
195
|
+
echo "Found node at: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
196
|
+
break
|
|
197
|
+
fi
|
|
198
|
+
done
|
|
199
|
+
fi
|
|
200
|
+
|
|
201
|
+
# Priority 7: command -v
|
|
202
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
203
|
+
echo "[Priority 7] Trying 'command -v node'" >> "${WRAPPER_LOG}"
|
|
204
|
+
if command -v node &>/dev/null; then
|
|
205
|
+
NODE_EXEC=$(command -v node)
|
|
206
|
+
NODE_EXEC_SOURCE="command -v"
|
|
207
|
+
echo "Found node using 'command -v': ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
208
|
+
fi
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
# Priority 8: PATH search
|
|
212
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
213
|
+
echo "[Priority 8] Searching PATH" >> "${WRAPPER_LOG}"
|
|
214
|
+
OLD_IFS=$IFS
|
|
215
|
+
IFS=:
|
|
216
|
+
for path_in_env in $PATH; do
|
|
217
|
+
if [ -x "${path_in_env}/node" ]; then
|
|
218
|
+
NODE_EXEC="${path_in_env}/node"
|
|
219
|
+
NODE_EXEC_SOURCE="PATH"
|
|
220
|
+
echo "Found node in PATH: ${NODE_EXEC}" >> "${WRAPPER_LOG}"
|
|
221
|
+
break
|
|
222
|
+
fi
|
|
223
|
+
done
|
|
224
|
+
IFS=$OLD_IFS
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# Execution
|
|
228
|
+
if [ -z "${NODE_EXEC}" ]; then
|
|
229
|
+
{
|
|
230
|
+
echo "ERROR: Node.js executable not found!"
|
|
231
|
+
echo "Searched: CHROME_MCP_NODE_PATH, node_path.txt, relative path, Volta, asdf, fnm, NVM, common paths, command -v, PATH"
|
|
232
|
+
echo "To fix: Set CHROME_MCP_NODE_PATH environment variable or run 'mcp-chrome-bridge doctor --fix'"
|
|
233
|
+
} >> "${WRAPPER_LOG}"
|
|
234
|
+
exit 1
|
|
235
|
+
fi
|
|
236
|
+
|
|
237
|
+
if [ ! -f "${NODE_SCRIPT}" ]; then
|
|
238
|
+
echo "ERROR: Node.js script not found at ${NODE_SCRIPT}" >> "${WRAPPER_LOG}"
|
|
239
|
+
exit 1
|
|
240
|
+
fi
|
|
241
|
+
|
|
242
|
+
{
|
|
243
|
+
echo "Using Node executable: ${NODE_EXEC}"
|
|
244
|
+
echo "Node discovery source: ${NODE_EXEC_SOURCE:-unknown}"
|
|
245
|
+
echo "Node version: $(${NODE_EXEC} -v)"
|
|
246
|
+
echo "Executing: ${NODE_EXEC} ${NODE_SCRIPT}"
|
|
247
|
+
} >> "${WRAPPER_LOG}"
|
|
248
|
+
|
|
249
|
+
# Add Node.js bin directory to PATH so child processes can find node and related tools
|
|
250
|
+
NODE_BIN_DIR="$(dirname "${NODE_EXEC}")"
|
|
251
|
+
# Use ${PATH:+:${PATH}} to avoid trailing colon when PATH is empty (security concern)
|
|
252
|
+
export PATH="${NODE_BIN_DIR}${PATH:+:${PATH}}"
|
|
253
|
+
echo "Added ${NODE_BIN_DIR} to PATH" >> "${WRAPPER_LOG}"
|
|
254
|
+
|
|
255
|
+
# Log Claude Code Router (CCR) related env vars for debugging
|
|
256
|
+
# These are set by `eval "$(ccr activate)"` or in shell profile
|
|
257
|
+
if [ -n "${ANTHROPIC_BASE_URL:-}" ]; then
|
|
258
|
+
echo "ANTHROPIC_BASE_URL is set: ${ANTHROPIC_BASE_URL}" >> "${WRAPPER_LOG}"
|
|
259
|
+
fi
|
|
260
|
+
if [ -n "${ANTHROPIC_AUTH_TOKEN:-}" ]; then
|
|
261
|
+
echo "ANTHROPIC_AUTH_TOKEN is set (value hidden)" >> "${WRAPPER_LOG}"
|
|
262
|
+
fi
|
|
263
|
+
|
|
264
|
+
exec "${NODE_EXEC}" "${NODE_SCRIPT}" 2>> "${STDERR_LOG}"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare enum BrowserType {
|
|
2
|
+
CHROME = "chrome",
|
|
3
|
+
CHROMIUM = "chromium"
|
|
4
|
+
}
|
|
5
|
+
export interface BrowserConfig {
|
|
6
|
+
type: BrowserType;
|
|
7
|
+
displayName: string;
|
|
8
|
+
userManifestPath: string;
|
|
9
|
+
systemManifestPath: string;
|
|
10
|
+
registryKey?: string;
|
|
11
|
+
systemRegistryKey?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get browser configuration
|
|
15
|
+
*/
|
|
16
|
+
export declare function getBrowserConfig(browser: BrowserType): BrowserConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Detect installed browsers on the system
|
|
19
|
+
*/
|
|
20
|
+
export declare function detectInstalledBrowsers(): BrowserType[];
|
|
21
|
+
/**
|
|
22
|
+
* Get all supported browser configs
|
|
23
|
+
*/
|
|
24
|
+
export declare function getAllBrowserConfigs(): BrowserConfig[];
|
|
25
|
+
/**
|
|
26
|
+
* Parse browser type from string
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseBrowserType(browserStr: string): BrowserType | undefined;
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BrowserType = void 0;
|
|
37
|
+
exports.getBrowserConfig = getBrowserConfig;
|
|
38
|
+
exports.detectInstalledBrowsers = detectInstalledBrowsers;
|
|
39
|
+
exports.getAllBrowserConfigs = getAllBrowserConfigs;
|
|
40
|
+
exports.parseBrowserType = parseBrowserType;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const child_process_1 = require("child_process");
|
|
45
|
+
const constant_1 = require("./constant");
|
|
46
|
+
var BrowserType;
|
|
47
|
+
(function (BrowserType) {
|
|
48
|
+
BrowserType["CHROME"] = "chrome";
|
|
49
|
+
BrowserType["CHROMIUM"] = "chromium";
|
|
50
|
+
})(BrowserType || (exports.BrowserType = BrowserType = {}));
|
|
51
|
+
/**
|
|
52
|
+
* Get the user-level manifest path for a specific browser
|
|
53
|
+
*/
|
|
54
|
+
function getUserManifestPathForBrowser(browser) {
|
|
55
|
+
const platform = os.platform();
|
|
56
|
+
if (platform === 'win32') {
|
|
57
|
+
const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming');
|
|
58
|
+
switch (browser) {
|
|
59
|
+
case BrowserType.CHROME:
|
|
60
|
+
return path.join(appData, 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
61
|
+
case BrowserType.CHROMIUM:
|
|
62
|
+
return path.join(appData, 'Chromium', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
63
|
+
default:
|
|
64
|
+
return path.join(appData, 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (platform === 'darwin') {
|
|
68
|
+
const home = os.homedir();
|
|
69
|
+
switch (browser) {
|
|
70
|
+
case BrowserType.CHROME:
|
|
71
|
+
return path.join(home, 'Library', 'Application Support', 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
72
|
+
case BrowserType.CHROMIUM:
|
|
73
|
+
return path.join(home, 'Library', 'Application Support', 'Chromium', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
74
|
+
default:
|
|
75
|
+
return path.join(home, 'Library', 'Application Support', 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
// Linux
|
|
80
|
+
const home = os.homedir();
|
|
81
|
+
switch (browser) {
|
|
82
|
+
case BrowserType.CHROME:
|
|
83
|
+
return path.join(home, '.config', 'google-chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
84
|
+
case BrowserType.CHROMIUM:
|
|
85
|
+
return path.join(home, '.config', 'chromium', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
86
|
+
default:
|
|
87
|
+
return path.join(home, '.config', 'google-chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get the system-level manifest path for a specific browser
|
|
93
|
+
*/
|
|
94
|
+
function getSystemManifestPathForBrowser(browser) {
|
|
95
|
+
const platform = os.platform();
|
|
96
|
+
if (platform === 'win32') {
|
|
97
|
+
const programFiles = process.env.ProgramFiles || 'C:\\Program Files';
|
|
98
|
+
switch (browser) {
|
|
99
|
+
case BrowserType.CHROME:
|
|
100
|
+
return path.join(programFiles, 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
101
|
+
case BrowserType.CHROMIUM:
|
|
102
|
+
return path.join(programFiles, 'Chromium', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
103
|
+
default:
|
|
104
|
+
return path.join(programFiles, 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else if (platform === 'darwin') {
|
|
108
|
+
switch (browser) {
|
|
109
|
+
case BrowserType.CHROME:
|
|
110
|
+
return path.join('/Library', 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
111
|
+
case BrowserType.CHROMIUM:
|
|
112
|
+
return path.join('/Library', 'Application Support', 'Chromium', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
113
|
+
default:
|
|
114
|
+
return path.join('/Library', 'Google', 'Chrome', 'NativeMessagingHosts', `${constant_1.HOST_NAME}.json`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Linux
|
|
119
|
+
switch (browser) {
|
|
120
|
+
case BrowserType.CHROME:
|
|
121
|
+
return path.join('/etc', 'opt', 'chrome', 'native-messaging-hosts', `${constant_1.HOST_NAME}.json`);
|
|
122
|
+
case BrowserType.CHROMIUM:
|
|
123
|
+
return path.join('/etc', 'chromium', 'native-messaging-hosts', `${constant_1.HOST_NAME}.json`);
|
|
124
|
+
default:
|
|
125
|
+
return path.join('/etc', 'opt', 'chrome', 'native-messaging-hosts', `${constant_1.HOST_NAME}.json`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get Windows registry keys for a browser
|
|
131
|
+
*/
|
|
132
|
+
function getRegistryKeys(browser) {
|
|
133
|
+
if (os.platform() !== 'win32')
|
|
134
|
+
return undefined;
|
|
135
|
+
const browserPaths = {
|
|
136
|
+
[BrowserType.CHROME]: {
|
|
137
|
+
user: `HKCU\\Software\\Google\\Chrome\\NativeMessagingHosts\\${constant_1.HOST_NAME}`,
|
|
138
|
+
system: `HKLM\\Software\\Google\\Chrome\\NativeMessagingHosts\\${constant_1.HOST_NAME}`,
|
|
139
|
+
},
|
|
140
|
+
[BrowserType.CHROMIUM]: {
|
|
141
|
+
user: `HKCU\\Software\\Chromium\\NativeMessagingHosts\\${constant_1.HOST_NAME}`,
|
|
142
|
+
system: `HKLM\\Software\\Chromium\\NativeMessagingHosts\\${constant_1.HOST_NAME}`,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
return browserPaths[browser];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get browser configuration
|
|
149
|
+
*/
|
|
150
|
+
function getBrowserConfig(browser) {
|
|
151
|
+
const registryKeys = getRegistryKeys(browser);
|
|
152
|
+
return {
|
|
153
|
+
type: browser,
|
|
154
|
+
displayName: browser.charAt(0).toUpperCase() + browser.slice(1),
|
|
155
|
+
userManifestPath: getUserManifestPathForBrowser(browser),
|
|
156
|
+
systemManifestPath: getSystemManifestPathForBrowser(browser),
|
|
157
|
+
registryKey: registryKeys === null || registryKeys === void 0 ? void 0 : registryKeys.user,
|
|
158
|
+
systemRegistryKey: registryKeys === null || registryKeys === void 0 ? void 0 : registryKeys.system,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Detect installed browsers on the system
|
|
163
|
+
*/
|
|
164
|
+
function detectInstalledBrowsers() {
|
|
165
|
+
const detectedBrowsers = [];
|
|
166
|
+
const platform = os.platform();
|
|
167
|
+
if (platform === 'win32') {
|
|
168
|
+
// Check Windows registry for installed browsers
|
|
169
|
+
const browsers = [
|
|
170
|
+
{ type: BrowserType.CHROME, registryPath: 'HKLM\\SOFTWARE\\Google\\Chrome' },
|
|
171
|
+
{ type: BrowserType.CHROMIUM, registryPath: 'HKLM\\SOFTWARE\\Chromium' },
|
|
172
|
+
];
|
|
173
|
+
for (const browser of browsers) {
|
|
174
|
+
try {
|
|
175
|
+
(0, child_process_1.execSync)(`reg query "${browser.registryPath}" 2>nul`, { stdio: 'pipe' });
|
|
176
|
+
detectedBrowsers.push(browser.type);
|
|
177
|
+
}
|
|
178
|
+
catch (_a) {
|
|
179
|
+
// Browser not installed
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (platform === 'darwin') {
|
|
184
|
+
// Check macOS Applications folder
|
|
185
|
+
const browsers = [
|
|
186
|
+
{ type: BrowserType.CHROME, appPath: '/Applications/Google Chrome.app' },
|
|
187
|
+
{ type: BrowserType.CHROMIUM, appPath: '/Applications/Chromium.app' },
|
|
188
|
+
];
|
|
189
|
+
for (const browser of browsers) {
|
|
190
|
+
if (fs.existsSync(browser.appPath)) {
|
|
191
|
+
detectedBrowsers.push(browser.type);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
// Check Linux paths using which command
|
|
197
|
+
const browsers = [
|
|
198
|
+
{ type: BrowserType.CHROME, commands: ['google-chrome', 'google-chrome-stable'] },
|
|
199
|
+
{ type: BrowserType.CHROMIUM, commands: ['chromium', 'chromium-browser'] },
|
|
200
|
+
];
|
|
201
|
+
for (const browser of browsers) {
|
|
202
|
+
for (const cmd of browser.commands) {
|
|
203
|
+
try {
|
|
204
|
+
(0, child_process_1.execSync)(`which ${cmd} 2>/dev/null`, { stdio: 'pipe' });
|
|
205
|
+
detectedBrowsers.push(browser.type);
|
|
206
|
+
break; // Found one command, no need to check others
|
|
207
|
+
}
|
|
208
|
+
catch (_b) {
|
|
209
|
+
// Command not found
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return detectedBrowsers;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get all supported browser configs
|
|
218
|
+
*/
|
|
219
|
+
function getAllBrowserConfigs() {
|
|
220
|
+
return Object.values(BrowserType).map((browser) => getBrowserConfig(browser));
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Parse browser type from string
|
|
224
|
+
*/
|
|
225
|
+
function parseBrowserType(browserStr) {
|
|
226
|
+
const normalized = browserStr.toLowerCase();
|
|
227
|
+
return Object.values(BrowserType).find((type) => type === normalized);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=browser-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-config.js","sourceRoot":"","sources":["../../src/scripts/browser-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const child_process_1 = require("child_process");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const distDir = path_1.default.join(__dirname, '..', '..', 'dist');
|
|
10
|
+
// 清理上次构建
|
|
11
|
+
console.log('清理上次构建...');
|
|
12
|
+
try {
|
|
13
|
+
fs_1.default.rmSync(distDir, { recursive: true, force: true });
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
// 忽略目录不存在的错误
|
|
17
|
+
console.log(err);
|
|
18
|
+
}
|
|
19
|
+
// 创建dist目录
|
|
20
|
+
fs_1.default.mkdirSync(distDir, { recursive: true });
|
|
21
|
+
fs_1.default.mkdirSync(path_1.default.join(distDir, 'logs'), { recursive: true }); // 创建logs目录
|
|
22
|
+
console.log('dist 和 dist/logs 目录已创建/确认存在');
|
|
23
|
+
// 编译TypeScript
|
|
24
|
+
console.log('编译TypeScript...');
|
|
25
|
+
(0, child_process_1.execSync)('tsc', { stdio: 'inherit' });
|
|
26
|
+
// 复制配置文件
|
|
27
|
+
console.log('复制配置文件...');
|
|
28
|
+
const configSourcePath = path_1.default.join(__dirname, '..', 'mcp', 'stdio-config.json');
|
|
29
|
+
const configDestPath = path_1.default.join(distDir, 'mcp', 'stdio-config.json');
|
|
30
|
+
try {
|
|
31
|
+
// 确保目标目录存在
|
|
32
|
+
fs_1.default.mkdirSync(path_1.default.dirname(configDestPath), { recursive: true });
|
|
33
|
+
if (fs_1.default.existsSync(configSourcePath)) {
|
|
34
|
+
fs_1.default.copyFileSync(configSourcePath, configDestPath);
|
|
35
|
+
console.log(`已将 stdio-config.json 复制到 ${configDestPath}`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(`错误: 配置文件未找到: ${configSourcePath}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('复制配置文件时出错:', error);
|
|
43
|
+
}
|
|
44
|
+
// 复制package.json并更新其内容
|
|
45
|
+
console.log('准备package.json...');
|
|
46
|
+
const packageJson = require('../../package.json');
|
|
47
|
+
// 创建安装说明
|
|
48
|
+
const readmeContent = `# ${packageJson.name}
|
|
49
|
+
|
|
50
|
+
本程序为Chrome扩展的Native Messaging主机端。
|
|
51
|
+
|
|
52
|
+
## 安装说明
|
|
53
|
+
|
|
54
|
+
1. 确保已安装Node.js
|
|
55
|
+
2. 全局安装本程序:
|
|
56
|
+
\`\`\`
|
|
57
|
+
npm install -g ${packageJson.name}
|
|
58
|
+
\`\`\`
|
|
59
|
+
3. 注册Native Messaging主机:
|
|
60
|
+
\`\`\`
|
|
61
|
+
# 用户级别安装(推荐)
|
|
62
|
+
${packageJson.name} register
|
|
63
|
+
|
|
64
|
+
# 如果用户级别安装失败,可以尝试系统级别安装
|
|
65
|
+
${packageJson.name} register --system
|
|
66
|
+
# 或者使用管理员权限
|
|
67
|
+
sudo ${packageJson.name} register
|
|
68
|
+
\`\`\`
|
|
69
|
+
|
|
70
|
+
## 使用方法
|
|
71
|
+
|
|
72
|
+
此应用程序由Chrome扩展自动启动,无需手动运行。
|
|
73
|
+
`;
|
|
74
|
+
fs_1.default.writeFileSync(path_1.default.join(distDir, 'README.md'), readmeContent);
|
|
75
|
+
console.log('复制包装脚本...');
|
|
76
|
+
const scriptsSourceDir = path_1.default.join(__dirname, '.');
|
|
77
|
+
const macOsWrapperSourcePath = path_1.default.join(scriptsSourceDir, 'run_host.sh');
|
|
78
|
+
const windowsWrapperSourcePath = path_1.default.join(scriptsSourceDir, 'run_host.bat');
|
|
79
|
+
const macOsWrapperDestPath = path_1.default.join(distDir, 'run_host.sh');
|
|
80
|
+
const windowsWrapperDestPath = path_1.default.join(distDir, 'run_host.bat');
|
|
81
|
+
try {
|
|
82
|
+
if (fs_1.default.existsSync(macOsWrapperSourcePath)) {
|
|
83
|
+
fs_1.default.copyFileSync(macOsWrapperSourcePath, macOsWrapperDestPath);
|
|
84
|
+
console.log(`已将 ${macOsWrapperSourcePath} 复制到 ${macOsWrapperDestPath}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(`错误: macOS 包装脚本源文件未找到: ${macOsWrapperSourcePath}`);
|
|
88
|
+
}
|
|
89
|
+
if (fs_1.default.existsSync(windowsWrapperSourcePath)) {
|
|
90
|
+
fs_1.default.copyFileSync(windowsWrapperSourcePath, windowsWrapperDestPath);
|
|
91
|
+
console.log(`已将 ${windowsWrapperSourcePath} 复制到 ${windowsWrapperDestPath}`);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.error(`错误: Windows 包装脚本源文件未找到: ${windowsWrapperSourcePath}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('复制包装脚本时出错:', error);
|
|
99
|
+
}
|
|
100
|
+
// 为关键JavaScript文件和macOS包装脚本添加可执行权限
|
|
101
|
+
console.log('添加可执行权限...');
|
|
102
|
+
const filesToMakeExecutable = ['index.js', 'cli.js', 'run_host.sh']; // cli.js 假设在 dist 根目录
|
|
103
|
+
filesToMakeExecutable.forEach((file) => {
|
|
104
|
+
const filePath = path_1.default.join(distDir, file); // filePath 现在是目标路径
|
|
105
|
+
try {
|
|
106
|
+
if (fs_1.default.existsSync(filePath)) {
|
|
107
|
+
fs_1.default.chmodSync(filePath, '755');
|
|
108
|
+
console.log(`已为 ${file} 添加可执行权限 (755)`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.warn(`警告: ${filePath} 不存在,无法添加可执行权限`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.error(`为 ${file} 添加可执行权限时出错:`, error);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// Write node_path.txt immediately after build to ensure Chrome uses the correct Node.js version.
|
|
119
|
+
// This is critical for development mode where dist is deleted on each rebuild.
|
|
120
|
+
// The file points to the same Node.js that compiled the native modules (better-sqlite3 etc.)
|
|
121
|
+
console.log('写入 node_path.txt...');
|
|
122
|
+
const nodePathFile = path_1.default.join(distDir, 'node_path.txt');
|
|
123
|
+
fs_1.default.writeFileSync(nodePathFile, process.execPath, 'utf8');
|
|
124
|
+
console.log(`已写入 Node.js 路径: ${process.execPath}`);
|
|
125
|
+
console.log('✅ 构建完成');
|
|
126
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/scripts/build.ts"],"names":[],"mappings":"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"}
|