weixin-devtools-mcp 0.0.1 → 0.1.1

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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -128
  3. package/build/MiniProgramContext.d.ts +317 -0
  4. package/build/MiniProgramContext.d.ts.map +1 -0
  5. package/build/MiniProgramContext.js +696 -0
  6. package/build/MiniProgramContext.js.map +1 -0
  7. package/build/collectors/Collector.d.ts +127 -0
  8. package/build/collectors/Collector.d.ts.map +1 -0
  9. package/build/collectors/Collector.js +252 -0
  10. package/build/collectors/Collector.js.map +1 -0
  11. package/build/collectors/ConsoleCollector.d.ts +104 -0
  12. package/build/collectors/ConsoleCollector.d.ts.map +1 -0
  13. package/build/collectors/ConsoleCollector.js +157 -0
  14. package/build/collectors/ConsoleCollector.js.map +1 -0
  15. package/build/collectors/NetworkCollector.d.ts +167 -0
  16. package/build/collectors/NetworkCollector.d.ts.map +1 -0
  17. package/build/collectors/NetworkCollector.js +265 -0
  18. package/build/collectors/NetworkCollector.js.map +1 -0
  19. package/build/collectors/index.d.ts +13 -0
  20. package/build/collectors/index.d.ts.map +1 -0
  21. package/build/collectors/index.js +17 -0
  22. package/build/collectors/index.js.map +1 -0
  23. package/build/config/tool-profile.d.ts +30 -0
  24. package/build/config/tool-profile.d.ts.map +1 -0
  25. package/build/config/tool-profile.js +138 -0
  26. package/build/config/tool-profile.js.map +1 -0
  27. package/build/connection/adapters.d.ts +3 -0
  28. package/build/connection/adapters.d.ts.map +1 -0
  29. package/build/connection/adapters.js +134 -0
  30. package/build/connection/adapters.js.map +1 -0
  31. package/build/connection/errors.d.ts +34 -0
  32. package/build/connection/errors.d.ts.map +1 -0
  33. package/build/connection/errors.js +101 -0
  34. package/build/connection/errors.js.map +1 -0
  35. package/build/connection/health-probe.d.ts +4 -0
  36. package/build/connection/health-probe.d.ts.map +1 -0
  37. package/build/connection/health-probe.js +60 -0
  38. package/build/connection/health-probe.js.map +1 -0
  39. package/build/connection/index.d.ts +6 -0
  40. package/build/connection/index.d.ts.map +1 -0
  41. package/build/connection/index.js +6 -0
  42. package/build/connection/index.js.map +1 -0
  43. package/build/connection/manager.d.ts +19 -0
  44. package/build/connection/manager.d.ts.map +1 -0
  45. package/build/connection/manager.js +227 -0
  46. package/build/connection/manager.js.map +1 -0
  47. package/build/connection/resolver.d.ts +3 -0
  48. package/build/connection/resolver.d.ts.map +1 -0
  49. package/build/connection/resolver.js +99 -0
  50. package/build/connection/resolver.js.map +1 -0
  51. package/build/connection/types.d.ts +95 -0
  52. package/build/connection/types.d.ts.map +1 -0
  53. package/build/connection/types.js +16 -0
  54. package/build/connection/types.js.map +1 -0
  55. package/build/core/assertion.d.ts +22 -0
  56. package/build/core/assertion.d.ts.map +1 -0
  57. package/build/core/assertion.js +318 -0
  58. package/build/core/assertion.js.map +1 -0
  59. package/build/core/connection.d.ts +37 -0
  60. package/build/core/connection.d.ts.map +1 -0
  61. package/build/core/connection.js +745 -0
  62. package/build/core/connection.js.map +1 -0
  63. package/build/core/index.d.ts +13 -0
  64. package/build/core/index.d.ts.map +1 -0
  65. package/build/core/index.js +19 -0
  66. package/build/core/index.js.map +1 -0
  67. package/build/core/interaction.d.ts +22 -0
  68. package/build/core/interaction.d.ts.map +1 -0
  69. package/build/core/interaction.js +185 -0
  70. package/build/core/interaction.js.map +1 -0
  71. package/build/core/navigation.d.ts +26 -0
  72. package/build/core/navigation.d.ts.map +1 -0
  73. package/build/core/navigation.js +210 -0
  74. package/build/core/navigation.js.map +1 -0
  75. package/build/core/query.d.ts +14 -0
  76. package/build/core/query.d.ts.map +1 -0
  77. package/build/core/query.js +191 -0
  78. package/build/core/query.js.map +1 -0
  79. package/build/core/screenshot.d.ts +10 -0
  80. package/build/core/screenshot.d.ts.map +1 -0
  81. package/build/core/screenshot.js +93 -0
  82. package/build/core/screenshot.js.map +1 -0
  83. package/build/core/snapshot.d.ts +17 -0
  84. package/build/core/snapshot.d.ts.map +1 -0
  85. package/build/core/snapshot.js +225 -0
  86. package/build/core/snapshot.js.map +1 -0
  87. package/build/core/types.d.ts +250 -0
  88. package/build/core/types.d.ts.map +1 -0
  89. package/build/core/types.js +6 -0
  90. package/build/core/types.js.map +1 -0
  91. package/build/formatters/consoleFormatter.d.ts +50 -0
  92. package/build/formatters/consoleFormatter.d.ts.map +1 -0
  93. package/build/formatters/consoleFormatter.js +116 -0
  94. package/build/formatters/consoleFormatter.js.map +1 -0
  95. package/build/formatters/snapshotFormatter.d.ts +41 -0
  96. package/build/formatters/snapshotFormatter.d.ts.map +1 -0
  97. package/build/formatters/snapshotFormatter.js +156 -0
  98. package/build/formatters/snapshotFormatter.js.map +1 -0
  99. package/build/index.d.ts +11 -0
  100. package/build/index.d.ts.map +1 -0
  101. package/build/index.js +45 -9
  102. package/build/index.js.map +1 -0
  103. package/build/server.d.ts +7 -0
  104. package/build/server.d.ts.map +1 -0
  105. package/build/server.js +88 -32
  106. package/build/server.js.map +1 -0
  107. package/build/tools/ToolDefinition.d.ts +265 -0
  108. package/build/tools/ToolDefinition.d.ts.map +1 -0
  109. package/build/tools/ToolDefinition.js +16 -7
  110. package/build/tools/ToolDefinition.js.map +1 -0
  111. package/build/tools/assert.d.ts +17 -0
  112. package/build/tools/assert.d.ts.map +1 -0
  113. package/build/tools/assert.js +63 -103
  114. package/build/tools/assert.js.map +1 -0
  115. package/build/tools/connection.d.ts +13 -0
  116. package/build/tools/connection.d.ts.map +1 -0
  117. package/build/tools/connection.js +338 -611
  118. package/build/tools/connection.js.map +1 -0
  119. package/build/tools/console.d.ts +20 -0
  120. package/build/tools/console.d.ts.map +1 -0
  121. package/build/tools/console.js +162 -152
  122. package/build/tools/console.js.map +1 -0
  123. package/build/tools/diagnose.d.ts +22 -0
  124. package/build/tools/diagnose.d.ts.map +1 -0
  125. package/build/tools/diagnose.js +406 -13
  126. package/build/tools/diagnose.js.map +1 -0
  127. package/build/tools/index.d.ts +6 -0
  128. package/build/tools/index.d.ts.map +1 -0
  129. package/build/tools/index.js +3 -77
  130. package/build/tools/index.js.map +1 -0
  131. package/build/tools/input.d.ts +21 -0
  132. package/build/tools/input.d.ts.map +1 -0
  133. package/build/tools/input.js +73 -139
  134. package/build/tools/input.js.map +1 -0
  135. package/build/tools/navigate.d.ts +21 -0
  136. package/build/tools/navigate.d.ts.map +1 -0
  137. package/build/tools/navigate.js +63 -126
  138. package/build/tools/navigate.js.map +1 -0
  139. package/build/tools/network.d.ts +21 -0
  140. package/build/tools/network.d.ts.map +1 -0
  141. package/build/tools/network.js +214 -1044
  142. package/build/tools/network.js.map +1 -0
  143. package/build/tools/page.d.ts +13 -0
  144. package/build/tools/page.d.ts.map +1 -0
  145. package/build/tools/page.js +6 -3
  146. package/build/tools/page.js.map +1 -0
  147. package/build/tools/screenshot.d.ts +9 -0
  148. package/build/tools/screenshot.d.ts.map +1 -0
  149. package/build/tools/screenshot.js +3 -1
  150. package/build/tools/screenshot.js.map +1 -0
  151. package/build/tools/script.d.ts +6 -0
  152. package/build/tools/script.d.ts.map +1 -0
  153. package/build/tools/script.js +92 -0
  154. package/build/tools/script.js.map +1 -0
  155. package/build/tools/snapshot.d.ts +9 -0
  156. package/build/tools/snapshot.d.ts.map +1 -0
  157. package/build/tools/snapshot.js +78 -12
  158. package/build/tools/snapshot.js.map +1 -0
  159. package/build/tools/tools.d.ts +15 -0
  160. package/build/tools/tools.d.ts.map +1 -0
  161. package/build/tools/tools.js +63 -0
  162. package/build/tools/tools.js.map +1 -0
  163. package/build/tools.d.ts +431 -0
  164. package/build/tools.d.ts.map +1 -0
  165. package/build/tools.js +258 -118
  166. package/build/tools.js.map +1 -0
  167. package/build/types/errors.d.ts +189 -0
  168. package/build/types/errors.d.ts.map +1 -0
  169. package/build/types/errors.js +257 -0
  170. package/build/types/errors.js.map +1 -0
  171. package/build/utils/error.d.ts +6 -0
  172. package/build/utils/error.d.ts.map +1 -0
  173. package/build/utils/error.js +11 -0
  174. package/build/utils/error.js.map +1 -0
  175. package/build/utils/idGenerator.d.ts +21 -0
  176. package/build/utils/idGenerator.d.ts.map +1 -0
  177. package/build/utils/idGenerator.js +23 -0
  178. package/build/utils/idGenerator.js.map +1 -0
  179. package/build/version.d.ts +7 -0
  180. package/build/version.d.ts.map +1 -0
  181. package/build/version.js +10 -0
  182. package/build/version.js.map +1 -0
  183. package/package.json +31 -9
