openclaw-multi-auto 1.3.9 → 1.4.1

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 (106) hide show
  1. package/dist/{accounts-C_lW3Ag9.js → accounts-BOzyfwW4.js} +2 -2
  2. package/dist/{accounts-C9HcPI9h.js → accounts-L9ByEpnP.js} +2 -2
  3. package/dist/{accounts-Tgelvk0C.js → accounts-yfBeCZtS.js} +17 -17
  4. package/dist/{active-listener-BEdprTkn.js → active-listener-D1yqT1cw.js} +2 -2
  5. package/dist/{api-key-rotation-BJpKWXy0.js → api-key-rotation-DtsNS2Nb.js} +2 -2
  6. package/dist/{audio-preflight-BMvgEQ5j.js → audio-preflight-DpxQCpsA.js} +32 -32
  7. package/dist/{audio-transcription-runner-gLFfz8fr.js → audio-transcription-runner-28fcRNNi.js} +12 -12
  8. package/dist/{audit-membership-runtime-Dntemq07.js → audit-membership-runtime-DWyHWAHM.js} +4 -4
  9. package/dist/build-info.json +3 -3
  10. package/dist/bundled/boot-md/handler.js +51 -51
  11. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  12. package/dist/bundled/command-logger/handler.js +2 -2
  13. package/dist/bundled/session-memory/handler.js +51 -51
  14. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  15. package/dist/{channel-activity-BDnjYF7B.js → channel-activity-xHOMiarp.js} +3 -3
  16. package/dist/{chrome-DxxEKrY7.js → chrome-DwizpzOC.js} +18 -18
  17. package/dist/{commands-registry-D5qXbFJn.js → commands-registry-V1zZ5pPC.js} +4 -4
  18. package/dist/{deliver-DbdywYJE.js → deliver-D4o6VIur.js} +21 -21
  19. package/dist/deliver-runtime-P-G3bPjW.js +36 -0
  20. package/dist/deps-send-discord.runtime-DnbhTFX9.js +26 -0
  21. package/dist/deps-send-imessage.runtime-BOiQ6mDx.js +25 -0
  22. package/dist/deps-send-signal.runtime-CTcl388M.js +24 -0
  23. package/dist/deps-send-slack.runtime-CCqBz4Kg.js +22 -0
  24. package/dist/deps-send-telegram.runtime-DGSKTCpH.js +27 -0
  25. package/dist/deps-send-whatsapp.runtime-CJkTHkah.js +60 -0
  26. package/dist/{diagnostic-Co6Kghr-.js → diagnostic-Bn4PZjMZ.js} +2 -2
  27. package/dist/{errors-xt401nuk.js → errors-CCLeFWAg.js} +1 -1
  28. package/dist/{fetch-DuraYswo.js → fetch-BlJWzEP6.js} +5 -5
  29. package/dist/{fetch-guard-DWr0d00H.js → fetch-guard-ChYBwfiy.js} +2 -2
  30. package/dist/{frontmatter-BkTfEZ93.js → frontmatter-CvaMP376.js} +3 -3
  31. package/dist/{fs-safe-CTYUrIgQ.js → fs-safe-0jAo_Whb.js} +4 -4
  32. package/dist/{github-copilot-token-BDioPmd6.js → github-copilot-token-D13V9YBz.js} +7 -7
  33. package/dist/{image-eT7Y-nP5.js → image-Bbn53mzj.js} +6 -6
  34. package/dist/{image-ops-BuUnEOE0.js → image-ops-CehkHxmW.js} +2 -2
  35. package/dist/image-runtime-CVv2ra9J.js +29 -0
  36. package/dist/{ir-B83looB-.js → ir-DAP-B-Xw.js} +8 -8
  37. package/dist/{legacy-names-DOC03BkU.js → legacy-names-TyzbVqa_.js} +1 -1
  38. package/dist/llm-slug-generator.js +51 -51
  39. package/dist/{logger-BfjWMCSD.js → logger-DMZQQtxK.js} +7 -7
  40. package/dist/{login-CrIwcrVI.js → login-DiCctRo1.js} +5 -5
  41. package/dist/{login-qr-BpPDZdl_.js → login-qr-MUbXgjtd.js} +10 -10
  42. package/dist/{manager-1bvuGrNR.js → manager-BW_NSIMl.js} +13 -13
  43. package/dist/manager-runtime-BN6VevdC.js +18 -0
  44. package/dist/{model-selection-Dna0Gz1k.js → model-selection-idoqPmw0.js} +43 -43
  45. package/dist/{outbound-ChDjtuD6.js → outbound-C2kanETZ.js} +6 -6
  46. package/dist/{outbound-attachment-DqHlD21U.js → outbound-attachment-DBrYWX8h.js} +2 -2
  47. package/dist/{path-alias-guards-BzvdLvTI.js → path-alias-guards-DqXRZmsL.js} +1 -1
  48. package/dist/{paths-Cvc9EM8Y.js → paths-C6TxBCvO.js} +5 -5
  49. package/dist/{paths-Bkr-BCxW.js → paths-CCxysrzL.js} +4 -4
  50. package/dist/{pi-embedded-BQQa91aA.js → pi-embedded-BaGj07T0.js} +158 -158
  51. package/dist/{pi-embedded-helpers-CLXm10bV.js → pi-embedded-helpers-wy0DZvx1.js} +52 -52
  52. package/dist/{pi-model-discovery-Dymwdjt0.js → pi-model-discovery-BGgOlX8N.js} +7 -7
  53. package/dist/pi-model-discovery-runtime-Bwmi4Ev8.js +11 -0
  54. package/dist/{pi-tools.before-tool-call.runtime-Cwab_5W1.js → pi-tools.before-tool-call.runtime-BuLxSyx9.js} +9 -9
  55. package/dist/plugin-sdk/mattermost.js +3 -3
  56. package/dist/{plugins-4Rj4OjLY.js → plugins-CWkRQYDj.js} +11 -11
  57. package/dist/{proxy-env-DlmzDx8x.js → proxy-env-Cq5gdrbj.js} +1 -1
  58. package/dist/{proxy-fetch-B2pEfjbR.js → proxy-fetch-CCjEYbFm.js} +1 -1
  59. package/dist/{pw-ai-DNMjFMqH.js → pw-ai-Cl1Lc7RC.js} +14 -14
  60. package/dist/{qmd-manager-BtIKUaO9.js → qmd-manager-BsYsO9Ii.js} +10 -10
  61. package/dist/{query-expansion-CX-1fS52.js → query-expansion-DtLc3wjL.js} +6 -6
  62. package/dist/{redact-COik8ET1.js → redact-ClbcYG1J.js} +1 -1
  63. package/dist/{run-with-concurrency-BgYfgkXT.js → run-with-concurrency-D_ZpbgEG.js} +4 -4
  64. package/dist/runtime-whatsapp-login.runtime-IeylZEl4.js +13 -0
  65. package/dist/runtime-whatsapp-outbound.runtime-ClBRuLsq.js +22 -0
  66. package/dist/{send-dfu6_rgf.js → send-BQERFNyo.js} +5 -5
  67. package/dist/{send-L7gRiwyd.js → send-Bj776ESJ.js} +7 -7
  68. package/dist/{send-PE6cwoTe.js → send-DcxmcFi_.js} +8 -8
  69. package/dist/{send-6lz6rNVP.js → send-Dx2RkUOZ.js} +6 -6
  70. package/dist/{send-BHTiZcH3.js → send-vmONuVgL.js} +26 -26
  71. package/dist/{session-D8ImowSs.js → session-A4QhBRvH.js} +8 -8
  72. package/dist/{skill-commands-DNqJ-kwn.js → skill-commands-CMzBZKG2.js} +9 -9
  73. package/dist/{skills-7ODkHQYp.js → skills-CE_iqvM5.js} +22 -22
  74. package/dist/slash-commands.runtime-Cpn2tYW4.js +16 -0
  75. package/dist/slash-dispatch.runtime-DoBAQBU5.js +56 -0
  76. package/dist/slash-skill-commands.runtime-DKMvvdDW.js +20 -0
  77. package/dist/{store-D89wDcz9.js → store--eR1R_UX.js} +2 -2
  78. package/dist/subagent-registry-runtime-ppWS3tVu.js +56 -0
  79. package/dist/{subsystem-B45WV3qB.js → subsystem-Di1z8l0Z.js} +14 -14
  80. package/dist/{tables-mE4cJBN2.js → tables-d739Y1xW.js} +1 -1
  81. package/dist/{target-errors-mnlwhAjP.js → target-errors-CBI2Ga0y.js} +2 -2
  82. package/dist/{thinking-BeGmb5k6.js → thinking-DXYisHiZ.js} +7 -7
  83. package/dist/{tokens-q32vI39c.js → tokens-DxnY9ui_.js} +1 -1
  84. package/dist/{tool-images-RZdHiZcG.js → tool-images-2cBx1W8h.js} +2 -2
  85. package/dist/{web-Btj-e8kN.js → web-CzWRVmFt.js} +55 -55
  86. package/dist/{whatsapp-actions-BHbJJyqw.js → whatsapp-actions-iEArE_Ez.js} +21 -21
  87. package/dist/{workspace-U-DyR64O.js → workspace-CUVC6GX1.js} +20 -20
  88. package/package.json +1 -1
  89. package/scripts/create-instance.sh +63 -37
  90. package/scripts/install-maca.sh +37 -0
  91. package/dist/deliver-runtime-BFs7iAZF.js +0 -36
  92. package/dist/deps-send-discord.runtime-DZUccI6Z.js +0 -26
  93. package/dist/deps-send-imessage.runtime-CF3OpoqY.js +0 -25
  94. package/dist/deps-send-signal.runtime-Cw4-ozeO.js +0 -24
  95. package/dist/deps-send-slack.runtime-BDsDhS1P.js +0 -22
  96. package/dist/deps-send-telegram.runtime-D_4xVasO.js +0 -27
  97. package/dist/deps-send-whatsapp.runtime-DK8jqd14.js +0 -60
  98. package/dist/image-runtime-BcAK3n8a.js +0 -29
  99. package/dist/manager-runtime-FO1Sx3W8.js +0 -18
  100. package/dist/pi-model-discovery-runtime-BeY4EUPp.js +0 -11
  101. package/dist/runtime-whatsapp-login.runtime-DUb55byQ.js +0 -13
  102. package/dist/runtime-whatsapp-outbound.runtime-Bii_xSfI.js +0 -22
  103. package/dist/slash-commands.runtime-CVw6566g.js +0 -16
  104. package/dist/slash-dispatch.runtime-B9Ygtzi4.js +0 -56
  105. package/dist/slash-skill-commands.runtime-DxZ4z5h6.js +0 -20
  106. package/dist/subagent-registry-runtime-DL1Wv7nA.js +0 -56
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bash
2
2
  # =================================================================
