openhorse 0.1.8 → 0.1.10
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/agents/coordinator.d.ts +86 -0
- package/dist/agents/coordinator.d.ts.map +1 -0
- package/dist/agents/coordinator.js +251 -0
- package/dist/agents/coordinator.js.map +1 -0
- package/dist/agents/fork.d.ts +61 -0
- package/dist/agents/fork.d.ts.map +1 -0
- package/dist/agents/fork.js +169 -0
- package/dist/agents/fork.js.map +1 -0
- package/dist/agents/worker-pool.d.ts +72 -0
- package/dist/agents/worker-pool.d.ts.map +1 -0
- package/dist/agents/worker-pool.js +213 -0
- package/dist/agents/worker-pool.js.map +1 -0
- package/dist/cli.js +74 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +57 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/framework/query.d.ts +4 -0
- package/dist/framework/query.d.ts.map +1 -1
- package/dist/framework/query.js +29 -1
- package/dist/framework/query.js.map +1 -1
- package/dist/services/auth/auth.d.ts +121 -0
- package/dist/services/auth/auth.d.ts.map +1 -0
- package/dist/services/auth/auth.js +233 -0
- package/dist/services/auth/auth.js.map +1 -0
- package/dist/services/auth/aws.d.ts +27 -0
- package/dist/services/auth/aws.d.ts.map +1 -0
- package/dist/services/auth/aws.js +109 -0
- package/dist/services/auth/aws.js.map +1 -0
- package/dist/services/auth/index.d.ts +6 -0
- package/dist/services/auth/index.d.ts.map +1 -0
- package/dist/services/auth/index.js +17 -0
- package/dist/services/auth/index.js.map +1 -0
- package/dist/services/auto-fix/autoFixConfig.d.ts +33 -0
- package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -0
- package/dist/services/auto-fix/autoFixConfig.js +61 -0
- package/dist/services/auto-fix/autoFixConfig.js.map +1 -0
- package/dist/services/auto-fix/autoFixHook.d.ts +20 -0
- package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -0
- package/dist/services/auto-fix/autoFixHook.js +89 -0
- package/dist/services/auto-fix/autoFixHook.js.map +1 -0
- package/dist/services/auto-fix/autoFixRunner.d.ts +60 -0
- package/dist/services/auto-fix/autoFixRunner.d.ts.map +1 -0
- package/dist/services/auto-fix/autoFixRunner.js +207 -0
- package/dist/services/auto-fix/autoFixRunner.js.map +1 -0
- package/dist/services/auto-fix/index.d.ts +7 -0
- package/dist/services/auto-fix/index.d.ts.map +1 -0
- package/dist/services/auto-fix/index.js +17 -0
- package/dist/services/auto-fix/index.js.map +1 -0
- package/dist/services/compact/auto-compact.d.ts +53 -0
- package/dist/services/compact/auto-compact.d.ts.map +1 -0
- package/dist/services/compact/auto-compact.js +114 -0
- package/dist/services/compact/auto-compact.js.map +1 -0
- package/dist/services/compact/compact.d.ts +51 -0
- package/dist/services/compact/compact.d.ts.map +1 -0
- package/dist/services/compact/compact.js +120 -0
- package/dist/services/compact/compact.js.map +1 -0
- package/dist/services/compact/index.d.ts +10 -0
- package/dist/services/compact/index.d.ts.map +1 -0
- package/dist/services/compact/index.js +23 -0
- package/dist/services/compact/index.js.map +1 -0
- package/dist/services/compact/micro-compact.d.ts +21 -0
- package/dist/services/compact/micro-compact.d.ts.map +1 -0
- package/dist/services/compact/micro-compact.js +99 -0
- package/dist/services/compact/micro-compact.js.map +1 -0
- package/dist/services/compact/summary-generator.d.ts +25 -0
- package/dist/services/compact/summary-generator.d.ts.map +1 -0
- package/dist/services/compact/summary-generator.js +128 -0
- package/dist/services/compact/summary-generator.js.map +1 -0
- package/dist/services/concurrent-sessions.d.ts +97 -0
- package/dist/services/concurrent-sessions.d.ts.map +1 -0
- package/dist/services/concurrent-sessions.js +263 -0
- package/dist/services/concurrent-sessions.js.map +1 -0
- package/dist/services/diagnostic-tracking/diagnosticTracking.d.ts +58 -0
- package/dist/services/diagnostic-tracking/diagnosticTracking.d.ts.map +1 -0
- package/dist/services/diagnostic-tracking/diagnosticTracking.js +167 -0
- package/dist/services/diagnostic-tracking/diagnosticTracking.js.map +1 -0
- package/dist/services/diagnostic-tracking/formatter.d.ts +17 -0
- package/dist/services/diagnostic-tracking/formatter.d.ts.map +1 -0
- package/dist/services/diagnostic-tracking/formatter.js +78 -0
- package/dist/services/diagnostic-tracking/formatter.js.map +1 -0
- package/dist/services/diagnostic-tracking/index.d.ts +7 -0
- package/dist/services/diagnostic-tracking/index.d.ts.map +1 -0
- package/dist/services/diagnostic-tracking/index.js +19 -0
- package/dist/services/diagnostic-tracking/index.js.map +1 -0
- package/dist/services/diagnostic-tracking/types.d.ts +52 -0
- package/dist/services/diagnostic-tracking/types.d.ts.map +1 -0
- package/dist/services/diagnostic-tracking/types.js +27 -0
- package/dist/services/diagnostic-tracking/types.js.map +1 -0
- package/dist/services/mcp/index.d.ts +5 -0
- package/dist/services/mcp/index.d.ts.map +1 -0
- package/dist/services/mcp/index.js +16 -0
- package/dist/services/mcp/index.js.map +1 -0
- package/dist/services/mcp/transports.d.ts +104 -0
- package/dist/services/mcp/transports.d.ts.map +1 -0
- package/dist/services/mcp/transports.js +342 -0
- package/dist/services/mcp/transports.js.map +1 -0
- package/dist/services/session-memory/index.d.ts +6 -0
- package/dist/services/session-memory/index.d.ts.map +1 -0
- package/dist/services/session-memory/index.js +15 -0
- package/dist/services/session-memory/index.js.map +1 -0
- package/dist/services/session-memory/prompts.d.ts +23 -0
- package/dist/services/session-memory/prompts.d.ts.map +1 -0
- package/dist/services/session-memory/prompts.js +70 -0
- package/dist/services/session-memory/prompts.js.map +1 -0
- package/dist/services/session-memory/sessionMemory.d.ts +64 -0
- package/dist/services/session-memory/sessionMemory.d.ts.map +1 -0
- package/dist/services/session-memory/sessionMemory.js +243 -0
- package/dist/services/session-memory/sessionMemory.js.map +1 -0
- package/dist/services/smart-routing.d.ts +41 -0
- package/dist/services/smart-routing.d.ts.map +1 -0
- package/dist/services/smart-routing.js +134 -0
- package/dist/services/smart-routing.js.map +1 -0
- package/dist/tools/git.d.ts +14 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +270 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +80 -14
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +18 -0
- package/dist/tools/lsp.d.ts.map +1 -0
- package/dist/tools/lsp.js +450 -0
- package/dist/tools/lsp.js.map +1 -0
- package/dist/tools/web.d.ts.map +1 -1
- package/dist/tools/web.js +70 -38
- package/dist/tools/web.js.map +1 -1
- package/dist/ui/command-panel.d.ts +5 -0
- package/dist/ui/command-panel.d.ts.map +1 -1
- package/dist/ui/command-panel.js +59 -18
- package/dist/ui/command-panel.js.map +1 -1
- package/dist/ui/markdown.d.ts +10 -4
- package/dist/ui/markdown.d.ts.map +1 -1
- package/dist/ui/markdown.js +91 -4
- package/dist/ui/markdown.js.map +1 -1
- package/dist/ui/progress.d.ts +34 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +88 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/status-bar.d.ts.map +1 -1
- package/dist/ui/status-bar.js +10 -0
- package/dist/ui/status-bar.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - Auth 服务
|
|
4
|
+
*
|
|
5
|
+
* 支持 OAuth + API Key + AWS STS 认证。
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.SecureStorage = exports.AuthService = void 0;
|
|
9
|
+
exports.getAuthService = getAuthService;
|
|
10
|
+
exports.resetAuthService = resetAuthService;
|
|
11
|
+
exports.getSecureStorage = getSecureStorage;
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
const config_dir_1 = require("../config-dir");
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Auth Service
|
|
17
|
+
// ============================================================================
|
|
18
|
+
class AuthService {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.config = null;
|
|
21
|
+
(0, config_dir_1.ensureConfigDir)();
|
|
22
|
+
this.configPath = (0, path_1.join)((0, config_dir_1.getConfigDir)(), 'auth.json');
|
|
23
|
+
this.load();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 加载认证配置
|
|
27
|
+
*/
|
|
28
|
+
load() {
|
|
29
|
+
if (!(0, fs_1.existsSync)(this.configPath)) {
|
|
30
|
+
this.config = {};
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const content = (0, fs_1.readFileSync)(this.configPath, 'utf-8');
|
|
35
|
+
this.config = JSON.parse(content);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
this.config = {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 保存认证配置
|
|
43
|
+
*/
|
|
44
|
+
save() {
|
|
45
|
+
(0, fs_1.writeFileSync)(this.configPath, JSON.stringify(this.config, null, 2), {
|
|
46
|
+
mode: 0o600, // 仅用户可读写
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 设置 API Key
|
|
51
|
+
*/
|
|
52
|
+
setApiKey(key, source = 'user') {
|
|
53
|
+
if (!this.config)
|
|
54
|
+
this.config = {};
|
|
55
|
+
this.config.apiKey = {
|
|
56
|
+
key,
|
|
57
|
+
source,
|
|
58
|
+
createdAt: Date.now(),
|
|
59
|
+
};
|
|
60
|
+
this.save();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 获取 API Key
|
|
64
|
+
*/
|
|
65
|
+
getApiKey() {
|
|
66
|
+
// 1. 从环境变量获取
|
|
67
|
+
const envKey = process.env.OPENHORSE_API_KEY || process.env.ANTHROPIC_API_KEY;
|
|
68
|
+
if (envKey) {
|
|
69
|
+
return envKey;
|
|
70
|
+
}
|
|
71
|
+
// 2. 从配置文件获取
|
|
72
|
+
if (this.config?.apiKey?.key) {
|
|
73
|
+
return this.config.apiKey.key;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 设置 OAuth Token
|
|
79
|
+
*/
|
|
80
|
+
setOAuthToken(provider, accessToken, refreshToken, expiresAt) {
|
|
81
|
+
if (!this.config)
|
|
82
|
+
this.config = {};
|
|
83
|
+
this.config.oauth = {
|
|
84
|
+
provider,
|
|
85
|
+
accessToken,
|
|
86
|
+
refreshToken,
|
|
87
|
+
expiresAt,
|
|
88
|
+
};
|
|
89
|
+
this.save();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 获取 OAuth Token
|
|
93
|
+
*/
|
|
94
|
+
getOAuthToken() {
|
|
95
|
+
if (!this.config?.oauth) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// 检查是否过期
|
|
99
|
+
if (this.config.oauth.expiresAt && Date.now() > this.config.oauth.expiresAt) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return this.config.oauth;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 设置 AWS 认证
|
|
106
|
+
*/
|
|
107
|
+
setAwsAuth(profile, region) {
|
|
108
|
+
if (!this.config)
|
|
109
|
+
this.config = {};
|
|
110
|
+
this.config.aws = {
|
|
111
|
+
profile,
|
|
112
|
+
region: region || 'us-east-1',
|
|
113
|
+
};
|
|
114
|
+
this.save();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 获取 AWS 认证
|
|
118
|
+
*/
|
|
119
|
+
getAwsAuth() {
|
|
120
|
+
return this.config?.aws || null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 清除所有认证
|
|
124
|
+
*/
|
|
125
|
+
clear() {
|
|
126
|
+
this.config = {};
|
|
127
|
+
this.save();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* 检查是否已认证
|
|
131
|
+
*/
|
|
132
|
+
isAuthenticated() {
|
|
133
|
+
return !!this.getApiKey() || !!this.getOAuthToken() || !!this.getAwsAuth();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 获取认证状态
|
|
137
|
+
*/
|
|
138
|
+
getStatus() {
|
|
139
|
+
return {
|
|
140
|
+
hasApiKey: !!this.getApiKey(),
|
|
141
|
+
hasOAuth: !!this.getOAuthToken(),
|
|
142
|
+
hasAws: !!this.getAwsAuth(),
|
|
143
|
+
apiKeySource: this.config?.apiKey?.source,
|
|
144
|
+
oauthProvider: this.config?.oauth?.provider,
|
|
145
|
+
awsProfile: this.config?.aws?.profile,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.AuthService = AuthService;
|
|
150
|
+
// ============================================================================
|
|
151
|
+
// Secure Storage (macOS Keychain)
|
|
152
|
+
// ============================================================================
|
|
153
|
+
/**
|
|
154
|
+
* macOS Keychain 安全存储
|
|
155
|
+
* 注意:这是简化实现,实际需要调用 security 命令
|
|
156
|
+
*/
|
|
157
|
+
class SecureStorage {
|
|
158
|
+
/**
|
|
159
|
+
* 存储到 Keychain
|
|
160
|
+
*/
|
|
161
|
+
async store(service, account, password) {
|
|
162
|
+
// macOS: security add-generic-password
|
|
163
|
+
try {
|
|
164
|
+
// 简化实现:存储到加密文件
|
|
165
|
+
const storagePath = (0, path_1.join)((0, config_dir_1.getConfigDir)(), 'secure.json');
|
|
166
|
+
const content = (0, fs_1.existsSync)(storagePath)
|
|
167
|
+
? JSON.parse((0, fs_1.readFileSync)(storagePath, 'utf-8'))
|
|
168
|
+
: {};
|
|
169
|
+
content[`${service}:${account}`] = password;
|
|
170
|
+
(0, fs_1.writeFileSync)(storagePath, JSON.stringify(content), { mode: 0o600 });
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* 从 Keychain 获取
|
|
179
|
+
*/
|
|
180
|
+
async retrieve(service, account) {
|
|
181
|
+
try {
|
|
182
|
+
const storagePath = (0, path_1.join)((0, config_dir_1.getConfigDir)(), 'secure.json');
|
|
183
|
+
if (!(0, fs_1.existsSync)(storagePath)) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const content = JSON.parse((0, fs_1.readFileSync)(storagePath, 'utf-8'));
|
|
187
|
+
return content[`${service}:${account}`] || null;
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 从 Keychain 删除
|
|
195
|
+
*/
|
|
196
|
+
async delete(service, account) {
|
|
197
|
+
try {
|
|
198
|
+
const storagePath = (0, path_1.join)((0, config_dir_1.getConfigDir)(), 'secure.json');
|
|
199
|
+
if (!(0, fs_1.existsSync)(storagePath)) {
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
const content = JSON.parse((0, fs_1.readFileSync)(storagePath, 'utf-8'));
|
|
203
|
+
delete content[`${service}:${account}`];
|
|
204
|
+
(0, fs_1.writeFileSync)(storagePath, JSON.stringify(content), { mode: 0o600 });
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.SecureStorage = SecureStorage;
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// 单例
|
|
215
|
+
// ============================================================================
|
|
216
|
+
let authService = null;
|
|
217
|
+
function getAuthService() {
|
|
218
|
+
if (!authService) {
|
|
219
|
+
authService = new AuthService();
|
|
220
|
+
}
|
|
221
|
+
return authService;
|
|
222
|
+
}
|
|
223
|
+
function resetAuthService() {
|
|
224
|
+
authService = null;
|
|
225
|
+
}
|
|
226
|
+
let secureStorage = null;
|
|
227
|
+
function getSecureStorage() {
|
|
228
|
+
if (!secureStorage) {
|
|
229
|
+
secureStorage = new SecureStorage();
|
|
230
|
+
}
|
|
231
|
+
return secureStorage;
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/services/auth/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openhorse - AWS STS 验证
|
|
3
|
+
*
|
|
4
|
+
* 验证 AWS 凭证并获取临时 Token。
|
|
5
|
+
*/
|
|
6
|
+
import type { AwsAuth } from './auth';
|
|
7
|
+
export interface StsResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
accessKeyId?: string;
|
|
10
|
+
secretAccessKey?: string;
|
|
11
|
+
sessionToken?: string;
|
|
12
|
+
expiration?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 验证 AWS 凭证
|
|
17
|
+
*/
|
|
18
|
+
export declare function verifyAwsCredentials(auth: AwsAuth): Promise<StsResult>;
|
|
19
|
+
/**
|
|
20
|
+
* 获取临时 STS Token
|
|
21
|
+
*/
|
|
22
|
+
export declare function getStsToken(auth: AwsAuth, durationSeconds?: number): Promise<StsResult>;
|
|
23
|
+
/**
|
|
24
|
+
* 检测 AWS CLI 是否可用
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkAwsCliAvailable(): Promise<boolean>;
|
|
27
|
+
//# sourceMappingURL=aws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../../src/services/auth/aws.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAsC5E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,OAAO,EACb,eAAe,GAAE,MAAa,GAC7B,OAAO,CAAC,SAAS,CAAC,CA0CpB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQ7D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - AWS STS 验证
|
|
4
|
+
*
|
|
5
|
+
* 验证 AWS 凭证并获取临时 Token。
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.verifyAwsCredentials = verifyAwsCredentials;
|
|
9
|
+
exports.getStsToken = getStsToken;
|
|
10
|
+
exports.checkAwsCliAvailable = checkAwsCliAvailable;
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
/**
|
|
13
|
+
* 验证 AWS 凭证
|
|
14
|
+
*/
|
|
15
|
+
async function verifyAwsCredentials(auth) {
|
|
16
|
+
// 尝试调用 AWS CLI
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
const profile = auth.profile || 'default';
|
|
19
|
+
const region = auth.region || 'us-east-1';
|
|
20
|
+
(0, child_process_1.execFile)('aws', [
|
|
21
|
+
'sts',
|
|
22
|
+
'get-caller-identity',
|
|
23
|
+
'--profile', profile,
|
|
24
|
+
'--region', region,
|
|
25
|
+
'--output', 'json',
|
|
26
|
+
], {
|
|
27
|
+
timeout: 10000,
|
|
28
|
+
}, (error, stdout, stderr) => {
|
|
29
|
+
if (error) {
|
|
30
|
+
resolve({
|
|
31
|
+
success: false,
|
|
32
|
+
error: stderr.toString() || error.message,
|
|
33
|
+
});
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const result = JSON.parse(stdout.toString());
|
|
38
|
+
resolve({
|
|
39
|
+
success: true,
|
|
40
|
+
// get-caller-identity 不返回凭证,仅验证身份
|
|
41
|
+
accessKeyId: result.Arn?.split(':')[4]?.split('/')[1],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
resolve({
|
|
46
|
+
success: false,
|
|
47
|
+
error: 'Failed to parse AWS response',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 获取临时 STS Token
|
|
55
|
+
*/
|
|
56
|
+
async function getStsToken(auth, durationSeconds = 3600) {
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
const profile = auth.profile || 'default';
|
|
59
|
+
const region = auth.region || 'us-east-1';
|
|
60
|
+
(0, child_process_1.execFile)('aws', [
|
|
61
|
+
'sts',
|
|
62
|
+
'get-session-token',
|
|
63
|
+
'--profile', profile,
|
|
64
|
+
'--region', region,
|
|
65
|
+
'--duration-seconds', String(durationSeconds),
|
|
66
|
+
'--output', 'json',
|
|
67
|
+
], {
|
|
68
|
+
timeout: 15000,
|
|
69
|
+
}, (error, stdout, stderr) => {
|
|
70
|
+
if (error) {
|
|
71
|
+
resolve({
|
|
72
|
+
success: false,
|
|
73
|
+
error: stderr.toString() || error.message,
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const result = JSON.parse(stdout.toString());
|
|
79
|
+
const credentials = result.Credentials;
|
|
80
|
+
resolve({
|
|
81
|
+
success: true,
|
|
82
|
+
accessKeyId: credentials.AccessKeyId,
|
|
83
|
+
secretAccessKey: credentials.SecretAccessKey,
|
|
84
|
+
sessionToken: credentials.SessionToken,
|
|
85
|
+
expiration: credentials.Expiration,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
resolve({
|
|
90
|
+
success: false,
|
|
91
|
+
error: 'Failed to parse STS response',
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 检测 AWS CLI 是否可用
|
|
99
|
+
*/
|
|
100
|
+
async function checkAwsCliAvailable() {
|
|
101
|
+
return new Promise((resolve) => {
|
|
102
|
+
(0, child_process_1.execFile)('aws', ['--version'], {
|
|
103
|
+
timeout: 5000,
|
|
104
|
+
}, (error) => {
|
|
105
|
+
resolve(!error);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=aws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/services/auth/aws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openhorse - Auth 服务入口
|
|
3
|
+
*/
|
|
4
|
+
export { AuthService, getAuthService, resetAuthService, SecureStorage, getSecureStorage, type AuthConfig, type ApiKeyAuth, type OAuthAuth, type AwsAuth, } from './auth';
|
|
5
|
+
export { verifyAwsCredentials, getStsToken, checkAwsCliAvailable, type StsResult, } from './aws';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,OAAO,GACb,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACpB,KAAK,SAAS,GACf,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - Auth 服务入口
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkAwsCliAvailable = exports.getStsToken = exports.verifyAwsCredentials = exports.getSecureStorage = exports.SecureStorage = exports.resetAuthService = exports.getAuthService = exports.AuthService = void 0;
|
|
7
|
+
var auth_1 = require("./auth");
|
|
8
|
+
Object.defineProperty(exports, "AuthService", { enumerable: true, get: function () { return auth_1.AuthService; } });
|
|
9
|
+
Object.defineProperty(exports, "getAuthService", { enumerable: true, get: function () { return auth_1.getAuthService; } });
|
|
10
|
+
Object.defineProperty(exports, "resetAuthService", { enumerable: true, get: function () { return auth_1.resetAuthService; } });
|
|
11
|
+
Object.defineProperty(exports, "SecureStorage", { enumerable: true, get: function () { return auth_1.SecureStorage; } });
|
|
12
|
+
Object.defineProperty(exports, "getSecureStorage", { enumerable: true, get: function () { return auth_1.getSecureStorage; } });
|
|
13
|
+
var aws_1 = require("./aws");
|
|
14
|
+
Object.defineProperty(exports, "verifyAwsCredentials", { enumerable: true, get: function () { return aws_1.verifyAwsCredentials; } });
|
|
15
|
+
Object.defineProperty(exports, "getStsToken", { enumerable: true, get: function () { return aws_1.getStsToken; } });
|
|
16
|
+
Object.defineProperty(exports, "checkAwsCliAvailable", { enumerable: true, get: function () { return aws_1.checkAwsCliAvailable; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/auth/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,+BAUgB;AATd,mGAAA,WAAW,OAAA;AACX,sGAAA,cAAc,OAAA;AACd,wGAAA,gBAAgB,OAAA;AAChB,qGAAA,aAAa,OAAA;AACb,wGAAA,gBAAgB,OAAA;AAOlB,6BAKe;AAJb,2GAAA,oBAAoB,OAAA;AACpB,kGAAA,WAAW,OAAA;AACX,2GAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openhorse - AutoFix 配置
|
|
3
|
+
*
|
|
4
|
+
* 定义 lint、test 命令和修复策略。
|
|
5
|
+
*/
|
|
6
|
+
export interface AutoFixConfig {
|
|
7
|
+
/** 是否启用 */
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
/** Lint 命令 */
|
|
10
|
+
lintCommand?: string;
|
|
11
|
+
/** Test 命令 */
|
|
12
|
+
testCommand?: string;
|
|
13
|
+
/** Build 命令 */
|
|
14
|
+
buildCommand?: string;
|
|
15
|
+
/** 超时时间(ms) */
|
|
16
|
+
timeout: number;
|
|
17
|
+
/** 最大修复尝试次数 */
|
|
18
|
+
maxFixAttempts: number;
|
|
19
|
+
/** 触发条件 */
|
|
20
|
+
triggers: AutoFixTrigger[];
|
|
21
|
+
}
|
|
22
|
+
export interface AutoFixTrigger {
|
|
23
|
+
/** 触发类型 */
|
|
24
|
+
type: 'file_edit' | 'file_write' | 'manual' | 'post_tool';
|
|
25
|
+
/** 文件模式(glob) */
|
|
26
|
+
filePattern?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const DEFAULT_AUTOFIX_CONFIG: AutoFixConfig;
|
|
29
|
+
/**
|
|
30
|
+
* 检测项目配置
|
|
31
|
+
*/
|
|
32
|
+
export declare function detectAutoFixConfig(projectPath: string): AutoFixConfig;
|
|
33
|
+
//# sourceMappingURL=autoFixConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoFixConfig.d.ts","sourceRoot":"","sources":["../../../src/services/auto-fix/autoFixConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC1D,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,eAAO,MAAM,sBAAsB,EAAE,aAYpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA6BtE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - AutoFix 配置
|
|
4
|
+
*
|
|
5
|
+
* 定义 lint、test 命令和修复策略。
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DEFAULT_AUTOFIX_CONFIG = void 0;
|
|
9
|
+
exports.detectAutoFixConfig = detectAutoFixConfig;
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// 默认配置
|
|
12
|
+
// ============================================================================
|
|
13
|
+
exports.DEFAULT_AUTOFIX_CONFIG = {
|
|
14
|
+
enabled: true,
|
|
15
|
+
lintCommand: 'npm run lint',
|
|
16
|
+
testCommand: 'npm test',
|
|
17
|
+
buildCommand: 'npm run build',
|
|
18
|
+
timeout: 60000,
|
|
19
|
+
maxFixAttempts: 3,
|
|
20
|
+
triggers: [
|
|
21
|
+
{ type: 'file_edit', filePattern: '**/*.ts' },
|
|
22
|
+
{ type: 'file_write', filePattern: '**/*.ts' },
|
|
23
|
+
{ type: 'file_edit', filePattern: '**/*.js' },
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* 检测项目配置
|
|
28
|
+
*/
|
|
29
|
+
function detectAutoFixConfig(projectPath) {
|
|
30
|
+
// 尝试读取 package.json
|
|
31
|
+
try {
|
|
32
|
+
const pkgPath = (0, path_1.join)(projectPath, 'package.json');
|
|
33
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, 'utf-8'));
|
|
34
|
+
const config = { ...exports.DEFAULT_AUTOFIX_CONFIG };
|
|
35
|
+
// 检测 lint 命令
|
|
36
|
+
if (pkg.scripts?.lint) {
|
|
37
|
+
config.lintCommand = 'npm run lint';
|
|
38
|
+
}
|
|
39
|
+
else if (pkg.scripts?.eslint) {
|
|
40
|
+
config.lintCommand = 'npm run eslint';
|
|
41
|
+
}
|
|
42
|
+
// 检测 test 命令
|
|
43
|
+
if (pkg.scripts?.test) {
|
|
44
|
+
config.testCommand = 'npm test';
|
|
45
|
+
}
|
|
46
|
+
// 检测 build 命令
|
|
47
|
+
if (pkg.scripts?.build) {
|
|
48
|
+
config.buildCommand = 'npm run build';
|
|
49
|
+
}
|
|
50
|
+
return config;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return exports.DEFAULT_AUTOFIX_CONFIG;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// 导入辅助(放在末尾避免循环依赖)
|
|
58
|
+
// ============================================================================
|
|
59
|
+
const path_1 = require("path");
|
|
60
|
+
const fs_1 = require("fs");
|
|
61
|
+
//# sourceMappingURL=autoFixConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoFixConfig.js","sourceRoot":"","sources":["../../../src/services/auto-fix/autoFixConfig.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAmDH,kDA6BC;AAlDD,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAElE,QAAA,sBAAsB,GAAkB;IACnD,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,eAAe;IAC7B,OAAO,EAAE,KAAK;IACd,cAAc,EAAE,CAAC;IACjB,QAAQ,EAAE;QACR,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE;QAC7C,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE;KAC9C;CACF,CAAC;AAEF;;GAEG;AACH,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,oBAAoB;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAkB,EAAE,GAAG,8BAAsB,EAAE,CAAC;QAE5D,aAAa;QACb,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,WAAW,GAAG,cAAc,CAAC;QACtC,CAAC;aAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC;QACxC,CAAC;QAED,aAAa;QACb,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YACtB,MAAM,CAAC,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC;QAED,cAAc;QACd,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACvB,MAAM,CAAC,YAAY,GAAG,eAAe,CAAC;QACxC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,8BAAsB,CAAC;IAChC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,+BAA4B;AAC5B,2BAAkC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* openhorse - AutoFix Hook
|
|
3
|
+
*
|
|
4
|
+
* Post-sampling hook,在工具执行后触发 AutoFix。
|
|
5
|
+
*/
|
|
6
|
+
import type { QueryEvent } from '../../framework/query';
|
|
7
|
+
import type { AutoFixTrigger } from './autoFixConfig';
|
|
8
|
+
/**
|
|
9
|
+
* 检查工具调用是否触发 AutoFix
|
|
10
|
+
*/
|
|
11
|
+
export declare function shouldTriggerAutoFix(toolName: string, args: Record<string, unknown>, triggers: AutoFixTrigger[]): {
|
|
12
|
+
trigger: boolean;
|
|
13
|
+
files: string[];
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* AutoFix Hook 处理器
|
|
17
|
+
*/
|
|
18
|
+
export declare function autoFixHook(event: QueryEvent, triggers: AutoFixTrigger[]): Promise<void>;
|
|
19
|
+
export { autoFixHook as postToolHook };
|
|
20
|
+
//# sourceMappingURL=autoFixHook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoFixHook.d.ts","sourceRoot":"","sources":["../../../src/services/auto-fix/autoFixHook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,cAAc,EAAE,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CA0BvC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,cAAc,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Bf;AA4BD,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* openhorse - AutoFix Hook
|
|
4
|
+
*
|
|
5
|
+
* Post-sampling hook,在工具执行后触发 AutoFix。
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.shouldTriggerAutoFix = shouldTriggerAutoFix;
|
|
9
|
+
exports.autoFixHook = autoFixHook;
|
|
10
|
+
exports.postToolHook = autoFixHook;
|
|
11
|
+
const autoFixRunner_1 = require("./autoFixRunner");
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Hook 实现
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* 检查工具调用是否触发 AutoFix
|
|
17
|
+
*/
|
|
18
|
+
function shouldTriggerAutoFix(toolName, args, triggers) {
|
|
19
|
+
const result = { trigger: false, files: [] };
|
|
20
|
+
for (const trigger of triggers) {
|
|
21
|
+
if (trigger.type === 'file_edit' && toolName === 'edit_file') {
|
|
22
|
+
const path = args.path;
|
|
23
|
+
if (path && matchesPattern(path, trigger.filePattern)) {
|
|
24
|
+
result.trigger = true;
|
|
25
|
+
result.files.push(path);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (trigger.type === 'file_write' && toolName === 'write_file') {
|
|
29
|
+
const path = args.path;
|
|
30
|
+
if (path && matchesPattern(path, trigger.filePattern)) {
|
|
31
|
+
result.trigger = true;
|
|
32
|
+
result.files.push(path);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (trigger.type === 'post_tool' && toolName === trigger.filePattern) {
|
|
36
|
+
result.trigger = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* AutoFix Hook 处理器
|
|
43
|
+
*/
|
|
44
|
+
async function autoFixHook(event, triggers) {
|
|
45
|
+
if (event.type !== 'tool_result') {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// 检查是否触发
|
|
49
|
+
const check = shouldTriggerAutoFix(event.name, {}, triggers);
|
|
50
|
+
if (!check.trigger) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// 运行 AutoFix
|
|
54
|
+
const runner = (0, autoFixRunner_1.getAutoFixRunner)();
|
|
55
|
+
const context = {
|
|
56
|
+
projectPath: process.cwd(),
|
|
57
|
+
changedFiles: check.files,
|
|
58
|
+
trigger: triggers[0],
|
|
59
|
+
};
|
|
60
|
+
const result = await runner.run(context);
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
console.log(`[AutoFix] ${result.errors.length} issues found after ${event.name}`);
|
|
63
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
64
|
+
console.log(` - ${err.type}: ${err.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
console.log(`[AutoFix] All checks passed (${result.duration}ms)`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// 辅助函数
|
|
73
|
+
// ============================================================================
|
|
74
|
+
function matchesPattern(path, pattern) {
|
|
75
|
+
if (!pattern)
|
|
76
|
+
return true;
|
|
77
|
+
// 简化 glob 匹配
|
|
78
|
+
if (pattern.startsWith('**/*.')) {
|
|
79
|
+
const ext = pattern.slice(5);
|
|
80
|
+
return path.endsWith(ext);
|
|
81
|
+
}
|
|
82
|
+
if (pattern.includes('*')) {
|
|
83
|
+
// 简化处理
|
|
84
|
+
const regex = new RegExp(pattern.replace(/\*/g, '.*'));
|
|
85
|
+
return regex.test(path);
|
|
86
|
+
}
|
|
87
|
+
return path === pattern;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=autoFixHook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoFixHook.js","sourceRoot":"","sources":["../../../src/services/auto-fix/autoFixHook.ts"],"names":[],"mappings":"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"}
|