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.
- package/dist/{agent-Bf9VxLj8.js → agent-BomWJjOy.js} +10 -10
- package/dist/{audio-preflight-DKt9ICbJ.js → audio-preflight-CZHCr2-5.js} +9 -9
- package/dist/{audio-preflight-BK4MI6Gs.js → audio-preflight-GAYJDgGF.js} +1 -1
- package/dist/{audit-membership-runtime-0b4ZhE41.js → audit-membership-runtime-fBOVjLNx.js} +4 -4
- package/dist/auth-profiles.runtime-DNqCx0L5.js +11 -0
- package/dist/{auth-profiles.runtime-DEhTAVAo.js → auth-profiles.runtime-IXde-3_L.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +10 -10
- package/dist/bundled/bootstrap-extra-files/handler.js +5 -5
- package/dist/bundled/command-logger/handler.js +2 -2
- package/dist/bundled/session-memory/handler.js +9 -9
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{compact.runtime-CH24Vvny.js → compact.runtime-BCHQpekB.js} +1 -1
- package/dist/compact.runtime-pgjSlzSY.js +11 -0
- package/dist/{deliver-runtime-6WeFOxSI.js → deliver-runtime-Bm3VqH55.js} +1 -1
- package/dist/deliver-runtime-D4aWAXZ9.js +11 -0
- package/dist/extensionAPI.js +1 -1
- package/dist/{fetch-sH_NN8SV.js → fetch-BdTTF2z-.js} +2 -2
- package/dist/{frontmatter-DhmdUnBP.js → frontmatter-DZlWsaUx.js} +3 -3
- package/dist/{github-copilot-token-368sRGBD.js → github-copilot-token-BeFx3MLn.js} +7 -7
- package/dist/image-runtime-Brryt_BU.js +11 -0
- package/dist/{image-runtime-BwzYRCA5.js → image-runtime-CReMeTZL.js} +1 -1
- package/dist/llm-slug-generator.js +9 -9
- package/dist/{logger-C0l_Gj8Y.js → logger-DCBlX1uz.js} +7 -7
- package/dist/{login-aLc84rc7.js → login-CKmmxErc.js} +4 -4
- package/dist/{login-qr-FW_sLvPl.js → login-qr-D2jYdV8v.js} +2 -2
- package/dist/{login-qr-D3QtIyy8.js → login-qr-KVA4wuh0.js} +10 -10
- package/dist/{login-BEOnxdap.js → login-xsvrgJJt.js} +2 -2
- package/dist/{manager-runtime-DV0_pZDZ.js → manager-runtime-BBxiBzvv.js} +1 -1
- package/dist/manager-runtime-D9AEoM1M.js +11 -0
- package/dist/{manager.runtime-ilRhqZW0.js → manager.runtime-BV-CBNb2.js} +10 -10
- package/dist/{manager.runtime-CynsHdcO.js → manager.runtime-CF3GyuMb.js} +7 -7
- package/dist/{model-selection-qaBek98Q.js → model-selection-BQm6_iuT.js} +43 -43
- package/dist/{model-selection-G7SiAgN6.js → model-selection-CNRMBWfR.js} +287 -287
- package/dist/{paths-BwJ6yG6k.js → paths-CNIc83Pn.js} +5 -5
- package/dist/pi-model-discovery-runtime-CDKkuBYh.js +11 -0
- package/dist/{pi-model-discovery-runtime-Q0BoklY3.js → pi-model-discovery-runtime-DeRljgTs.js} +1 -1
- package/dist/{pi-tools.before-tool-call.runtime-Be9V6RlN.js → pi-tools.before-tool-call.runtime-DgAiY2la.js} +9 -9
- package/dist/{pi-tools.before-tool-call.runtime-B_uML_Gt.js → pi-tools.before-tool-call.runtime-PhxG0y1R.js} +1 -1
- package/dist/{pw-ai-BLzIHVAG.js → pw-ai-3ual6adI.js} +9 -9
- package/dist/{pw-ai-DzdseGw2.js → pw-ai-CzFFsGR7.js} +1 -1
- package/dist/{qmd-manager-CFVuAj9l.js → qmd-manager-DvglNhlJ.js} +5 -5
- package/dist/{query-expansion-DnS6CGY2.js → query-expansion-DXwSmE_K.js} +8 -8
- package/dist/runtime-whatsapp-login.runtime-Br3SxDXL.js +13 -0
- package/dist/{runtime-whatsapp-login.runtime-Dsz-DNfa.js → runtime-whatsapp-login.runtime-vKFKNi8Z.js} +3 -3
- package/dist/runtime-whatsapp-outbound.runtime-L3Qkst0n.js +12 -0
- package/dist/{runtime-whatsapp-outbound.runtime-BeZMBTt6.js → runtime-whatsapp-outbound.runtime-SAT-C6UE.js} +2 -2
- package/dist/{send-p1D-Lzec.js → send-CXnKWzde.js} +3 -3
- package/dist/{send-DxYxezcL.js → send-DGQUY-kp.js} +1 -1
- package/dist/{session--tqRfZQU.js → session-CbQ43pUq.js} +1 -1
- package/dist/{session-DIkw9afg.js → session-kt-bqE_z.js} +7 -7
- package/dist/slash-commands.runtime-BYfxn_xu.js +11 -0
- package/dist/{slash-commands.runtime-C8j-n-bX.js → slash-commands.runtime-DoT9bJKb.js} +1 -1
- package/dist/{slash-dispatch.runtime-BA-MMy0P.js → slash-dispatch.runtime--9HmQuIE.js} +1 -1
- package/dist/{slash-dispatch.runtime-CgJLQTwP.js → slash-dispatch.runtime-Cu8ghe1h.js} +9 -9
- package/dist/slash-skill-commands.runtime-8dS5PTaH.js +11 -0
- package/dist/{slash-skill-commands.runtime-Cm8K1kWM.js → slash-skill-commands.runtime-BZqnnkHJ.js} +1 -1
- package/dist/{subagent-registry-runtime-DKOXxZgH.js → subagent-registry-runtime-9WfVik2h.js} +1 -1
- package/dist/{subagent-registry-runtime-DQeHzv-u.js → subagent-registry-runtime-Z0fdsGSq.js} +9 -9
- package/dist/{subsystem-CDcEQtQK.js → subsystem-Cr1MiLhx.js} +14 -14
- package/dist/{web-RzQ9jrtt.js → web-B_EVHbEP.js} +4 -4
- package/dist/{web-gHwQkPhu.js → web-CXyjF_si.js} +12 -12
- package/dist/{whatsapp-actions-C1UZXBOC.js → whatsapp-actions-BUvGEDSk.js} +10 -10
- package/dist/{whatsapp-actions-BmDvJijd.js → whatsapp-actions-pQqLTCXJ.js} +2 -2
- package/dist/{workspace-Cg3kGb1y.js → workspace-Bi8vpJN0.js} +20 -20
- package/package.json +1 -1
- package/scripts/create-instance.sh +43 -176
- package/dist/auth-profiles.runtime-pDQ4QesA.js +0 -11
- package/dist/compact.runtime-Y7wbaDO2.js +0 -11
- package/dist/deliver-runtime-DBYdmfDR.js +0 -11
- package/dist/image-runtime-XMz7IM-j.js +0 -11
- package/dist/manager-runtime-D8C3_L2_.js +0 -11
- package/dist/pi-model-discovery-runtime-DgHKNg0i.js +0 -11
- package/dist/runtime-whatsapp-login.runtime-CXhM_C-C.js +0 -13
- package/dist/runtime-whatsapp-outbound.runtime-Kx-CVYdW.js +0 -12
- package/dist/slash-commands.runtime-D6R-T9zj.js +0 -11
- 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-
|
|
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-
|
|
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-
|
|
2
|
-
import { l as danger, m as shouldLogVerbose } from "./subsystem-
|
|
3
|
-
import { g as pathExists$1, n as logError, t as logDebug, y as resolveUserPath } from "./logger-
|
|
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
|
|
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) =>
|
|
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) && !
|
|
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 (!
|
|
730
|
+
if (!syncFs.existsSync(cursor)) return normalized;
|
|
731
731
|
try {
|
|
732
|
-
const resolvedAncestor = path.resolve(
|
|
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 ?
|
|
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(
|
|
817
|
+
return path.resolve(syncFs.realpathSync(symlinkPath));
|
|
818
818
|
} catch (error) {
|
|
819
819
|
if (!isNotFoundPathError(error)) throw error;
|
|
820
|
-
const linkTarget =
|
|
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 ??
|
|
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 ??
|
|
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 ??
|
|
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 (!
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
1509
|
+
syncFs.closeSync(opened.fd);
|
|
1510
1510
|
}
|
|
1511
1511
|
}
|
|
1512
1512
|
function stripFrontMatter(content) {
|
package/package.json
CHANGED
|
@@ -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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
211
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
371
|
-
echo -e "${BLUE}🔗 配置 profile
|
|
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
|
-
|
|
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❌ 错误:
|
|
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
|
-
|
|
428
|
-
|
|
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 "$
|
|
337
|
+
exec node "$DIST_DIR/dist/index.js" gateway run --port "$GATEWAY_PORT"
|
|
461
338
|
else
|
|
462
|
-
echo -e "\033[0;31m❌ 错误:
|
|
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
|
-
|
|
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 "$
|
|
346
|
+
exec node "$DIST_DIR/dist/index.js" tui
|
|
471
347
|
else
|
|
472
|
-
|
|
473
|
-
|
|
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
|
-
|
|
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}
|
|
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 };
|