3
3
  # OpenClaw 深度集成初始化工具 (create-instance.sh)
4
- # 修复说明:避免 workspace 提升导致 node_modules 出现在父目录
5
- # 增强:支持环境变量 OPENCLAW_SOURCE_DIR 定位源码
4
+ # 功能:创建实例目录、复制文件、安装依赖、配置模型、启动服务
5
+ # 增强:支持环境变量 OPENCLAW_SOURCE_DIR 定位源码,自动复制 docs 到根目录供 TUI 使用
6
6
  # =================================================================
7
7
 
8
8
  set -e
@@ -23,25 +23,21 @@ for cmd in node pnpm; do
23
23
  done
24
24
 
25
25
  # --- 1. 路径溯源与环境检查 ---
26
- # 优先使用环境变量 OPENCLAW_SOURCE_DIR(可在调用脚本前设置)
27
26
  if [ -n "$OPENCLAW_SOURCE_DIR" ] && [ -d "$OPENCLAW_SOURCE_DIR" ]; then
28
27
  SOURCE_CODE="$OPENCLAW_SOURCE_DIR"
29
28
  echo -e "${BLUE}📂 使用环境变量指定的源码路径: $SOURCE_CODE${NC}"
30
29
  else
31
- # 其次检查本地 pnpm 安装的路径(与部署脚本中的 openclaw-runtime 一致)
32
30
  LOCAL_SOURCE="$HOME/openclaw-runtime/node_modules/openclaw-multi-auto"
