agent-miniprogram 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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +386 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/close.d.ts +3 -0
  7. package/dist/commands/close.js +6 -0
  8. package/dist/commands/close.js.map +1 -0
  9. package/dist/commands/connect.d.ts +4 -0
  10. package/dist/commands/connect.js +8 -0
  11. package/dist/commands/connect.js.map +1 -0
  12. package/dist/commands/data.d.ts +3 -0
  13. package/dist/commands/data.js +6 -0
  14. package/dist/commands/data.js.map +1 -0
  15. package/dist/commands/eval.d.ts +3 -0
  16. package/dist/commands/eval.js +6 -0
  17. package/dist/commands/eval.js.map +1 -0
  18. package/dist/commands/input.d.ts +3 -0
  19. package/dist/commands/input.js +6 -0
  20. package/dist/commands/input.js.map +1 -0
  21. package/dist/commands/launch.d.ts +4 -0
  22. package/dist/commands/launch.js +7 -0
  23. package/dist/commands/launch.js.map +1 -0
  24. package/dist/commands/mock.d.ts +3 -0
  25. package/dist/commands/mock.js +13 -0
  26. package/dist/commands/mock.js.map +1 -0
  27. package/dist/commands/navigate.d.ts +7 -0
  28. package/dist/commands/navigate.js +10 -0
  29. package/dist/commands/navigate.js.map +1 -0
  30. package/dist/commands/screenshot.d.ts +4 -0
  31. package/dist/commands/screenshot.js +6 -0
  32. package/dist/commands/screenshot.js.map +1 -0
  33. package/dist/commands/scroll.d.ts +5 -0
  34. package/dist/commands/scroll.js +6 -0
  35. package/dist/commands/scroll.js.map +1 -0
  36. package/dist/commands/snapshot.d.ts +4 -0
  37. package/dist/commands/snapshot.js +6 -0
  38. package/dist/commands/snapshot.js.map +1 -0
  39. package/dist/commands/tap.d.ts +3 -0
  40. package/dist/commands/tap.js +6 -0
  41. package/dist/commands/tap.js.map +1 -0
  42. package/dist/commands/wait.d.ts +5 -0
  43. package/dist/commands/wait.js +20 -0
  44. package/dist/commands/wait.js.map +1 -0
  45. package/dist/daemon/client.d.ts +6 -0
  46. package/dist/daemon/client.js +55 -0
  47. package/dist/daemon/client.js.map +1 -0
  48. package/dist/daemon/server.d.ts +1 -0
  49. package/dist/daemon/server.js +369 -0
  50. package/dist/daemon/server.js.map +1 -0
  51. package/dist/daemon/session.d.ts +14 -0
  52. package/dist/daemon/session.js +65 -0
  53. package/dist/daemon/session.js.map +1 -0
  54. package/dist/replay/player.d.ts +3 -0
  55. package/dist/replay/player.js +41 -0
  56. package/dist/replay/player.js.map +1 -0
  57. package/dist/replay/recorder.d.ts +15 -0
  58. package/dist/replay/recorder.js +39 -0
  59. package/dist/replay/recorder.js.map +1 -0
  60. package/dist/snapshot/builder.d.ts +16 -0
  61. package/dist/snapshot/builder.js +371 -0
  62. package/dist/snapshot/builder.js.map +1 -0
  63. package/dist/snapshot/refs.d.ts +17 -0
  64. package/dist/snapshot/refs.js +68 -0
  65. package/dist/snapshot/refs.js.map +1 -0
  66. package/package.json +44 -0
  67. package/skills/agent-miniprogram/SKILL.md +163 -0
