agent-device 0.4.1 → 0.5.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 (87) hide show
  1. package/README.md +19 -20
  2. package/dist/src/797.js +1 -1
  3. package/dist/src/bin.js +32 -32
  4. package/dist/src/daemon.js +17 -17
  5. package/ios-runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +8 -2
  6. package/package.json +7 -9
  7. package/skills/agent-device/SKILL.md +22 -19
  8. package/skills/agent-device/references/permissions.md +10 -17
  9. package/skills/agent-device/references/session-management.md +3 -1
  10. package/skills/agent-device/references/snapshot-refs.md +1 -4
  11. package/dist/bin/axsnapshot +0 -0
  12. package/ios-runner/AXSnapshot/Package.swift +0 -18
  13. package/ios-runner/AXSnapshot/Sources/AXSnapshot/main.swift +0 -444
  14. package/src/__tests__/cli-help.test.ts +0 -102
  15. package/src/bin.ts +0 -3
  16. package/src/cli.ts +0 -289
  17. package/src/core/__tests__/capabilities.test.ts +0 -74
  18. package/src/core/__tests__/open-target.test.ts +0 -16
  19. package/src/core/capabilities.ts +0 -57
  20. package/src/core/dispatch.ts +0 -360
  21. package/src/core/open-target.ts +0 -13
  22. package/src/daemon/__tests__/app-state.test.ts +0 -138
  23. package/src/daemon/__tests__/is-predicates.test.ts +0 -68
  24. package/src/daemon/__tests__/selectors.test.ts +0 -261
  25. package/src/daemon/__tests__/session-routing.test.ts +0 -108
  26. package/src/daemon/__tests__/session-selector.test.ts +0 -64
  27. package/src/daemon/__tests__/session-store.test.ts +0 -142
  28. package/src/daemon/__tests__/snapshot-processing.test.ts +0 -47
  29. package/src/daemon/action-utils.ts +0 -29
  30. package/src/daemon/app-state.ts +0 -65
  31. package/src/daemon/context.ts +0 -48
  32. package/src/daemon/device-ready.ts +0 -13
  33. package/src/daemon/handlers/__tests__/find.test.ts +0 -99
  34. package/src/daemon/handlers/__tests__/interaction.test.ts +0 -22
  35. package/src/daemon/handlers/__tests__/replay-heal.test.ts +0 -509
  36. package/src/daemon/handlers/__tests__/session-reinstall.test.ts +0 -219
  37. package/src/daemon/handlers/__tests__/session.test.ts +0 -343
  38. package/src/daemon/handlers/__tests__/snapshot-handler.test.ts +0 -92
  39. package/src/daemon/handlers/__tests__/snapshot.test.ts +0 -128
  40. package/src/daemon/handlers/find.ts +0 -324
  41. package/src/daemon/handlers/interaction.ts +0 -550
  42. package/src/daemon/handlers/parse-utils.ts +0 -8
  43. package/src/daemon/handlers/record-trace.ts +0 -154
  44. package/src/daemon/handlers/session.ts +0 -1032
  45. package/src/daemon/handlers/snapshot.ts +0 -439
  46. package/src/daemon/is-predicates.ts +0 -46
  47. package/src/daemon/selectors.ts +0 -540
  48. package/src/daemon/session-routing.ts +0 -22
  49. package/src/daemon/session-selector.ts +0 -39
  50. package/src/daemon/session-store.ts +0 -298
  51. package/src/daemon/snapshot-processing.ts +0 -131
  52. package/src/daemon/types.ts +0 -56
  53. package/src/daemon-client.ts +0 -172
  54. package/src/daemon.ts +0 -295
  55. package/src/platforms/__tests__/boot-diagnostics.test.ts +0 -59
  56. package/src/platforms/android/__tests__/index.test.ts +0 -157
  57. package/src/platforms/android/devices.ts +0 -196
  58. package/src/platforms/android/index.ts +0 -754
  59. package/src/platforms/android/ui-hierarchy.ts +0 -312
  60. package/src/platforms/boot-diagnostics.ts +0 -128
  61. package/src/platforms/ios/__tests__/index.test.ts +0 -24
  62. package/src/platforms/ios/__tests__/runner-client.test.ts +0 -113
  63. package/src/platforms/ios/ax-snapshot.ts +0 -207
  64. package/src/platforms/ios/devices.ts +0 -87
  65. package/src/platforms/ios/index.ts +0 -455
  66. package/src/platforms/ios/runner-client.ts +0 -938
  67. package/src/utils/__tests__/args.test.ts +0 -221
  68. package/src/utils/__tests__/daemon-client.test.ts +0 -78
  69. package/src/utils/__tests__/exec.test.ts +0 -16
  70. package/src/utils/__tests__/finders.test.ts +0 -34
  71. package/src/utils/__tests__/keyed-lock.test.ts +0 -55
  72. package/src/utils/__tests__/process-identity.test.ts +0 -33
  73. package/src/utils/__tests__/retry.test.ts +0 -44
  74. package/src/utils/args.ts +0 -234
  75. package/src/utils/command-schema.ts +0 -629
  76. package/src/utils/device.ts +0 -84
  77. package/src/utils/errors.ts +0 -35
  78. package/src/utils/exec.ts +0 -339
  79. package/src/utils/finders.ts +0 -101
  80. package/src/utils/interactive.ts +0 -4
  81. package/src/utils/interactors.ts +0 -173
  82. package/src/utils/keyed-lock.ts +0 -14
  83. package/src/utils/output.ts +0 -204
  84. package/src/utils/process-identity.ts +0 -100
  85. package/src/utils/retry.ts +0 -180
  86. package/src/utils/snapshot.ts +0 -64
  87. package/src/utils/version.ts +0 -26
