sema-core 2.0.11 → 2.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/core/RunTools.d.ts.map +1 -1
  2. package/dist/core/RunTools.js +48 -2
  3. package/dist/core/RunTools.js.map +1 -1
  4. package/dist/core/SemaCore.d.ts +2 -0
  5. package/dist/core/SemaCore.d.ts.map +1 -1
  6. package/dist/core/SemaCore.js +7 -1
  7. package/dist/core/SemaCore.js.map +1 -1
  8. package/dist/core/SemaEngine.d.ts +2 -0
  9. package/dist/core/SemaEngine.d.ts.map +1 -1
  10. package/dist/core/SemaEngine.js +81 -5
  11. package/dist/core/SemaEngine.js.map +1 -1
  12. package/dist/events/types.d.ts +13 -0
  13. package/dist/events/types.d.ts.map +1 -1
  14. package/dist/manager/PermissionManager.d.ts.map +1 -1
  15. package/dist/manager/PermissionManager.js +19 -0
  16. package/dist/manager/PermissionManager.js.map +1 -1
  17. package/dist/prompt/toolAliases.d.ts +4 -0
  18. package/dist/prompt/toolAliases.d.ts.map +1 -1
  19. package/dist/prompt/toolAliases.js +14 -0
  20. package/dist/prompt/toolAliases.js.map +1 -1
  21. package/dist/services/api/adapt/anthropic.js +1 -1
  22. package/dist/services/api/adapt/anthropic.js.map +1 -1
  23. package/dist/services/api/adapt/openai.js +1 -1
  24. package/dist/services/api/adapt/openai.js.map +1 -1
  25. package/dist/services/api/adapt/util.js +4 -4
  26. package/dist/services/api/adapt/util.js.map +1 -1
  27. package/dist/services/hooks/hookRunner.d.ts +21 -0
  28. package/dist/services/hooks/hookRunner.d.ts.map +1 -0
  29. package/dist/services/hooks/hookRunner.js +252 -0
  30. package/dist/services/hooks/hookRunner.js.map +1 -0
  31. package/dist/services/hooks/hookTriggers.d.ts +65 -0
  32. package/dist/services/hooks/hookTriggers.d.ts.map +1 -0
  33. package/dist/services/hooks/hookTriggers.js +295 -0
  34. package/dist/services/hooks/hookTriggers.js.map +1 -0
  35. package/dist/services/hooks/hooksManager.d.ts +64 -0
  36. package/dist/services/hooks/hooksManager.d.ts.map +1 -0
  37. package/dist/services/hooks/hooksManager.js +346 -0
  38. package/dist/services/hooks/hooksManager.js.map +1 -0
  39. package/dist/types/hook.d.ts +76 -0
  40. package/dist/types/hook.d.ts.map +1 -0
  41. package/dist/types/hook.js +28 -0
  42. package/dist/types/hook.js.map +1 -0
  43. package/dist/types/index.d.ts +1 -0
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/dist/util/file.d.ts +8 -0
  46. package/dist/util/file.d.ts.map +1 -1
  47. package/dist/util/file.js +39 -0
  48. package/dist/util/file.js.map +1 -1
  49. package/dist/util/history.d.ts +1 -1
  50. package/dist/util/history.d.ts.map +1 -1
  51. package/dist/util/history.js +23 -2
  52. package/dist/util/history.js.map +1 -1
  53. package/dist/util/logLLM.js +2 -2
  54. package/dist/util/logLLM.js.map +1 -1
  55. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Hooks 管理器
