weixin-devtools-mcp 0.0.1 → 0.1.0

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -114
  3. package/build/MiniProgramContext.d.ts +307 -0
  4. package/build/MiniProgramContext.d.ts.map +1 -0
  5. package/build/MiniProgramContext.js +650 -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 +198 -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 +96 -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/formatters/consoleFormatter.d.ts +50 -0
  56. package/build/formatters/consoleFormatter.d.ts.map +1 -0
  57. package/build/formatters/consoleFormatter.js +116 -0
  58. package/build/formatters/consoleFormatter.js.map +1 -0
  59. package/build/formatters/snapshotFormatter.d.ts +41 -0
  60. package/build/formatters/snapshotFormatter.d.ts.map +1 -0
  61. package/build/formatters/snapshotFormatter.js +156 -0
  62. package/build/formatters/snapshotFormatter.js.map +1 -0
  63. package/build/index.d.ts +11 -0
  64. package/build/index.d.ts.map +1 -0
  65. package/build/index.js +45 -9
  66. package/build/index.js.map +1 -0
  67. package/build/server.d.ts +7 -0
  68. package/build/server.d.ts.map +1 -0
  69. package/build/server.js +70 -30
  70. package/build/server.js.map +1 -0
  71. package/build/tools/ToolDefinition.d.ts +215 -0
  72. package/build/tools/ToolDefinition.d.ts.map +1 -0
  73. package/build/tools/ToolDefinition.js +9 -7
  74. package/build/tools/ToolDefinition.js.map +1 -0
  75. package/build/tools/assert.d.ts +17 -0
  76. package/build/tools/assert.d.ts.map +1 -0
  77. package/build/tools/assert.js +8 -88
  78. package/build/tools/assert.js.map +1 -0
  79. package/build/tools/connection.d.ts +13 -0
  80. package/build/tools/connection.d.ts.map +1 -0
  81. package/build/tools/connection.js +332 -615
  82. package/build/tools/connection.js.map +1 -0
  83. package/build/tools/console.d.ts +20 -0
  84. package/build/tools/console.d.ts.map +1 -0
  85. package/build/tools/console.js +162 -152
  86. package/build/tools/console.js.map +1 -0
  87. package/build/tools/diagnose.d.ts +22 -0
  88. package/build/tools/diagnose.d.ts.map +1 -0
  89. package/build/tools/diagnose.js +400 -13
  90. package/build/tools/diagnose.js.map +1 -0
  91. package/build/tools/index.d.ts +6 -0
  92. package/build/tools/index.d.ts.map +1 -0
  93. package/build/tools/index.js +3 -77
  94. package/build/tools/index.js.map +1 -0
  95. package/build/tools/input.d.ts +21 -0
  96. package/build/tools/input.d.ts.map +1 -0
  97. package/build/tools/input.js +73 -139
  98. package/build/tools/input.js.map +1 -0
  99. package/build/tools/navigate.d.ts +21 -0
  100. package/build/tools/navigate.d.ts.map +1 -0
  101. package/build/tools/navigate.js +63 -126
  102. package/build/tools/navigate.js.map +1 -0
  103. package/build/tools/network.d.ts +17 -0
  104. package/build/tools/network.d.ts.map +1 -0
  105. package/build/tools/network.js +75 -887
  106. package/build/tools/network.js.map +1 -0
  107. package/build/tools/page.d.ts +13 -0
  108. package/build/tools/page.d.ts.map +1 -0
  109. package/build/tools/page.js +4 -1
  110. package/build/tools/page.js.map +1 -0
  111. package/build/tools/screenshot.d.ts +9 -0
  112. package/build/tools/screenshot.d.ts.map +1 -0
  113. package/build/tools/screenshot.js +3 -1
  114. package/build/tools/screenshot.js.map +1 -0
  115. package/build/tools/script.d.ts +6 -0
  116. package/build/tools/script.d.ts.map +1 -0
  117. package/build/tools/script.js +92 -0
  118. package/build/tools/script.js.map +1 -0
  119. package/build/tools/snapshot.d.ts +9 -0
  120. package/build/tools/snapshot.d.ts.map +1 -0
  121. package/build/tools/snapshot.js +78 -12
  122. package/build/tools/snapshot.js.map +1 -0
  123. package/build/tools/tools.d.ts +15 -0
  124. package/build/tools/tools.d.ts.map +1 -0
  125. package/build/tools/tools.js +62 -0
  126. package/build/tools/tools.js.map +1 -0
  127. package/build/tools.d.ts +431 -0
  128. package/build/tools.d.ts.map +1 -0
  129. package/build/tools.js +235 -117
  130. package/build/tools.js.map +1 -0
  131. package/build/types/errors.d.ts +189 -0
  132. package/build/types/errors.d.ts.map +1 -0
  133. package/build/types/errors.js +257 -0
  134. package/build/types/errors.js.map +1 -0
  135. package/build/utils/idGenerator.d.ts +21 -0
  136. package/build/utils/idGenerator.d.ts.map +1 -0
  137. package/build/utils/idGenerator.js +23 -0
  138. package/build/utils/idGenerator.js.map +1 -0
  139. package/package.json +34 -10