33
31
  if [ -d "$LOCAL_SOURCE" ]; then
34
32
  SOURCE_CODE="$LOCAL_SOURCE"
35
33
  echo -e "${BLUE}📂 使用本地 pnpm 安装的源码路径: $SOURCE_CODE${NC}"
36
34
  else
37
- # 最后回退到全局 npm 安装路径(兼容旧版)
38
35
  GLOBAL_PREFIX=$(npm config get prefix)
39
36
  SOURCE_CODE="${GLOBAL_PREFIX}/lib/node_modules/openclaw-multi-auto"
40
37
  echo -e "${YELLOW}⚠️ 未找到环境变量和本地路径,尝试使用全局安装路径: $SOURCE_CODE${NC}"
41
38
  fi
42
39
  fi
43
40
 
44
- # 检查源码目录是否存在
45
41
  if [ ! -d "$SOURCE_CODE" ]; then
46
42
  echo -e "${RED}❌ 错误: 未找到 OpenClaw 源码目录: $SOURCE_CODE${NC}"
47
43
  echo -e "${YELLOW}请确认已正确安装 openclaw-multi-auto,或设置 OPENCLAW_SOURCE_DIR 环境变量指向正确路径。${NC}"
@@ -61,7 +57,6 @@ fi
61
57
  if [ -n "$2" ]; then
62
58
  PORT="$2"
63
59
  else
64
- # 更稳健的现有实例计数:使用 find 统计目录数
65
60
  EXISTING_COUNT=$(find "$INSTANCES_BASE" -maxdepth 1 -type d -name "*" ! -name ".*" 2>/dev/null | wc -l | tr -d ' ')
66
61
  PORT=$((18790 + EXISTING_COUNT))
67
62
  fi
@@ -73,12 +68,10 @@ DIST_DIR="${INSTANCE_DIR}/dist"
73
68
  echo -e "${BLUE}🏗️ 正在深度初始化实例: ${INSTANCE_NAME} (端口 ${PORT})${NC}"
74
69
  echo "SOURCE_CODE = $SOURCE_CODE"
75
70
 
76
- # 清理旧实例目录(如果存在)
77
71
  if [ -d "$INSTANCE_DIR" ]; then
78
72
  echo -e "${YELLOW}⚠️ 清理旧实例目录...${NC}"
79
73
  rm -rf "$INSTANCE_DIR"
80
74
  fi
81
- # 删除可能存在的父目录 node_modules 和 workspace 文件(避免干扰)
82
75
  [ -d "${INSTANCES_BASE}/node_modules" ] && rm -rf "${INSTANCES_BASE}/node_modules"
83
76
  [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ] && rm -f "${INSTANCES_BASE}/pnpm-workspace.yaml"
84
77
 
@@ -106,7 +99,6 @@ if [ -d "${SOURCE_CODE}/dist" ]; then
106
99
  cp -r "${SOURCE_CODE}/dist/." "${DIST_DIR}/"
107
100
  echo "cp exit code: $?"
108
101
 
109
- # 检查所有被引用的 utils 文件是否存在
110
102
  if [ -f "${DIST_DIR}/index.js" ]; then
111
103
  for chunk in $(grep -oE "utils-[A-Za-z0-9]+\.js" "${DIST_DIR}/index.js" 2>/dev/null | sort -u); do
112
104
  if [ ! -f "${DIST_DIR}/${chunk}" ]; then
@@ -124,22 +116,24 @@ fi
124
116
  cp "${SOURCE_CODE}/package.json" "${INSTANCE_DIR}/package.json"
125
117
  [ -f "${SOURCE_CODE}/pnpm-lock.yaml" ] && cp "${SOURCE_CODE}/pnpm-lock.yaml" "${INSTANCE_DIR}/pnpm-lock.yaml"
