@coze-arch/cli 0.0.36-alpha.102c95 → 0.0.36-alpha.15544e
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 +5 -2
- package/docs/deploy.md +50 -41
- package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +35 -2
- package/lib/__templates__/expo/pnpm-lock.yaml +5 -5
- package/lib/__templates__/expo/server/package.json +1 -1
- package/lib/__templates__/nextjs/package.json +3 -3
- package/lib/__templates__/nextjs/pnpm-lock.yaml +513 -9
- package/lib/__templates__/nextjs/scripts/dev.sh +159 -14
- package/lib/__templates__/nextjs/template.config.js +1 -1
- package/lib/__templates__/nuxt-vue/package.json +1 -1
- package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +5 -5
- package/lib/__templates__/nuxt-vue/scripts/dev.sh +29 -1
- package/lib/__templates__/pi-agent/package.json +1 -1
- package/lib/__templates__/pi-agent/pnpm-lock.yaml +5 -5
- package/lib/__templates__/taro/.cozeproj/scripts/dev_run.sh +29 -1
- package/lib/__templates__/taro/pnpm-lock.yaml +5 -5
- package/lib/__templates__/taro/server/package.json +1 -1
- package/lib/__templates__/vite/package.json +1 -1
- package/lib/__templates__/vite/pnpm-lock.yaml +5 -5
- package/lib/__templates__/vite/scripts/dev.sh +29 -1
- package/lib/__templates__/vite/template.config.js +1 -1
- package/lib/cli.js +429 -214
- package/package.json +1 -1
|
@@ -14,22 +14,42 @@ DEPLOY_RUN_PORT="${DEPLOY_RUN_PORT:-${PORT}}"
|
|
|
14
14
|
|
|
15
15
|
cd "${COZE_WORKSPACE_PATH}"
|
|
16
16
|
|
|
17
|
+
list_port_pids() {
|
|
18
|
+
local port=$1
|
|
19
|
+
local pids=""
|
|
20
|
+
local has_tool=0
|
|
21
|
+
|
|
22
|
+
if command -v ss >/dev/null 2>&1; then
|
|
23
|
+
has_tool=1
|
|
24
|
+
pids=$(ss -H -lntp 2>/dev/null | awk -v port="${port}" '$4 ~ ":"port"$"' | grep -o 'pid=[0-9]*' | cut -d= -f2 | sort -u | paste -sd' ' - || true)
|
|
25
|
+
fi
|
|
26
|
+
if [[ -z "${pids}" ]] && command -v lsof >/dev/null 2>&1; then
|
|
27
|
+
has_tool=1
|
|
28
|
+
pids=$(lsof -t -iTCP:"${port}" -sTCP:LISTEN 2>/dev/null | sort -u | paste -sd' ' - || true)
|
|
29
|
+
fi
|
|
30
|
+
if [[ "${has_tool}" -eq 0 ]]; then
|
|
31
|
+
echo "Warning: neither ss nor lsof available, cannot inspect port ${port}." >&2
|
|
32
|
+
fi
|
|
33
|
+
|
|
34
|
+
echo "${pids}"
|
|
35
|
+
}
|
|
36
|
+
|
|
17
37
|
kill_port_if_listening() {
|
|
18
38
|
local pids
|
|
19
|
-
pids=$(
|
|
39
|
+
pids=$(list_port_pids "${DEPLOY_RUN_PORT}")
|
|
20
40
|
if [[ -z "${pids}" ]]; then
|
|
21
41
|
echo "Port ${DEPLOY_RUN_PORT} is free."
|
|
22
42
|
return
|
|
23
43
|
fi
|
|
24
44
|
echo "Port ${DEPLOY_RUN_PORT} in use by PIDs: ${pids} (SIGKILL)"
|
|
25
|
-
echo "${pids}" | xargs -I {} kill -9 {}
|
|
45
|
+
echo "${pids}" | xargs -I {} kill -9 {} || true
|
|
26
46
|
sleep 1
|
|
27
|
-
pids=$(
|
|
47
|
+
pids=$(list_port_pids "${DEPLOY_RUN_PORT}")
|
|
28
48
|
if [[ -n "${pids}" ]]; then
|
|
29
|
-
echo "
|
|
30
|
-
|
|
31
|
-
echo "Port ${DEPLOY_RUN_PORT} cleared."
|
|
49
|
+
echo "端口 ${DEPLOY_RUN_PORT} 被 PID ${pids} 占用且无法清理(SIGKILL 后仍在监听),dev server 无法启动。" >&2
|
|
50
|
+
exit 1
|
|
32
51
|
fi
|
|
52
|
+
echo "Port ${DEPLOY_RUN_PORT} cleared."
|
|
33
53
|
}
|
|
34
54
|
|
|
35
55
|
<% if (process.env.NODE_ENV === 'test') { %>
|
|
@@ -41,17 +61,42 @@ echo "Starting HTTP service on port ${DEPLOY_RUN_PORT} for dev..."
|
|
|
41
61
|
exec env PORT="${DEPLOY_RUN_PORT}" pnpm tsx watch src/server.ts
|
|
42
62
|
<% } else { %>
|
|
43
63
|
LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
|
|
44
|
-
LOG_FILE="${LOG_DIR}/
|
|
64
|
+
LOG_FILE="${LOG_DIR}/app.log"
|
|
45
65
|
PID_FILE="${LOG_DIR}/server.pid"
|
|
46
66
|
|
|
47
|
-
#
|
|
48
|
-
|
|
67
|
+
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
68
|
+
MAX_RUNTIME_SECONDS=1200
|
|
69
|
+
|
|
70
|
+
# 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
|
|
71
|
+
# (wrapper -> pnpm -> tsx -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
|
|
72
|
+
RUN_WITH_TIMEOUT='
|
|
73
|
+
timeout_seconds=$1
|
|
74
|
+
shift
|
|
75
|
+
|
|
76
|
+
"$@" &
|
|
77
|
+
child_pid=$!
|
|
78
|
+
|
|
79
|
+
# 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
|
|
80
|
+
( trap "" TERM
|
|
81
|
+
sleep "${timeout_seconds}"
|
|
82
|
+
echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
|
|
83
|
+
kill -TERM -- "-$$" 2>/dev/null || true
|
|
84
|
+
sleep 5
|
|
85
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
86
|
+
) &
|
|
87
|
+
|
|
88
|
+
wait "${child_pid}"
|
|
89
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
90
|
+
'
|
|
91
|
+
|
|
92
|
+
# 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
|
|
49
93
|
spawn_detached() {
|
|
50
94
|
local cwd="$1"
|
|
51
95
|
local log_file="$2"
|
|
52
96
|
shift 2
|
|
53
97
|
|
|
54
|
-
node - "$cwd" "$log_file"
|
|
98
|
+
node - "$cwd" "$log_file" \
|
|
99
|
+
/bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
|
|
55
100
|
const fs = require('node:fs');
|
|
56
101
|
const { spawn } = require('node:child_process');
|
|
57
102
|
|
|
@@ -87,6 +132,89 @@ stop_detached() {
|
|
|
87
132
|
kill -KILL -- "-${pid}" 2>/dev/null || true
|
|
88
133
|
}
|
|
89
134
|
|
|
135
|
+
READY_RETRIES=10
|
|
136
|
+
READY_PROBE_HOSTS=("127.0.0.1" "::1")
|
|
137
|
+
LOG_TAIL_LINES=40
|
|
138
|
+
|
|
139
|
+
dump_log() {
|
|
140
|
+
echo "---- tail -n ${LOG_TAIL_LINES} ${LOG_FILE} ----" >&2
|
|
141
|
+
tail -n "${LOG_TAIL_LINES}" "${LOG_FILE}" >&2 || true
|
|
142
|
+
echo "---- end of ${LOG_FILE} ----" >&2
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
# 仅用于无 ss/lsof 时的兜底探测。服务可能只 bind IPv4 loopback、只 bind IPv6 loopback
|
|
146
|
+
# (server.listen(port, 'localhost') 会变成 ::1 独占),或 bind 双栈通配地址,
|
|
147
|
+
port_connectable() {
|
|
148
|
+
local port=$1
|
|
149
|
+
local host
|
|
150
|
+
for host in "${READY_PROBE_HOSTS[@]}"; do
|
|
151
|
+
if command -v nc >/dev/null 2>&1; then
|
|
152
|
+
if nc -z -w 1 "${host}" "${port}" >/dev/null 2>&1; then
|
|
153
|
+
return 0
|
|
154
|
+
fi
|
|
155
|
+
elif (exec 3<>"/dev/tcp/${host}/${port}") >/dev/null 2>&1; then
|
|
156
|
+
return 0
|
|
157
|
+
fi
|
|
158
|
+
done
|
|
159
|
+
return 1
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
port_probe_available() {
|
|
163
|
+
command -v ss >/dev/null 2>&1 || command -v lsof >/dev/null 2>&1
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
# 端口监听者是否属于本进程组:spawn detached 后 PID == PGID,子孙进程继承该 PGID。
|
|
167
|
+
# 0 = 是;1 = 不是(无人监听,或监听者不属于本进程组);2 = 无探测工具,无法判断
|
|
168
|
+
port_listened_by_pgid() {
|
|
169
|
+
local port=$1 pgid=$2
|
|
170
|
+
local listener owner
|
|
171
|
+
|
|
172
|
+
if ! port_probe_available; then
|
|
173
|
+
return 2
|
|
174
|
+
fi
|
|
175
|
+
|
|
176
|
+
for listener in $(list_port_pids "${port}" 2>/dev/null); do
|
|
177
|
+
owner=$(ps -o pgid= -p "${listener}" 2>/dev/null | tr -d ' ')
|
|
178
|
+
if [[ "${owner}" == "${pgid}" ]]; then
|
|
179
|
+
return 0
|
|
180
|
+
fi
|
|
181
|
+
done
|
|
182
|
+
return 1
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
wait_for_ready() {
|
|
186
|
+
local pid=$1 port=$2
|
|
187
|
+
local attempt=0 owned
|
|
188
|
+
|
|
189
|
+
if ! port_probe_available; then
|
|
190
|
+
echo "Warning: 缺少 ss 与 lsof,无法确认端口监听者归属,仅按 loopback 可连接性判断就绪。" >&2
|
|
191
|
+
fi
|
|
192
|
+
|
|
193
|
+
while [[ "${attempt}" -lt "${READY_RETRIES}" ]]; do
|
|
194
|
+
if ! kill -0 "${pid}" 2>/dev/null; then
|
|
195
|
+
echo "Dev server 进程在启动过程中退出。" >&2
|
|
196
|
+
return 1
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
if port_listened_by_pgid "${port}" "${pid}"; then
|
|
200
|
+
owned=0
|
|
201
|
+
else
|
|
202
|
+
owned=$?
|
|
203
|
+
fi
|
|
204
|
+
if [[ "${owned}" -eq 0 ]]; then
|
|
205
|
+
return 0
|
|
206
|
+
fi
|
|
207
|
+
if [[ "${owned}" -eq 2 ]] && port_connectable "${port}"; then
|
|
208
|
+
return 0
|
|
209
|
+
fi
|
|
210
|
+
|
|
211
|
+
sleep 1
|
|
212
|
+
attempt=$((attempt + 1))
|
|
213
|
+
done
|
|
214
|
+
|
|
215
|
+
return 2
|
|
216
|
+
}
|
|
217
|
+
|
|
90
218
|
# 监听端口的是孙进程(pnpm -> tsx -> node),只清端口会漏掉上层 pnpm/tsx,
|
|
91
219
|
# 所以先按上次记录的 PID 把整个进程组回收掉。
|
|
92
220
|
if [[ -f "${PID_FILE}" ]]; then
|
|
@@ -104,17 +232,34 @@ mkdir -p "${LOG_DIR}"
|
|
|
104
232
|
export PORT="${DEPLOY_RUN_PORT}"
|
|
105
233
|
server_pid="$(spawn_detached "${COZE_WORKSPACE_PATH}" "${LOG_FILE}" \
|
|
106
234
|
"$(command -v pnpm)" tsx watch src/server.ts)"
|
|
235
|
+
if [[ -z "${server_pid}" ]]; then
|
|
236
|
+
echo "Dev server failed to start: 未获取到后台进程 PID。" >&2
|
|
237
|
+
dump_log
|
|
238
|
+
exit 1
|
|
239
|
+
fi
|
|
107
240
|
echo "${server_pid}" > "${PID_FILE}"
|
|
108
241
|
|
|
109
|
-
|
|
110
|
-
|
|
242
|
+
if wait_for_ready "${server_pid}" "${DEPLOY_RUN_PORT}"; then
|
|
243
|
+
ready_status=0
|
|
244
|
+
else
|
|
245
|
+
ready_status=$?
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
if [[ "${ready_status}" -eq 2 ]]; then
|
|
249
|
+
# 进程还活着但迟迟没监听端口:多半是编译/运行时报错后 tsx watch 驻留,日志里有真正原因。
|
|
250
|
+
echo "Dev server 在 ${READY_RETRIES} 次探测(每次 1s)内未就绪于端口 ${DEPLOY_RUN_PORT}(进程 ${server_pid} 仍在运行)。" >&2
|
|
251
|
+
dump_log
|
|
252
|
+
exit 1
|
|
253
|
+
elif [[ "${ready_status}" -ne 0 ]]; then
|
|
111
254
|
echo "Dev server failed to start. See ${LOG_FILE}." >&2
|
|
112
|
-
|
|
255
|
+
dump_log
|
|
256
|
+
stop_detached "${server_pid}"
|
|
113
257
|
rm -f "${PID_FILE}"
|
|
114
258
|
exit 1
|
|
115
259
|
fi
|
|
116
260
|
|
|
117
|
-
echo "Dev server started (PID: ${server_pid})."
|
|
261
|
+
echo "Dev server started (PID: ${server_pid}), listening on port ${DEPLOY_RUN_PORT}."
|
|
262
|
+
echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
|
|
118
263
|
echo "Log file: ${LOG_FILE}"
|
|
119
264
|
echo "PID file: ${PID_FILE}"
|
|
120
265
|
<% } %>
|
|
@@ -66,7 +66,7 @@ const config = {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
const cmd = 'pnpm';
|
|
69
|
-
const args = ['update', 'coze-coding-dev-sdk@^0.7.
|
|
69
|
+
const args = ['update', 'coze-coding-dev-sdk@^0.7.25-beta.8'];
|
|
70
70
|
console.log(
|
|
71
71
|
`\nTriggering: ${cmd} ${args.join(' ')} (running in background)`,
|
|
72
72
|
);
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"@nuxtjs/tailwindcss": "^6.14.0",
|
|
28
28
|
"@types/node": "^20",
|
|
29
29
|
"autoprefixer": "^10.4.20",
|
|
30
|
-
"coze-coding-dev-sdk": "^0.7.
|
|
30
|
+
"coze-coding-dev-sdk": "^0.7.25-beta.8",
|
|
31
31
|
"eslint": "^9",
|
|
32
32
|
"eslint-plugin-import": "^2.32.0",
|
|
33
33
|
"eslint-plugin-vue": "^10",
|
|
@@ -34,8 +34,8 @@ importers:
|
|
|
34
34
|
specifier: ^10.4.20
|
|
35
35
|
version: 10.4.27(postcss@8.5.8)
|
|
36
36
|
coze-coding-dev-sdk:
|
|
37
|
-
specifier: ^0.7.
|
|
38
|
-
version: 0.7.
|
|
37
|
+
specifier: ^0.7.25-beta.8
|
|
38
|
+
version: 0.7.25-beta.8(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3)
|
|
39
39
|
eslint:
|
|
40
40
|
specifier: ^9
|
|
41
41
|
version: 9.39.4(jiti@2.7.0)
|
|
@@ -2498,8 +2498,8 @@ packages:
|
|
|
2498
2498
|
typescript:
|
|
2499
2499
|
optional: true
|
|
2500
2500
|
|
|
2501
|
-
coze-coding-dev-sdk@0.7.
|
|
2502
|
-
resolution: {integrity: sha512-
|
|
2501
|
+
coze-coding-dev-sdk@0.7.25-beta.8:
|
|
2502
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
2503
2503
|
engines: {node: '>=18.0.0'}
|
|
2504
2504
|
hasBin: true
|
|
2505
2505
|
|
|
@@ -8526,7 +8526,7 @@ snapshots:
|
|
|
8526
8526
|
optionalDependencies:
|
|
8527
8527
|
typescript: 5.9.3
|
|
8528
8528
|
|
|
8529
|
-
coze-coding-dev-sdk@0.7.
|
|
8529
|
+
coze-coding-dev-sdk@0.7.25-beta.8(openai@6.27.0(ws@8.21.3)(zod@4.3.6))(ws@8.21.3):
|
|
8530
8530
|
dependencies:
|
|
8531
8531
|
'@langchain/core': 1.1.31(openai@6.27.0(ws@8.21.3)(zod@4.3.6))
|
|
8532
8532
|
'@langchain/openai': 1.2.12(@langchain/core@1.1.31(openai@6.27.0(ws@8.21.3)(zod@4.3.6)))(ws@8.21.3)
|
|
@@ -44,14 +44,41 @@ LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
|
|
|
44
44
|
LOG_FILE="${LOG_DIR}/server.log"
|
|
45
45
|
PID_FILE="${LOG_DIR}/server.pid"
|
|
46
46
|
|
|
47
|
+
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
48
|
+
MAX_RUNTIME_SECONDS=1200
|
|
49
|
+
|
|
50
|
+
# 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
|
|
51
|
+
# (wrapper -> pnpm -> nuxt -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
|
|
52
|
+
RUN_WITH_TIMEOUT='
|
|
53
|
+
timeout_seconds=$1
|
|
54
|
+
shift
|
|
55
|
+
|
|
56
|
+
"$@" &
|
|
57
|
+
child_pid=$!
|
|
58
|
+
|
|
59
|
+
# 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
|
|
60
|
+
( trap "" TERM
|
|
61
|
+
sleep "${timeout_seconds}"
|
|
62
|
+
echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
|
|
63
|
+
kill -TERM -- "-$$" 2>/dev/null || true
|
|
64
|
+
sleep 5
|
|
65
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
66
|
+
) &
|
|
67
|
+
|
|
68
|
+
wait "${child_pid}"
|
|
69
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
70
|
+
'
|
|
71
|
+
|
|
47
72
|
# coze-daemon 会在 runtime shell 退出时清理原进程组。
|
|
48
73
|
# 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
|
|
74
|
+
# 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
|
|
49
75
|
spawn_detached() {
|
|
50
76
|
local cwd="$1"
|
|
51
77
|
local log_file="$2"
|
|
52
78
|
shift 2
|
|
53
79
|
|
|
54
|
-
node - "$cwd" "$log_file"
|
|
80
|
+
node - "$cwd" "$log_file" \
|
|
81
|
+
/bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
|
|
55
82
|
const fs = require('node:fs');
|
|
56
83
|
const { spawn } = require('node:child_process');
|
|
57
84
|
|
|
@@ -115,6 +142,7 @@ if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
|
|
|
115
142
|
fi
|
|
116
143
|
|
|
117
144
|
echo "Dev server started (PID: ${server_pid})."
|
|
145
|
+
echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
|
|
118
146
|
echo "Log file: ${LOG_FILE}"
|
|
119
147
|
echo "PID file: ${PID_FILE}"
|
|
120
148
|
<% } %>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@mariozechner/pi-ai": "^0.63.2",
|
|
23
23
|
"@mariozechner/pi-coding-agent": "^0.63.2",
|
|
24
24
|
"@sinclair/typebox": "^0.34.48",
|
|
25
|
-
"coze-coding-dev-sdk": "^0.7.
|
|
25
|
+
"coze-coding-dev-sdk": "^0.7.25-beta.8",
|
|
26
26
|
"@radix-ui/react-select": "^2.2.6",
|
|
27
27
|
"@radix-ui/react-slot": "^1.2.4",
|
|
28
28
|
"@streamdown/code": "^1.1.1",
|
|
@@ -36,8 +36,8 @@ importers:
|
|
|
36
36
|
specifier: ^2.1.1
|
|
37
37
|
version: 2.1.1
|
|
38
38
|
coze-coding-dev-sdk:
|
|
39
|
-
specifier: ^0.7.
|
|
40
|
-
version: 0.7.
|
|
39
|
+
specifier: ^0.7.25-beta.8
|
|
40
|
+
version: 0.7.25-beta.8(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
|
|
41
41
|
express:
|
|
42
42
|
specifier: ^4.21.2
|
|
43
43
|
version: 4.22.1
|
|
@@ -2085,8 +2085,8 @@ packages:
|
|
|
2085
2085
|
cose-base@2.2.0:
|
|
2086
2086
|
resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
|
|
2087
2087
|
|
|
2088
|
-
coze-coding-dev-sdk@0.7.
|
|
2089
|
-
resolution: {integrity: sha512-
|
|
2088
|
+
coze-coding-dev-sdk@0.7.25-beta.8:
|
|
2089
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
2090
2090
|
engines: {node: '>=18.0.0'}
|
|
2091
2091
|
hasBin: true
|
|
2092
2092
|
|
|
@@ -6120,7 +6120,7 @@ snapshots:
|
|
|
6120
6120
|
dependencies:
|
|
6121
6121
|
layout-base: 2.0.1
|
|
6122
6122
|
|
|
6123
|
-
coze-coding-dev-sdk@0.7.
|
|
6123
|
+
coze-coding-dev-sdk@0.7.25-beta.8(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0):
|
|
6124
6124
|
dependencies:
|
|
6125
6125
|
'@langchain/core': 1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0)
|
|
6126
6126
|
'@langchain/openai': 1.4.3(@langchain/core@1.1.40(openai@6.34.0(ws@8.20.0)(zod@4.3.6))(ws@8.20.0))(ws@8.20.0)
|
|
@@ -30,14 +30,41 @@ kill_process_tree() {
|
|
|
30
30
|
fi
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
34
|
+
MAX_RUNTIME_SECONDS=1200
|
|
35
|
+
|
|
36
|
+
# 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
|
|
37
|
+
# (wrapper -> pnpm -> taro/nest);被包的进程自己先退出时也顺手清空进程组,不留残余。
|
|
38
|
+
RUN_WITH_TIMEOUT='
|
|
39
|
+
timeout_seconds=$1
|
|
40
|
+
shift
|
|
41
|
+
|
|
42
|
+
"$@" &
|
|
43
|
+
child_pid=$!
|
|
44
|
+
|
|
45
|
+
# 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
|
|
46
|
+
( trap "" TERM
|
|
47
|
+
sleep "${timeout_seconds}"
|
|
48
|
+
echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
|
|
49
|
+
kill -TERM -- "-$$" 2>/dev/null || true
|
|
50
|
+
sleep 5
|
|
51
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
52
|
+
) &
|
|
53
|
+
|
|
54
|
+
wait "${child_pid}"
|
|
55
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
56
|
+
'
|
|
57
|
+
|
|
33
58
|
# coze-daemon 会在 runtime shell 退出时清理原进程组。
|
|
34
59
|
# 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
|
|
60
|
+
# 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
|
|
35
61
|
spawn_detached() {
|
|
36
62
|
local cwd="$1"
|
|
37
63
|
local log_file="$2"
|
|
38
64
|
shift 2
|
|
39
65
|
|
|
40
|
-
node - "$cwd" "$log_file"
|
|
66
|
+
node - "$cwd" "$log_file" \
|
|
67
|
+
/bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
|
|
41
68
|
const fs = require('node:fs');
|
|
42
69
|
const { spawn } = require('node:child_process');
|
|
43
70
|
|
|
@@ -225,6 +252,7 @@ start_service() {
|
|
|
225
252
|
fi
|
|
226
253
|
|
|
227
254
|
echo "📝 Dev process started with PID: ${DEV_PID}"
|
|
255
|
+
echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
|
|
228
256
|
echo "Log file: ${LOG_FILE}"
|
|
229
257
|
echo "PID file: ${PID_FILE}"
|
|
230
258
|
}
|
|
@@ -204,8 +204,8 @@ importers:
|
|
|
204
204
|
specifier: 2.95.3
|
|
205
205
|
version: 2.95.3
|
|
206
206
|
coze-coding-dev-sdk:
|
|
207
|
-
specifier: ^0.7.25-beta.
|
|
208
|
-
version: 0.7.25-beta.
|
|
207
|
+
specifier: ^0.7.25-beta.8
|
|
208
|
+
version: 0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.5))(ws@8.19.0)
|
|
209
209
|
dotenv:
|
|
210
210
|
specifier: ^17.2.3
|
|
211
211
|
version: 17.2.3
|
|
@@ -5416,8 +5416,8 @@ packages:
|
|
|
5416
5416
|
typescript:
|
|
5417
5417
|
optional: true
|
|
5418
5418
|
|
|
5419
|
-
coze-coding-dev-sdk@0.7.25-beta.
|
|
5420
|
-
resolution: {integrity: sha512
|
|
5419
|
+
coze-coding-dev-sdk@0.7.25-beta.8:
|
|
5420
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
5421
5421
|
engines: {node: '>=18.0.0'}
|
|
5422
5422
|
hasBin: true
|
|
5423
5423
|
|
|
@@ -17159,7 +17159,7 @@ snapshots:
|
|
|
17159
17159
|
optionalDependencies:
|
|
17160
17160
|
typescript: 5.9.3
|
|
17161
17161
|
|
|
17162
|
-
coze-coding-dev-sdk@0.7.25-beta.
|
|
17162
|
+
coze-coding-dev-sdk@0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.5))(ws@8.19.0):
|
|
17163
17163
|
dependencies:
|
|
17164
17164
|
'@langchain/core': 1.1.16(openai@6.16.0(ws@8.19.0)(zod@4.3.5))
|
|
17165
17165
|
'@langchain/openai': 1.2.3(@langchain/core@1.1.16(openai@6.16.0(ws@8.19.0)(zod@4.3.5)))(ws@8.19.0)
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"@nestjs/core": "^10.4.15",
|
|
18
18
|
"@nestjs/platform-express": "^10.4.15",
|
|
19
19
|
"@supabase/supabase-js": "2.95.3",
|
|
20
|
-
"coze-coding-dev-sdk": "^0.7.25-beta.
|
|
20
|
+
"coze-coding-dev-sdk": "^0.7.25-beta.8",
|
|
21
21
|
"dotenv": "^17.2.3",
|
|
22
22
|
"drizzle-kit": "^0.31.8",
|
|
23
23
|
"drizzle-orm": "^0.45.1",
|
|
@@ -32,8 +32,8 @@ importers:
|
|
|
32
32
|
specifier: ^10.4.20
|
|
33
33
|
version: 10.4.23(postcss@8.5.6)
|
|
34
34
|
coze-coding-dev-sdk:
|
|
35
|
-
specifier: ^0.7.
|
|
36
|
-
version: 0.7.
|
|
35
|
+
specifier: ^0.7.25-beta.8
|
|
36
|
+
version: 0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.5))(ws@8.19.0)
|
|
37
37
|
esbuild:
|
|
38
38
|
specifier: ^0.27.2
|
|
39
39
|
version: 0.27.2
|
|
@@ -910,8 +910,8 @@ packages:
|
|
|
910
910
|
typescript:
|
|
911
911
|
optional: true
|
|
912
912
|
|
|
913
|
-
coze-coding-dev-sdk@0.7.
|
|
914
|
-
resolution: {integrity: sha512-
|
|
913
|
+
coze-coding-dev-sdk@0.7.25-beta.8:
|
|
914
|
+
resolution: {integrity: sha512-RSKlXCO0W/OPDjx9D9JICn2cGeOJw3iG+y0Pr1AhAf7YdAjjNbBZoG7qfg0Zg2SqgaVN2qSLQFmKPbhNq9ZWSg==}
|
|
915
915
|
engines: {node: '>=18.0.0'}
|
|
916
916
|
hasBin: true
|
|
917
917
|
|
|
@@ -3281,7 +3281,7 @@ snapshots:
|
|
|
3281
3281
|
optionalDependencies:
|
|
3282
3282
|
typescript: 5.9.3
|
|
3283
3283
|
|
|
3284
|
-
coze-coding-dev-sdk@0.7.
|
|
3284
|
+
coze-coding-dev-sdk@0.7.25-beta.8(openai@6.16.0(ws@8.19.0)(zod@4.3.5))(ws@8.19.0):
|
|
3285
3285
|
dependencies:
|
|
3286
3286
|
'@langchain/core': 1.1.16(openai@6.16.0(ws@8.19.0)(zod@4.3.5))
|
|
3287
3287
|
'@langchain/openai': 1.2.3(@langchain/core@1.1.16(openai@6.16.0(ws@8.19.0)(zod@4.3.5)))(ws@8.19.0)
|
|
@@ -44,14 +44,41 @@ LOG_DIR="${COZE_LOG_DIR:-${COZE_WORKSPACE_PATH}/logs}"
|
|
|
44
44
|
LOG_FILE="${LOG_DIR}/server.log"
|
|
45
45
|
PID_FILE="${LOG_DIR}/server.pid"
|
|
46
46
|
|
|
47
|
+
# detached 出去的进程没人负责回收,超过这个时长就自己退出,避免端口与内存长期泄露。
|
|
48
|
+
MAX_RUNTIME_SECONDS=1200
|
|
49
|
+
|
|
50
|
+
# 真正被 detach 的是这层 bash wrapper:它是进程组 leader,组内 watchdog 到点回收整组
|
|
51
|
+
# (wrapper -> pnpm -> tsx -> node);被包的进程自己先退出时也顺手清空进程组,不留残余。
|
|
52
|
+
RUN_WITH_TIMEOUT='
|
|
53
|
+
timeout_seconds=$1
|
|
54
|
+
shift
|
|
55
|
+
|
|
56
|
+
"$@" &
|
|
57
|
+
child_pid=$!
|
|
58
|
+
|
|
59
|
+
# 先忽略 TERM,才能在向整组发 TERM(自己也在组里)之后存活下来补一发 KILL。
|
|
60
|
+
( trap "" TERM
|
|
61
|
+
sleep "${timeout_seconds}"
|
|
62
|
+
echo "[dev] 后台进程运行超过 ${timeout_seconds}s,回收进程组 $$。"
|
|
63
|
+
kill -TERM -- "-$$" 2>/dev/null || true
|
|
64
|
+
sleep 5
|
|
65
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
66
|
+
) &
|
|
67
|
+
|
|
68
|
+
wait "${child_pid}"
|
|
69
|
+
kill -KILL -- "-$$" 2>/dev/null || true
|
|
70
|
+
'
|
|
71
|
+
|
|
47
72
|
# coze-daemon 会在 runtime shell 退出时清理原进程组。
|
|
48
73
|
# 通过 Node detached spawn 创建独立 session/进程组,并将 stdio 直接写入日志。
|
|
74
|
+
# 返回的 PID 是 wrapper 的,同时也是整个进程组的 PGID,后续按组回收。
|
|
49
75
|
spawn_detached() {
|
|
50
76
|
local cwd="$1"
|
|
51
77
|
local log_file="$2"
|
|
52
78
|
shift 2
|
|
53
79
|
|
|
54
|
-
node - "$cwd" "$log_file"
|
|
80
|
+
node - "$cwd" "$log_file" \
|
|
81
|
+
/bin/bash -c "${RUN_WITH_TIMEOUT}" detached-runner "${MAX_RUNTIME_SECONDS}" "$@" <<'NODE'
|
|
55
82
|
const fs = require('node:fs');
|
|
56
83
|
const { spawn } = require('node:child_process');
|
|
57
84
|
|
|
@@ -115,6 +142,7 @@ if [[ -z "${server_pid}" ]] || ! kill -0 "${server_pid}" 2>/dev/null; then
|
|
|
115
142
|
fi
|
|
116
143
|
|
|
117
144
|
echo "Dev server started (PID: ${server_pid})."
|
|
145
|
+
echo "Auto stop after ${MAX_RUNTIME_SECONDS}s."
|
|
118
146
|
echo "Log file: ${LOG_FILE}"
|
|
119
147
|
echo "PID file: ${PID_FILE}"
|
|
120
148
|
<% } %>
|
|
@@ -73,7 +73,7 @@ const config = {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
const cmd = 'pnpm';
|
|
76
|
-
const args = ['update', 'coze-coding-dev-sdk@^0.7.
|
|
76
|
+
const args = ['update', 'coze-coding-dev-sdk@^0.7.25-beta.8'];
|
|
77
77
|
console.log(
|
|
78
78
|
`\nTriggering: ${cmd} ${args.join(' ')} (running in background)`,
|
|
79
79
|
);
|