openhorse 0.1.7 → 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.
Files changed (143) hide show
  1. package/dist/agents/coordinator.d.ts +86 -0
  2. package/dist/agents/coordinator.d.ts.map +1 -0
  3. package/dist/agents/coordinator.js +251 -0
  4. package/dist/agents/coordinator.js.map +1 -0
  5. package/dist/agents/fork.d.ts +61 -0
  6. package/dist/agents/fork.d.ts.map +1 -0
  7. package/dist/agents/fork.js +169 -0
  8. package/dist/agents/fork.js.map +1 -0
  9. package/dist/agents/worker-pool.d.ts +72 -0
  10. package/dist/agents/worker-pool.d.ts.map +1 -0
  11. package/dist/agents/worker-pool.js +213 -0
  12. package/dist/agents/worker-pool.js.map +1 -0
  13. package/dist/cli.js +74 -6
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +57 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/framework/query.d.ts +4 -0
  19. package/dist/framework/query.d.ts.map +1 -1
  20. package/dist/framework/query.js +29 -1
  21. package/dist/framework/query.js.map +1 -1
  22. package/dist/services/auth/auth.d.ts +121 -0
  23. package/dist/services/auth/auth.d.ts.map +1 -0
  24. package/dist/services/auth/auth.js +233 -0
  25. package/dist/services/auth/auth.js.map +1 -0
  26. package/dist/services/auth/aws.d.ts +27 -0
  27. package/dist/services/auth/aws.d.ts.map +1 -0
  28. package/dist/services/auth/aws.js +109 -0
  29. package/dist/services/auth/aws.js.map +1 -0
  30. package/dist/services/auth/index.d.ts +6 -0
  31. package/dist/services/auth/index.d.ts.map +1 -0
  32. package/dist/services/auth/index.js +17 -0
  33. package/dist/services/auth/index.js.map +1 -0
  34. package/dist/services/auto-fix/autoFixConfig.d.ts +33 -0
  35. package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -0
  36. package/dist/services/auto-fix/autoFixConfig.js +61 -0
  37. package/dist/services/auto-fix/autoFixConfig.js.map +1 -0
  38. package/dist/services/auto-fix/autoFixHook.d.ts +20 -0
  39. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -0
  40. package/dist/services/auto-fix/autoFixHook.js +89 -0
  41. package/dist/services/auto-fix/autoFixHook.js.map +1 -0
  42. package/dist/services/auto-fix/autoFixRunner.d.ts +60 -0
  43. package/dist/services/auto-fix/autoFixRunner.d.ts.map +1 -0
  44. package/dist/services/auto-fix/autoFixRunner.js +207 -0
  45. package/dist/services/auto-fix/autoFixRunner.js.map +1 -0
  46. package/dist/services/auto-fix/index.d.ts +7 -0
  47. package/dist/services/auto-fix/index.d.ts.map +1 -0
  48. package/dist/services/auto-fix/index.js +17 -0
  49. package/dist/services/auto-fix/index.js.map +1 -0
  50. package/dist/services/compact/auto-compact.d.ts +53 -0
  51. package/dist/services/compact/auto-compact.d.ts.map +1 -0
  52. package/dist/services/compact/auto-compact.js +114 -0
  53. package/dist/services/compact/auto-compact.js.map +1 -0
  54. package/dist/services/compact/compact.d.ts +51 -0
  55. package/dist/services/compact/compact.d.ts.map +1 -0
  56. package/dist/services/compact/compact.js +120 -0
  57. package/dist/services/compact/compact.js.map +1 -0
  58. package/dist/services/compact/index.d.ts +10 -0
  59. package/dist/services/compact/index.d.ts.map +1 -0
  60. package/dist/services/compact/index.js +23 -0
  61. package/dist/services/compact/index.js.map +1 -0
  62. package/dist/services/compact/micro-compact.d.ts +21 -0
  63. package/dist/services/compact/micro-compact.d.ts.map +1 -0
  64. package/dist/services/compact/micro-compact.js +99 -0
  65. package/dist/services/compact/micro-compact.js.map +1 -0
  66. package/dist/services/compact/summary-generator.d.ts +25 -0
  67. package/dist/services/compact/summary-generator.d.ts.map +1 -0
  68. package/dist/services/compact/summary-generator.js +128 -0
  69. package/dist/services/compact/summary-generator.js.map +1 -0
  70. package/dist/services/concurrent-sessions.d.ts +97 -0
  71. package/dist/services/concurrent-sessions.d.ts.map +1 -0
  72. package/dist/services/concurrent-sessions.js +263 -0
  73. package/dist/services/concurrent-sessions.js.map +1 -0
  74. package/dist/services/diagnostic-tracking/diagnosticTracking.d.ts +58 -0
  75. package/dist/services/diagnostic-tracking/diagnosticTracking.d.ts.map +1 -0
  76. package/dist/services/diagnostic-tracking/diagnosticTracking.js +167 -0
  77. package/dist/services/diagnostic-tracking/diagnosticTracking.js.map +1 -0
  78. package/dist/services/diagnostic-tracking/formatter.d.ts +17 -0
  79. package/dist/services/diagnostic-tracking/formatter.d.ts.map +1 -0
  80. package/dist/services/diagnostic-tracking/formatter.js +78 -0
  81. package/dist/services/diagnostic-tracking/formatter.js.map +1 -0
  82. package/dist/services/diagnostic-tracking/index.d.ts +7 -0
  83. package/dist/services/diagnostic-tracking/index.d.ts.map +1 -0
  84. package/dist/services/diagnostic-tracking/index.js +19 -0
  85. package/dist/services/diagnostic-tracking/index.js.map +1 -0
  86. package/dist/services/diagnostic-tracking/types.d.ts +52 -0
  87. package/dist/services/diagnostic-tracking/types.d.ts.map +1 -0
  88. package/dist/services/diagnostic-tracking/types.js +27 -0
  89. package/dist/services/diagnostic-tracking/types.js.map +1 -0
  90. package/dist/services/mcp/index.d.ts +5 -0
  91. package/dist/services/mcp/index.d.ts.map +1 -0
  92. package/dist/services/mcp/index.js +16 -0
  93. package/dist/services/mcp/index.js.map +1 -0
  94. package/dist/services/mcp/transports.d.ts +104 -0
  95. package/dist/services/mcp/transports.d.ts.map +1 -0
  96. package/dist/services/mcp/transports.js +342 -0
  97. package/dist/services/mcp/transports.js.map +1 -0
  98. package/dist/services/session-memory/index.d.ts +6 -0
  99. package/dist/services/session-memory/index.d.ts.map +1 -0
  100. package/dist/services/session-memory/index.js +15 -0
  101. package/dist/services/session-memory/index.js.map +1 -0
  102. package/dist/services/session-memory/prompts.d.ts +23 -0
  103. package/dist/services/session-memory/prompts.d.ts.map +1 -0
  104. package/dist/services/session-memory/prompts.js +70 -0
  105. package/dist/services/session-memory/prompts.js.map +1 -0
  106. package/dist/services/session-memory/sessionMemory.d.ts +64 -0
  107. package/dist/services/session-memory/sessionMemory.d.ts.map +1 -0
  108. package/dist/services/session-memory/sessionMemory.js +243 -0
  109. package/dist/services/session-memory/sessionMemory.js.map +1 -0
  110. package/dist/services/smart-routing.d.ts +41 -0
  111. package/dist/services/smart-routing.d.ts.map +1 -0
  112. package/dist/services/smart-routing.js +134 -0
  113. package/dist/services/smart-routing.js.map +1 -0
  114. package/dist/tools/git.d.ts +14 -0
  115. package/dist/tools/git.d.ts.map +1 -0
  116. package/dist/tools/git.js +270 -0
  117. package/dist/tools/git.js.map +1 -0
  118. package/dist/tools/index.d.ts.map +1 -1
  119. package/dist/tools/index.js +80 -14
  120. package/dist/tools/index.js.map +1 -1
  121. package/dist/tools/lsp.d.ts +18 -0
  122. package/dist/tools/lsp.d.ts.map +1 -0
  123. package/dist/tools/lsp.js +450 -0
  124. package/dist/tools/lsp.js.map +1 -0
  125. package/dist/tools/web.d.ts.map +1 -1
  126. package/dist/tools/web.js +70 -38
  127. package/dist/tools/web.js.map +1 -1
  128. package/dist/ui/command-panel.d.ts +5 -0
  129. package/dist/ui/command-panel.d.ts.map +1 -1
  130. package/dist/ui/command-panel.js +59 -18
  131. package/dist/ui/command-panel.js.map +1 -1
  132. package/dist/ui/markdown.d.ts +10 -4
  133. package/dist/ui/markdown.d.ts.map +1 -1
  134. package/dist/ui/markdown.js +91 -4
  135. package/dist/ui/markdown.js.map +1 -1
  136. package/dist/ui/progress.d.ts +34 -0
  137. package/dist/ui/progress.d.ts.map +1 -0
  138. package/dist/ui/progress.js +88 -0
  139. package/dist/ui/progress.js.map +1 -0
  140. package/dist/ui/status-bar.d.ts.map +1 -1
  141. package/dist/ui/status-bar.js +10 -0
  142. package/dist/ui/status-bar.js.map +1 -1
  143. 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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"}