sema-core 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/Conversation.d.ts.map +1 -1
- package/dist/core/Conversation.js +3 -0
- package/dist/core/Conversation.js.map +1 -1
- package/dist/core/SemaCore.d.ts.map +1 -1
- package/dist/core/SemaCore.js +10 -2
- package/dist/core/SemaCore.js.map +1 -1
- package/dist/core/SemaEngine.d.ts +7 -1
- package/dist/core/SemaEngine.d.ts.map +1 -1
- package/dist/core/SemaEngine.js +94 -23
- package/dist/core/SemaEngine.js.map +1 -1
- package/dist/core/SemaSession.d.ts +2 -1
- package/dist/core/SemaSession.d.ts.map +1 -1
- package/dist/core/SemaSession.js +2 -2
- package/dist/core/SemaSession.js.map +1 -1
- package/dist/events/types.d.ts +2 -0
- package/dist/events/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/manager/ConfManager.d.ts.map +1 -1
- package/dist/manager/ConfManager.js +7 -0
- package/dist/manager/ConfManager.js.map +1 -1
- package/dist/manager/PermissionManager.d.ts.map +1 -1
- package/dist/manager/PermissionManager.js +101 -48
- package/dist/manager/PermissionManager.js.map +1 -1
- package/dist/manager/StateManager.d.ts +12 -1
- package/dist/manager/StateManager.d.ts.map +1 -1
- package/dist/manager/StateManager.js +18 -0
- package/dist/manager/StateManager.js.map +1 -1
- package/dist/prompt/permission.d.ts +1 -2
- package/dist/prompt/permission.d.ts.map +1 -1
- package/dist/prompt/permission.js +43 -65
- package/dist/prompt/permission.js.map +1 -1
- package/dist/prompt/system.d.ts +1 -1
- package/dist/prompt/system.d.ts.map +1 -1
- package/dist/prompt/system.js +1 -1
- package/dist/prompt/tools/runShell.d.ts.map +1 -1
- package/dist/prompt/tools/runShell.js +3 -2
- package/dist/prompt/tools/runShell.js.map +1 -1
- package/dist/tools/ViewFile.d.ts +13 -3
- package/dist/tools/ViewFile.d.ts.map +1 -1
- package/dist/tools/ViewFile.js +9 -0
- package/dist/tools/ViewFile.js.map +1 -1
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/message.d.ts +5 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/util/autoRunContext.d.ts +21 -0
- package/dist/util/autoRunContext.d.ts.map +1 -0
- package/dist/util/autoRunContext.js +121 -0
- package/dist/util/autoRunContext.js.map +1 -0
- package/dist/util/inputQueue.d.ts +2 -0
- package/dist/util/inputQueue.d.ts.map +1 -1
- package/dist/util/inputQueue.js.map +1 -1
- package/dist/util/message.d.ts.map +1 -1
- package/dist/util/message.js +29 -1
- package/dist/util/message.js.map +1 -1
- package/dist/util/shellSafety.d.ts.map +1 -1
- package/dist/util/shellSafety.js +88 -1
- package/dist/util/shellSafety.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.summarizeActionLine = summarizeActionLine;
|
|
4
|
+
exports.extractAutoRunContext = extractAutoRunContext;
|
|
5
|
+
const file_1 = require("./file");
|
|
6
|
+
const define_1 = require("../prompt/define");
|
|
7
|
+
const tool_1 = require("../prompt/tool");
|
|
8
|
+
// 参数值截断上限:命令 / prompt 可能很长,截断避免压缩后的上下文再度膨胀
|
|
9
|
+
const MAX_VALUE_LEN = 300;
|
|
10
|
+
// 保留紧凑摘要的编辑类工具(只取文件路径,内容对安全判断权重低)
|
|
11
|
+
const EDIT_TOOL_NAMES = new Set([
|
|
12
|
+
tool_1.TOOL_NAME_WRITE_FILE,
|
|
13
|
+
tool_1.TOOL_NAME_PATCH_FILE,
|
|
14
|
+
tool_1.TOOL_NAME_EDIT_NOTEBOOK,
|
|
15
|
+
]);
|
|
16
|
+
function truncate(value, max = MAX_VALUE_LEN) {
|
|
17
|
+
const t = value.trim();
|
|
18
|
+
return t.length > max ? `${t.slice(0, max)}…` : t;
|
|
19
|
+
}
|
|
20
|
+
// 剥掉 <reminder-sys>…</reminder-sys> 包裹的内容(含标签,跨行)。
|
|
21
|
+
// 环境/规则/文件引用/中途注入提示等都被包在这里,对"下一步动作是否安全"是噪声。
|
|
22
|
+
function stripReminderSys(text) {
|
|
23
|
+
const re = new RegExp(`${define_1.REMINDER_SYS_OPEN}[\\s\\S]*?${define_1.REMINDER_SYS_CLOSE}`, 'g');
|
|
24
|
+
return text.replace(re, '');
|
|
25
|
+
}
|
|
26
|
+
function safeStringify(input) {
|
|
27
|
+
try {
|
|
28
|
+
return JSON.stringify(input) ?? '';
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return '(unserializable)';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 把「有副作用/轨迹价值」的三类工具概括成一行;非这三类返回 null。
|
|
35
|
+
// 历史提取与待判断动作共用同一套紧凑格式,保证模型看到的行文一致。
|
|
36
|
+
function compactSideEffectLine(name, input) {
|
|
37
|
+
// run_shell:安全闸门最核心的对象,前序命令构成"轨迹",保留完整命令
|
|
38
|
+
if (name === tool_1.TOOL_NAME_RUN_SHELL) {
|
|
39
|
+
const command = truncate(String(input.command ?? ''));
|
|
40
|
+
return command ? `${tool_1.TOOL_NAME_RUN_SHELL} ${command}` : null;
|
|
41
|
+
}
|
|
42
|
+
// fetch_url:外连轨迹(数据外泄/内网访问是明确 risky 类别)
|
|
43
|
+
if (name === tool_1.TOOL_NAME_FETCH_URL) {
|
|
44
|
+
const url = String(input.url ?? '').trim();
|
|
45
|
+
if (!url)
|
|
46
|
+
return null;
|
|
47
|
+
const prompt = truncate(String(input.prompt ?? ''));
|
|
48
|
+
return prompt ? `${tool_1.TOOL_NAME_FETCH_URL} ${url}: ${prompt}` : `${tool_1.TOOL_NAME_FETCH_URL} ${url}`;
|
|
49
|
+
}
|
|
50
|
+
// 编辑/创建类:只取文件路径(判断项目内外 / 系统文件)
|
|
51
|
+
if (EDIT_TOOL_NAMES.has(name)) {
|
|
52
|
+
const filePath = (0, file_1.getFilePath)(input);
|
|
53
|
+
return filePath ? `${name} ${filePath}` : null;
|
|
54
|
+
}
|
|
55
|
+
// 其余(view_file / search_* / todo / cron 等只读或无副作用工具)丢弃
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
// 历史中的 tool_use:仅保留三类紧凑行,其余丢弃
|
|
59
|
+
function summarizeToolUse(block) {
|
|
60
|
+
return compactSideEffectLine(block.name, (block.input || {}));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 待判断动作的一行紧凑摘要,与历史行同格式(run_shell <command> / fetch_url <url>: <prompt>
|
|
64
|
+
* / <editTool> <path>)。三类之外的工具(skill/mcp/其它)用紧凑兜底,保证任意动作都有可读描述。
|
|
65
|
+
*/
|
|
66
|
+
function summarizeActionLine(name, input) {
|
|
67
|
+
const line = compactSideEffectLine(name, input);
|
|
68
|
+
if (line)
|
|
69
|
+
return line;
|
|
70
|
+
return `${name} ${safeStringify(input)}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 将会话历史压缩成一串纯 text 块,供 AutoRun 安全判断作为上下文。
|
|
74
|
+
*
|
|
75
|
+
* 只保留两类信号:
|
|
76
|
+
* 1) 用户输入文本(剥掉 reminder-sys 包裹的内容)
|
|
77
|
+
* 2) run_shell / fetch_url / 编辑工具的紧凑摘要(tool_use)
|
|
78
|
+
*
|
|
79
|
+
* 丢弃:tool_result(工具执行结果)、assistant 文本 / 思考、图片、其余只读工具的 tool_use。
|
|
80
|
+
* 保持原始时间顺序,一条 assistant 里多个 tool_use 会展开成多行。
|
|
81
|
+
*/
|
|
82
|
+
function extractAutoRunContext(messages) {
|
|
83
|
+
const blocks = [];
|
|
84
|
+
const pushUserText = (raw) => {
|
|
85
|
+
const text = stripReminderSys(raw).trim();
|
|
86
|
+
if (text)
|
|
87
|
+
blocks.push({ type: 'text', text: `User: ${text}` });
|
|
88
|
+
};
|
|
89
|
+
for (const msg of messages) {
|
|
90
|
+
const content = msg.message.content;
|
|
91
|
+
if (msg.type === 'user') {
|
|
92
|
+
if (typeof content === 'string') {
|
|
93
|
+
pushUserText(content);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// 含 tool_result 的 user 消息是「工具结果载体」(合成消息):其 text 块要么是工具追加块
|
|
97
|
+
// (如 skill 载入的整段提示词),要么是注入提醒,均非真实用户输入 → 整条跳过。
|
|
98
|
+
// 真实用户输入消息不含 tool_result,不受影响。
|
|
99
|
+
if (content.some(b => b.type === 'tool_result'))
|
|
100
|
+
continue;
|
|
101
|
+
// 用户消息:只取 text 块(剥 reminder-sys),丢弃 image 等
|
|
102
|
+
for (const b of content) {
|
|
103
|
+
if (b.type === 'text')
|
|
104
|
+
pushUserText(b.text);
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// assistant 消息:只取 tool_use 块,丢弃 text / thinking
|
|
109
|
+
if (typeof content === 'string')
|
|
110
|
+
continue;
|
|
111
|
+
for (const b of content) {
|
|
112
|
+
if (b.type !== 'tool_use')
|
|
113
|
+
continue;
|
|
114
|
+
const line = summarizeToolUse(b);
|
|
115
|
+
if (line)
|
|
116
|
+
blocks.push({ type: 'text', text: line });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return blocks;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=autoRunContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoRunContext.js","sourceRoot":"","sources":["../../src/util/autoRunContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 输入队列批处理工具
|
|
3
3
|
*/
|
|
4
|
+
import type { InputImageAttachment } from '../types/message';
|
|
4
5
|
type InputItem = {
|
|
5
6
|
inputId: string;
|
|
6
7
|
input: string;
|
|
7
8
|
originalInput?: string;
|
|
8
9
|
silent?: boolean;
|
|
10
|
+
attachments?: InputImageAttachment[];
|
|
9
11
|
};
|
|
10
12
|
/**
|
|
11
13
|
* 从待处理队列中取出下一批输入
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputQueue.d.ts","sourceRoot":"","sources":["../../src/util/inputQueue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"inputQueue.d.ts","sourceRoot":"","sources":["../../src/util/inputQueue.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAE5D,KAAK,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEnI;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAiB/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputQueue.js","sourceRoot":"","sources":["../../src/util/inputQueue.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"inputQueue.js","sourceRoot":"","sources":["../../src/util/inputQueue.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAaH,sCAiBC;AAxBD;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,OAAoB;IAChD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,cAAc;IACd,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,aAAa;IACb,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IACtE,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,YAAY;QACZ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAED,gBAAgB;IAChB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/util/message.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAGzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAMzC,eAAO,MAAM,iBAAiB,kCAAkC,CAAA;AAChE,eAAO,MAAM,kBAAkB,mCACG,CAAA;AAClC,eAAO,MAAM,UAAU,2EAA2E,CAAA;AAClG,eAAO,MAAM,UAAU,2EAA2E,CAAA;AAGlG,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,eAAO,MAAM,cAAc,cAAc,CAAA;AAKzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAGD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,iBAAiB,EAAE,EAC/C,aAAa,CAAC,EAAE,iBAAiB,EACjC,aAAa,CAAC,EAAE,iBAAiB,GAChC,OAAO,CAQT;AAGD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAC9C,cAAc,EAAE,OAAO,EAAE,EACzB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,OAAe,GAC5B,SAAS,CAAC,iBAAiB,EAAE,CA6B/B;
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/util/message.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAGzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAMzC,eAAO,MAAM,iBAAiB,kCAAkC,CAAA;AAChE,eAAO,MAAM,kBAAkB,mCACG,CAAA;AAClC,eAAO,MAAM,UAAU,2EAA2E,CAAA;AAClG,eAAO,MAAM,UAAU,2EAA2E,CAAA;AAGlG,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,eAAO,MAAM,cAAc,cAAc,CAAA;AAKzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAGD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,iBAAiB,EAAE,EAC/C,aAAa,CAAC,EAAE,iBAAiB,EACjC,aAAa,CAAC,EAAE,iBAAiB,GAChC,OAAO,CAQT;AAGD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,eAAe,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAC9C,cAAc,EAAE,OAAO,EAAE,EACzB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,OAAe,GAC5B,SAAS,CAAC,iBAAiB,EAAE,CA6B/B;AAuBD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EAAE,GAClB,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,CAkHzB"}
|
package/dist/util/message.js
CHANGED
|
@@ -64,6 +64,23 @@ function buildAdditionalReminders(systemReminders, messageHistory, agentMode, se
|
|
|
64
64
|
}
|
|
65
65
|
return reminders;
|
|
66
66
|
}
|
|
67
|
+
// 将 user 消息内容中的 tool_result 块统一排到最前面(稳定排序)
|
|
68
|
+
// Anthropic API 要求:assistant 有多个 tool_use 时,下一条 user 消息里所有 tool_result
|
|
69
|
+
// 必须连续排在最前面。若中间夹入 text 等其它块(如 skill 的 additionalBlocks),
|
|
70
|
+
// 合并后会打断 tool_result 的连续性,导致 400 "tool_use ids were found without
|
|
71
|
+
// tool_result blocks immediately after"
|
|
72
|
+
function reorderToolResultsFirst(content) {
|
|
73
|
+
if (!Array.isArray(content))
|
|
74
|
+
return content;
|
|
75
|
+
const hasToolResult = content.some(block => block.type === 'tool_result');
|
|
76
|
+
const hasOther = content.some(block => block.type !== 'tool_result');
|
|
77
|
+
// 无需重排:没有 tool_result,或全是 tool_result
|
|
78
|
+
if (!hasToolResult || !hasOther)
|
|
79
|
+
return content;
|
|
80
|
+
const toolResults = content.filter(block => block.type === 'tool_result');
|
|
81
|
+
const others = content.filter(block => block.type !== 'tool_result');
|
|
82
|
+
return [...toolResults, ...others];
|
|
83
|
+
}
|
|
67
84
|
// 处理消息规范化:删除空assistant消息,合并连续user消息,处理空tool_use
|
|
68
85
|
function prepareMessagesForApi(messages) {
|
|
69
86
|
const result = [];
|
|
@@ -157,6 +174,17 @@ function prepareMessagesForApi(messages) {
|
|
|
157
174
|
}
|
|
158
175
|
}
|
|
159
176
|
});
|
|
160
|
-
|
|
177
|
+
// 最终归一化:确保每条 user 消息里的 tool_result 块都排在最前面
|
|
178
|
+
return result.map(message => {
|
|
179
|
+
if (message.type !== 'user')
|
|
180
|
+
return message;
|
|
181
|
+
const reordered = reorderToolResultsFirst(message.message.content);
|
|
182
|
+
if (reordered === message.message.content)
|
|
183
|
+
return message;
|
|
184
|
+
return {
|
|
185
|
+
...message,
|
|
186
|
+
message: { ...message.message, content: reordered },
|
|
187
|
+
};
|
|
188
|
+
});
|
|
161
189
|
}
|
|
162
190
|
//# sourceMappingURL=message.js.map
|
package/dist/util/message.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/util/message.ts"],"names":[],"mappings":";;;AAiBA,4DAEC;AAOD,oDAEC;AAGD,oCAYC;AAMD,4DAmCC;
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/util/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellSafety.d.ts","sourceRoot":"","sources":["../../src/util/shellSafety.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shellSafety.d.ts","sourceRoot":"","sources":["../../src/util/shellSafety.ts"],"names":[],"mappings":"AAyGA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOvD;AAqBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ5D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAeD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAW9D"}
|
package/dist/util/shellSafety.js
CHANGED
|
@@ -18,9 +18,89 @@ const DANGEROUS_FIND_FLAGS = /(^|\s)-(exec(dir)?|ok(dir)?|delete|fprintf?|fls)\b
|
|
|
18
18
|
const SAFE_FULL_COMMANDS = new Set([
|
|
19
19
|
'git status', 'git diff', 'git log', 'git branch',
|
|
20
20
|
]);
|
|
21
|
+
// git 只读子命令:仅输出、不改动仓库/工作区。带这些子命令的 git 命令可直接放行
|
|
22
|
+
// (仍需通过下方 DANGEROUS_GIT_FLAGS 兜底)。
|
|
23
|
+
// 刻意排除 config / tag / branch / remote / stash 等——它们带参数即可写(如
|
|
24
|
+
// `git config k v`、`git tag x`、`git branch -D`、`git remote add`),无法只看子命令放行。
|
|
25
|
+
// 刻意排除 help——它会拉起 man/pager/浏览器(git help -w),属同类外部命令向量。
|
|
26
|
+
const READONLY_GIT_SUBCOMMANDS = new Set([
|
|
27
|
+
'log', 'show', 'diff', 'status', 'blame', 'reflog', 'shortlog', 'describe',
|
|
28
|
+
'rev-parse', 'rev-list', 'ls-files', 'ls-tree', 'cat-file', 'whatchanged',
|
|
29
|
+
'name-rev', 'grep', 'cherry', 'count-objects', 'var', 'version',
|
|
30
|
+
]);
|
|
31
|
+
// 纯过滤器:读 stdin/文件、默认只写 stdout,可作为只读管道的一段直接放行。
|
|
32
|
+
// 注意 sort / uniq 仍有写文件的口子,由 isReadonlyFilterCommand 单独兜底。
|
|
33
|
+
const READONLY_FILTER_COMMANDS = new Set([
|
|
34
|
+
'sort', 'uniq', 'nl', 'tac', 'rev', 'cut', 'tr', 'column', 'comm',
|
|
35
|
+
]);
|
|
36
|
+
// sort 写文件 flag:-o / -ofile / 组合短选项含 o(如 -no) / --output。命中则该 sort 不只读。
|
|
37
|
+
const SORT_WRITE_FLAG_RE = /(^|\s)(-[a-z]*o|--output)/;
|
|
38
|
+
// 统计 uniq 的操作数个数(INPUT/OUTPUT)。
|
|
39
|
+
// - 单独的 `-` 是合法 stdin 操作数,须计入
|
|
40
|
+
// - `--` 是 end-of-options,其后所有 token(含以 - 开头的)一律算操作数,
|
|
41
|
+
// 否则 `uniq -- in -out` 会把 -out 当 flag 漏算,绕过写文件拦截
|
|
42
|
+
function countUniqOperands(args) {
|
|
43
|
+
const dd = args.indexOf('--');
|
|
44
|
+
if (dd >= 0) {
|
|
45
|
+
const before = args.slice(0, dd).filter(t => t === '-' || !t.startsWith('-'));
|
|
46
|
+
return before.length + (args.length - dd - 1);
|
|
47
|
+
}
|
|
48
|
+
return args.filter(t => t === '-' || !t.startsWith('-')).length;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 判断单个子命令是否为「只读过滤器」,可直接放行。
|
|
52
|
+
* 多数过滤器只写 stdout,但 sort 可经 -o 写文件、uniq 第二个位置参数即输出文件,单独拦截。
|
|
53
|
+
*/
|
|
54
|
+
function isReadonlyFilterCommand(seg) {
|
|
55
|
+
const tokens = seg.trim().split(/\s+/);
|
|
56
|
+
const first = tokens[0];
|
|
57
|
+
if (!first || !READONLY_FILTER_COMMANDS.has(first))
|
|
58
|
+
return false;
|
|
59
|
+
// sort -o/--output 把结果写入文件
|
|
60
|
+
if (first === 'sort' && SORT_WRITE_FLAG_RE.test(seg))
|
|
61
|
+
return false;
|
|
62
|
+
// uniq [INPUT [OUTPUT]]:出现第二个位置参数即写文件,保守拒绝 2+ 个操作数。
|
|
63
|
+
if (first === 'uniq' && countUniqOperands(tokens.slice(1)) >= 2)
|
|
64
|
+
return false;
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
// git 危险 flag:即便子命令只读也可能执行命令或写文件,命中则不走只读快速通道。
|
|
68
|
+
// -c <k=v> 覆盖任意配置 → core.pager/alias/diff 驱动可执行任意命令
|
|
69
|
+
// --exec-path/--exec 指定/执行外部程序
|
|
70
|
+
// --ext-diff 启用外部 diff 驱动(可执行配置的外部命令)
|
|
71
|
+
// --output[=] 把输出写入文件(git diff --output=...)
|
|
72
|
+
// --open-files-in-pager / -O[<pager>] 用指定 pager 打开匹配文件 → 执行任意命令
|
|
73
|
+
// (git grep -O'sh -c …');-O 支持附着值,故用 -[A-Za-z]*O 兼顾 -Oless / -nO 等形式
|
|
74
|
+
const DANGEROUS_GIT_FLAGS = /(^|\s)(?:(?:-c|--exec-path|--exec|--ext-diff|--output|--open-files-in-pager)(?:\s|=|$)|-[A-Za-z]*O)/;
|
|
75
|
+
/**
|
|
76
|
+
* 判断单个子命令是否为「只读 git 命令」,可直接放行。
|
|
77
|
+
* 要求:首词为 git、第二词为只读子命令、且整段不含危险 flag。
|
|
78
|
+
* 形如 `git -C /path log`(git 与子命令间夹带需取值的全局选项)不识别为只读 →
|
|
79
|
+
* 退回人工确认,安全优先。
|
|
80
|
+
*/
|
|
81
|
+
function isReadonlyGitCommand(seg) {
|
|
82
|
+
const tokens = seg.trim().split(/\s+/);
|
|
83
|
+
if (tokens[0] !== 'git')
|
|
84
|
+
return false;
|
|
85
|
+
const sub = tokens[1];
|
|
86
|
+
if (!sub || !READONLY_GIT_SUBCOMMANDS.has(sub))
|
|
87
|
+
return false;
|
|
88
|
+
if (DANGEROUS_GIT_FLAGS.test(seg))
|
|
89
|
+
return false;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
21
92
|
// 段内重定向:> >> < << <<< >| <> n> n>> &> 等。命中则不走只读快速通道,
|
|
22
93
|
// 防止 `echo x > /etc/passwd`、`cat secret > file` 这类「只读首词 + 重定向」变成写文件原语。
|
|
23
94
|
const REDIRECTION_RE = /(^|\s)\d*(?:>>|<<<|<<|>\||<>|<&|>&|>|<)/;
|
|
95
|
+
// 无副作用重定向:不写真实文件、不读任意文件,剥离后不影响只读判定。
|
|
96
|
+
// n>/dev/null、n>>/dev/null、n</dev/null —— 丢弃/空输入到 /dev/null(要求紧跟边界,
|
|
97
|
+
// 排除 /dev/null/../etc 与 /dev/nullx 等伪装)
|
|
98
|
+
// n>&m、>&-、2>&1 —— fd 合并/关闭,不产生文件(splitCommand 会把 2>&1 规范化为 2>& 1)
|
|
99
|
+
// 仅 /dev/null 与 fd 复制视为安全,重定向到其它路径一律保留交 REDIRECTION_RE 拦截。
|
|
100
|
+
const SAFE_REDIR_RE = /(?<=^|\s)(?:\d*(?:>>?|<)\s*\/dev\/null(?=\s|$)|\d*>&\s*(?:\d+|-)(?=\s|$))/g;
|
|
101
|
+
function stripSafeRedirections(seg) {
|
|
102
|
+
return seg.replace(SAFE_REDIR_RE, ' ');
|
|
103
|
+
}
|
|
24
104
|
/**
|
|
25
105
|
* 命令是否含重定向。用于「前缀授权」纵深防御:前缀匹配只看首词,
|
|
26
106
|
* 而 `echo x > file` 的危险来自重定向,故含重定向的命令不应被前缀授权覆盖,
|
|
@@ -87,9 +167,16 @@ function isUnsafeForPrefixAuth(command) {
|
|
|
87
167
|
return hasRedirection(command) || hasDangerousCommand(command);
|
|
88
168
|
}
|
|
89
169
|
function isReadonlySafeSubcommand(seg) {
|
|
90
|
-
|
|
170
|
+
if (!seg.trim())
|
|
171
|
+
return false;
|
|
172
|
+
// 先剥离「无副作用」重定向(丢弃到 /dev/null、fd 合并/关闭),残留任何重定向仍按危险拦截
|
|
173
|
+
const s = stripSafeRedirections(seg).trim();
|
|
91
174
|
if (!s || REDIRECTION_RE.test(s))
|
|
92
175
|
return false;
|
|
176
|
+
if (isReadonlyGitCommand(s))
|
|
177
|
+
return true;
|
|
178
|
+
if (isReadonlyFilterCommand(s))
|
|
179
|
+
return true;
|
|
93
180
|
const first = s.split(/\s+/)[0];
|
|
94
181
|
if (!READONLY_COMMANDS.has(first))
|
|
95
182
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellSafety.js","sourceRoot":"","sources":["../../src/util/shellSafety.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"shellSafety.js","sourceRoot":"","sources":["../../src/util/shellSafety.ts"],"names":[],"mappings":"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"}
|