@@ -0,0 +1,227 @@
1
+ import { executeConnectionStrategy } from './adapters.js';
2
+ import { HealthCheckConnectionError, ValidationConnectionError, normalizeConnectionError, } from './errors.js';
3
+ import { probeConnectionHealth } from './health-probe.js';
4
+ import { resolveConnectionPlan } from './resolver.js';
5
+ import { createDisconnectedStatus, } from './types.js';
6
+ const DISCONNECT_SETTLE_DELAY_MS = 200;
7
+ const RECONNECT_DELAY_MS = 300;
8
+ function createConnectionId() {
9
+ return `conn_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;
10
+ }
11
+ function cloneStatus(status) {
12
+ return {
13
+ ...status,
14
+ health: status.health
15
+ ? {
16
+ ...status.health,
17
+ checks: status.health.checks.map(check => ({ ...check })),
18
+ }
19
+ : null,
20
+ lastError: status.lastError ? { ...status.lastError } : null,
21
+ };
22
+ }
23
+ export class ConnectionManager {
24
+ #session = null;
25
+ #status = createDisconnectedStatus();
26
+ #lastRequest = null;
27
+ #lifecycleQueue = Promise.resolve();
28
+ #enqueueLifecycleOperation(operation) {
29
+ const task = this.#lifecycleQueue.then(operation, operation);
30
+ this.#lifecycleQueue = task.then(() => undefined, () => undefined);
31
+ return task;
32
+ }
33
+ async #cleanupMiniProgram(miniProgram) {
34
+ try {
35
+ await miniProgram.disconnect();
36
+ }
37
+ catch {
38
+ // 忽略断连异常,始终收敛本地状态
39
+ }
40
+ await new Promise(resolve => setTimeout(resolve, DISCONNECT_SETTLE_DELAY_MS));
41
+ }
42
+ async #cleanupCurrentSession(options) {
43
+ const activeSession = this.#session;
44
+ this.#session = null;
45
+ if (activeSession?.miniProgram) {
46
+ await this.#cleanupMiniProgram(activeSession.miniProgram);
47
+ }
48
+ this.#status = {
49
+ ...createDisconnectedStatus(),
50
+ lastError: options?.lastError ?? null,
51
+ };
52
+ if (options?.clearLastRequest) {
53
+ this.#lastRequest = null;
54
+ }
55
+ return this.getStatusSnapshot();
56
+ }
57
+ async #connectInternal(request) {
58
+ const plan = resolveConnectionPlan(request);
59
+ // 单活语义:新建连接前先清理已有会话
60
+ await this.#cleanupCurrentSession();
61
+ this.#status = {
62
+ ...createDisconnectedStatus(),
63
+ state: 'connecting',
64
+ connected: false,
65
+ strategyUsed: null,
66
+ endpoint: null,
67
+ lastError: null,
68
+ };
69
+ const startedAt = Date.now();
70
+ const warnings = [];
71
+ let latestError = null;
72
+ for (const strategy of plan.attempts) {
73
+ const attemptStartedAt = Date.now();
74
+ let attemptSession = null;
75
+ try {
76
+ const adapterResult = await executeConnectionStrategy(strategy, plan.request);
77
+ attemptSession = {
78
+ miniProgram: adapterResult.miniProgram,
79
+ currentPage: adapterResult.currentPage,
80
+ };
81
+ const connectMs = Date.now() - attemptStartedAt;
82
+ const healthStart = Date.now();
83
+ const health = plan.request.healthCheck
84
+ ? await probeConnectionHealth(adapterResult.miniProgram)
85
+ : {
86
+ level: 'healthy',
87
+ checks: [],
88
+ checkedAt: new Date().toISOString(),
89
+ };
90
+ if (health.level === 'unhealthy') {
91
+ throw new HealthCheckConnectionError('连接后健康检查失败', {
92
+ strategy,
93
+ endpoint: adapterResult.endpoint,
94
+ });
95
+ }
96
+ const connectionId = createConnectionId();
97
+ const totalMs = Date.now() - startedAt;
98
+ const healthMs = Date.now() - healthStart;
99
+ const pagePath = adapterResult.pagePath;
100
+ const status = health.level === 'healthy' ? 'connected' : 'degraded';
101
+ this.#session = attemptSession;
102
+ attemptSession = null;
103
+ this.#lastRequest = {
104
+ ...plan.request,
105
+ strategy,
106
+ fallback: plan.request.fallback.filter(item => item !== strategy),
107
+ };
108
+ this.#status = {
109
+ connectionId,
110
+ state: status,
111
+ strategyUsed: adapterResult.strategyUsed,
112
+ endpoint: adapterResult.endpoint,
113
+ connected: true,
114
+ hasCurrentPage: pagePath.length > 0,
115
+ pagePath,
116
+ health,
117
+ lastError: null,
118
+ lastConnectedAt: new Date().toISOString(),
119
+ lastHealthCheckAt: health.checkedAt,
120
+ };
121
+ return {
122
+ ...adapterResult,
123
+ connectionId,
124
+ health,
125
+ status,
126
+ timing: {
127
+ totalMs,
128
+ connectMs,
129
+ healthMs,
130
+ },
131
+ warnings,
132
+ };
133
+ }
134
+ catch (error) {
135
+ if (attemptSession?.miniProgram) {
136
+ await this.#cleanupMiniProgram(attemptSession.miniProgram);
137
+ attemptSession = null;
138
+ }
139
+ latestError = normalizeConnectionError(error instanceof Error ? error : new Error(String(error)));
140
+ warnings.push(`[${strategy}] ${latestError.message}`);
141
+ }
142
+ }
143
+ if (!latestError) {
144
+ latestError = new ValidationConnectionError('未执行任何连接尝试');
145
+ }
146
+ await this.#cleanupCurrentSession({
147
+ lastError: latestError.toSummary(),
148
+ });
149
+ throw latestError;
150
+ }
151
+ async #reconnectInternal(request) {
152
+ const baseRequest = request ?? this.#lastRequest;
153
+ if (!baseRequest) {
154
+ throw new ValidationConnectionError('没有可用于重连的历史连接参数', ['调用 reconnect_devtools 时显式传入连接参数']);
155
+ }
156
+ await this.#disconnectInternal();
157
+ await new Promise(resolve => setTimeout(resolve, RECONNECT_DELAY_MS));
158
+ return this.#connectInternal(baseRequest);
159
+ }
160
+ async #disconnectInternal() {
161
+ return this.#cleanupCurrentSession();
162
+ }
163
+ async #refreshHealthInternal() {
164
+ if (!this.#session) {
165
+ this.#status = createDisconnectedStatus();
166
+ return this.getStatusSnapshot();
167
+ }
168
+ const health = await probeConnectionHealth(this.#session.miniProgram);
169
+ const levelToState = {
170
+ healthy: 'connected',
171
+ degraded: 'degraded',
172
+ unhealthy: 'disconnected',
173
+ };
174
+ if (health.level === 'unhealthy') {
175
+ return this.#cleanupCurrentSession({
176
+ lastError: {
177
+ code: 'HEALTH_CHECK_FAILED',
178
+ phase: 'health_check',
179
+ message: '连接健康检查失败,已自动断开连接',
180
+ suggestions: ['调用 connect_devtools 或 reconnect_devtools 重新建立连接'],
181
+ timestamp: new Date().toISOString(),
182
+ },
183
+ });
184
+ }
185
+ const pagePath = this.#session.currentPage ? await this.#session.currentPage.path : null;
186
+ this.#status = {
187
+ ...this.#status,
188
+ state: levelToState[health.level],
189
+ connected: true,
190
+ hasCurrentPage: !!pagePath,
191
+ pagePath,
192
+ health,
193
+ lastHealthCheckAt: health.checkedAt,
194
+ };
195
+ return this.getStatusSnapshot();
196
+ }
197
+ getSession() {
198
+ return this.#session;
199
+ }
200
+ getStatusSnapshot() {
201
+ return cloneStatus(this.#status);
202
+ }
203
+ getLastRequest() {
204
+ return this.#lastRequest ? { ...this.#lastRequest, fallback: [...this.#lastRequest.fallback] } : null;
205
+ }
206
+ async connect(request) {
207
+ return this.#enqueueLifecycleOperation(() => this.#connectInternal(request));
208
+ }
209
+ async reconnect(request) {
210
+ return this.#enqueueLifecycleOperation(() => this.#reconnectInternal(request));
211
+ }
212
+ async disconnect() {
213
+ return this.#enqueueLifecycleOperation(() => this.#disconnectInternal());
214
+ }
215
+ async refreshHealth() {
216
+ return this.#enqueueLifecycleOperation(() => this.#refreshHealthInternal());
217
+ }
218
+ markDisconnectedWithError(error) {
219
+ this.#session = null;
220
+ this.#status = {
221
+ ...createDisconnectedStatus(),
222
+ lastError: error,
223
+ };
224
+ return this.getStatusSnapshot();
225
+ }
226
+ }
227
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/connection/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ConnectionRequest, ResolvedConnectionPlan } from './types.js';
2
+ export declare function resolveConnectionPlan(rawRequest: ConnectionRequest): ResolvedConnectionPlan;
3
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/connection/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EAEjB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAkHpB,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,iBAAiB,GAAG,sBAAsB,CA4B3F"}
@@ -0,0 +1,99 @@
1
+ import { ValidationConnectionError } from './errors.js';
2
+ const DEFAULT_TIMEOUT_MS = 45_000;
3
+ const DEFAULT_FALLBACK_FOR_LAUNCH = ['connect'];
4
+ const DEFAULT_FALLBACK_FOR_CONNECT = ['launch'];
5
+ const DEFAULT_FALLBACK_FOR_ENDPOINT = ['discover', 'launch', 'connect'];
6
+ function uniqueStrategies(strategies) {
7
+ const result = [];
8
+ for (const strategy of strategies) {
9
+ if (!result.includes(strategy)) {
10
+ result.push(strategy);
11
+ }
12
+ }
13
+ return result;
14
+ }
15
+ function resolvePrimaryStrategy(request) {
16
+ if (request.strategy) {
17
+ return request.strategy;
18
+ }
19
+ if (request.wsEndpoint) {
20
+ return 'wsEndpoint';
21
+ }
22
+ if (request.browserUrl) {
23
+ return 'browserUrl';
24
+ }
25
+ if (request.autoDiscover) {
26
+ return 'discover';
27
+ }
28
+ return 'auto';
29
+ }
30
+ function resolveFallbackStrategies(primary, request) {
31
+ if (request.fallback && request.fallback.length > 0) {
32
+ return request.fallback.filter(strategy => strategy !== primary);
33
+ }
34
+ if (primary === 'launch') {
35
+ return [...DEFAULT_FALLBACK_FOR_LAUNCH];
36
+ }
37
+ if (primary === 'connect') {
38
+ return [...DEFAULT_FALLBACK_FOR_CONNECT];
39
+ }
40
+ if (primary === 'wsEndpoint' || primary === 'browserUrl') {
41
+ return [...DEFAULT_FALLBACK_FOR_ENDPOINT];
42
+ }
43
+ if (primary === 'discover') {
44
+ const fallback = [];
45
+ if (request.projectPath) {
46
+ fallback.push('launch', 'connect');
47
+ }
48
+ return fallback;
49
+ }
50
+ if (primary === 'auto') {
51
+ return request.projectPath ? ['launch', 'connect'] : ['discover'];
52
+ }
53
+ return [];
54
+ }
55
+ function validateRequest(request) {
56
+ if (request.wsHeaders !== undefined) {
57
+ throw new ValidationConnectionError('当前连接链路不支持 wsHeaders 参数', ['请移除 wsHeaders 参数后重试'], { strategy: request.strategy });
58
+ }
59
+ if (request.strategy === 'launch' || request.strategy === 'connect') {
60
+ if (!request.projectPath) {
61
+ throw new ValidationConnectionError(`${request.strategy} 策略要求提供 projectPath`, ['为 connect_devtools 传入 projectPath'], { strategy: request.strategy });
62
+ }
63
+ }
64
+ if (request.strategy === 'wsEndpoint' && !request.wsEndpoint) {
65
+ throw new ValidationConnectionError('wsEndpoint 策略要求提供 wsEndpoint', ['设置 wsEndpoint,例如 ws://127.0.0.1:9420']);
66
+ }
67
+ if (request.strategy === 'browserUrl' && !request.browserUrl) {
68
+ throw new ValidationConnectionError('browserUrl 策略要求提供 browserUrl', ['设置 browserUrl,例如 http://127.0.0.1:9222']);
69
+ }
70
+ if (request.timeoutMs <= 0) {
71
+ throw new ValidationConnectionError('timeoutMs 必须是正数', ['设置一个大于 0 的超时时间'], { timeoutMs: request.timeoutMs });
72
+ }
73
+ }
74
+ export function resolveConnectionPlan(rawRequest) {
75
+ const strategy = resolvePrimaryStrategy(rawRequest);
76
+ const fallback = uniqueStrategies(resolveFallbackStrategies(strategy, rawRequest));
77
+ const request = {
78
+ strategy,
79
+ projectPath: rawRequest.projectPath,
80
+ cliPath: rawRequest.cliPath,
81
+ autoPort: rawRequest.autoPort,
82
+ browserUrl: rawRequest.browserUrl,
83
+ wsEndpoint: rawRequest.wsEndpoint,
84
+ wsHeaders: rawRequest.wsHeaders,
85
+ timeoutMs: rawRequest.timeoutMs ?? DEFAULT_TIMEOUT_MS,
86
+ fallback,
87
+ healthCheck: rawRequest.healthCheck ?? true,
88
+ verbose: rawRequest.verbose ?? false,
89
+ autoAudits: rawRequest.autoAudits,
90
+ autoDiscover: rawRequest.autoDiscover ?? true,
91
+ };
92
+ validateRequest(request);
93
+ const attempts = uniqueStrategies([request.strategy, ...request.fallback]);
94
+ return {
95
+ request,
96
+ attempts,
97
+ };
98
+ }
99
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/connection/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { MiniProgram, Page } from 'miniprogram-automator';
2
+ export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'degraded';
3
+ export type ConnectionStrategy = 'auto' | 'launch' | 'connect' | 'wsEndpoint' | 'browserUrl' | 'discover';
4
+ export type ConnectionPhase = 'resolve' | 'startup' | 'connect' | 'health_check' | 'disconnect';
5
+ export type MetadataValue = string | number | boolean | null;
6
+ export interface ConnectionErrorSummary {
7
+ code: string;
8
+ phase: ConnectionPhase;
9
+ message: string;
10
+ suggestions: string[];
11
+ metadata?: Record<string, MetadataValue>;
12
+ timestamp: string;
13
+ }
14
+ export interface ConnectionRequest {
15
+ strategy?: ConnectionStrategy;
16
+ projectPath?: string;
17
+ cliPath?: string;
18
+ autoPort?: number;
19
+ browserUrl?: string;
20
+ wsEndpoint?: string;
21
+ wsHeaders?: Record<string, string>;
22
+ timeoutMs?: number;
23
+ fallback?: ConnectionStrategy[];
24
+ healthCheck?: boolean;
25
+ verbose?: boolean;
26
+ autoAudits?: boolean;
27
+ autoDiscover?: boolean;
28
+ }
29
+ export interface ResolvedConnectionRequest {
30
+ strategy: ConnectionStrategy;
31
+ projectPath?: string;
32
+ cliPath?: string;
33
+ autoPort?: number;
34
+ browserUrl?: string;
35
+ wsEndpoint?: string;
36
+ wsHeaders?: Record<string, string>;
37
+ timeoutMs: number;
38
+ fallback: ConnectionStrategy[];
39
+ healthCheck: boolean;
40
+ verbose: boolean;
41
+ autoAudits?: boolean;
42
+ autoDiscover: boolean;
43
+ }
44
+ export interface ResolvedConnectionPlan {
45
+ request: ResolvedConnectionRequest;
46
+ attempts: ConnectionStrategy[];
47
+ }
48
+ export type HealthCheckName = 'transport' | 'session' | 'page';
49
+ export type HealthCheckStatus = 'pass' | 'fail';
50
+ export interface HealthCheckItem {
51
+ name: HealthCheckName;
52
+ status: HealthCheckStatus;
53
+ message: string;
54
+ durationMs: number;
55
+ }
56
+ export type HealthLevel = 'healthy' | 'degraded' | 'unhealthy';
57
+ export interface ConnectionHealth {
58
+ level: HealthLevel;
59
+ checks: HealthCheckItem[];
60
+ checkedAt: string;
61
+ }
62
+ export interface AdapterConnectionResult {
63
+ strategyUsed: ConnectionStrategy;
64
+ endpoint: string | null;
65
+ miniProgram: MiniProgram;
66
+ currentPage: Page;
67
+ pagePath: string;
68
+ }
69
+ export interface ConnectionTiming {
70
+ totalMs: number;
71
+ connectMs: number;
72
+ healthMs: number;
73
+ }
74
+ export interface ConnectionConnectResult extends AdapterConnectionResult {
75
+ connectionId: string;
76
+ health: ConnectionHealth;
77
+ status: Extract<ConnectionState, 'connected' | 'degraded'>;
78
+ timing: ConnectionTiming;
79
+ warnings: string[];
80
+ }
81
+ export interface ConnectionStatusSnapshot {
82
+ connectionId: string | null;
83
+ state: ConnectionState;
84
+ strategyUsed: ConnectionStrategy | null;
85
+ endpoint: string | null;
86
+ connected: boolean;
87
+ hasCurrentPage: boolean;
88
+ pagePath: string | null;
89
+ health: ConnectionHealth | null;
90
+ lastError: ConnectionErrorSummary | null;
91
+ lastConnectedAt: string | null;
92
+ lastHealthCheckAt: string | null;
93
+ }
94
+ export declare function createDisconnectedStatus(): ConnectionStatusSnapshot;
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/connection/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export function createDisconnectedStatus() {
2
+ return {
3
+ connectionId: null,
4
+ state: 'disconnected',
5
+ strategyUsed: null,
6
+ endpoint: null,
7
+ connected: false,
8
+ hasCurrentPage: false,
9
+ pagePath: null,
10
+ health: null,
11
+ lastError: null,
12
+ lastConnectedAt: null,
13
+ lastHealthCheckAt: null,
14
+ };
15
+ }
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/connection/types.ts"],"names":[],"mappings":"AAyHA,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,KAAK,EAAE,cAAc;QACrB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI;QACf,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,IAAI;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 断言验证核心逻辑
3
+ * 从 src/tools.ts 提取
4
+ */
5
+ import type { ElementMapInfo, AssertResult, ExistenceAssertOptions, StateAssertOptions, ContentAssertOptions } from './types.js';
6
+ /**
7
+ * 断言元素存在性
8
+ */
9
+ export declare function assertElementExists(page: any, options: ExistenceAssertOptions): Promise<AssertResult>;
10
+ /**
11
+ * 断言元素可见性
12
+ */
13
+ export declare function assertElementVisible(page: any, elementMap: Map<string, ElementMapInfo>, options: StateAssertOptions): Promise<AssertResult>;
14
+ /**
15
+ * 断言元素文本内容
16
+ */
17
+ export declare function assertElementText(page: any, elementMap: Map<string, ElementMapInfo>, options: ContentAssertOptions): Promise<AssertResult>;
18
+ /**
19
+ * 断言元素属性
20
+ */
21
+ export declare function assertElementAttribute(page: any, elementMap: Map<string, ElementMapInfo>, options: ContentAssertOptions): Promise<AssertResult>;
22
+ //# sourceMappingURL=assertion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion.d.ts","sourceRoot":"","sources":["../../src/core/assertion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CA4DvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,GAAG,EACT,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAmFvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,GAAG,EACT,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAuGvB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,GAAG,EACT,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAkFvB"}