aws-runtime-bridge 1.9.40 → 1.9.45
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/adapter/AcodeSdkAdapter.d.ts +31 -4
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +382 -57
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +1 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +62 -0
- package/dist/adapter/types.d.ts +21 -6
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +10 -1
- package/dist/index.js +11 -0
- package/dist/routes/ai-sources.js +4 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +47 -1
- package/dist/routes/processes.d.ts.map +1 -1
- package/dist/routes/processes.js +7 -0
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +6 -3
- package/dist/routes/sessions.js +93 -5
- package/dist/routes/sub-agents.js +15 -1
- package/dist/routes/terminal.d.ts +15 -0
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +162 -5
- package/dist/services/acode-package.d.ts +8 -1
- package/dist/services/acode-package.d.ts.map +1 -1
- package/dist/services/acode-package.js +33 -4
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.js +11 -4
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +3 -0
- package/dist/services/legacy-path-migration.d.ts.map +1 -0
- package/dist/services/legacy-path-migration.js +66 -0
- package/dist/services/lifecycle-state.d.ts.map +1 -1
- package/dist/services/lifecycle-state.js +1 -1
- package/dist/services/runtime-binding.d.ts +5 -0
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +33 -1
- package/dist/services/session-output.d.ts +7 -1
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +16 -2
- package/dist/services/workspace-files.d.ts +48 -0
- package/dist/services/workspace-files.d.ts.map +1 -1
- package/dist/services/workspace-files.js +285 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +504 -3
- package/package/acode/dist/compaction.d.ts +43 -7
- package/package/acode/dist/compaction.d.ts.map +1 -1
- package/package/acode/dist/compaction.js +286 -31
- package/package/acode/dist/runtime.d.ts +130 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +972 -71
- package/package/acode/dist/sub-agent-manager.d.ts +96 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-manager.js +293 -3
- package/package/acode/dist/sub-agent-store.d.ts +8 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-store.js +55 -0
- package/package/acode/dist/sub-agent-tools.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-tools.js +5 -4
- package/package/acode/dist/sub-agent-types.d.ts +4 -0
- package/package/acode/dist/sub-agent-types.d.ts.map +1 -1
- package/package/acode/dist/types.d.ts +19 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +4 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.js +3 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +102 -34
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +637 -209
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +151 -51
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +18 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +32 -9
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +58 -19
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +3 -3
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +21 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +47 -21
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -13,7 +13,7 @@ function generatePairingCode() {
|
|
|
13
13
|
.replace(/(\d{3})(\d{3})/, "$1-$2");
|
|
14
14
|
}
|
|
15
15
|
function bindingDir() {
|
|
16
|
-
return path.join(getRuntimeHomeDir(), ".
|
|
16
|
+
return path.join(getRuntimeHomeDir(), ".aws-bridge");
|
|
17
17
|
}
|
|
18
18
|
function bindingFile() {
|
|
19
19
|
return path.join(bindingDir(), "binding.json");
|
|
@@ -331,3 +331,35 @@ export function clearRuntimeBinding() {
|
|
|
331
331
|
fs.writeFileSync(bindingFile(), `${JSON.stringify(revokedState, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
332
332
|
log.info("[runtime-bridge] runtime binding cleared");
|
|
333
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* 将旧路径 ~/.agentswork/runtime-bridge/ 下的配置文件迁移到新路径 ~/.aws-bridge/。
|
|
336
|
+
* 仅在旧路径存在且新路径不存在时执行,避免覆盖已有配置。
|
|
337
|
+
*/
|
|
338
|
+
export function migrateOldBindingDir() {
|
|
339
|
+
const homedir = getRuntimeHomeDir();
|
|
340
|
+
const oldDir = path.join(homedir, ".agentswork", "runtime-bridge");
|
|
341
|
+
const newDir = bindingDir();
|
|
342
|
+
if (oldDir === newDir)
|
|
343
|
+
return;
|
|
344
|
+
if (!fs.existsSync(oldDir))
|
|
345
|
+
return;
|
|
346
|
+
const files = ["binding.json", "runtime-tokens.properties"];
|
|
347
|
+
let migratedCount = 0;
|
|
348
|
+
for (const file of files) {
|
|
349
|
+
const oldFile = path.join(oldDir, file);
|
|
350
|
+
const newFile = path.join(newDir, file);
|
|
351
|
+
if (fs.existsSync(oldFile) && !fs.existsSync(newFile)) {
|
|
352
|
+
fs.mkdirSync(newDir, { recursive: true });
|
|
353
|
+
fs.copyFileSync(oldFile, newFile);
|
|
354
|
+
try {
|
|
355
|
+
fs.chmodSync(newFile, 0o600);
|
|
356
|
+
}
|
|
357
|
+
catch { /* ignore */ }
|
|
358
|
+
migratedCount++;
|
|
359
|
+
log.info(`[runtime-bridge] 已迁移 ${oldFile} → ${newFile}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (migratedCount > 0) {
|
|
363
|
+
log.info(`[runtime-bridge] 已迁移 ${migratedCount} 个配置文件从 ${oldDir} 到 ${newDir}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
@@ -41,6 +41,7 @@ export interface BridgeEventPayload {
|
|
|
41
41
|
readonly filePath?: string;
|
|
42
42
|
readonly eventType?: string;
|
|
43
43
|
readonly size?: number;
|
|
44
|
+
readonly toolCallId?: string;
|
|
44
45
|
}
|
|
45
46
|
/** RingBufferEntry 的便捷导出 */
|
|
46
47
|
export type { RingBufferEntry, RingBufferSlice };
|
|
@@ -90,6 +91,9 @@ export declare function sendStatus(agentId: string, sessionId: string | null, st
|
|
|
90
91
|
inputTokens: number;
|
|
91
92
|
outputTokens: number;
|
|
92
93
|
contextLimit?: number;
|
|
94
|
+
maxOutput?: number;
|
|
95
|
+
inputLimit?: number;
|
|
96
|
+
compactionThreshold?: number;
|
|
93
97
|
}, authOptions?: RuntimeCallbackAuthOptions, timestamp?: number, sourceEventType?: string): Promise<AxiosResponse<unknown> | undefined>;
|
|
94
98
|
/**
|
|
95
99
|
* 发送输出到调度器
|
|
@@ -106,8 +110,10 @@ export declare function sendOutput(agentId: string, output: string, sessionId: s
|
|
|
106
110
|
* @param agentId - Agent ID
|
|
107
111
|
* @param sessionId - SDK 会话 ID
|
|
108
112
|
* @param questions - 结构化问题列表
|
|
113
|
+
* @param authOptions - 运行时鉴权选项
|
|
114
|
+
* @param toolCallId - 提问实例的唯一标识,用于前端区分同一会话内连续多次提问
|
|
109
115
|
*/
|
|
110
|
-
export declare function sendQuestionRequest(agentId: string, sessionId: string, questions: unknown[], authOptions?: RuntimeCallbackAuthOptions): Promise<void>;
|
|
116
|
+
export declare function sendQuestionRequest(agentId: string, sessionId: string, questions: unknown[], authOptions?: RuntimeCallbackAuthOptions, toolCallId?: string): Promise<void>;
|
|
111
117
|
export interface RuntimeFileChangedPayload {
|
|
112
118
|
bridgeBaseUrl?: string;
|
|
113
119
|
workspacePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAKlD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAK1F;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAI3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,17 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
115
115
|
if (usage.contextLimit) {
|
|
116
116
|
payload.contextLimit = usage.contextLimit;
|
|
117
117
|
}
|
|
118
|
+
// ★ 补传 maxOutput/inputLimit/compactionThreshold,前端 AgentContextPanel 直接用
|
|
119
|
+
// compactionThreshold 显示压缩点竖线(消除前端自算公式脱节)。
|
|
120
|
+
if (usage.maxOutput) {
|
|
121
|
+
payload.maxOutput = usage.maxOutput;
|
|
122
|
+
}
|
|
123
|
+
if (usage.inputLimit) {
|
|
124
|
+
payload.inputLimit = usage.inputLimit;
|
|
125
|
+
}
|
|
126
|
+
if (usage.compactionThreshold) {
|
|
127
|
+
payload.compactionThreshold = usage.compactionThreshold;
|
|
128
|
+
}
|
|
118
129
|
}
|
|
119
130
|
// 添加来源事件类型(用于前端时间线灰度区分,如 thinking / ai_request)
|
|
120
131
|
if (sourceEventType) {
|
|
@@ -305,10 +316,12 @@ export async function sendOutput(agentId, output, sessionId, seq, metadata, auth
|
|
|
305
316
|
* @param agentId - Agent ID
|
|
306
317
|
* @param sessionId - SDK 会话 ID
|
|
307
318
|
* @param questions - 结构化问题列表
|
|
319
|
+
* @param authOptions - 运行时鉴权选项
|
|
320
|
+
* @param toolCallId - 提问实例的唯一标识,用于前端区分同一会话内连续多次提问
|
|
308
321
|
*/
|
|
309
|
-
export async function sendQuestionRequest(agentId, sessionId, questions, authOptions) {
|
|
322
|
+
export async function sendQuestionRequest(agentId, sessionId, questions, authOptions, toolCallId) {
|
|
310
323
|
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
311
|
-
const payload = { agentId, sessionId, questions };
|
|
324
|
+
const payload = { agentId, sessionId, questions, ...(toolCallId ? { toolCallId } : {}) };
|
|
312
325
|
try {
|
|
313
326
|
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
314
327
|
if (!headers) {
|
|
@@ -340,6 +353,7 @@ export async function sendQuestionRequest(agentId, sessionId, questions, authOpt
|
|
|
340
353
|
category: "question",
|
|
341
354
|
agentId,
|
|
342
355
|
sessionId,
|
|
356
|
+
...(toolCallId ? { toolCallId } : {}),
|
|
343
357
|
questions,
|
|
344
358
|
};
|
|
345
359
|
bridgeEventBuffer.append(eventPayload);
|
|
@@ -90,6 +90,44 @@ interface ChmodWorkspaceEntryParams extends WorkspacePathParams {
|
|
|
90
90
|
mode: string;
|
|
91
91
|
recursive?: boolean;
|
|
92
92
|
}
|
|
93
|
+
export interface SearchWorkspaceFilesParams {
|
|
94
|
+
workspacePath: string;
|
|
95
|
+
keyword: string;
|
|
96
|
+
fileMask?: string;
|
|
97
|
+
ignoreCase?: boolean;
|
|
98
|
+
maxResults?: number;
|
|
99
|
+
mode?: 'content' | 'filename';
|
|
100
|
+
}
|
|
101
|
+
export interface WorkspaceSearchMatch {
|
|
102
|
+
filePath: string;
|
|
103
|
+
lineNumber: number;
|
|
104
|
+
lineContent: string;
|
|
105
|
+
matchStart: number;
|
|
106
|
+
matchEnd: number;
|
|
107
|
+
}
|
|
108
|
+
export interface SearchWorkspaceFilesResult {
|
|
109
|
+
workspacePath: string;
|
|
110
|
+
keyword: string;
|
|
111
|
+
totalFiles: number;
|
|
112
|
+
totalMatches: number;
|
|
113
|
+
matches: WorkspaceSearchMatch[];
|
|
114
|
+
truncated: boolean;
|
|
115
|
+
}
|
|
116
|
+
export interface ReplaceWorkspaceFilesParams {
|
|
117
|
+
workspacePath: string;
|
|
118
|
+
keyword: string;
|
|
119
|
+
replacement: string;
|
|
120
|
+
fileMask?: string;
|
|
121
|
+
ignoreCase?: boolean;
|
|
122
|
+
filePath?: string;
|
|
123
|
+
}
|
|
124
|
+
export interface ReplaceWorkspaceFilesResult {
|
|
125
|
+
workspacePath: string;
|
|
126
|
+
keyword: string;
|
|
127
|
+
replacement: string;
|
|
128
|
+
changedFiles: number;
|
|
129
|
+
changedMatches: number;
|
|
130
|
+
}
|
|
93
131
|
export interface WorkspaceImageProperties {
|
|
94
132
|
format: 'png' | 'jpeg' | 'gif' | 'webp';
|
|
95
133
|
width: number;
|
|
@@ -216,5 +254,15 @@ export declare function streamWorkspaceDirectoryZip(directoryPath: string, outpu
|
|
|
216
254
|
* 解压工作区中的归档文件到指定目录,支持 zip、tar、tar.gz/tgz 与单文件 gz。
|
|
217
255
|
*/
|
|
218
256
|
export declare function extractWorkspaceArchive(params: ExtractWorkspaceArchiveParams): Promise<WorkspaceArchiveExtractResult>;
|
|
257
|
+
/**
|
|
258
|
+
* 在工作区范围内搜索文件内容。
|
|
259
|
+
* 主流程:安全解析工作区根 -> 递归遍历目录 -> 按文件掩码过滤 -> 逐行匹配关键词 -> 返回匹配列表。
|
|
260
|
+
*/
|
|
261
|
+
export declare function searchWorkspaceFiles(params: SearchWorkspaceFilesParams): Promise<SearchWorkspaceFilesResult>;
|
|
262
|
+
/**
|
|
263
|
+
* 在工作区范围内批量替换文件内容。
|
|
264
|
+
* 可指定 filePath 只替换单个文件;未指定时递归替换所有匹配掩码的文件。
|
|
265
|
+
*/
|
|
266
|
+
export declare function replaceWorkspaceFiles(params: ReplaceWorkspaceFilesParams): Promise<ReplaceWorkspaceFilesResult>;
|
|
219
267
|
export {};
|
|
220
268
|
//# sourceMappingURL=workspace-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/services/workspace-files.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqDH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,IAAI,CAAC;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,mBAAmB;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,wBAAyB,SAAQ,mBAAmB;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,mBAAmB;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,UAAU,0BAA2B,SAAQ,mBAAmB;IAC9D,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,4BAA6B,SAAQ,mBAAmB;IAChE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,6BAA8B,SAAQ,mBAAmB;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,yBAA0B,SAAQ,mBAAmB;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,8BAA8B;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,IAAI,CAAC;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAoeD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,4BAA4B,CAAC,CA0B/G;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAgBrG;AAsDD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,8BAA8B,CAAC,CA+B7H;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAoB/G;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAkCnH;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAYzI;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAkCxF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCtF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAiD/G;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAelE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,6BAA6B,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA4CnL;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,4BAA4B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAa3H;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAarH;AA+GD;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,6BAA6B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CA8C3H"}
|
|
1
|
+
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/services/workspace-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -988,3 +988,288 @@ export async function extractWorkspaceArchive(params) {
|
|
|
988
988
|
extractedEntries
|
|
989
989
|
};
|
|
990
990
|
}
|
|
991
|
+
/**
|
|
992
|
+
* 展开简单花括号模式,如 *.{ts,tsx} -> *.ts, *.tsx。
|
|
993
|
+
*/
|
|
994
|
+
function expandBracePattern(pattern) {
|
|
995
|
+
const match = pattern.match(/^(.*?)\{([^}]+)\}(.*)$/);
|
|
996
|
+
if (!match) {
|
|
997
|
+
return [pattern];
|
|
998
|
+
}
|
|
999
|
+
const [, prefix, options, suffix] = match;
|
|
1000
|
+
return options.split(',').flatMap((option) => expandBracePattern(prefix + option.trim() + suffix));
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* 判断文件名是否匹配简单 glob 掩码(支持 *、?、** 与 {a,b,c})。
|
|
1004
|
+
*/
|
|
1005
|
+
function matchesFileMask(fileName, mask) {
|
|
1006
|
+
const normalizedMask = String(mask || '').trim();
|
|
1007
|
+
if (!normalizedMask || normalizedMask === '*' || normalizedMask === '*.*') {
|
|
1008
|
+
return true;
|
|
1009
|
+
}
|
|
1010
|
+
const normalizedFileName = fileName.toLowerCase();
|
|
1011
|
+
const patterns = expandBracePattern(normalizedMask.toLowerCase());
|
|
1012
|
+
return patterns.some((pattern) => {
|
|
1013
|
+
if (pattern === '*')
|
|
1014
|
+
return true;
|
|
1015
|
+
const regexSource = pattern
|
|
1016
|
+
.replace(/\./g, '\\.')
|
|
1017
|
+
.replace(/\*\*/g, '<<GLOBSTAR>>')
|
|
1018
|
+
.replace(/\*/g, '[^/]*')
|
|
1019
|
+
.replace(/\?/g, '[^/]')
|
|
1020
|
+
.replace(/<<GLOBSTAR>>/g, '.*');
|
|
1021
|
+
const regex = new RegExp(`^${regexSource}$`);
|
|
1022
|
+
return regex.test(normalizedFileName);
|
|
1023
|
+
});
|
|
1024
|
+
}
|
|
1025
|
+
/**
|
|
1026
|
+
* 跳过明显不适合文本搜索/替换的目录。
|
|
1027
|
+
*/
|
|
1028
|
+
function isSkippedSearchDirectory(name) {
|
|
1029
|
+
return name === '.git' || name === 'node_modules' || name === '.svn' || name === '.hg';
|
|
1030
|
+
}
|
|
1031
|
+
const SEARCH_MAX_FILE_BYTES = 10 * 1024 * 1024;
|
|
1032
|
+
const SEARCH_DEFAULT_MAX_RESULTS = 1000;
|
|
1033
|
+
/**
|
|
1034
|
+
* 在工作区范围内搜索文件内容。
|
|
1035
|
+
* 主流程:安全解析工作区根 -> 递归遍历目录 -> 按文件掩码过滤 -> 逐行匹配关键词 -> 返回匹配列表。
|
|
1036
|
+
*/
|
|
1037
|
+
export async function searchWorkspaceFiles(params) {
|
|
1038
|
+
const { workspaceRoot } = await resolveWorkspaceRoots(params.workspacePath);
|
|
1039
|
+
const keyword = String(params.keyword || '').trim();
|
|
1040
|
+
if (!keyword) {
|
|
1041
|
+
throw new Error('keyword is required');
|
|
1042
|
+
}
|
|
1043
|
+
const ignoreCase = Boolean(params.ignoreCase);
|
|
1044
|
+
const fileMask = String(params.fileMask || '').trim();
|
|
1045
|
+
const maxResults = typeof params.maxResults === 'number' && params.maxResults > 0
|
|
1046
|
+
? params.maxResults
|
|
1047
|
+
: SEARCH_DEFAULT_MAX_RESULTS;
|
|
1048
|
+
const searchKeyword = ignoreCase ? keyword.toLowerCase() : keyword;
|
|
1049
|
+
const mode = params.mode === 'filename' ? 'filename' : 'content';
|
|
1050
|
+
const isFilenameMode = mode === 'filename';
|
|
1051
|
+
const matches = [];
|
|
1052
|
+
let totalFiles = 0;
|
|
1053
|
+
let truncated = false;
|
|
1054
|
+
async function walk(directoryPath) {
|
|
1055
|
+
if (truncated)
|
|
1056
|
+
return;
|
|
1057
|
+
let entries;
|
|
1058
|
+
try {
|
|
1059
|
+
entries = await fs.readdir(directoryPath, { withFileTypes: true });
|
|
1060
|
+
}
|
|
1061
|
+
catch {
|
|
1062
|
+
return;
|
|
1063
|
+
}
|
|
1064
|
+
for (const entry of entries) {
|
|
1065
|
+
if (truncated)
|
|
1066
|
+
return;
|
|
1067
|
+
const entryPath = ensureInsideWorkspace(workspaceRoot, path.join(directoryPath, entry.name));
|
|
1068
|
+
if (entry.isSymbolicLink())
|
|
1069
|
+
continue;
|
|
1070
|
+
if (entry.isDirectory()) {
|
|
1071
|
+
if (isSkippedSearchDirectory(entry.name))
|
|
1072
|
+
continue;
|
|
1073
|
+
await walk(entryPath);
|
|
1074
|
+
continue;
|
|
1075
|
+
}
|
|
1076
|
+
if (!entry.isFile())
|
|
1077
|
+
continue;
|
|
1078
|
+
if (fileMask && !matchesFileMask(entry.name, fileMask))
|
|
1079
|
+
continue;
|
|
1080
|
+
totalFiles += 1;
|
|
1081
|
+
let stat;
|
|
1082
|
+
try {
|
|
1083
|
+
stat = await fs.stat(entryPath);
|
|
1084
|
+
}
|
|
1085
|
+
catch {
|
|
1086
|
+
continue;
|
|
1087
|
+
}
|
|
1088
|
+
if (stat.size > SEARCH_MAX_FILE_BYTES)
|
|
1089
|
+
continue;
|
|
1090
|
+
if (isFilenameMode) {
|
|
1091
|
+
const searchName = ignoreCase ? entry.name.toLowerCase() : entry.name;
|
|
1092
|
+
const matchIndex = searchName.indexOf(searchKeyword);
|
|
1093
|
+
if (matchIndex !== -1) {
|
|
1094
|
+
matches.push({
|
|
1095
|
+
filePath: toDisplayPath(entryPath),
|
|
1096
|
+
lineNumber: 0,
|
|
1097
|
+
lineContent: entry.name,
|
|
1098
|
+
matchStart: matchIndex,
|
|
1099
|
+
matchEnd: matchIndex + keyword.length
|
|
1100
|
+
});
|
|
1101
|
+
if (matches.length >= maxResults) {
|
|
1102
|
+
truncated = true;
|
|
1103
|
+
return;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
continue;
|
|
1107
|
+
}
|
|
1108
|
+
let content;
|
|
1109
|
+
try {
|
|
1110
|
+
content = await fs.readFile(entryPath, 'utf-8');
|
|
1111
|
+
}
|
|
1112
|
+
catch {
|
|
1113
|
+
continue;
|
|
1114
|
+
}
|
|
1115
|
+
const lines = content.split(/\r?\n/);
|
|
1116
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {
|
|
1117
|
+
const line = lines[lineIndex];
|
|
1118
|
+
const searchLine = ignoreCase ? line.toLowerCase() : line;
|
|
1119
|
+
let searchIndex = 0;
|
|
1120
|
+
while (true) {
|
|
1121
|
+
const matchIndex = searchLine.indexOf(searchKeyword, searchIndex);
|
|
1122
|
+
if (matchIndex === -1)
|
|
1123
|
+
break;
|
|
1124
|
+
matches.push({
|
|
1125
|
+
filePath: toDisplayPath(entryPath),
|
|
1126
|
+
lineNumber: lineIndex + 1,
|
|
1127
|
+
lineContent: line,
|
|
1128
|
+
matchStart: matchIndex,
|
|
1129
|
+
matchEnd: matchIndex + keyword.length
|
|
1130
|
+
});
|
|
1131
|
+
if (matches.length >= maxResults) {
|
|
1132
|
+
truncated = true;
|
|
1133
|
+
return;
|
|
1134
|
+
}
|
|
1135
|
+
searchIndex = matchIndex + 1;
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1140
|
+
await walk(workspaceRoot);
|
|
1141
|
+
return {
|
|
1142
|
+
workspacePath: toDisplayPath(workspaceRoot),
|
|
1143
|
+
keyword,
|
|
1144
|
+
totalFiles,
|
|
1145
|
+
totalMatches: matches.length,
|
|
1146
|
+
matches,
|
|
1147
|
+
truncated
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
/**
|
|
1151
|
+
* 在单个文件内执行安全替换,只写入确实有变化的内容。
|
|
1152
|
+
*/
|
|
1153
|
+
async function replaceInFile(workspaceRoot, filePath, keyword, replacement, ignoreCase) {
|
|
1154
|
+
let content;
|
|
1155
|
+
try {
|
|
1156
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
1157
|
+
}
|
|
1158
|
+
catch {
|
|
1159
|
+
return { changed: false, count: 0 };
|
|
1160
|
+
}
|
|
1161
|
+
const originalContent = content;
|
|
1162
|
+
let count = 0;
|
|
1163
|
+
if (ignoreCase) {
|
|
1164
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
1165
|
+
let index = 0;
|
|
1166
|
+
while (true) {
|
|
1167
|
+
const lowerContent = content.toLowerCase();
|
|
1168
|
+
const matchIndex = lowerContent.indexOf(lowerKeyword, index);
|
|
1169
|
+
if (matchIndex === -1)
|
|
1170
|
+
break;
|
|
1171
|
+
content = content.slice(0, matchIndex) + replacement + content.slice(matchIndex + keyword.length);
|
|
1172
|
+
count += 1;
|
|
1173
|
+
const step = replacement.length || 1;
|
|
1174
|
+
index = matchIndex + step;
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
else {
|
|
1178
|
+
let index = 0;
|
|
1179
|
+
while (true) {
|
|
1180
|
+
const matchIndex = content.indexOf(keyword, index);
|
|
1181
|
+
if (matchIndex === -1)
|
|
1182
|
+
break;
|
|
1183
|
+
content = content.slice(0, matchIndex) + replacement + content.slice(matchIndex + keyword.length);
|
|
1184
|
+
count += 1;
|
|
1185
|
+
const step = replacement.length || 1;
|
|
1186
|
+
index = matchIndex + step;
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
if (content === originalContent) {
|
|
1190
|
+
return { changed: false, count: 0 };
|
|
1191
|
+
}
|
|
1192
|
+
await ensureWritableParentInsideWorkspace(workspaceRoot, filePath);
|
|
1193
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
1194
|
+
return { changed: true, count };
|
|
1195
|
+
}
|
|
1196
|
+
/**
|
|
1197
|
+
* 在工作区范围内批量替换文件内容。
|
|
1198
|
+
* 可指定 filePath 只替换单个文件;未指定时递归替换所有匹配掩码的文件。
|
|
1199
|
+
*/
|
|
1200
|
+
export async function replaceWorkspaceFiles(params) {
|
|
1201
|
+
const { workspaceRoot } = await resolveWorkspaceRoots(params.workspacePath);
|
|
1202
|
+
const keyword = String(params.keyword || '').trim();
|
|
1203
|
+
if (!keyword) {
|
|
1204
|
+
throw new Error('keyword is required');
|
|
1205
|
+
}
|
|
1206
|
+
const replacement = String(params.replacement ?? '');
|
|
1207
|
+
const ignoreCase = Boolean(params.ignoreCase);
|
|
1208
|
+
const fileMask = String(params.fileMask || '').trim();
|
|
1209
|
+
const singleFilePath = String(params.filePath || '').trim();
|
|
1210
|
+
let changedFiles = 0;
|
|
1211
|
+
let changedMatches = 0;
|
|
1212
|
+
if (singleFilePath) {
|
|
1213
|
+
const { resolvedFilePath } = await resolveFileTarget({
|
|
1214
|
+
workspacePath: params.workspacePath,
|
|
1215
|
+
filePath: singleFilePath
|
|
1216
|
+
});
|
|
1217
|
+
const result = await replaceInFile(workspaceRoot, resolvedFilePath, keyword, replacement, ignoreCase);
|
|
1218
|
+
if (result.changed) {
|
|
1219
|
+
changedFiles = 1;
|
|
1220
|
+
changedMatches = result.count;
|
|
1221
|
+
}
|
|
1222
|
+
return {
|
|
1223
|
+
workspacePath: toDisplayPath(workspaceRoot),
|
|
1224
|
+
keyword,
|
|
1225
|
+
replacement,
|
|
1226
|
+
changedFiles,
|
|
1227
|
+
changedMatches
|
|
1228
|
+
};
|
|
1229
|
+
}
|
|
1230
|
+
async function walk(directoryPath) {
|
|
1231
|
+
let entries;
|
|
1232
|
+
try {
|
|
1233
|
+
entries = await fs.readdir(directoryPath, { withFileTypes: true });
|
|
1234
|
+
}
|
|
1235
|
+
catch {
|
|
1236
|
+
return;
|
|
1237
|
+
}
|
|
1238
|
+
for (const entry of entries) {
|
|
1239
|
+
const entryPath = ensureInsideWorkspace(workspaceRoot, path.join(directoryPath, entry.name));
|
|
1240
|
+
if (entry.isSymbolicLink())
|
|
1241
|
+
continue;
|
|
1242
|
+
if (entry.isDirectory()) {
|
|
1243
|
+
if (isSkippedSearchDirectory(entry.name))
|
|
1244
|
+
continue;
|
|
1245
|
+
await walk(entryPath);
|
|
1246
|
+
continue;
|
|
1247
|
+
}
|
|
1248
|
+
if (!entry.isFile())
|
|
1249
|
+
continue;
|
|
1250
|
+
if (fileMask && !matchesFileMask(entry.name, fileMask))
|
|
1251
|
+
continue;
|
|
1252
|
+
try {
|
|
1253
|
+
const stat = await fs.stat(entryPath);
|
|
1254
|
+
if (stat.size > SEARCH_MAX_FILE_BYTES)
|
|
1255
|
+
continue;
|
|
1256
|
+
}
|
|
1257
|
+
catch {
|
|
1258
|
+
continue;
|
|
1259
|
+
}
|
|
1260
|
+
const result = await replaceInFile(workspaceRoot, entryPath, keyword, replacement, ignoreCase);
|
|
1261
|
+
if (result.changed) {
|
|
1262
|
+
changedFiles += 1;
|
|
1263
|
+
changedMatches += result.count;
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
await walk(workspaceRoot);
|
|
1268
|
+
return {
|
|
1269
|
+
workspacePath: toDisplayPath(workspaceRoot),
|
|
1270
|
+
keyword,
|
|
1271
|
+
replacement,
|
|
1272
|
+
changedFiles,
|
|
1273
|
+
changedMatches
|
|
1274
|
+
};
|
|
1275
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAiC1C,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACjC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CACL,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAokCD,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,EAAE,CASpB"}
|