126
118
 
119
+ # 复制 control-ui(如果存在)
120
+ if [ -d "${SOURCE_CODE}/dist/control-ui" ]; then
121
+ cp -r "${SOURCE_CODE}/dist/control-ui" "${INSTANCE_DIR}/dist/"
122
+ fi
123
+
127
124
  export SHARP_BINARY_HOST="https://npmmirror.com/mirrors/sharp"
128
125
  export SHARP_LIBVIPS_BINARY_HOST="https://npmmirror.com/mirrors/sharp-libvips"
129
126
 
130
127
  cd "${INSTANCE_DIR}"
131
128
  echo -e "${YELLOW}📍 安装路径确认: $(pwd)${NC}"
132
129
 
133
- # 检查并移除可能影响 workspace 的文件
134
130
  if [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ]; then
135
131
  echo -e "${YELLOW}⚠️ 检测到 ${INSTANCES_BASE}/pnpm-workspace.yaml,临时重命名以避免干扰${NC}"
136
132
  mv "${INSTANCES_BASE}/pnpm-workspace.yaml" "${INSTANCES_BASE}/pnpm-workspace.yaml.bak.$(date +%s)"
137
133
  fi
138
134
 
139
- # 强制安装依赖,添加 --ignore-workspace 避免 workspace 提升
140
135
  pnpm install --shamefully-hoist --ignore-workspace --registry=https://registry.npmmirror.com --no-frozen-lockfile
141
136
 
142
- # 验证 node_modules 是否生成
143
137
  if [ ! -d "node_modules" ]; then
144
138
  echo -e "${RED}❌ 严重错误: pnpm install 完成但 node_modules 目录未创建!${NC}"
145
139
  exit 1
@@ -179,11 +173,9 @@ case "$MODEL_PROVIDER" in
179
173
  qwen) PRIMARY_MODEL="qwen/qwen-plus"; QWEN_KEY="$API_KEY" ;;
180
174
  esac
181
175
 
182
- # 生成时间戳(兼容 macOS/Linux)
183
176
  if date -u +"%Y-%m-%dT%H:%M:%S.%3NZ" 2>/dev/null; then
184
177
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S.%3NZ")
185
178
  else
186
- # macOS 不支持 %3N,改用秒级精度
187
179
  TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z")
188
180
  fi
189
181
 
@@ -288,7 +280,6 @@ fi
288
280
  cd - > /dev/null
289
281
  rm -rf "$TEMP_DIR"
290
282
 
291
- # --- 如果实例是 yunwei,安装角色包并初始化 workspace ---
292
283
  # --- 如果实例是 yunwei,安装角色包并初始化 workspace ---
293
284
  if [ "$INSTANCE_NAME" = "yunwei" ]; then
294
285
  echo -e "${BLUE}🛠️ 检测到运维实例,正在安装角色包 role-openclaw-yunwei...${NC}"
@@ -312,10 +303,6 @@ if [ "$INSTANCE_NAME" = "yunwei" ]; then
312
303
  rm -rf "$TEMP_ROLE_DIR"
313
304
  fi
314
305
 
315
- if [ -d "${SOURCE_CODE}/dist/control-ui" ]; then
316
- cp -r "${SOURCE_CODE}/dist/control-ui" "${INSTANCE_DIR}/dist/"
317
- fi
318
-
319
306
  # --- 11. 生成增强型启动脚本 ---
320
307
  cat > "${INSTANCE_DIR}/start.sh" << 'EOF'
321
308
  #!/usr/bin/env bash
@@ -335,7 +322,7 @@ INSTANCE_NAME=$(basename "$SCRIPT_DIR")
335
322
  export OPENCLAW_CONFIG_PATH="$SCRIPT_DIR/config/openclaw.json"
336
323
  export OPENCLAW_TMP_DIR="$SCRIPT_DIR/tmp"
337
324
 
338
- # 从配置中提取 workspace 路径并导出(供 TUI 等使用)
325
+ # 从配置中提取 workspace 路径并导出
339
326
  if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
