openclaw-multi-auto 1.7.9 → 1.8.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 (77) hide show
  1. package/dist/{agent-Bf9VxLj8.js → agent-BomWJjOy.js} +10 -10
  2. package/dist/{audio-preflight-DKt9ICbJ.js → audio-preflight-CZHCr2-5.js} +9 -9
  3. package/dist/{audio-preflight-BK4MI6Gs.js → audio-preflight-GAYJDgGF.js} +1 -1
  4. package/dist/{audit-membership-runtime-0b4ZhE41.js → audit-membership-runtime-fBOVjLNx.js} +4 -4
  5. package/dist/auth-profiles.runtime-DNqCx0L5.js +11 -0
  6. package/dist/{auth-profiles.runtime-DEhTAVAo.js → auth-profiles.runtime-IXde-3_L.js} +1 -1
  7. package/dist/build-info.json +3 -3
  8. package/dist/bundled/boot-md/handler.js +10 -10
  9. package/dist/bundled/bootstrap-extra-files/handler.js +5 -5
  10. package/dist/bundled/command-logger/handler.js +2 -2
  11. package/dist/bundled/session-memory/handler.js +9 -9
  12. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  13. package/dist/{compact.runtime-CH24Vvny.js → compact.runtime-BCHQpekB.js} +1 -1
  14. package/dist/compact.runtime-pgjSlzSY.js +11 -0
  15. package/dist/{deliver-runtime-6WeFOxSI.js → deliver-runtime-Bm3VqH55.js} +1 -1
  16. package/dist/deliver-runtime-D4aWAXZ9.js +11 -0
  17. package/dist/extensionAPI.js +1 -1
  18. package/dist/{fetch-sH_NN8SV.js → fetch-BdTTF2z-.js} +2 -2
  19. package/dist/{frontmatter-DhmdUnBP.js → frontmatter-DZlWsaUx.js} +3 -3
  20. package/dist/{github-copilot-token-368sRGBD.js → github-copilot-token-BeFx3MLn.js} +7 -7
  21. package/dist/image-runtime-Brryt_BU.js +11 -0
  22. package/dist/{image-runtime-BwzYRCA5.js → image-runtime-CReMeTZL.js} +1 -1
  23. package/dist/llm-slug-generator.js +9 -9
  24. package/dist/{logger-C0l_Gj8Y.js → logger-DCBlX1uz.js} +7 -7
  25. package/dist/{login-aLc84rc7.js → login-CKmmxErc.js} +4 -4
  26. package/dist/{login-qr-FW_sLvPl.js → login-qr-D2jYdV8v.js} +2 -2
  27. package/dist/{login-qr-D3QtIyy8.js → login-qr-KVA4wuh0.js} +10 -10
  28. package/dist/{login-BEOnxdap.js → login-xsvrgJJt.js} +2 -2
  29. package/dist/{manager-runtime-DV0_pZDZ.js → manager-runtime-BBxiBzvv.js} +1 -1
  30. package/dist/manager-runtime-D9AEoM1M.js +11 -0
  31. package/dist/{manager.runtime-ilRhqZW0.js → manager.runtime-BV-CBNb2.js} +10 -10
  32. package/dist/{manager.runtime-CynsHdcO.js → manager.runtime-CF3GyuMb.js} +7 -7
  33. package/dist/{model-selection-qaBek98Q.js → model-selection-BQm6_iuT.js} +43 -43
  34. package/dist/{model-selection-G7SiAgN6.js → model-selection-CNRMBWfR.js} +287 -287
  35. package/dist/{paths-BwJ6yG6k.js → paths-CNIc83Pn.js} +5 -5
  36. package/dist/pi-model-discovery-runtime-CDKkuBYh.js +11 -0
  37. package/dist/{pi-model-discovery-runtime-Q0BoklY3.js → pi-model-discovery-runtime-DeRljgTs.js} +1 -1
  38. package/dist/{pi-tools.before-tool-call.runtime-Be9V6RlN.js → pi-tools.before-tool-call.runtime-DgAiY2la.js} +9 -9
  39. package/dist/{pi-tools.before-tool-call.runtime-B_uML_Gt.js → pi-tools.before-tool-call.runtime-PhxG0y1R.js} +1 -1
  40. package/dist/{pw-ai-BLzIHVAG.js → pw-ai-3ual6adI.js} +9 -9
  41. package/dist/{pw-ai-DzdseGw2.js → pw-ai-CzFFsGR7.js} +1 -1
  42. package/dist/{qmd-manager-CFVuAj9l.js → qmd-manager-DvglNhlJ.js} +5 -5
  43. package/dist/{query-expansion-DnS6CGY2.js → query-expansion-DXwSmE_K.js} +8 -8
  44. package/dist/runtime-whatsapp-login.runtime-Br3SxDXL.js +13 -0
  45. package/dist/{runtime-whatsapp-login.runtime-Dsz-DNfa.js → runtime-whatsapp-login.runtime-vKFKNi8Z.js} +3 -3
  46. package/dist/runtime-whatsapp-outbound.runtime-L3Qkst0n.js +12 -0
  47. package/dist/{runtime-whatsapp-outbound.runtime-BeZMBTt6.js → runtime-whatsapp-outbound.runtime-SAT-C6UE.js} +2 -2
  48. package/dist/{send-p1D-Lzec.js → send-CXnKWzde.js} +3 -3
  49. package/dist/{send-DxYxezcL.js → send-DGQUY-kp.js} +1 -1
  50. package/dist/{session--tqRfZQU.js → session-CbQ43pUq.js} +1 -1
  51. package/dist/{session-DIkw9afg.js → session-kt-bqE_z.js} +7 -7
  52. package/dist/slash-commands.runtime-BYfxn_xu.js +11 -0
  53. package/dist/{slash-commands.runtime-C8j-n-bX.js → slash-commands.runtime-DoT9bJKb.js} +1 -1
  54. package/dist/{slash-dispatch.runtime-BA-MMy0P.js → slash-dispatch.runtime--9HmQuIE.js} +1 -1
  55. package/dist/{slash-dispatch.runtime-CgJLQTwP.js → slash-dispatch.runtime-Cu8ghe1h.js} +9 -9
  56. package/dist/slash-skill-commands.runtime-8dS5PTaH.js +11 -0
  57. package/dist/{slash-skill-commands.runtime-Cm8K1kWM.js → slash-skill-commands.runtime-BZqnnkHJ.js} +1 -1
  58. package/dist/{subagent-registry-runtime-DKOXxZgH.js → subagent-registry-runtime-9WfVik2h.js} +1 -1
  59. package/dist/{subagent-registry-runtime-DQeHzv-u.js → subagent-registry-runtime-Z0fdsGSq.js} +9 -9
  60. package/dist/{subsystem-CDcEQtQK.js → subsystem-Cr1MiLhx.js} +14 -14
  61. package/dist/{web-RzQ9jrtt.js → web-B_EVHbEP.js} +4 -4
  62. package/dist/{web-gHwQkPhu.js → web-CXyjF_si.js} +12 -12
  63. package/dist/{whatsapp-actions-C1UZXBOC.js → whatsapp-actions-BUvGEDSk.js} +10 -10
  64. package/dist/{whatsapp-actions-BmDvJijd.js → whatsapp-actions-pQqLTCXJ.js} +2 -2
  65. package/dist/{workspace-Cg3kGb1y.js → workspace-Bi8vpJN0.js} +20 -20
  66. package/package.json +1 -1
  67. package/scripts/create-instance.sh +43 -176
  68. package/dist/auth-profiles.runtime-pDQ4QesA.js +0 -11
  69. package/dist/compact.runtime-Y7wbaDO2.js +0 -11
  70. package/dist/deliver-runtime-DBYdmfDR.js +0 -11
  71. package/dist/image-runtime-XMz7IM-j.js +0 -11
  72. package/dist/manager-runtime-D8C3_L2_.js +0 -11
  73. package/dist/pi-model-discovery-runtime-DgHKNg0i.js +0 -11
  74. package/dist/runtime-whatsapp-login.runtime-CXhM_C-C.js +0 -13
  75. package/dist/runtime-whatsapp-outbound.runtime-Kx-CVYdW.js +0 -12
  76. package/dist/slash-commands.runtime-D6R-T9zj.js +0 -11
  77. package/dist/slash-skill-commands.runtime-BC9oRGpm.js +0 -11
