shipmyagent 1.0.74 → 1.0.75
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/bin/cli.js +34 -5
- package/bin/cli.js.map +1 -1
- package/bin/commands/restart.d.ts.map +1 -0
- package/bin/commands/restart.js +41 -0
- package/bin/commands/restart.js.map +1 -0
- package/bin/commands/run.d.ts.map +1 -0
- package/bin/commands/run.js +290 -0
- package/bin/commands/run.js.map +1 -0
- package/bin/commands/start.d.ts.map +1 -1
- package/bin/commands/start.js +28 -252
- package/bin/commands/start.js.map +1 -1
- package/bin/commands/stop.d.ts.map +1 -0
- package/bin/commands/stop.js +26 -0
- package/bin/commands/stop.js.map +1 -0
- package/bin/daemon/cli-args.d.ts.map +1 -0
- package/bin/daemon/cli-args.js +19 -0
- package/bin/daemon/cli-args.js.map +1 -0
- package/bin/daemon/manager.d.ts.map +1 -0
- package/bin/daemon/manager.js +124 -0
- package/bin/daemon/manager.js.map +1 -0
- package/bin/types/daemon.d.ts.map +1 -0
- package/bin/types/daemon.js +16 -0
- package/bin/types/daemon.js.map +1 -0
- package/bin/types/start.d.ts.map +1 -0
- package/bin/types/start.js +8 -0
- package/bin/types/start.js.map +1 -0
- package/package.json +1 -1
package/bin/cli.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { initCommand } from "./commands/init.js";
|
|
4
|
+
import { runCommand } from "./commands/run.js";
|
|
4
5
|
import { startCommand } from "./commands/start.js";
|
|
6
|
+
import { stopCommand } from "./commands/stop.js";
|
|
7
|
+
import { restartCommand } from "./commands/restart.js";
|
|
5
8
|
import { aliasCommand } from "./commands/alias.js";
|
|
6
9
|
import { readFileSync } from "fs";
|
|
7
10
|
import { join, dirname, basename } from "path";
|
|
@@ -41,16 +44,42 @@ const init = program
|
|
|
41
44
|
.description("初始化 ShipMyAgent 项目")
|
|
42
45
|
.helpOption("--help", "display help for command")
|
|
43
46
|
.action(initCommand);
|
|
44
|
-
//
|
|
47
|
+
// Run command (foreground)
|
|
48
|
+
const run = program
|
|
49
|
+
.command("run [path]")
|
|
50
|
+
.description("前台启动 Agent Runtime(当前终端运行)")
|
|
51
|
+
.option("-p, --port <port>", "服务端口(可在 ship.json 的 start.port 配置)", parsePort)
|
|
52
|
+
.option("-h, --host <host>", "服务主机(可在 ship.json 的 start.host 配置)")
|
|
53
|
+
.option("--interactive-web [enabled]", "启动交互式 Web 界面(可在 ship.json 的 start.interactiveWeb 配置)", parseBoolean)
|
|
54
|
+
.option("--interactive-port <port>", "交互式 Web 界面端口(可在 ship.json 的 start.interactivePort 配置)", parsePort)
|
|
55
|
+
.helpOption("--help", "display help for command")
|
|
56
|
+
.action(runCommand);
|
|
57
|
+
// Start command (daemon)
|
|
45
58
|
const start = program
|
|
46
59
|
.command("start [path]")
|
|
47
|
-
.description("
|
|
60
|
+
.description("后台启动 Agent Runtime(终端退出也保持运行)")
|
|
48
61
|
.option("-p, --port <port>", "服务端口(可在 ship.json 的 start.port 配置)", parsePort)
|
|
49
62
|
.option("-h, --host <host>", "服务主机(可在 ship.json 的 start.host 配置)")
|
|
50
63
|
.option("--interactive-web [enabled]", "启动交互式 Web 界面(可在 ship.json 的 start.interactiveWeb 配置)", parseBoolean)
|
|
51
64
|
.option("--interactive-port <port>", "交互式 Web 界面端口(可在 ship.json 的 start.interactivePort 配置)", parsePort)
|
|
52
65
|
.helpOption("--help", "display help for command")
|
|
53
66
|
.action(startCommand);
|
|
67
|
+
// Stop command (daemon)
|
|
68
|
+
const stop = program
|
|
69
|
+
.command("stop [path]")
|
|
70
|
+
.description("停止后台 Agent 服务器(daemon)")
|
|
71
|
+
.helpOption("--help", "display help for command")
|
|
72
|
+
.action(stopCommand);
|
|
73
|
+
// Restart command (daemon)
|
|
74
|
+
const restart = program
|
|
75
|
+
.command("restart [path]")
|
|
76
|
+
.description("重启后台 Agent 服务器(daemon)")
|
|
77
|
+
.option("-p, --port <port>", "服务端口(可在 ship.json 的 start.port 配置)", parsePort)
|
|
78
|
+
.option("-h, --host <host>", "服务主机(可在 ship.json 的 start.host 配置)")
|
|
79
|
+
.option("--interactive-web [enabled]", "启动交互式 Web 界面(可在 ship.json 的 start.interactiveWeb 配置)", parseBoolean)
|
|
80
|
+
.option("--interactive-port <port>", "交互式 Web 界面端口(可在 ship.json 的 start.interactivePort 配置)", parsePort)
|
|
81
|
+
.helpOption("--help", "display help for command")
|
|
82
|
+
.action(restartCommand);
|
|
54
83
|
const alias = program
|
|
55
84
|
.command("alias")
|
|
56
85
|
.description("在 .zshrc / .bashrc 中写入 `alias sma=\"shipmyagent\"`")
|
|
@@ -59,12 +88,12 @@ const alias = program
|
|
|
59
88
|
.option("--print", "仅打印 alias 内容(用于 eval)", false)
|
|
60
89
|
.helpOption("--help", "display help for command")
|
|
61
90
|
.action(aliasCommand);
|
|
62
|
-
// Default: `shipmyagent` / `shipmyagent .` / `shipmyagent [
|
|
91
|
+
// Default: `shipmyagent` / `shipmyagent .` / `shipmyagent [run-options]` => `shipmyagent run [path]`
|
|
63
92
|
const firstArg = process.argv[2];
|
|
64
93
|
if (!firstArg ||
|
|
65
|
-
(![init.name(), start.name(), alias.name(), "help"].includes(firstArg) &&
|
|
94
|
+
(![init.name(), run.name(), start.name(), stop.name(), restart.name(), alias.name(), "help"].includes(firstArg) &&
|
|
66
95
|
!["--help", "-v", "--version"].includes(firstArg))) {
|
|
67
|
-
process.argv.splice(2, 0, "
|
|
96
|
+
process.argv.splice(2, 0, "run");
|
|
68
97
|
}
|
|
69
98
|
program.parse();
|
|
70
99
|
//# sourceMappingURL=cli.js.map
|
package/bin/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,uBAAuB;AACvB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,UAAU;AACV,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;AAEF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;QACpG,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAW,EAAE;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/D,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC;KAChD,WAAW,CACV,iCAAiC,CAClC;KACA,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAEjD,iDAAiD;AACjD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;AAEzD,eAAe;AACf,MAAM,IAAI,GAAG,OAAO;KACjB,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,oBAAoB,CAAC;KACjC,UAAU,CAAC,QAAQ,EAAE,0BAA0B,CAAC;KAChD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,YAAM,EACjB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shipmyagent restart`:重启后台常驻的 Agent Runtime(daemon)。
|
|
3
|
+
*/
|
|
4
|
+
import path from "path";
|
|
5
|
+
import fs from "fs-extra";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { getAgentMdPath, getShipJsonPath } from "../utils.js";
|
|
8
|
+
import { buildRunArgsFromOptions } from "../daemon/cli-args.js";
|
|
9
|
+
import { startDaemonProcess, stopDaemonProcess } from "../daemon/manager.js";
|
|
10
|
+
export async function restartCommand(cwd = ".", options) {
|
|
11
|
+
const projectRoot = path.resolve(cwd);
|
|
12
|
+
if (!fs.existsSync(getAgentMdPath(projectRoot))) {
|
|
13
|
+
console.error('❌ Project not initialized. Please run "shipmyagent init" first');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (!fs.existsSync(getShipJsonPath(projectRoot))) {
|
|
17
|
+
console.error('❌ ship.json does not exist. Please run "shipmyagent init" first');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// 计算当前 CLI 的入口路径(编译后是 `bin/cli.js`)。
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = path.dirname(__filename);
|
|
23
|
+
const cliPath = path.resolve(__dirname, "../cli.js");
|
|
24
|
+
try {
|
|
25
|
+
await stopDaemonProcess({ projectRoot });
|
|
26
|
+
const args = buildRunArgsFromOptions(projectRoot, options || {});
|
|
27
|
+
const { pid, logPath } = await startDaemonProcess({
|
|
28
|
+
projectRoot,
|
|
29
|
+
cliPath,
|
|
30
|
+
args,
|
|
31
|
+
});
|
|
32
|
+
console.log("✅ ShipMyAgent daemon restarted");
|
|
33
|
+
console.log(` pid: ${pid}`);
|
|
34
|
+
console.log(` log: ${logPath}`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error("❌ Failed to restart daemon:", error);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG7E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,GAAG,EACjB,OAAqB;IAErB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;YAChD,WAAW;YACX,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqCH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,YAAM,EACjB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CA6Sf"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shipmyagent run`:前台启动 Agent Runtime(当前终端进程内运行)。
|
|
3
|
+
*
|
|
4
|
+
* 场景
|
|
5
|
+
* - `sma .` / `shipmyagent .` 默认走这里(符合“当前终端启动”的直觉)
|
|
6
|
+
*
|
|
7
|
+
* 说明
|
|
8
|
+
* - 后台常驻启动请使用 `shipmyagent start`(daemon 模式),并用 `shipmyagent stop|restart` 管理。
|
|
9
|
+
*/
|
|
10
|
+
import path from "path";
|
|
11
|
+
import fs from "fs-extra";
|
|
12
|
+
import { getLogger } from "../telemetry/index.js";
|
|
13
|
+
import { createServer } from "../server/index.js";
|
|
14
|
+
import { createInteractiveServer } from "../server/interactive.js";
|
|
15
|
+
import { createTelegramBot } from "../adapters/telegram.js";
|
|
16
|
+
import { createFeishuBot } from "../adapters/feishu.js";
|
|
17
|
+
import { createQQBot } from "../adapters/qq.js";
|
|
18
|
+
import { bootstrapMcpFromProject } from "../agent/mcp/index.js";
|
|
19
|
+
import { ChatManager } from "../chat/manager.js";
|
|
20
|
+
import { getShipRuntimeContext, setShipRuntimeContext } from "../server/ShipRuntimeContext.js";
|
|
21
|
+
import { getAgentMdPath, getCacheDirPath, getLogsDirPath, getShipChatRootDirPath, getShipConfigDirPath, getShipDataDirPath, getShipDebugDirPath, getShipDirPath, getShipProfileDirPath, getShipPublicDirPath, getShipJsonPath, getShipTasksDirPath, loadProjectDotenv, loadShipConfig, } from "../utils.js";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
23
|
+
import { DEFAULT_SHIP_PROMPTS } from "../agent/context/prompt.js";
|
|
24
|
+
import { discoverClaudeSkillsSync, renderClaudeSkillsPromptSection, } from "../agent/skills/index.js";
|
|
25
|
+
import { Agent } from "../agent/context/agent.js";
|
|
26
|
+
/**
|
|
27
|
+
* `shipmyagent run` command entrypoint.
|
|
28
|
+
*
|
|
29
|
+
* Responsibilities:
|
|
30
|
+
* - Load `ship.json` and validate startup options
|
|
31
|
+
* - Bootstrap the unified logger + MCP manager
|
|
32
|
+
* - Create AgentRuntime (via factory)
|
|
33
|
+
* - Start the HTTP server and optional interactive web server / chat adapters
|
|
34
|
+
*/
|
|
35
|
+
export async function runCommand(cwd = ".", options) {
|
|
36
|
+
const projectRoot = path.resolve(cwd);
|
|
37
|
+
const isPlaceholder = (value) => value === "${}";
|
|
38
|
+
const parsePort = (value, label) => {
|
|
39
|
+
if (value === undefined || value === null || value === "")
|
|
40
|
+
return undefined;
|
|
41
|
+
const num = typeof value === "number" ? value : Number.parseInt(String(value), 10);
|
|
42
|
+
if (!Number.isFinite(num) || Number.isNaN(num)) {
|
|
43
|
+
throw new Error(`${label} must be a number`);
|
|
44
|
+
}
|
|
45
|
+
if (!Number.isInteger(num) || num <= 0 || num > 65535) {
|
|
46
|
+
throw new Error(`${label} must be an integer between 1 and 65535`);
|
|
47
|
+
}
|
|
48
|
+
return num;
|
|
49
|
+
};
|
|
50
|
+
const parseBoolean = (value) => {
|
|
51
|
+
if (value === undefined || value === null || value === "")
|
|
52
|
+
return undefined;
|
|
53
|
+
if (typeof value === "boolean")
|
|
54
|
+
return value;
|
|
55
|
+
const s = String(value).trim().toLowerCase();
|
|
56
|
+
if (["true", "1", "yes", "y", "on"].includes(s))
|
|
57
|
+
return true;
|
|
58
|
+
if (["false", "0", "no", "n", "off"].includes(s))
|
|
59
|
+
return false;
|
|
60
|
+
return undefined;
|
|
61
|
+
};
|
|
62
|
+
let version = "unknown";
|
|
63
|
+
try {
|
|
64
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
65
|
+
const __dirname = path.dirname(__filename);
|
|
66
|
+
const pkg = await fs.readJson(path.join(__dirname, "../../package.json"));
|
|
67
|
+
if (pkg && typeof pkg.version === "string")
|
|
68
|
+
version = pkg.version;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// ignore
|
|
72
|
+
}
|
|
73
|
+
console.log(`🚀 Starting ShipMyAgent v${version}: ${projectRoot}`);
|
|
74
|
+
// Check if initialized(启动入口一次性确认工程根目录与关键文件)
|
|
75
|
+
if (!fs.existsSync(getAgentMdPath(projectRoot))) {
|
|
76
|
+
console.error('❌ Project not initialized. Please run "shipmyagent init" first');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
if (!fs.existsSync(getShipJsonPath(projectRoot))) {
|
|
80
|
+
console.error('❌ ship.json does not exist. Please run "shipmyagent init" first');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
// Read configuration
|
|
84
|
+
let shipConfig;
|
|
85
|
+
try {
|
|
86
|
+
shipConfig = loadShipConfig(projectRoot);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error("❌ Failed to read ship.json:", error);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
// 在启动时加载 dotenv,并确保 .ship 目录结构存在(避免在 createAgent 中重复确保)。
|
|
93
|
+
loadProjectDotenv(projectRoot);
|
|
94
|
+
fs.ensureDirSync(getShipDirPath(projectRoot));
|
|
95
|
+
fs.ensureDirSync(getShipTasksDirPath(projectRoot));
|
|
96
|
+
fs.ensureDirSync(getLogsDirPath(projectRoot));
|
|
97
|
+
fs.ensureDirSync(getCacheDirPath(projectRoot));
|
|
98
|
+
fs.ensureDirSync(getShipProfileDirPath(projectRoot));
|
|
99
|
+
fs.ensureDirSync(getShipDataDirPath(projectRoot));
|
|
100
|
+
fs.ensureDirSync(getShipChatRootDirPath(projectRoot));
|
|
101
|
+
fs.ensureDirSync(getShipPublicDirPath(projectRoot));
|
|
102
|
+
fs.ensureDirSync(getShipConfigDirPath(projectRoot));
|
|
103
|
+
fs.ensureDirSync(path.join(getShipDirPath(projectRoot), "schema"));
|
|
104
|
+
fs.ensureDirSync(getShipDebugDirPath(projectRoot));
|
|
105
|
+
// Agent.md(用户可编辑的 system prompt)在启动时读取并缓存。
|
|
106
|
+
let agentProfiles = `# Agent Role
|
|
107
|
+
You are a helpful project assistant.`;
|
|
108
|
+
try {
|
|
109
|
+
const content = fs.readFileSync(getAgentMdPath(projectRoot), "utf-8").trim();
|
|
110
|
+
if (content)
|
|
111
|
+
agentProfiles = content;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// ignore
|
|
115
|
+
}
|
|
116
|
+
// Skills section 在启动时渲染并缓存(需要修改 skills/ship.json 生效时请重启)。
|
|
117
|
+
const skills = discoverClaudeSkillsSync(projectRoot, shipConfig);
|
|
118
|
+
const skillsSection = renderClaudeSkillsPromptSection(projectRoot, shipConfig, skills);
|
|
119
|
+
const agentSystems = [agentProfiles, DEFAULT_SHIP_PROMPTS, skillsSection];
|
|
120
|
+
// Resolve startup options: CLI flags override ship.json, then built-in defaults.
|
|
121
|
+
let port;
|
|
122
|
+
let interactivePort;
|
|
123
|
+
try {
|
|
124
|
+
port = parsePort(options.port, "port") ?? shipConfig.start?.port ?? 3000;
|
|
125
|
+
interactivePort =
|
|
126
|
+
parsePort(options.interactivePort, "interactivePort") ??
|
|
127
|
+
shipConfig.start?.interactivePort;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error("❌ Invalid start options:", error);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
const host = (options.host ?? shipConfig.start?.host ?? "0.0.0.0").trim();
|
|
134
|
+
const interactiveWeb = parseBoolean(options.interactiveWeb) ??
|
|
135
|
+
shipConfig.start?.interactiveWeb ??
|
|
136
|
+
false;
|
|
137
|
+
// Create logger
|
|
138
|
+
const logger = getLogger(projectRoot, "info");
|
|
139
|
+
logger.info("=== ShipMyAgent Starting ===");
|
|
140
|
+
logger.info(`Project: ${projectRoot}`);
|
|
141
|
+
logger.info(`Model: ${shipConfig.llm?.provider} / ${shipConfig.llm?.model}`);
|
|
142
|
+
// 初始化进程级 runtime 上下文(避免 projectRoot/logger/createAgent 层层透传)
|
|
143
|
+
setShipRuntimeContext({
|
|
144
|
+
projectRoot,
|
|
145
|
+
logger,
|
|
146
|
+
chatManager: new ChatManager(projectRoot),
|
|
147
|
+
config: shipConfig,
|
|
148
|
+
agentSystems,
|
|
149
|
+
// 一个 chat 一个 Agent 实例:这里必须返回新对象
|
|
150
|
+
createAgent: () => new Agent({
|
|
151
|
+
projectRoot,
|
|
152
|
+
config: shipConfig,
|
|
153
|
+
systems: agentSystems,
|
|
154
|
+
}),
|
|
155
|
+
});
|
|
156
|
+
// Initialize MCP (managed by the server/bootstrap layer, not AgentRuntime)
|
|
157
|
+
await bootstrapMcpFromProject({ projectRoot, logger });
|
|
158
|
+
logger.info("MCP manager initialized");
|
|
159
|
+
// Create Agent Runtime
|
|
160
|
+
const agentRuntime = getShipRuntimeContext().createAgent();
|
|
161
|
+
await agentRuntime.initialize();
|
|
162
|
+
logger.info("Agent Runtime initialized");
|
|
163
|
+
// Create server context
|
|
164
|
+
const serverContext = {
|
|
165
|
+
projectRoot,
|
|
166
|
+
logger,
|
|
167
|
+
agentRuntime,
|
|
168
|
+
};
|
|
169
|
+
// Create and start server
|
|
170
|
+
const server = createServer(serverContext);
|
|
171
|
+
const adapters = shipConfig.adapters || {};
|
|
172
|
+
// Create Telegram Adapter (if enabled)
|
|
173
|
+
let telegramBot = null;
|
|
174
|
+
if (adapters.telegram?.enabled) {
|
|
175
|
+
logger.info("Telegram adapter enabled");
|
|
176
|
+
telegramBot = createTelegramBot(adapters.telegram);
|
|
177
|
+
}
|
|
178
|
+
// Create Feishu Adapter (if enabled)
|
|
179
|
+
let feishuBot = null;
|
|
180
|
+
if (adapters.feishu?.enabled) {
|
|
181
|
+
logger.info("Feishu adapter enabled");
|
|
182
|
+
// Read Feishu configuration from environment variables or config
|
|
183
|
+
const feishuConfig = {
|
|
184
|
+
enabled: true,
|
|
185
|
+
appId: (adapters.feishu?.appId && !isPlaceholder(adapters.feishu.appId)
|
|
186
|
+
? adapters.feishu.appId
|
|
187
|
+
: undefined) ||
|
|
188
|
+
process.env.FEISHU_APP_ID ||
|
|
189
|
+
"",
|
|
190
|
+
appSecret: (adapters.feishu?.appSecret && !isPlaceholder(adapters.feishu.appSecret)
|
|
191
|
+
? adapters.feishu.appSecret
|
|
192
|
+
: undefined) ||
|
|
193
|
+
process.env.FEISHU_APP_SECRET ||
|
|
194
|
+
"",
|
|
195
|
+
domain: adapters.feishu?.domain || "https://open.feishu.cn",
|
|
196
|
+
adminUserIds: Array.isArray(adapters.feishu?.adminUserIds)
|
|
197
|
+
? adapters.feishu.adminUserIds
|
|
198
|
+
: undefined,
|
|
199
|
+
};
|
|
200
|
+
feishuBot = await createFeishuBot(feishuConfig);
|
|
201
|
+
}
|
|
202
|
+
// Create QQ Adapter (if enabled)
|
|
203
|
+
let qqBot = null;
|
|
204
|
+
if (adapters.qq?.enabled) {
|
|
205
|
+
logger.info("QQ adapter enabled");
|
|
206
|
+
const qqConfig = {
|
|
207
|
+
enabled: true,
|
|
208
|
+
appId: (adapters.qq?.appId && !isPlaceholder(adapters.qq.appId)
|
|
209
|
+
? adapters.qq.appId
|
|
210
|
+
: undefined) ||
|
|
211
|
+
process.env.QQ_APP_ID ||
|
|
212
|
+
"",
|
|
213
|
+
appSecret: (adapters.qq?.appSecret && !isPlaceholder(adapters.qq.appSecret)
|
|
214
|
+
? adapters.qq.appSecret
|
|
215
|
+
: undefined) ||
|
|
216
|
+
process.env.QQ_APP_SECRET ||
|
|
217
|
+
"",
|
|
218
|
+
sandbox: typeof adapters.qq?.sandbox === "boolean"
|
|
219
|
+
? adapters.qq.sandbox
|
|
220
|
+
: (process.env.QQ_SANDBOX || "").toLowerCase() === "true",
|
|
221
|
+
};
|
|
222
|
+
qqBot = await createQQBot(qqConfig);
|
|
223
|
+
}
|
|
224
|
+
// 创建交互式 Web 服务器(如果已启用)
|
|
225
|
+
let interactiveServer = null;
|
|
226
|
+
if (interactiveWeb) {
|
|
227
|
+
logger.info("交互式 Web 界面已启用");
|
|
228
|
+
interactiveServer = createInteractiveServer({
|
|
229
|
+
agentApiUrl: `http://${host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host}:${port}`,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
// 处理进程信号
|
|
233
|
+
let isShuttingDown = false;
|
|
234
|
+
const shutdown = async (signal) => {
|
|
235
|
+
if (isShuttingDown)
|
|
236
|
+
return;
|
|
237
|
+
isShuttingDown = true;
|
|
238
|
+
logger.info(`Received ${signal} signal, shutting down...`);
|
|
239
|
+
// Stop Telegram Bot
|
|
240
|
+
if (telegramBot) {
|
|
241
|
+
await telegramBot.stop();
|
|
242
|
+
}
|
|
243
|
+
// Stop Feishu Bot
|
|
244
|
+
if (feishuBot) {
|
|
245
|
+
await feishuBot.stop();
|
|
246
|
+
}
|
|
247
|
+
// Stop QQ Bot
|
|
248
|
+
if (qqBot) {
|
|
249
|
+
await qqBot.stop();
|
|
250
|
+
}
|
|
251
|
+
// 停止交互式 Web 服务器
|
|
252
|
+
if (interactiveServer) {
|
|
253
|
+
await interactiveServer.stop();
|
|
254
|
+
}
|
|
255
|
+
// 停止服务器
|
|
256
|
+
await server.stop();
|
|
257
|
+
// Save logs
|
|
258
|
+
await logger.saveAllLogs();
|
|
259
|
+
logger.info("👋 ShipMyAgent stopped");
|
|
260
|
+
process.exit(0);
|
|
261
|
+
};
|
|
262
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
263
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
264
|
+
// Start server
|
|
265
|
+
await server.start({
|
|
266
|
+
port,
|
|
267
|
+
host,
|
|
268
|
+
});
|
|
269
|
+
// 启动交互式 Web 服务器(如果已启用)
|
|
270
|
+
if (interactiveServer) {
|
|
271
|
+
await interactiveServer.start({
|
|
272
|
+
port: interactivePort ?? 3001,
|
|
273
|
+
host,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// 启动 Telegram Bot
|
|
277
|
+
if (telegramBot) {
|
|
278
|
+
await telegramBot.start();
|
|
279
|
+
}
|
|
280
|
+
// Start Feishu Bot
|
|
281
|
+
if (feishuBot) {
|
|
282
|
+
await feishuBot.start();
|
|
283
|
+
}
|
|
284
|
+
// Start QQ Bot
|
|
285
|
+
if (qqBot) {
|
|
286
|
+
await qqBot.start();
|
|
287
|
+
}
|
|
288
|
+
logger.info("=== ShipMyAgent Started ===");
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAiB,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC/F,OAAO,EACL,cAAc,EACd,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,GAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGlD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,GAAG,EACjB,OAAqB;IAErB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;IACnE,MAAM,SAAS,GAAG,CAAC,KAAc,EAAE,KAAa,EAAsB,EAAE;QACtE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAC5E,MAAM,GAAG,GACP,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAuB,EAAE;QAC3D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAC5E,IAAI,OAAO,KAAK,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC1E,IAAI,GAAG,IAAI,OAAQ,GAAW,CAAC,OAAO,KAAK,QAAQ;YACjD,OAAO,GAAI,GAAW,CAAC,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,KAAK,WAAW,EAAE,CAAC,CAAC;IAEnE,4CAA4C;IAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CACX,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CACX,iEAAiE,CAClE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yDAAyD;IACzD,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/B,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;IACnD,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,CAAC;IACrD,EAAE,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC;IACtD,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;IAEnD,2CAA2C;IAC3C,IAAI,aAAa,GAAG;qCACe,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7E,IAAI,OAAO;YAAE,aAAa,GAAG,OAAO,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IAED,0DAA0D;IAC1D,MAAM,MAAM,GAAG,wBAAwB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,+BAA+B,CACnD,WAAW,EACX,UAAU,EACV,MAAM,CACP,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC;IAE1E,iFAAiF;IACjF,IAAI,IAAY,CAAC;IACjB,IAAI,eAAmC,CAAC;IACxC,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;QACzE,eAAe;YACb,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,iBAAiB,CAAC;gBACrD,UAAU,CAAC,KAAK,EAAE,eAAe,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAM,cAAc,GAClB,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC;QACpC,UAAU,CAAC,KAAK,EAAE,cAAc;QAChC,KAAK,CAAC;IAER,gBAAgB;IAChB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE9C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,GAAG,EAAE,QAAQ,MAAM,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAE7E,6DAA6D;IAC7D,qBAAqB,CAAC;QACpB,WAAW;QACX,MAAM;QACN,WAAW,EAAE,IAAI,WAAW,CAAC,WAAW,CAAC;QACzC,MAAM,EAAE,UAAU;QAClB,YAAY;QACZ,gCAAgC;QAChC,WAAW,EAAE,GAAG,EAAE,CAChB,IAAI,KAAK,CAAC;YACR,WAAW;YACX,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,YAAY;SACtB,CAAC;KACL,CAAC,CAAC;IAEH,2EAA2E;IAC3E,MAAM,uBAAuB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEvC,uBAAuB;IACvB,MAAM,YAAY,GAAG,qBAAqB,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3D,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEzC,wBAAwB;IACxB,MAAM,aAAa,GAAkB;QACnC,WAAW;QACX,MAAM;QACN,YAAY;KACb,CAAC;IAEF,0BAA0B;IAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;IAE3C,uCAAuC;IACvC,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxC,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,qCAAqC;IACrC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEtC,iEAAiE;QACjE,MAAM,YAAY,GAAG;YACnB,OAAO,EAAE,IAAI;YACb,KAAK,EACH,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC9D,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK;gBACvB,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,aAAa;gBACzB,EAAE;YACJ,SAAS,EACP,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;gBACtE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS;gBAC3B,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAC7B,EAAE;YACJ,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,wBAAwB;YAC3D,YAAY,EAAE,KAAK,CAAC,OAAO,CAAE,QAAQ,CAAC,MAAc,EAAE,YAAY,CAAC;gBACjE,CAAC,CAAE,QAAQ,CAAC,MAAc,CAAC,YAAY;gBACvC,CAAC,CAAC,SAAS;SACd,CAAC;QAEF,SAAS,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,iCAAiC;IACjC,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,IAAI,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE,IAAI;YACb,KAAK,EACH,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC;gBACtD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK;gBACnB,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,SAAS;gBACrB,EAAE;YACJ,SAAS,EACP,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC9D,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS;gBACvB,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,aAAa;gBACzB,EAAE;YACJ,OAAO,EACL,OAAO,QAAQ,CAAC,EAAE,EAAE,OAAO,KAAK,SAAS;gBACvC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO;gBACrB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;SAC9D,CAAC;QAEF,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,uBAAuB;IACvB,IAAI,iBAAiB,GAAG,IAAI,CAAC;IAC7B,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,iBAAiB,GAAG,uBAAuB,CAAC;YAC1C,WAAW,EAAE,UAAU,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE;SAC1F,CAAC,CAAC;IACL,CAAC;IAED,SAAS;IACT,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,IAAI,cAAc;YAAE,OAAO;QAC3B,cAAc,GAAG,IAAI,CAAC;QAEtB,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,2BAA2B,CAAC,CAAC;QAE3D,oBAAoB;QACpB,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,kBAAkB;QAClB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;QAED,cAAc;QACd,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAED,gBAAgB;QAChB,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,QAAQ;QACR,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAEpB,YAAY;QACZ,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAE3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,eAAe;IACf,MAAM,MAAM,CAAC,KAAK,CAAC;QACjB,IAAI;QACJ,IAAI;KACL,CAAC,CAAC;IAEH,uBAAuB;IACvB,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,iBAAiB,CAAC,KAAK,CAAC;YAC5B,IAAI,EAAE,eAAe,IAAI,IAAI;YAC7B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,eAAe;IACf,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,YAAM,EACjB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAkCf"}
|
package/bin/commands/start.js
CHANGED
|
@@ -1,59 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shipmyagent start`:后台常驻启动(daemon)。
|
|
3
|
+
*
|
|
4
|
+
* 行为
|
|
5
|
+
* - 在 `.ship/debug/` 写入 pid/log/meta 文件
|
|
6
|
+
* - 通过 `node <cli.js> run ...` 启动真正的前台逻辑,但以 detached 方式在后台运行
|
|
7
|
+
*
|
|
8
|
+
* 注意
|
|
9
|
+
* - `shipmyagent .` / `shipmyagent run` 才是“当前终端前台启动”。
|
|
10
|
+
*/
|
|
1
11
|
import path from "path";
|
|
2
12
|
import fs from "fs-extra";
|
|
3
|
-
import { getLogger } from "../telemetry/index.js";
|
|
4
|
-
import { createServer } from "../server/index.js";
|
|
5
|
-
import { createInteractiveServer } from "../server/interactive.js";
|
|
6
|
-
import { createTelegramBot } from "../adapters/telegram.js";
|
|
7
|
-
import { createFeishuBot } from "../adapters/feishu.js";
|
|
8
|
-
import { createQQBot } from "../adapters/qq.js";
|
|
9
|
-
import { bootstrapMcpFromProject } from "../agent/mcp/index.js";
|
|
10
|
-
import { ChatManager } from "../chat/manager.js";
|
|
11
|
-
import { getShipRuntimeContext, setShipRuntimeContext } from "../server/ShipRuntimeContext.js";
|
|
12
|
-
import { getAgentMdPath, getCacheDirPath, getLogsDirPath, getShipChatRootDirPath, getShipConfigDirPath, getShipDataDirPath, getShipDebugDirPath, getShipDirPath, getShipProfileDirPath, getShipPublicDirPath, getShipJsonPath, getShipTasksDirPath, loadProjectDotenv, loadShipConfig, } from "../utils.js";
|
|
13
13
|
import { fileURLToPath } from "url";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
14
|
+
import { getAgentMdPath, getShipJsonPath } from "../utils.js";
|
|
15
|
+
import { startDaemonProcess } from "../daemon/manager.js";
|
|
16
|
+
import { buildRunArgsFromOptions } from "../daemon/cli-args.js";
|
|
17
17
|
export async function startCommand(cwd = ".", options) {
|
|
18
18
|
const projectRoot = path.resolve(cwd);
|
|
19
|
-
|
|
20
|
-
const parsePort = (value, label) => {
|
|
21
|
-
if (value === undefined || value === null || value === "")
|
|
22
|
-
return undefined;
|
|
23
|
-
const num = typeof value === "number" ? value : Number.parseInt(String(value), 10);
|
|
24
|
-
if (!Number.isFinite(num) || Number.isNaN(num)) {
|
|
25
|
-
throw new Error(`${label} must be a number`);
|
|
26
|
-
}
|
|
27
|
-
if (!Number.isInteger(num) || num <= 0 || num > 65535) {
|
|
28
|
-
throw new Error(`${label} must be an integer between 1 and 65535`);
|
|
29
|
-
}
|
|
30
|
-
return num;
|
|
31
|
-
};
|
|
32
|
-
const parseBoolean = (value) => {
|
|
33
|
-
if (value === undefined || value === null || value === "")
|
|
34
|
-
return undefined;
|
|
35
|
-
if (typeof value === "boolean")
|
|
36
|
-
return value;
|
|
37
|
-
const s = String(value).trim().toLowerCase();
|
|
38
|
-
if (["true", "1", "yes", "y", "on"].includes(s))
|
|
39
|
-
return true;
|
|
40
|
-
if (["false", "0", "no", "n", "off"].includes(s))
|
|
41
|
-
return false;
|
|
42
|
-
return undefined;
|
|
43
|
-
};
|
|
44
|
-
let version = "unknown";
|
|
45
|
-
try {
|
|
46
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
47
|
-
const __dirname = path.dirname(__filename);
|
|
48
|
-
const pkg = await fs.readJson(path.join(__dirname, "../../package.json"));
|
|
49
|
-
if (pkg && typeof pkg.version === "string")
|
|
50
|
-
version = pkg.version;
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
// ignore
|
|
54
|
-
}
|
|
55
|
-
console.log(`🚀 Starting ShipMyAgent v${version}: ${projectRoot}`);
|
|
56
|
-
// Check if initialized(启动入口一次性确认工程根目录与关键文件)
|
|
19
|
+
// 启动前先做最基本的工程校验,避免起了一个立刻报错退出的 daemon。
|
|
57
20
|
if (!fs.existsSync(getAgentMdPath(projectRoot))) {
|
|
58
21
|
console.error('❌ Project not initialized. Please run "shipmyagent init" first');
|
|
59
22
|
process.exit(1);
|
|
@@ -62,211 +25,24 @@ export async function startCommand(cwd = ".", options) {
|
|
|
62
25
|
console.error('❌ ship.json does not exist. Please run "shipmyagent init" first');
|
|
63
26
|
process.exit(1);
|
|
64
27
|
}
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
console.error("❌ Failed to read ship.json:", error);
|
|
72
|
-
process.exit(1);
|
|
73
|
-
}
|
|
74
|
-
// 在启动时加载 dotenv,并确保 .ship 目录结构存在(避免在 createAgent 中重复确保)。
|
|
75
|
-
loadProjectDotenv(projectRoot);
|
|
76
|
-
fs.ensureDirSync(getShipDirPath(projectRoot));
|
|
77
|
-
fs.ensureDirSync(getShipTasksDirPath(projectRoot));
|
|
78
|
-
fs.ensureDirSync(getLogsDirPath(projectRoot));
|
|
79
|
-
fs.ensureDirSync(getCacheDirPath(projectRoot));
|
|
80
|
-
fs.ensureDirSync(getShipProfileDirPath(projectRoot));
|
|
81
|
-
fs.ensureDirSync(getShipDataDirPath(projectRoot));
|
|
82
|
-
fs.ensureDirSync(getShipChatRootDirPath(projectRoot));
|
|
83
|
-
fs.ensureDirSync(getShipPublicDirPath(projectRoot));
|
|
84
|
-
fs.ensureDirSync(getShipConfigDirPath(projectRoot));
|
|
85
|
-
fs.ensureDirSync(path.join(getShipDirPath(projectRoot), "schema"));
|
|
86
|
-
fs.ensureDirSync(getShipDebugDirPath(projectRoot));
|
|
87
|
-
// Agent.md(用户可编辑的 system prompt)在启动时读取并缓存。
|
|
88
|
-
let agentProfiles = `# Agent Role
|
|
89
|
-
You are a helpful project assistant.`;
|
|
90
|
-
try {
|
|
91
|
-
const content = fs.readFileSync(getAgentMdPath(projectRoot), "utf-8").trim();
|
|
92
|
-
if (content)
|
|
93
|
-
agentProfiles = content;
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
// ignore
|
|
97
|
-
}
|
|
98
|
-
// Skills section 在启动时渲染并缓存(需要修改 skills/ship.json 生效时请重启)。
|
|
99
|
-
const skills = discoverClaudeSkillsSync(projectRoot, shipConfig);
|
|
100
|
-
const skillsSection = renderClaudeSkillsPromptSection(projectRoot, shipConfig, skills);
|
|
101
|
-
const agentSystems = [agentProfiles, DEFAULT_SHIP_PROMPTS, skillsSection];
|
|
102
|
-
// Resolve startup options: CLI flags override ship.json, then built-in defaults.
|
|
103
|
-
let port;
|
|
104
|
-
let interactivePort;
|
|
28
|
+
// 计算当前 CLI 的入口路径(编译后是 `bin/cli.js`)。
|
|
29
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
30
|
+
const __dirname = path.dirname(__filename);
|
|
31
|
+
const cliPath = path.resolve(__dirname, "../cli.js");
|
|
32
|
+
const args = buildRunArgsFromOptions(projectRoot, options || {});
|
|
105
33
|
try {
|
|
106
|
-
|
|
107
|
-
interactivePort =
|
|
108
|
-
parsePort(options.interactivePort, "interactivePort") ??
|
|
109
|
-
shipConfig.start?.interactivePort;
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
console.error("❌ Invalid start options:", error);
|
|
113
|
-
process.exit(1);
|
|
114
|
-
}
|
|
115
|
-
const host = (options.host ?? shipConfig.start?.host ?? "0.0.0.0").trim();
|
|
116
|
-
const interactiveWeb = parseBoolean(options.interactiveWeb) ??
|
|
117
|
-
shipConfig.start?.interactiveWeb ??
|
|
118
|
-
false;
|
|
119
|
-
// Create logger
|
|
120
|
-
const logger = getLogger(projectRoot, "info");
|
|
121
|
-
logger.info("=== ShipMyAgent Starting ===");
|
|
122
|
-
logger.info(`Project: ${projectRoot}`);
|
|
123
|
-
logger.info(`Model: ${shipConfig.llm?.provider} / ${shipConfig.llm?.model}`);
|
|
124
|
-
// 初始化进程级 runtime 上下文(避免 projectRoot/logger/createAgent 层层透传)
|
|
125
|
-
setShipRuntimeContext({
|
|
126
|
-
projectRoot,
|
|
127
|
-
logger,
|
|
128
|
-
chatManager: new ChatManager(projectRoot),
|
|
129
|
-
config: shipConfig,
|
|
130
|
-
agentSystems,
|
|
131
|
-
// 一个 chat 一个 Agent 实例:这里必须返回新对象
|
|
132
|
-
createAgent: () => new Agent({
|
|
34
|
+
const { pid, logPath } = await startDaemonProcess({
|
|
133
35
|
projectRoot,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}),
|
|
137
|
-
});
|
|
138
|
-
// Initialize MCP (managed by the server/bootstrap layer, not AgentRuntime)
|
|
139
|
-
await bootstrapMcpFromProject({ projectRoot, logger });
|
|
140
|
-
logger.info("MCP manager initialized");
|
|
141
|
-
// Create Agent Runtime
|
|
142
|
-
const agentRuntime = getShipRuntimeContext().createAgent();
|
|
143
|
-
await agentRuntime.initialize();
|
|
144
|
-
logger.info("Agent Runtime initialized");
|
|
145
|
-
// Create server context
|
|
146
|
-
const serverContext = {
|
|
147
|
-
projectRoot,
|
|
148
|
-
logger,
|
|
149
|
-
agentRuntime,
|
|
150
|
-
};
|
|
151
|
-
// Create and start server
|
|
152
|
-
const server = createServer(serverContext);
|
|
153
|
-
const adapters = shipConfig.adapters || {};
|
|
154
|
-
// Create Telegram Adapter (if enabled)
|
|
155
|
-
let telegramBot = null;
|
|
156
|
-
if (adapters.telegram?.enabled) {
|
|
157
|
-
logger.info("Telegram adapter enabled");
|
|
158
|
-
telegramBot = createTelegramBot(adapters.telegram);
|
|
159
|
-
}
|
|
160
|
-
// Create Feishu Adapter (if enabled)
|
|
161
|
-
let feishuBot = null;
|
|
162
|
-
if (adapters.feishu?.enabled) {
|
|
163
|
-
logger.info("Feishu adapter enabled");
|
|
164
|
-
// Read Feishu configuration from environment variables or config
|
|
165
|
-
const feishuConfig = {
|
|
166
|
-
enabled: true,
|
|
167
|
-
appId: (adapters.feishu?.appId && !isPlaceholder(adapters.feishu.appId)
|
|
168
|
-
? adapters.feishu.appId
|
|
169
|
-
: undefined) ||
|
|
170
|
-
process.env.FEISHU_APP_ID ||
|
|
171
|
-
"",
|
|
172
|
-
appSecret: (adapters.feishu?.appSecret && !isPlaceholder(adapters.feishu.appSecret)
|
|
173
|
-
? adapters.feishu.appSecret
|
|
174
|
-
: undefined) ||
|
|
175
|
-
process.env.FEISHU_APP_SECRET ||
|
|
176
|
-
"",
|
|
177
|
-
domain: adapters.feishu?.domain || "https://open.feishu.cn",
|
|
178
|
-
adminUserIds: Array.isArray(adapters.feishu?.adminUserIds)
|
|
179
|
-
? adapters.feishu.adminUserIds
|
|
180
|
-
: undefined,
|
|
181
|
-
};
|
|
182
|
-
feishuBot = await createFeishuBot(feishuConfig);
|
|
183
|
-
}
|
|
184
|
-
// Create QQ Adapter (if enabled)
|
|
185
|
-
let qqBot = null;
|
|
186
|
-
if (adapters.qq?.enabled) {
|
|
187
|
-
logger.info("QQ adapter enabled");
|
|
188
|
-
const qqConfig = {
|
|
189
|
-
enabled: true,
|
|
190
|
-
appId: (adapters.qq?.appId && !isPlaceholder(adapters.qq.appId)
|
|
191
|
-
? adapters.qq.appId
|
|
192
|
-
: undefined) ||
|
|
193
|
-
process.env.QQ_APP_ID ||
|
|
194
|
-
"",
|
|
195
|
-
appSecret: (adapters.qq?.appSecret && !isPlaceholder(adapters.qq.appSecret)
|
|
196
|
-
? adapters.qq.appSecret
|
|
197
|
-
: undefined) ||
|
|
198
|
-
process.env.QQ_APP_SECRET ||
|
|
199
|
-
"",
|
|
200
|
-
sandbox: typeof adapters.qq?.sandbox === "boolean"
|
|
201
|
-
? adapters.qq.sandbox
|
|
202
|
-
: (process.env.QQ_SANDBOX || "").toLowerCase() === "true",
|
|
203
|
-
};
|
|
204
|
-
qqBot = await createQQBot(qqConfig);
|
|
205
|
-
}
|
|
206
|
-
// 创建交互式 Web 服务器(如果已启用)
|
|
207
|
-
let interactiveServer = null;
|
|
208
|
-
if (interactiveWeb) {
|
|
209
|
-
logger.info("交互式 Web 界面已启用");
|
|
210
|
-
interactiveServer = createInteractiveServer({
|
|
211
|
-
agentApiUrl: `http://${host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host}:${port}`,
|
|
36
|
+
cliPath,
|
|
37
|
+
args,
|
|
212
38
|
});
|
|
39
|
+
console.log("✅ ShipMyAgent daemon started");
|
|
40
|
+
console.log(` pid: ${pid}`);
|
|
41
|
+
console.log(` log: ${logPath}`);
|
|
213
42
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
if (isShuttingDown)
|
|
218
|
-
return;
|
|
219
|
-
isShuttingDown = true;
|
|
220
|
-
logger.info(`Received ${signal} signal, shutting down...`);
|
|
221
|
-
// Stop Telegram Bot
|
|
222
|
-
if (telegramBot) {
|
|
223
|
-
await telegramBot.stop();
|
|
224
|
-
}
|
|
225
|
-
// Stop Feishu Bot
|
|
226
|
-
if (feishuBot) {
|
|
227
|
-
await feishuBot.stop();
|
|
228
|
-
}
|
|
229
|
-
// Stop QQ Bot
|
|
230
|
-
if (qqBot) {
|
|
231
|
-
await qqBot.stop();
|
|
232
|
-
}
|
|
233
|
-
// 停止交互式 Web 服务器
|
|
234
|
-
if (interactiveServer) {
|
|
235
|
-
await interactiveServer.stop();
|
|
236
|
-
}
|
|
237
|
-
// 停止服务器
|
|
238
|
-
await server.stop();
|
|
239
|
-
// Save logs
|
|
240
|
-
await logger.saveAllLogs();
|
|
241
|
-
logger.info("👋 ShipMyAgent stopped");
|
|
242
|
-
process.exit(0);
|
|
243
|
-
};
|
|
244
|
-
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
245
|
-
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
246
|
-
// Start server
|
|
247
|
-
await server.start({
|
|
248
|
-
port,
|
|
249
|
-
host,
|
|
250
|
-
});
|
|
251
|
-
// 启动交互式 Web 服务器(如果已启用)
|
|
252
|
-
if (interactiveServer) {
|
|
253
|
-
await interactiveServer.start({
|
|
254
|
-
port: interactivePort ?? 3001,
|
|
255
|
-
host,
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
// 启动 Telegram Bot
|
|
259
|
-
if (telegramBot) {
|
|
260
|
-
await telegramBot.start();
|
|
261
|
-
}
|
|
262
|
-
// Start Feishu Bot
|
|
263
|
-
if (feishuBot) {
|
|
264
|
-
await feishuBot.start();
|
|
265
|
-
}
|
|
266
|
-
// Start QQ Bot
|
|
267
|
-
if (qqBot) {
|
|
268
|
-
await qqBot.start();
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error("❌ Failed to start daemon:", error);
|
|
45
|
+
process.exit(1);
|
|
269
46
|
}
|
|
270
|
-
logger.info("=== ShipMyAgent Started ===");
|
|
271
47
|
}
|
|
272
48
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,GAAG,EACjB,OAAqB;IAErB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,sCAAsC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;YAChD,WAAW;YACX,OAAO;YACP,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `shipmyagent stop`:停止后台常驻的 Agent Runtime(daemon)。
|
|
3
|
+
*/
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { stopDaemonProcess, readDaemonPid, isProcessAlive } from "../daemon/manager.js";
|
|
6
|
+
export async function stopCommand(cwd = ".") {
|
|
7
|
+
const projectRoot = path.resolve(cwd);
|
|
8
|
+
const pid = await readDaemonPid(projectRoot);
|
|
9
|
+
if (!pid) {
|
|
10
|
+
console.log("ℹ️ No ShipMyAgent daemon is running (pid file not found)");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (!isProcessAlive(pid)) {
|
|
14
|
+
await stopDaemonProcess({ projectRoot, timeoutMs: 0 });
|
|
15
|
+
console.log("ℹ️ Daemon pid file exists but process is not running; cleaned up");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const result = await stopDaemonProcess({ projectRoot });
|
|
19
|
+
if (result.stopped) {
|
|
20
|
+
console.log("✅ ShipMyAgent daemon stopped");
|
|
21
|
+
console.log(` pid: ${pid}`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
console.log("ℹ️ No ShipMyAgent daemon is running");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,GAAG;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,iBAAiB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../../src/daemon/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,EACnB,SAAS,YAAY,KACpB,MAAM,EAWR,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 负责把 commander 解析到的 options 转换成子进程 CLI 参数。
|
|
3
|
+
*
|
|
4
|
+
* 关键点
|
|
5
|
+
* - daemon 实际启动的是 `shipmyagent run`(前台逻辑),这里拼装出对应的 argv。
|
|
6
|
+
*/
|
|
7
|
+
export const buildRunArgsFromOptions = (projectRoot, options) => {
|
|
8
|
+
const args = ["run", projectRoot];
|
|
9
|
+
if (options.port !== undefined)
|
|
10
|
+
args.push("--port", String(options.port));
|
|
11
|
+
if (options.host)
|
|
12
|
+
args.push("--host", String(options.host));
|
|
13
|
+
if (options.interactiveWeb !== undefined)
|
|
14
|
+
args.push("--interactive-web", String(options.interactiveWeb));
|
|
15
|
+
if (options.interactivePort !== undefined)
|
|
16
|
+
args.push("--interactive-port", String(options.interactivePort));
|
|
17
|
+
return args;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=cli-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../../src/daemon/cli-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,WAAmB,EACnB,OAAqB,EACX,EAAE;IACZ,MAAM,IAAI,GAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS;QACtC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,eAAe,KAAK,SAAS;QACvC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAEnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/daemon/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAK5B,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,MACW,CAAC;AAEnE,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,KAAG,MACW,CAAC;AAEnE,eAAO,MAAM,iBAAiB,GAAI,aAAa,MAAM,KAAG,MACW,CAAC;AAEpE,eAAO,MAAM,aAAa,GACxB,aAAa,MAAM,KAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAQvB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,OAO5C,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAQd,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,aAAa,MAAM,EACnB,MAAM,UAAU,KACf,OAAO,CAAC,IAAI,CAId,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,QAAQ;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,KAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0C3C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,QAAQ;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAkC7C,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipMyAgent daemon 管理(PID / 日志 / 启停)。
|
|
3
|
+
*
|
|
4
|
+
* 目标
|
|
5
|
+
* - `shipmyagent start`:后台启动(终端退出后仍运行)
|
|
6
|
+
* - `shipmyagent stop`:停止后台进程
|
|
7
|
+
* - `shipmyagent restart`:重启后台进程
|
|
8
|
+
*
|
|
9
|
+
* 约定
|
|
10
|
+
* - 所有 daemon 相关文件都写入 `.ship/debug/`,便于排查:
|
|
11
|
+
* - `shipmyagent.pid`:进程 pid
|
|
12
|
+
* - `shipmyagent.daemon.log`:stdout/stderr 合并日志
|
|
13
|
+
* - `shipmyagent.daemon.json`:元数据(启动时间、参数等)
|
|
14
|
+
*/
|
|
15
|
+
import fs from "fs-extra";
|
|
16
|
+
import path from "path";
|
|
17
|
+
import { spawn } from "child_process";
|
|
18
|
+
import { getShipDebugDirPath } from "../utils.js";
|
|
19
|
+
import { DAEMON_LOG_FILENAME, DAEMON_META_FILENAME, DAEMON_PID_FILENAME, } from "../types/daemon.js";
|
|
20
|
+
const sleep = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
21
|
+
export const getDaemonPidPath = (projectRoot) => path.join(getShipDebugDirPath(projectRoot), DAEMON_PID_FILENAME);
|
|
22
|
+
export const getDaemonLogPath = (projectRoot) => path.join(getShipDebugDirPath(projectRoot), DAEMON_LOG_FILENAME);
|
|
23
|
+
export const getDaemonMetaPath = (projectRoot) => path.join(getShipDebugDirPath(projectRoot), DAEMON_META_FILENAME);
|
|
24
|
+
export const readDaemonPid = async (projectRoot) => {
|
|
25
|
+
try {
|
|
26
|
+
const raw = await fs.readFile(getDaemonPidPath(projectRoot), "utf-8");
|
|
27
|
+
const pid = Number.parseInt(String(raw).trim(), 10);
|
|
28
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
export const isProcessAlive = (pid) => {
|
|
35
|
+
try {
|
|
36
|
+
process.kill(pid, 0);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
export const cleanupStaleDaemonFiles = async (projectRoot) => {
|
|
44
|
+
const pid = await readDaemonPid(projectRoot);
|
|
45
|
+
if (!pid)
|
|
46
|
+
return;
|
|
47
|
+
if (isProcessAlive(pid))
|
|
48
|
+
return;
|
|
49
|
+
// 关键注释:pid 文件存在但进程已退出,属于“脏状态”,这里直接清理。
|
|
50
|
+
await fs.remove(getDaemonPidPath(projectRoot));
|
|
51
|
+
await fs.remove(getDaemonMetaPath(projectRoot));
|
|
52
|
+
};
|
|
53
|
+
export const writeDaemonFiles = async (projectRoot, meta) => {
|
|
54
|
+
await fs.ensureDir(getShipDebugDirPath(projectRoot));
|
|
55
|
+
await fs.writeFile(getDaemonPidPath(projectRoot), String(meta.pid), "utf-8");
|
|
56
|
+
await fs.writeJson(getDaemonMetaPath(projectRoot), meta, { spaces: 2 });
|
|
57
|
+
};
|
|
58
|
+
export const startDaemonProcess = async (params) => {
|
|
59
|
+
const { projectRoot, cliPath, args } = params;
|
|
60
|
+
await fs.ensureDir(getShipDebugDirPath(projectRoot));
|
|
61
|
+
await cleanupStaleDaemonFiles(projectRoot);
|
|
62
|
+
const existingPid = await readDaemonPid(projectRoot);
|
|
63
|
+
if (existingPid && isProcessAlive(existingPid)) {
|
|
64
|
+
throw new Error(`Daemon already running (pid: ${existingPid})`);
|
|
65
|
+
}
|
|
66
|
+
const logPath = getDaemonLogPath(projectRoot);
|
|
67
|
+
const logFd = fs.openSync(logPath, "a");
|
|
68
|
+
// 关键注释:daemon 进程必须 detached + unref 才能在父进程退出后继续运行。
|
|
69
|
+
const child = spawn(process.execPath, [cliPath, ...args], {
|
|
70
|
+
cwd: projectRoot,
|
|
71
|
+
detached: true,
|
|
72
|
+
stdio: ["ignore", logFd, logFd],
|
|
73
|
+
env: {
|
|
74
|
+
...process.env,
|
|
75
|
+
SHIPMYAGENT_DAEMON: "1",
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
child.unref();
|
|
79
|
+
if (!child.pid) {
|
|
80
|
+
throw new Error("Failed to start daemon process (missing pid)");
|
|
81
|
+
}
|
|
82
|
+
await writeDaemonFiles(projectRoot, {
|
|
83
|
+
pid: child.pid,
|
|
84
|
+
projectRoot,
|
|
85
|
+
startedAt: new Date().toISOString(),
|
|
86
|
+
command: process.execPath,
|
|
87
|
+
args: [cliPath, ...args],
|
|
88
|
+
node: process.version,
|
|
89
|
+
platform: process.platform,
|
|
90
|
+
});
|
|
91
|
+
return { pid: child.pid, logPath };
|
|
92
|
+
};
|
|
93
|
+
export const stopDaemonProcess = async (params) => {
|
|
94
|
+
const { projectRoot, timeoutMs = 10_000 } = params;
|
|
95
|
+
await cleanupStaleDaemonFiles(projectRoot);
|
|
96
|
+
const pid = await readDaemonPid(projectRoot);
|
|
97
|
+
if (!pid)
|
|
98
|
+
return { stopped: false };
|
|
99
|
+
if (!isProcessAlive(pid)) {
|
|
100
|
+
await fs.remove(getDaemonPidPath(projectRoot));
|
|
101
|
+
await fs.remove(getDaemonMetaPath(projectRoot));
|
|
102
|
+
return { stopped: false, pid };
|
|
103
|
+
}
|
|
104
|
+
process.kill(pid, "SIGTERM");
|
|
105
|
+
const startedAt = Date.now();
|
|
106
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
107
|
+
if (!isProcessAlive(pid))
|
|
108
|
+
break;
|
|
109
|
+
await sleep(200);
|
|
110
|
+
}
|
|
111
|
+
if (isProcessAlive(pid)) {
|
|
112
|
+
// 关键注释:尽量优雅停止,超时后再强杀,避免后台进程“卡死”。
|
|
113
|
+
try {
|
|
114
|
+
process.kill(pid, "SIGKILL");
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// ignore
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
await fs.remove(getDaemonPidPath(projectRoot));
|
|
121
|
+
await fs.remove(getDaemonMetaPath(projectRoot));
|
|
122
|
+
return { stopped: true, pid };
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/daemon/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/types/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AAErD;;GAEG;AACH,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;CAC3B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 后台常驻(daemon)相关类型与常量。
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* daemon pid 文件名(存放于 `.ship/debug/` 下)。
|
|
6
|
+
*/
|
|
7
|
+
export const DAEMON_PID_FILENAME = "shipmyagent.pid";
|
|
8
|
+
/**
|
|
9
|
+
* daemon 日志文件名(stdout/stderr 合并,存放于 `.ship/debug/` 下)。
|
|
10
|
+
*/
|
|
11
|
+
export const DAEMON_LOG_FILENAME = "shipmyagent.daemon.log";
|
|
12
|
+
/**
|
|
13
|
+
* daemon 元数据文件名(便于排查问题,存放于 `.ship/debug/` 下)。
|
|
14
|
+
*/
|
|
15
|
+
export const DAEMON_META_FILENAME = "shipmyagent.daemon.json";
|
|
16
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/types/daemon.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAErD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/types/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/types/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|