340
327
  export OPENCLAW_WORKSPACE=$(node -e "
341
328
  const cfg = require('$OPENCLAW_CONFIG_PATH');
@@ -353,7 +340,7 @@ if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
353
340
  ")
354
341
  fi
355
342
 
356
- # macOS launchd 守护配置(可选,用于开机自启)
343
+ # macOS launchd 守护配置(可选)
357
344
  if [[ "$OSTYPE" == "darwin"* ]]; then
358
345
  PLIST_LABEL="ai.openclaw.$INSTANCE_NAME"
359
346
  PLIST_PATH="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
@@ -374,42 +361,43 @@ EOP
374
361
  fi
375
362
  fi
376
363
 
377
- # 检测 openclaw 命令(通常已在 PATH 中,此处保留为兼容性)
364
+ # 定义可执行文件路径:优先使用全局 openclaw,否则用绝对路径 node
378
365
  if command -v openclaw &> /dev/null; then
379
- CMD="openclaw"
366
+ OPENCLAW_EXEC="openclaw"
380
367
  else
381
- CMD="node ./dist/index.js"
368
+ OPENCLAW_EXEC="node $SCRIPT_DIR/dist/index.js"
382
369
  fi
383
370
 
384
371
  # 根据命令行参数执行对应操作
385
372
  if [ $# -eq 0 ]; then
386
- # 无参数:启动网关(默认行为)
373
+ # 无参数:启动网关
387
374
  GATEWAY_PORT=$(node -e "console.log(require('$OPENCLAW_CONFIG_PATH').gateway.port)")
388
- echo "🚀 使用 $CMD 启动 OpenClaw-$INSTANCE_NAME 网关..."
389
- exec $CMD gateway run --port "$GATEWAY_PORT"
375
+ echo "🚀 使用 $OPENCLAW_EXEC 启动 OpenClaw-$INSTANCE_NAME 网关..."
376
+ exec $OPENCLAW_EXEC gateway run --port "$GATEWAY_PORT"
390
377
  else
391
378
  if [ "$1" = "tui" ]; then
392
- # TUI 需要在 workspace 目录下运行,才能正确加载模板文件
393
- echo "🚀 使用 $CMD 启动 OpenClaw-$INSTANCE_NAME TUI (workspace mode)..."
379
+ # TUI 必须在 workspace 目录下运行,以正确加载模板文件
380
+ echo "🚀 启动 OpenClaw-$INSTANCE_NAME TUI (workspace mode)..."
394
381
  cd "$OPENCLAW_WORKSPACE"
395
- exec $CMD tui
382
+ # 使用绝对路径调用 node,避免相对路径问题
383
+ exec node "$SCRIPT_DIR/dist/index.js" tui
396
384
  else
397
- # 其他命令(如 --help)直接在实例目录运行
398
- echo "🚀 使用 $CMD 执行 OpenClaw-$INSTANCE_NAME 命令: $@"
399
- exec $CMD "$@"
385
+ # 其他命令直接在实例目录执行
386
+ echo "🚀 使用 $OPENCLAW_EXEC 执行 OpenClaw-$INSTANCE_NAME 命令: $@"
387
+ exec $OPENCLAW_EXEC "$@"
400
388
  fi
401
389
  fi
402
390
  EOF
391
+
403
392
  chmod +x "${INSTANCE_DIR}/start.sh"
404
393
 
405
394
  # --- 12. 执行拉起 ---
406
395
  echo -e "${BLUE}⚡ 正在后台启动服务...${NC}"
407
- # 使用完整路径启动,避免相对路径问题
408
396
  nohup "${INSTANCE_DIR}/start.sh" > "${INSTANCE_DIR}/workspace/server.log" 2>&1 &
409
397
  PID=$!
410
398
 
411
- # 等待几秒检查进程是否存活,并验证端口监听
412
399
  sleep 5
400
+
413
401
  check_port() {
414
402
  if command -v lsof &> /dev/null; then
415
403
  lsof -i :$PORT -sTCP:LISTEN -t &> /dev/null
@@ -418,7 +406,7 @@ check_port() {
418
406
  elif command -v curl &> /dev/null; then
419
407
  curl --head --connect-timeout 1 http://localhost:$PORT &> /dev/null
420
408
  else
421
- return 0 # 无工具,跳过端口检查
409
+ return 0
422
410
  fi
423
411
  }
424
412
 
@@ -429,6 +417,44 @@ if kill -0 $PID 2>/dev/null; then
429
417
  echo -e "🌐 本地网关: http://localhost:${PORT}"
430
418
  echo -e "📄 实时日志: tail -f ${INSTANCE_DIR}/workspace/server.log"
431
419
  echo -e "${GREEN}================================================${NC}"
420
+
421
+ # --- 交互式菜单 ---
422
+ if [ -t 0 ]; then
423
+ echo
424
+ echo -e "${BLUE}请选择下一步操作:${NC}"
425
+ echo "1) 启动 TUI (终端交互界面)"
426
+ echo "2) 打开 Web UI (浏览器)"
427
+ echo "3) 退出"
428
+ read -p "请输入数字 [1-3]: " choice
429
+ case $choice in
430
+ 1)
431
+ echo -e "${YELLOW}启动 TUI...${NC}"
432
+ cd "$INSTANCE_DIR"
433
+ ./start.sh tui
434
+ ;;
435
+ 2)
436
+ TOKEN=$(node -e "console.log(require('$INSTANCE_DIR/config/openclaw.json').gateway?.auth?.token || '')")
437
+ if [ -n "$TOKEN" ]; then
438
+ URL="http://localhost:$PORT/?token=$TOKEN"
439
+ echo -e "${GREEN}请在浏览器中打开: ${BLUE}$URL${NC}"
440
+ if [[ "$OSTYPE" == "darwin"* ]]; then
441
+ open "$URL"
442
+ elif command -v xdg-open &> /dev/null; then
443
+ xdg-open "$URL"
444
+ fi
445
+ else
446
+ echo -e "${RED}未找到 token,请手动查看配置文件。${NC}"
447
+ fi
448
+ ;;
449
+ 3)
450
+ echo "退出"
451
+ exit 0
452
+ ;;
453
+ *)
454
+ echo "无效选择"
455
+ ;;
456
+ esac
457
+ fi
432
458
  else
433
459
  echo -e "${YELLOW}⚠️ 进程存在但端口 ${PORT} 未监听(可能启动较慢或检查工具问题),请查看日志: ${INSTANCE_DIR}/workspace/server.log${NC}"
434
460
  fi
@@ -2,6 +2,7 @@
2
2
  # =================================================================
3
3
  # OpenClaw 离线增强版部署脚本 (适配 bundledDependencies + 中国区镜像)
