agent-scenario-loop 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 (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +119 -0
  3. package/app/profile-session.ts +812 -0
  4. package/core/config-template.json +41 -0
  5. package/dist/core/agent-summary.d.ts +15 -0
  6. package/dist/core/agent-summary.js +177 -0
  7. package/dist/core/artifact-contract.d.ts +151 -0
  8. package/dist/core/artifact-contract.js +897 -0
  9. package/dist/core/artifact-layout.d.ts +56 -0
  10. package/dist/core/artifact-layout.js +61 -0
  11. package/dist/core/artifact-writer.d.ts +44 -0
  12. package/dist/core/artifact-writer.js +55 -0
  13. package/dist/core/comparison.d.ts +133 -0
  14. package/dist/core/comparison.js +294 -0
  15. package/dist/core/evidence-interpreter.d.ts +28 -0
  16. package/dist/core/evidence-interpreter.js +69 -0
  17. package/dist/core/execution-plan.d.ts +44 -0
  18. package/dist/core/execution-plan.js +95 -0
  19. package/dist/core/planner.d.ts +132 -0
  20. package/dist/core/planner.js +812 -0
  21. package/dist/core/ports.d.ts +198 -0
  22. package/dist/core/ports.js +146 -0
  23. package/dist/core/run-index.d.ts +62 -0
  24. package/dist/core/run-index.js +143 -0
  25. package/dist/core/schema-validator.d.ts +86 -0
  26. package/dist/core/schema-validator.js +407 -0
  27. package/dist/index.d.ts +11 -0
  28. package/dist/index.js +27 -0
  29. package/dist/runner/agent-device-driver.d.ts +126 -0
  30. package/dist/runner/agent-device-driver.js +168 -0
  31. package/dist/runner/agent-device.d.ts +295 -0
  32. package/dist/runner/agent-device.js +1271 -0
  33. package/dist/runner/android-adb-driver.d.ts +175 -0
  34. package/dist/runner/android-adb-driver.js +399 -0
  35. package/dist/runner/android-adb.d.ts +254 -0
  36. package/dist/runner/android-adb.js +1618 -0
  37. package/dist/runner/argent-driver.d.ts +183 -0
  38. package/dist/runner/argent-driver.js +297 -0
  39. package/dist/runner/argent.d.ts +349 -0
  40. package/dist/runner/argent.js +1211 -0
  41. package/dist/runner/check-plan.d.ts +45 -0
  42. package/dist/runner/check-plan.js +210 -0
  43. package/dist/runner/cli.d.ts +20 -0
  44. package/dist/runner/cli.js +23 -0
  45. package/dist/runner/compare-latest.d.ts +99 -0
  46. package/dist/runner/compare-latest.js +233 -0
  47. package/dist/runner/compare.d.ts +58 -0
  48. package/dist/runner/compare.js +157 -0
  49. package/dist/runner/demo-loop.d.ts +45 -0
  50. package/dist/runner/demo-loop.js +170 -0
  51. package/dist/runner/example-android-live.d.ts +137 -0
  52. package/dist/runner/example-android-live.js +454 -0
  53. package/dist/runner/example-ios-live.d.ts +137 -0
  54. package/dist/runner/example-ios-live.js +471 -0
  55. package/dist/runner/host-doctor.d.ts +131 -0
  56. package/dist/runner/host-doctor.js +628 -0
  57. package/dist/runner/init-project.d.ts +88 -0
  58. package/dist/runner/init-project.js +263 -0
  59. package/dist/runner/ios-simctl-driver.d.ts +69 -0
  60. package/dist/runner/ios-simctl-driver.js +97 -0
  61. package/dist/runner/ios-simctl.d.ts +254 -0
  62. package/dist/runner/ios-simctl.js +1415 -0
  63. package/dist/runner/live-android.d.ts +137 -0
  64. package/dist/runner/live-android.js +539 -0
  65. package/dist/runner/live-comparison.d.ts +67 -0
  66. package/dist/runner/live-comparison.js +147 -0
  67. package/dist/runner/live-ios.d.ts +137 -0
  68. package/dist/runner/live-ios.js +460 -0
  69. package/dist/runner/live-proof-summary.d.ts +263 -0
  70. package/dist/runner/live-proof-summary.js +465 -0
  71. package/dist/runner/live-proof.d.ts +467 -0
  72. package/dist/runner/live-proof.js +920 -0
  73. package/dist/runner/local-env.d.ts +64 -0
  74. package/dist/runner/local-env.js +155 -0
  75. package/dist/runner/profile-android.d.ts +82 -0
  76. package/dist/runner/profile-android.js +671 -0
  77. package/dist/runner/profile-ios.d.ts +108 -0
  78. package/dist/runner/profile-ios.js +532 -0
  79. package/dist/runner/profile-mobile.d.ts +254 -0
  80. package/dist/runner/profile-mobile.js +1307 -0
  81. package/dist/runner/validate-project.d.ts +273 -0
  82. package/dist/runner/validate-project.js +1501 -0
  83. package/docs/adapters.md +145 -0
  84. package/docs/api.md +94 -0
  85. package/docs/authoring.md +196 -0
  86. package/docs/concepts.md +136 -0
  87. package/docs/consumer-rehearsal.md +115 -0
  88. package/docs/contracts.md +267 -0
  89. package/docs/live-proofs.md +270 -0
  90. package/docs/principles.md +46 -0
  91. package/examples/event-logs/app-startup-baseline.log +4 -0
  92. package/examples/event-logs/app-startup-current.log +4 -0
  93. package/examples/minimal-app/README.md +70 -0
  94. package/examples/mobile-app/README.md +302 -0
  95. package/examples/mobile-app/app.json +22 -0
  96. package/examples/mobile-app/asl/package-scripts.json +32 -0
  97. package/examples/mobile-app/asl.config.json +37 -0
  98. package/examples/mobile-app/event-logs/android-app-startup.log +4 -0
  99. package/examples/mobile-app/event-logs/android-open-close-cycle.log +12 -0
  100. package/examples/mobile-app/event-logs/android-scroll-settle.log +12 -0
  101. package/examples/mobile-app/event-logs/app-startup.log +4 -0
  102. package/examples/mobile-app/event-logs/open-close-cycle.log +12 -0
  103. package/examples/mobile-app/event-logs/scroll-settle.log +12 -0
  104. package/examples/mobile-app/index.ts +20 -0
  105. package/examples/mobile-app/metro.config.js +20 -0
  106. package/examples/mobile-app/package.json +62 -0
  107. package/examples/mobile-app/patches/expo-modules-jsi@56.0.10.patch +19 -0
  108. package/examples/mobile-app/plugins/with-ios-build-compat.js +271 -0
  109. package/examples/mobile-app/pnpm-lock.yaml +4440 -0
  110. package/examples/mobile-app/runner-manifests/evidence-provider.json +79 -0
  111. package/examples/mobile-app/runner-manifests/primary-runner.json +19 -0
  112. package/examples/mobile-app/scenarios/android/app-startup-video.json +73 -0
  113. package/examples/mobile-app/scenarios/android/app-startup.json +44 -0
  114. package/examples/mobile-app/scenarios/android/open-close-cycle.json +54 -0
  115. package/examples/mobile-app/scenarios/android/scroll-settle.json +49 -0
  116. package/examples/mobile-app/scenarios/ios/app-startup.json +44 -0
  117. package/examples/mobile-app/scenarios/ios/open-close-cycle.json +54 -0
  118. package/examples/mobile-app/scenarios/ios/scroll-settle.json +49 -0
  119. package/examples/mobile-app/scenarios/mobile/app-startup.json +91 -0
  120. package/examples/mobile-app/scenarios/mobile/open-close-cycle.json +160 -0
  121. package/examples/mobile-app/scenarios/mobile/scroll-settle.json +148 -0
  122. package/examples/mobile-app/scripts/asl-capture-accessibility-provider.mjs +112 -0
  123. package/examples/mobile-app/scripts/asl-capture-profiler-provider.mjs +127 -0
  124. package/examples/mobile-app/src/devtools/profile-session.ts +7 -0
  125. package/examples/mobile-app/src/example-screen.tsx +322 -0
  126. package/examples/mobile-app/tsconfig.json +16 -0
  127. package/examples/mobile-app/tsconfig.typecheck.json +13 -0
  128. package/examples/runners/README.md +44 -0
  129. package/examples/runners/adb-android.json +25 -0
  130. package/examples/runners/agent-device-android.json +27 -0
  131. package/examples/runners/agent-device-ios.json +27 -0
  132. package/examples/runners/argent-android.json +32 -0
  133. package/examples/runners/argent-ios.json +32 -0
  134. package/examples/runners/argent-react-profiler-provider.json +15 -0
  135. package/examples/runners/axe-accessibility-provider.json +24 -0
  136. package/examples/runners/manual-log-ingest.json +9 -0
  137. package/examples/runners/rozenite-profiler-provider.json +9 -0
  138. package/examples/runners/script-accessibility-provider.json +24 -0
  139. package/examples/runners/script-memory-provider.json +24 -0
  140. package/examples/runners/script-network-provider.json +24 -0
  141. package/examples/runners/script-profiler-provider.json +30 -0
  142. package/examples/runners/xcodebuildmcp-ios.json +29 -0
  143. package/examples/scenarios/ios/app-startup.json +28 -0
  144. package/examples/scenarios/ios/open-close-cycle.json +35 -0
  145. package/examples/scenarios/mobile/app-startup.json +72 -0
  146. package/examples/scenarios/mobile/media-open-close.json +141 -0
  147. package/examples/scenarios/mobile/open-close-cycle.json +135 -0
  148. package/examples/scenarios/mobile/scroll-settle.json +106 -0
  149. package/package.json +240 -0
  150. package/schemas/budget-verdict.schema.json +115 -0
  151. package/schemas/causal-run.schema.json +279 -0
  152. package/schemas/comparison.schema.json +196 -0
  153. package/schemas/health.schema.json +108 -0
  154. package/schemas/live-proof-set.schema.json +195 -0
  155. package/schemas/live-proof.schema.json +413 -0
  156. package/schemas/manifest.schema.json +204 -0
  157. package/schemas/metrics.schema.json +137 -0
  158. package/schemas/project-validation.schema.json +343 -0
  159. package/schemas/runner-capabilities.schema.json +217 -0
  160. package/schemas/scenario.schema.json +400 -0
  161. package/schemas/verdict.schema.json +88 -0
  162. package/templates/evidence-provider.json +83 -0
  163. package/templates/gitignore-snippet +9 -0
  164. package/templates/integration-readme.md +125 -0
  165. package/templates/mobile-scenario.json +133 -0
  166. package/templates/package-scripts.json +32 -0
  167. package/templates/primary-runner.json +19 -0
  168. package/templates/project.config.json +37 -0
  169. package/templates/scripts/asl-capture-accessibility-provider.mjs +112 -0
  170. package/templates/scripts/asl-capture-profiler-provider.mjs +127 -0
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+ type CliArgs = {
3
+ adb?: string | boolean;
4
+ 'capture-logcat'?: string | boolean;
5
+ 'clear-logcat'?: string | boolean;
6
+ launch?: string | boolean;
7
+ 'android-dev-client-url'?: string | boolean;
8
+ 'android-dev-client-wait-ms'?: string | boolean;
9
+ 'android-dev-client-ready-pattern'?: string | boolean;
10
+ 'android-dev-client-ready-quiet-ms'?: string | boolean;
11
+ 'android-dev-client-ready-timeout-ms'?: string | boolean;
12
+ 'android-profile-session-storage'?: string | boolean;
13
+ 'android-profile-session-storage-key'?: string | boolean;
14
+ 'android-profile-command-storage-key'?: string | boolean;
15
+ 'launch-wait-ms'?: string | boolean;
16
+ 'logcat-lines'?: string | boolean;
17
+ out?: string | boolean;
18
+ package?: string | boolean;
19
+ 'react-native-debug-host'?: string | boolean;
20
+ 'run-id'?: string | boolean;
21
+ serial?: string | boolean;
22
+ 'wait-ms'?: string | boolean;
23
+ [key: string]: string | boolean | undefined;
24
+ };
25
+ type CommandResult = {
26
+ command: string;
27
+ args: string[];
28
+ exitCode: number;
29
+ stderr: string;
30
+ stdout: string;
31
+ };
32
+ type CommandExecutor = (command: string, args: string[]) => Promise<CommandResult>;
33
+ type AndroidDevice = {
34
+ serial: string;
35
+ state: string;
36
+ description: string;
37
+ };
38
+ type AndroidPreflightResult = {
39
+ agentSummary: string;
40
+ device: AndroidDevice | null;
41
+ health: Record<string, unknown>;
42
+ metadata: Record<string, unknown>;
43
+ raw: Record<string, string>;
44
+ runDir: string;
45
+ verdict: Record<string, unknown>;
46
+ };
47
+ type AndroidDeepLinkCommand = {
48
+ label?: string;
49
+ readyLogPattern?: string;
50
+ readyLogQuietMs?: number;
51
+ readyLogTimeoutMs?: number;
52
+ url: string;
53
+ waitMs?: number;
54
+ };
55
+ type AndroidAsyncStorageWrite = {
56
+ clearKeys?: string[];
57
+ key: string;
58
+ label?: string;
59
+ value: string;
60
+ waitMs?: number;
61
+ };
62
+ type AndroidAdbDriverStep = {
63
+ captureFileName?: string;
64
+ driverAction: 'assertVisible' | 'inspectTree' | 'readLogs' | 'record' | 'screenshot' | 'scroll' | 'tap';
65
+ durationMs?: number;
66
+ durationSeconds?: number;
67
+ endX?: number;
68
+ endY?: number;
69
+ lines?: number;
70
+ rawFileName?: string;
71
+ remotePath?: string;
72
+ required?: boolean;
73
+ selector?: import('./android-adb-driver').AndroidSelector;
74
+ stepId?: string;
75
+ startX?: number;
76
+ startY?: number;
77
+ waitMs?: number;
78
+ x?: number;
79
+ y?: number;
80
+ };
81
+ type AndroidPreflightOptions = {
82
+ adbPath?: string;
83
+ captureLogcat?: boolean;
84
+ clearLogcat?: boolean;
85
+ deepLinks?: AndroidDeepLinkCommand[];
86
+ delay?: (ms: number) => Promise<void>;
87
+ driverSteps?: AndroidAdbDriverStep[];
88
+ executor?: CommandExecutor;
89
+ launch?: boolean;
90
+ launchWaitMs?: number;
91
+ logcatLines?: number;
92
+ outputDir?: string;
93
+ packageName?: string | null;
94
+ reactNativeDebugHost?: string | null;
95
+ runId?: string;
96
+ serial?: string | null;
97
+ startupDeepLinks?: AndroidDeepLinkCommand[];
98
+ storageWrites?: AndroidAsyncStorageWrite[];
99
+ waitMs?: number;
100
+ };
101
+ declare const ANDROID_DEVICE_EPOCH_MS_PLACEHOLDER = "__ASL_ANDROID_DEVICE_EPOCH_MS__";
102
+ /**
103
+ * Prints CLI usage to stderr.
104
+ *
105
+ * @returns {void}
106
+ */
107
+ declare function usage(output?: {
108
+ write: (message: string) => unknown;
109
+ }): void;
110
+ /**
111
+ * Parses `--key value` arguments for the Android adb preflight CLI.
112
+ *
113
+ * @param {string[]} argv
114
+ * @returns {CliArgs}
115
+ */
116
+ declare function parseArgs(argv: string[]): CliArgs;
117
+ /**
118
+ * Parses a positive integer CLI value, falling back when absent or invalid.
119
+ *
120
+ * @param {string | boolean | undefined} value
121
+ * @param {number} fallback
122
+ * @returns {number}
123
+ */
124
+ declare function parsePositiveInteger(value: string | boolean | undefined, fallback: number): number;
125
+ /**
126
+ * Runs a command and captures stdout, stderr, and exit code without throwing.
127
+ *
128
+ * @param {string} command
129
+ * @param {string[]} args
130
+ * @returns {Promise<CommandResult>}
131
+ */
132
+ declare function execFileCommand(command: string, args: string[]): Promise<CommandResult>;
133
+ /**
134
+ * Parses `adb devices -l` output into device rows.
135
+ *
136
+ * @param {string} output
137
+ * @returns {AndroidDevice[]}
138
+ */
139
+ declare function parseAdbDevices(output: string): AndroidDevice[];
140
+ /**
141
+ * Selects an Android device by explicit serial or first online device.
142
+ *
143
+ * @param {AndroidDevice[]} devices
144
+ * @param {string | null | undefined} serial
145
+ * @returns {AndroidDevice | null}
146
+ */
147
+ declare function selectDevice(devices: AndroidDevice[], serial?: string | null): AndroidDevice | null;
148
+ /**
149
+ * Reads the TCP port from a React Native debug server host string.
150
+ *
151
+ * @param {string} debugHost
152
+ * @returns {number | null}
153
+ */
154
+ declare function parseReactNativeDebugHostPort(debugHost: string): number | null;
155
+ /**
156
+ * Escapes text for the Android shared preference XML file.
157
+ *
158
+ * @param {string} value
159
+ * @returns {string}
160
+ */
161
+ declare function escapeAndroidPreferenceXml(value: string): string;
162
+ /**
163
+ * Builds a device-side shell command that writes React Native debug host preferences.
164
+ *
165
+ * @param {{debugHost: string, packageName: string}} options
166
+ * @returns {string}
167
+ */
168
+ declare function buildReactNativeDebugHostPreferenceCommand({ debugHost, packageName, }: {
169
+ debugHost: string;
170
+ packageName: string;
171
+ }): string;
172
+ /**
173
+ * Builds a runner health artifact from adb preflight checks.
174
+ *
175
+ * @param {{runId: string, checks: Record<string, unknown>[]}} options
176
+ * @returns {Record<string, unknown>}
177
+ */
178
+ declare function buildAndroidHealth({ runId, checks }: {
179
+ runId: string;
180
+ checks: Record<string, unknown>[];
181
+ }): Record<string, unknown>;
182
+ /**
183
+ * Builds a verdict artifact for adb preflight readiness.
184
+ *
185
+ * @param {{runId: string, health: Record<string, unknown>}} options
186
+ * @returns {Record<string, unknown>}
187
+ */
188
+ declare function buildAndroidVerdict({ runId, health }: {
189
+ runId: string;
190
+ health: Record<string, unknown>;
191
+ }): Record<string, unknown>;
192
+ /**
193
+ * Builds the driver steps for this adb capture window.
194
+ *
195
+ * @param {{captureLogcat: boolean, driverSteps: AndroidAdbDriverStep[], logcatLines: number, waitMs: number}} options
196
+ * @returns {AndroidAdbDriverStep[]}
197
+ */
198
+ declare function resolveAndroidAdbDriverSteps({ captureLogcat, driverSteps, logcatLines, waitMs, }: {
199
+ captureLogcat: boolean;
200
+ driverSteps: AndroidAdbDriverStep[];
201
+ logcatLines: number;
202
+ waitMs: number;
203
+ }): AndroidAdbDriverStep[];
204
+ /**
205
+ * Returns whether a driver step can derive missing coordinates from a selector.
206
+ *
207
+ * @param {AndroidAdbDriverStep} driverStep
208
+ * @returns {boolean}
209
+ */
210
+ declare function needsAndroidSelectorResolution(driverStep: AndroidAdbDriverStep): boolean;
211
+ /**
212
+ * Applies a resolved selector to one tap or scroll driver step.
213
+ *
214
+ * @param {{driverStep: AndroidAdbDriverStep, resolution: import('./android-adb-driver').AndroidSelectorResolution}} options
215
+ * @returns {AndroidAdbDriverStep}
216
+ */
217
+ declare function applyAndroidSelectorResolution({ driverStep, resolution, }: {
218
+ driverStep: AndroidAdbDriverStep;
219
+ resolution: import('./android-adb-driver').AndroidSelectorResolution;
220
+ }): AndroidAdbDriverStep;
221
+ /**
222
+ * Converts a selector into scalar health-check metadata fields.
223
+ *
224
+ * @param {import('./android-adb-driver').AndroidSelector | undefined} selector
225
+ * @returns {Record<string, string>}
226
+ */
227
+ declare function buildAndroidSelectorHealthMetadata(selector: import('./android-adb-driver').AndroidSelector | undefined): Record<string, string>;
228
+ /**
229
+ * Runs one normalized adb driver step through the Android driver adapter.
230
+ *
231
+ * @param {{driver: import('./android-adb-driver').AndroidAdbDriver, driverStep: AndroidAdbDriverStep, logcatLines: number}} options
232
+ * @returns {Promise<import('./android-adb-driver').AndroidAdbCommandResult>}
233
+ */
234
+ declare function runAndroidAdbDriverStep({ capturesDir, driver, driverStep, logcatLines, }: {
235
+ capturesDir: string;
236
+ driver: import('./android-adb-driver').AndroidAdbDriver;
237
+ driverStep: AndroidAdbDriverStep;
238
+ logcatLines: number;
239
+ }): Promise<import('./android-adb-driver').AndroidAdbCommandResult>;
240
+ /**
241
+ * Runs Android adb readiness checks and writes the preflight artifact set.
242
+ *
243
+ * @param {AndroidPreflightOptions} options
244
+ * @returns {Promise<AndroidPreflightResult>}
245
+ */
246
+ declare function runAndroidAdbPreflight({ adbPath, captureLogcat, clearLogcat, deepLinks, delay: wait, driverSteps, executor, launch, launchWaitMs, logcatLines, outputDir, packageName, reactNativeDebugHost, runId, serial, startupDeepLinks, storageWrites, waitMs, }?: AndroidPreflightOptions): Promise<AndroidPreflightResult>;
247
+ /**
248
+ * Runs the android-adb preflight CLI.
249
+ *
250
+ * @returns {Promise<void>}
251
+ */
252
+ declare function main(): Promise<void>;
253
+ export { ANDROID_DEVICE_EPOCH_MS_PLACEHOLDER, buildAndroidHealth, buildAndroidVerdict, buildReactNativeDebugHostPreferenceCommand, escapeAndroidPreferenceXml, execFileCommand, main, parseAdbDevices, parseArgs, parsePositiveInteger, parseReactNativeDebugHostPort, resolveAndroidAdbDriverSteps, applyAndroidSelectorResolution, buildAndroidSelectorHealthMetadata, needsAndroidSelectorResolution, runAndroidAdbDriverStep, runAndroidAdbPreflight, selectDevice, usage, };
254
+ export type { AndroidDevice, AndroidAdbDriverStep, AndroidAsyncStorageWrite, AndroidDeepLinkCommand, AndroidPreflightOptions, AndroidPreflightResult, CliArgs, CommandExecutor, CommandResult, };