@@ -0,0 +1,3 @@
1
+ export declare function mockCommand(api: string, jsonResponse: string, opts: {
2
+ port?: number;
3
+ }): Promise<any>;
@@ -0,0 +1,13 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function mockCommand(api, jsonResponse, opts) {
3
+ const port = opts.port || 9430;
4
+ let response;
5
+ try {
6
+ response = JSON.parse(jsonResponse);
7
+ }
8
+ catch {
9
+ throw new Error(`Invalid JSON response: ${jsonResponse}`);
10
+ }
11
+ return await rpc('mock', { api, response }, port);
12
+ }
13
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/commands/mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,YAAoB,EAAE,IAAuB;IAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function navigateCommand(url: string, opts: {
2
+ port?: number;
3
+ type?: string;
4
+ }): Promise<any>;
5
+ export declare function backCommand(opts: {
6
+ port?: number;
7
+ }): Promise<any>;
@@ -0,0 +1,10 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function navigateCommand(url, opts) {
3
+ const port = opts.port || 9430;
4
+ return await rpc('navigate', { url, type: opts.type || 'navigateTo' }, port);
5
+ }
6
+ export async function backCommand(opts) {
7
+ const port = opts.port || 9430;
8
+ return await rpc('back', {}, port);
9
+ }
10
+ //# sourceMappingURL=navigate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigate.js","sourceRoot":"","sources":["../../src/commands/navigate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,IAAsC;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAuB;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function screenshotCommand(opts: {
2
+ port?: number;
3
+ path?: string;
4
+ }): Promise<any>;
@@ -0,0 +1,6 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function screenshotCommand(opts) {
3
+ const port = opts.port || 9430;
4
+ return await rpc('screenshot', { path: opts.path }, port);
5
+ }
6
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/commands/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAsC;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function scrollCommand(ref: string, opts: {
2
+ port?: number;
3
+ x?: number;
4
+ y?: number;
5
+ }): Promise<any>;
@@ -0,0 +1,6 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function scrollCommand(ref, opts) {
3
+ const port = opts.port || 9430;
4
+ return await rpc('scroll', { ref, x: opts.x || 0, y: opts.y || 0 }, port);
5
+ }
6
+ //# sourceMappingURL=scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../src/commands/scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,IAA+C;IAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function snapshotCommand(opts: {
2
+ port?: number;
3
+ data?: boolean;
4
+ }): Promise<any>;
@@ -0,0 +1,6 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function snapshotCommand(opts) {
3
+ const port = opts.port || 9430;
4
+ return await rpc('snapshot', { data: opts.data }, port);
5
+ }
6
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAuC;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function tapCommand(ref: string, opts: {
2
+ port?: number;
3
+ }): Promise<any>;
@@ -0,0 +1,6 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function tapCommand(ref, opts) {
3
+ const port = opts.port || 9430;
4
+ return await rpc('tap', { ref }, port);
5
+ }
6
+ //# sourceMappingURL=tap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap.js","sourceRoot":"","sources":["../../src/commands/tap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,IAAuB;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,OAAO,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function waitCommand(target: string, opts: {
2
+ port?: number;
3
+ text?: string;
4
+ data?: string;
5
+ }): Promise<any>;
@@ -0,0 +1,20 @@
1
+ import { rpc } from '../daemon/client.js';
2
+ export async function waitCommand(target, opts) {
3
+ const port = opts.port || 9430;
4
+ // If target is a number, wait ms
5
+ const ms = parseInt(target, 10);
6
+ if (!isNaN(ms)) {
7
+ return await rpc('wait', { ms }, port);
8
+ }
9
+ // If target starts with @, it's a ref
10
+ if (target.startsWith('@')) {
11
+ return await rpc('wait', { ref: target }, port);
12
+ }
13
+ // If --text option
14
+ if (opts.text) {
15
+ return await rpc('wait', { text: opts.text }, port);
16
+ }
17
+ // Otherwise treat as selector
18
+ return await rpc('wait', { selector: target }, port);
19
+ }
20
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,IAAqD;IAErD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAE/B,iCAAiC;IACjC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACf,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,sCAAsC;IACtC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,mBAAmB;IACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,8BAA8B;IAC9B,OAAO,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface RpcResult {
2
+ result?: any;
3
+ error?: string;
4
+ }
5
+ export declare function rpc(method: string, params?: any, port?: number): Promise<any>;
6
+ export declare function ensureDaemon(port?: number): Promise<void>;
@@ -0,0 +1,55 @@
1
+ import * as http from 'http';
2
+ const DEFAULT_PORT = 9430;
3
+ export async function rpc(method, params = {}, port = DEFAULT_PORT) {
4
+ return new Promise((resolve, reject) => {
5
+ const body = JSON.stringify({ method, params });
6
+ const req = http.request({
7
+ hostname: '127.0.0.1',
8
+ port,
9
+ path: '/rpc',
10
+ method: 'POST',
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ 'Content-Length': Buffer.byteLength(body),
14
+ },
15
+ }, (res) => {
16
+ let data = '';
17
+ res.on('data', chunk => { data += chunk; });
18
+ res.on('end', () => {
19
+ try {
20
+ const parsed = JSON.parse(data);
21
+ if (parsed.error) {
22
+ reject(new Error(parsed.error));
23
+ }
24
+ else {
25
+ resolve(parsed.result);
26
+ }
27
+ }
28
+ catch {
29
+ reject(new Error(`Invalid response: ${data}`));
30
+ }
31
+ });
32
+ });
33
+ req.on('error', (err) => {
34
+ if (err.code === 'ECONNREFUSED') {
35
+ reject(new Error('Daemon not running. Start it with: agent-mp daemon'));
36
+ }
37
+ else {
38
+ reject(err);
39
+ }
40
+ });
41
+ req.write(body);
42
+ req.end();
43
+ });
44
+ }
45
+ export async function ensureDaemon(port = DEFAULT_PORT) {
46
+ try {
47
+ await rpc('status', {}, port);
48
+ }
49
+ catch (err) {
50
+ if (err.message?.includes('Daemon not running')) {
51
+ throw err;
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,YAAY,GAAG,IAAI,CAAC;AAO1B,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,MAAc,EAAE,SAAc,EAAE,EAAE,IAAI,GAAG,YAAY;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB;YACE,QAAQ,EAAE,WAAW;YACrB,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;aAC1C;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAc,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClC,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAI,GAAG,YAAY;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAChD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,369 @@
1
+ import * as http from 'http';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { launch, connect, closeSession, getMiniProgram, isConnected, getCurrentPage } from './session.js';
6
+ import { buildSnapshot } from '../snapshot/builder.js';
7
+ import { resolveRef, resolveRefFull } from '../snapshot/refs.js';
8
+ import { startRecording, stopRecording, recordAction, isRecording } from '../replay/recorder.js';
9
+ const DEFAULT_PORT = 9430;
10
+ const STATE_DIR = path.join(os.homedir(), '.agent-miniprogram');
11
+ const PID_FILE = path.join(STATE_DIR, 'daemon.pid');
12
+ function ensureStateDir() {
13
+ if (!fs.existsSync(STATE_DIR)) {
14
+ fs.mkdirSync(STATE_DIR, { recursive: true });
15
+ }
16
+ }
17
+ const RECORDABLE_METHODS = new Set(['tap', 'input', 'scroll', 'longPress', 'swipe', 'navigate', 'back', 'wait']);
18
+ // Built-in WXML tags that are NOT custom components.
19
+ // Any tag not in this set is treated as a custom component boundary.
20
+ const BUILT_IN_WXML_TAGS = new Set([
21
+ 'view', 'scroll-view', 'swiper', 'swiper-item', 'movable-view', 'movable-area',
22
+ 'cover-view', 'cover-image', 'icon', 'text', 'rich-text', 'progress',
23
+ 'button', 'checkbox-group', 'checkbox', 'form', 'input', 'label',
24
+ 'picker', 'picker-view', 'picker-view-column', 'radio-group', 'radio',
25
+ 'slider', 'switch', 'textarea', 'navigator', 'functional-page-navigator',
26
+ 'audio', 'camera', 'image', 'live-player', 'live-pusher', 'video',
27
+ 'map', 'canvas', 'open-data', 'web-view', 'ad', 'official-account',
28
+ 'block', 'page', 'template', 'slot', 'wxs',
29
+ 'svg', 'path', 'circle', 'rect', 'line', 'polygon', 'polyline',
30
+ 'ellipse', 'g', 'defs', 'use', 'symbol',
31
+ ]);
32
+ /**
33
+ * Find the first split point in a " > "-separated selector where the automator
34
+ * needs a context switch:
35
+ * 1. A leading "#id" segment — page.$('#id') works but "#id > child" does not.
36
+ * 2. A custom-component tag — element.$() must be used on the component itself.
37
+ */
38
+ function findBoundary(selector) {
39
+ const parts = selector.split(' > ');
40
+ if (parts.length < 2)
41
+ return null;
42
+ // Rule 1: leading #id — always split after it so we anchor cleanly.
43
+ if (parts[0].startsWith('#')) {
44
+ return { prefix: parts[0], suffix: parts.slice(1).join(' > ') };
45
+ }
46
+ // Rule 2: first custom-component tag in the path.
47
+ for (let i = 0; i < parts.length - 1; i++) {
48
+ const tag = parts[i].split(':')[0].split('.')[0].toLowerCase();
49
+ if (!BUILT_IN_WXML_TAGS.has(tag)) {
50
+ return {
51
+ prefix: parts.slice(0, i + 1).join(' > '),
52
+ suffix: parts.slice(i + 1).join(' > '),
53
+ };
54
+ }
55
+ }
56
+ return null;
57
+ }
58
+ /** Find the first element matching selector, splitting at component/ID boundaries as needed. */
59
+ async function resolveFirst(context, selector, pageCtx) {
60
+ const el = await context.$(selector);
61
+ if (el)
62
+ return el;
63
+ const split = findBoundary(selector);
64
+ if (!split)
65
+ return null;
66
+ // Get the anchor element (ID or custom component) via a simple query on its prefix.
67
+ const anchor = await context.$(split.prefix);
68
+ if (anchor) {
69
+ const inner = await resolveFirst(anchor, split.suffix, pageCtx ?? context);
70
+ if (inner)
71
+ return inner;
72
+ }
73
+ // Fallback: slot content lives in the parent (page) scope, not inside the anchor.
74
+ // Skip the prefix and try the suffix directly from the page context.
75
+ const root = pageCtx ?? context;
76
+ if (root !== context || !anchor) {
77
+ return resolveFirst(root, split.suffix, root);
78
+ }
79
+ return null;
80
+ }
81
+ /** Find all elements matching selector inside the innermost scope, for matchIndex resolution. */
82
+ async function resolveAll(context, selector, pageCtx) {
83
+ const els = await context.$$(selector);
84
+ if (els?.length)
85
+ return els;
86
+ const split = findBoundary(selector);
87
+ if (!split)
88
+ return [];
89
+ const anchor = await context.$(split.prefix);
90
+ if (anchor) {
91
+ const inner = await resolveAll(anchor, split.suffix, pageCtx ?? context);
92
+ if (inner?.length)
93
+ return inner;
94
+ }
95
+ // Fallback: try suffix from page context (slot content case).
96
+ const root = pageCtx ?? context;
97
+ if (root !== context || !anchor) {
98
+ return resolveAll(root, split.suffix, root);
99
+ }
100
+ return [];
101
+ }
102
+ /**
103
+ * Resolve a @ref or raw selector to an automator Element.
104
+ * Handles CSS selectors generated by snapshot/builder, including those that
105
+ * cross custom component boundaries.
106
+ */
107
+ async function resolveElement(page, refOrSelector) {
108
+ const full = resolveRefFull(refOrSelector);
109
+ const selector = full?.selector ?? refOrSelector;
110
+ const matchIndex = full?.matchIndex ?? 0;
111
+ if (matchIndex > 0) {
112
+ const els = await resolveAll(page, selector);
113
+ return els?.[matchIndex] ?? null;
114
+ }
115
+ return resolveFirst(page, selector);
116
+ }
117
+ async function handleRpc(method, params) {
118
+ const mp = getMiniProgram();
119
+ // Record actions if recording is active
120
+ if (isRecording() && RECORDABLE_METHODS.has(method)) {
121
+ recordAction(method, params);
122
+ }
123
+ switch (method) {
124
+ case 'launch': {
125
+ await launch(params.projectPath, params.wsEndpoint);
126
+ return { ok: true };
127
+ }
128
+ case 'connect': {
129
+ await connect(params.wsEndpoint || 'ws://localhost:9420');
130
+ return { ok: true };
131
+ }
132
+ case 'close': {
133
+ await closeSession();
134
+ return { ok: true };
135
+ }
136
+ case 'status': {
137
+ return {
138
+ connected: isConnected(),
139
+ currentPage: await getCurrentPage(),
140
+ };
141
+ }
142
+ case 'snapshot': {
143
+ if (!mp)
144
+ throw new Error('Not connected');
145
+ const page = await mp.currentPage();
146
+ const snapshot = await buildSnapshot(page, { includeData: params.data });
147
+ return { snapshot };
148
+ }
149
+ case 'screenshot': {
150
+ if (!mp)
151
+ throw new Error('Not connected');
152
+ const savePath = params.path || path.join(STATE_DIR, 'screenshot.png');
153
+ await mp.screenshot({ path: savePath });
154
+ return { path: savePath };
155
+ }
156
+ case 'navigate': {
157
+ if (!mp)
158
+ throw new Error('Not connected');
159
+ const type = params.type || 'navigateTo';
160
+ if (type === 'switchTab') {
161
+ await mp.switchTab(params.url);
162
+ }
163
+ else if (type === 'reLaunch') {
164
+ await mp.reLaunch(params.url);
165
+ }
166
+ else {
167
+ await mp.navigateTo(params.url);
168
+ }
169
+ return { ok: true, url: params.url };
170
+ }
171
+ case 'back': {
172
+ if (!mp)
173
+ throw new Error('Not connected');
174
+ await mp.navigateBack();
175
+ return { ok: true };
176
+ }
177
+ case 'tap': {
178
+ if (!mp)
179
+ throw new Error('Not connected');
180
+ const page = await mp.currentPage();
181
+ const el = await resolveElement(page, params.ref);
182
+ if (!el)
183
+ throw new Error(`Element not found: ${params.ref}`);
184
+ await el.tap();
185
+ return { ok: true };
186
+ }
187
+ case 'input': {
188
+ if (!mp)
189
+ throw new Error('Not connected');
190
+ const page = await mp.currentPage();
191
+ const el = await resolveElement(page, params.ref);
192
+ if (!el)
193
+ throw new Error(`Element not found: ${params.ref}`);
194
+ await el.input(params.text);
195
+ return { ok: true };
196
+ }
197
+ case 'scroll': {
198
+ if (!mp)
199
+ throw new Error('Not connected');
200
+ const page = await mp.currentPage();
201
+ const el = await resolveElement(page, params.ref);
202
+ if (!el)
203
+ throw new Error(`Element not found: ${params.ref}`);
204
+ await el.scrollTo(params.x || 0, params.y || 0);
205
+ return { ok: true };
206
+ }
207
+ case 'longPress': {
208
+ if (!mp)
209
+ throw new Error('Not connected');
210
+ const page = await mp.currentPage();
211
+ const el = await resolveElement(page, params.ref);
212
+ if (!el)
213
+ throw new Error(`Element not found: ${params.ref}`);
214
+ await el.longpress();
215
+ return { ok: true };
216
+ }
217
+ case 'swipe': {
218
+ if (!mp)
219
+ throw new Error('Not connected');
220
+ const page = await mp.currentPage();
221
+ const el = await resolveElement(page, params.ref);
222
+ if (!el)
223
+ throw new Error(`Element not found: ${params.ref}`);
224
+ const rect = await el.offset();
225
+ const cx = rect.left + rect.width / 2;
226
+ const cy = rect.top + rect.height / 2;
227
+ const dist = 150;
228
+ const dirMap = {
229
+ up: [cx, cy + dist, cx, cy - dist],
230
+ down: [cx, cy - dist, cx, cy + dist],
231
+ left: [cx + dist, cy, cx - dist, cy],
232
+ right: [cx - dist, cy, cx + dist, cy],
233
+ };
234
+ const [x1, y1, x2, y2] = dirMap[params.direction] ?? [cx, cy, cx, cy];
235
+ await page.callMethod('__swipe__', x1, y1, x2, y2);
236
+ return { ok: true };
237
+ }
238
+ case 'wait': {
239
+ if (!mp)
240
+ throw new Error('Not connected');
241
+ if (typeof params.ms === 'number') {
242
+ await new Promise(r => setTimeout(r, params.ms));
243
+ return { ok: true };
244
+ }
245
+ if (params.selector || params.ref) {
246
+ const page = await mp.currentPage();
247
+ const selector = resolveRef(params.ref) ?? params.ref ?? params.selector;
248
+ await page.waitFor(selector);
249
+ return { ok: true };
250
+ }
251
+ if (params.text) {
252
+ const page = await mp.currentPage();
253
+ await page.waitFor(params.text);
254
+ return { ok: true };
255
+ }
256
+ throw new Error('wait: specify ms, ref/selector, or text');
257
+ }
258
+ case 'data': {
259
+ if (!mp)
260
+ throw new Error('Not connected');
261
+ const page = await mp.currentPage();
262
+ const data = await page.data();
263
+ if (params.path) {
264
+ const parts = params.path.split('.');
265
+ let val = data;
266
+ for (const part of parts) {
267
+ val = val?.[part];
268
+ }
269
+ return { data: val };
270
+ }
271
+ return { data };
272
+ }
273
+ case 'eval': {
274
+ if (!mp)
275
+ throw new Error('Not connected');
276
+ const page = await mp.currentPage();
277
+ const result = await page.evaluate(params.code);
278
+ return { result };
279
+ }
280
+ case 'mock': {
281
+ if (!mp)
282
+ throw new Error('Not connected');
283
+ await mp.mockWxMethod(params.api, params.response);
284
+ return { ok: true };
285
+ }
286
+ case 'diff': {
287
+ if (!mp)
288
+ throw new Error('Not connected');
289
+ const prevFile = path.join(STATE_DIR, 'last-snapshot.txt');
290
+ const prev = fs.existsSync(prevFile) ? fs.readFileSync(prevFile, 'utf-8') : '';
291
+ const page = await mp.currentPage();
292
+ const current = await buildSnapshot(page, {});
293
+ const diff = computeDiff(prev, current.snapshot);
294
+ fs.writeFileSync(prevFile, current.snapshot);
295
+ return { diff, current: current.snapshot };
296
+ }
297
+ case 'recordStart': {
298
+ startRecording();
299
+ return { ok: true };
300
+ }
301
+ case 'recordStop': {
302
+ const outPath = stopRecording(params.output);
303
+ return { ok: true, path: outPath };
304
+ }
305
+ default:
306
+ throw new Error(`Unknown method: ${method}`);
307
+ }
308
+ }
309
+ function computeDiff(a, b) {
310
+ const aLines = a.split('\n');
311
+ const bLines = b.split('\n');
312
+ const added = bLines.filter(l => !aLines.includes(l)).map(l => `+ ${l}`);
313
+ const removed = aLines.filter(l => !bLines.includes(l)).map(l => `- ${l}`);
314
+ if (added.length === 0 && removed.length === 0)
315
+ return '(no changes)';
316
+ return [...removed, ...added].join('\n');
317
+ }
318
+ function startServer(port) {
319
+ ensureStateDir();
320
+ const server = http.createServer(async (req, res) => {
321
+ if (req.method !== 'POST' || req.url !== '/rpc') {
322
+ res.writeHead(404);
323
+ res.end('Not found');
324
+ return;
325
+ }
326
+ let body = '';
327
+ req.on('data', chunk => { body += chunk; });
328
+ req.on('end', async () => {
329
+ let parsed;
330
+ try {
331
+ parsed = JSON.parse(body);
332
+ }
333
+ catch {
334
+ res.writeHead(400, { 'Content-Type': 'application/json' });
335
+ res.end(JSON.stringify({ error: 'Invalid JSON' }));
336
+ return;
337
+ }
338
+ const { method, params = {} } = parsed;
339
+ try {
340
+ const result = await handleRpc(method, params);
341
+ res.writeHead(200, { 'Content-Type': 'application/json' });
342
+ res.end(JSON.stringify({ result }));
343
+ }
344
+ catch (err) {
345
+ res.writeHead(200, { 'Content-Type': 'application/json' });
346
+ res.end(JSON.stringify({ error: err.message || String(err) }));
347
+ }
348
+ });
349
+ });
350
+ server.listen(port, '127.0.0.1', () => {
351
+ fs.writeFileSync(PID_FILE, String(process.pid));
352
+ console.log(`agent-mp daemon running on http://127.0.0.1:${port}`);
353
+ });
354
+ process.on('SIGTERM', () => {
355
+ server.close();
356
+ if (fs.existsSync(PID_FILE))
357
+ fs.unlinkSync(PID_FILE);
358
+ process.exit(0);
359
+ });
360
+ process.on('SIGINT', () => {
361
+ server.close();
362
+ if (fs.existsSync(PID_FILE))
363
+ fs.unlinkSync(PID_FILE);
364
+ process.exit(0);
365
+ });
366
+ }
367
+ const port = parseInt(process.env.AGENT_MP_PORT || String(DEFAULT_PORT), 10);
368
+ startServer(port);
369
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface SessionState {
2
+ connected: boolean;
3
+ projectPath?: string;
4
+ wsEndpoint?: string;
5
+ currentPage?: string;
6
+ }
7
+ export declare function saveState(state: SessionState): void;
8
+ export declare function loadState(): SessionState;
9
+ export declare function getMiniProgram(): any;
10
+ export declare function launch(projectPath: string, wsEndpoint?: string): Promise<void>;
11
+ export declare function connect(wsEndpoint: string): Promise<void>;
12
+ export declare function closeSession(): Promise<void>;
13
+ export declare function getCurrentPage(): Promise<string | undefined>;
14
+ export declare function isConnected(): boolean;