@@ -0,0 +1,96 @@
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.strategy === 'launch' || request.strategy === 'connect') {
57
+ if (!request.projectPath) {
58
+ throw new ValidationConnectionError(`${request.strategy} 策略要求提供 projectPath`, ['为 connect_devtools 传入 projectPath'], { strategy: request.strategy });
59
+ }
60
+ }
61
+ if (request.strategy === 'wsEndpoint' && !request.wsEndpoint) {
62
+ throw new ValidationConnectionError('wsEndpoint 策略要求提供 wsEndpoint', ['设置 wsEndpoint,例如 ws://127.0.0.1:9420']);
63
+ }
64
+ if (request.strategy === 'browserUrl' && !request.browserUrl) {
65
+ throw new ValidationConnectionError('browserUrl 策略要求提供 browserUrl', ['设置 browserUrl,例如 http://127.0.0.1:9222']);
66
+ }
67
+ if (request.timeoutMs <= 0) {
68
+ throw new ValidationConnectionError('timeoutMs 必须是正数', ['设置一个大于 0 的超时时间'], { timeoutMs: request.timeoutMs });
69
+ }
70
+ }
71
+ export function resolveConnectionPlan(rawRequest) {
72
+ const strategy = resolvePrimaryStrategy(rawRequest);
73
+ const fallback = uniqueStrategies(resolveFallbackStrategies(strategy, rawRequest));
74
+ const request = {
75
+ strategy,
76
+ projectPath: rawRequest.projectPath,
77
+ cliPath: rawRequest.cliPath,
78
+ autoPort: rawRequest.autoPort,
79
+ browserUrl: rawRequest.browserUrl,
80
+ wsEndpoint: rawRequest.wsEndpoint,
81
+ wsHeaders: rawRequest.wsHeaders,
82
+ timeoutMs: rawRequest.timeoutMs ?? DEFAULT_TIMEOUT_MS,
83
+ fallback,
84
+ healthCheck: rawRequest.healthCheck ?? true,
85
+ verbose: rawRequest.verbose ?? false,
86
+ autoAudits: rawRequest.autoAudits,
87
+ autoDiscover: rawRequest.autoDiscover ?? true,
88
+ };
89
+ validateRequest(request);
90
+ const attempts = uniqueStrategies([request.strategy, ...request.fallback]);
91
+ return {
92
+ request,
93
+ attempts,
94
+ };
95
+ }
96
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/connection/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAQxD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,2BAA2B,GAAyB,CAAC,SAAS,CAAC,CAAC;AACtE,MAAM,4BAA4B,GAAyB,CAAC,QAAQ,CAAC,CAAC;AACtE,MAAM,6BAA6B,GAAyB,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE9F,SAAS,gBAAgB,CAAC,UAAgC;IACxD,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA0B;IACxD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,QAAQ,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,yBAAyB,CAChC,OAA2B,EAC3B,OAA0B;IAE1B,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,2BAA2B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,4BAA4B,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,6BAA6B,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,OAAkC;IACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,yBAAyB,CACjC,GAAG,OAAO,CAAC,QAAQ,qBAAqB,EACxC,CAAC,mCAAmC,CAAC,EACrC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,CACjC,8BAA8B,EAC9B,CAAC,sCAAsC,CAAC,CACzC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,CACjC,8BAA8B,EAC9B,CAAC,wCAAwC,CAAC,CAC3C,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,yBAAyB,CACjC,iBAAiB,EACjB,CAAC,gBAAgB,CAAC,EAClB,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CACjC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAA6B;IACjE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAEnF,MAAM,OAAO,GAA8B;QACzC,QAAQ;QACR,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,kBAAkB;QACrD,QAAQ;QACR,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,IAAI;QAC3C,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK;QACpC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,IAAI;KAC9C,CAAC;IAEF,eAAe,CAAC,OAAO,CAAC,CAAC;IAEzB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE3E,OAAO;QACL,OAAO;QACP,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -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,50 @@
1
+ /**
2
+ * Console 消息格式化器
3
+ * 参考 chrome-devtools-mcp 的设计模式
4
+ */
5
+ /**
6
+ * 可过滤的 Console 消息类型(扩展到15+种)
7
+ */
8
+ export declare const FILTERABLE_MESSAGE_TYPES: readonly ["log", "debug", "info", "error", "warn", "dir", "dirxml", "table", "trace", "clear", "group", "groupCollapsed", "groupEnd", "assert", "count", "timeEnd", "verbose"];
9
+ export type ConsoleMessageType = typeof FILTERABLE_MESSAGE_TYPES[number];
10
+ /**
11
+ * Console 消息数据接口(用于格式化)
12
+ */
13
+ export interface ConsoleMessageData {
14
+ msgid: number;
15
+ type: string;
16
+ message?: string;
17
+ args?: any[];
18
+ timestamp?: string;
19
+ source?: string;
20
+ }
21
+ /**
22
+ * Exception 消息数据接口(用于格式化)
23
+ */
24
+ export interface ExceptionMessageData {
25
+ msgid: number;
26
+ type: 'exception';
27
+ message: string;
28
+ stack?: string;
29
+ timestamp?: string;
30
+ source?: string;
31
+ }
32
+ /**
33
+ * 简短格式化 Console 消息(用于列表视图)
34
+ * 格式:msgid=123 [error] Network timeout (2 args)
35
+ */
36
+ export declare function formatConsoleEventShort(data: ConsoleMessageData | ExceptionMessageData): string;
37
+ /**
38
+ * 详细格式化 Console 消息(用于详情视图)
39
+ * 包含完整的参数信息和堆栈跟踪
40
+ */
41
+ export declare function formatConsoleEventVerbose(data: ConsoleMessageData | ExceptionMessageData): string;
42
+ /**
43
+ * 格式化分页信息
44
+ */
45
+ export declare function formatPaginationInfo(total: number, pageSize: number, pageIdx: number): {
46
+ info: string[];
47
+ hasNextPage: boolean;
48
+ hasPreviousPage: boolean;
49
+ };
50
+ //# sourceMappingURL=consoleFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consoleFormatter.d.ts","sourceRoot":"","sources":["../../src/formatters/consoleFormatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,wBAAwB,gLAkB3B,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAuCD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,GAC9C,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,GAC9C,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IACD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAoBA"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Console 消息格式化器
3
+ * 参考 chrome-devtools-mcp 的设计模式
4
+ */
5
+ /**
6
+ * 可过滤的 Console 消息类型(扩展到15+种)
7
+ */
8
+ export const FILTERABLE_MESSAGE_TYPES = [
9
+ 'log',
10
+ 'debug',
11
+ 'info',
12
+ 'error',
13
+ 'warn',
14
+ 'dir',
15
+ 'dirxml',
16
+ 'table',
17
+ 'trace',
18
+ 'clear',
19
+ 'group',
20
+ 'groupCollapsed',
21
+ 'groupEnd',
22
+ 'assert',
23
+ 'count',
24
+ 'timeEnd',
25
+ 'verbose',
26
+ ];
27
+ /**
28
+ * 格式化单个参数
29
+ */
30
+ function formatArg(arg) {
31
+ if (typeof arg === 'object' && arg !== null) {
32
+ try {
33
+ return JSON.stringify(arg);
34
+ }
35
+ catch {
36
+ return String(arg);
37
+ }
38
+ }
39
+ return String(arg);
40
+ }
41
+ /**
42
+ * 格式化参数列表
43
+ */
44
+ function formatArgs(data) {
45
+ if (data.type === 'exception') {
46
+ return '';
47
+ }
48
+ // 类型收窄:此时 data 是 ConsoleMessageData
49
+ const consoleData = data;
50
+ if (!consoleData.args || consoleData.args.length === 0) {
51
+ return '';
52
+ }
53
+ const result = ['### Arguments'];
54
+ for (const [key, arg] of consoleData.args.entries()) {
55
+ result.push(`Arg #${key}: ${formatArg(arg)}`);
56
+ }
57
+ return result.join('\n');
58
+ }
59
+ /**
60
+ * 简短格式化 Console 消息(用于列表视图)
61
+ * 格式:msgid=123 [error] Network timeout (2 args)
62
+ */
63
+ export function formatConsoleEventShort(data) {
64
+ const argsCount = data.type === 'exception' ? 0 : (data.args?.length ?? 0);
65
+ const message = data.message || '';
66
+ return `msgid=${data.msgid} [${data.type}] ${message} (${argsCount} args)`;
67
+ }
68
+ /**
69
+ * 详细格式化 Console 消息(用于详情视图)
70
+ * 包含完整的参数信息和堆栈跟踪
71
+ */
72
+ export function formatConsoleEventVerbose(data) {
73
+ const lines = [
74
+ `ID: ${data.msgid}`,
75
+ `Type: ${data.type}`,
76
+ `Timestamp: ${data.timestamp || 'N/A'}`,
77
+ ];
78
+ if (data.source) {
79
+ lines.push(`Source: ${data.source}`);
80
+ }
81
+ if (data.message) {
82
+ lines.push(`Message: ${data.message}`);
83
+ }
84
+ // Exception 专属:堆栈跟踪
85
+ if (data.type === 'exception' && 'stack' in data && data.stack) {
86
+ lines.push('### Stack Trace');
87
+ lines.push(data.stack);
88
+ }
89
+ // Console 专属:参数列表
90
+ const argsFormatted = formatArgs(data);
91
+ if (argsFormatted) {
92
+ lines.push(argsFormatted);
93
+ }
94
+ return lines.join('\n');
95
+ }
96
+ /**
97
+ * 格式化分页信息
98
+ */
99
+ export function formatPaginationInfo(total, pageSize, pageIdx) {
100
+ const start = pageIdx * pageSize;
101
+ const end = Math.min(start + pageSize, total);
102
+ const hasNextPage = end < total;
103
+ const hasPreviousPage = pageIdx > 0;
104
+ const info = [
105
+ `Total: ${total} messages`,
106
+ `Showing: ${start + 1}-${end}`,
107
+ ];
108
+ if (hasNextPage) {
109
+ info.push(`Next page: ${pageIdx + 1}`);
110
+ }
111
+ if (hasPreviousPage) {
112
+ info.push(`Previous page: ${pageIdx - 1}`);
113
+ }
114
+ return { info, hasNextPage, hasPreviousPage };
115
+ }
116
+ //# sourceMappingURL=consoleFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consoleFormatter.js","sourceRoot":"","sources":["../../src/formatters/consoleFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 页面快照格式化器
3
+ * 提供多种输出格式以优化token使用和可读性
4
+ */
5
+ import type { PageSnapshot } from '../tools.js';
6
+ /**
7
+ * 输出格式类型
8
+ */
9
+ export type SnapshotFormat = 'compact' | 'minimal' | 'json';
10
+ /**
11
+ * 格式化配置选项
12
+ */
13
+ export interface FormatOptions {
14
+ /** 输出格式 */
15
+ format: SnapshotFormat;
16
+ /** 是否包含位置信息 */
17
+ includePosition?: boolean;
18
+ /** 是否包含属性信息 */
19
+ includeAttributes?: boolean;
20
+ /** 最大元素数量限制 */
21
+ maxElements?: number;
22
+ }
23
+ /**
24
+ * 格式化页面快照
25
+ *
26
+ * @param snapshot 页面快照数据
27
+ * @param options 格式化选项
28
+ * @returns 格式化后的字符串
29
+ */
30
+ export declare function formatSnapshot(snapshot: PageSnapshot, options?: FormatOptions): string;
31
+ /**
32
+ * Token使用估算
33
+ *
34
+ * 提供各种格式的token消耗估算,帮助用户选择合适的格式
35
+ */
36
+ export declare function estimateTokens(snapshot: PageSnapshot): {
37
+ compact: number;
38
+ minimal: number;
39
+ json: number;
40
+ };
41
+ //# sourceMappingURL=snapshotFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotFormatter.d.ts","sourceRoot":"","sources":["../../src/formatters/snapshotFormatter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW;IACX,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,aAAqC,GAC7C,MAAM,CAoBR;AA0ID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAWA"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * 页面快照格式化器
3
+ * 提供多种输出格式以优化token使用和可读性
4
+ */
5
+ /**
6
+ * 格式化页面快照
7
+ *
8
+ * @param snapshot 页面快照数据
9
+ * @param options 格式化选项
10
+ * @returns 格式化后的字符串
11
+ */
12
+ export function formatSnapshot(snapshot, options = { format: 'compact' }) {
13
+ const { format, maxElements } = options;
14
+ // 限制元素数量
15
+ const elements = maxElements
16
+ ? snapshot.elements.slice(0, maxElements)
17
+ : snapshot.elements;
18
+ const limitedSnapshot = { ...snapshot, elements };
19
+ switch (format) {
20
+ case 'compact':
21
+ return formatCompact(limitedSnapshot, options);
22
+ case 'minimal':
23
+ return formatMinimal(limitedSnapshot);
24
+ case 'json':
25
+ return formatJSON(limitedSnapshot, options);
26
+ default:
27
+ return formatCompact(limitedSnapshot, options);
28
+ }
29
+ }
30
+ /**
31
+ * 紧凑文本格式(类似chrome-devtools-mcp风格)
32
+ *
33
+ * 示例输出:
34
+ * # Page: pages/index/index
35
+ * # Elements: 5
36
+ *
37
+ * uid=view.container view "Welcome" pos=[0,64] size=[375x667]
38
+ * uid=button.submit button "Submit" pos=[100,400] size=[175x44]
39
+ */
40
+ function formatCompact(snapshot, options) {
41
+ const lines = [];
42
+ const { includePosition = true, includeAttributes = false } = options;
43
+ // 头部信息
44
+ lines.push(`# Page: ${snapshot.path}`);
45
+ lines.push(`# Elements: ${snapshot.elements.length}`);
46
+ lines.push('');
47
+ // 元素信息
48
+ for (const element of snapshot.elements) {
49
+ const parts = [];
50
+ // 必需字段:uid tagName
51
+ parts.push(`uid=${element.uid}`);
52
+ parts.push(element.tagName);
53
+ // 文本内容(引号包裹,转义特殊字符)
54
+ if (element.text) {
55
+ const escapedText = escapeText(element.text);
56
+ parts.push(`"${escapedText}"`);
57
+ }
58
+ // 位置信息(紧凑格式)
59
+ if (includePosition && element.position) {
60
+ const { left, top, width, height } = element.position;
61
+ parts.push(`pos=[${left},${top}]`);
62
+ parts.push(`size=[${width}x${height}]`);
63
+ }
64
+ // 属性信息(可选,键值对格式)
65
+ if (includeAttributes && element.attributes) {
66
+ const attrPairs = Object.entries(element.attributes)
67
+ .map(([key, value]) => `${key}="${value}"`)
68
+ .join(' ');
69
+ if (attrPairs) {
70
+ parts.push(attrPairs);
71
+ }
72
+ }
73
+ lines.push(parts.join(' '));
74
+ }
75
+ return lines.join('\n');
76
+ }
77
+ /**
78
+ * 最小化格式(仅保留核心识别信息)
79
+ *
80
+ * 示例输出:
81
+ * # Page: pages/index/index
82
+ * # Elements: 5
83
+ *
84
+ * view.container view
85
+ * button.submit button "Submit"
86
+ * input#username input
87
+ */
88
+ function formatMinimal(snapshot) {
89
+ const lines = [];
90
+ // 头部信息
91
+ lines.push(`# Page: ${snapshot.path}`);
92
+ lines.push(`# Elements: ${snapshot.elements.length}`);
93
+ lines.push('');
94
+ // 元素信息(只有uid、tagName、text)
95
+ for (const element of snapshot.elements) {
96
+ const parts = [element.uid, element.tagName];
97
+ if (element.text) {
98
+ const escapedText = escapeText(element.text);
99
+ parts.push(`"${escapedText}"`);
100
+ }
101
+ lines.push(parts.join(' '));
102
+ }
103
+ return lines.join('\n');
104
+ }
105
+ /**
106
+ * JSON格式(保留完整信息)
107
+ *
108
+ * 保持向后兼容性,输出完整的JSON结构
109
+ */
110
+ function formatJSON(snapshot, options) {
111
+ const { includePosition = true, includeAttributes = false } = options;
112
+ // 根据选项过滤字段
113
+ const filteredElements = snapshot.elements.map(element => {
114
+ const filtered = {
115
+ uid: element.uid,
116
+ tagName: element.tagName,
117
+ };
118
+ if (element.text)
119
+ filtered.text = element.text;
120
+ if (includePosition && element.position)
121
+ filtered.position = element.position;
122
+ if (includeAttributes && element.attributes)
123
+ filtered.attributes = element.attributes;
124
+ return filtered;
125
+ });
126
+ return JSON.stringify({ path: snapshot.path, elements: filteredElements }, null, 2);
127
+ }
128
+ /**
129
+ * 转义文本内容中的特殊字符
130
+ */
131
+ function escapeText(text) {
132
+ return text
133
+ .replace(/\\/g, '\\\\') // 反斜杠
134
+ .replace(/"/g, '\\"') // 双引号
135
+ .replace(/\n/g, '\\n') // 换行符
136
+ .replace(/\r/g, '\\r') // 回车符
137
+ .replace(/\t/g, '\\t') // 制表符
138
+ .slice(0, 100); // 限制长度,避免超长文本
139
+ }
140
+ /**
141
+ * Token使用估算
142
+ *
143
+ * 提供各种格式的token消耗估算,帮助用户选择合适的格式
144
+ */
145
+ export function estimateTokens(snapshot) {
146
+ // 粗略估算:1 token ≈ 4 characters
147
+ const compactStr = formatCompact(snapshot, { format: 'compact' });
148
+ const minimalStr = formatMinimal(snapshot);
149
+ const jsonStr = formatJSON(snapshot, { format: 'json' });
150
+ return {
151
+ compact: Math.ceil(compactStr.length / 4),
152
+ minimal: Math.ceil(minimalStr.length / 4),
153
+ json: Math.ceil(jsonStr.length / 4),
154
+ };
155
+ }
156
+ //# sourceMappingURL=snapshotFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshotFormatter.js","sourceRoot":"","sources":["../../src/formatters/snapshotFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 微信开发者工具自动化 MCP 服务器
4
+ * 提供微信小程序自动化测试功能,包括:
5
+ * - 连接微信开发者工具
6
+ * - 获取页面快照和元素信息
7
+ * - 点击页面元素
8
+ * - 其他自动化操作
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}