@@ -1,10 +1,10 @@
1
1
  import "./query-expansion-C6UNkw7W.js";
2
2
  import "./paths-CzCvxHkV.js";
3
3
  import "./logger-Cmh2bFJD.js";
4
- import { Bt as createActionGate, Ht as readReactionParams, Ut as readStringParam, Vt as jsonResult, mr as resolveWhatsAppAccount, pr as resolveWhatsAppOutboundTarget, zt as ToolAuthorizationError } from "./model-selection-qaBek98Q.js";
4
+ import { Bt as createActionGate, Ht as readReactionParams, Ut as readStringParam, Vt as jsonResult, mr as resolveWhatsAppAccount, pr as resolveWhatsAppOutboundTarget, zt as ToolAuthorizationError } from "./model-selection-BQm6_iuT.js";
5
5
  import "./github-copilot-token-xzmo0MIc.js";
6
6
  import "./fetch-sqCl8SIJ.js";
7
- import { r as sendReactionWhatsApp } from "./send-DxYxezcL.js";
7
+ import { r as sendReactionWhatsApp } from "./send-DGQUY-kp.js";
8
8
  //#region src/agents/tools/whatsapp-target-auth.ts
9
9
  function resolveAuthorizedWhatsAppOutboundTarget(params) {
10
10
  const account = resolveWhatsAppAccount({
@@ -1,10 +1,10 @@
1
- import { f as resolveRequiredHomeDir } from "./paths-BwJ6yG6k.js";
2
- import { l as danger, m as shouldLogVerbose } from "./subsystem-CDcEQtQK.js";
3
- import { g as pathExists$1, n as logError, t as logDebug, y as resolveUserPath } from "./logger-C0l_Gj8Y.js";
1
+ import { f as resolveRequiredHomeDir } from "./paths-CNIc83Pn.js";
2
+ import { l as danger, m as shouldLogVerbose } from "./subsystem-Cr1MiLhx.js";
3
+ import { g as pathExists$1, n as logError, t as logDebug, y as resolveUserPath } from "./logger-DCBlX1uz.js";
4
4
  import fs from "node:fs/promises";
5
5
  import os from "node:os";
6
6
  import path from "node:path";
7
- import fs$1 from "node:fs";
7
+ import syncFs from "node:fs";
8
8
  import { promisify } from "node:util";
9
9
  import { execFile, spawn } from "node:child_process";
10
10
  import process$1 from "node:process";
@@ -571,7 +571,7 @@ function resolveBoundaryPathLexicalSync(params) {
571
571
  rootCanonicalPath: params.rootCanonicalPath,
572
572
  resolveParams: params.params,
573
573
  absolutePath: params.absolutePath,
574
- read: (cursor) => fs$1.lstatSync(cursor)
574
+ read: (cursor) => syncFs.lstatSync(cursor)
575
575
  });
576
576
  if (isPromiseLike(maybeStat)) throw new Error("Unexpected async lexical stat");
577
577
  const stat = maybeStat;
@@ -721,15 +721,15 @@ function resolvePathViaExistingAncestorSync(targetPath) {
721
721
  const normalized = path.resolve(targetPath);
722
722
  let cursor = normalized;
723
723
  const missingSuffix = [];
724
- while (!isFilesystemRoot(cursor) && !fs$1.existsSync(cursor)) {
724
+ while (!isFilesystemRoot(cursor) && !syncFs.existsSync(cursor)) {
725
725
  missingSuffix.unshift(path.basename(cursor));
726
726
  const parent = path.dirname(cursor);
727
727
  if (parent === cursor) break;
728
728
  cursor = parent;
729
729
  }
730
- if (!fs$1.existsSync(cursor)) return normalized;
730
+ if (!syncFs.existsSync(cursor)) return normalized;
731
731
  try {
732
- const resolvedAncestor = path.resolve(fs$1.realpathSync(cursor));
732
+ const resolvedAncestor = path.resolve(syncFs.realpathSync(cursor));
733
733
  if (missingSuffix.length === 0) return resolvedAncestor;
734
734
  return path.resolve(resolvedAncestor, ...missingSuffix);
735
735
  } catch {
@@ -754,7 +754,7 @@ function getPathKindSync(absolutePath, preserveFinalSymlink) {
754
754
  try {
755
755
  return {
756
756
  exists: true,
757
- kind: toResolvedKind(preserveFinalSymlink ? fs$1.lstatSync(absolutePath) : fs$1.statSync(absolutePath))
757
+ kind: toResolvedKind(preserveFinalSymlink ? syncFs.lstatSync(absolutePath) : syncFs.statSync(absolutePath))
758
758
  };
759
759
  } catch (error) {
760
760
  if (isNotFoundPathError(error)) return {
@@ -814,10 +814,10 @@ async function resolveSymlinkHopPath(symlinkPath) {
814
814
  }
815
815
  function resolveSymlinkHopPathSync(symlinkPath) {
816
816
  try {
817
- return path.resolve(fs$1.realpathSync(symlinkPath));
817
+ return path.resolve(syncFs.realpathSync(symlinkPath));
818
818
  } catch (error) {
819
819
  if (!isNotFoundPathError(error)) throw error;
820
- const linkTarget = fs$1.readlinkSync(symlinkPath);
820
+ const linkTarget = syncFs.readlinkSync(symlinkPath);
821
821
  return resolvePathViaExistingAncestorSync(path.resolve(path.dirname(symlinkPath), linkTarget));
822
822
  }
823
823
  }
@@ -841,7 +841,7 @@ function sameFileIdentity(left, right) {
841
841
  return sameFileIdentity$1(left, right);
842
842
  }
843
843
  function openVerifiedFileSync(params) {
844
- const ioFs = params.ioFs ?? fs$1;
844
+ const ioFs = params.ioFs ?? syncFs;
845
845
  const allowedType = params.allowedType ?? "file";
846
846
  const openReadFlags = ioFs.constants.O_RDONLY | (typeof ioFs.constants.O_NOFOLLOW === "number" ? ioFs.constants.O_NOFOLLOW : 0);
847
847
  let fd = null;
@@ -917,7 +917,7 @@ function canUseBoundaryFileOpen(ioFs) {
917
917
  return typeof ioFs.openSync === "function" && typeof ioFs.closeSync === "function" && typeof ioFs.fstatSync === "function" && typeof ioFs.lstatSync === "function" && typeof ioFs.realpathSync === "function" && typeof ioFs.readFileSync === "function" && typeof ioFs.constants === "object" && ioFs.constants !== null;
918
918
  }
919
919
  function openBoundaryFileSync(params) {
920
- const ioFs = params.ioFs ?? fs$1;
920
+ const ioFs = params.ioFs ?? syncFs;
921
921
  const resolved = resolveBoundaryFilePathGeneric({
922
922
  absolutePath: params.absolutePath,
923
923
  resolve: (absolutePath) => resolveBoundaryPathSync({
@@ -968,7 +968,7 @@ function finalizeBoundaryFileOpen(params) {
968
968
  });
969
969
  }
970
970
  async function openBoundaryFile(params) {
971
- const ioFs = params.ioFs ?? fs$1;
971
+ const ioFs = params.ioFs ?? syncFs;
972
972
  const maybeResolved = resolveBoundaryFilePathGeneric({
973
973
  absolutePath: params.absolutePath,
974
974
  resolve: (absolutePath) => resolveBoundaryPath({
@@ -1133,7 +1133,7 @@ function resolveNpmArgvForWindows(argv) {
1133
1133
  if (!cliName) return null;
1134
1134
  const nodeDir = path.dirname(process$1.execPath);
1135
1135
  const cliPath = path.join(nodeDir, "node_modules", "npm", "bin", cliName);
1136
- if (!fs$1.existsSync(cliPath)) {
1136
+ if (!syncFs.existsSync(cliPath)) {
1137
1137
  const command = argv[0] ?? "";
1138
1138
  return [path.extname(command).toLowerCase() ? command : `${command}.cmd`, ...argv.slice(1)];
1139
1139
  }
@@ -1338,7 +1338,7 @@ async function readPackageName(dir) {
1338
1338
  }
1339
1339
  function readPackageNameSync(dir) {
1340
1340
  try {
1341
- return parsePackageName(fs$1.readFileSync(path.join(dir, "package.json"), "utf-8"));
1341
+ return parsePackageName(syncFs.readFileSync(path.join(dir, "package.json"), "utf-8"));
1342
1342
  } catch {
1343
1343
  return null;
1344
1344
  }
@@ -1370,7 +1370,7 @@ function candidateDirsFromArgv1(argv1) {
1370
1370
  const normalized = path.resolve(argv1);
1371
1371
  const candidates = [path.dirname(normalized)];
1372
1372
  try {
1373
- const resolved = fs$1.realpathSync(normalized);
1373
+ const resolved = syncFs.realpathSync(normalized);
1374
1374
  if (resolved !== normalized) candidates.push(path.dirname(resolved));
1375
1375
  } catch {}
1376
1376
  const parts = normalized.split(path.sep);
@@ -1482,14 +1482,14 @@ async function readWorkspaceFileWithGuards(params) {
1482
1482
  const identity = workspaceFileIdentity(opened.stat, opened.path);
1483
1483
  const cached = workspaceFileCache.get(params.filePath);
1484
1484
  if (cached && cached.identity === identity) {
1485
- fs$1.closeSync(opened.fd);
1485
+ syncFs.closeSync(opened.fd);
1486
1486
  return {
1487
1487
  ok: true,
1488
1488
  content: cached.content
1489
1489
  };
1490
1490
  }
1491
1491
  try {
1492
- const content = fs$1.readFileSync(opened.fd, "utf-8");
1492
+ const content = syncFs.readFileSync(opened.fd, "utf-8");
1493
1493
  workspaceFileCache.set(params.filePath, {
1494
1494
  content,
1495
1495
  identity
@@ -1506,7 +1506,7 @@ async function readWorkspaceFileWithGuards(params) {
1506
1506
  error
1507
1507
  };
1508
1508
  } finally {
1509
- fs$1.closeSync(opened.fd);
1509
+ syncFs.closeSync(opened.fd);
1510
1510
  }
1511
1511
  }
1512
1512
  function stripFrontMatter(content) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-multi-auto",
3
- "version": "1.7.9",
3
+ "version": "1.8.0",
4
4
  "description": "Multi-channel AI gateway with extensible messaging integrations",
5
5
  "keywords": [],
6
6
  "homepage": "https://github.com/openclaw/openclaw#readme",
@@ -2,13 +2,6 @@
2
2
  # =================================================================
3
3
  # OpenClaw 深度集成初始化工具 (create-instance.sh)
4
4
  # 功能:创建实例目录、复制源码、安装依赖、配置模型、启动服务
5
- #
6
- # 架构说明:
7
- # - 源码位置: ~/openclaw-runtime/node_modules/openclaw-multi-auto
8
- # - 实例位置: ~/openclaws/实例名/
9
- # - 源码复制: ~/openclaws/实例名/dist (复制源码,不含 node_modules)
10
- # - 依赖安装: ~/openclaws/实例名/node_modules (pnpm 安装)
11
- # - 启动方式: ./start.sh (从 dist 目录启动,使用实例根目录的 node_modules)
12
5
  # =================================================================
13
6
 
14
7
  set -e
@@ -29,10 +22,7 @@ for cmd in node pnpm; do
29
22
  done
30
23
 
31
24
  # --- 1. 源码路径定位 ---
32
- # 默认源码路径:~/openclaw-runtime/node_modules/openclaw-multi-auto
33
25
  SOURCE_CODE="$HOME/openclaw-runtime/node_modules/openclaw-multi-auto"
34
-
35
- # 允许通过环境变量覆盖
36
26
  if [ -n "$OPENCLAW_SOURCE_DIR" ] && [ -d "$OPENCLAW_SOURCE_DIR" ]; then
37
27
  SOURCE_CODE="$OPENCLAW_SOURCE_DIR"
38
28
  echo -e "${BLUE}📂 使用环境变量指定的源码路径: $SOURCE_CODE${NC}"
@@ -41,13 +31,11 @@ else
41
31
  echo -e "${GREEN}✅ 找到本地源码路径: $SOURCE_CODE${NC}"
42
32
  else
43
33
  echo -e "${RED}❌ 错误: 未找到 OpenClaw 源码目录${NC}"
44
- echo -e "${YELLOW}源码路径: $SOURCE_CODE${NC}"
45
- echo -e "${YELLOW}请确认已正确安装 openclaw-multi-auto${NC}"
46
34
  exit 1
47
35
  fi
48
36
  fi
49
37
 
50
- # 实例基础目录:~/openclaws
38
+ # 实例基础目录
51
39
  INSTANCES_BASE="$HOME/openclaws"
52
40
 
53
41
  # --- 2. 获取实例名称 ---
@@ -67,16 +55,16 @@ fi
67
55
 
68
56
  # --- 4. 定义实例目录并清理旧残留 ---
69
57
  INSTANCE_DIR="$INSTANCES_BASE/${INSTANCE_NAME}"
58
+ DIST_DIR="${INSTANCE_DIR}" # 源码复制到实例根目录(根据您的脚本)
70
59
 
71
60
  echo -e "${BLUE}🏗️ 正在深度初始化实例: ${INSTANCE_NAME} (端口 ${PORT})${NC}"
72
- echo "SOURCE_CODE = $SOURCE_CODE"
73
61
 
74
62
  if [ -d "$INSTANCE_DIR" ]; then
75
63
  echo -e "${YELLOW}⚠️ 清理旧实例目录...${NC}"
76
64
  rm -rf "$INSTANCE_DIR"
77
65
  fi
78
66
 
79
- # 清理基础目录下可能遗留的 workspace 配置
67
+ # 清理可能遗留的 workspace 配置
80
68
  [ -d "${INSTANCES_BASE}/node_modules" ] && rm -rf "${INSTANCES_BASE}/node_modules"
81
69
  [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ] && rm -f "${INSTANCES_BASE}/pnpm-workspace.yaml"
82
70
 
@@ -100,16 +88,6 @@ fi
100
88
 
101
89
  # --- 7. 核心代码同步 (从源码复制到实例根目录) ---
102
90
  echo -e "${BLUE}🔄 正在从源码复制文件到实例根目录...${NC}"
103
- echo -e "${YELLOW}源码路径: ${SOURCE_CODE}${NC}"
104
- echo -e "${YELLOW}目标路径: ${INSTANCE_DIR}${NC}"
105
-
106
- # 清理已存在的实例目录(如果存在)
107
- if [ -d "$INSTANCE_DIR" ]; then
108
- echo -e "${YELLOW}⚠️ 清理旧实例目录...${NC}"
109
- rm -rf "$INSTANCE_DIR"
110
- fi
111
-
112
- # 复制源码所有内容到实例根目录
113
91
  if cp -r "${SOURCE_CODE}/." "${INSTANCE_DIR}/"; then
114
92
  echo -e "${GREEN}✅ 源码复制成功${NC}"
115
93
  else
@@ -117,7 +95,7 @@ else
117
95
  exit 1
118
96
  fi
119
97
 
120
- # 修复:如果 config 是符号链接,则替换为普通目录(防止后续写入失败)
98
+ # 【关键修复】如果 config 是符号链接,则替换为普通目录
121
99
  if [ -L "${INSTANCE_DIR}/config" ]; then
122
100
  echo -e "${YELLOW}⚠️ 检测到 config 为符号链接,正在修复为普通目录...${NC}"
123
101
  rm -f "${INSTANCE_DIR}/config"
@@ -131,9 +109,7 @@ if [ ! -f "${INSTANCE_DIR}/package.json" ]; then
131
109
  fi
132
110
 
133
111
  # --- 依赖安装 ---
134
- # 注意:npm/pnpm 发布的包不包含 node_modules,需要在实例中安装
135
112
  echo -e "${BLUE}📦 正在安装依赖...${NC}"
136
-
137
113
  cd "${INSTANCE_DIR}"
138
114
 
139
115
  # 临时清理可能干扰的 workspace 配置
@@ -142,11 +118,9 @@ if [ -f "${INSTANCES_BASE}/pnpm-workspace.yaml" ]; then
142
118
  mv "${INSTANCES_BASE}/pnpm-workspace.yaml" "${INSTANCES_BASE}/pnpm-workspace.yaml.bak.$(date +%s)"
143
119
  fi
144
120
 
145
- # 设置 Sharp 镜像(国内加速)
146
121
  export SHARP_BINARY_HOST="https://npmmirror.com/mirrors/sharp"
147
122
  export SHARP_LIBVIPS_BINARY_HOST="https://npmmirror.com/mirrors/sharp-libvips"
148
123
 
149
- # 安装依赖(使用国内镜像)
150
124
  if ! pnpm install --shamefully-hoist --ignore-workspace --registry=https://registry.npmmirror.com --no-frozen-lockfile > .install.log 2>&1; then
151
125
  echo -e "${RED}❌ 依赖安装失败,请查看日志: ${INSTANCE_DIR}/.install.log${NC}"
152
126
  exit 1
@@ -158,22 +132,15 @@ if [ ! -d "node_modules" ]; then
158
132
  fi
159
133
  echo -e "${GREEN}✅ 依赖安装成功${NC}"
160
134
 
161
- # --- 安装扩展到实例根目录 ---
135
+ # --- 安装扩展 page-action-cache ---
162
136
  echo -e "${BLUE}📦 正在安装扩展 page-action-cache...${NC}"
163
-
164
- # 确保 extensions 目录存在
165
137
  mkdir -p "${INSTANCE_DIR}/extensions"
166
-
167
138
  cd "${INSTANCE_DIR}/extensions"
168
-
169
- # 下载 page-action-cache tarball 并解压到临时目录
170
139
  TEMP_EXT_DIR=$(mktemp -d)
171
140
  cd "$TEMP_EXT_DIR"
172
141
  if npm pack page-action-cache --registry=https://registry.npmmirror.com --quiet > /dev/null 2>&1; then
173
142
  TARBALL=$(ls *.tgz)
174
- # 解压到临时目录
175
143
  tar -xzf "$TARBALL"
176
- # 移动到 extensions/page-action-cache
177
144
  rm -rf "${INSTANCE_DIR}/extensions/page-action-cache"
178
145
  mv package "${INSTANCE_DIR}/extensions/page-action-cache"
179
146
  echo -e "${GREEN}✅ page-action-cache 安装成功${NC}"
@@ -181,8 +148,6 @@ else
181
148
  echo -e "${YELLOW}⚠️ page-action-cache 下载失败${NC}"
182
149
  fi
183
150
  rm -rf "$TEMP_EXT_DIR"
184
-
185
- # 返回实例根目录
186
151
  cd "${INSTANCE_DIR}"
187
152
 
188
153
  # --- 8. 参数与交互式获取 ---
@@ -207,9 +172,17 @@ if [ -z "$API_KEY" ]; then
207
172
  fi
208
173
 
209
174
  # --- 9. 生成深度配置文件 ---
210
- DEFAULT_MODEL="zai/glm-5"
211
- ZAI_KEY=""; DS_KEY=""; MX_KEY=""; KIMI_KEY=""; QWEN_KEY=""
175
+ # 【双重保障】再次确保 config 是普通目录且可写
176
+ if [ -e "${INSTANCE_DIR}/config" ] && [ ! -d "${INSTANCE_DIR}/config" ]; then
177
+ echo -e "${YELLOW}⚠️ 检测到 config 不是目录,正在修复...${NC}"
178
+ rm -f "${INSTANCE_DIR}/config"
179
+ fi
180
+ mkdir -p "${INSTANCE_DIR}/config"
181
+ touch "${INSTANCE_DIR}/config/.write_test" || { echo -e "${RED}❌ config 目录不可写${NC}"; exit 1; }
182
+ rm -f "${INSTANCE_DIR}/config/.write_test"
212
183
 
184
+ # 设置模型变量
185
+ ZAI_KEY=""; DS_KEY=""; MX_KEY=""; KIMI_KEY=""; QWEN_KEY=""
213
186
  case "$MODEL_PROVIDER" in
214
187
  zai) PRIMARY_MODEL="zai/glm-5"; ZAI_KEY="$API_KEY" ;;
215
188
  deepseek) PRIMARY_MODEL="deepseek/deepseek-chat"; DS_KEY="$API_KEY" ;;
@@ -236,72 +209,32 @@ cat > "${INSTANCE_DIR}/config/openclaw.json" << EOF
236
209
  "baseUrl": "https://open.bigmodel.cn/api/paas/v4",
237
210
  "apiKey": "${ZAI_KEY}",
238
211
  "api": "openai-completions",
239
- "models": [
240
- {
241
- "id": "glm-5",
242
- "name": "GLM-5",
243
- "input": ["text"],
244
- "contextWindow": 32768,
245
- "maxTokens": 4096
246
- }
247
- ]
212
+ "models": [{"id": "glm-5","name": "GLM-5","input": ["text"],"contextWindow": 32768,"maxTokens": 4096}]
248
213
  },
249
214
  "deepseek": {
250
215
  "baseUrl": "https://api.deepseek.com",
251
216
  "apiKey": "${DS_KEY}",
252
217
  "api": "openai-completions",
253
- "models": [
254
- {
255
- "id": "deepseek-chat",
256
- "name": "DeepSeek-Chat",
257
- "input": ["text"],
258
- "contextWindow": 32768,
259
- "maxTokens": 4096
260
- }
261
- ]
218
+ "models": [{"id": "deepseek-chat","name": "DeepSeek-Chat","input": ["text"],"contextWindow": 32768,"maxTokens": 4096}]
262
219
  },
263
220
  "minimax-cn": {
264
221
  "baseUrl": "https://api.minimax.chat/v1",
265
222
  "apiKey": "${MX_KEY}",
266
223
  "api": "openai-completions",
267
- "models": [
268
- {
269
- "id": "MiniMax-M2.5-highspeed",
270
- "name": "MiniMax-M2.5-highspeed",
271
- "input": ["text"],
272
- "cost": { "input": 0.000002, "output": 0.000006 },
273
- "contextWindow": 65536,
274
- "maxTokens": 8192
275
- }
276
- ]
224
+ "models": [{"id": "MiniMax-M2.5-highspeed","name": "MiniMax-M2.5-highspeed","input": ["text"],"cost": {"input": 2e-6,"output": 6e-6},"contextWindow": 65536,"maxTokens": 8192}]
277
225
  },
278
226
  "ollama": {
279
227
  "baseUrl": "http://127.0.0.1:11434",
280
228
  "api": "ollama",
281
- "models": [
282
- {
283
- "id": "qwen3-vl:8b",
284
- "name": "Qwen3-VL-8B",
285
- "input": ["text", "image"],
286
- "contextWindow": 32768,
287
- "maxTokens": 4096
288
- }
289
- ]
229
+ "models": [{"id": "qwen3-vl:8b","name": "Qwen3-VL-8B","input": ["text","image"],"contextWindow": 32768,"maxTokens": 4096}]
290
230
  }
291
231
  }
292
232
  },
293
233
  "agents": {
294
234
  "defaults": {
295
235
  "model": { "primary": "${PRIMARY_MODEL}" },
296
- "imageModel": {
297
- "primary": "ollama/qwen3-vl:8b",
298
- "fallbacks": [
299
- "ollama/qwen3-vl:8b"
300
- ]
301
- },
302
- "models": {
303
- "ollama/qwen3-vl:8b": {}
304
- },
236
+ "imageModel": { "primary": "ollama/qwen3-vl:8b", "fallbacks": ["ollama/qwen3-vl:8b"] },
237
+ "models": { "ollama/qwen3-vl:8b": {} },
305
238
  "workspace": "${INSTANCE_DIR}/workspace",
306
239
  "compaction": { "mode": "safeguard" }
307
240
  }
@@ -311,17 +244,14 @@ cat > "${INSTANCE_DIR}/config/openclaw.json" << EOF
311
244
  }
312
245
  EOF
313
246
 
314
- # --- 10. 预装可选技能 (失败不影响主流程) ---
247
+ # --- 10. 预装可选技能 ---
315
248
  echo -e "${BLUE}🤖 正在注入飞书运维机器人引导...${NC}"
316
249
  SKILLS_DIR="${INSTANCE_DIR}/workspace/skills"
317
250
  mkdir -p "$SKILLS_DIR"
318
-
319
251
  SKILL_PKG="jinyu-skill-feishu-config"
320
252
  REGISTRY="https://registry.npmmirror.com"
321
-
322
253
  TEMP_DIR=$(mktemp -d)
323
254
  cd "$TEMP_DIR"
324
-
325
255
  if npm pack "$SKILL_PKG@latest" --registry="$REGISTRY" --quiet > /dev/null; then
326
256
  TARBALL=$(ls *.tgz)
327
257
  mkdir -p "$SKILLS_DIR/feishu-config"
@@ -330,11 +260,10 @@ if npm pack "$SKILL_PKG@latest" --registry="$REGISTRY" --quiet > /dev/null; then
330
260
  else
331
261
  echo -e "${YELLOW}⚠️ 技能 feishu-config 下载失败,跳过(可手动安装)${NC}"
332
262
  fi
333
-
334
263
  cd - > /dev/null
335
264
  rm -rf "$TEMP_DIR"
336
265
 
337
- # --- 如果实例是 yunwei,安装角色包并初始化 workspace ---
266
+ # --- 如果实例是 yunwei,安装角色包 ---
338
267
  if [ "$INSTANCE_NAME" = "yunwei" ]; then
339
268
  echo -e "${BLUE}🛠️ 检测到运维实例,正在安装角色包 role-openclaw-yunwei...${NC}"
340
269
  TEMP_ROLE_DIR=$(mktemp -d)
@@ -343,22 +272,15 @@ if [ "$INSTANCE_NAME" = "yunwei" ]; then
343
272
  TARBALL=$(ls *.tgz)
344
273
  tar -xzf "$TARBALL" --strip-components=1
345
274
  rm "$TARBALL"
346
-
347
- # 1. 将 memory、skills 等目录复制到 workspace 根目录(排除 .md 文件)
348
275
  for item in *; do
349
276
  if [ -d "$item" ]; then
350
- # 目录(如 memory、skills)复制到 workspace
351
277
  cp -r "$item" "$INSTANCE_DIR/workspace/"
352
278
  elif [ -f "$item" ]; then
353
- # 非 .md 文件(如 package.json)也复制到 workspace
354
279
  cp "$item" "$INSTANCE_DIR/workspace/" 2>/dev/null || true
355
280
  fi
356
281
  done
357
-
358
- # 2. 创建实例根目录下的 docs 目录,并将所有 .md 文件复制过去
359
282
  mkdir -p "$INSTANCE_DIR/docs/reference/templates"
360
283
  cp *.md "$INSTANCE_DIR/docs/reference/templates/" 2>/dev/null || true
361
-
362
284
  echo -e "${GREEN}✅ 角色包安装完成,workspace 已初始化${NC}"
363
285
  else
364
286
  echo -e "${YELLOW}⚠️ 角色包下载失败,请检查网络或手动安装${NC}"
@@ -367,56 +289,35 @@ if [ "$INSTANCE_NAME" = "yunwei" ]; then
367
289
  rm -rf "$TEMP_ROLE_DIR"
368
290
  fi
369
291
 
370
- # --- 设置 profile 链接以便 openclaw --profile 使用 ---
371
- echo -e "${BLUE}🔗 配置 profile 链接以支持 --profile 命令行...${NC}"
292
+ # --- 设置 profile 链接 ---
293
+ echo -e "${BLUE}🔗 配置 profile 链接...${NC}"
372
294
  PROFILES_DIR="$HOME/.openclaw/profiles"
373
295
  mkdir -p "$PROFILES_DIR"
374
-
375
- # 配置文件软链接
376
296
  ln -sf "$INSTANCE_DIR/config/openclaw.json" "$PROFILES_DIR/$INSTANCE_NAME.json"
377
-
378
- # 状态目录软链接(profile 默认状态目录为 ~/.openclaw/profiles/<profile>/)
379
- # 使用 -sfn 以确保目录链接正确
380
297
  ln -sfn "$INSTANCE_DIR/state" "$PROFILES_DIR/$INSTANCE_NAME"
381
-
382
298
  echo -e "${GREEN}✅ 现在可以使用 'openclaw --profile $INSTANCE_NAME ...' 管理此实例${NC}"
383
299
 
384
- # --- 11. 生成增强型启动脚本 ---
300
+ # --- 11. 生成启动脚本 ---
385
301
  cat > "${INSTANCE_DIR}/start.sh" << 'EOF'
386
302
  #!/usr/bin/env bash
387
- # =================================================================
388
- # OpenClaw 实例启动脚本
389
- # 功能:从 dist 目录启动实例,支持网关、TUI 等多种模式
390
- # 源码位置:~/openclaws/实例名/dist
391
- # =================================================================
392
-
393
- # 获取脚本所在目录(实例根目录)
394
303
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
395
304
  INSTANCE_NAME=$(basename "$SCRIPT_DIR")
305
+ DIST_DIR="$SCRIPT_DIR"
396
306
 
397
- # 检查实例根目录中是否有关键文件
398
- if [ ! -f "$SCRIPT_DIR/package.json" ]; then
399
- echo -e "\033[0;31m❌ 错误: 实例目录中未找到 package.json\033[0m"
400
- echo -e "\033[1;33m请重新运行 create-instance.sh 脚本\033[0m"
307
+ if [ ! -f "$DIST_DIR/package.json" ]; then
308
+ echo -e "\033[0;31m❌ 错误: 未找到 package.json\033[0m"
401
309
  exit 1
402
310
  fi
403
-
404
- # 检查实例根目录中是否包含 node_modules(依赖已安装)
405
311
  if [ ! -d "$SCRIPT_DIR/node_modules" ]; then
406
- echo -e "\033[0;31m❌ 错误: 实例目录中未找到 node_modules\033[0m"
407
- echo -e "\033[1;33m请重新运行 create-instance.sh 脚本安装依赖\033[0m"
312
+ echo -e "\033[0;31m❌ 错误: 未找到 node_modules\033[0m"
408
313
  exit 1
409
314
  fi
410
315
 
411
- # 导出核心配置路径
412
316
  export OPENCLAW_CONFIG_PATH="$SCRIPT_DIR/config/openclaw.json"
413
317
  export OPENCLAW_TMP_DIR="$SCRIPT_DIR/tmp"
414
318
  export OPENCLAW_STATE_DIR="$SCRIPT_DIR/state"
415
-
416
- # 设置 NODE_PATH 以使用实例根目录下的 node_modules
417
319
  export NODE_PATH="$SCRIPT_DIR/node_modules:$NODE_PATH"
418
320
 
419
- # 从配置中提取 workspace 路径并导出
420
321
  if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
421
322
  export OPENCLAW_WORKSPACE=$(node -e "
422
323
  const cfg = require('$OPENCLAW_CONFIG_PATH');
@@ -424,65 +325,37 @@ if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
424
325
  ")
425
326
  fi
426
327
 
427
- # macOS launchd 守护配置(可选)
428
- if [[ "$OSTYPE" == "darwin"* ]]; then
429
- PLIST_LABEL="ai.openclaw.$INSTANCE_NAME"
430
- PLIST_PATH="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
431
- if [ ! -f "$PLIST_PATH" ]; then
432
- cat > "$PLIST_PATH" <<EOP
433
- <?xml version="1.0" encoding="UTF-8"?>
434
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
435
- <plist version="1.0">
436
- <dict>
437
- <key>Label</key><string>$PLIST_LABEL</string>
438
- <key>ProgramArguments</key><array><string>/bin/bash</string><string>$SCRIPT_DIR/start.sh</string></array>
439
- <key>RunAtLoad</key><true/><key>KeepAlive</key><true/>
440
- <key>WorkingDirectory</key><string>$SCRIPT_DIR</string>
441
- </dict>
442
- </plist>
443
- EOP
444
- launchctl load "$PLIST_PATH" 2>/dev/null || true
445
- fi
446
- fi
447
-
448
- # 验证可执行文件是否存在
449
- if [ ! -f "$SCRIPT_DIR/dist/index.js" ]; then
450
- echo -e "\033[0;31m❌ 错误: 未找到可执行文件 $SCRIPT_DIR/dist/index.js\033[0m"
328
+ if [ ! -f "$DIST_DIR/dist/index.js" ]; then
329
+ echo -e "\033[0;31m❌ 错误: 未找到可执行文件 $DIST_DIR/dist/index.js\033[0m"
451
330
  exit 1
452
331
  fi
453
332
 
454
- # 根据命令行参数执行对应操作
455
333
  if [ $# -eq 0 ]; then
456
- # 无参数:启动网关
457
334
  if [ -f "$OPENCLAW_CONFIG_PATH" ]; then
458
335
  GATEWAY_PORT=$(node -e "console.log(require('$OPENCLAW_CONFIG_PATH').gateway?.port || 18789)")
459
336
  echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME 网关 (端口: $GATEWAY_PORT)...\033[0m"
460
- exec node "$SCRIPT_DIR/dist/index.js" gateway run --port "$GATEWAY_PORT"
337
+ exec node "$DIST_DIR/dist/index.js" gateway run --port "$GATEWAY_PORT"
461
338
  else
462
- echo -e "\033[0;31m❌ 错误: 未找到配置文件 $OPENCLAW_CONFIG_PATH\033[0m"
339
+ echo -e "\033[0;31m❌ 错误: 未找到配置文件\033[0m"
463
340
  exit 1
464
341
  fi
465
342
  else
466
343
  if [ "$1" = "tui" ]; then
467
- # TUI 必须在 workspace 目录下运行,以正确加载模板文件
468
- echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME TUI (workspace mode)...\033[0m"
344
+ echo -e "\033[0;32m🚀 启动 OpenClaw-$INSTANCE_NAME TUI...\033[0m"
469
345
  cd "$OPENCLAW_WORKSPACE"
470
- exec node "$SCRIPT_DIR/dist/index.js" tui
346
+ exec node "$DIST_DIR/dist/index.js" tui
471
347
  else
472
- # 其他命令直接在实例目录执行
473
- echo -e "\033[0;32m🚀 执行 OpenClaw-$INSTANCE_NAME 命令: $@\033[0m"
474
- exec node "$SCRIPT_DIR/dist/index.js" "$@"
348
+ echo -e "\033[0;32m🚀 执行命令: $@\033[0m"
349
+ exec node "$DIST_DIR/dist/index.js" "$@"
475
350
  fi
476
351
  fi
477
352
  EOF
478
-
479
353
  chmod +x "${INSTANCE_DIR}/start.sh"
480
354
 
481
355
  # --- 12. 执行拉起 ---
482
356
  echo -e "${BLUE}⚡ 正在后台启动服务...${NC}"
483
357
  nohup "${INSTANCE_DIR}/start.sh" > "${INSTANCE_DIR}/workspace/server.log" 2>&1 &
484
358
  PID=$!
485
-
486
359
  sleep 5
487
360
 
488
361
  check_port() {
@@ -505,12 +378,11 @@ if kill -0 $PID 2>/dev/null; then
505
378
  echo -e "📄 实时日志: tail -f ${INSTANCE_DIR}/workspace/server.log"
506
379
  echo -e "${GREEN}================================================${NC}"
507
380
 
508
- # --- 交互式菜单 ---
509
381
  if [ -t 0 ]; then
510
382
  echo
511
383
  echo -e "${BLUE}请选择下一步操作:${NC}"
512
- echo "1) 启动 TUI (终端交互界面)"
513
- echo "2) 打开 Web UI (浏览器)"
384
+ echo "1) 启动 TUI"
385
+ echo "2) 打开 Web UI"
514
386
  echo "3) 退出"
515
387
  read -p "请输入数字 [1-3]: " choice
516
388
  case $choice in
@@ -533,17 +405,12 @@ if kill -0 $PID 2>/dev/null; then
533
405
  echo -e "${RED}未找到 token,请手动查看配置文件。${NC}"
534
406
  fi
535
407
  ;;
536
- 3)
537
- echo "退出"
538
- exit 0
539
- ;;
540
- *)
541
- echo "无效选择"
542
- ;;
408
+ 3) echo "退出"; exit 0 ;;
409
+ *) echo "无效选择" ;;
543
410
  esac
544
411
  fi
545
412
  else
546
- echo -e "${YELLOW}⚠️ 进程存在但端口 ${PORT} 未监听(可能启动较慢或检查工具问题),请查看日志: ${INSTANCE_DIR}/workspace/server.log${NC}"
413
+ echo -e "${YELLOW}⚠️ 进程存在但端口 ${PORT} 未监听,请查看日志: ${INSTANCE_DIR}/workspace/server.log${NC}"
547
414
  fi
548
415
  else
549
416
  echo -e "${RED}❌ 启动失败,请查看日志: tail -n 20 ${INSTANCE_DIR}/workspace/server.log${NC}"
@@ -1,11 +0,0 @@
1
- import "./query-expansion-DnS6CGY2.js";
2
- import "./paths-BwJ6yG6k.js";
3
- import "./subsystem-CDcEQtQK.js";
4
- import "./workspace-Cg3kGb1y.js";
5
- import "./logger-C0l_Gj8Y.js";
6
- import { Si as ensureAuthProfileStore } from "./model-selection-G7SiAgN6.js";
7
- import "./github-copilot-token-368sRGBD.js";
8
- import "./boolean-C7Ct_klp.js";
9
- import "./fetch-sH_NN8SV.js";
10
- import "./frontmatter-DhmdUnBP.js";
11
- export { ensureAuthProfileStore };
@@ -1,11 +0,0 @@
1
- import "./query-expansion-DnS6CGY2.js";
2
- import "./paths-BwJ6yG6k.js";
3
- import "./subsystem-CDcEQtQK.js";
4
- import "./workspace-Cg3kGb1y.js";
5
- import "./logger-C0l_Gj8Y.js";
6
- import { Z as compactEmbeddedPiSessionDirect } from "./model-selection-G7SiAgN6.js";
7
- import "./github-copilot-token-368sRGBD.js";
8
- import "./boolean-C7Ct_klp.js";
9
- import "./fetch-sH_NN8SV.js";
10
- import "./frontmatter-DhmdUnBP.js";
11
- export { compactEmbeddedPiSessionDirect };
@@ -1,11 +0,0 @@
1
- import "./query-expansion-DnS6CGY2.js";
2
- import "./paths-BwJ6yG6k.js";
3
- import "./subsystem-CDcEQtQK.js";
4
- import "./workspace-Cg3kGb1y.js";
5
- import "./logger-C0l_Gj8Y.js";
6
- import { Pt as deliverOutboundPayloads } from "./model-selection-G7SiAgN6.js";
7
- import "./github-copilot-token-368sRGBD.js";
8
- import "./boolean-C7Ct_klp.js";
9
- import "./fetch-sH_NN8SV.js";
10
- import "./frontmatter-DhmdUnBP.js";
11
- export { deliverOutboundPayloads };