3
+ *
4
+ * 负责 hooks.json 的加载、合并、校验、缓存与 matcher 匹配。
5
+ * 加载顺序:用户级(~/.sema/hooks/hooks.json) → 项目级(<workingDir>/.sema/hooks/hooks.json),
6
+ * 同一事件的条目按加载顺序追加(不覆盖)。
7
+ */
8
+ import { HooksInfo, LoadedHookEntry } from '../../types/hook';
9
+ declare class HooksManager {
10
+ private userConfigPath;
11
+ private projectConfigPath;
12
+ private entriesByEvent;
13
+ private infoCache;
14
+ private loadingPromise;
15
+ private matcherCache;
16
+ constructor();
17
+ /**
18
+ * 发起一次加载(single-flight:并发调用共享同一个在飞 promise,避免重复文件 IO)
19
+ */
20
+ private startLoad;
21
+ /**
22
+ * 等待配置缓存就绪(就绪后近零开销)
23
+ */
24
+ ready(): Promise<void>;
25
+ /**
26
+ * 配置缓存是否已就绪(同步判断,供需要同步捕获条目的调用方使用)
27
+ */
28
+ isReady(): boolean;
29
+ /**
30
+ * 返回指定事件下 matcher 命中的可执行条目(仅 status === 'ok')
31
+ * 工具类事件按通用工具名 / 内置名匹配;其他事件忽略 matcher 总是触发
32
+ */
33
+ getMatchedEntries(event: string, genericToolName?: string, semaToolName?: string): LoadedHookEntry[];
34
+ /**
35
+ * 获取合并后的配置视图
36
+ * @param refresh true 时重新加载配置,下一次 hook 触发即生效
37
+ */
38
+ getHooksInfo(refresh?: boolean): Promise<HooksInfo>;
39
+ private invalidateCache;
40
+ /**
41
+ * 加载并缓存配置。保证不抛错且总是落缓存:任何异常兜底为空配置,
42
+ * 避免缓存留 null 导致后续每次 hook 触发都重试文件 IO
43
+ */
44
+ private loadAndCache;
45
+ /**
46
+ * 解析单个 hooks.json 内容为条目列表(校验只标 status,不抛错)
47
+ */
48
+ private parseHooksFile;
49
+ private clampTimeoutMs;
50
+ /**
51
+ * matcher 编译(结果按 matcher 字符串缓存):
52
+ * 1. 缺失/空串/'*' → 全匹配
53
+ * 2. 按 '|' 分段后每段均为简单名 → 精确集合匹配(通用工具名和内置名均可命中)
54
+ * 3. 否则整串按正则匹配通用工具名;编译失败 logWarn 一次且该条永不匹配
55
+ */
56
+ private compileMatcher;
57
+ dispose(): void;
58
+ }
59
+ /**
60
+ * 获取 Hooks Manager 实例(单例模式)
61
+ */
62
+ export declare function getHooksManager(): HooksManager;
63
+ export { HooksManager };
64
+ //# sourceMappingURL=hooksManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooksManager.d.ts","sourceRoot":"","sources":["../../../src/services/hooks/hooksManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,EAIL,SAAS,EACT,eAAe,EAEhB,MAAM,kBAAkB,CAAA;AAazB,cAAM,YAAY;IAChB,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,YAAY,CAAsC;;IAU1D;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IAYpG;;;OAGG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAYzD,OAAO,CAAC,eAAe;IAMvB;;;OAGG;YACW,YAAY;IAqF1B;;OAEG;IACH,OAAO,CAAC,cAAc;IA0DtB,OAAO,CAAC,cAAc;IAUtB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA+BtB,OAAO,IAAI,IAAI;CAGhB;AAMD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ /**
3
+ * Hooks 管理器
4
+ *
5
+ * 负责 hooks.json 的加载、合并、校验、缓存与 matcher 匹配。
6
+ * 加载顺序:用户级(~/.sema/hooks/hooks.json) → 项目级(<workingDir>/.sema/hooks/hooks.json),
7
+ * 同一事件的条目按加载顺序追加(不覆盖)。
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.HooksManager = void 0;
44
+ exports.getHooksManager = getHooksManager;
45
+ const fs = __importStar(require("fs"));
46
+ const fs_1 = require("fs");
47
+ const path = __importStar(require("path"));
48
+ const file_1 = require("../../util/file");
49
+ const log_1 = require("../../util/log");
50
+ const savePath_1 = require("../../util/savePath");
51
+ const cwd_1 = require("../../util/cwd");
52
+ const hook_1 = require("../../types/hook");
53
+ // 配置文件位于 hooks 子目录下(hook 脚本可与配置同目录存放)
54
+ const HOOKS_DIR_NAME = 'hooks';
55
+ const HOOKS_FILE_NAME = 'hooks.json';
56
+ const DEFAULT_TIMEOUT_S = 60;
57
+ const MAX_TIMEOUT_S = 60;
58
+ const MAX_TIMEOUT_PERMISSION_REQUEST_S = 120;
59
+ const HOOK_EVENT_SET = new Set(hook_1.HOOK_EVENTS);
60
+ class HooksManager {
61
+ constructor() {
62
+ this.entriesByEvent = null;
63
+ this.infoCache = null;
64
+ this.loadingPromise = null;
65
+ this.matcherCache = new Map();
66
+ this.userConfigPath = path.join((0, savePath_1.getSemaRootDir)(), HOOKS_DIR_NAME, HOOKS_FILE_NAME);
67
+ this.projectConfigPath = path.join((0, cwd_1.readInitialCwd)(), '.sema', HOOKS_DIR_NAME, HOOKS_FILE_NAME);
68
+ // 后台静默加载 hooks 配置
69
+ this.startLoad();
70
+ }
71
+ /**
72
+ * 发起一次加载(single-flight:并发调用共享同一个在飞 promise,避免重复文件 IO)
73
+ */
74
+ startLoad() {
75
+ if (!this.loadingPromise) {
76
+ this.loadingPromise = this.loadAndCache().finally(() => {
77
+ this.loadingPromise = null;
78
+ });
79
+ }
80
+ return this.loadingPromise;
81
+ }
82
+ /**
83
+ * 等待配置缓存就绪(就绪后近零开销)
84
+ */
85
+ async ready() {
86
+ if (this.entriesByEvent)
87
+ return;
88
+ await this.startLoad();
89
+ }
90
+ /**
91
+ * 配置缓存是否已就绪(同步判断,供需要同步捕获条目的调用方使用)
92
+ */
93
+ isReady() {
94
+ return this.entriesByEvent !== null;
95
+ }
96
+ /**
97
+ * 返回指定事件下 matcher 命中的可执行条目(仅 status === 'ok')
98
+ * 工具类事件按通用工具名 / 内置名匹配;其他事件忽略 matcher 总是触发
99
+ */
100
+ getMatchedEntries(event, genericToolName, semaToolName) {
101
+ const entries = this.entriesByEvent?.get(event);
102
+ if (!entries || entries.length === 0)
103
+ return [];
104
+ const isToolEvent = hook_1.TOOL_HOOK_EVENTS.has(event);
105
+ return entries.filter(entry => {
106
+ if (entry.status !== 'ok')
107
+ return false;
108
+ if (!isToolEvent)
109
+ return true;
110
+ return this.compileMatcher(entry.matcher)(genericToolName, semaToolName);
111
+ });
112
+ }
113
+ /**
114
+ * 获取合并后的配置视图
115
+ * @param refresh true 时重新加载配置,下一次 hook 触发即生效
116
+ */
117
+ async getHooksInfo(refresh) {
118
+ if (refresh || !this.infoCache) {
119
+ if (!refresh && this.loadingPromise) {
120
+ await this.loadingPromise;
121
+ }
122
+ if (refresh || !this.infoCache) {
123
+ await this.loadAndCache();
124
+ }
125
+ }
126
+ return { ...this.infoCache };
127
+ }
128
+ invalidateCache() {
129
+ this.entriesByEvent = null;
130
+ this.infoCache = null;
131
+ this.matcherCache.clear();
132
+ }
133
+ /**
134
+ * 加载并缓存配置。保证不抛错且总是落缓存:任何异常兜底为空配置,
135
+ * 避免缓存留 null 导致后续每次 hook 触发都重试文件 IO
136
+ */
137
+ async loadAndCache() {
138
+ (0, log_1.logDebug)('刷新 Hooks 配置...');
139
+ const parseErrors = [];
140
+ const allEntries = [];
141
+ const rawBySource = {};
142
+ let userExists = false;
143
+ let projectExists = false;
144
+ try {
145
+ userExists = fs.existsSync(this.userConfigPath);
146
+ projectExists = fs.existsSync(this.projectConfigPath);
147
+ // 用户级 → 项目级,条目追加不覆盖
148
+ for (const [source, filePath, exists] of [
149
+ ['user', this.userConfigPath, userExists],
150
+ ['project', this.projectConfigPath, projectExists],
151
+ ]) {
152
+ if (!exists)
153
+ continue;
154
+ try {
155
+ const raw = await fs_1.promises.readFile(filePath, 'utf-8');
156
+ const parsed = JSON.parse(raw);
157
+ rawBySource[source] = raw;
158
+ allEntries.push(...this.parseHooksFile(parsed, source));
159
+ }
160
+ catch (error) {
161
+ const message = error instanceof Error ? error.message : String(error);
162
+ (0, log_1.logWarn)(`Hooks 配置解析失败 [${filePath}]: ${message}`);
163
+ parseErrors.push({ source, message });
164
+ }
165
+ }
166
+ }
167
+ catch (error) {
168
+ (0, log_1.logError)(`加载 Hooks 配置失败(按空配置处理): ${error}`);
169
+ allEntries.length = 0;
170
+ }
171
+ // 事件块行范围定位(供 IDE 跳转),按 source+event 缓存,定位失败退化为纯配置文件路径
172
+ const locationCache = new Map();
173
+ const locateEvent = (source, event) => {
174
+ const cacheKey = `${source}:${event}`;
175
+ const cached = locationCache.get(cacheKey);
176
+ if (cached)
177
+ return cached;
178
+ const filePath = source === 'user' ? this.userConfigPath : this.projectConfigPath;
179
+ const raw = rawBySource[source];
180
+ const range = raw ? (0, file_1.findJsonKeyValueLineRange)(raw, `"${event}"`) : undefined;
181
+ const location = range ? `${filePath}:${range[0]}-${range[1]}` : filePath;
182
+ locationCache.set(cacheKey, location);
183
+ return location;
184
+ };
185
+ const entriesByEvent = new Map();
186
+ const eventsView = {};
187
+ for (const entry of allEntries) {
188
+ if (!entriesByEvent.has(entry.event)) {
189
+ entriesByEvent.set(entry.event, []);
190
+ eventsView[entry.event] = [];
191
+ }
192
+ entriesByEvent.get(entry.event).push(entry);
193
+ eventsView[entry.event].push({
194
+ event: entry.event,
195
+ source: entry.source,
196
+ matcher: entry.matcher,
197
+ command: entry.command,
198
+ timeout: entry.timeoutRaw,
199
+ status: entry.status,
200
+ statusReason: entry.statusReason,
201
+ filePath: locateEvent(entry.source, entry.event),
202
+ });
203
+ }
204
+ this.entriesByEvent = entriesByEvent;
205
+ this.matcherCache.clear();
206
+ this.infoCache = {
207
+ userConfigPath: this.userConfigPath,
208
+ projectConfigPath: this.projectConfigPath,
209
+ userConfigExists: userExists,
210
+ projectConfigExists: projectExists,
211
+ parseErrors,
212
+ events: eventsView,
213
+ };
214
+ const okCount = allEntries.filter(e => e.status === 'ok').length;
215
+ if (allEntries.length > 0 || parseErrors.length > 0) {
216
+ (0, log_1.logInfo)(`Hooks 配置刷新完成: ${okCount}/${allEntries.length} 条可用`);
217
+ }
218
+ }
219
+ /**
220
+ * 解析单个 hooks.json 内容为条目列表(校验只标 status,不抛错)
221
+ */
222
+ parseHooksFile(parsed, source) {
223
+ const entries = [];
224
+ const hooks = parsed?.hooks;
225
+ if (!hooks || typeof hooks !== 'object')
226
+ return entries;
227
+ for (const [event, groups] of Object.entries(hooks)) {
228
+ if (!Array.isArray(groups))
229
+ continue;
230
+ for (const group of groups) {
231
+ if (!group || typeof group !== 'object' || !Array.isArray(group.hooks))
232
+ continue;
233
+ const matcher = typeof group.matcher === 'string' ? group.matcher : undefined;
234
+ for (const cmd of group.hooks) {
235
+ if (!cmd || typeof cmd !== 'object')
236
+ continue;
237
+ const command = typeof cmd.command === 'string' ? cmd.command.trim() : '';
238
+ const timeoutRaw = typeof cmd.timeout === 'number' && Number.isFinite(cmd.timeout)
239
+ ? cmd.timeout
240
+ : undefined;
241
+ const entry = {
242
+ event,
243
+ source,
244
+ matcher,
245
+ command,
246
+ timeoutMs: this.clampTimeoutMs(event, timeoutRaw),
247
+ timeoutRaw,
248
+ failClosed: cmd.failClosed === true,
249
+ status: 'ok',
250
+ };
251
+ // 校验(顺序即优先级,命中即定案)
252
+ if (cmd.type !== undefined && cmd.type !== 'command') {
253
+ entry.status = 'skipped';
254
+ entry.statusReason = `unsupported type: ${cmd.type}`;
255
+ (0, log_1.logWarn)(`[Hook] 跳过不支持的 hook 类型 [${source}] ${event}: ${cmd.type}`);
256
+ }
257
+ else if ('if' in cmd) {
258
+ // 忽略 if 会把条件触发放大成无条件触发,比不执行更糟,整条跳过
259
+ entry.status = 'skipped';
260
+ entry.statusReason = `contains 'if' condition`;
261
+ (0, log_1.logWarn)(`[Hook] 跳过含 'if' 条件的 hook 条目 [${source}] ${event}`);
262
+ }
263
+ else if (!command) {
264
+ entry.status = 'invalid';
265
+ entry.statusReason = 'missing command';
266
+ }
267
+ else if (!HOOK_EVENT_SET.has(event)) {
268
+ entry.status = 'invalid';
269
+ entry.statusReason = 'unknown event';
270
+ (0, log_1.logWarn)(`[Hook] 未支持的 hook 事件 [${source}]: ${event}`);
271
+ }
272
+ else if (matcher !== undefined && !hook_1.TOOL_HOOK_EVENTS.has(event)) {
273
+ entry.statusReason = 'matcher ignored for non-tool event';
274
+ (0, log_1.logWarn)(`[Hook] ${event} 不支持 matcher,将总是触发 [${source}]`);
275
+ }
276
+ entries.push(entry);
277
+ }
278
+ }
279
+ }
280
+ return entries;
281
+ }
282
+ clampTimeoutMs(event, timeoutS) {
283
+ const max = event === 'PermissionRequest' ? MAX_TIMEOUT_PERMISSION_REQUEST_S : MAX_TIMEOUT_S;
284
+ if (timeoutS === undefined)
285
+ return DEFAULT_TIMEOUT_S * 1000;
286
+ const clamped = Math.min(Math.max(Math.floor(timeoutS), 1), max);
287
+ if (clamped !== timeoutS) {
288
+ (0, log_1.logWarn)(`[Hook] timeout ${timeoutS}s 超出范围 [1, ${max}],已调整为 ${clamped}s`);
289
+ }
290
+ return clamped * 1000;
291
+ }
292
+ /**
293
+ * matcher 编译(结果按 matcher 字符串缓存):
294
+ * 1. 缺失/空串/'*' → 全匹配
295
+ * 2. 按 '|' 分段后每段均为简单名 → 精确集合匹配(通用工具名和内置名均可命中)
296
+ * 3. 否则整串按正则匹配通用工具名;编译失败 logWarn 一次且该条永不匹配
297
+ */
298
+ compileMatcher(matcher) {
299
+ const key = matcher ?? '';
300
+ const cached = this.matcherCache.get(key);
301
+ if (cached)
302
+ return cached;
303
+ let predicate;
304
+ const trimmed = key.trim();
305
+ if (!trimmed || trimmed === '*') {
306
+ predicate = () => true;
307
+ }
308
+ else {
309
+ const parts = trimmed.split('|');
310
+ const isSimple = parts.every(p => /^[A-Za-z0-9_-]+$/.test(p));
311
+ if (isSimple) {
312
+ const nameSet = new Set(parts);
313
+ predicate = (genericName, semaName) => (genericName !== undefined && nameSet.has(genericName)) ||
314
+ (semaName !== undefined && nameSet.has(semaName));
315
+ }
316
+ else {
317
+ try {
318
+ const regex = new RegExp(trimmed);
319
+ predicate = genericName => genericName !== undefined && regex.test(genericName);
320
+ }
321
+ catch (error) {
322
+ (0, log_1.logWarn)(`[Hook] matcher 正则编译失败,该条目永不匹配: ${trimmed} (${error})`);
323
+ predicate = () => false;
324
+ }
325
+ }
326
+ }
327
+ this.matcherCache.set(key, predicate);
328
+ return predicate;
329
+ }
330
+ dispose() {
331
+ this.invalidateCache();
332
+ }
333
+ }
334
+ exports.HooksManager = HooksManager;
335
+ // ===================== 全局 Hooks 管理器 =====================
336
+ let hooksManagerInstance = null;
337
+ /**
338
+ * 获取 Hooks Manager 实例(单例模式)
339
+ */
340
+ function getHooksManager() {
341
+ if (!hooksManagerInstance) {
342
+ hooksManagerInstance = new HooksManager();
343
+ }
344
+ return hooksManagerInstance;
345
+ }
346
+ //# sourceMappingURL=hooksManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooksManager.js","sourceRoot":"","sources":["../../../src/services/hooks/hooksManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Hook 相关类型定义
3
+ *
4
+ * 事件名、stdin payload、输出协议与业界通用 hooks 格式一致(详见 test/hook.md)。
5
+ * 基础功能支持 8 个事件,配置文件为 ~/.sema/hooks/hooks.json 与 <workingDir>/.sema/hooks/hooks.json。
6
+ */
7
+ export declare const HOOK_EVENTS: readonly ["SessionStart", "UserPromptSubmit", "PreToolUse", "PostToolUse", "PostToolUseFailure", "PermissionRequest", "Stop", "SessionEnd"];
8
+ export type HookEventName = (typeof HOOK_EVENTS)[number];
9
+ export declare const TOOL_HOOK_EVENTS: ReadonlySet<string>;
10
+ export interface RawHookCommand {
11
+ type?: string;
12
+ command?: string;
13
+ timeout?: number;
14
+ failClosed?: boolean;
15
+ if?: string;
16
+ [k: string]: unknown;
17
+ }
18
+ export interface RawHookMatcherGroup {
19
+ matcher?: string;
20
+ hooks?: RawHookCommand[];
21
+ [k: string]: unknown;
22
+ }
23
+ export interface RawHooksFile {
24
+ hooks?: Record<string, RawHookMatcherGroup[]>;
25
+ [k: string]: unknown;
26
+ }
27
+ export interface LoadedHookEntry {
28
+ event: string;
29
+ source: 'user' | 'project';
30
+ matcher?: string;
31
+ command: string;
32
+ timeoutMs: number;
33
+ timeoutRaw?: number;
34
+ failClosed: boolean;
35
+ status: 'ok' | 'skipped' | 'invalid';
36
+ statusReason?: string;
37
+ }
38
+ export interface HookEntryInfo {
39
+ event: string;
40
+ source: 'user' | 'project';
41
+ matcher?: string;
42
+ command: string;
43
+ timeout?: number;
44
+ status: 'ok' | 'skipped' | 'invalid';
45
+ statusReason?: string;
46
+ filePath?: string;
47
+ }
48
+ export interface HooksInfo {
49
+ userConfigPath: string;
50
+ projectConfigPath: string;
51
+ userConfigExists: boolean;
52
+ projectConfigExists: boolean;
53
+ parseErrors: Array<{
54
+ source: 'user' | 'project';
55
+ message: string;
56
+ }>;
57
+ events: Record<string, HookEntryInfo[]>;
58
+ }
59
+ export interface HookExecResult {
60
+ exitCode: number | null;
61
+ stdout: string;
62
+ stderr: string;
63
+ timedOut: boolean;
64
+ failedToSpawn: boolean;
65
+ durationMs: number;
66
+ }
67
+ export interface HookOutcome {
68
+ kind: 'pass' | 'block' | 'error';
69
+ decision?: 'allow' | 'deny' | 'ask';
70
+ reason?: string;
71
+ additionalContext?: string;
72
+ systemMessage?: string;
73
+ suppressOutput?: boolean;
74
+ blockIgnored?: boolean;
75
+ }
76
+ //# sourceMappingURL=hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/types/hook.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,eAAO,MAAM,WAAW,6IASd,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAGxD,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAK/C,CAAA;AAIF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;IACxB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAA;IAC7C,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAID,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,OAAO,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,WAAW,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;CACxC;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB;AAGD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAA;IAChC,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Hook 相关类型定义
4
+ *
5
+ * 事件名、stdin payload、输出协议与业界通用 hooks 格式一致(详见 test/hook.md)。
6
+ * 基础功能支持 8 个事件,配置文件为 ~/.sema/hooks/hooks.json 与 <workingDir>/.sema/hooks/hooks.json。
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TOOL_HOOK_EVENTS = exports.HOOK_EVENTS = void 0;
10
+ // 基础功能支持的 hook 事件
11
+ exports.HOOK_EVENTS = [
12
+ 'SessionStart',
13
+ 'UserPromptSubmit',
14
+ 'PreToolUse',
15
+ 'PostToolUse',
16
+ 'PostToolUseFailure',
17
+ 'PermissionRequest',
18
+ 'Stop',
19
+ 'SessionEnd',
20
+ ];
21
+ // 工具类事件(matcher 仅对这些事件生效)
22
+ exports.TOOL_HOOK_EVENTS = new Set([
23
+ 'PreToolUse',
24
+ 'PostToolUse',
25
+ 'PostToolUseFailure',
26
+ 'PermissionRequest',
27
+ ]);
28
+ //# sourceMappingURL=hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../src/types/hook.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,kBAAkB;AACL,QAAA,WAAW,GAAG;IACzB,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,mBAAmB;IACnB,MAAM;IACN,YAAY;CACJ,CAAA;AAIV,0BAA0B;AACb,QAAA,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IAC3D,YAAY;IACZ,aAAa;IACb,oBAAoB;IACpB,mBAAmB;CACpB,CAAC,CAAA"}
@@ -118,4 +118,5 @@ export type { TodoItem, TodoTaskStatus, TodoTask, } from './todoTask';
118
118
  export type { CronTask, CronTaskFile, } from './cron';