4
4
  # 核心逻辑:修复权限 -> 固化环境 -> 本地 pnpm 安装 -> 实例初始化
5
+ # 新增:可选安装 Ollama 本地模型(用于截屏识图)
5
6
  # =================================================================
6
7
 
7
8
  set -e
@@ -150,6 +151,42 @@ if [ ! -d "$OPENCLAW_SOURCE_DIR" ]; then
150
151
  fi
151
152
  echo -e "${GREEN}✅ 源码路径验证通过${NC}"
152
153
 
154
+ # ==================== 8.5 可选安装本地模型(用于截屏识图)====================
155
+ echo
156
+ echo -e "${YELLOW}📷 是否安装本地模型用于截屏识图?(需要约6GB内存,模型:qwen2.5-vl:7b-instruct-q4_k_m)${NC}"
157
+ read -p "请输入 y/N: " install_model_choice
158
+
159
+ if [[ "$install_model_choice" == "y" || "$install_model_choice" == "Y" ]]; then
160
+ echo -e "${YELLOW}🔍 检查 Ollama 环境...${NC}"
161
+ if ! command -v ollama &> /dev/null; then
162
+ echo -e "${YELLOW}未检测到 Ollama,正在安装 Ollama...${NC}"
163
+ # 使用官方安装脚本(支持 macOS 和 Linux)
164
+ if curl -fsSL https://ollama.com/install.sh | sh; then
165
+ echo -e "${GREEN}✅ Ollama 安装成功${NC}"
166
+ else
167
+ echo -e "${RED}❌ Ollama 安装失败,请手动安装后重试。${NC}"
168
+ echo -e "${YELLOW}您可以访问 https://ollama.com 下载安装包。${NC}"
169
+ # 不退出,让用户继续
170
+ fi
171
+ else
172
+ echo -e "${GREEN}✅ Ollama 已安装${NC}"
173
+ fi
174
+
175
+ # 再次检查 ollama 是否可用
176
+ if command -v ollama &> /dev/null; then
177
+ echo -e "${YELLOW}正在拉取模型 qwen2.5-vl:7b-instruct-q4_k_m,这可能需要一些时间...${NC}"
178
+ if ollama pull qwen2.5-vl:7b-instruct-q4_k_m; then
179
+ echo -e "${GREEN}✅ 模型拉取成功${NC}"
180
+ else
181
+ echo -e "${RED}❌ 模型拉取失败,请稍后手动运行: ollama pull qwen2.5-vl:7b-instruct-q4_k_m${NC}"
182
+ fi
183
+ else
184
+ echo -e "${YELLOW}⚠️ Ollama 不可用,跳过模型安装。${NC}"
185
+ fi
186
+ else
187
+ echo -e "${BLUE}跳过本地模型安装。${NC}"
188
+ fi
189
+
153
190
  # ==================== 9. 自动化实例初始化 (直接调用 create-instance.sh) ====================
154
191
  CREATE_SCRIPT="$OPENCLAW_SOURCE_DIR/scripts/create-instance.sh"
155
192
 