@@ -1,154 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { runCmd, runCmdBackground } from '../../utils/exec.ts';
4
- import { resolveTargetDevice, type CommandFlags } from '../../core/dispatch.ts';
5
- import { isCommandSupportedOnDevice } from '../../core/capabilities.ts';
6
- import type { DaemonRequest, DaemonResponse, SessionState } from '../types.ts';
7
- import { SessionStore } from '../session-store.ts';
8
- import { ensureDeviceReady } from '../device-ready.ts';
9
-
10
- export async function handleRecordTraceCommands(params: {
11
- req: DaemonRequest;
12
- sessionName: string;
13
- sessionStore: SessionStore;
14
- }): Promise<DaemonResponse | null> {
15
- const { req, sessionName, sessionStore } = params;
16
- const command = req.command;
17
-
18
- if (command === 'record') {
19
- const action = (req.positionals?.[0] ?? '').toLowerCase();
20
- if (!['start', 'stop'].includes(action)) {
21
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'record requires start|stop' } };
22
- }
23
- const session = sessionStore.get(sessionName);
24
- const device = session?.device ?? (await resolveTargetDevice(req.flags ?? {}));
25
- if (!session) {
26
- await ensureDeviceReady(device);
27
- }
28
- const activeSession =
29
- session ??
30
- ({
31
- name: sessionName,
32
- device,
33
- createdAt: Date.now(),
34
- actions: [],
35
- } satisfies SessionState);
36
-
37
- if (action === 'start') {
38
- if (activeSession.recording) {
39
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'recording already in progress' } };
40
- }
41
- const outPath = req.positionals?.[1] ?? `./recording-${Date.now()}.mp4`;
42
- const resolvedOut = path.resolve(outPath);
43
- const outDir = path.dirname(resolvedOut);
44
- if (!fs.existsSync(outDir)) {
45
- fs.mkdirSync(outDir, { recursive: true });
46
- }
47
- if (!isCommandSupportedOnDevice('record', device)) {
48
- return {
49
- ok: false,
50
- error: { code: 'UNSUPPORTED_OPERATION', message: 'record is only supported on iOS simulators' },
51
- };
52
- }
53
- if (device.platform === 'ios') {
54
- const { child, wait } = runCmdBackground('xcrun', ['simctl', 'io', device.id, 'recordVideo', resolvedOut], {
55
- allowFailure: true,
56
- });
57
- activeSession.recording = { platform: 'ios', outPath: resolvedOut, child, wait };
58
- } else {
59
- const remotePath = `/sdcard/agent-device-recording-${Date.now()}.mp4`;
60
- const { child, wait } = runCmdBackground('adb', ['-s', device.id, 'shell', 'screenrecord', remotePath], {
61
- allowFailure: true,
62
- });
63
- activeSession.recording = { platform: 'android', outPath: resolvedOut, remotePath, child, wait };
64
- }
65
- sessionStore.set(sessionName, activeSession);
66
- sessionStore.recordAction(activeSession, {
67
- command,
68
- positionals: req.positionals ?? [],
69
- flags: (req.flags ?? {}) as CommandFlags,
70
- result: { action: 'start' },
71
- });
72
- return { ok: true, data: { recording: 'started', outPath } };
73
- }
74
-
75
- if (!activeSession.recording) {
76
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'no active recording' } };
77
- }
78
- const recording = activeSession.recording;
79
- recording.child.kill('SIGINT');
80
- try {
81
- await recording.wait;
82
- } catch {
83
- // ignore
84
- }
85
- if (recording.platform === 'android' && recording.remotePath) {
86
- try {
87
- await runCmd('adb', ['-s', device.id, 'pull', recording.remotePath, recording.outPath], { allowFailure: true });
88
- await runCmd('adb', ['-s', device.id, 'shell', 'rm', '-f', recording.remotePath], { allowFailure: true });
89
- } catch {
90
- // ignore
91
- }
92
- }
93
- activeSession.recording = undefined;
94
- sessionStore.recordAction(activeSession, {
95
- command,
96
- positionals: req.positionals ?? [],
97
- flags: (req.flags ?? {}) as CommandFlags,
98
- result: { action: 'stop', outPath: recording.outPath },
99
- });
100
- return { ok: true, data: { recording: 'stopped', outPath: recording.outPath } };
101
- }
102
-
103
- if (command === 'trace') {
104
- const action = (req.positionals?.[0] ?? '').toLowerCase();
105
- if (!['start', 'stop'].includes(action)) {
106
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'trace requires start|stop' } };
107
- }
108
- const session = sessionStore.get(sessionName);
109
- if (!session) {
110
- return { ok: false, error: { code: 'SESSION_NOT_FOUND', message: 'No active session' } };
111
- }
112
- if (action === 'start') {
113
- if (session.trace) {
114
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'trace already in progress' } };
115
- }
116
- const outPath = req.positionals?.[1] ?? sessionStore.defaultTracePath(session);
117
- const resolvedOut = SessionStore.expandHome(outPath);
118
- fs.mkdirSync(path.dirname(resolvedOut), { recursive: true });
119
- fs.appendFileSync(resolvedOut, '');
120
- session.trace = { outPath: resolvedOut, startedAt: Date.now() };
121
- sessionStore.recordAction(session, {
122
- command,
123
- positionals: req.positionals ?? [],
124
- flags: (req.flags ?? {}) as CommandFlags,
125
- result: { action: 'start', outPath: resolvedOut },
126
- });
127
- return { ok: true, data: { trace: 'started', outPath: resolvedOut } };
128
- }
129
- if (!session.trace) {
130
- return { ok: false, error: { code: 'INVALID_ARGS', message: 'no active trace' } };
131
- }
132
- let outPath = session.trace.outPath;
133
- if (req.positionals?.[1]) {
134
- const resolvedOut = SessionStore.expandHome(req.positionals[1]);
135
- fs.mkdirSync(path.dirname(resolvedOut), { recursive: true });
136
- if (fs.existsSync(outPath)) {
137
- fs.renameSync(outPath, resolvedOut);
138
- } else {
139
- fs.appendFileSync(resolvedOut, '');
140
- }
141
- outPath = resolvedOut;
142
- }
143
- session.trace = undefined;
144
- sessionStore.recordAction(session, {
145
- command,
146
- positionals: req.positionals ?? [],
147
- flags: (req.flags ?? {}) as CommandFlags,
148
- result: { action: 'stop', outPath },
149
- });
150
- return { ok: true, data: { trace: 'stopped', outPath } };
151
- }
152
-
153
- return null;
154
- }