119
119
  export { TOOL_NAME_VIEW_FILE, TOOL_NAME_RUN_SHELL, TOOL_NAME_PEEK_BG_JOB, TOOL_NAME_STOP_BG_JOB, TOOL_NAME_DEL_CRON, TOOL_NAME_LIST_CRONS, TOOL_NAME_CREATE_TODO, TOOL_NAME_LIST_TODOS, TOOL_NAME_GET_TODO, TOOL_NAME_UPDATE_TODO, TOOL_NAME_CREATE_CRON, TOOL_NAME_PICK_OPTION, TOOL_NAME_PLAN_TO_AGENT, TOOL_NAME_FETCH_URL, TOOL_NAME_SEARCH_FILES, TOOL_NAME_SEARCH_CONTENT, TOOL_NAME_EDIT_NOTEBOOK, TOOL_NAME_SKILL, TOOL_NAME_SUB_AGENT, TOOL_NAME_WRITE_FILE, TOOL_NAME_PATCH_FILE, } from '../prompt/tool';
120
120
  export type { CreateSessionOptions, CreateSessionResult } from './session';
121
+ export type { HooksInfo, HookEntryInfo, } from './hook';
121
122
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,14 @@ export declare function formatWithLineNumbers({ content, startLine, }: {
46
46
  *
47
47
  */
48
48
  export declare function findJsonObjectLineRange(json: string, match: string): [number, number] | undefined;
49
+ /**
50
+ * 在 JSON 文本中,查找包含 match 的 key 行及其值块(对象或数组)的行范围。
51
+ *
52
+ * 与 findJsonObjectLineRange 的差异:起始行取 match 所在行本身,
53
+ * 结束行按 match 行缩进往下找同缩进的 ']' 或 '}' 行,适用于值为数组的 key
54
+ * (如 hooks.json 的事件块 "PreToolUse": [...])。值与 key 同行闭合时返回单行范围。
55
+ */
56
+ export declare function findJsonKeyValueLineRange(json: string, match: string): [number, number] | undefined;
49
57
  /**
50
58
  * 获取相对于初始工作目录的显示路径,超出范围则返回绝对路径
51
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,CAAA;AAE1C,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpD,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAiBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAqCT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAI,EACV,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,cAAc,GACtB,IAAI,CAON;AAsCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBlE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAajE;AAID,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAsB7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,MAAM,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA6BjG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAEjF;AAQD,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAGD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,OAAO,SAAuB,EAC9B,qBAAqB,UAAO,EAC5B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAsBrB"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/util/file.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,CAAA;AAE1C,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpD,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAiBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAqCT;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,SAAI,EACV,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,cAAc,GACtB,IAAI,CAON;AAsCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAuBlE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAajE;AAID,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAsB7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,MAAM,CAOT;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA6BjG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA2BnG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,SAAS,CAEjF;AAQD,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAGD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,OAAO,SAAuB,EAC9B,qBAAqB,UAAO,EAC5B,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAsBrB"}
package/dist/util/file.js CHANGED
@@ -12,6 +12,7 @@ exports.canonicalizeFilePath = canonicalizeFilePath;
12
12
  exports.findFileWithDifferentExt = findFileWithDifferentExt;
13
13
  exports.formatWithLineNumbers = formatWithLineNumbers;
14
14
  exports.findJsonObjectLineRange = findJsonObjectLineRange;
15
+ exports.findJsonKeyValueLineRange = findJsonKeyValueLineRange;
15
16
  exports.getDisplayPath = getDisplayPath;
16
17
  exports.getFilePath = getFilePath;
17
18
  exports.execFileSafely = execFileSafely;
@@ -274,6 +275,44 @@ function findJsonObjectLineRange(json, match) {
274
275
  }
275
276
  return undefined;
276
277
  }
278
+ /**
279
+ * 在 JSON 文本中,查找包含 match 的 key 行及其值块(对象或数组)的行范围。
280
+ *
281
+ * 与 findJsonObjectLineRange 的差异:起始行取 match 所在行本身,
282
+ * 结束行按 match 行缩进往下找同缩进的 ']' 或 '}' 行,适用于值为数组的 key
283
+ * (如 hooks.json 的事件块 "PreToolUse": [...])。值与 key 同行闭合时返回单行范围。
284
+ */
285
+ function findJsonKeyValueLineRange(json, match) {
286
+ const lines = json.split('\n');
287
+ const matchIdx = lines.findIndex(l => l.includes(match));
288
+ if (matchIdx === -1)
289
+ return undefined;
290
+ // 值在 match 行内闭合(含压缩 JSON 整文件一行的场景):按 match 之后的括号配平判断
291
+ const afterMatch = lines[matchIdx].slice(lines[matchIdx].indexOf(match) + match.length);
292
+ let depth = 0;
293
+ let opened = false;
294
+ for (const ch of afterMatch) {
295
+ if (ch === '[' || ch === '{') {
296
+ depth++;
297
+ opened = true;
298
+ }
299
+ else if (ch === ']' || ch === '}')
300
+ depth--;
301
+ if (opened && depth === 0)
302
+ return [matchIdx + 1, matchIdx + 1];
303
+ }
304
+ if (!opened)
305
+ return [matchIdx + 1, matchIdx + 1];
306
+ // 多行值:往下找与 match 行同缩进的闭合行
307
+ const indent = lines[matchIdx].search(/\S/);
308
+ for (let i = matchIdx + 1; i < lines.length; i++) {
309
+ const trimmed = lines[i].trimStart();
310
+ if ((trimmed.startsWith(']') || trimmed.startsWith('}')) && lines[i].search(/\S/) === indent) {
311
+ return [matchIdx + 1, i + 1];
312
+ }
313
+ }
314
+ return undefined;
315
+ }
277
316
  /**
278
317
  * 获取相对于初始工作目录的显示路径,超出范围则返回绝对路径
279
318
  */