@@ -1,36 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./thinking-BeGmb5k6.js";
10
- import "./tokens-q32vI39c.js";
11
- import "./plugins-4Rj4OjLY.js";
12
- import "./accounts-Tgelvk0C.js";
13
- import { t as deliverOutboundPayloads } from "./deliver-DbdywYJE.js";
14
- import "./accounts-C9HcPI9h.js";
15
- import "./image-ops-BuUnEOE0.js";
16
- import "./pi-embedded-helpers-CLXm10bV.js";
17
- import "./chrome-DxxEKrY7.js";
18
- import "./frontmatter-BkTfEZ93.js";
19
- import "./skills-7ODkHQYp.js";
20
- import "./path-alias-guards-BzvdLvTI.js";
21
- import "./redact-COik8ET1.js";
22
- import "./errors-xt401nuk.js";
23
- import "./fs-safe-CTYUrIgQ.js";
24
- import "./proxy-env-DlmzDx8x.js";
25
- import "./store-D89wDcz9.js";
26
- import "./accounts-C_lW3Ag9.js";
27
- import "./paths-Bkr-BCxW.js";
28
- import "./tool-images-RZdHiZcG.js";
29
- import "./fetch-DuraYswo.js";
30
- import "./fetch-guard-DWr0d00H.js";
31
- import "./ir-B83looB-.js";
32
- import "./fetch-BfuG8uZ8.js";
33
- import "./send-dfu6_rgf.js";
34
- import "./outbound-attachment-DqHlD21U.js";
35
-
36
- export { deliverOutboundPayloads };
@@ -1,26 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./plugins-4Rj4OjLY.js";
10
- import "./accounts-Tgelvk0C.js";
11
- import { h as sendMessageDiscord } from "./send-PE6cwoTe.js";
12
- import "./image-ops-BuUnEOE0.js";
13
- import "./path-alias-guards-BzvdLvTI.js";
14
- import "./redact-COik8ET1.js";
15
- import "./errors-xt401nuk.js";
16
- import "./fs-safe-CTYUrIgQ.js";
17
- import "./proxy-env-DlmzDx8x.js";
18
- import "./fetch-DuraYswo.js";
19
- import "./fetch-guard-DWr0d00H.js";
20
- import "./ir-B83looB-.js";
21
- import "./render-DW7AcFdD.js";
22
- import "./fetch-BfuG8uZ8.js";
23
- import "./channel-activity-BDnjYF7B.js";
24
- import "./tables-mE4cJBN2.js";
25
-
26
- export { sendMessageDiscord };
@@ -1,25 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./plugins-4Rj4OjLY.js";
10
- import "./accounts-Tgelvk0C.js";
11
- import "./image-ops-BuUnEOE0.js";
12
- import "./path-alias-guards-BzvdLvTI.js";
13
- import "./fs-safe-CTYUrIgQ.js";
14
- import "./proxy-env-DlmzDx8x.js";
15
- import "./store-D89wDcz9.js";
16
- import "./accounts-C_lW3Ag9.js";
17
- import "./fetch-DuraYswo.js";
18
- import "./fetch-guard-DWr0d00H.js";
19
- import "./ir-B83looB-.js";
20
- import "./render-DW7AcFdD.js";
21
- import "./tables-mE4cJBN2.js";
22
- import "./outbound-attachment-DqHlD21U.js";
23
- import { t as sendMessageIMessage } from "./send-L7gRiwyd.js";
24
-
25
- export { sendMessageIMessage };
@@ -1,24 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./plugins-4Rj4OjLY.js";
10
- import "./accounts-Tgelvk0C.js";
11
- import "./accounts-C9HcPI9h.js";
12
- import "./image-ops-BuUnEOE0.js";
13
- import "./path-alias-guards-BzvdLvTI.js";
14
- import "./fs-safe-CTYUrIgQ.js";
15
- import "./proxy-env-DlmzDx8x.js";
16
- import "./store-D89wDcz9.js";
17
- import "./fetch-DuraYswo.js";
18
- import "./fetch-guard-DWr0d00H.js";
19
- import "./ir-B83looB-.js";
20
- import "./fetch-BfuG8uZ8.js";
21
- import { t as sendMessageSignal } from "./send-dfu6_rgf.js";
22
- import "./outbound-attachment-DqHlD21U.js";
23
-
24
- export { sendMessageSignal };
@@ -1,22 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./tokens-q32vI39c.js";
10
- import "./plugins-4Rj4OjLY.js";
11
- import "./accounts-Tgelvk0C.js";
12
- import { t as sendMessageSlack } from "./send-6lz6rNVP.js";
13
- import "./image-ops-BuUnEOE0.js";
14
- import "./path-alias-guards-BzvdLvTI.js";
15
- import "./fs-safe-CTYUrIgQ.js";
16
- import "./proxy-env-DlmzDx8x.js";
17
- import "./fetch-DuraYswo.js";
18
- import "./fetch-guard-DWr0d00H.js";
19
- import "./ir-B83looB-.js";
20
- import "./render-DW7AcFdD.js";
21
-
22
- export { sendMessageSlack };
@@ -1,27 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./plugins-4Rj4OjLY.js";
10
- import "./accounts-Tgelvk0C.js";
11
- import "./image-ops-BuUnEOE0.js";
12
- import { o as sendMessageTelegram } from "./send-BHTiZcH3.js";
13
- import "./path-alias-guards-BzvdLvTI.js";
14
- import "./redact-COik8ET1.js";
15
- import "./errors-xt401nuk.js";
16
- import "./fs-safe-CTYUrIgQ.js";
17
- import "./proxy-env-DlmzDx8x.js";
18
- import "./fetch-DuraYswo.js";
19
- import "./fetch-guard-DWr0d00H.js";
20
- import "./proxy-fetch-B2pEfjbR.js";
21
- import "./ir-B83looB-.js";
22
- import "./render-DW7AcFdD.js";
23
- import "./fetch-BfuG8uZ8.js";
24
- import "./channel-activity-BDnjYF7B.js";
25
- import "./proxy-CecQTx_Z.js";
26
-
27
- export { sendMessageTelegram };
@@ -1,60 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./thinking-BeGmb5k6.js";
10
- import "./tokens-q32vI39c.js";
11
- import "./pi-embedded-BQQa91aA.js";
12
- import "./plugins-4Rj4OjLY.js";
13
- import "./accounts-Tgelvk0C.js";
14
- import "./send-6lz6rNVP.js";
15
- import "./send-PE6cwoTe.js";
16
- import "./deliver-DbdywYJE.js";
17
- import "./diagnostic-Co6Kghr-.js";
18
- import "./accounts-C9HcPI9h.js";
19
- import "./image-ops-BuUnEOE0.js";
20
- import "./send-BHTiZcH3.js";
21
- import "./pi-model-discovery-Dymwdjt0.js";
22
- import "./pi-embedded-helpers-CLXm10bV.js";
23
- import "./chrome-DxxEKrY7.js";
24
- import "./frontmatter-BkTfEZ93.js";
25
- import "./skills-7ODkHQYp.js";
26
- import "./path-alias-guards-BzvdLvTI.js";
27
- import "./redact-COik8ET1.js";
28
- import "./errors-xt401nuk.js";
29
- import "./fs-safe-CTYUrIgQ.js";
30
- import "./proxy-env-DlmzDx8x.js";
31
- import "./store-D89wDcz9.js";
32
- import "./accounts-C_lW3Ag9.js";
33
- import "./paths-Bkr-BCxW.js";
34
- import "./tool-images-RZdHiZcG.js";
35
- import "./image-eT7Y-nP5.js";
36
- import "./audio-transcription-runner-gLFfz8fr.js";
37
- import "./fetch-DuraYswo.js";
38
- import "./fetch-guard-DWr0d00H.js";
39
- import "./api-key-rotation-BJpKWXy0.js";
40
- import "./proxy-fetch-B2pEfjbR.js";
41
- import "./ir-B83looB-.js";
42
- import "./render-DW7AcFdD.js";
43
- import "./target-errors-mnlwhAjP.js";
44
- import "./commands-registry-D5qXbFJn.js";
45
- import "./skill-commands-DNqJ-kwn.js";
46
- import "./fetch-BfuG8uZ8.js";
47
- import "./channel-activity-BDnjYF7B.js";
48
- import "./tables-mE4cJBN2.js";
49
- import "./send-dfu6_rgf.js";
50
- import "./outbound-attachment-DqHlD21U.js";
51
- import "./send-L7gRiwyd.js";
52
- import "./proxy-CecQTx_Z.js";
53
- import "./manager-1bvuGrNR.js";
54
- import "./query-expansion-CX-1fS52.js";
55
- import { t as sendMessageWhatsApp } from "./outbound-ChDjtuD6.js";
56
- import "./session-D8ImowSs.js";
57
- import "./login-CrIwcrVI.js";
58
- import "./web-Btj-e8kN.js";
59
-
60
- export { sendMessageWhatsApp };
@@ -1,29 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./thinking-BeGmb5k6.js";
10
- import "./plugins-4Rj4OjLY.js";
11
- import "./accounts-Tgelvk0C.js";
12
- import "./accounts-C9HcPI9h.js";
13
- import "./image-ops-BuUnEOE0.js";
14
- import "./pi-embedded-helpers-CLXm10bV.js";
15
- import "./chrome-DxxEKrY7.js";
16
- import "./frontmatter-BkTfEZ93.js";
17
- import "./skills-7ODkHQYp.js";
18
- import "./path-alias-guards-BzvdLvTI.js";
19
- import "./redact-COik8ET1.js";
20
- import "./errors-xt401nuk.js";
21
- import "./fs-safe-CTYUrIgQ.js";
22
- import "./proxy-env-DlmzDx8x.js";
23
- import "./store-D89wDcz9.js";
24
- import "./accounts-C_lW3Ag9.js";
25
- import "./paths-Bkr-BCxW.js";
26
- import "./tool-images-RZdHiZcG.js";
27
- import { t as describeImageWithModel } from "./image-eT7Y-nP5.js";
28
-
29
- export { describeImageWithModel };
@@ -1,18 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./redact-COik8ET1.js";
10
- import "./errors-xt401nuk.js";
11
- import "./proxy-env-DlmzDx8x.js";
12
- import "./paths-Bkr-BCxW.js";
13
- import "./fetch-guard-DWr0d00H.js";
14
- import "./api-key-rotation-BJpKWXy0.js";
15
- import { t as MemoryIndexManager } from "./manager-1bvuGrNR.js";
16
- import "./query-expansion-CX-1fS52.js";
17
-
18
- export { MemoryIndexManager };
@@ -1,11 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import { n as discoverModels, t as discoverAuthStorage } from "./pi-model-discovery-Dymwdjt0.js";
10
-
11
- export { discoverAuthStorage, discoverModels };
@@ -1,13 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./accounts-Tgelvk0C.js";
10
- import "./session-D8ImowSs.js";
11
- import { t as loginWeb } from "./login-CrIwcrVI.js";
12
-
13
- export { loginWeb };
@@ -1,22 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./plugins-4Rj4OjLY.js";
10
- import "./accounts-Tgelvk0C.js";
11
- import "./image-ops-BuUnEOE0.js";
12
- import "./path-alias-guards-BzvdLvTI.js";
13
- import "./fs-safe-CTYUrIgQ.js";
14
- import "./proxy-env-DlmzDx8x.js";
15
- import "./fetch-DuraYswo.js";
16
- import "./fetch-guard-DWr0d00H.js";
17
- import "./ir-B83looB-.js";
18
- import "./render-DW7AcFdD.js";
19
- import "./tables-mE4cJBN2.js";
20
- import { n as sendPollWhatsApp, t as sendMessageWhatsApp } from "./outbound-ChDjtuD6.js";
21
-
22
- export { sendMessageWhatsApp, sendPollWhatsApp };
@@ -1,16 +0,0 @@
1
- import "./run-with-concurrency-BgYfgkXT.js";
2
- import "./paths-Cvc9EM8Y.js";
3
- import "./subsystem-B45WV3qB.js";
4
- import "./workspace-U-DyR64O.js";
5
- import "./logger-BfjWMCSD.js";
6
- import "./model-selection-Dna0Gz1k.js";
7
- import "./github-copilot-token-BDioPmd6.js";
8
- import "./legacy-names-DOC03BkU.js";
9
- import "./thinking-BeGmb5k6.js";
10
- import "./plugins-4Rj4OjLY.js";
11
- import "./accounts-Tgelvk0C.js";
12
- import "./accounts-C9HcPI9h.js";
13
- import "./accounts-C_lW3Ag9.js";
14
- import { f as resolveCommandArgMenu, n as findCommandByNativeName, s as listNativeCommandSpecsForConfig, t as buildCommandTextFromArgs, u as parseCommandArgs } from "./commands-registry-D5qXbFJn.js";
15
-
16
- export { buildCommandTextFromArgs, findCommandByNativeName, listNativeCommandSpecsForConfig, parseCommandArgs, resolveCommandArgMenu };