@deeeed/metamask-harness 0.19.1 → 0.21.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.
- package/CHANGELOG.md +28 -0
- package/adapters/core/inject.sh +1 -3
- package/adapters/extension/ensure-browser.sh +6 -4
- package/adapters/extension/inject.mjs +1 -1
- package/adapters/extension/launch-browser.cjs +6 -1
- package/adapters/extension/lib/chrome-args.cjs +11 -1
- package/adapters/extension/start-watch.sh +1 -1
- package/adapters/extension/verify.sh +17 -0
- package/adapters/mobile/inject.sh +1 -1
- package/adapters/mobile/open-device.sh +12 -1
- package/adapters/mobile/wait-for-bridge.sh +1 -1
- package/dist/adapters/extension/ensure-ready.js +7 -2
- package/dist/adapters/extension/runtime-decision.js +4 -6
- package/dist/adapters/extension/runtime.js +114 -17
- package/dist/adapters/mobile/prepare.js +40 -6
- package/dist/command-contract.js +58 -5
- package/dist/commands/call.js +7 -4
- package/dist/commands/check.js +9 -2
- package/dist/commands/checklist.js +117 -14
- package/dist/commands/launch/extension.js +8 -3
- package/dist/commands/launch/index.js +38 -25
- package/dist/commands/launch/mobile.js +2 -2
- package/dist/commands/manifest.js +86 -25
- package/dist/commands/run-engine.js +7 -2
- package/dist/heal-bounds.js +1 -1
- package/dist/manifest.js +85 -101
- package/dist/metamask-action-validation.js +45 -0
- package/dist/mm-harness-cli.js +7 -4
- package/dist/runner.js +9 -4
- package/docs/CONTRIBUTING.md +8 -0
- package/docs/RECIPES.md +2 -11
- package/library/actions/extension/platform/cdp.mjs +8 -3
- package/library/actions/extension/ui/navigate.mjs +239 -16
- package/library/actions/mobile/ui/navigate.mjs +1 -1
- package/library/manifests/core.action-manifest.json +357 -489
- package/library/manifests/extension.action-manifest.json +616 -885
- package/library/manifests/mobile.action-manifest.json +647 -931
- package/library/recipes/perps/lifecycle.recipe.json +3 -9
- package/library/recipes/runner/action-validation.extension.recipe.json +5 -4
- package/package.json +5 -4
- package/scripts/completions.sh +2 -2
- package/library/library.json +0 -7
|
@@ -1,30 +1,14 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"supported_official_actions": [
|
|
5
|
-
"command",
|
|
6
|
-
"wait",
|
|
7
|
-
"assert_file",
|
|
8
|
-
"assert_json",
|
|
9
|
-
"assert_exit_code",
|
|
10
|
-
"assert_output",
|
|
11
|
-
"watch_logs",
|
|
12
|
-
"index_artifacts",
|
|
13
|
-
"end",
|
|
14
|
-
"call",
|
|
15
|
-
"switch",
|
|
16
|
-
"app.status"
|
|
17
|
-
],
|
|
18
|
-
"action_metadata": {
|
|
2
|
+
"$schema": "https://farmslot.io/schemas/action-manifest-v1.schema.json",
|
|
3
|
+
"actions": {
|
|
19
4
|
"command": {
|
|
20
5
|
"description": "Run a shell command from the project root.",
|
|
21
6
|
"examples": [
|
|
22
7
|
{
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
8
|
+
"action": "command",
|
|
9
|
+
"cmd": "pwd",
|
|
10
|
+
"intent": "Prepare the project state needed for this proof.",
|
|
11
|
+
"next": "done"
|
|
28
12
|
}
|
|
29
13
|
],
|
|
30
14
|
"schema": {
|
|
@@ -53,11 +37,10 @@
|
|
|
53
37
|
"description": "Base wait action.",
|
|
54
38
|
"examples": [
|
|
55
39
|
{
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
40
|
+
"action": "wait",
|
|
41
|
+
"duration_ms": 1,
|
|
42
|
+
"intent": "Allow the requested asynchronous state to settle.",
|
|
43
|
+
"next": "done"
|
|
61
44
|
}
|
|
62
45
|
],
|
|
63
46
|
"schema": {
|
|
@@ -73,153 +56,15 @@
|
|
|
73
56
|
"additionalProperties": false
|
|
74
57
|
}
|
|
75
58
|
},
|
|
76
|
-
"switch": {
|
|
77
|
-
"description": "Choose a graph branch when one resolved string equals another.",
|
|
78
|
-
"examples": [
|
|
79
|
-
{
|
|
80
|
-
"node": {
|
|
81
|
-
"action": "switch",
|
|
82
|
-
"value": "{{params.mode}}",
|
|
83
|
-
"equals": "background_resume",
|
|
84
|
-
"cases": { "match": "background" },
|
|
85
|
-
"default": "warm",
|
|
86
|
-
"intent": "Choose the requested lifecycle preparation path"
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
],
|
|
90
|
-
"schema": {
|
|
91
|
-
"type": "object",
|
|
92
|
-
"properties": {
|
|
93
|
-
"value": { "type": "string" },
|
|
94
|
-
"equals": { "type": "string" }
|
|
95
|
-
},
|
|
96
|
-
"required": ["value", "equals"],
|
|
97
|
-
"additionalProperties": false
|
|
98
|
-
},
|
|
99
|
-
"result_cases": ["match"]
|
|
100
|
-
},
|
|
101
|
-
"watch_logs": {
|
|
102
|
-
"description": "Base log assertion/capture action.",
|
|
103
|
-
"examples": [
|
|
104
|
-
{
|
|
105
|
-
"node": {
|
|
106
|
-
"action": "watch_logs",
|
|
107
|
-
"path": "logs/app.log",
|
|
108
|
-
"intent": "Base log assertion/capture action"
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
],
|
|
112
|
-
"schema": {
|
|
113
|
-
"type": "object",
|
|
114
|
-
"properties": {
|
|
115
|
-
"path": {
|
|
116
|
-
"type": "string"
|
|
117
|
-
},
|
|
118
|
-
"contains": {
|
|
119
|
-
"type": "string"
|
|
120
|
-
},
|
|
121
|
-
"scope": {
|
|
122
|
-
"type": "string",
|
|
123
|
-
"enum": [
|
|
124
|
-
"run",
|
|
125
|
-
"file"
|
|
126
|
-
]
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
"required": [
|
|
130
|
-
"path"
|
|
131
|
-
],
|
|
132
|
-
"additionalProperties": false
|
|
133
|
-
}
|
|
134
|
-
},
|
|
135
|
-
"index_artifacts": {
|
|
136
|
-
"description": "Index extra recipe-authored artifacts that already exist on disk.",
|
|
137
|
-
"examples": [
|
|
138
|
-
{
|
|
139
|
-
"node": {
|
|
140
|
-
"action": "index_artifacts",
|
|
141
|
-
"artifacts": [
|
|
142
|
-
{
|
|
143
|
-
"path": "reports/result.json",
|
|
144
|
-
"type": "report",
|
|
145
|
-
"category": "validation",
|
|
146
|
-
"label": "Validation report"
|
|
147
|
-
}
|
|
148
|
-
],
|
|
149
|
-
"intent": "Register a pre-existing report artifact"
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
],
|
|
153
|
-
"schema": {
|
|
154
|
-
"type": "object",
|
|
155
|
-
"properties": {
|
|
156
|
-
"artifacts": {
|
|
157
|
-
"type": "array",
|
|
158
|
-
"items": {
|
|
159
|
-
"type": [
|
|
160
|
-
"string",
|
|
161
|
-
"object"
|
|
162
|
-
],
|
|
163
|
-
"properties": {
|
|
164
|
-
"path": {
|
|
165
|
-
"type": "string"
|
|
166
|
-
},
|
|
167
|
-
"type": {
|
|
168
|
-
"type": "string"
|
|
169
|
-
},
|
|
170
|
-
"label": {
|
|
171
|
-
"type": "string"
|
|
172
|
-
},
|
|
173
|
-
"nodeId": {
|
|
174
|
-
"type": "string"
|
|
175
|
-
},
|
|
176
|
-
"mimeType": {
|
|
177
|
-
"type": "string"
|
|
178
|
-
},
|
|
179
|
-
"category": {
|
|
180
|
-
"type": "string"
|
|
181
|
-
},
|
|
182
|
-
"proofTarget": {
|
|
183
|
-
"type": "string"
|
|
184
|
-
},
|
|
185
|
-
"covers": {
|
|
186
|
-
"type": "array",
|
|
187
|
-
"items": {
|
|
188
|
-
"type": "string"
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
},
|
|
192
|
-
"additionalProperties": false
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
},
|
|
196
|
-
"required": [
|
|
197
|
-
"artifacts"
|
|
198
|
-
],
|
|
199
|
-
"additionalProperties": false
|
|
200
|
-
}
|
|
201
|
-
},
|
|
202
|
-
"end": {
|
|
203
|
-
"description": "Base terminal action.",
|
|
204
|
-
"examples": [
|
|
205
|
-
{
|
|
206
|
-
"node": {
|
|
207
|
-
"action": "end",
|
|
208
|
-
"status": "pass"
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
]
|
|
212
|
-
},
|
|
213
59
|
"assert_file": {
|
|
214
60
|
"description": "Assert that a project file exists and optionally contains text.",
|
|
215
61
|
"examples": [
|
|
216
62
|
{
|
|
217
|
-
"
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
63
|
+
"action": "assert_file",
|
|
64
|
+
"path": "reports/result.txt",
|
|
65
|
+
"contains": "ok",
|
|
66
|
+
"intent": "Confirm the requested project file state.",
|
|
67
|
+
"next": "done"
|
|
223
68
|
}
|
|
224
69
|
],
|
|
225
70
|
"schema": {
|
|
@@ -242,16 +87,15 @@
|
|
|
242
87
|
"description": "Assert a JSON file value with a JSONPath-style selector.",
|
|
243
88
|
"examples": [
|
|
244
89
|
{
|
|
245
|
-
"
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
"
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
90
|
+
"action": "assert_json",
|
|
91
|
+
"path": "reports/result.json",
|
|
92
|
+
"assert": {
|
|
93
|
+
"path": "$.status",
|
|
94
|
+
"operator": "eq",
|
|
95
|
+
"value": "ok"
|
|
96
|
+
},
|
|
97
|
+
"intent": "Confirm the recorded data satisfies the requested condition.",
|
|
98
|
+
"next": "done"
|
|
255
99
|
}
|
|
256
100
|
],
|
|
257
101
|
"schema": {
|
|
@@ -321,12 +165,11 @@
|
|
|
321
165
|
"description": "Assert the exit code captured from a command node output.",
|
|
322
166
|
"examples": [
|
|
323
167
|
{
|
|
324
|
-
"
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
168
|
+
"action": "assert_exit_code",
|
|
169
|
+
"source": "run-tests",
|
|
170
|
+
"expected": 0,
|
|
171
|
+
"intent": "Confirm the project command completed with the expected result.",
|
|
172
|
+
"next": "done"
|
|
330
173
|
}
|
|
331
174
|
],
|
|
332
175
|
"schema": {
|
|
@@ -349,13 +192,12 @@
|
|
|
349
192
|
"description": "Assert stdout or stderr captured from a command node output.",
|
|
350
193
|
"examples": [
|
|
351
194
|
{
|
|
352
|
-
"
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
}
|
|
195
|
+
"action": "assert_output",
|
|
196
|
+
"source": "run-tests",
|
|
197
|
+
"stream": "stdout",
|
|
198
|
+
"contains": "PASS",
|
|
199
|
+
"intent": "Confirm the recorded output satisfies the requested condition.",
|
|
200
|
+
"next": "done"
|
|
359
201
|
}
|
|
360
202
|
],
|
|
361
203
|
"schema": {
|
|
@@ -429,40 +271,175 @@
|
|
|
429
271
|
"additionalProperties": false
|
|
430
272
|
}
|
|
431
273
|
},
|
|
432
|
-
"
|
|
433
|
-
"description": "
|
|
274
|
+
"watch_logs": {
|
|
275
|
+
"description": "Base log assertion/capture action.",
|
|
434
276
|
"examples": [
|
|
435
277
|
{
|
|
436
|
-
"
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
278
|
+
"action": "watch_logs",
|
|
279
|
+
"path": "logs/app.log",
|
|
280
|
+
"intent": "Observe the runtime behavior needed for this proof.",
|
|
281
|
+
"next": "done"
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
"schema": {
|
|
285
|
+
"type": "object",
|
|
286
|
+
"properties": {
|
|
287
|
+
"path": {
|
|
288
|
+
"type": "string"
|
|
289
|
+
},
|
|
290
|
+
"contains": {
|
|
291
|
+
"type": "string"
|
|
292
|
+
},
|
|
293
|
+
"scope": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"enum": [
|
|
296
|
+
"run",
|
|
297
|
+
"file"
|
|
298
|
+
]
|
|
440
299
|
}
|
|
300
|
+
},
|
|
301
|
+
"required": [
|
|
302
|
+
"path"
|
|
303
|
+
],
|
|
304
|
+
"additionalProperties": false
|
|
305
|
+
}
|
|
306
|
+
},
|
|
307
|
+
"index_artifacts": {
|
|
308
|
+
"description": "Index extra recipe-authored artifacts that already exist on disk.",
|
|
309
|
+
"examples": [
|
|
310
|
+
{
|
|
311
|
+
"action": "index_artifacts",
|
|
312
|
+
"artifacts": [
|
|
313
|
+
{
|
|
314
|
+
"path": "reports/result.json",
|
|
315
|
+
"type": "report",
|
|
316
|
+
"category": "validation",
|
|
317
|
+
"label": "Validation report"
|
|
318
|
+
}
|
|
319
|
+
],
|
|
320
|
+
"intent": "Preserve generated evidence in the review package.",
|
|
321
|
+
"next": "done"
|
|
441
322
|
}
|
|
442
323
|
],
|
|
443
324
|
"schema": {
|
|
444
325
|
"type": "object",
|
|
445
|
-
"properties": {
|
|
326
|
+
"properties": {
|
|
327
|
+
"artifacts": {
|
|
328
|
+
"type": "array",
|
|
329
|
+
"items": {
|
|
330
|
+
"type": [
|
|
331
|
+
"string",
|
|
332
|
+
"object"
|
|
333
|
+
],
|
|
334
|
+
"properties": {
|
|
335
|
+
"path": {
|
|
336
|
+
"type": "string"
|
|
337
|
+
},
|
|
338
|
+
"type": {
|
|
339
|
+
"type": "string"
|
|
340
|
+
},
|
|
341
|
+
"label": {
|
|
342
|
+
"type": "string"
|
|
343
|
+
},
|
|
344
|
+
"nodeId": {
|
|
345
|
+
"type": "string"
|
|
346
|
+
},
|
|
347
|
+
"mimeType": {
|
|
348
|
+
"type": "string"
|
|
349
|
+
},
|
|
350
|
+
"category": {
|
|
351
|
+
"type": "string"
|
|
352
|
+
},
|
|
353
|
+
"proofTarget": {
|
|
354
|
+
"type": "string"
|
|
355
|
+
},
|
|
356
|
+
"covers": {
|
|
357
|
+
"type": "array",
|
|
358
|
+
"items": {
|
|
359
|
+
"type": "string"
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
},
|
|
363
|
+
"additionalProperties": false
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
"required": [
|
|
368
|
+
"artifacts"
|
|
369
|
+
],
|
|
446
370
|
"additionalProperties": false
|
|
447
371
|
}
|
|
448
372
|
},
|
|
373
|
+
"end": {
|
|
374
|
+
"description": "Base terminal action.",
|
|
375
|
+
"examples": [
|
|
376
|
+
{
|
|
377
|
+
"action": "end",
|
|
378
|
+
"status": "pass"
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
},
|
|
449
382
|
"call": {
|
|
450
383
|
"description": "Invoke a named recipe by ref and run its steps inline.",
|
|
451
384
|
"examples": [
|
|
452
385
|
{
|
|
453
|
-
"
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
}
|
|
386
|
+
"action": "call",
|
|
387
|
+
"ref": "shared/setup",
|
|
388
|
+
"intent": "Run a shared recipe",
|
|
389
|
+
"next": "done"
|
|
458
390
|
}
|
|
459
391
|
]
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
392
|
+
},
|
|
393
|
+
"switch": {
|
|
394
|
+
"description": "Choose a graph branch when one resolved string equals another.",
|
|
395
|
+
"examples": [
|
|
396
|
+
{
|
|
397
|
+
"action": "switch",
|
|
398
|
+
"value": "{{params.mode}}",
|
|
399
|
+
"equals": "background_resume",
|
|
400
|
+
"cases": {
|
|
401
|
+
"match": "background"
|
|
402
|
+
},
|
|
403
|
+
"default": "warm",
|
|
404
|
+
"intent": "Choose the graph path matching the observed state."
|
|
405
|
+
}
|
|
406
|
+
],
|
|
407
|
+
"schema": {
|
|
408
|
+
"type": "object",
|
|
409
|
+
"properties": {
|
|
410
|
+
"value": {
|
|
411
|
+
"type": "string"
|
|
412
|
+
},
|
|
413
|
+
"equals": {
|
|
414
|
+
"type": "string"
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
"required": [
|
|
418
|
+
"value",
|
|
419
|
+
"equals"
|
|
420
|
+
],
|
|
421
|
+
"additionalProperties": false
|
|
422
|
+
},
|
|
423
|
+
"result_cases": [
|
|
424
|
+
"match"
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
"app.status": {
|
|
428
|
+
"description": "Report the core checkout shape and headless compatibility mode for the perps controller.",
|
|
429
|
+
"examples": [
|
|
430
|
+
{
|
|
431
|
+
"action": "app.status",
|
|
432
|
+
"intent": "Record the resolved application state before continuing.",
|
|
433
|
+
"next": "done"
|
|
434
|
+
}
|
|
435
|
+
],
|
|
436
|
+
"schema": {
|
|
437
|
+
"type": "object",
|
|
438
|
+
"properties": {},
|
|
439
|
+
"additionalProperties": false
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
"metamask.wallet.list_accounts": {
|
|
466
443
|
"description": "List redacted headless fixture accounts available to Core controller actions.",
|
|
467
444
|
"schema": {
|
|
468
445
|
"type": "object",
|
|
@@ -492,20 +469,14 @@
|
|
|
492
469
|
},
|
|
493
470
|
"examples": [
|
|
494
471
|
{
|
|
495
|
-
"
|
|
496
|
-
"
|
|
497
|
-
|
|
498
|
-
"intent": "Discover the accounts available to headless controller actions"
|
|
499
|
-
}
|
|
472
|
+
"action": "metamask.wallet.list_accounts",
|
|
473
|
+
"intent": "Discover the accounts available to headless controller actions",
|
|
474
|
+
"next": "done"
|
|
500
475
|
}
|
|
501
476
|
],
|
|
502
|
-
"proof_effect": "Records the redacted addresses derived from the same wallet fixture used by headless controller actions.",
|
|
503
|
-
"safety_notes": "Read-only fixture metadata; must never return private keys, mnemonics, passwords, or vault data.",
|
|
504
477
|
"execution_capabilities": []
|
|
505
478
|
},
|
|
506
|
-
{
|
|
507
|
-
"name": "metamask.perps.read_positions",
|
|
508
|
-
"owner": "metamask",
|
|
479
|
+
"metamask.perps.read_positions": {
|
|
509
480
|
"description": "core Read live Perps positions directly from the Perps controller; without a selector, return all live positions.",
|
|
510
481
|
"schema": {
|
|
511
482
|
"type": "object",
|
|
@@ -607,21 +578,15 @@
|
|
|
607
578
|
},
|
|
608
579
|
"examples": [
|
|
609
580
|
{
|
|
610
|
-
"
|
|
611
|
-
"
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
"intent": "Read Perps positions from the headless controller"
|
|
615
|
-
}
|
|
581
|
+
"action": "metamask.perps.read_positions",
|
|
582
|
+
"mode": "all",
|
|
583
|
+
"intent": "Read Perps positions from the headless controller",
|
|
584
|
+
"next": "done"
|
|
616
585
|
}
|
|
617
586
|
],
|
|
618
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output.",
|
|
619
|
-
"safety_notes": "Read-only HyperLiquid query on the explicitly selected network; must not inject controller/UI state to fabricate proof.",
|
|
620
587
|
"execution_capabilities": []
|
|
621
588
|
},
|
|
622
|
-
{
|
|
623
|
-
"name": "metamask.perps.read_orders",
|
|
624
|
-
"owner": "metamask",
|
|
589
|
+
"metamask.perps.read_orders": {
|
|
625
590
|
"description": "core Read live Perps open orders directly from the Perps controller; without a selector, return all live orders.",
|
|
626
591
|
"schema": {
|
|
627
592
|
"type": "object",
|
|
@@ -723,21 +688,15 @@
|
|
|
723
688
|
},
|
|
724
689
|
"examples": [
|
|
725
690
|
{
|
|
726
|
-
"
|
|
727
|
-
"
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
"intent": "Read Perps open orders from the headless controller"
|
|
731
|
-
}
|
|
691
|
+
"action": "metamask.perps.read_orders",
|
|
692
|
+
"mode": "all",
|
|
693
|
+
"intent": "Read Perps open orders from the headless controller",
|
|
694
|
+
"next": "done"
|
|
732
695
|
}
|
|
733
696
|
],
|
|
734
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output.",
|
|
735
|
-
"safety_notes": "Read-only HyperLiquid query on the explicitly selected network; must not inject controller/UI state to fabricate proof.",
|
|
736
697
|
"execution_capabilities": []
|
|
737
698
|
},
|
|
738
|
-
{
|
|
739
|
-
"name": "metamask.perps.read_account",
|
|
740
|
-
"owner": "metamask",
|
|
699
|
+
"metamask.perps.read_account": {
|
|
741
700
|
"description": "core Read live Perps account state (balances, margin) directly from the perps controller (HyperLiquid testnet, HTTP read-only).",
|
|
742
701
|
"schema": {
|
|
743
702
|
"type": "object",
|
|
@@ -754,20 +713,14 @@
|
|
|
754
713
|
},
|
|
755
714
|
"examples": [
|
|
756
715
|
{
|
|
757
|
-
"
|
|
758
|
-
"
|
|
759
|
-
|
|
760
|
-
"intent": "Read Perps account state from the headless controller"
|
|
761
|
-
}
|
|
716
|
+
"action": "metamask.perps.read_account",
|
|
717
|
+
"intent": "Read Perps account state from the headless controller",
|
|
718
|
+
"next": "done"
|
|
762
719
|
}
|
|
763
720
|
],
|
|
764
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output.",
|
|
765
|
-
"safety_notes": "Read-only HyperLiquid testnet HTTP query; must not inject controller/UI state to fabricate proof.",
|
|
766
721
|
"execution_capabilities": []
|
|
767
722
|
},
|
|
768
|
-
{
|
|
769
|
-
"name": "metamask.perps.place_order",
|
|
770
|
-
"owner": "metamask",
|
|
723
|
+
"metamask.perps.place_order": {
|
|
771
724
|
"description": "core Place a real Perps order on HyperLiquid testnet by driving the headless perps controller placeOrder() through the full signing/provider path. Testnet only Supports market (default) and resting limit orders (order_type=limit with price/offset_pct).",
|
|
772
725
|
"schema": {
|
|
773
726
|
"type": "object",
|
|
@@ -838,7 +791,7 @@
|
|
|
838
791
|
"long",
|
|
839
792
|
"short"
|
|
840
793
|
],
|
|
841
|
-
"description": "
|
|
794
|
+
"description": "Required order direction."
|
|
842
795
|
},
|
|
843
796
|
"order_type": {
|
|
844
797
|
"type": "string",
|
|
@@ -857,11 +810,17 @@
|
|
|
857
810
|
"description": "Resting limit price as a percent offset from live mid for limit orders (e.g. -30 = 30%% below mid for a non-filling BUY; default -30 buy / +30 sell). Alias: offsetPct."
|
|
858
811
|
},
|
|
859
812
|
"amount": {
|
|
860
|
-
"type":
|
|
813
|
+
"type": [
|
|
814
|
+
"string",
|
|
815
|
+
"number"
|
|
816
|
+
],
|
|
861
817
|
"description": "USD notional alias."
|
|
862
818
|
},
|
|
863
819
|
"notional": {
|
|
864
|
-
"type":
|
|
820
|
+
"type": [
|
|
821
|
+
"string",
|
|
822
|
+
"number"
|
|
823
|
+
],
|
|
865
824
|
"description": "USD notional alias."
|
|
866
825
|
},
|
|
867
826
|
"leverage": {
|
|
@@ -880,40 +839,32 @@
|
|
|
880
839
|
},
|
|
881
840
|
"examples": [
|
|
882
841
|
{
|
|
883
|
-
"
|
|
884
|
-
"
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
"intent": "Place the requested Perps order via the headless controller"
|
|
891
|
-
}
|
|
842
|
+
"action": "metamask.perps.place_order",
|
|
843
|
+
"market": "BTC",
|
|
844
|
+
"side": "long",
|
|
845
|
+
"notional": "11",
|
|
846
|
+
"leverage": 2,
|
|
847
|
+
"intent": "Place the requested Perps order via the headless controller",
|
|
848
|
+
"next": "done"
|
|
892
849
|
},
|
|
893
850
|
{
|
|
894
|
-
"
|
|
895
|
-
"
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
"intent": "Place a resting Perps limit order via the headless controller"
|
|
904
|
-
}
|
|
851
|
+
"action": "metamask.perps.place_order",
|
|
852
|
+
"market": "BTC",
|
|
853
|
+
"side": "long",
|
|
854
|
+
"order_type": "limit",
|
|
855
|
+
"offset_pct": -30,
|
|
856
|
+
"notional": "11",
|
|
857
|
+
"leverage": 2,
|
|
858
|
+
"intent": "Place a resting Perps limit order via the headless controller",
|
|
859
|
+
"next": "done"
|
|
905
860
|
}
|
|
906
861
|
],
|
|
907
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output (order id, opened position).",
|
|
908
|
-
"safety_notes": "Submits a REAL signed order to HyperLiquid testnet; must not mock the signer/provider or inject controller state to fabricate proof.",
|
|
909
862
|
"execution_capabilities": [
|
|
910
863
|
"app-mutation",
|
|
911
864
|
"external-mutation"
|
|
912
865
|
]
|
|
913
866
|
},
|
|
914
|
-
{
|
|
915
|
-
"name": "metamask.perps.close_positions",
|
|
916
|
-
"owner": "metamask",
|
|
867
|
+
"metamask.perps.close_positions": {
|
|
917
868
|
"description": "core Close selected live Perps positions on HyperLiquid testnet by driving the headless perps controller closePosition() through the full signing/provider path. Testnet only.",
|
|
918
869
|
"schema": {
|
|
919
870
|
"type": "object",
|
|
@@ -1006,24 +957,18 @@
|
|
|
1006
957
|
},
|
|
1007
958
|
"examples": [
|
|
1008
959
|
{
|
|
1009
|
-
"
|
|
1010
|
-
"
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
"intent": "Close selected Perps positions via the headless controller"
|
|
1014
|
-
}
|
|
960
|
+
"action": "metamask.perps.close_positions",
|
|
961
|
+
"market": "BTC",
|
|
962
|
+
"intent": "Close selected Perps positions via the headless controller",
|
|
963
|
+
"next": "done"
|
|
1015
964
|
}
|
|
1016
965
|
],
|
|
1017
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output (positions absent after close).",
|
|
1018
|
-
"safety_notes": "Submits REAL signed close orders to HyperLiquid testnet; must not mock the signer/provider or inject controller state to fabricate proof.",
|
|
1019
966
|
"execution_capabilities": [
|
|
1020
967
|
"app-mutation",
|
|
1021
968
|
"external-mutation"
|
|
1022
969
|
]
|
|
1023
970
|
},
|
|
1024
|
-
{
|
|
1025
|
-
"name": "metamask.perps.assert_positions",
|
|
1026
|
-
"owner": "metamask",
|
|
971
|
+
"metamask.perps.assert_positions": {
|
|
1027
972
|
"description": "core Assert live Perps positions are present or absent for an explicit market selection or mode=all.",
|
|
1028
973
|
"schema": {
|
|
1029
974
|
"type": "object",
|
|
@@ -1139,22 +1084,16 @@
|
|
|
1139
1084
|
},
|
|
1140
1085
|
"examples": [
|
|
1141
1086
|
{
|
|
1142
|
-
"
|
|
1143
|
-
"
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
"intent": "Assert the expected Perps position state via the headless controller"
|
|
1148
|
-
}
|
|
1087
|
+
"action": "metamask.perps.assert_positions",
|
|
1088
|
+
"state": "open",
|
|
1089
|
+
"market": "BTC",
|
|
1090
|
+
"intent": "Assert the expected Perps position state via the headless controller",
|
|
1091
|
+
"next": "done"
|
|
1149
1092
|
}
|
|
1150
1093
|
],
|
|
1151
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output.",
|
|
1152
|
-
"safety_notes": "Read-only HyperLiquid query on the explicitly selected network; must not inject controller state to fabricate proof.",
|
|
1153
1094
|
"execution_capabilities": []
|
|
1154
1095
|
},
|
|
1155
|
-
{
|
|
1156
|
-
"name": "metamask.perps.ensure_positions",
|
|
1157
|
-
"owner": "metamask",
|
|
1096
|
+
"metamask.perps.ensure_positions": {
|
|
1158
1097
|
"description": "core Higher-level wrapper that reads selected positions, places or closes via the headless controller as needed, then asserts the final position state. Testnet only.",
|
|
1159
1098
|
"schema": {
|
|
1160
1099
|
"type": "object",
|
|
@@ -1233,7 +1172,7 @@
|
|
|
1233
1172
|
"long",
|
|
1234
1173
|
"short"
|
|
1235
1174
|
],
|
|
1236
|
-
"description": "
|
|
1175
|
+
"description": "Required when state=open/present; otherwise filters selected positions."
|
|
1237
1176
|
},
|
|
1238
1177
|
"state": {
|
|
1239
1178
|
"type": "string",
|
|
@@ -1247,11 +1186,17 @@
|
|
|
1247
1186
|
"description": "Desired selected position state to converge to."
|
|
1248
1187
|
},
|
|
1249
1188
|
"amount": {
|
|
1250
|
-
"type":
|
|
1189
|
+
"type": [
|
|
1190
|
+
"string",
|
|
1191
|
+
"number"
|
|
1192
|
+
],
|
|
1251
1193
|
"description": "USD notional alias (used when placing to reach state open)."
|
|
1252
1194
|
},
|
|
1253
1195
|
"notional": {
|
|
1254
|
-
"type":
|
|
1196
|
+
"type": [
|
|
1197
|
+
"string",
|
|
1198
|
+
"number"
|
|
1199
|
+
],
|
|
1255
1200
|
"description": "USD notional alias."
|
|
1256
1201
|
},
|
|
1257
1202
|
"leverage": {
|
|
@@ -1272,25 +1217,28 @@
|
|
|
1272
1217
|
},
|
|
1273
1218
|
"examples": [
|
|
1274
1219
|
{
|
|
1275
|
-
"
|
|
1276
|
-
"
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1220
|
+
"action": "metamask.perps.ensure_positions",
|
|
1221
|
+
"state": "none",
|
|
1222
|
+
"market": "BTC",
|
|
1223
|
+
"intent": "Converge Perps positions to the requested state via the headless controller",
|
|
1224
|
+
"next": "done"
|
|
1225
|
+
},
|
|
1226
|
+
{
|
|
1227
|
+
"action": "metamask.perps.ensure_positions",
|
|
1228
|
+
"market": "ETH",
|
|
1229
|
+
"side": "long",
|
|
1230
|
+
"state": "open",
|
|
1231
|
+
"notional": "10",
|
|
1232
|
+
"intent": "Converge ETH positions to one explicit testnet precondition",
|
|
1233
|
+
"next": "done"
|
|
1282
1234
|
}
|
|
1283
1235
|
],
|
|
1284
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or controller output.",
|
|
1285
|
-
"safety_notes": "May submit REAL signed orders to HyperLiquid testnet; must not mock the signer/provider or inject controller state to fabricate proof.",
|
|
1286
1236
|
"execution_capabilities": [
|
|
1287
1237
|
"app-mutation",
|
|
1288
1238
|
"external-mutation"
|
|
1289
1239
|
]
|
|
1290
1240
|
},
|
|
1291
|
-
{
|
|
1292
|
-
"name": "metamask.perps.close_orders",
|
|
1293
|
-
"owner": "metamask",
|
|
1241
|
+
"metamask.perps.close_orders": {
|
|
1294
1242
|
"description": "core Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested. Cancel selected live Perps open orders. Use selector/mode params to cancel matching symbols or all orders.",
|
|
1295
1243
|
"schema": {
|
|
1296
1244
|
"type": "object",
|
|
@@ -1379,32 +1327,24 @@
|
|
|
1379
1327
|
},
|
|
1380
1328
|
"examples": [
|
|
1381
1329
|
{
|
|
1382
|
-
"
|
|
1383
|
-
"
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
"intent": "Cancel selected Perps orders before continuing"
|
|
1387
|
-
}
|
|
1330
|
+
"action": "metamask.perps.close_orders",
|
|
1331
|
+
"mode": "all",
|
|
1332
|
+
"intent": "Cancel selected Perps orders before continuing",
|
|
1333
|
+
"next": "done"
|
|
1388
1334
|
},
|
|
1389
1335
|
{
|
|
1390
|
-
"
|
|
1391
|
-
"
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
"intent": "Cancel selected Perps orders before continuing"
|
|
1395
|
-
}
|
|
1336
|
+
"action": "metamask.perps.close_orders",
|
|
1337
|
+
"market": "BTC",
|
|
1338
|
+
"intent": "Cancel selected Perps orders before continuing",
|
|
1339
|
+
"next": "done"
|
|
1396
1340
|
}
|
|
1397
1341
|
],
|
|
1398
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1399
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1400
1342
|
"execution_capabilities": [
|
|
1401
1343
|
"app-mutation",
|
|
1402
1344
|
"external-mutation"
|
|
1403
1345
|
]
|
|
1404
1346
|
},
|
|
1405
|
-
{
|
|
1406
|
-
"name": "metamask.perps.assert_orders",
|
|
1407
|
-
"owner": "metamask",
|
|
1347
|
+
"metamask.perps.assert_orders": {
|
|
1408
1348
|
"description": "core Assert live Perps open orders are present or absent for an explicit market selection or mode=all.",
|
|
1409
1349
|
"schema": {
|
|
1410
1350
|
"type": "object",
|
|
@@ -1516,22 +1456,16 @@
|
|
|
1516
1456
|
},
|
|
1517
1457
|
"examples": [
|
|
1518
1458
|
{
|
|
1519
|
-
"
|
|
1520
|
-
"
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
"intent": "Assert the expected Perps open order state"
|
|
1525
|
-
}
|
|
1459
|
+
"action": "metamask.perps.assert_orders",
|
|
1460
|
+
"state": "none",
|
|
1461
|
+
"market": "BTC",
|
|
1462
|
+
"intent": "Assert the expected Perps open order state",
|
|
1463
|
+
"next": "done"
|
|
1526
1464
|
}
|
|
1527
1465
|
],
|
|
1528
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1529
|
-
"safety_notes": "Read-only HyperLiquid query on the explicitly selected network; must not inject mid-recipe state to fabricate proof.",
|
|
1530
1466
|
"execution_capabilities": []
|
|
1531
1467
|
},
|
|
1532
|
-
{
|
|
1533
|
-
"name": "metamask.perps.ensure_orders",
|
|
1534
|
-
"owner": "metamask",
|
|
1468
|
+
"metamask.perps.ensure_orders": {
|
|
1535
1469
|
"description": "core Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested.Higher-level wrapper that reads selected orders, cancels when needed, then asserts final order state.",
|
|
1536
1470
|
"schema": {
|
|
1537
1471
|
"type": "object",
|
|
@@ -1610,11 +1544,29 @@
|
|
|
1610
1544
|
"long",
|
|
1611
1545
|
"short"
|
|
1612
1546
|
],
|
|
1613
|
-
"description": "
|
|
1547
|
+
"description": "Required when state=open/present; otherwise filters selected orders."
|
|
1614
1548
|
},
|
|
1615
1549
|
"timeout_ms": {
|
|
1616
1550
|
"type": "number"
|
|
1617
1551
|
},
|
|
1552
|
+
"amount": {
|
|
1553
|
+
"type": [
|
|
1554
|
+
"string",
|
|
1555
|
+
"number"
|
|
1556
|
+
],
|
|
1557
|
+
"description": "Explicit USD notional used only when creating a missing open order. Alias: notional."
|
|
1558
|
+
},
|
|
1559
|
+
"notional": {
|
|
1560
|
+
"type": [
|
|
1561
|
+
"string",
|
|
1562
|
+
"number"
|
|
1563
|
+
],
|
|
1564
|
+
"description": "Alias for amount."
|
|
1565
|
+
},
|
|
1566
|
+
"leverage": {
|
|
1567
|
+
"type": "number",
|
|
1568
|
+
"description": "Leverage used only when creating a missing open order."
|
|
1569
|
+
},
|
|
1618
1570
|
"state": {
|
|
1619
1571
|
"type": "string",
|
|
1620
1572
|
"enum": [
|
|
@@ -1634,25 +1586,29 @@
|
|
|
1634
1586
|
},
|
|
1635
1587
|
"examples": [
|
|
1636
1588
|
{
|
|
1637
|
-
"
|
|
1638
|
-
"
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1589
|
+
"action": "metamask.perps.ensure_orders",
|
|
1590
|
+
"state": "none",
|
|
1591
|
+
"mode": "all",
|
|
1592
|
+
"intent": "Converge Perps orders to the requested state",
|
|
1593
|
+
"next": "done"
|
|
1594
|
+
},
|
|
1595
|
+
{
|
|
1596
|
+
"action": "metamask.perps.ensure_orders",
|
|
1597
|
+
"market": "ETH",
|
|
1598
|
+
"side": "short",
|
|
1599
|
+
"state": "open",
|
|
1600
|
+
"notional": "10",
|
|
1601
|
+
"leverage": 2,
|
|
1602
|
+
"intent": "Converge ETH open orders to one explicit testnet precondition",
|
|
1603
|
+
"next": "done"
|
|
1644
1604
|
}
|
|
1645
1605
|
],
|
|
1646
|
-
"proof_effect": "E2E validation must record this action in trace.json; live-proof actions include liveAdapter/proofPath or target runtime output.",
|
|
1647
|
-
"safety_notes": "Must not inject mid-recipe UI/app state to fabricate proof.",
|
|
1648
1606
|
"execution_capabilities": [
|
|
1649
1607
|
"app-mutation",
|
|
1650
1608
|
"external-mutation"
|
|
1651
1609
|
]
|
|
1652
1610
|
},
|
|
1653
|
-
{
|
|
1654
|
-
"name": "metamask.perps.start_state",
|
|
1655
|
-
"owner": "metamask",
|
|
1611
|
+
"metamask.perps.start_state": {
|
|
1656
1612
|
"description": "core Default to testnet for Perps mutations; mainnet is read-only unless explicitly requested.Recommended configurable Perps start state that composes reusable domain operations before the proof window. Headless: converges POSITION and ORDER baselines on testnet via the controller; no navigation/page/HUD.",
|
|
1657
1613
|
"schema": {
|
|
1658
1614
|
"type": "object",
|
|
@@ -1940,48 +1896,40 @@
|
|
|
1940
1896
|
},
|
|
1941
1897
|
"examples": [
|
|
1942
1898
|
{
|
|
1943
|
-
"
|
|
1944
|
-
"
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
"
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
"network": "testnet"
|
|
1956
|
-
}
|
|
1899
|
+
"action": "metamask.perps.start_state",
|
|
1900
|
+
"profile": "clean_market_testnet",
|
|
1901
|
+
"market": "BTC",
|
|
1902
|
+
"positions": {
|
|
1903
|
+
"state": "none"
|
|
1904
|
+
},
|
|
1905
|
+
"orders": {
|
|
1906
|
+
"state": "none"
|
|
1907
|
+
},
|
|
1908
|
+
"intent": "Prepare the Perps start state for the proof",
|
|
1909
|
+
"network": "testnet",
|
|
1910
|
+
"next": "done"
|
|
1957
1911
|
},
|
|
1958
1912
|
{
|
|
1959
|
-
"
|
|
1960
|
-
"
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
"
|
|
1965
|
-
"
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
"network": "testnet"
|
|
1972
|
-
}
|
|
1913
|
+
"action": "metamask.perps.start_state",
|
|
1914
|
+
"profile": "open_position_testnet",
|
|
1915
|
+
"market": "ETH",
|
|
1916
|
+
"side": "long",
|
|
1917
|
+
"positions": {
|
|
1918
|
+
"state": "open",
|
|
1919
|
+
"notional": "10",
|
|
1920
|
+
"leverage": 2
|
|
1921
|
+
},
|
|
1922
|
+
"intent": "Prepare the Perps start state for the proof",
|
|
1923
|
+
"network": "testnet",
|
|
1924
|
+
"next": "done"
|
|
1973
1925
|
}
|
|
1974
1926
|
],
|
|
1975
|
-
"proof_effect": "Runs in setup/teardown phase and must be visible in trace.json; proof videos can keep this as trace-only setup.",
|
|
1976
|
-
"safety_notes": "Composes supported app/API paths and must not mutate React/Redux/MobX/DOM/local storage to fabricate proof.",
|
|
1977
1927
|
"execution_capabilities": [
|
|
1978
1928
|
"app-mutation",
|
|
1979
1929
|
"external-mutation"
|
|
1980
1930
|
]
|
|
1981
1931
|
},
|
|
1982
|
-
{
|
|
1983
|
-
"name": "metamask.perps.teardown_state",
|
|
1984
|
-
"owner": "metamask",
|
|
1932
|
+
"metamask.perps.teardown_state": {
|
|
1985
1933
|
"description": "core Recommended configurable Perps teardown state that restores the selected environment after proof. Headless: converges POSITION and ORDER baselines on testnet via the controller; no navigation/page/HUD.",
|
|
1986
1934
|
"schema": {
|
|
1987
1935
|
"type": "object",
|
|
@@ -2269,108 +2217,28 @@
|
|
|
2269
2217
|
},
|
|
2270
2218
|
"examples": [
|
|
2271
2219
|
{
|
|
2272
|
-
"
|
|
2273
|
-
"
|
|
2274
|
-
|
|
2275
|
-
"
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
"intent": "Restore Perps state after the proof"
|
|
2283
|
-
}
|
|
2220
|
+
"action": "metamask.perps.teardown_state",
|
|
2221
|
+
"market": "BTC",
|
|
2222
|
+
"positions": {
|
|
2223
|
+
"state": "none"
|
|
2224
|
+
},
|
|
2225
|
+
"orders": {
|
|
2226
|
+
"state": "none"
|
|
2227
|
+
},
|
|
2228
|
+
"intent": "Restore Perps state after the proof",
|
|
2229
|
+
"next": "done"
|
|
2284
2230
|
},
|
|
2285
2231
|
{
|
|
2286
|
-
"
|
|
2287
|
-
"
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
"intent": "Restore Perps state after the proof"
|
|
2291
|
-
}
|
|
2232
|
+
"action": "metamask.perps.teardown_state",
|
|
2233
|
+
"market": "BTC",
|
|
2234
|
+
"intent": "Restore Perps state after the proof",
|
|
2235
|
+
"next": "done"
|
|
2292
2236
|
}
|
|
2293
2237
|
],
|
|
2294
|
-
"proof_effect": "Runs in setup/teardown phase and must be visible in trace.json; proof videos can keep this as trace-only setup.",
|
|
2295
|
-
"safety_notes": "Composes supported app/API paths and must not mutate React/Redux/MobX/DOM/local storage to fabricate proof.",
|
|
2296
2238
|
"execution_capabilities": [
|
|
2297
2239
|
"app-mutation",
|
|
2298
2240
|
"external-mutation"
|
|
2299
2241
|
]
|
|
2300
2242
|
}
|
|
2301
|
-
|
|
2302
|
-
"native_bindings": [
|
|
2303
|
-
{
|
|
2304
|
-
"action": "command",
|
|
2305
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2306
|
-
},
|
|
2307
|
-
{
|
|
2308
|
-
"action": "wait",
|
|
2309
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2310
|
-
},
|
|
2311
|
-
{
|
|
2312
|
-
"action": "assert_file",
|
|
2313
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2314
|
-
},
|
|
2315
|
-
{
|
|
2316
|
-
"action": "assert_json",
|
|
2317
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2318
|
-
},
|
|
2319
|
-
{
|
|
2320
|
-
"action": "assert_exit_code",
|
|
2321
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2322
|
-
},
|
|
2323
|
-
{
|
|
2324
|
-
"action": "assert_output",
|
|
2325
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2326
|
-
},
|
|
2327
|
-
{
|
|
2328
|
-
"action": "watch_logs",
|
|
2329
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2330
|
-
},
|
|
2331
|
-
{
|
|
2332
|
-
"action": "index_artifacts",
|
|
2333
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2334
|
-
},
|
|
2335
|
-
{
|
|
2336
|
-
"action": "end",
|
|
2337
|
-
"implementation": "@farmslot/recipe-harness/adapters/core"
|
|
2338
|
-
},
|
|
2339
|
-
{
|
|
2340
|
-
"action": "app.status",
|
|
2341
|
-
"implementation": "@metamask/recipe-runner/platform-status"
|
|
2342
|
-
},
|
|
2343
|
-
{
|
|
2344
|
-
"action": "metamask.wallet.list_accounts",
|
|
2345
|
-
"implementation": "@metamask/recipe-runner/core/wallet"
|
|
2346
|
-
},
|
|
2347
|
-
{
|
|
2348
|
-
"action": "metamask.perps.read_positions",
|
|
2349
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2350
|
-
},
|
|
2351
|
-
{
|
|
2352
|
-
"action": "metamask.perps.read_orders",
|
|
2353
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2354
|
-
},
|
|
2355
|
-
{
|
|
2356
|
-
"action": "metamask.perps.read_account",
|
|
2357
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2358
|
-
},
|
|
2359
|
-
{
|
|
2360
|
-
"action": "metamask.perps.place_order",
|
|
2361
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2362
|
-
},
|
|
2363
|
-
{
|
|
2364
|
-
"action": "metamask.perps.close_positions",
|
|
2365
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2366
|
-
},
|
|
2367
|
-
{
|
|
2368
|
-
"action": "metamask.perps.assert_positions",
|
|
2369
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2370
|
-
},
|
|
2371
|
-
{
|
|
2372
|
-
"action": "metamask.perps.ensure_positions",
|
|
2373
|
-
"implementation": "@metamask/recipe-runner/core/perps"
|
|
2374
|
-
}
|
|
2375
|
-
]
|
|
2243
|
+
}
|
|
2376
2244
|
}
|