@gird/ccli 2.9.0 → 2.11.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/README.md +8 -2
- package/dist/cli/repl/index.js +31 -9
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/slash/index.js +4 -0
- package/dist/cli/slash/index.js.map +1 -1
- package/dist/cli/slash/system/help.js +1 -0
- package/dist/cli/slash/system/help.js.map +1 -1
- package/dist/cli/slash/system/memories.js +44 -0
- package/dist/cli/slash/system/memories.js.map +1 -0
- package/dist/config/memory.js +113 -19
- package/dist/config/memory.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/bash-background.js +128 -0
- package/dist/tools/bash-background.js.map +1 -0
- package/dist/tools/bash-output.js +45 -0
- package/dist/tools/bash-output.js.map +1 -0
- package/dist/tools/bash.js +15 -3
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/index.js +6 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/kill-bash.js +41 -0
- package/dist/tools/kill-bash.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,12 +26,18 @@ ccli --yes "在当前目录创建 test.txt" # 自动确认破坏性工具调
|
|
|
26
26
|
ccli --role coder "review 这段代码" # 使用 coding 角色单次调用
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**记忆**:CCLI 启动时会自动读取记忆文件并注入到系统提示,让它「懂你、也懂这个项目」——无需每次手动交代背景与约定。分三层,按「全局 → 项目根 → 子目录」顺序注入(越靠近当前目录越具体,权重越高):
|
|
30
|
+
|
|
31
|
+
- **全局记忆** `~/.ccli/CCLI.md`(或 `AGENTS.md`):跨所有项目的个人偏好。
|
|
32
|
+
- **项目记忆** 仓库根目录的 `CCLI.md`(或 `AGENTS.md`):整个项目的说明与约定。
|
|
33
|
+
- **子目录记忆** 从 git 仓库根一路向下到当前目录,各级目录的 `CCLI.md`(或 `AGENTS.md`)会逐层叠加,适合 monorepo / 分层目录(例如在 `packages/web/` 里启动,会叠加「仓库根 `CCLI.md`」+「`packages/web/CCLI.md`」)。
|
|
34
|
+
|
|
35
|
+
对话里输入以 `#` 开头的一行,可把内容**追加进项目 `CCLI.md` 并立即生效**(不发给 AI),下次启动自动带上,例如 `# 本项目用 pnpm`。输入 `/memories` 可查看当前会话实际注入了哪些记忆(按层级列出)。
|
|
30
36
|
|
|
31
37
|
进入对话后:
|
|
32
38
|
|
|
33
39
|
- 直接输入即与 AI 对话,模型会记住上文(多轮对话)。
|
|
34
|
-
- 模型可调用的工具:读文件、列目录、搜索代码、写文件、局部编辑文件、执行 shell
|
|
40
|
+
- 模型可调用的工具:读文件、列目录、搜索代码、写文件、局部编辑文件、执行 shell 命令(写入/编辑/执行操作会请你确认;shell 命令可用 `background: true` 放后台长跑,再用 `bash_output` 查看输出、`kill_bash` 终止)。
|
|
35
41
|
- `/help` 查看可用命令,`/clear` 清空历史,`/undo [n]` 撤销最近 n 轮对话。
|
|
36
42
|
- `/compact` 把对话历史压缩成一段摘要,释放上下文(长对话逼近上限时用;仅在确有收益时替换)。上下文占比达到约 80% 时也会**自动压缩**。
|
|
37
43
|
- `/model [id]` 查看当前模型或切换到新模型(输入空参数只查看)。
|
package/dist/cli/repl/index.js
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
* 支持优雅退出:/exit、/quit,或按 Ctrl-D(EOF)、Ctrl-C。
|
|
7
7
|
*/
|
|
8
8
|
import { createInterface } from 'node:readline';
|
|
9
|
-
import { join } from 'node:path';
|
|
9
|
+
import { join, relative } from 'node:path';
|
|
10
10
|
import { NAME, VERSION } from '../../version.js';
|
|
11
11
|
import { style } from '../style.js';
|
|
12
12
|
import { loadConfig, maskKey, DEFAULT_SYSTEM_PROMPT, getRolePrompt, } from '../../config/config.js';
|
|
13
13
|
import { loadEnvFile } from '../../config/env.js';
|
|
14
|
-
import {
|
|
14
|
+
import { appendMemories, appendProjectMemory, loadMemories, SCOPE_LABEL, } from '../../config/memory.js';
|
|
15
15
|
import { createAIClient } from '../../agent/ai.js';
|
|
16
16
|
import { handleSlash, slashCompleter } from '../slash/index.js';
|
|
17
17
|
import { injectFileReferences, completeFileReference, } from '../file-reference.js';
|
|
@@ -52,17 +52,23 @@ export async function startRepl() {
|
|
|
52
52
|
await registerMcpTools(mcp);
|
|
53
53
|
}
|
|
54
54
|
const ai = createAIClient(config);
|
|
55
|
-
//
|
|
56
|
-
|
|
55
|
+
// 记忆分层:启动时读一次(全局 + 项目根 + 子目录),注入 system 提示;切换角色或 # 写入时重读
|
|
56
|
+
let memories = loadMemories(process.cwd());
|
|
57
57
|
// 对话历史:以 system 提示词开场,之后累积 user / assistant 轮次
|
|
58
58
|
const history = [
|
|
59
59
|
{
|
|
60
60
|
role: 'system',
|
|
61
|
-
content:
|
|
61
|
+
content: appendMemories(DEFAULT_SYSTEM_PROMPT, memories),
|
|
62
62
|
},
|
|
63
63
|
];
|
|
64
64
|
let currentRole = 'default';
|
|
65
65
|
let stats = emptyStats();
|
|
66
|
+
/** 当前角色的 system 提示基础文本(不含记忆)。 */
|
|
67
|
+
const currentRoleBase = () => getRolePrompt(currentRole, config.roles) ?? DEFAULT_SYSTEM_PROMPT;
|
|
68
|
+
/** 用最新记忆重建 history[0] 的 system 提示(切角色、# 写入后调用)。 */
|
|
69
|
+
const refreshSystemPrompt = () => {
|
|
70
|
+
history[0].content = appendMemories(currentRoleBase(), memories);
|
|
71
|
+
};
|
|
66
72
|
/** 组合补全:优先斜杠命令,@ 开头时尝试文件引用补全。 */
|
|
67
73
|
const inputCompleter = (line) => {
|
|
68
74
|
if (line.includes('@')) {
|
|
@@ -82,8 +88,8 @@ export async function startRepl() {
|
|
|
82
88
|
});
|
|
83
89
|
console.log(style.label(`${NAME} v${VERSION}`));
|
|
84
90
|
console.log(style.muted(`后端: ${config.provider} 模型: ${config.model} 密钥: ${maskKey(config.apiKey)}`));
|
|
85
|
-
|
|
86
|
-
console.log(style.success(
|
|
91
|
+
for (const m of memories) {
|
|
92
|
+
console.log(style.success(`已加载${SCOPE_LABEL[m.scope]}:${m.file}`));
|
|
87
93
|
}
|
|
88
94
|
console.log(style.info('进入交互式会话。输入 /help 查看命令,/exit 退出。\n'));
|
|
89
95
|
rl.prompt();
|
|
@@ -108,6 +114,23 @@ export async function startRepl() {
|
|
|
108
114
|
async function processUserInput(input) {
|
|
109
115
|
// 非空输入追加到持久化历史(readline 内存历史已自动维护)
|
|
110
116
|
appendHistory(input);
|
|
117
|
+
// # 动态记忆写入:追加到项目 CCLI.md 并立即注入当前会话,不发给 AI
|
|
118
|
+
const hashInput = input.trimStart();
|
|
119
|
+
if (hashInput.startsWith('#')) {
|
|
120
|
+
const note = hashInput.slice(1).trim();
|
|
121
|
+
if (!note) {
|
|
122
|
+
console.log(style.muted('用法:# 要记住的内容,例如 # 本项目用 pnpm'));
|
|
123
|
+
rl.prompt();
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const file = appendProjectMemory(note, process.cwd());
|
|
127
|
+
memories = loadMemories(process.cwd());
|
|
128
|
+
refreshSystemPrompt();
|
|
129
|
+
const display = relative(process.cwd(), file) || file;
|
|
130
|
+
console.log(style.success(`已记住(${display}):${note}`));
|
|
131
|
+
rl.prompt();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
111
134
|
// 把 @文件引用 解析并注入文件内容
|
|
112
135
|
const processedInput = injectFileReferences(input, process.cwd());
|
|
113
136
|
// 斜杠命令:交给 handleSlash,不发给 AI
|
|
@@ -125,8 +148,7 @@ export async function startRepl() {
|
|
|
125
148
|
currentRole,
|
|
126
149
|
setRole: (name) => {
|
|
127
150
|
currentRole = name;
|
|
128
|
-
|
|
129
|
-
DEFAULT_SYSTEM_PROMPT, projectMemory);
|
|
151
|
+
refreshSystemPrompt();
|
|
130
152
|
},
|
|
131
153
|
requestExit: () => {
|
|
132
154
|
exiting = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/repl/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/repl/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/slash/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import { handleResume } from './session/resume.js';
|
|
|
21
21
|
import { handleRole } from './config/role.js';
|
|
22
22
|
import { handleMcp, reloadMcpServers } from './mcp/mcp.js';
|
|
23
23
|
import { handleCompact } from './system/compact.js';
|
|
24
|
+
import { handleMemories } from './system/memories.js';
|
|
24
25
|
import { style } from '../style.js';
|
|
25
26
|
/**
|
|
26
27
|
* readline 的 Tab 补全函数。
|
|
@@ -108,6 +109,9 @@ export async function handleSlash(input, ctx) {
|
|
|
108
109
|
case 'role':
|
|
109
110
|
handleRole(arg, ctx);
|
|
110
111
|
return true;
|
|
112
|
+
case 'memories':
|
|
113
|
+
handleMemories(arg, ctx);
|
|
114
|
+
return true;
|
|
111
115
|
case 'exit':
|
|
112
116
|
case 'quit':
|
|
113
117
|
ctx.requestExit();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/slash/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,qCAAqC;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,YAAY,EAAE;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACrD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,WAAW;IACX,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;aACxD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CACf,GAAG;aACE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACb,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAC5B;aACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,KAAa,EACb,GAAiB;IAEjB,0BAA0B;IAC1B,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAElC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,MAAM;YACP,SAAS,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QAEhB,KAAK,OAAO;YACR,2BAA2B;YAC3B,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACvB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM;YACP,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QAEhB,KAAK,SAAS;YACV,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,IAAI,CAAC;QAEhB,KAAK,OAAO;YACR,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM;YACP,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM;YACP,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAEhB,KAAK,UAAU;YACX,cAAc,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAEhB,KAAK,QAAQ;YACT,MAAM,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QAEhB,KAAK,OAAO;YACR,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM;YACP,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QAEhB,KAAK,OAAO;YACR,WAAW,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,IAAI,CAAC;QAEhB,KAAK,QAAQ;YACT,YAAY,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC;QAEhB,KAAK,QAAQ;YACT,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QAEhB,KAAK,KAAK;YACN,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM;YACP,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QAEhB,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACP,GAAG,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QAEhB;YACI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;IACpB,CAAC;AACL,CAAC;AAED,sCAAsC;AACtC,KAAK,UAAU,YAAY,CAAC,GAAiB;IACzC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAEvC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACjB,MAAM,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/slash/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ export const COMMANDS = [
|
|
|
16
16
|
['/reload', '重新加载 .ccli/config.json 并刷新 MCP server'],
|
|
17
17
|
['/mcp <subcommand>', '管理 MCP server(list/add/remove/reload)'],
|
|
18
18
|
['/role [name]', '切换或查看系统提示词角色'],
|
|
19
|
+
['/memories', '查看当前注入的分层记忆'],
|
|
19
20
|
['/exit, /quit', '退出会话'],
|
|
20
21
|
];
|
|
21
22
|
export function printHelp() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/help.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC5B,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACjC,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAChC,CAAC,aAAa,EAAE,SAAS,CAAC;IAC1B,CAAC,cAAc,EAAE,kBAAkB,CAAC;IACpC,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACjC,CAAC,eAAe,EAAE,YAAY,CAAC;IAC/B,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;IAC3C,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,SAAS,EAAE,uCAAuC,CAAC;IACpD,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;IAC9D,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,cAAc,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,SAAS;IACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/help.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,CAAC,OAAO,EAAE,QAAQ,CAAC;IACnB,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAC5B,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACjC,CAAC,UAAU,EAAE,kBAAkB,CAAC;IAChC,CAAC,aAAa,EAAE,SAAS,CAAC;IAC1B,CAAC,cAAc,EAAE,kBAAkB,CAAC;IACpC,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,gBAAgB,EAAE,aAAa,CAAC;IACjC,CAAC,eAAe,EAAE,YAAY,CAAC;IAC/B,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;IAC3C,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,aAAa,CAAC;IAC1B,CAAC,SAAS,EAAE,uCAAuC,CAAC;IACpD,CAAC,mBAAmB,EAAE,uCAAuC,CAAC;IAC9D,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,WAAW,EAAE,aAAa,CAAC;IAC5B,CAAC,cAAc,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,UAAU,SAAS;IACrB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `/memories` —— 查看当前会话实际注入的分层记忆。
|
|
3
|
+
*
|
|
4
|
+
* 只读、不发 AI:把 `loadMemories(cwd)` 的结果按注入顺序列出,便于确认
|
|
5
|
+
* `#` 写入或各层 `CCLI.md` 是否真的生效。
|
|
6
|
+
*/
|
|
7
|
+
import { loadMemories, SCOPE_LABEL } from '../../../config/memory.js';
|
|
8
|
+
import { style } from '../../style.js';
|
|
9
|
+
/** 取内容的第一行(去掉前后空白),超长截断,作为预览。 */
|
|
10
|
+
function preview(content, max = 40) {
|
|
11
|
+
const first = content
|
|
12
|
+
.split('\n')
|
|
13
|
+
.map((s) => s.trim())
|
|
14
|
+
.find((s) => s.length > 0) ?? '';
|
|
15
|
+
if (first.length <= max)
|
|
16
|
+
return first;
|
|
17
|
+
return first.slice(0, max) + '…';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 把记忆列表格式化成纯文本(便于测试)。空列表返回一句提示。
|
|
21
|
+
*/
|
|
22
|
+
export function formatMemoriesList(memories) {
|
|
23
|
+
if (memories.length === 0) {
|
|
24
|
+
return '当前没有加载任何记忆。可在项目根新建 CCLI.md,或在对话里输入 `# 内容` 写入。';
|
|
25
|
+
}
|
|
26
|
+
const header = `已加载 ${memories.length} 层记忆(按注入顺序,越靠后权重越高):`;
|
|
27
|
+
const lines = memories.map((m, i) => {
|
|
28
|
+
const label = SCOPE_LABEL[m.scope];
|
|
29
|
+
const chars = m.content.length;
|
|
30
|
+
return ` ${i + 1}. ${label} ${m.file} (${chars} 字) 预览:${preview(m.content)}`;
|
|
31
|
+
});
|
|
32
|
+
return [header, ...lines].join('\n');
|
|
33
|
+
}
|
|
34
|
+
/** 处理 `/memories`:打印当前 cwd 下注入的全部分层记忆。 */
|
|
35
|
+
export function handleMemories(_arg, ctx) {
|
|
36
|
+
const memories = loadMemories(ctx.cwd);
|
|
37
|
+
const text = formatMemoriesList(memories);
|
|
38
|
+
if (memories.length === 0) {
|
|
39
|
+
console.log(style.muted(text));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log(text);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=memories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memories.js","sourceRoot":"","sources":["../../../../src/cli/slash/system/memories.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,iCAAiC;AACjC,SAAS,OAAO,CAAC,OAAe,EAAE,GAAG,GAAG,EAAE;IACtC,MAAM,KAAK,GACP,OAAO;SACF,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,+CAA+C,CAAC;IAC3D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,MAAM,sBAAsB,CAAC;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAiB;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,OAAO;IACX,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
|
package/dist/config/memory.js
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 记忆分层(Layered Memory)—— 让 CCLI「懂你、也懂这个项目」。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 启动时自动读取记忆文件,追加进 system 提示,这样每次会话都自带背景/约定,
|
|
5
|
+
* 不用手动 @ 交代。目前支持三层,按「全局 → 项目根 → 子目录」顺序注入:
|
|
6
|
+
* ① 全局记忆 ~/.ccli/CCLI.md —— 跨所有项目的个人偏好
|
|
7
|
+
* ② 项目记忆 <仓库根>/CCLI.md —— 整个项目的说明与约定
|
|
8
|
+
* ③ 子目录记忆 <仓库根>/<子目录>/CCLI.md —— 子项目/模块的更具体约定(monorepo 友好)
|
|
6
9
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
10
|
+
* 每层都优先 CCLI.md,回退 AGENTS.md。子目录记忆从 git 仓库根一路向下收集到 cwd,
|
|
11
|
+
* 越靠近 cwd(越具体)越靠后注入——越靠近提示末尾,模型越重视。
|
|
12
|
+
* 后续可再加 # 动态写入。
|
|
9
13
|
*/
|
|
10
|
-
import { readFileSync } from 'node:fs';
|
|
11
|
-
import { resolve } from 'node:path';
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
12
17
|
/** 按优先级尝试的记忆文件名:命中第一个存在且非空的。 */
|
|
13
18
|
const MEMORY_FILES = ['CCLI.md', 'AGENTS.md'];
|
|
14
19
|
/** 记忆内容上限,避免超大文件把上下文撑爆。 */
|
|
15
20
|
const MAX_MEMORY_CHARS = 16_000;
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
for (const
|
|
21
|
+
/** 从某个目录读记忆文件(第一个存在且非空的),没有则返回 null。 */
|
|
22
|
+
function loadFrom(dir, scope, displayDir) {
|
|
23
|
+
for (const name of MEMORY_FILES) {
|
|
19
24
|
let raw;
|
|
20
25
|
try {
|
|
21
|
-
raw = readFileSync(resolve(
|
|
26
|
+
raw = readFileSync(resolve(dir, name), 'utf8');
|
|
22
27
|
}
|
|
23
28
|
catch {
|
|
24
29
|
continue; // 不存在就试下一个
|
|
@@ -29,17 +34,106 @@ export function loadProjectMemory(cwd = process.cwd()) {
|
|
|
29
34
|
const content = trimmed.length > MAX_MEMORY_CHARS
|
|
30
35
|
? trimmed.slice(0, MAX_MEMORY_CHARS) + '\n…(记忆文件过长,已截断)'
|
|
31
36
|
: trimmed;
|
|
32
|
-
|
|
37
|
+
const file = displayDir ? `${displayDir}/${name}` : name;
|
|
38
|
+
return { scope, file, content };
|
|
33
39
|
}
|
|
34
40
|
return null;
|
|
35
41
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
/** 从 cwd 向上查找 git 仓库根(含 `.git` 的目录),找不到返回 null。 */
|
|
43
|
+
function findGitRoot(cwd) {
|
|
44
|
+
let dir = resolve(cwd);
|
|
45
|
+
while (true) {
|
|
46
|
+
if (existsSync(join(dir, '.git')))
|
|
47
|
+
return dir;
|
|
48
|
+
const parent = dirname(dir);
|
|
49
|
+
if (parent === dir)
|
|
50
|
+
return null; // 已到文件系统根
|
|
51
|
+
dir = parent;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** 读取项目根目录(cwd)的记忆文件。保留给单测/兼容使用。 */
|
|
55
|
+
export function loadProjectMemory(cwd = process.cwd()) {
|
|
56
|
+
return loadFrom(cwd, 'project', '');
|
|
57
|
+
}
|
|
58
|
+
/** 读取全局记忆文件(~/.ccli/)。 */
|
|
59
|
+
export function loadGlobalMemory() {
|
|
60
|
+
return loadFrom(join(homedir(), '.ccli'), 'global', '~/.ccli');
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 项目记忆(第 ② 层)应写入的文件路径:固定为 `<仓库根>/CCLI.md`,
|
|
64
|
+
* 找不到 git 根时退化为 `<cwd>/CCLI.md`。用于 `#` 动态写入。
|
|
65
|
+
*/
|
|
66
|
+
export function projectMemoryFile(cwd = process.cwd()) {
|
|
67
|
+
const dir = findGitRoot(cwd) ?? resolve(cwd);
|
|
68
|
+
return join(dir, 'CCLI.md');
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 把一条记忆追加进项目 `CCLI.md`(不存在则创建),立即生效。
|
|
72
|
+
* @returns 实际写入的文件路径。
|
|
73
|
+
*/
|
|
74
|
+
export function appendProjectMemory(note, cwd = process.cwd()) {
|
|
75
|
+
const file = projectMemoryFile(cwd);
|
|
76
|
+
let existing = '';
|
|
77
|
+
try {
|
|
78
|
+
existing = readFileSync(file, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// 文件不存在,按空处理,稍后创建
|
|
82
|
+
}
|
|
83
|
+
const body = note.replace(/\r\n/g, '\n').trim();
|
|
84
|
+
const glue = existing && !existing.endsWith('\n') ? '\n' : '';
|
|
85
|
+
writeFileSync(file, existing + glue + body + '\n', 'utf8');
|
|
86
|
+
return file;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 收集「项目根 → 子目录 → … → cwd」一路上的目录记忆(第 ② / ③ 层)。
|
|
90
|
+
*
|
|
91
|
+
* - 找到 git 根:仓库根目录记为 `project`,根到 cwd 之间的各级记为 `subdir`。
|
|
92
|
+
* - 找不到 git 根:只把 cwd 当作 `project`(和非 git 项目的旧行为一致)。
|
|
93
|
+
* - 返回顺序:根 → … → cwd(由远到近),便于后续按这个顺序注入。
|
|
94
|
+
*/
|
|
95
|
+
function loadProjectTree(cwd) {
|
|
96
|
+
const absCwd = resolve(cwd);
|
|
97
|
+
const root = findGitRoot(absCwd) ?? absCwd;
|
|
98
|
+
const rel = relative(root, absCwd);
|
|
99
|
+
const segments = rel === '' ? [] : rel.split(sep);
|
|
100
|
+
const dirs = [root];
|
|
101
|
+
let cur = root;
|
|
102
|
+
for (const seg of segments) {
|
|
103
|
+
cur = join(cur, seg);
|
|
104
|
+
dirs.push(cur);
|
|
105
|
+
}
|
|
106
|
+
const result = [];
|
|
107
|
+
for (const dir of dirs) {
|
|
108
|
+
const isRoot = dir === root;
|
|
109
|
+
const scope = isRoot ? 'project' : 'subdir';
|
|
110
|
+
const displayDir = isRoot
|
|
111
|
+
? ''
|
|
112
|
+
: relative(root, dir).split(sep).join('/');
|
|
113
|
+
const mem = loadFrom(dir, scope, displayDir);
|
|
114
|
+
if (mem)
|
|
115
|
+
result.push(mem);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 汇总各层记忆,按注入顺序返回:全局 → 项目根 → 子目录(由远到近)。
|
|
121
|
+
* 越靠近 cwd 越具体,放在后面——越靠近提示末尾,模型越重视。
|
|
122
|
+
*/
|
|
123
|
+
export function loadMemories(cwd = process.cwd()) {
|
|
124
|
+
return [loadGlobalMemory(), ...loadProjectTree(cwd)].filter((m) => m !== null);
|
|
125
|
+
}
|
|
126
|
+
export const SCOPE_LABEL = {
|
|
127
|
+
global: '全局记忆',
|
|
128
|
+
project: '项目记忆',
|
|
129
|
+
subdir: '子目录记忆',
|
|
130
|
+
};
|
|
131
|
+
/** 把各层记忆依次追加到 system 提示后面;无记忆则原样返回。 */
|
|
132
|
+
export function appendMemories(systemPrompt, memories) {
|
|
133
|
+
if (memories.length === 0)
|
|
39
134
|
return systemPrompt;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
memory.content);
|
|
135
|
+
const blocks = memories.map((m) => `# ${SCOPE_LABEL[m.scope]}(来自 ${m.file})\n` +
|
|
136
|
+
`以下是需要在本次会话中遵循的说明与约定:\n\n${m.content}`);
|
|
137
|
+
return `${systemPrompt}\n\n${blocks.join('\n\n')}`;
|
|
44
138
|
}
|
|
45
139
|
//# sourceMappingURL=memory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/config/memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/config/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ import { startRepl } from './cli/repl/index.js';
|
|
|
18
18
|
import { style } from './cli/style.js';
|
|
19
19
|
import { printConfig, loadConfig, getRolePrompt, DEFAULT_SYSTEM_PROMPT, } from './config/config.js';
|
|
20
20
|
import { loadEnvFile } from './config/env.js';
|
|
21
|
-
import {
|
|
21
|
+
import { loadMemories, appendMemories } from './config/memory.js';
|
|
22
22
|
import { createAIClient } from './agent/ai.js';
|
|
23
23
|
import { McpClientManager } from './agent/mcp.js';
|
|
24
24
|
import { runOnce } from './cli/run/index.js';
|
|
@@ -100,7 +100,7 @@ async function main() {
|
|
|
100
100
|
const rolePrompt = args.role
|
|
101
101
|
? getRolePrompt(args.role, config.roles)
|
|
102
102
|
: undefined;
|
|
103
|
-
const systemPrompt =
|
|
103
|
+
const systemPrompt = appendMemories(rolePrompt ?? DEFAULT_SYSTEM_PROMPT, loadMemories(process.cwd()));
|
|
104
104
|
if (args.role &&
|
|
105
105
|
rolePrompt === undefined &&
|
|
106
106
|
args.role !== 'default') {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACH,WAAW,EACX,UAAU,EACV,aAAa,EACb,qBAAqB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 后台 bash 进程管理。
|
|
3
|
+
*
|
|
4
|
+
* 普通 bash 工具同步等待命令结束;长跑进程(dev server / watch / MCP server)
|
|
5
|
+
* 会因此卡住,直到超时被杀。这里把进程放到后台:spawn 后立即返回一个 id,
|
|
6
|
+
* 调用方可继续做事,随时用 bash_output 读取累计输出、查状态,用 kill_bash
|
|
7
|
+
* 主动终止。
|
|
8
|
+
*
|
|
9
|
+
* 进程表驻留在模块内存里,随进程退出而清空(不持久化)。
|
|
10
|
+
*/
|
|
11
|
+
import { spawn } from 'node:child_process';
|
|
12
|
+
/** 单个进程 stdout/stderr 各自保留的尾部上限,避免长跑输出撑爆内存。 */
|
|
13
|
+
const MAX_BUF = 30_000;
|
|
14
|
+
/** 被信号终止时换算成的退出码(shell 惯例:128 + 信号序号)。 */
|
|
15
|
+
const SIGNAL_EXIT = {
|
|
16
|
+
SIGINT: 130,
|
|
17
|
+
SIGTERM: 143,
|
|
18
|
+
SIGKILL: 137,
|
|
19
|
+
};
|
|
20
|
+
const processes = new Map();
|
|
21
|
+
let counter = 0;
|
|
22
|
+
function append(buf, chunk) {
|
|
23
|
+
const next = buf + chunk.toString();
|
|
24
|
+
// 只保留尾部:长跑进程最新输出在末尾最有价值。
|
|
25
|
+
return next.length > MAX_BUF ? next.slice(-MAX_BUF) : next;
|
|
26
|
+
}
|
|
27
|
+
function toInfo(p) {
|
|
28
|
+
return {
|
|
29
|
+
id: p.id,
|
|
30
|
+
command: p.command,
|
|
31
|
+
status: p.status,
|
|
32
|
+
exitCode: p.exitCode,
|
|
33
|
+
stdout: p.stdout,
|
|
34
|
+
stderr: p.stderr,
|
|
35
|
+
startedAt: p.startedAt,
|
|
36
|
+
endedAt: p.endedAt,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** 后台启动一条命令,立即返回进程快照(不等待结束)。 */
|
|
40
|
+
export function startBackground(command) {
|
|
41
|
+
const id = `bg_${++counter}`;
|
|
42
|
+
const shell = process.env.SHELL || '/bin/bash';
|
|
43
|
+
const child = spawn(shell, ['-c', command], {
|
|
44
|
+
cwd: process.cwd(),
|
|
45
|
+
env: process.env,
|
|
46
|
+
});
|
|
47
|
+
const proc = {
|
|
48
|
+
id,
|
|
49
|
+
command,
|
|
50
|
+
status: 'running',
|
|
51
|
+
exitCode: null,
|
|
52
|
+
stdout: '',
|
|
53
|
+
stderr: '',
|
|
54
|
+
startedAt: Date.now(),
|
|
55
|
+
endedAt: null,
|
|
56
|
+
child,
|
|
57
|
+
};
|
|
58
|
+
processes.set(id, proc);
|
|
59
|
+
child.stdout?.on('data', (d) => {
|
|
60
|
+
proc.stdout = append(proc.stdout, d);
|
|
61
|
+
});
|
|
62
|
+
child.stderr?.on('data', (d) => {
|
|
63
|
+
proc.stderr = append(proc.stderr, d);
|
|
64
|
+
});
|
|
65
|
+
child.on('error', () => {
|
|
66
|
+
proc.status = 'error';
|
|
67
|
+
proc.endedAt = Date.now();
|
|
68
|
+
});
|
|
69
|
+
child.on('close', (code, signal) => {
|
|
70
|
+
proc.status = 'done';
|
|
71
|
+
proc.exitCode = code ?? (signal ? SIGNAL_EXIT[signal] ?? null : null);
|
|
72
|
+
proc.endedAt = Date.now();
|
|
73
|
+
});
|
|
74
|
+
return toInfo(proc);
|
|
75
|
+
}
|
|
76
|
+
/** 取单个进程快照。 */
|
|
77
|
+
export function getBackground(id) {
|
|
78
|
+
const p = processes.get(id);
|
|
79
|
+
return p ? toInfo(p) : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** 列出全部后台进程快照。 */
|
|
82
|
+
export function listBackground() {
|
|
83
|
+
return [...processes.values()].map(toInfo);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 终止指定后台进程:先发 SIGTERM 让其优雅退出,1 秒内仍未 close 再 SIGKILL 兜底。
|
|
87
|
+
* 返回 'killed'(已发信号)/ 'not_running'(已结束)/ 'not_found'(无此 id)。
|
|
88
|
+
*/
|
|
89
|
+
export function killBackground(id) {
|
|
90
|
+
const p = processes.get(id);
|
|
91
|
+
if (!p)
|
|
92
|
+
return 'not_found';
|
|
93
|
+
if (p.status !== 'running')
|
|
94
|
+
return 'not_running';
|
|
95
|
+
try {
|
|
96
|
+
p.child.kill('SIGTERM');
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return 'not_running';
|
|
100
|
+
}
|
|
101
|
+
const timer = setTimeout(() => {
|
|
102
|
+
if (p.status === 'running') {
|
|
103
|
+
try {
|
|
104
|
+
p.child.kill('SIGKILL');
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// 进程可能已退出,忽略。
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, 1000);
|
|
111
|
+
// 不让兜底定时器单独阻止 Node 进程退出。
|
|
112
|
+
timer.unref?.();
|
|
113
|
+
return 'killed';
|
|
114
|
+
}
|
|
115
|
+
/** 仅供测试:杀掉所有后台进程并清空表,避免事件循环被句柄挂着不退出。 */
|
|
116
|
+
export function resetBackground() {
|
|
117
|
+
for (const p of processes.values()) {
|
|
118
|
+
try {
|
|
119
|
+
p.child.kill('SIGKILL');
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// 进程可能已退出,忽略。
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
processes.clear();
|
|
126
|
+
counter = 0;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=bash-background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-background.js","sourceRoot":"","sources":["../../src/tools/bash-background.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bash_output 工具 —— 读取后台 bash 进程的累计输出与状态。
|
|
3
|
+
*
|
|
4
|
+
* 配合 `bash` 的 background: true 使用:后台启动拿到 id 后,随时用本工具
|
|
5
|
+
* 查看进程还在不在跑、有没有退出码、目前累计的 stdout/stderr。
|
|
6
|
+
* 只读,无副作用,不需要用户确认。
|
|
7
|
+
*/
|
|
8
|
+
import { getBackground, listBackground } from './bash-background.js';
|
|
9
|
+
function formatDurationMs(ms) {
|
|
10
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
11
|
+
}
|
|
12
|
+
export const bashOutputTool = {
|
|
13
|
+
name: 'bash_output',
|
|
14
|
+
description: '查看后台 bash 进程的累计输出与状态。' +
|
|
15
|
+
'传入 bash 后台模式返回的 id;可反复调用以观察进展。' +
|
|
16
|
+
'只读操作,不会修改任何状态。',
|
|
17
|
+
parameters: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
id: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: '后台进程 id(bash background 模式返回的 bg_1 之类)',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['id'],
|
|
26
|
+
},
|
|
27
|
+
async run({ id }) {
|
|
28
|
+
const proc = getBackground(String(id || ''));
|
|
29
|
+
if (!proc) {
|
|
30
|
+
const ids = listBackground()
|
|
31
|
+
.map((p) => p.id)
|
|
32
|
+
.join(', ');
|
|
33
|
+
return `错误:未找到后台进程 ${id}。当前后台进程:${ids || '(无)'}`;
|
|
34
|
+
}
|
|
35
|
+
const ended = proc.endedAt ?? Date.now();
|
|
36
|
+
const duration = formatDurationMs(ended - proc.startedAt);
|
|
37
|
+
const exitNote = proc.exitCode !== null ? `(退出码 ${proc.exitCode})` : '';
|
|
38
|
+
const combined = [proc.stdout, proc.stderr].filter(Boolean).join('\n');
|
|
39
|
+
const body = combined.trim() || '(暂无输出)';
|
|
40
|
+
return (`[${proc.id}] 状态:${proc.status}${exitNote} 运行:${duration}\n` +
|
|
41
|
+
`命令:${proc.command}\n` +
|
|
42
|
+
`--- 输出 ---\n${body}`);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=bash-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-output.js","sourceRoot":"","sources":["../../src/tools/bash-output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGrE,SAAS,gBAAgB,CAAC,EAAU;IAChC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAS;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EACP,uBAAuB;QACvB,gCAAgC;QAChC,gBAAgB;IACpB,UAAU,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,EAAE,EAAE;gBACA,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wCAAwC;aACxD;SACJ;QACD,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAkB;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,GAAG,GAAG,cAAc,EAAE;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,cAAc,EAAE,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC;QAEzC,OAAO,CACH,IAAI,IAAI,CAAC,EAAE,QAAQ,IAAI,CAAC,MAAM,GAAG,QAAQ,QAAQ,QAAQ,IAAI;YAC7D,MAAM,IAAI,CAAC,OAAO,IAAI;YACtB,eAAe,IAAI,EAAE,CACxB,CAAC;IACN,CAAC;CACJ,CAAC"}
|
package/dist/tools/bash.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import { startBackground } from './bash-background.js';
|
|
2
3
|
/** bash 默认超时 120s,最大 600s。 */
|
|
3
4
|
const BASH_DEFAULT_TIMEOUT = 120_000;
|
|
4
5
|
const BASH_MAX_TIMEOUT = 600_000;
|
|
@@ -8,7 +9,9 @@ export const bashTool = {
|
|
|
8
9
|
name: 'bash',
|
|
9
10
|
description: '在当前工作目录执行 shell 命令。用于运行测试、构建、git、安装依赖等。' +
|
|
10
11
|
'不要用它读写文件——请用 read_file / write_file。避免交互式命令。' +
|
|
11
|
-
'执行前会请用户确认。'
|
|
12
|
+
'执行前会请用户确认。' +
|
|
13
|
+
'设置 background: true 可在后台启动长跑进程(如 dev server),立即返回 id,' +
|
|
14
|
+
'之后用 bash_output 查看输出与状态。',
|
|
12
15
|
parameters: {
|
|
13
16
|
type: 'object',
|
|
14
17
|
properties: {
|
|
@@ -22,7 +25,11 @@ export const bashTool = {
|
|
|
22
25
|
},
|
|
23
26
|
timeout: {
|
|
24
27
|
type: 'integer',
|
|
25
|
-
description: `超时毫秒数(默认 ${BASH_DEFAULT_TIMEOUT},最大 ${BASH_MAX_TIMEOUT}
|
|
28
|
+
description: `超时毫秒数(默认 ${BASH_DEFAULT_TIMEOUT},最大 ${BASH_MAX_TIMEOUT};后台模式忽略)`,
|
|
29
|
+
},
|
|
30
|
+
background: {
|
|
31
|
+
type: 'boolean',
|
|
32
|
+
description: '为 true 时在后台启动长跑进程并立即返回 id(默认 false,同步等待结束)',
|
|
26
33
|
},
|
|
27
34
|
},
|
|
28
35
|
required: ['command'],
|
|
@@ -34,10 +41,15 @@ export const bashTool = {
|
|
|
34
41
|
lines.push(`说明:${description}`);
|
|
35
42
|
return lines.join('\n');
|
|
36
43
|
},
|
|
37
|
-
async run({ command, timeout, }) {
|
|
44
|
+
async run({ command, timeout, background, }) {
|
|
38
45
|
const cmd = String(command || '');
|
|
39
46
|
if (!cmd)
|
|
40
47
|
return '错误:command 不能为空';
|
|
48
|
+
if (background) {
|
|
49
|
+
const proc = startBackground(cmd);
|
|
50
|
+
return (`已在后台启动(id: ${proc.id})。\n` +
|
|
51
|
+
`用 bash_output({"id":"${proc.id}"}) 查看输出与状态;长跑进程不会被超时终止。`);
|
|
52
|
+
}
|
|
41
53
|
const limit = Math.min(Math.max(1, timeout ?? BASH_DEFAULT_TIMEOUT), BASH_MAX_TIMEOUT);
|
|
42
54
|
const shell = process.env.SHELL || '/bin/bash';
|
|
43
55
|
return new Promise((resolve) => {
|
package/dist/tools/bash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* 模型据此决定「要不要调用、传什么参数」;我们负责真正执行并把结果回传。
|
|
6
6
|
*
|
|
7
7
|
* 工具分两类:
|
|
8
|
-
* 只读勘探(无副作用,直接放行):read_file / list_dir / grep
|
|
8
|
+
* 只读勘探(无副作用,直接放行):read_file / list_dir / grep / bash_output
|
|
9
9
|
* 有副作用(执行前需用户确认):write_file / edit_file / bash
|
|
10
10
|
*
|
|
11
11
|
* 此外,通过 MCP (Model Context Protocol) 接入的外部工具名以 `mcp__` 开头。
|
|
12
|
+
* 后台长跑进程由 bash(background:true) / bash_output / kill_bash 三件套管理。
|
|
12
13
|
*/
|
|
13
14
|
import { readFileTool } from './read-file.js';
|
|
14
15
|
import { listDirTool } from './list-dir.js';
|
|
@@ -16,6 +17,8 @@ import { grepTool } from './grep.js';
|
|
|
16
17
|
import { writeFileTool } from './write-file.js';
|
|
17
18
|
import { editFileTool } from './edit-file.js';
|
|
18
19
|
import { bashTool } from './bash.js';
|
|
20
|
+
import { bashOutputTool } from './bash-output.js';
|
|
21
|
+
import { killBashTool } from './kill-bash.js';
|
|
19
22
|
/** 内置工具集合。 */
|
|
20
23
|
const builtinTools = [
|
|
21
24
|
readFileTool,
|
|
@@ -24,6 +27,8 @@ const builtinTools = [
|
|
|
24
27
|
writeFileTool,
|
|
25
28
|
editFileTool,
|
|
26
29
|
bashTool,
|
|
30
|
+
bashOutputTool,
|
|
31
|
+
killBashTool,
|
|
27
32
|
];
|
|
28
33
|
/** 当前已注册的工具(内置 + MCP)。 */
|
|
29
34
|
let tools = [...builtinTools];
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,cAAc;AACd,MAAM,YAAY,GAAW;IACzB,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,cAAc;IACd,YAAY;CACf,CAAC;AAEF,0BAA0B;AAC1B,IAAI,KAAK,GAAW,CAAC,GAAG,YAAY,CAAC,CAAC;AAEtC,8CAA8C;AAC9C,IAAI,UAAU,GAA4B,IAAI,CAAC;AAE/C,uBAAuB;AACvB,MAAM,UAAU,UAAU;IACtB,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;IAC1B,UAAU,GAAG,IAAI,CAAC;AACtB,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACvD,MAAM,MAAM,GAAG,QAAQ,UAAU,IAAI,CAAC;IACtC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,qBAAqB;IACjC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;AAC9B,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAyB;IAC5D,UAAU,GAAG,OAAO,CAAC;IACrB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,OAAO,GAAS;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,IAAI,EAAE,oBAAoB;YACxC,OAAO,EAAE,CAAC,IAAS,EAAE,EAAE;gBACnB,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,YAAY,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtF,CAAC;YACD,GAAG,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;gBACrB,IAAI,CAAC,UAAU,EAAE,CAAC;oBACd,OAAO,sBAAsB,CAAC;gBAClC,CAAC;gBACD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;SACJ,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACL,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,OAAO,CAAC,IAAY;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,QAAQ;IACpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,UAAmB;QACzB,QAAQ,EAAE;YACN,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;SAC3B;KACJ,CAAC,CAAC,CAAC;AACR,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,IAAY,EACZ,QAAgB;IAEhB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,IAAI,EAAE,CAAC;IAEpC,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,kBAAkB,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kill_bash 工具 —— 终止后台 bash 进程。
|
|
3
|
+
*
|
|
4
|
+
* 配合 `bash` 的 background: true 使用:后台启动拿到 id 后,可用本工具主动
|
|
5
|
+
* 结束长跑进程(dev server / watch 等)。先发 SIGTERM 让其优雅退出,1 秒内
|
|
6
|
+
* 仍未 close 再 SIGKILL 兜底。终止本会话自己启动的后台进程,不需要用户确认。
|
|
7
|
+
*/
|
|
8
|
+
import { getBackground, killBackground, listBackground, } from './bash-background.js';
|
|
9
|
+
export const killBashTool = {
|
|
10
|
+
name: 'kill_bash',
|
|
11
|
+
description: '终止一个后台 bash 进程。传入 bash 后台模式返回的 id;' +
|
|
12
|
+
'先发送 SIGTERM,1 秒内未退出再 SIGKILL 兜底。' +
|
|
13
|
+
'进程已结束或 id 不存在时返回提示。',
|
|
14
|
+
parameters: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
id: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: '要终止的后台进程 id(bg_1 之类)',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ['id'],
|
|
23
|
+
},
|
|
24
|
+
async run({ id }) {
|
|
25
|
+
const key = String(id || '');
|
|
26
|
+
const result = killBackground(key);
|
|
27
|
+
if (result === 'not_found') {
|
|
28
|
+
const ids = listBackground()
|
|
29
|
+
.map((p) => p.id)
|
|
30
|
+
.join(', ');
|
|
31
|
+
return `错误:未找到后台进程 ${key}。当前后台进程:${ids || '(无)'}`;
|
|
32
|
+
}
|
|
33
|
+
if (result === 'not_running') {
|
|
34
|
+
const proc = getBackground(key);
|
|
35
|
+
return `[${key}] 已不在运行(状态:${proc?.status ?? '未知'}),无需终止。`;
|
|
36
|
+
}
|
|
37
|
+
return (`已发送终止信号给 [${key}](先 SIGTERM,1 秒内未退出再 SIGKILL)。\n` +
|
|
38
|
+
`用 bash_output({"id":"${key}"}) 确认进程已退出。`);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=kill-bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kill-bash.js","sourceRoot":"","sources":["../../src/tools/kill-bash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,aAAa,EACb,cAAc,EACd,cAAc,GACjB,MAAM,sBAAsB,CAAC;AAG9B,MAAM,CAAC,MAAM,YAAY,GAAS;IAC9B,IAAI,EAAE,WAAW;IACjB,WAAW,EACP,oCAAoC;QACpC,kCAAkC;QAClC,qBAAqB;IACzB,UAAU,EAAE;QACR,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACR,EAAE,EAAE;gBACA,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACtC;SACJ;QACD,QAAQ,EAAE,CAAC,IAAI,CAAC;KACnB;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAkB;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,cAAc,EAAE;iBACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChB,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,OAAO,cAAc,GAAG,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QACtD,CAAC;QACD,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,IAAI,GAAG,cAAc,IAAI,EAAE,MAAM,IAAI,IAAI,SAAS,CAAC;QAC9D,CAAC;QACD,OAAO,CACH,aAAa,GAAG,kCAAkC;YAClD,wBAAwB,GAAG,cAAc,CAC5C,CAAC;IACN,CAAC;CACJ,CAAC"}
|