From 920814da34f7f6b3cc9bc2f9fd9822b0a3b9b3e1 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Sat, 13 Dec 2025 08:35:18 -0800 Subject: [PATCH 01/13] add scope property --- common/dist/schemas/config_v3.schema.json | 88 +++ common/dist/schemas/find_v3.schema.json | 16 + common/dist/schemas/report_v3.schema.json | 80 +++ .../dist/schemas/resolvedTests_v3.schema.json | 168 +++++ common/dist/schemas/runCode_v3.schema.json | 8 + common/dist/schemas/runShell_v3.schema.json | 8 + common/dist/schemas/spec_v3.schema.json | 80 +++ common/dist/schemas/step_v3.schema.json | 40 ++ common/dist/schemas/test_v3.schema.json | 80 +++ common/dist/schemas/type_v3.schema.json | 8 + common/package-lock.json | 1 + .../output_schemas/config_v3.schema.json | 88 +++ .../output_schemas/find_v3.schema.json | 16 + .../output_schemas/report_v3.schema.json | 80 +++ .../resolvedTests_v3.schema.json | 168 +++++ .../output_schemas/runCode_v3.schema.json | 8 + .../output_schemas/runShell_v3.schema.json | 8 + .../output_schemas/spec_v3.schema.json | 80 +++ .../output_schemas/step_v3.schema.json | 40 ++ .../output_schemas/test_v3.schema.json | 80 +++ .../output_schemas/type_v3.schema.json | 8 + common/src/schemas/schemas.json | 576 ++++++++++++++++++ .../src_schemas/runCode_v3.schema.json | 4 + .../src_schemas/runShell_v3.schema.json | 4 + .../schemas/src_schemas/type_v3.schema.json | 4 + 25 files changed, 1741 insertions(+) diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index 37355c3..df5084a 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -1940,6 +1940,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2047,6 +2051,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2589,6 +2597,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2696,6 +2708,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4504,6 +4520,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4594,6 +4614,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4812,6 +4836,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4903,6 +4931,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5127,6 +5159,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5234,6 +5270,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -8067,6 +8107,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -8157,6 +8201,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -9848,6 +9896,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9955,6 +10007,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10497,6 +10553,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10604,6 +10664,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12412,6 +12476,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12502,6 +12570,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12720,6 +12792,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12811,6 +12887,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13035,6 +13115,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13142,6 +13226,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/find_v3.schema.json b/common/dist/schemas/find_v3.schema.json index 4f4aea6..5f4d1c8 100644 --- a/common/dist/schemas/find_v3.schema.json +++ b/common/dist/schemas/find_v3.schema.json @@ -433,6 +433,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -540,6 +544,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1082,6 +1090,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1189,6 +1201,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 6cc1350..4e162e7 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -2373,6 +2373,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2480,6 +2484,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3022,6 +3030,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3129,6 +3141,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4937,6 +4953,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5027,6 +5047,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5245,6 +5269,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5336,6 +5364,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5560,6 +5592,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5667,6 +5703,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9850,6 +9890,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9957,6 +10001,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10499,6 +10547,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10606,6 +10658,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12414,6 +12470,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12504,6 +12564,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12722,6 +12786,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12813,6 +12881,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13037,6 +13109,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13144,6 +13220,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index a0f89f7..b8bb6c8 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -1953,6 +1953,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2060,6 +2064,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2602,6 +2610,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2709,6 +2721,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4517,6 +4533,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4607,6 +4627,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4825,6 +4849,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4916,6 +4944,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5140,6 +5172,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5247,6 +5283,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -8080,6 +8120,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -8170,6 +8214,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -9861,6 +9909,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9968,6 +10020,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10510,6 +10566,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10617,6 +10677,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12425,6 +12489,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12515,6 +12583,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12733,6 +12805,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12824,6 +12900,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13048,6 +13128,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13155,6 +13239,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18538,6 +18626,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18645,6 +18737,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -19187,6 +19283,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -19294,6 +19394,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -21102,6 +21206,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21192,6 +21300,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21410,6 +21522,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21501,6 +21617,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21725,6 +21845,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -21832,6 +21956,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26015,6 +26143,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26122,6 +26254,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26664,6 +26800,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26771,6 +26911,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -28579,6 +28723,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28669,6 +28817,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28887,6 +29039,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28978,6 +29134,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -29202,6 +29362,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -29309,6 +29473,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/runCode_v3.schema.json b/common/dist/schemas/runCode_v3.schema.json index 23899a5..8022de4 100644 --- a/common/dist/schemas/runCode_v3.schema.json +++ b/common/dist/schemas/runCode_v3.schema.json @@ -23,6 +23,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -114,6 +118,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/dist/schemas/runShell_v3.schema.json b/common/dist/schemas/runShell_v3.schema.json index a65de4f..3440de2 100644 --- a/common/dist/schemas/runShell_v3.schema.json +++ b/common/dist/schemas/runShell_v3.schema.json @@ -22,6 +22,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -112,6 +116,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index 6c1d56a..e25ebca 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -2355,6 +2355,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2462,6 +2466,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3004,6 +3012,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3111,6 +3123,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4919,6 +4935,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5009,6 +5029,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5227,6 +5251,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5318,6 +5346,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5542,6 +5574,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5649,6 +5685,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9832,6 +9872,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9939,6 +9983,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10481,6 +10529,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10588,6 +10640,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12396,6 +12452,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12486,6 +12546,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12704,6 +12768,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12795,6 +12863,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13019,6 +13091,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13126,6 +13202,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 8960667..8199898 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -1155,6 +1155,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1262,6 +1266,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1804,6 +1812,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1911,6 +1923,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3719,6 +3735,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -3809,6 +3829,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4027,6 +4051,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4118,6 +4146,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4342,6 +4374,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4449,6 +4485,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index 9d86ed1..79bd2fa 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -1754,6 +1754,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1861,6 +1865,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2403,6 +2411,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2510,6 +2522,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4318,6 +4334,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4408,6 +4428,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4626,6 +4650,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4717,6 +4745,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4941,6 +4973,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5048,6 +5084,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9231,6 +9271,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9338,6 +9382,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9880,6 +9928,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9987,6 +10039,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -11795,6 +11851,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -11885,6 +11945,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12103,6 +12167,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12194,6 +12262,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12418,6 +12490,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12525,6 +12601,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/dist/schemas/type_v3.schema.json b/common/dist/schemas/type_v3.schema.json index 566eda5..601bb0a 100644 --- a/common/dist/schemas/type_v3.schema.json +++ b/common/dist/schemas/type_v3.schema.json @@ -45,6 +45,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -152,6 +156,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/package-lock.json b/common/package-lock.json index 633aa5a..a3f9052 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -202,6 +202,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index 37355c3..df5084a 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -1940,6 +1940,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2047,6 +2051,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2589,6 +2597,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2696,6 +2708,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4504,6 +4520,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4594,6 +4614,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4812,6 +4836,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4903,6 +4931,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5127,6 +5159,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5234,6 +5270,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -8067,6 +8107,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -8157,6 +8201,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -9848,6 +9896,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9955,6 +10007,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10497,6 +10553,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10604,6 +10664,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12412,6 +12476,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12502,6 +12570,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12720,6 +12792,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12811,6 +12887,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13035,6 +13115,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13142,6 +13226,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/find_v3.schema.json b/common/src/schemas/output_schemas/find_v3.schema.json index 4f4aea6..5f4d1c8 100644 --- a/common/src/schemas/output_schemas/find_v3.schema.json +++ b/common/src/schemas/output_schemas/find_v3.schema.json @@ -433,6 +433,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -540,6 +544,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1082,6 +1090,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1189,6 +1201,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 6cc1350..4e162e7 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -2373,6 +2373,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2480,6 +2484,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3022,6 +3030,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3129,6 +3141,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4937,6 +4953,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5027,6 +5047,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5245,6 +5269,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5336,6 +5364,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5560,6 +5592,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5667,6 +5703,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9850,6 +9890,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9957,6 +10001,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10499,6 +10547,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10606,6 +10658,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12414,6 +12470,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12504,6 +12564,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12722,6 +12786,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12813,6 +12881,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13037,6 +13109,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13144,6 +13220,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index a0f89f7..b8bb6c8 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -1953,6 +1953,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2060,6 +2064,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2602,6 +2610,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2709,6 +2721,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4517,6 +4533,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4607,6 +4627,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4825,6 +4849,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4916,6 +4944,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5140,6 +5172,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5247,6 +5283,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -8080,6 +8120,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -8170,6 +8214,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -9861,6 +9909,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9968,6 +10020,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10510,6 +10566,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10617,6 +10677,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12425,6 +12489,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12515,6 +12583,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12733,6 +12805,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12824,6 +12900,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13048,6 +13128,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13155,6 +13239,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18538,6 +18626,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18645,6 +18737,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -19187,6 +19283,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -19294,6 +19394,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -21102,6 +21206,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21192,6 +21300,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21410,6 +21522,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21501,6 +21617,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -21725,6 +21845,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -21832,6 +21956,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26015,6 +26143,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26122,6 +26254,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26664,6 +26800,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -26771,6 +26911,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -28579,6 +28723,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28669,6 +28817,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28887,6 +29039,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28978,6 +29134,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -29202,6 +29362,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -29309,6 +29473,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/runCode_v3.schema.json b/common/src/schemas/output_schemas/runCode_v3.schema.json index 23899a5..8022de4 100644 --- a/common/src/schemas/output_schemas/runCode_v3.schema.json +++ b/common/src/schemas/output_schemas/runCode_v3.schema.json @@ -23,6 +23,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -114,6 +118,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/src/schemas/output_schemas/runShell_v3.schema.json b/common/src/schemas/output_schemas/runShell_v3.schema.json index a65de4f..3440de2 100644 --- a/common/src/schemas/output_schemas/runShell_v3.schema.json +++ b/common/src/schemas/output_schemas/runShell_v3.schema.json @@ -22,6 +22,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -112,6 +116,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index 6c1d56a..e25ebca 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -2355,6 +2355,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2462,6 +2466,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3004,6 +3012,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3111,6 +3123,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4919,6 +4935,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5009,6 +5029,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5227,6 +5251,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5318,6 +5346,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5542,6 +5574,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5649,6 +5685,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9832,6 +9872,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9939,6 +9983,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10481,6 +10529,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10588,6 +10640,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12396,6 +12452,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12486,6 +12546,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12704,6 +12768,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12795,6 +12863,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13019,6 +13091,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13126,6 +13202,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 8960667..8199898 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -1155,6 +1155,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1262,6 +1266,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1804,6 +1812,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1911,6 +1923,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3719,6 +3735,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -3809,6 +3829,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4027,6 +4051,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4118,6 +4146,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4342,6 +4374,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4449,6 +4485,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index 9d86ed1..79bd2fa 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -1754,6 +1754,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -1861,6 +1865,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2403,6 +2411,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2510,6 +2522,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4318,6 +4334,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4408,6 +4428,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4626,6 +4650,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4717,6 +4745,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4941,6 +4973,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5048,6 +5084,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9231,6 +9271,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9338,6 +9382,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9880,6 +9928,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -9987,6 +10039,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -11795,6 +11851,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -11885,6 +11945,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12103,6 +12167,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12194,6 +12262,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12418,6 +12490,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12525,6 +12601,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/output_schemas/type_v3.schema.json b/common/src/schemas/output_schemas/type_v3.schema.json index 566eda5..601bb0a 100644 --- a/common/src/schemas/output_schemas/type_v3.schema.json +++ b/common/src/schemas/output_schemas/type_v3.schema.json @@ -45,6 +45,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -152,6 +156,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 6cfab64..e7002df 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -2338,6 +2338,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2445,6 +2449,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -2987,6 +2995,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -3094,6 +3106,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -4902,6 +4918,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -4992,6 +5012,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5210,6 +5234,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5301,6 +5329,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -5525,6 +5557,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -5632,6 +5668,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -8465,6 +8505,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -8555,6 +8599,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -10246,6 +10294,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10353,6 +10405,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -10895,6 +10951,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -11002,6 +11062,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -12810,6 +12874,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -12900,6 +12968,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13118,6 +13190,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13209,6 +13285,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -13433,6 +13513,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -13540,6 +13624,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -17865,6 +17953,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -17972,6 +18064,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18514,6 +18610,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -18621,6 +18721,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -22647,6 +22751,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -22754,6 +22862,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -23296,6 +23408,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -23403,6 +23519,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -25211,6 +25331,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -25301,6 +25425,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -25519,6 +25647,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -25610,6 +25742,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -25834,6 +25970,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -25941,6 +26081,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -28774,6 +28918,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -28864,6 +29012,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -30555,6 +30707,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -30662,6 +30818,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -31204,6 +31364,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -31311,6 +31475,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -33119,6 +33287,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -33209,6 +33381,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -33427,6 +33603,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -33518,6 +33698,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -33742,6 +33926,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -33849,6 +34037,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -39232,6 +39424,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -39339,6 +39535,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -39881,6 +40081,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -39988,6 +40192,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -41796,6 +42004,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -41886,6 +42098,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -42104,6 +42320,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -42195,6 +42415,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -42419,6 +42643,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -42526,6 +42754,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -46709,6 +46941,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -46816,6 +47052,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -47358,6 +47598,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -47465,6 +47709,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -49273,6 +49521,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -49363,6 +49615,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -49581,6 +49837,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -49672,6 +49932,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -49896,6 +50160,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -50003,6 +50271,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -55896,6 +56168,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -56003,6 +56279,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -56545,6 +56825,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -56652,6 +56936,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -58460,6 +58748,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -58550,6 +58842,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -58768,6 +59064,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -58859,6 +59159,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -59083,6 +59387,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -59190,6 +59498,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -63373,6 +63685,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -63480,6 +63796,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -64022,6 +64342,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -64129,6 +64453,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -65937,6 +66265,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -66027,6 +66359,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -66245,6 +66581,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -66336,6 +66676,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -66560,6 +66904,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -66667,6 +67015,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -70176,6 +70528,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -70267,6 +70623,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -70397,6 +70757,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -70487,6 +70851,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -73792,6 +74160,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -73899,6 +74271,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -74441,6 +74817,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -74548,6 +74928,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -76356,6 +76740,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -76446,6 +76834,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -76664,6 +77056,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -76755,6 +77151,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -76979,6 +77379,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -77086,6 +77490,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -81269,6 +81677,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -81376,6 +81788,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -81918,6 +82334,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -82025,6 +82445,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -83833,6 +84257,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -83923,6 +84351,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -84141,6 +84573,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -84232,6 +84668,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -84456,6 +84896,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -84563,6 +85007,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -89026,6 +89474,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -89133,6 +89585,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -89675,6 +90131,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -89782,6 +90242,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -91590,6 +92054,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -91680,6 +92148,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -91898,6 +92370,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -91989,6 +92465,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -92213,6 +92693,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -92320,6 +92804,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -96858,6 +97346,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -96965,6 +97457,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -97507,6 +98003,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -97614,6 +98114,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -99422,6 +99926,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -99512,6 +100020,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -99730,6 +100242,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -99821,6 +100337,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -100045,6 +100565,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -100152,6 +100676,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -104335,6 +104863,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -104442,6 +104974,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -104984,6 +105520,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -105091,6 +105631,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -106899,6 +107443,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -106989,6 +107537,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -107207,6 +107759,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -107298,6 +107854,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", @@ -107522,6 +108082,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -107629,6 +108193,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -110816,6 +111384,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", @@ -110923,6 +111495,10 @@ } ] }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", diff --git a/common/src/schemas/src_schemas/runCode_v3.schema.json b/common/src/schemas/src_schemas/runCode_v3.schema.json index 163f153..8447b51 100644 --- a/common/src/schemas/src_schemas/runCode_v3.schema.json +++ b/common/src/schemas/src_schemas/runCode_v3.schema.json @@ -29,6 +29,10 @@ "description": "Code to run.", "type": "string" }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/src/schemas/src_schemas/runShell_v3.schema.json b/common/src/schemas/src_schemas/runShell_v3.schema.json index 1d490ca..405f98a 100644 --- a/common/src/schemas/src_schemas/runShell_v3.schema.json +++ b/common/src/schemas/src_schemas/runShell_v3.schema.json @@ -31,6 +31,10 @@ "type": "string", "description": "Command to perform in the machine's default shell." }, + "scope": { + "type": "string", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + }, "args": { "type": "array", "description": "Arguments for the command.", diff --git a/common/src/schemas/src_schemas/type_v3.schema.json b/common/src/schemas/src_schemas/type_v3.schema.json index 5d36f4b..4a5cc0f 100644 --- a/common/src/schemas/src_schemas/type_v3.schema.json +++ b/common/src/schemas/src_schemas/type_v3.schema.json @@ -38,6 +38,10 @@ "keys": { "$ref": "#/components/schemas/keys" }, + "scope": { + "type": "string", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + }, "inputDelay": { "type": "number", "description": "Delay in milliseconds between each key press during a recording", From 08d22e47bfbabd917664adac9da296c58dda4a50 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 17:59:37 +0000 Subject: [PATCH 02/13] Initial plan From 90c0f28dc568f94c060147e0384f2211d1a1b466 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:04:53 +0000 Subject: [PATCH 03/13] Add scope infrastructure: registry, terminal, waitUntil, and cleanup modules Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- core/package-lock.json | 17 ++++ core/package.json | 1 + core/src/scopes/cleanup.js | 141 ++++++++++++++++++++++++++ core/src/scopes/code.js | 47 +++++++++ core/src/scopes/index.js | 17 ++++ core/src/scopes/registry.js | 150 +++++++++++++++++++++++++++ core/src/scopes/terminal.js | 190 +++++++++++++++++++++++++++++++++++ core/src/scopes/waitUntil.js | 169 +++++++++++++++++++++++++++++++ 8 files changed, 732 insertions(+) create mode 100644 core/src/scopes/cleanup.js create mode 100644 core/src/scopes/code.js create mode 100644 core/src/scopes/index.js create mode 100644 core/src/scopes/registry.js create mode 100644 core/src/scopes/terminal.js create mode 100644 core/src/scopes/waitUntil.js diff --git a/core/package-lock.json b/core/package-lock.json index c71e9d8..52d5c76 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -25,6 +25,7 @@ "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", + "node-pty": "^0.10.1", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", "posthog-node": "^5.15.0", @@ -20447,6 +20448,12 @@ "node": "*" } }, + "node_modules/nan": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.24.0.tgz", + "integrity": "sha512-Vpf9qnVW1RaDkoNKFUvfxqAbtI8ncb8OJlqZ9wwpXzWPEsvsB1nvdUi6oYrHIkQ1Y/tMDnr1h4nczS0VB9Xykg==", + "license": "MIT" + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -20493,6 +20500,16 @@ "node": ">= 0.4.0" } }, + "node_modules/node-pty": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", + "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.14.0" + } + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", diff --git a/core/package.json b/core/package.json index d1d0c53..6a04c81 100644 --- a/core/package.json +++ b/core/package.json @@ -42,6 +42,7 @@ "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", + "node-pty": "^0.10.1", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", "posthog-node": "^5.15.0", diff --git a/core/src/scopes/cleanup.js b/core/src/scopes/cleanup.js new file mode 100644 index 0000000..4ea60d1 --- /dev/null +++ b/core/src/scopes/cleanup.js @@ -0,0 +1,141 @@ +const { log } = require("../utils"); +const { getAllScopes, getScopesByTestId, removeScope } = require("./registry"); +const { terminateTerminalScope } = require("./terminal"); + +exports.cleanupTestScopes = cleanupTestScopes; +exports.cleanupAllScopes = cleanupAllScopes; +exports.setupCleanupHandlers = setupCleanupHandlers; + +let cleanupHandlersInstalled = false; + +/** + * Cleans up all scopes associated with a specific test. + * Terminates in LIFO order (reverse creation order). + * + * @param {string} testId - The test identifier + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function cleanupTestScopes(testId, config) { + const testScopes = getScopesByTestId(testId); + + if (testScopes.length === 0) { + log(config, "debug", `No scopes to clean up for test: ${testId}`); + return; + } + + log(config, "info", `Cleaning up ${testScopes.length} scope(s) for test: ${testId}`); + + // Sort by creation time (descending) for LIFO order + testScopes.sort((a, b) => b.scope.createdAt - a.scope.createdAt); + + for (const { name, scope } of testScopes) { + try { + if (scope.type === 'terminal') { + await terminateTerminalScope(name, config); + } + // Add other scope types here in the future + + // Remove from registry + removeScope(name, config); + } catch (error) { + // Log but don't fail - cleanup errors shouldn't affect test results + log(config, "warn", `Error cleaning up scope '${name}': ${error.message}`); + } + } +} + +/** + * Cleans up all scopes in the registry. + * Used for process-level cleanup. + * + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function cleanupAllScopes(config = { logLevel: 'info' }) { + const allScopes = getAllScopes(); + + if (allScopes.size === 0) { + return; + } + + log(config, "info", `Cleaning up ${allScopes.size} scope(s)`); + + // Convert to array and sort by creation time (descending) for LIFO + const scopeEntries = Array.from(allScopes.entries()) + .map(([name, scope]) => ({ name, scope })) + .sort((a, b) => b.scope.createdAt - a.scope.createdAt); + + for (const { name, scope } of scopeEntries) { + try { + if (scope.type === 'terminal') { + await terminateTerminalScope(name, config); + } + // Add other scope types here in the future + + removeScope(name, config); + } catch (error) { + // Best-effort cleanup, don't fail + log(config, "debug", `Error cleaning up scope '${name}': ${error.message}`); + } + } +} + +/** + * Sets up process-level cleanup handlers. + * Handles SIGINT, SIGTERM, uncaughtException, unhandledRejection, and normal exit. + * + * @param {object} config - Config for logging + */ +function setupCleanupHandlers(config = { logLevel: 'info' }) { + // Only install handlers once + if (cleanupHandlersInstalled) { + return; + } + + cleanupHandlersInstalled = true; + + // Handler function + const handleExit = async (signal) => { + log(config, "debug", `Received ${signal}, cleaning up scopes...`); + await cleanupAllScopes(config); + }; + + // SIGINT (Ctrl+C) + process.on('SIGINT', async () => { + await handleExit('SIGINT'); + process.exit(130); // 128 + SIGINT signal number + }); + + // SIGTERM + process.on('SIGTERM', async () => { + await handleExit('SIGTERM'); + process.exit(143); // 128 + SIGTERM signal number + }); + + // Uncaught exceptions + process.on('uncaughtException', async (error) => { + log(config, "error", `Uncaught exception: ${error.message}`); + await handleExit('uncaughtException'); + process.exit(1); + }); + + // Unhandled promise rejections + process.on('unhandledRejection', async (reason, promise) => { + log(config, "error", `Unhandled rejection: ${reason}`); + await handleExit('unhandledRejection'); + process.exit(1); + }); + + // Normal exit + process.on('exit', () => { + // Note: This is synchronous, so we can't await cleanupAllScopes + // The other handlers should have already done the cleanup + const allScopes = getAllScopes(); + if (allScopes.size > 0) { + console.log(`Warning: ${allScopes.size} scope(s) still in registry at exit`); + } + }); + + log(config, "debug", "Cleanup handlers installed"); +} diff --git a/core/src/scopes/code.js b/core/src/scopes/code.js new file mode 100644 index 0000000..c7f4f8a --- /dev/null +++ b/core/src/scopes/code.js @@ -0,0 +1,47 @@ +const { log } = require("../utils"); + +// Placeholder for future code scope implementation +// Code scopes will support JavaScript REPL, Python REPL, etc. + +exports.createCodeScope = createCodeScope; +exports.terminateCodeScope = terminateCodeScope; +exports.writeToCode = writeToCode; + +/** + * Creates a new code scope (REPL). + * Currently not implemented - placeholder for future functionality. + * + * @param {string} name - The scope name + * @param {string} language - The language (javascript, python, etc.) + * @param {object} options - Code scope options + * @param {object} config - Config for logging + * @returns {Promise} The scope object + */ +async function createCodeScope(name, language, options = {}, config) { + throw new Error('Code scopes are not yet implemented. Use terminal scopes instead.'); +} + +/** + * Terminates a code scope. + * Currently not implemented - placeholder for future functionality. + * + * @param {string} name - The scope name + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function terminateCodeScope(name, config) { + throw new Error('Code scopes are not yet implemented.'); +} + +/** + * Writes code to a code scope. + * Currently not implemented - placeholder for future functionality. + * + * @param {string} name - The scope name + * @param {string} code - The code to execute + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function writeToCode(name, code, config) { + throw new Error('Code scopes are not yet implemented.'); +} diff --git a/core/src/scopes/index.js b/core/src/scopes/index.js new file mode 100644 index 0000000..e54925f --- /dev/null +++ b/core/src/scopes/index.js @@ -0,0 +1,17 @@ +// Scope management exports +module.exports = { + // Registry + ...require('./registry'), + + // Terminal scopes + ...require('./terminal'), + + // Code scopes (future) + ...require('./code'), + + // WaitUntil utilities + ...require('./waitUntil'), + + // Cleanup + ...require('./cleanup') +}; diff --git a/core/src/scopes/registry.js b/core/src/scopes/registry.js new file mode 100644 index 0000000..edeb1e2 --- /dev/null +++ b/core/src/scopes/registry.js @@ -0,0 +1,150 @@ +const { log } = require("../utils"); + +// Global scope registry +const scopes = new Map(); + +// Max buffer size (number of lines) +const MAX_BUFFER_SIZE = 1000; + +exports.registerScope = registerScope; +exports.getScope = getScope; +exports.hasScope = hasScope; +exports.removeScope = removeScope; +exports.getAllScopes = getAllScopes; +exports.getScopesByTestId = getScopesByTestId; +exports.validateScopeName = validateScopeName; + +/** + * Validates a scope name against the required pattern. + * + * @param {string} name - The scope name to validate + * @returns {object} {valid: boolean, error: string} + */ +function validateScopeName(name) { + if (!name || typeof name !== 'string') { + return { valid: false, error: 'Scope name must be a non-empty string' }; + } + + const pattern = /^[a-zA-Z0-9_-]{1,64}$/; + if (!pattern.test(name)) { + return { + valid: false, + error: 'Scope name must be 1-64 characters and contain only letters, numbers, hyphens, and underscores' + }; + } + + return { valid: true }; +} + +/** + * Registers a new scope in the global registry. + * + * @param {string} name - The scope name + * @param {object} scopeData - The scope data + * @param {string} scopeData.type - Type: 'terminal' or 'code' + * @param {object} scopeData.process - The process handle + * @param {object} scopeData.pty - PTY instance (terminal only) + * @param {object} scopeData.stdin - Writable stream + * @param {object} scopeData.stdout - Readable stream + * @param {object} scopeData.stderr - Readable stream + * @param {string} scopeData.workingDir - Working directory + * @param {string} scopeData.testId - Test identifier + * @param {object} config - Config for logging + */ +function registerScope(name, scopeData, config) { + const validation = validateScopeName(name); + if (!validation.valid) { + throw new Error(validation.error); + } + + // Initialize buffers + scopeData.stdoutBuffer = []; + scopeData.stderrBuffer = []; + scopeData.createdAt = Date.now(); + + // Set up buffer management for stdout + if (scopeData.stdout) { + scopeData.stdout.on('data', (data) => { + const lines = data.toString().split('\n'); + scopeData.stdoutBuffer.push(...lines); + + // Trim buffer if needed + if (scopeData.stdoutBuffer.length > MAX_BUFFER_SIZE) { + scopeData.stdoutBuffer = scopeData.stdoutBuffer.slice(-MAX_BUFFER_SIZE); + } + }); + } + + // Set up buffer management for stderr + if (scopeData.stderr) { + scopeData.stderr.on('data', (data) => { + const lines = data.toString().split('\n'); + scopeData.stderrBuffer.push(...lines); + + // Trim buffer if needed + if (scopeData.stderrBuffer.length > MAX_BUFFER_SIZE) { + scopeData.stderrBuffer = scopeData.stderrBuffer.slice(-MAX_BUFFER_SIZE); + } + }); + } + + scopes.set(name, scopeData); + log(config, "debug", `Registered ${scopeData.type} scope: ${name}`); +} + +/** + * Gets a scope from the registry. + * + * @param {string} name - The scope name + * @returns {object|undefined} The scope data or undefined + */ +function getScope(name) { + return scopes.get(name); +} + +/** + * Checks if a scope exists in the registry. + * + * @param {string} name - The scope name + * @returns {boolean} True if scope exists + */ +function hasScope(name) { + return scopes.has(name); +} + +/** + * Removes a scope from the registry. + * + * @param {string} name - The scope name + * @param {object} config - Config for logging + */ +function removeScope(name, config) { + if (scopes.delete(name)) { + log(config, "debug", `Removed scope from registry: ${name}`); + } +} + +/** + * Gets all scopes in the registry. + * + * @returns {Map} The scopes map + */ +function getAllScopes() { + return scopes; +} + +/** + * Gets all scopes associated with a specific test ID. + * + * @param {string} testId - The test identifier + * @returns {Array<{name: string, scope: object}>} Array of scope entries + */ +function getScopesByTestId(testId) { + const result = []; + for (const [name, scope] of scopes.entries()) { + if (scope.testId === testId) { + result.push({ name, scope }); + } + } + return result; +} diff --git a/core/src/scopes/terminal.js b/core/src/scopes/terminal.js new file mode 100644 index 0000000..36e1e1c --- /dev/null +++ b/core/src/scopes/terminal.js @@ -0,0 +1,190 @@ +const pty = require("node-pty"); +const os = require("os"); +const { log } = require("../utils"); +const { registerScope, getScope } = require("./registry"); + +exports.createTerminalScope = createTerminalScope; +exports.terminateTerminalScope = terminateTerminalScope; +exports.writeToTerminal = writeToTerminal; + +/** + * Creates a new terminal scope using node-pty. + * + * @param {string} name - The scope name + * @param {string} command - The command to run + * @param {object} options - Terminal options + * @param {string} options.workingDirectory - Working directory (default: '.') + * @param {string} options.testId - Test identifier + * @param {object} config - Config for logging + * @returns {Promise} The scope object + */ +async function createTerminalScope(name, command, options = {}, config) { + const workingDir = options.workingDirectory || process.cwd(); + const testId = options.testId || 'unknown'; + + log(config, "debug", `Creating terminal scope '${name}' with command: ${command}`); + + // Determine shell based on platform + let shell; + let shellArgs; + + if (os.platform() === 'win32') { + // Windows - use cmd.exe or PowerShell + shell = process.env.COMSPEC || 'cmd.exe'; + shellArgs = ['/c', command]; + } else { + // Unix-like - use bash or sh + shell = process.env.SHELL || '/bin/bash'; + shellArgs = ['-c', command]; + } + + try { + // Spawn PTY process + const ptyProcess = pty.spawn(shell, shellArgs, { + name: 'xterm-color', + cols: 80, + rows: 24, + cwd: workingDir, + env: process.env + }); + + log(config, "debug", `PTY process spawned for scope '${name}' with PID: ${ptyProcess.pid}`); + + // Create scope data + const scopeData = { + type: 'terminal', + process: ptyProcess, + pty: ptyProcess, + stdin: ptyProcess, + stdout: ptyProcess, + stderr: null, // PTY combines stdout/stderr + workingDir: workingDir, + testId: testId, + command: command + }; + + // Register the scope + registerScope(name, scopeData, config); + + // Handle process exit + ptyProcess.onExit(({ exitCode, signal }) => { + log(config, "debug", `Terminal scope '${name}' exited with code ${exitCode}, signal ${signal}`); + }); + + return scopeData; + } catch (error) { + log(config, "error", `Failed to create terminal scope '${name}': ${error.message}`); + throw new Error(`Failed to spawn terminal process: ${error.message}`); + } +} + +/** + * Terminates a terminal scope. + * Sends SIGTERM, waits 5 seconds, then sends SIGKILL if needed. + * + * @param {string} name - The scope name + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function terminateTerminalScope(name, config) { + const scope = getScope(name); + + if (!scope) { + log(config, "warn", `Cannot terminate scope '${name}': scope not found`); + return; + } + + if (scope.type !== 'terminal') { + throw new Error(`Scope '${name}' is not a terminal scope`); + } + + log(config, "info", `Terminating terminal scope: ${name}`); + + try { + const ptyProcess = scope.pty; + + if (!ptyProcess || !ptyProcess.pid) { + log(config, "debug", `Process for scope '${name}' already terminated`); + return; + } + + // Check if process is still running + try { + process.kill(ptyProcess.pid, 0); // Signal 0 checks if process exists + } catch (error) { + log(config, "debug", `Process ${ptyProcess.pid} already terminated`); + return; + } + + // Send SIGTERM + log(config, "debug", `Sending SIGTERM to process ${ptyProcess.pid}`); + ptyProcess.kill('SIGTERM'); + + // Wait up to 5 seconds for graceful shutdown + const startTime = Date.now(); + const timeout = 5000; + + while (Date.now() - startTime < timeout) { + try { + process.kill(ptyProcess.pid, 0); + // Still running, wait a bit + await new Promise(resolve => setTimeout(resolve, 100)); + } catch (error) { + // Process is gone + log(config, "debug", `Process ${ptyProcess.pid} terminated gracefully`); + return; + } + } + + // Still running after timeout, send SIGKILL + log(config, "debug", `Process ${ptyProcess.pid} did not terminate, sending SIGKILL`); + try { + ptyProcess.kill('SIGKILL'); + } catch (error) { + log(config, "debug", `Error sending SIGKILL: ${error.message}`); + } + + } catch (error) { + log(config, "warn", `Error terminating terminal scope '${name}': ${error.message}`); + } +} + +/** + * Writes text to a terminal scope's stdin. + * Handles escape sequences like \n, \t, \r, \\, \xHH. + * + * @param {string} name - The scope name + * @param {string} text - The text to write + * @param {object} config - Config for logging + * @returns {Promise} + */ +async function writeToTerminal(name, text, config) { + const scope = getScope(name); + + if (!scope) { + throw new Error(`Scope '${name}' not found`); + } + + if (scope.type !== 'terminal') { + throw new Error(`Scope '${name}' is not a terminal scope`); + } + + // Process escape sequences + let processedText = text; + + // Replace escape sequences + processedText = processedText + .replace(/\\n/g, '\n') + .replace(/\\t/g, '\t') + .replace(/\\r/g, '\r') + .replace(/\\x([0-9A-Fa-f]{2})/g, (match, hex) => String.fromCharCode(parseInt(hex, 16))) + .replace(/\\\\/g, '\\'); // Must be last to avoid double-escaping + + log(config, "debug", `Writing to terminal scope '${name}': ${JSON.stringify(processedText)}`); + + try { + scope.pty.write(processedText); + } catch (error) { + throw new Error(`Failed to write to terminal scope '${name}': ${error.message}`); + } +} diff --git a/core/src/scopes/waitUntil.js b/core/src/scopes/waitUntil.js new file mode 100644 index 0000000..7a9d7fb --- /dev/null +++ b/core/src/scopes/waitUntil.js @@ -0,0 +1,169 @@ +const { log } = require("../utils"); + +exports.isRegexPattern = isRegexPattern; +exports.parseRegex = parseRegex; +exports.matchesCondition = matchesCondition; +exports.waitForConditions = waitForConditions; + +/** + * Checks if a pattern string represents a regex pattern. + * Regex patterns must start and end with '/'. + * + * @param {string} pattern - The pattern to check + * @returns {boolean} True if pattern is a regex + */ +function isRegexPattern(pattern) { + return typeof pattern === 'string' && pattern.startsWith('/') && pattern.includes('/') && pattern.lastIndexOf('/') > 0; +} + +/** + * Parses a regex pattern string into a RegExp object. + * Format: /pattern/flags + * + * @param {string} pattern - The regex pattern string + * @returns {RegExp} The compiled regex + * @throws {Error} If pattern is invalid + */ +function parseRegex(pattern) { + const lastSlashIndex = pattern.lastIndexOf('/'); + if (lastSlashIndex <= 0) { + throw new Error(`Invalid regex pattern: ${pattern}`); + } + + const regexBody = pattern.substring(1, lastSlashIndex); + const flags = pattern.substring(lastSlashIndex + 1); + + try { + return new RegExp(regexBody, flags); + } catch (error) { + throw new Error(`Invalid regex pattern: ${pattern} - ${error.message}`); + } +} + +/** + * Tests if output matches a condition (string or regex). + * + * @param {string} output - The output to test + * @param {string} condition - The condition (string or regex pattern) + * @returns {boolean} True if condition matches or is empty + */ +function matchesCondition(output, condition) { + // Empty or undefined conditions always match + if (!condition || condition === '') return true; + + if (isRegexPattern(condition)) { + const regex = parseRegex(condition); + return regex.test(output); + } + + // Case-sensitive substring match + return output.includes(condition); +} + +/** + * Waits for stdout/stderr conditions to be met by listening to streams. + * + * @param {object} options - Wait options + * @param {object} options.scope - The scope object with streams + * @param {object} options.conditions - Conditions to wait for + * @param {string} options.conditions.stdout - Stdout condition (optional) + * @param {string} options.conditions.stderr - Stderr condition (optional) + * @param {number} options.timeout - Timeout in milliseconds (default 30000) + * @param {object} options.config - Config for logging + * @returns {Promise} Resolves with {met: true} or rejects with timeout error + */ +async function waitForConditions({ scope, conditions, timeout = 30000, config }) { + // If no conditions specified, resolve immediately + if (!conditions || (!conditions.stdout && !conditions.stderr)) { + return { met: true }; + } + + return new Promise((resolve, reject) => { + let stdoutMet = !conditions.stdout || conditions.stdout === ''; + let stderrMet = !conditions.stderr || conditions.stderr === ''; + let timeoutId; + + // Check if already met from buffer + if (!stdoutMet && scope.stdoutBuffer) { + const stdoutContent = scope.stdoutBuffer.join('\n'); + if (matchesCondition(stdoutContent, conditions.stdout)) { + stdoutMet = true; + log(config, "debug", `Stdout condition already met in buffer: ${conditions.stdout}`); + } + } + + if (!stderrMet && scope.stderrBuffer) { + const stderrContent = scope.stderrBuffer.join('\n'); + if (matchesCondition(stderrContent, conditions.stderr)) { + stderrMet = true; + log(config, "debug", `Stderr condition already met in buffer: ${conditions.stderr}`); + } + } + + // Check if all conditions already met + if (stdoutMet && stderrMet) { + log(config, "info", "All waitUntil conditions already met"); + return resolve({ met: true }); + } + + // Set timeout + timeoutId = setTimeout(() => { + cleanup(); + const unmetConditions = []; + if (!stdoutMet && conditions.stdout) unmetConditions.push(`stdout: "${conditions.stdout}"`); + if (!stderrMet && conditions.stderr) unmetConditions.push(`stderr: "${conditions.stderr}"`); + reject(new Error(`Timeout waiting for conditions: ${unmetConditions.join(', ')}`)); + }, timeout); + + // Listen to stdout + const stdoutListener = (data) => { + const chunk = data.toString(); + log(config, "debug", `Stdout chunk: ${chunk.substring(0, 100)}...`); + + if (!stdoutMet && conditions.stdout) { + if (matchesCondition(chunk, conditions.stdout)) { + stdoutMet = true; + log(config, "info", `Stdout condition met: ${conditions.stdout}`); + + if (stderrMet) { + cleanup(); + resolve({ met: true }); + } + } + } + }; + + // Listen to stderr + const stderrListener = (data) => { + const chunk = data.toString(); + log(config, "debug", `Stderr chunk: ${chunk.substring(0, 100)}...`); + + if (!stderrMet && conditions.stderr) { + if (matchesCondition(chunk, conditions.stderr)) { + stderrMet = true; + log(config, "info", `Stderr condition met: ${conditions.stderr}`); + + if (stdoutMet) { + cleanup(); + resolve({ met: true }); + } + } + } + }; + + // Attach listeners + if (scope.stdout && !stdoutMet) { + scope.stdout.on('data', stdoutListener); + } + if (scope.stderr && !stderrMet) { + scope.stderr.on('data', stderrListener); + } + + // Cleanup function + const cleanup = () => { + clearTimeout(timeoutId); + if (scope.stdout) scope.stdout.removeListener('data', stdoutListener); + if (scope.stderr) scope.stderr.removeListener('data', stderrListener); + }; + }); +} From a1b4a17436018fa9470b7363073577652809aa3a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:07:44 +0000 Subject: [PATCH 04/13] Update schemas: add waitUntil to runShell/runCode, add terminateScope action Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- common/dist/schemas/find_v3.schema.json | 20 ++- common/dist/schemas/runCode_v3.schema.json | 46 +++++- common/dist/schemas/runShell_v3.schema.json | 64 +++++++- common/dist/schemas/type_v3.schema.json | 10 +- common/package-lock.json | 1 - .../output_schemas/find_v3.schema.json | 20 ++- .../output_schemas/runCode_v3.schema.json | 46 +++++- .../output_schemas/runShell_v3.schema.json | 64 +++++++- .../output_schemas/type_v3.schema.json | 10 +- common/src/schemas/schemas.json | 140 ++++++++++++++++-- .../src_schemas/runCode_v3.schema.json | 23 ++- .../src_schemas/runShell_v3.schema.json | 41 ++++- .../schemas/src_schemas/step_v3.schema.json | 23 +++ .../src_schemas/terminateScope_v3.schema.json | 12 ++ .../schemas/src_schemas/type_v3.schema.json | 7 +- 15 files changed, 493 insertions(+), 34 deletions(-) create mode 100644 common/src/schemas/src_schemas/terminateScope_v3.schema.json diff --git a/common/dist/schemas/find_v3.schema.json b/common/dist/schemas/find_v3.schema.json index 5f4d1c8..fa7677a 100644 --- a/common/dist/schemas/find_v3.schema.json +++ b/common/dist/schemas/find_v3.schema.json @@ -435,7 +435,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -546,7 +547,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -635,6 +637,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -1092,7 +1098,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1203,7 +1210,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1292,6 +1300,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, diff --git a/common/dist/schemas/runCode_v3.schema.json b/common/dist/schemas/runCode_v3.schema.json index 8022de4..7fe6d2b 100644 --- a/common/dist/schemas/runCode_v3.schema.json +++ b/common/dist/schemas/runCode_v3.schema.json @@ -25,7 +25,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -120,7 +141,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", diff --git a/common/dist/schemas/runShell_v3.schema.json b/common/dist/schemas/runShell_v3.schema.json index 3440de2..f0e579b 100644 --- a/common/dist/schemas/runShell_v3.schema.json +++ b/common/dist/schemas/runShell_v3.schema.json @@ -24,7 +24,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -118,7 +139,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -239,6 +281,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } \ No newline at end of file diff --git a/common/dist/schemas/type_v3.schema.json b/common/dist/schemas/type_v3.schema.json index 601bb0a..9f27945 100644 --- a/common/dist/schemas/type_v3.schema.json +++ b/common/dist/schemas/type_v3.schema.json @@ -47,7 +47,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -158,7 +159,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -247,6 +249,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } \ No newline at end of file diff --git a/common/package-lock.json b/common/package-lock.json index a3f9052..633aa5a 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -202,7 +202,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/common/src/schemas/output_schemas/find_v3.schema.json b/common/src/schemas/output_schemas/find_v3.schema.json index 5f4d1c8..fa7677a 100644 --- a/common/src/schemas/output_schemas/find_v3.schema.json +++ b/common/src/schemas/output_schemas/find_v3.schema.json @@ -435,7 +435,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -546,7 +547,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -635,6 +637,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -1092,7 +1098,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1203,7 +1210,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1292,6 +1300,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, diff --git a/common/src/schemas/output_schemas/runCode_v3.schema.json b/common/src/schemas/output_schemas/runCode_v3.schema.json index 8022de4..7fe6d2b 100644 --- a/common/src/schemas/output_schemas/runCode_v3.schema.json +++ b/common/src/schemas/output_schemas/runCode_v3.schema.json @@ -25,7 +25,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -120,7 +141,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", diff --git a/common/src/schemas/output_schemas/runShell_v3.schema.json b/common/src/schemas/output_schemas/runShell_v3.schema.json index 3440de2..f0e579b 100644 --- a/common/src/schemas/output_schemas/runShell_v3.schema.json +++ b/common/src/schemas/output_schemas/runShell_v3.schema.json @@ -24,7 +24,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -118,7 +139,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -239,6 +281,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } \ No newline at end of file diff --git a/common/src/schemas/output_schemas/type_v3.schema.json b/common/src/schemas/output_schemas/type_v3.schema.json index 601bb0a..9f27945 100644 --- a/common/src/schemas/output_schemas/type_v3.schema.json +++ b/common/src/schemas/output_schemas/type_v3.schema.json @@ -47,7 +47,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -158,7 +159,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -247,6 +249,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } \ No newline at end of file diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index e7002df..884faf1 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -17955,7 +17955,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18066,7 +18067,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18155,6 +18157,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -18612,7 +18618,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18723,7 +18730,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18812,6 +18820,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -70530,7 +70542,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -70625,7 +70658,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -70759,7 +70813,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -70853,7 +70928,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -70974,6 +71070,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] }, @@ -111386,7 +111500,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -111497,7 +111612,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -111586,6 +111702,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, diff --git a/common/src/schemas/src_schemas/runCode_v3.schema.json b/common/src/schemas/src_schemas/runCode_v3.schema.json index 8447b51..4e7e8a6 100644 --- a/common/src/schemas/src_schemas/runCode_v3.schema.json +++ b/common/src/schemas/src_schemas/runCode_v3.schema.json @@ -31,7 +31,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", diff --git a/common/src/schemas/src_schemas/runShell_v3.schema.json b/common/src/schemas/src_schemas/runShell_v3.schema.json index 405f98a..d6b2e7a 100644 --- a/common/src/schemas/src_schemas/runShell_v3.schema.json +++ b/common/src/schemas/src_schemas/runShell_v3.schema.json @@ -33,7 +33,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -154,6 +175,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } \ No newline at end of file diff --git a/common/src/schemas/src_schemas/step_v3.schema.json b/common/src/schemas/src_schemas/step_v3.schema.json index b5f66a2..4662129 100644 --- a/common/src/schemas/src_schemas/step_v3.schema.json +++ b/common/src/schemas/src_schemas/step_v3.schema.json @@ -358,6 +358,23 @@ } } ] + }, + { + "allOf": [ + { + "$ref": "#/components/schemas/common" + }, + { + "title": "terminateScope", + "type": "object", + "required": ["terminateScope"], + "properties": { + "terminateScope": { + "$ref": "terminateScope_v3.schema.json#" + } + } + } + ] } ], "examples": [ @@ -627,6 +644,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/src_schemas/terminateScope_v3.schema.json b/common/src/schemas/src_schemas/terminateScope_v3.schema.json new file mode 100644 index 0000000..a4a8e82 --- /dev/null +++ b/common/src/schemas/src_schemas/terminateScope_v3.schema.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] +} diff --git a/common/src/schemas/src_schemas/type_v3.schema.json b/common/src/schemas/src_schemas/type_v3.schema.json index 4a5cc0f..c3535cd 100644 --- a/common/src/schemas/src_schemas/type_v3.schema.json +++ b/common/src/schemas/src_schemas/type_v3.schema.json @@ -40,7 +40,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -117,6 +118,10 @@ { "keys": ["kittens", "$ENTER$"], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } From fa2ce1a8d26c26502e8c681805eae1b3651de157 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:13:19 +0000 Subject: [PATCH 05/13] Implement actions: terminateScope, update runShell/runCode/typeKeys for scopes Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- core/src/tests.js | 23 +++++++- core/src/tests/runCode.js | 8 ++- core/src/tests/runShell.js | 95 +++++++++++++++++++++++++++++++- core/src/tests/terminateScope.js | 80 +++++++++++++++++++++++++++ core/src/tests/typeKeys.js | 38 +++++++++++++ 5 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 core/src/tests/terminateScope.js diff --git a/core/src/tests.js b/core/src/tests.js index 5787966..1afbbf7 100644 --- a/core/src/tests.js +++ b/core/src/tests.js @@ -20,6 +20,8 @@ const { httpRequest } = require("./tests/httpRequest"); const { clickElement } = require("./tests/click"); const { runCode } = require("./tests/runCode"); const { dragAndDropElement } = require("./tests/dragAndDrop"); +const { terminateScope } = require("./tests/terminateScope"); +const { setupCleanupHandlers, cleanupTestScopes } = require("./scopes/cleanup"); const path = require("path"); const { spawn } = require("child_process"); const { randomUUID } = require("crypto"); @@ -366,6 +368,9 @@ async function runViaApi({ resolvedTests, apiKey, config = {} }) { async function runSpecs({ resolvedTests }) { const config = resolvedTests.config; const specs = resolvedTests.specs; + + // Setup process-level cleanup handlers for scopes + setupCleanupHandlers(config); // Get runner details const runnerDetails = { @@ -648,6 +653,7 @@ async function runSpecs({ resolvedTests }) { metaValues: metaValues, options: { openApiDefinitions: context.openApi || [], + test: test, }, }); log( @@ -765,6 +771,14 @@ async function runSpecs({ resolvedTests }) { else testResult = "PASS"; testReport = { result: testResult, ...testReport }; + + // Cleanup scopes for this test + try { + await cleanupTestScopes(test.testId, config); + } catch (error) { + log(config, "warn", `Error cleaning up scopes for test ${test.testId}: ${error.message}`); + } + specReport.tests.push(testReport); report.summary.tests[testResult.toLowerCase()]++; } @@ -861,9 +875,9 @@ async function runStep({ }); config.recording = actionResult.recording; } else if (typeof step.runCode !== "undefined") { - actionResult = await runCode({ config: config, step: step }); + actionResult = await runCode({ config: config, step: step, test: options?.test }); } else if (typeof step.runShell !== "undefined") { - actionResult = await runShell({ config: config, step: step }); + actionResult = await runShell({ config: config, step: step, test: options?.test }); } else if (typeof step.screenshot !== "undefined") { actionResult = await saveScreenshot({ config: config, @@ -876,6 +890,11 @@ async function runStep({ step: step, driver: driver, }); + } else if (typeof step.terminateScope !== "undefined") { + actionResult = await terminateScope({ + config: config, + step: step, + }); } else if (typeof step.wait !== "undefined") { actionResult = await wait({ step: step, driver: driver }); } else { diff --git a/core/src/tests/runCode.js b/core/src/tests/runCode.js index 5a745db..63a70be 100644 --- a/core/src/tests/runCode.js +++ b/core/src/tests/runCode.js @@ -37,7 +37,7 @@ function createTempScript(code, language) { } // Run gather, compile, and run code. -async function runCode({ config, step }) { +async function runCode({ config, step, test }) { const result = { status: "PASS", description: "Executed code.", @@ -111,12 +111,16 @@ async function runCode({ config, step }) { ? "node" : "bash", args: [scriptPath, ...step.runCode.args], + scope: step.runCode.scope, // Pass through scope + waitUntil: step.runCode.waitUntil, // Pass through waitUntil + workingDirectory: step.runCode.workingDirectory, + timeout: step.runCode.timeout, }, }; delete shellStep.runCode; // Execute script using runShell - const shellResult = await runShell({ config: config, step: shellStep }); + const shellResult = await runShell({ config: config, step: shellStep, test: test }); // Copy results result.status = shellResult.status; diff --git a/core/src/tests/runShell.js b/core/src/tests/runShell.js index 8e1925e..5643839 100644 --- a/core/src/tests/runShell.js +++ b/core/src/tests/runShell.js @@ -6,11 +6,18 @@ const { } = require("../utils"); const fs = require("fs"); const path = require("path"); +const { + hasScope, + getScope, + validateScopeName, +} = require("../scopes/registry"); +const { createTerminalScope } = require("../scopes/terminal"); +const { waitForConditions } = require("../scopes/waitUntil"); exports.runShell = runShell; // Run a shell command. -async function runShell({ config, step }) { +async function runShell({ config, step, test }) { // Promisify and execute command const result = { status: "PASS", @@ -48,7 +55,91 @@ async function runShell({ config, step }) { timeout: step.runShell.timeout || 60000, }; - // Execute command + // Check for scope and waitUntil + const hasWaitUntil = step.runShell.waitUntil && + (step.runShell.waitUntil.stdio?.stdout || step.runShell.waitUntil.stdio?.stderr); + const scopeName = step.runShell.scope; + + // Validate scope name if provided + if (scopeName) { + const validation = validateScopeName(scopeName); + if (!validation.valid) { + result.status = "FAIL"; + result.description = validation.error; + return result; + } + } + + // Warning: waitUntil without scope will cleanup immediately + if (hasWaitUntil && !scopeName) { + log(config, "warn", "Using waitUntil without scope - the session will be cleaned up immediately after conditions are met. Consider using a scope for long-running processes."); + } + + // If using scope, create or reuse terminal scope + if (scopeName) { + try { + let scope; + + // Check if scope already exists + if (hasScope(scopeName)) { + scope = getScope(scopeName); + log(config, "debug", `Reusing existing scope: ${scopeName}`); + + // For existing scopes, we don't execute a new command, just return + result.description = `Reused existing scope: ${scopeName}`; + return result; + } + + // Create new terminal scope + const testId = test?.testId || 'unknown'; + scope = await createTerminalScope( + scopeName, + step.runShell.command, + { + workingDirectory: step.runShell.workingDirectory, + testId: testId, + }, + config + ); + + // If waitUntil is specified, wait for conditions + if (hasWaitUntil) { + try { + await waitForConditions({ + scope: scope, + conditions: step.runShell.waitUntil.stdio, + timeout: 30000, // 30 second timeout for waitUntil + config: config + }); + + result.description = `Created scope '${scopeName}' and conditions met. Process continues running.`; + + // Collect output from buffer for result + if (scope.stdoutBuffer) { + result.outputs.stdio.stdout = scope.stdoutBuffer.join('\n'); + } + if (scope.stderrBuffer) { + result.outputs.stdio.stderr = scope.stderrBuffer.join('\n'); + } + } catch (error) { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' created but waitUntil conditions not met: ${error.message}`; + return result; + } + } else { + result.description = `Created scope '${scopeName}'. Process continues running.`; + } + + return result; + + } catch (error) { + result.status = "FAIL"; + result.description = `Failed to create scope '${scopeName}': ${error.message}`; + return result; + } + } + + // Original behavior: execute command and wait for completion const timeout = step.runShell.timeout; const options = {}; if (step.runShell.workingDirectory) diff --git a/core/src/tests/terminateScope.js b/core/src/tests/terminateScope.js new file mode 100644 index 0000000..69025a0 --- /dev/null +++ b/core/src/tests/terminateScope.js @@ -0,0 +1,80 @@ +const { validate } = require("doc-detective-common"); +const { log } = require("../utils"); +const { + getScope, + hasScope, + removeScope +} = require("../scopes/registry"); +const { terminateTerminalScope } = require("../scopes/terminal"); + +exports.terminateScope = terminateScope; + +/** + * Terminates a named scope. + * Sends SIGTERM, waits 5 seconds, then sends SIGKILL if needed. + * + * @param {object} options - Options object + * @param {object} options.config - Configuration object + * @param {object} options.step - Step object containing terminateScope property + * @returns {Promise} Result object with status and description + */ +async function terminateScope({ config, step }) { + const result = { + status: "PASS", + description: "Terminated scope.", + }; + + // Validate step object + const isValidStep = validate({ schemaKey: "step_v3", object: step }); + if (!isValidStep.valid) { + result.status = "FAIL"; + result.description = `Invalid step definition: ${isValidStep.errors}`; + return result; + } + + // Accept coerced and defaulted values + step = isValidStep.object; + + // Get scope name (step.terminateScope is a string) + const scopeName = step.terminateScope; + + if (!scopeName || typeof scopeName !== 'string') { + result.status = "FAIL"; + result.description = "Scope name must be a non-empty string"; + return result; + } + + // Check if scope exists + if (!hasScope(scopeName)) { + log(config, "warn", `Cannot terminate scope '${scopeName}': scope not found`); + result.description = `Scope '${scopeName}' not found. Continuing without error.`; + return result; + } + + // Get scope to determine type + const scope = getScope(scopeName); + + try { + // Terminate based on scope type + if (scope.type === 'terminal') { + await terminateTerminalScope(scopeName, config); + } else if (scope.type === 'code') { + // Future: implement code scope termination + throw new Error('Code scopes are not yet implemented'); + } else { + throw new Error(`Unknown scope type: ${scope.type}`); + } + + // Remove from registry + removeScope(scopeName, config); + + log(config, "info", `Successfully terminated scope: ${scopeName}`); + result.description = `Terminated scope: ${scopeName}`; + + } catch (error) { + result.status = "FAIL"; + result.description = `Failed to terminate scope '${scopeName}': ${error.message}`; + } + + return result; +} diff --git a/core/src/tests/typeKeys.js b/core/src/tests/typeKeys.js index c9f011c..295573a 100644 --- a/core/src/tests/typeKeys.js +++ b/core/src/tests/typeKeys.js @@ -3,6 +3,8 @@ const { Key } = require("webdriverio"); const { findElementByCriteria, } = require("./findStrategies"); +const { hasScope, getScope } = require("../scopes/registry"); +const { writeToTerminal } = require("../scopes/terminal"); exports.typeKeys = typeKeys; @@ -106,6 +108,42 @@ async function typeKeys({ config, step, driver }) { return result; } + // If scope is specified, write to terminal scope instead of UI + if (step.type.scope) { + const scopeName = step.type.scope; + + // Check if scope exists + if (!hasScope(scopeName)) { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' not found`; + return result; + } + + // Get the scope + const scope = getScope(scopeName); + + if (scope.type !== 'terminal') { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' is not a terminal scope`; + return result; + } + + try { + // Join all keys into a single string + const text = step.type.keys.join(''); + + // Write to terminal + await writeToTerminal(scopeName, text, config); + + result.description = `Typed keys to scope '${scopeName}'`; + return result; + } catch (error) { + result.status = "FAIL"; + result.description = `Failed to type to scope '${scopeName}': ${error.message}`; + return result; + } + } + // Find element to type into if any criteria are specified let element = null; const hasElementCriteria = step.type.selector || step.type.elementText || From 4cea19b25180bd91aa38121dd5e4d9cc7e05a5a4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:18:43 +0000 Subject: [PATCH 06/13] Add terminateScope to schema build process and create test fixtures Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- common/dist/schemas/config_v3.schema.json | 522 ++- common/dist/schemas/report_v3.schema.json | 458 ++- .../dist/schemas/resolvedTests_v3.schema.json | 984 ++++- common/dist/schemas/spec_v3.schema.json | 458 ++- common/dist/schemas/step_v3.schema.json | 229 +- .../schemas/terminateScope_v3.schema.json | 12 + common/dist/schemas/test_v3.schema.json | 458 ++- common/src/schemas/dereferenceSchemas.js | 1 + .../output_schemas/config_v3.schema.json | 522 ++- .../output_schemas/report_v3.schema.json | 458 ++- .../resolvedTests_v3.schema.json | 984 ++++- .../output_schemas/spec_v3.schema.json | 458 ++- .../output_schemas/step_v3.schema.json | 229 +- .../terminateScope_v3.schema.json | 12 + .../output_schemas/test_v3.schema.json | 458 ++- common/src/schemas/schemas.json | 3195 ++++++++++++++++- .../test/artifacts/scopes-lifecycle.spec.json | 70 + core/test/artifacts/scopes-type.spec.json | 33 + 18 files changed, 9096 insertions(+), 445 deletions(-) create mode 100644 common/dist/schemas/terminateScope_v3.schema.json create mode 100644 common/src/schemas/output_schemas/terminateScope_v3.schema.json create mode 100644 core/test/artifacts/scopes-lifecycle.spec.json create mode 100644 core/test/artifacts/scopes-type.spec.json diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index df5084a..ad8dffb 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -1942,7 +1942,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2053,7 +2054,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2142,6 +2144,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2599,7 +2605,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2710,7 +2717,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2799,6 +2807,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4522,7 +4534,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4616,7 +4649,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4737,6 +4791,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4838,7 +4910,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4933,7 +5026,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5161,7 +5275,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5272,7 +5387,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5361,6 +5477,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7651,6 +7771,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8039,6 +8242,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -8109,7 +8318,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8203,7 +8433,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8324,6 +8575,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -9898,7 +10167,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10009,7 +10279,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10098,6 +10369,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10555,7 +10830,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10666,7 +10942,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10755,6 +11032,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12478,7 +12759,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12572,7 +12874,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12693,6 +13016,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12794,7 +13135,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12889,7 +13251,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13117,7 +13500,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13228,7 +13612,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13317,6 +13702,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15607,6 +15996,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15995,6 +16467,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 4e162e7..7344f3d 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -2375,7 +2375,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2486,7 +2487,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2575,6 +2577,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3032,7 +3038,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3143,7 +3150,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3232,6 +3240,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4955,7 +4967,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5049,7 +5082,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5170,6 +5224,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -5271,7 +5343,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5366,7 +5459,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5594,7 +5708,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5705,7 +5820,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5794,6 +5910,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -8084,6 +8204,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8472,6 +8675,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9892,7 +10101,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10003,7 +10213,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10092,6 +10303,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10549,7 +10764,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10660,7 +10876,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10749,6 +10966,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12472,7 +12693,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12566,7 +12808,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12687,6 +12950,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12788,7 +13069,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12883,7 +13185,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13111,7 +13434,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13222,7 +13546,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13311,6 +13636,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15601,6 +15930,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15989,6 +16401,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index b8bb6c8..26d28f9 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -1955,7 +1955,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2066,7 +2067,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2155,6 +2157,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2612,7 +2618,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2723,7 +2730,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2812,6 +2820,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4535,7 +4547,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4629,7 +4662,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4750,6 +4804,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4851,7 +4923,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4946,7 +5039,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5174,7 +5288,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5285,7 +5400,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5374,6 +5490,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7664,6 +7784,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8052,6 +8255,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -8122,7 +8331,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8216,7 +8446,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8337,6 +8588,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -9911,7 +10180,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10022,7 +10292,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10111,6 +10382,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10568,7 +10843,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10679,7 +10955,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10768,6 +11045,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12491,7 +12772,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12585,7 +12887,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12706,6 +13029,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12807,7 +13148,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12902,7 +13264,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13130,7 +13513,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13241,7 +13625,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13330,6 +13715,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15620,8 +16009,91 @@ } } ] - } - ], + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] + } + ], "examples": [ { "stepId": "uuid", @@ -16008,6 +16480,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -18628,7 +19106,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18739,7 +19218,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18828,6 +19308,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -19285,7 +19769,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -19396,7 +19881,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -19485,6 +19971,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -21208,7 +21698,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21302,7 +21813,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21423,6 +21955,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -21524,7 +22074,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21619,7 +22190,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21847,7 +22439,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -21958,7 +22551,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -22047,6 +22641,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -24337,6 +24935,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -24725,6 +25406,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -26145,7 +26832,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26256,7 +26944,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26345,6 +27034,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -26802,7 +27495,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26913,7 +27607,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -27002,6 +27697,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -28725,7 +29424,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -28819,7 +29539,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -28940,6 +29681,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -29041,7 +29800,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29136,7 +29916,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29364,7 +30165,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -29475,7 +30277,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -29564,6 +30367,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -31854,6 +32661,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -32242,6 +33132,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index e25ebca..4eaf82f 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -2357,7 +2357,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2468,7 +2469,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2557,6 +2559,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3014,7 +3020,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3125,7 +3132,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3214,6 +3222,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4937,7 +4949,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5031,7 +5064,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5152,6 +5206,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -5253,7 +5325,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5348,7 +5441,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5576,7 +5690,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5687,7 +5802,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5776,6 +5892,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -8066,6 +8186,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8454,6 +8657,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9874,7 +10083,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9985,7 +10195,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10074,6 +10285,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10531,7 +10746,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10642,7 +10858,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10731,6 +10948,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12454,7 +12675,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12548,7 +12790,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12669,6 +12932,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12770,7 +13051,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12865,7 +13167,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13093,7 +13416,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13204,7 +13528,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13293,6 +13618,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15583,6 +15912,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15971,6 +16383,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 8199898..00c7e20 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -1157,7 +1157,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1268,7 +1269,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1357,6 +1359,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -1814,7 +1820,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1925,7 +1932,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2014,6 +2022,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3737,7 +3749,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -3831,7 +3864,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -3952,6 +4006,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4053,7 +4125,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4148,7 +4241,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4376,7 +4490,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -4487,7 +4602,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -4576,6 +4692,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -6866,6 +6986,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -7254,6 +7457,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } \ No newline at end of file diff --git a/common/dist/schemas/terminateScope_v3.schema.json b/common/dist/schemas/terminateScope_v3.schema.json new file mode 100644 index 0000000..a98508d --- /dev/null +++ b/common/dist/schemas/terminateScope_v3.schema.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] +} \ No newline at end of file diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index 79bd2fa..9b13d92 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -1756,7 +1756,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1867,7 +1868,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1956,6 +1958,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2413,7 +2419,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2524,7 +2531,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2613,6 +2621,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4336,7 +4348,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4430,7 +4463,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4551,6 +4605,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4652,7 +4724,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4747,7 +4840,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4975,7 +5089,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5086,7 +5201,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5175,6 +5291,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7465,6 +7585,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -7853,6 +8056,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9273,7 +9482,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9384,7 +9594,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9473,6 +9684,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -9930,7 +10145,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10041,7 +10257,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10130,6 +10347,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -11853,7 +12074,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -11947,7 +12189,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12068,6 +12331,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12169,7 +12450,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12264,7 +12566,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12492,7 +12815,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -12603,7 +12927,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -12692,6 +13017,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -14982,6 +15311,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15370,6 +15782,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/dereferenceSchemas.js b/common/src/schemas/dereferenceSchemas.js index cd1d7c5..f8a15b9 100644 --- a/common/src/schemas/dereferenceSchemas.js +++ b/common/src/schemas/dereferenceSchemas.js @@ -48,6 +48,7 @@ async function dereferenceSchemas() { "step_v3.schema.json", "stopRecord_v3.schema.json", "test_v3.schema.json", + "terminateScope_v3.schema.json", "type_v3.schema.json", "wait_v3.schema.json", // v2 schemas diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index df5084a..ad8dffb 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -1942,7 +1942,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2053,7 +2054,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2142,6 +2144,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2599,7 +2605,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2710,7 +2717,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2799,6 +2807,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4522,7 +4534,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4616,7 +4649,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4737,6 +4791,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4838,7 +4910,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4933,7 +5026,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5161,7 +5275,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5272,7 +5387,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5361,6 +5477,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7651,6 +7771,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8039,6 +8242,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -8109,7 +8318,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8203,7 +8433,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8324,6 +8575,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -9898,7 +10167,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10009,7 +10279,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10098,6 +10369,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10555,7 +10830,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10666,7 +10942,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10755,6 +11032,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12478,7 +12759,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12572,7 +12874,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12693,6 +13016,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12794,7 +13135,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12889,7 +13251,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13117,7 +13500,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13228,7 +13612,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13317,6 +13702,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15607,6 +15996,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15995,6 +16467,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 4e162e7..7344f3d 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -2375,7 +2375,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2486,7 +2487,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2575,6 +2577,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3032,7 +3038,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3143,7 +3150,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3232,6 +3240,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4955,7 +4967,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5049,7 +5082,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5170,6 +5224,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -5271,7 +5343,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5366,7 +5459,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5594,7 +5708,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5705,7 +5820,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5794,6 +5910,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -8084,6 +8204,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8472,6 +8675,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9892,7 +10101,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10003,7 +10213,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10092,6 +10303,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10549,7 +10764,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10660,7 +10876,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10749,6 +10966,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12472,7 +12693,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12566,7 +12808,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12687,6 +12950,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12788,7 +13069,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12883,7 +13185,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13111,7 +13434,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13222,7 +13546,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13311,6 +13636,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15601,6 +15930,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15989,6 +16401,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index b8bb6c8..26d28f9 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -1955,7 +1955,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2066,7 +2067,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2155,6 +2157,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2612,7 +2618,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2723,7 +2730,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2812,6 +2820,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4535,7 +4547,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4629,7 +4662,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4750,6 +4804,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4851,7 +4923,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4946,7 +5039,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5174,7 +5288,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5285,7 +5400,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5374,6 +5490,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7664,6 +7784,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8052,6 +8255,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -8122,7 +8331,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8216,7 +8446,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8337,6 +8588,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -9911,7 +10180,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10022,7 +10292,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10111,6 +10382,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10568,7 +10843,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10679,7 +10955,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10768,6 +11045,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12491,7 +12772,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12585,7 +12887,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12706,6 +13029,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12807,7 +13148,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12902,7 +13264,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13130,7 +13513,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13241,7 +13625,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13330,6 +13715,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15620,8 +16009,91 @@ } } ] - } - ], + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] + } + ], "examples": [ { "stepId": "uuid", @@ -16008,6 +16480,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -18628,7 +19106,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18739,7 +19218,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -18828,6 +19308,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -19285,7 +19769,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -19396,7 +19881,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -19485,6 +19971,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -21208,7 +21698,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21302,7 +21813,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21423,6 +21955,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -21524,7 +22074,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21619,7 +22190,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -21847,7 +22439,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -21958,7 +22551,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -22047,6 +22641,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -24337,6 +24935,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -24725,6 +25406,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -26145,7 +26832,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26256,7 +26944,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26345,6 +27034,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -26802,7 +27495,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26913,7 +27607,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -27002,6 +27697,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -28725,7 +29424,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -28819,7 +29539,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -28940,6 +29681,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -29041,7 +29800,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29136,7 +29916,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29364,7 +30165,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -29475,7 +30277,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -29564,6 +30367,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -31854,6 +32661,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -32242,6 +33132,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index e25ebca..4eaf82f 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -2357,7 +2357,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2468,7 +2469,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2557,6 +2559,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3014,7 +3020,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3125,7 +3132,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3214,6 +3222,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4937,7 +4949,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5031,7 +5064,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5152,6 +5206,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -5253,7 +5325,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5348,7 +5441,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5576,7 +5690,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5687,7 +5802,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5776,6 +5892,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -8066,6 +8186,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8454,6 +8657,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9874,7 +10083,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9985,7 +10195,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10074,6 +10285,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10531,7 +10746,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10642,7 +10858,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10731,6 +10948,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12454,7 +12675,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12548,7 +12790,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12669,6 +12932,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12770,7 +13051,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12865,7 +13167,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13093,7 +13416,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13204,7 +13528,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13293,6 +13618,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -15583,6 +15912,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15971,6 +16383,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 8199898..00c7e20 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -1157,7 +1157,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1268,7 +1269,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1357,6 +1359,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -1814,7 +1820,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1925,7 +1932,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2014,6 +2022,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -3737,7 +3749,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -3831,7 +3864,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -3952,6 +4006,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4053,7 +4125,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4148,7 +4241,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4376,7 +4490,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -4487,7 +4602,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -4576,6 +4692,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -6866,6 +6986,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -7254,6 +7457,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } \ No newline at end of file diff --git a/common/src/schemas/output_schemas/terminateScope_v3.schema.json b/common/src/schemas/output_schemas/terminateScope_v3.schema.json new file mode 100644 index 0000000..a98508d --- /dev/null +++ b/common/src/schemas/output_schemas/terminateScope_v3.schema.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] +} \ No newline at end of file diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index 79bd2fa..9b13d92 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -1756,7 +1756,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1867,7 +1868,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -1956,6 +1958,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2413,7 +2419,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2524,7 +2531,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2613,6 +2621,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4336,7 +4348,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4430,7 +4463,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4551,6 +4605,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -4652,7 +4724,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4747,7 +4840,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -4975,7 +5089,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5086,7 +5201,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5175,6 +5291,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -7465,6 +7585,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -7853,6 +8056,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -9273,7 +9482,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9384,7 +9594,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -9473,6 +9684,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -9930,7 +10145,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10041,7 +10257,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10130,6 +10347,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -11853,7 +12074,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -11947,7 +12189,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12068,6 +12331,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -12169,7 +12450,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12264,7 +12566,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12492,7 +12815,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -12603,7 +12927,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -12692,6 +13017,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -14982,6 +15311,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -15370,6 +15782,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index 884faf1..c9eccf8 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -2340,7 +2340,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2451,7 +2452,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -2540,6 +2542,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -2997,7 +3003,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3108,7 +3115,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -3197,6 +3205,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -4920,7 +4932,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5014,7 +5047,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5135,6 +5189,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -5236,7 +5308,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5331,7 +5424,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -5559,7 +5673,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5670,7 +5785,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -5759,6 +5875,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -8049,6 +8169,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -8437,6 +8640,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -8507,7 +8716,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8601,7 +8831,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -8722,6 +8973,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -10296,7 +10565,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10407,7 +10677,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -10496,6 +10767,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -10953,7 +11228,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -11064,7 +11340,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -11153,6 +11430,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -12876,7 +13157,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -12970,7 +13272,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13091,6 +13414,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -13192,7 +13533,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13287,7 +13649,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -13515,7 +13898,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13626,7 +14010,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -13715,6 +14100,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -16005,6 +16394,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -16393,6 +16865,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -22765,7 +23243,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -22876,7 +23355,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -22965,6 +23445,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -23422,7 +23906,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -23533,7 +24018,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -23622,6 +24108,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -25345,7 +25835,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -25439,7 +25950,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -25560,6 +26092,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -25661,7 +26211,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -25756,7 +26327,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -25984,7 +26576,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26095,7 +26688,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -26184,6 +26778,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -28474,6 +29072,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -28862,6 +29543,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -28932,7 +29619,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29026,7 +29734,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -29147,6 +29876,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -30721,7 +31468,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -30832,7 +31580,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -30921,6 +31670,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -31378,7 +32131,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -31489,7 +32243,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -31578,6 +32333,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -33301,7 +34060,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -33395,7 +34175,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -33516,6 +34317,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -33617,7 +34436,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -33712,7 +34552,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -33940,7 +34801,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -34051,7 +34913,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -34140,6 +35003,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -36430,6 +37297,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -36818,6 +37768,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -39438,7 +40394,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -39549,7 +40506,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -39638,6 +40596,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -40095,7 +41057,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -40206,7 +41169,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -40295,6 +41259,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -42018,7 +42986,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -42112,7 +43101,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -42233,6 +43243,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -42334,7 +43362,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -42429,7 +43478,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -42657,7 +43727,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -42768,7 +43839,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -42857,6 +43929,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -45147,6 +46223,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -45535,6 +46694,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -46955,7 +48120,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -47066,7 +48232,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -47155,6 +48322,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -47612,7 +48783,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -47723,7 +48895,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -47812,6 +48985,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -49535,7 +50712,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -49629,7 +50827,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -49750,6 +50969,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -49851,7 +51088,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -49946,7 +51204,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -50174,7 +51453,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -50285,7 +51565,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -50374,6 +51655,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -52664,6 +53949,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -53052,6 +54420,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -56182,7 +57556,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -56293,7 +57668,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -56382,6 +57758,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -56839,7 +58219,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -56950,7 +58331,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -57039,6 +58421,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -58762,7 +60148,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -58856,7 +60263,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -58977,6 +60405,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -59078,7 +60524,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -59173,7 +60640,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -59401,7 +60889,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -59512,7 +61001,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -59601,6 +61091,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -61891,6 +63385,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -62279,6 +63856,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -63699,7 +65282,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -63810,7 +65394,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -63899,6 +65484,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -64356,7 +65945,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -64467,7 +66057,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -64556,6 +66147,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -66279,7 +67874,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -66373,7 +67989,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -66494,6 +68131,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -66595,7 +68250,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -66690,7 +68366,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -66918,7 +68615,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -67029,7 +68727,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -67118,6 +68817,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -69358,51 +71061,134 @@ "title": "Common" }, { - "title": "wait", + "title": "wait", + "type": "object", + "required": [ + "wait" + ], + "properties": { + "wait": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "wait", + "description": "Pause (in milliseconds) before performing the next action.", + "default": 5000, + "anyOf": [ + { + "type": "number", + "title": "Wait (simple)" + }, + { + "title": "Wait (environment variable)", + "type": "string", + "pattern": "(\\$[A-Za-z0-9_]+)", + "transform": [ + "trim" + ] + }, + { + "type": "boolean", + "title": "Wait (boolean)" + } + ], + "components": { + "schemas": { + "string": { + "title": "Wait (environment variable)", + "type": "string", + "pattern": "(\\$[A-Za-z0-9_]+)", + "transform": [ + "trim" + ] + } + } + }, + "examples": [ + 5000, + "$WAIT_DURATION", + true + ] + } + } + } + ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", "type": "object", "required": [ - "wait" + "terminateScope" ], "properties": { - "wait": { + "terminateScope": { "$schema": "http://json-schema.org/draft-07/schema#", - "title": "wait", - "description": "Pause (in milliseconds) before performing the next action.", - "default": 5000, - "anyOf": [ - { - "type": "number", - "title": "Wait (simple)" - }, - { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - }, - { - "type": "boolean", - "title": "Wait (boolean)" - } - ], - "components": { - "schemas": { - "string": { - "title": "Wait (environment variable)", - "type": "string", - "pattern": "(\\$[A-Za-z0-9_]+)", - "transform": [ - "trim" - ] - } - } - }, + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", "examples": [ - 5000, - "$WAIT_DURATION", - true + "dev-server", + "npm-init", + "test-scope" ] } } @@ -69796,6 +71582,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -74276,7 +76068,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -74387,7 +76180,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -74476,6 +76270,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -74933,7 +76731,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -75044,7 +76843,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -75133,6 +76933,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -76856,7 +78660,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -76950,7 +78775,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -77071,6 +78917,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -77172,7 +79036,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -77267,7 +79152,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -77495,7 +79401,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -77606,7 +79513,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -77695,6 +79603,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -79985,6 +81897,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -80373,6 +82368,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -81793,7 +83794,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -81904,7 +83906,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -81993,6 +83996,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -82450,7 +84457,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -82561,7 +84569,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -82650,6 +84659,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -84373,7 +86386,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -84467,7 +86501,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -84588,6 +86643,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -84689,7 +86762,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -84784,7 +86878,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -85012,7 +87127,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -85123,7 +87239,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -85212,6 +87329,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -87502,6 +89623,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -87890,6 +90094,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -89590,7 +91800,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -89701,7 +91912,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -89790,6 +92002,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -90247,7 +92463,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -90358,7 +92575,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -90447,6 +92665,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -92170,7 +94392,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -92264,7 +94507,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -92385,6 +94649,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -92486,7 +94768,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -92581,7 +94884,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -92809,7 +95133,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -92920,7 +95245,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -93009,6 +95335,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -95299,6 +97629,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -95687,6 +98100,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] }, @@ -97462,7 +99881,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -97573,7 +99993,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -97662,6 +100083,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -98119,7 +100544,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -98230,7 +100656,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -98319,6 +100746,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -100042,7 +102473,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -100136,7 +102588,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -100257,6 +102730,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -100358,7 +102849,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -100453,7 +102965,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -100681,7 +103214,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -100792,7 +103326,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -100881,6 +103416,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -103171,6 +105710,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -103559,6 +106181,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -104979,7 +107607,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -105090,7 +107719,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -105179,6 +107809,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -105636,7 +108270,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -105747,7 +108382,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -105836,6 +108472,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] }, @@ -107559,7 +110199,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -107653,7 +110314,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -107774,6 +110456,24 @@ "directory": "output", "maxVariation": 0.1, "overwrite": "aboveVariation" + }, + { + "command": "npm run dev", + "scope": "dev-server", + "waitUntil": { + "stdio": { + "stdout": "Server listening on port" + } + } + }, + { + "command": "npm init", + "scope": "npm-init", + "waitUntil": { + "stdio": { + "stdout": "/package name:/i" + } + } } ] } @@ -107875,7 +110575,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -107970,7 +110691,28 @@ }, "scope": { "type": "string", - "description": "Named scope to create or interact with. Creates a new terminal scope for long-running/parallel processes, or references an existing scope." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to create or interact with. Creates a new code execution scope for long-running/parallel processes, or references an existing scope. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." + }, + "waitUntil": { + "type": "object", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "properties": { + "stdio": { + "type": "object", + "description": "Standard I/O conditions to wait for.", + "properties": { + "stdout": { + "type": "string", + "description": "String or regex pattern to wait for in stdout. Use `/pattern/flags` format for regex." + }, + "stderr": { + "type": "string", + "description": "String or regex pattern to wait for in stderr. Use `/pattern/flags` format for regex." + } + } + } + } }, "args": { "type": "array", @@ -108198,7 +110940,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -108309,7 +111052,8 @@ }, "scope": { "type": "string", - "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails." + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "description": "Named scope to interact with. References a terminal scope created by a previous step. If the specified scope doesn't exist, the step fails. Must be 1-64 characters and contain only letters, numbers, hyphens, and underscores." }, "inputDelay": { "type": "number", @@ -108398,6 +111142,10 @@ "$ENTER$" ], "inputDelay": 500 + }, + { + "keys": "my-project\n", + "scope": "npm-init" } ] } @@ -110688,6 +113436,89 @@ } } ] + }, + { + "allOf": [ + { + "type": "object", + "dynamicDefaults": { + "stepId": "uuid" + }, + "properties": { + "$schema": { + "description": "JSON Schema for this object.", + "type": "string", + "enum": [ + "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/step_v3.schema.json" + ] + }, + "stepId": { + "type": "string", + "description": "ID of the step." + }, + "description": { + "type": "string", + "description": "Description of the step." + }, + "unsafe": { + "type": "boolean", + "description": "Whether or not the step may be unsafe. Unsafe steps may perform actions that could modify the system or environment in unexpected ways. Unsafe steps are only performed within Docker containers or if unsafe steps are enabled with the `allowUnsafeSteps` config property or the `--allow-unsafe` flag.", + "default": false + }, + "outputs": { + "type": "object", + "description": "Outputs from step processes and user-defined expressions. Use the `outputs` object to reference outputs in subsequent steps. If a user-defined output matches the key for a step-defined output, the user-defined output takes precedence.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Outputs (step)" + }, + "variables": { + "type": "object", + "description": "Environment variables to set from user-defined expressions.", + "default": {}, + "patternProperties": { + "^[A-Za-z0-9_]+$": { + "type": "string", + "description": "Runtime expression for a user-defined output value." + } + }, + "title": "Variables (step)" + }, + "breakpoint": { + "type": "boolean", + "description": "Whether or not this step should act as a breakpoint when debugging is enabled. When `true`, execution will pause at this step when debug mode is enabled.", + "default": false + } + }, + "title": "Common" + }, + { + "title": "terminateScope", + "type": "object", + "required": [ + "terminateScope" + ], + "properties": { + "terminateScope": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + } + } + } + ] } ], "examples": [ @@ -111076,6 +113907,12 @@ "selector": "#targetElement" } } + }, + { + "terminateScope": "dev-server" + }, + { + "terminateScope": "npm-init" } ] } @@ -111451,6 +114288,18 @@ } ] }, + "terminateScope_v3": { + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "terminateScope", + "description": "Terminate a named scope. Sends SIGTERM to the process, waits up to 5 seconds, then sends SIGKILL if needed.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,64}$", + "examples": [ + "dev-server", + "npm-init", + "test-scope" + ] + }, "type_v3": { "$schema": "http://json-schema.org/draft-07/schema#", "title": "typeKeys", diff --git a/core/test/artifacts/scopes-lifecycle.spec.json b/core/test/artifacts/scopes-lifecycle.spec.json new file mode 100644 index 0000000..be77854 --- /dev/null +++ b/core/test/artifacts/scopes-lifecycle.spec.json @@ -0,0 +1,70 @@ +{ + "$schema": "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/spec_v3.schema.json", + "description": "Test basic scope lifecycle: create, use, and terminate", + "tests": [ + { + "testId": "scope-basic-lifecycle", + "description": "Create a scope with sleep command and terminate it", + "steps": [ + { + "runShell": { + "command": "sleep 60", + "scope": "test-scope-sleep" + } + }, + { + "terminateScope": "test-scope-sleep" + } + ] + }, + { + "testId": "scope-waituntil-stdout", + "description": "Test waitUntil with stdout condition", + "steps": [ + { + "runShell": { + "command": "echo 'Server is ready' && sleep 60", + "scope": "test-waituntil", + "waitUntil": { + "stdio": { + "stdout": "Server is ready" + } + } + } + }, + { + "terminateScope": "test-waituntil" + } + ] + }, + { + "testId": "scope-waituntil-regex", + "description": "Test waitUntil with regex pattern", + "steps": [ + { + "runShell": { + "command": "echo 'Server listening on port 3000' && sleep 60", + "scope": "test-regex", + "waitUntil": { + "stdio": { + "stdout": "/listening.*port/" + } + } + } + }, + { + "terminateScope": "test-regex" + } + ] + }, + { + "testId": "terminate-nonexistent-scope", + "description": "Test terminating a scope that doesn't exist (should not fail)", + "steps": [ + { + "terminateScope": "nonexistent-scope" + } + ] + } + ] +} diff --git a/core/test/artifacts/scopes-type.spec.json b/core/test/artifacts/scopes-type.spec.json new file mode 100644 index 0000000..7f15074 --- /dev/null +++ b/core/test/artifacts/scopes-type.spec.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://raw.githubusercontent.com/doc-detective/common/refs/heads/main/dist/schemas/spec_v3.schema.json", + "description": "Test type action with scopes for interactive terminal input", + "tests": [ + { + "testId": "type-to-scope", + "description": "Type input to a scope running an interactive command", + "steps": [ + { + "runCode": { + "language": "python", + "code": "import sys\nprint('Enter your name:', flush=True)\nname = input()\nprint(f'Hello {name}!', flush=True)\nimport time\ntime.sleep(5)", + "scope": "python-interactive", + "waitUntil": { + "stdio": { + "stdout": "Enter your name:" + } + } + } + }, + { + "type": { + "keys": "TestUser\n", + "scope": "python-interactive" + } + }, + { + "terminateScope": "python-interactive" + } + ] + } + ] +} From 9fd7bd52c8550ff7c111fe3e8c1870f47dfa3b22 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:22:17 +0000 Subject: [PATCH 07/13] Fix browser detection bug and test scope functionality successfully Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- core/src/config.js | 4 ++-- core/test/artifacts/scopes-lifecycle.spec.json | 4 ++++ core/test/artifacts/scopes-type.spec.json | 16 ++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/core/src/config.js b/core/src/config.js index 8415e31..828c1d2 100644 --- a/core/src/config.js +++ b/core/src/config.js @@ -320,7 +320,7 @@ async function getAvailableApps({ config }) { const chrome = installedBrowsers.find( (browser) => browser.browser === "chrome" ); - const chromeVersion = chrome.buildId; + const chromeVersion = chrome?.buildId; const chromedriver = installedBrowsers.find( (browser) => browser.browser === "chromedriver" ); @@ -348,7 +348,7 @@ async function getAvailableApps({ config }) { if (firefox && appiumFirefox) { apps.push({ name: "firefox", - version: firefox.buildId, + version: firefox?.buildId, path: firefox.executablePath, }); } diff --git a/core/test/artifacts/scopes-lifecycle.spec.json b/core/test/artifacts/scopes-lifecycle.spec.json index be77854..9bc88c5 100644 --- a/core/test/artifacts/scopes-lifecycle.spec.json +++ b/core/test/artifacts/scopes-lifecycle.spec.json @@ -5,6 +5,7 @@ { "testId": "scope-basic-lifecycle", "description": "Create a scope with sleep command and terminate it", + "contexts": [], "steps": [ { "runShell": { @@ -20,6 +21,7 @@ { "testId": "scope-waituntil-stdout", "description": "Test waitUntil with stdout condition", + "contexts": [], "steps": [ { "runShell": { @@ -40,6 +42,7 @@ { "testId": "scope-waituntil-regex", "description": "Test waitUntil with regex pattern", + "contexts": [], "steps": [ { "runShell": { @@ -60,6 +63,7 @@ { "testId": "terminate-nonexistent-scope", "description": "Test terminating a scope that doesn't exist (should not fail)", + "contexts": [], "steps": [ { "terminateScope": "nonexistent-scope" diff --git a/core/test/artifacts/scopes-type.spec.json b/core/test/artifacts/scopes-type.spec.json index 7f15074..53b45f0 100644 --- a/core/test/artifacts/scopes-type.spec.json +++ b/core/test/artifacts/scopes-type.spec.json @@ -4,16 +4,16 @@ "tests": [ { "testId": "type-to-scope", - "description": "Type input to a scope running an interactive command", + "description": "Type input to a scope running read command", + "contexts": [], "steps": [ { - "runCode": { - "language": "python", - "code": "import sys\nprint('Enter your name:', flush=True)\nname = input()\nprint(f'Hello {name}!', flush=True)\nimport time\ntime.sleep(5)", - "scope": "python-interactive", + "runShell": { + "command": "read -p 'Enter name: ' name && echo \"Hello $name\" && sleep 5", + "scope": "shell-interactive", "waitUntil": { "stdio": { - "stdout": "Enter your name:" + "stdout": "Enter name:" } } } @@ -21,11 +21,11 @@ { "type": { "keys": "TestUser\n", - "scope": "python-interactive" + "scope": "shell-interactive" } }, { - "terminateScope": "python-interactive" + "terminateScope": "shell-interactive" } ] } From fa3d857aa34a569f68e5cf64894cbaf2fcb5d098 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Dec 2025 18:24:19 +0000 Subject: [PATCH 08/13] Address code review feedback: improve regex validation, fix escape sequences, use consistent logging Co-authored-by: hawkeyexl <5209367+hawkeyexl@users.noreply.github.com> --- core/src/scopes/cleanup.js | 4 +++- core/src/scopes/terminal.js | 6 ++++-- core/src/scopes/waitUntil.js | 13 +++++++++++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/src/scopes/cleanup.js b/core/src/scopes/cleanup.js index 4ea60d1..144ba1b 100644 --- a/core/src/scopes/cleanup.js +++ b/core/src/scopes/cleanup.js @@ -133,7 +133,9 @@ function setupCleanupHandlers(config = { logLevel: 'info' }) { // The other handlers should have already done the cleanup const allScopes = getAllScopes(); if (allScopes.size > 0) { - console.log(`Warning: ${allScopes.size} scope(s) still in registry at exit`); + // Use stderr.write since console.log may not work during exit + // and the config object may not be available + process.stderr.write(`Warning: ${allScopes.size} scope(s) still in registry at exit\n`); } }); diff --git a/core/src/scopes/terminal.js b/core/src/scopes/terminal.js index 36e1e1c..42933f4 100644 --- a/core/src/scopes/terminal.js +++ b/core/src/scopes/terminal.js @@ -173,12 +173,14 @@ async function writeToTerminal(name, text, config) { let processedText = text; // Replace escape sequences + // Process \\\\ first to avoid double-escaping issues + processedText = processedText.replace(/\\\\/g, '\x00'); // Temporary placeholder processedText = processedText .replace(/\\n/g, '\n') .replace(/\\t/g, '\t') .replace(/\\r/g, '\r') - .replace(/\\x([0-9A-Fa-f]{2})/g, (match, hex) => String.fromCharCode(parseInt(hex, 16))) - .replace(/\\\\/g, '\\'); // Must be last to avoid double-escaping + .replace(/\\x([0-9A-Fa-f]{2})/g, (match, hex) => String.fromCharCode(parseInt(hex, 16))); + processedText = processedText.replace(/\x00/g, '\\'); // Replace placeholder with single backslash log(config, "debug", `Writing to terminal scope '${name}': ${JSON.stringify(processedText)}`); diff --git a/core/src/scopes/waitUntil.js b/core/src/scopes/waitUntil.js index 7a9d7fb..1c18e51 100644 --- a/core/src/scopes/waitUntil.js +++ b/core/src/scopes/waitUntil.js @@ -7,13 +7,22 @@ exports.waitForConditions = waitForConditions; /** * Checks if a pattern string represents a regex pattern. - * Regex patterns must start and end with '/'. + * Regex patterns must start and end with '/' and the last '/' must be at the end or followed only by flags. + * Valid flags are: g, i, m, u, y, s * * @param {string} pattern - The pattern to check * @returns {boolean} True if pattern is a regex */ function isRegexPattern(pattern) { - return typeof pattern === 'string' && pattern.startsWith('/') && pattern.includes('/') && pattern.lastIndexOf('/') > 0; + if (typeof pattern !== 'string') return false; + // Must start with / and have at least one more / + if (!pattern.startsWith('/') || pattern.length < 2) return false; + // Find the last / + const lastSlashIndex = pattern.lastIndexOf('/'); + if (lastSlashIndex === 0) return false; + // Everything after the last / must be valid regex flags (or empty) + const afterLastSlash = pattern.substring(lastSlashIndex + 1); + return /^[gimuysd]*$/.test(afterLastSlash); } /** From a56830a971254be40f90905df8b5ceffac912492 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 15 Dec 2025 11:07:29 -0800 Subject: [PATCH 09/13] Review comment responses --- common/src/schemas/dereferenceSchemas.js | 6 +-- core/src/scopes/cleanup.js | 50 ++++++++++++++++-------- core/src/scopes/waitUntil.js | 50 ++++++++++-------------- core/src/tests/runCode.js | 2 +- core/src/tests/typeKeys.js | 33 ++++++++++++++-- 5 files changed, 87 insertions(+), 54 deletions(-) diff --git a/common/src/schemas/dereferenceSchemas.js b/common/src/schemas/dereferenceSchemas.js index f8a15b9..e013890 100644 --- a/common/src/schemas/dereferenceSchemas.js +++ b/common/src/schemas/dereferenceSchemas.js @@ -175,10 +175,10 @@ function updateRefPaths(schema) { } if (key === "$ref" && !value.startsWith("#")) { // File name of the referenced schema - valueFile = value.split("#")[0]; + const valueFile = value.split("#")[0]; // Attribute path in the referenced schema - valueAttribute = value.split("#")[1]; - valuePath = path.resolve(`${__dirname}/build/${valueFile}`); + const valueAttribute = value.split("#")[1]; + const valuePath = path.resolve(`${__dirname}/build/${valueFile}`); schema[key] = `${valuePath}#${valueAttribute}`; // console.log({value, valueFile, valueAttribute, final: schema[key]}) } diff --git a/core/src/scopes/cleanup.js b/core/src/scopes/cleanup.js index 144ba1b..d23bf58 100644 --- a/core/src/scopes/cleanup.js +++ b/core/src/scopes/cleanup.js @@ -101,30 +101,46 @@ function setupCleanupHandlers(config = { logLevel: 'info' }) { await cleanupAllScopes(config); }; + // Helper to run cleanup and then exit reliably + const exitWithCleanup = (code, reason) => { + // Start cleanup and ensure we exit afterwards. Use finally-style behavior + // and a fallback timeout to avoid hanging indefinitely. + (async () => { + try { + await handleExit(reason); + } catch (err) { + log(config, 'error', `Error during cleanup: ${err.stack || err}`); + } finally { + // allow stdio to flush then exit + setImmediate(() => process.exit(code)); + // force exit after 5s if something prevents exit + setTimeout(() => process.exit(code), 5000).unref(); + } + })(); + }; + // SIGINT (Ctrl+C) - process.on('SIGINT', async () => { - await handleExit('SIGINT'); - process.exit(130); // 128 + SIGINT signal number + process.on('SIGINT', () => { + log(config, 'info', 'Received SIGINT, cleaning up...'); + exitWithCleanup(130, 'SIGINT'); // 128 + SIGINT }); - + // SIGTERM - process.on('SIGTERM', async () => { - await handleExit('SIGTERM'); - process.exit(143); // 128 + SIGTERM signal number + process.on('SIGTERM', () => { + log(config, 'info', 'Received SIGTERM, cleaning up...'); + exitWithCleanup(143, 'SIGTERM'); // 128 + SIGTERM }); - + // Uncaught exceptions - process.on('uncaughtException', async (error) => { - log(config, "error", `Uncaught exception: ${error.message}`); - await handleExit('uncaughtException'); - process.exit(1); + process.on('uncaughtException', (error) => { + log(config, 'error', `Uncaught exception: ${error && error.stack ? error.stack : error}`); + exitWithCleanup(1, 'uncaughtException'); }); - + // Unhandled promise rejections - process.on('unhandledRejection', async (reason, promise) => { - log(config, "error", `Unhandled rejection: ${reason}`); - await handleExit('unhandledRejection'); - process.exit(1); + process.on('unhandledRejection', (reason) => { + log(config, 'error', `Unhandled rejection: ${reason}`); + exitWithCleanup(1, 'unhandledRejection'); }); // Normal exit diff --git a/core/src/scopes/waitUntil.js b/core/src/scopes/waitUntil.js index 1c18e51..5d1ff6b 100644 --- a/core/src/scopes/waitUntil.js +++ b/core/src/scopes/waitUntil.js @@ -73,40 +73,32 @@ function matchesCondition(output, condition) { * Waits for stdout/stderr conditions to be met by listening to streams. * * @param {object} options - Wait options - * @param {object} options.scope - The scope object with streams - * @param {object} options.conditions - Conditions to wait for - * @param {string} options.conditions.stdout - Stdout condition (optional) - * @param {string} options.conditions.stderr - Stderr condition (optional) - * @param {number} options.timeout - Timeout in milliseconds (default 30000) - * @param {object} options.config - Config for logging - * @returns {Promise} Resolves with {met: true} or rejects with timeout error - */ -async function waitForConditions({ scope, conditions, timeout = 30000, config }) { - // If no conditions specified, resolve immediately - if (!conditions || (!conditions.stdout && !conditions.stderr)) { - return { met: true }; - } - - return new Promise((resolve, reject) => { + const stdoutListener = (chunk) => { + // append incoming chunk to buffer and test against the accumulated buffer + const full = scope.stdoutBuffer.join('\n'); + if (matchesCondition(full, conditions.stdout)) { + stdoutMet = true; + log(config, "info", `Stdout condition met: ${conditions.stdout}`); + + if (stderrMet) { + cleanup(); + resolve({ met: true }); + } let stdoutMet = !conditions.stdout || conditions.stdout === ''; let stderrMet = !conditions.stderr || conditions.stderr === ''; let timeoutId; - // Check if already met from buffer - if (!stdoutMet && scope.stdoutBuffer) { - const stdoutContent = scope.stdoutBuffer.join('\n'); - if (matchesCondition(stdoutContent, conditions.stdout)) { - stdoutMet = true; - log(config, "debug", `Stdout condition already met in buffer: ${conditions.stdout}`); - } - } - - if (!stderrMet && scope.stderrBuffer) { - const stderrContent = scope.stderrBuffer.join('\n'); - if (matchesCondition(stderrContent, conditions.stderr)) { + const stderrListener = (chunk) => { + // append incoming chunk to buffer and test against the accumulated buffer + const full = scope.stderrBuffer.join('\n'); + if (matchesCondition(full, conditions.stderr)) { stderrMet = true; - log(config, "debug", `Stderr condition already met in buffer: ${conditions.stderr}`); - } + log(config, "info", `Stderr condition met: ${conditions.stderr}`); + + if (stdoutMet) { + cleanup(); + resolve({ met: true }); + } } // Check if all conditions already met diff --git a/core/src/tests/runCode.js b/core/src/tests/runCode.js index 63a70be..ab1fb79 100644 --- a/core/src/tests/runCode.js +++ b/core/src/tests/runCode.js @@ -153,7 +153,7 @@ if (require.main === module) { language: "python", }, }; - runCode(config, step) + runCode({ config, step }) .then((result) => { console.log(result); }) diff --git a/core/src/tests/typeKeys.js b/core/src/tests/typeKeys.js index 295573a..5c43624 100644 --- a/core/src/tests/typeKeys.js +++ b/core/src/tests/typeKeys.js @@ -68,6 +68,20 @@ const specialKeyMap = { $ZANKAKU_HANDKAKU$: Key.ZenkakuHankaku, }; +// Mapping of special keys to terminal control sequences for terminal scopes +const specialKeyTerminalMap = { + $ENTER$: '\r', + $RETURN$: '\r', + $TAB$: '\t', + $BACKSPACE$: '\x7f', + $ESCAPE$: '\x1b', + $SPACE$: ' ', + $ARROW_UP$: '\x1b[A', + $ARROW_DOWN$: '\x1b[B', + $ARROW_RIGHT$: '\x1b[C', + $ARROW_LEFT$: '\x1b[D', +}; + // Type a sequence of keys in the active element. async function typeKeys({ config, step, driver }) { let result = { status: "PASS", description: "Typed keys." }; @@ -129,12 +143,23 @@ async function typeKeys({ config, step, driver }) { } try { - // Join all keys into a single string - const text = step.type.keys.join(''); - + // Build text for terminal by expanding special keys and splitting normal text + let keysToWrite = []; + + step.type.keys.forEach((key) => { + if (key.startsWith("$") && key.endsWith("$") && specialKeyTerminalMap[key]) { + keysToWrite.push(specialKeyTerminalMap[key]); + } else { + // Split into individual characters + keysToWrite = keysToWrite.concat(key.split("")); + } + }); + + const text = keysToWrite.join(""); + // Write to terminal await writeToTerminal(scopeName, text, config); - + result.description = `Typed keys to scope '${scopeName}'`; return result; } catch (error) { From 4197e2b2ce08cbfa3aa5581bc1e3ab36a706c7fe Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 15 Dec 2025 19:59:15 -0800 Subject: [PATCH 10/13] Refactor cleanup and waitUntil logic; add new test cases - Simplify the exitWithCleanup function in cleanup.js to improve error handling and ensure proper exit behavior. - Enhance the waitForConditions function in waitUntil.js to check conditions against accumulated buffer data for stdout and stderr. - Expand the specialKeyTerminalMap in typeKeys.js to include additional control, navigation, and function keys. - Add multiple new test JSON files to cover various scenarios including timeout, failure handling, and regression testing. - Create a regression output file to store expected output for comparison in tests. --- common/dist/schemas/config_v3.schema.json | 20 +- common/dist/schemas/report_v3.schema.json | 16 +- .../dist/schemas/resolvedTests_v3.schema.json | 36 +- common/dist/schemas/runCode_v3.schema.json | 4 +- common/dist/schemas/runShell_v3.schema.json | 4 +- common/dist/schemas/spec_v3.schema.json | 16 +- common/dist/schemas/step_v3.schema.json | 8 +- common/dist/schemas/test_v3.schema.json | 16 +- .../output_schemas/config_v3.schema.json | 20 +- .../output_schemas/report_v3.schema.json | 16 +- .../resolvedTests_v3.schema.json | 36 +- .../output_schemas/runCode_v3.schema.json | 4 +- .../output_schemas/runShell_v3.schema.json | 4 +- .../output_schemas/spec_v3.schema.json | 16 +- .../output_schemas/step_v3.schema.json | 8 +- .../output_schemas/test_v3.schema.json | 16 +- common/src/schemas/schemas.json | 120 +-- .../src_schemas/runCode_v3.schema.json | 2 +- .../src_schemas/runShell_v3.schema.json | 2 +- core/package-lock.json | 694 +++--------------- core/src/scopes/cleanup.js | 18 +- core/src/scopes/waitUntil.js | 62 +- core/src/tests/typeKeys.js | 27 + core/test/temp-all-contexts-skipped.json | 24 + core/test/temp-dom-timeout-test.json | 17 + core/test/temp-element-timeout-test.json | 19 + core/test/temp-failure-test.json | 14 + core/test/temp-initial-screenshot-test.json | 18 + core/test/temp-network-timeout-test.json | 17 + core/test/temp-regression-output.txt | 1 + core/test/temp-regression-test.json | 19 + core/test/temp-unsafe-test.json | 12 + 32 files changed, 494 insertions(+), 812 deletions(-) create mode 100644 core/test/temp-all-contexts-skipped.json create mode 100644 core/test/temp-dom-timeout-test.json create mode 100644 core/test/temp-element-timeout-test.json create mode 100644 core/test/temp-failure-test.json create mode 100644 core/test/temp-initial-screenshot-test.json create mode 100644 core/test/temp-network-timeout-test.json create mode 100644 core/test/temp-regression-output.txt create mode 100644 core/test/temp-regression-test.json create mode 100644 core/test/temp-unsafe-test.json diff --git a/common/dist/schemas/config_v3.schema.json b/common/dist/schemas/config_v3.schema.json index ad8dffb..f4471ec 100644 --- a/common/dist/schemas/config_v3.schema.json +++ b/common/dist/schemas/config_v3.schema.json @@ -4539,7 +4539,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4654,7 +4654,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4915,7 +4915,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5031,7 +5031,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8323,7 +8323,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8438,7 +8438,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12764,7 +12764,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12879,7 +12879,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13140,7 +13140,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13256,7 +13256,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/report_v3.schema.json b/common/dist/schemas/report_v3.schema.json index 7344f3d..9add7e0 100644 --- a/common/dist/schemas/report_v3.schema.json +++ b/common/dist/schemas/report_v3.schema.json @@ -4972,7 +4972,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5087,7 +5087,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5348,7 +5348,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5464,7 +5464,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12698,7 +12698,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12813,7 +12813,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13074,7 +13074,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13190,7 +13190,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/resolvedTests_v3.schema.json b/common/dist/schemas/resolvedTests_v3.schema.json index 26d28f9..e8ec480 100644 --- a/common/dist/schemas/resolvedTests_v3.schema.json +++ b/common/dist/schemas/resolvedTests_v3.schema.json @@ -4552,7 +4552,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4667,7 +4667,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4928,7 +4928,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5044,7 +5044,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8336,7 +8336,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8451,7 +8451,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12777,7 +12777,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12892,7 +12892,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13153,7 +13153,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13269,7 +13269,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -21703,7 +21703,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -21818,7 +21818,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -22079,7 +22079,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -22195,7 +22195,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29429,7 +29429,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29544,7 +29544,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29805,7 +29805,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29921,7 +29921,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/runCode_v3.schema.json b/common/dist/schemas/runCode_v3.schema.json index 7fe6d2b..dd63ee6 100644 --- a/common/dist/schemas/runCode_v3.schema.json +++ b/common/dist/schemas/runCode_v3.schema.json @@ -30,7 +30,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -146,7 +146,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/runShell_v3.schema.json b/common/dist/schemas/runShell_v3.schema.json index f0e579b..2d577be 100644 --- a/common/dist/schemas/runShell_v3.schema.json +++ b/common/dist/schemas/runShell_v3.schema.json @@ -29,7 +29,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -144,7 +144,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/spec_v3.schema.json b/common/dist/schemas/spec_v3.schema.json index 4eaf82f..3267ea4 100644 --- a/common/dist/schemas/spec_v3.schema.json +++ b/common/dist/schemas/spec_v3.schema.json @@ -4954,7 +4954,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5069,7 +5069,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5330,7 +5330,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5446,7 +5446,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12680,7 +12680,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12795,7 +12795,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13056,7 +13056,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13172,7 +13172,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/step_v3.schema.json b/common/dist/schemas/step_v3.schema.json index 00c7e20..e1bbe49 100644 --- a/common/dist/schemas/step_v3.schema.json +++ b/common/dist/schemas/step_v3.schema.json @@ -3754,7 +3754,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -3869,7 +3869,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4130,7 +4130,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4246,7 +4246,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/dist/schemas/test_v3.schema.json b/common/dist/schemas/test_v3.schema.json index 9b13d92..8a3b195 100644 --- a/common/dist/schemas/test_v3.schema.json +++ b/common/dist/schemas/test_v3.schema.json @@ -4353,7 +4353,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4468,7 +4468,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4729,7 +4729,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4845,7 +4845,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12079,7 +12079,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12194,7 +12194,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12455,7 +12455,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12571,7 +12571,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/config_v3.schema.json b/common/src/schemas/output_schemas/config_v3.schema.json index ad8dffb..f4471ec 100644 --- a/common/src/schemas/output_schemas/config_v3.schema.json +++ b/common/src/schemas/output_schemas/config_v3.schema.json @@ -4539,7 +4539,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4654,7 +4654,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4915,7 +4915,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5031,7 +5031,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8323,7 +8323,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8438,7 +8438,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12764,7 +12764,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12879,7 +12879,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13140,7 +13140,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13256,7 +13256,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/report_v3.schema.json b/common/src/schemas/output_schemas/report_v3.schema.json index 7344f3d..9add7e0 100644 --- a/common/src/schemas/output_schemas/report_v3.schema.json +++ b/common/src/schemas/output_schemas/report_v3.schema.json @@ -4972,7 +4972,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5087,7 +5087,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5348,7 +5348,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5464,7 +5464,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12698,7 +12698,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12813,7 +12813,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13074,7 +13074,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13190,7 +13190,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json index 26d28f9..e8ec480 100644 --- a/common/src/schemas/output_schemas/resolvedTests_v3.schema.json +++ b/common/src/schemas/output_schemas/resolvedTests_v3.schema.json @@ -4552,7 +4552,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4667,7 +4667,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4928,7 +4928,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5044,7 +5044,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8336,7 +8336,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8451,7 +8451,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12777,7 +12777,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12892,7 +12892,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13153,7 +13153,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13269,7 +13269,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -21703,7 +21703,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -21818,7 +21818,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -22079,7 +22079,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -22195,7 +22195,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29429,7 +29429,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29544,7 +29544,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29805,7 +29805,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29921,7 +29921,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/runCode_v3.schema.json b/common/src/schemas/output_schemas/runCode_v3.schema.json index 7fe6d2b..dd63ee6 100644 --- a/common/src/schemas/output_schemas/runCode_v3.schema.json +++ b/common/src/schemas/output_schemas/runCode_v3.schema.json @@ -30,7 +30,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -146,7 +146,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/runShell_v3.schema.json b/common/src/schemas/output_schemas/runShell_v3.schema.json index f0e579b..2d577be 100644 --- a/common/src/schemas/output_schemas/runShell_v3.schema.json +++ b/common/src/schemas/output_schemas/runShell_v3.schema.json @@ -29,7 +29,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -144,7 +144,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/spec_v3.schema.json b/common/src/schemas/output_schemas/spec_v3.schema.json index 4eaf82f..3267ea4 100644 --- a/common/src/schemas/output_schemas/spec_v3.schema.json +++ b/common/src/schemas/output_schemas/spec_v3.schema.json @@ -4954,7 +4954,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5069,7 +5069,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5330,7 +5330,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5446,7 +5446,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12680,7 +12680,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12795,7 +12795,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13056,7 +13056,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13172,7 +13172,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/step_v3.schema.json b/common/src/schemas/output_schemas/step_v3.schema.json index 00c7e20..e1bbe49 100644 --- a/common/src/schemas/output_schemas/step_v3.schema.json +++ b/common/src/schemas/output_schemas/step_v3.schema.json @@ -3754,7 +3754,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -3869,7 +3869,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4130,7 +4130,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4246,7 +4246,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/output_schemas/test_v3.schema.json b/common/src/schemas/output_schemas/test_v3.schema.json index 9b13d92..8a3b195 100644 --- a/common/src/schemas/output_schemas/test_v3.schema.json +++ b/common/src/schemas/output_schemas/test_v3.schema.json @@ -4353,7 +4353,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4468,7 +4468,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4729,7 +4729,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -4845,7 +4845,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12079,7 +12079,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12194,7 +12194,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12455,7 +12455,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -12571,7 +12571,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/schemas.json b/common/src/schemas/schemas.json index c9eccf8..7df408a 100644 --- a/common/src/schemas/schemas.json +++ b/common/src/schemas/schemas.json @@ -4937,7 +4937,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5052,7 +5052,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5313,7 +5313,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -5429,7 +5429,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8721,7 +8721,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -8836,7 +8836,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13162,7 +13162,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13277,7 +13277,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13538,7 +13538,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -13654,7 +13654,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -25840,7 +25840,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -25955,7 +25955,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -26216,7 +26216,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -26332,7 +26332,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29624,7 +29624,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -29739,7 +29739,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -34065,7 +34065,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -34180,7 +34180,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -34441,7 +34441,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -34557,7 +34557,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -42991,7 +42991,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -43106,7 +43106,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -43367,7 +43367,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -43483,7 +43483,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -50717,7 +50717,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -50832,7 +50832,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -51093,7 +51093,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -51209,7 +51209,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -60153,7 +60153,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -60268,7 +60268,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -60529,7 +60529,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -60645,7 +60645,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -67879,7 +67879,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -67994,7 +67994,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -68255,7 +68255,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -68371,7 +68371,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -72339,7 +72339,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -72455,7 +72455,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -72610,7 +72610,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -72725,7 +72725,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -78665,7 +78665,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -78780,7 +78780,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -79041,7 +79041,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -79157,7 +79157,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -86391,7 +86391,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -86506,7 +86506,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -86767,7 +86767,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -86883,7 +86883,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -94397,7 +94397,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -94512,7 +94512,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -94773,7 +94773,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -94889,7 +94889,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -102478,7 +102478,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -102593,7 +102593,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -102854,7 +102854,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -102970,7 +102970,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -110204,7 +110204,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -110319,7 +110319,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -110580,7 +110580,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", @@ -110696,7 +110696,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/src_schemas/runCode_v3.schema.json b/common/src/schemas/src_schemas/runCode_v3.schema.json index 4e7e8a6..2844265 100644 --- a/common/src/schemas/src_schemas/runCode_v3.schema.json +++ b/common/src/schemas/src_schemas/runCode_v3.schema.json @@ -36,7 +36,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the code's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/common/src/schemas/src_schemas/runShell_v3.schema.json b/common/src/schemas/src_schemas/runShell_v3.schema.json index d6b2e7a..e4f9e14 100644 --- a/common/src/schemas/src_schemas/runShell_v3.schema.json +++ b/common/src/schemas/src_schemas/runShell_v3.schema.json @@ -38,7 +38,7 @@ }, "waitUntil": { "type": "object", - "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met.", + "description": "Conditions to wait for in the command's output before considering the step complete. When specified, the process continues running after conditions are met. Times out after 30 seconds.", "properties": { "stdio": { "type": "object", diff --git a/core/package-lock.json b/core/package-lock.json index 52d5c76..7e13854 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -1766,6 +1766,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1848,6 +1849,7 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -6729,7 +6731,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -6764,7 +6765,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -6779,7 +6779,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -6809,7 +6808,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -6983,7 +6981,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -7510,7 +7507,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -7526,7 +7522,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -7548,8 +7543,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/@xmldom/xmldom": { "version": "0.8.11", @@ -7577,7 +7571,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -7591,7 +7584,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -7637,7 +7629,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -7704,7 +7695,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -7837,8 +7827,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-geckodriver/node_modules/async": { "version": "3.2.6", @@ -7948,7 +7937,6 @@ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -7970,7 +7958,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -7982,7 +7969,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8003,7 +7989,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -8059,7 +8044,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -8085,7 +8069,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8108,7 +8091,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8153,7 +8135,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -8166,7 +8147,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -8179,7 +8159,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -8194,7 +8173,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8206,15 +8184,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -8232,7 +8208,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -8250,7 +8225,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -8260,7 +8234,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -8292,7 +8265,6 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8305,7 +8277,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8315,7 +8286,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -8328,7 +8298,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -8350,7 +8319,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -8376,7 +8344,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -8392,7 +8359,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8406,7 +8372,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8416,7 +8381,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8426,7 +8390,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -8502,7 +8465,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8520,7 +8482,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -8542,7 +8503,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8562,15 +8522,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -8605,8 +8563,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/emoji-regex": { "version": "9.2.2", @@ -8618,15 +8575,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8690,7 +8645,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8699,15 +8653,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8744,7 +8696,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -8817,7 +8768,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8826,15 +8776,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -8871,8 +8819,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/follow-redirects": { "version": "1.15.11", @@ -8964,7 +8911,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8974,7 +8920,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9028,7 +8973,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -9038,7 +8982,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9156,8 +9099,7 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/has-flag": { "version": "4.0.0", @@ -9219,7 +9161,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9232,8 +9173,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -9241,7 +9181,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9258,7 +9197,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -9268,15 +9206,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -9296,15 +9232,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -9352,7 +9286,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -9392,7 +9325,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9410,8 +9342,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/is-stream": { "version": "2.0.1", @@ -9526,7 +9457,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9535,8 +9465,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/lazystream": { "version": "1.0.1", @@ -9585,7 +9514,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -9656,7 +9584,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -9692,7 +9619,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9702,7 +9628,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -9715,7 +9640,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -9731,7 +9655,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9740,15 +9663,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9758,7 +9679,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9768,7 +9688,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -9785,7 +9704,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -9795,8 +9713,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/minipass": { "version": "7.1.2", @@ -9821,7 +9738,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -9838,7 +9754,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9847,15 +9762,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9883,7 +9796,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9923,7 +9835,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -9936,15 +9847,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -9957,7 +9866,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -9976,7 +9884,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -9986,7 +9893,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10002,7 +9908,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10026,7 +9931,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10036,7 +9940,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10079,7 +9982,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -10124,7 +10026,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -10174,7 +10075,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -10270,7 +10170,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -10290,7 +10189,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -10306,7 +10204,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10316,7 +10213,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -10332,7 +10228,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10482,7 +10377,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -10496,7 +10390,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -10519,7 +10412,6 @@ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -10528,8 +10420,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/sanitize-filename": { "version": "1.6.3", @@ -10545,8 +10436,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-geckodriver/node_modules/semver": { "version": "7.7.3", @@ -10565,7 +10455,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -10588,7 +10477,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -10605,7 +10493,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10628,15 +10515,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -10657,8 +10542,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-geckodriver/node_modules/sharp": { "version": "0.34.5", @@ -10743,7 +10627,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -10763,7 +10646,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -10780,7 +10662,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10799,7 +10680,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10877,7 +10757,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -10895,7 +10774,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -10911,7 +10789,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10926,7 +10803,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -10936,7 +10812,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11175,8 +11050,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/through": { "version": "2.3.8", @@ -11189,7 +11063,6 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -11199,7 +11072,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -11240,7 +11112,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -11264,7 +11135,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11309,7 +11179,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11320,7 +11189,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -11330,7 +11198,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -11355,7 +11222,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -11378,7 +11244,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -11393,7 +11258,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11408,7 +11272,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11423,7 +11286,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11500,7 +11362,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -11509,15 +11370,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11532,7 +11391,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11551,7 +11409,6 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -11582,7 +11439,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -11592,7 +11448,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -11605,7 +11460,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -11623,7 +11477,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -11632,15 +11485,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-geckodriver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -11729,7 +11580,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.1.1.tgz", "integrity": "sha512-7I6SxkqkUojD+LzasixT+G6HEZs1a4sRMbeqwkSPCwf7WlvV0WctFFWNmjDrk+XVVqctafXLrqrDWpfGouw4bQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "@appium/types": "^1.1.1", @@ -11764,7 +11614,6 @@ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.0.4.tgz", "integrity": "sha512-qpIkPT99EadfKQ2Jr8kHaY4uWeaRR77UVEbzjPTti4W82/nG9GCAWYJv2ORt3AY6PIGl1/Cp95tsOq9eatDQVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/support": "^7.0.3" @@ -11779,7 +11628,6 @@ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.1.2.tgz", "integrity": "sha512-zJYdL0wWZfgE7uoCgcYCHmhgopehGAA6WEMc5fj4Sj81YdbVJsR3sqD3xj832GmbtP5FEoaFWi2xiHoovreA9w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/support": "^7.0.3", "chalk": "4.1.2", @@ -11809,7 +11657,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11842,7 +11689,6 @@ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.0.0.tgz", "integrity": "sha512-eowz+sV6YxuHdsuRizEhG+AGeeMsUiS9ryWLkdFSqQlsNB+uDudehpYQiRkrrtaGOBzq7a3GDUB7zjc6eR80QA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "json-schema": "0.4.0", "source-map-support": "0.5.21" @@ -11857,7 +11703,6 @@ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.0.3.tgz", "integrity": "sha512-r4vHjR+wQxg4DND9StWUM2GZvNO3+6ePVplBMKFU+HfKgxw07qjxf08CYMXvJb/YUMwhAhhbVRqzmGudNAk+bg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/tsconfig": "^1.1.0", @@ -11908,7 +11753,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -11925,7 +11769,6 @@ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.0.tgz", "integrity": "sha512-4QO++yh9hMDiqAnPNHWQStxhTz1to6wG8hsPaviHjqOnlGQa34jrcS6gqciPZL6+xkd5qgIkZjmOTNNWNUFgqQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@tsconfig/node20": "20.1.6" }, @@ -11939,7 +11782,6 @@ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.1.1.tgz", "integrity": "sha512-zYuCH/QmDfh1F8S3+vz0GUjtAjvpKQdb6H41bhVuK+ZOQbhNWI8f+UdKXoCSOrtVK7dQ2R9uYm8hriJYLjadJw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/logger": "^2.0.2", "@appium/schema": "^1.0.0", @@ -11956,7 +11798,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", @@ -11971,7 +11812,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } @@ -11981,7 +11821,6 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.1.90" } @@ -11991,7 +11830,6 @@ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", "license": "MIT", - "peer": true, "dependencies": { "@so-ric/colorspace": "^1.1.6", "enabled": "2.0.x", @@ -12014,7 +11852,6 @@ "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=18" } @@ -12031,7 +11868,6 @@ "os": [ "darwin" ], - "peer": true, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -12054,7 +11890,6 @@ "os": [ "darwin" ], - "peer": true, "funding": { "url": "https://opencollective.com/libvips" } @@ -12085,7 +11920,6 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -12103,7 +11937,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12116,7 +11949,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -12135,7 +11967,6 @@ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=14" } @@ -12145,7 +11976,6 @@ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-4.0.0.tgz", "integrity": "sha512-rLZQkN6IfNwG6iqZZwqFMcs7DvQX3ZrLVhsHmSO1LUA4EZAz+VZLpTBCIOFsC5Qu3xuwzVfRMZ+1rtk/mCRRZw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "kleur": "^4.1.0" }, @@ -12161,7 +11991,6 @@ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", "license": "MIT", - "peer": true, "dependencies": { "color": "^5.0.2", "text-hex": "1.0.x" @@ -12171,29 +12000,25 @@ "version": "20.1.6", "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.6.tgz", "integrity": "sha512-sz+Hqx9zwZDpZIV871WSbUzSqNIsXzghZydypnfgzPKLltVJfkINfUeTct31n/tTSa9ZE1ZOfKdRre1uHHquYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@types/triple-beam": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/@xmldom/xmldom": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" } @@ -12203,7 +12028,6 @@ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -12216,7 +12040,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", - "peer": true, "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" @@ -12230,7 +12053,6 @@ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.0.0" }, @@ -12248,7 +12070,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12261,7 +12082,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -12278,7 +12098,6 @@ "integrity": "sha512-0XEpQ7kIAIMPHT4eZRuczfzZhh/X/n6+IGX7URSCSm67ppyPl0zZvS3ZzLHXdfBIPiQi4T00CT1Id/9Ni26wdQ==", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@appium/base-driver": "^10.1.1", "@appium/base-plugin": "^3.0.4", @@ -12323,7 +12142,6 @@ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-3.0.2.tgz", "integrity": "sha512-JyvPp0koEi9WVCrUYK8Rqg4G8Vxs+eY8XMpIjxJyGyG50UTo+u6CAfaWxCr5WW+ZvpMM3Qs2AFSdkS7SamQy3g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bluebird": "^3.7.2", "lodash": "^4.17.21", @@ -12340,7 +12158,6 @@ "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.2", "async": "^3.2.4", @@ -12359,7 +12176,6 @@ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "license": "MIT", - "peer": true, "dependencies": { "glob": "^10.0.0", "graceful-fs": "^4.2.0", @@ -12378,7 +12194,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -12388,7 +12203,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -12409,7 +12223,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -12424,15 +12237,13 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/archiver-utils/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12448,7 +12259,6 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -12464,22 +12274,19 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/appium-safari-driver/node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/async-lock": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/asyncbox": { "version": "3.0.0", @@ -12499,15 +12306,13 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/axios": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", - "peer": true, "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", @@ -12519,7 +12324,6 @@ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "react-native-b4a": "*" }, @@ -12533,15 +12337,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/bare-events": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -12569,22 +12371,19 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.1.2" }, @@ -12597,7 +12396,6 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">=0.6" } @@ -12607,7 +12405,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12619,7 +12416,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12640,7 +12436,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", @@ -12661,7 +12456,6 @@ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz", "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==", "license": "MIT", - "peer": true, "dependencies": { "stream-buffers": "2.2.x" } @@ -12671,7 +12465,6 @@ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", "license": "MIT", - "peer": true, "dependencies": { "big-integer": "1.6.x" }, @@ -12698,7 +12491,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12709,7 +12501,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -12725,7 +12516,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -12735,7 +12525,6 @@ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -12749,7 +12538,6 @@ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -12766,7 +12554,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -12783,7 +12570,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12796,7 +12582,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^3.1.0" }, @@ -12809,7 +12594,6 @@ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" }, @@ -12822,7 +12606,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", @@ -12837,7 +12620,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12849,15 +12631,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/cliui/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12875,7 +12655,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12893,7 +12672,6 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8" } @@ -12903,7 +12681,6 @@ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^3.1.3", "color-string": "^2.1.3" @@ -12917,7 +12694,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -12929,15 +12705,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/color-string": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12950,7 +12724,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12960,7 +12733,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", "license": "MIT", - "peer": true, "dependencies": { "color-name": "^2.0.0" }, @@ -12973,7 +12745,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12.20" } @@ -12983,7 +12754,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", - "peer": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -12996,7 +12766,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 6" } @@ -13006,7 +12775,6 @@ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", @@ -13023,7 +12791,6 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -13039,7 +12806,6 @@ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13053,7 +12819,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13063,7 +12828,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13073,7 +12837,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6.6.0" } @@ -13082,15 +12845,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "license": "Apache-2.0", - "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -13103,7 +12864,6 @@ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "license": "MIT", - "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^4.0.0" @@ -13117,7 +12877,6 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13131,15 +12890,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13155,7 +12912,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -13173,7 +12929,6 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", - "peer": true, "dependencies": { "clone": "^1.0.2" }, @@ -13186,7 +12941,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.4.0" } @@ -13196,7 +12950,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13207,7 +12960,6 @@ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "optional": true, - "peer": true, "engines": { "node": ">=8" } @@ -13217,15 +12969,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/diff": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -13235,7 +12985,6 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -13249,43 +12998,37 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/enabled": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13295,7 +13038,6 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "license": "MIT", - "peer": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -13305,7 +13047,6 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13315,7 +13056,6 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -13325,7 +13065,6 @@ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -13338,7 +13077,6 @@ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -13354,7 +13092,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13363,15 +13100,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13381,7 +13116,6 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -13391,7 +13125,6 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } @@ -13401,7 +13134,6 @@ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "bare-events": "^2.7.0" } @@ -13411,7 +13143,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.0", @@ -13460,8 +13191,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/fast-uri": { "version": "3.1.0", @@ -13485,7 +13215,6 @@ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13494,15 +13223,13 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -13524,7 +13251,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -13540,8 +13266,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/follow-redirects": { "version": "1.15.11", @@ -13554,7 +13279,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=4.0" }, @@ -13569,7 +13293,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "license": "ISC", - "peer": true, "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -13586,7 +13309,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -13599,7 +13321,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -13616,7 +13337,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13626,7 +13346,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13639,7 +13358,6 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -13649,7 +13367,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13658,7 +13375,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==", - "peer": true, "dependencies": { "readable-stream": "^1.0.31" }, @@ -13670,15 +13386,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ftp-response-parser/node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -13690,15 +13404,13 @@ "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13708,7 +13420,6 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -13718,7 +13429,6 @@ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -13731,7 +13441,6 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -13756,7 +13465,6 @@ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", - "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -13770,7 +13478,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -13783,7 +13490,6 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", @@ -13807,7 +13513,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13823,7 +13528,6 @@ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13835,23 +13539,20 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13861,7 +13562,6 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -13874,7 +13574,6 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", - "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -13890,7 +13589,6 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -13902,8 +13600,7 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/hpack.js": { "version": "2.1.6", @@ -13911,7 +13608,6 @@ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -13924,8 +13620,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", @@ -13933,7 +13628,6 @@ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -13950,7 +13644,6 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13960,15 +13653,13 @@ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", - "peer": true, "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", @@ -13988,15 +13679,13 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -14022,22 +13711,19 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/appium-safari-driver/node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -14046,15 +13732,13 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", - "peer": true, "dependencies": { "hasown": "^2.0.2" }, @@ -14070,7 +13754,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14080,7 +13763,6 @@ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14098,15 +13780,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -14119,7 +13799,6 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -14141,7 +13820,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -14156,15 +13834,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/jsftp": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^3.1.0", "ftp-response-parser": "^1.0.1", @@ -14182,7 +13858,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -14191,15 +13866,13 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "peer": true + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/appium-safari-driver/node_modules/json-schema-traverse": { "version": "1.0.0", @@ -14213,7 +13886,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz", "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14.14.0" } @@ -14223,7 +13895,6 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14232,15 +13903,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "license": "MIT", - "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -14252,15 +13921,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/lazystream/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "license": "MIT", - "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14276,7 +13943,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -14286,7 +13952,6 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "license": "MIT", - "peer": true, "engines": { "node": ">=14" }, @@ -14298,15 +13963,13 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -14322,7 +13985,6 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "license": "ISC", - "peer": true, "dependencies": { "signal-exit": "^3.0.2" } @@ -14344,7 +14006,6 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14361,7 +14022,6 @@ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -14388,7 +14048,6 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -14398,7 +14057,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14408,7 +14066,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -14421,7 +14078,6 @@ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "3.1.0", "methods": "~1.1.2", @@ -14437,7 +14093,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14446,15 +14101,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14464,7 +14117,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14474,7 +14126,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", - "peer": true, "dependencies": { "mime-db": "^1.54.0" }, @@ -14491,7 +14142,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -14501,8 +14151,7 @@ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/minipass": { "version": "7.1.2", @@ -14518,7 +14167,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -14528,7 +14176,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", - "peer": true, "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", @@ -14545,7 +14192,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -14554,15 +14200,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/morgan/node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14574,15 +14218,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/ncp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "license": "MIT", - "peer": true, "bin": { "ncp": "bin/ncp" } @@ -14592,7 +14234,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -14639,7 +14280,6 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14652,7 +14292,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver" } @@ -14662,7 +14301,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -14672,7 +14310,6 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -14685,15 +14322,13 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -14706,7 +14341,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14716,7 +14350,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", - "peer": true, "dependencies": { "wrappy": "1" } @@ -14726,7 +14359,6 @@ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "license": "MIT", - "peer": true, "dependencies": { "fn.name": "1.x.x" } @@ -14736,7 +14368,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14752,7 +14383,6 @@ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "license": "MIT", - "peer": true, "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -14776,7 +14406,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14786,7 +14415,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -14799,7 +14427,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14815,7 +14442,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -14831,7 +14457,6 @@ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz", "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==", "license": "ISC", - "peer": true, "dependencies": { "commander": "^6.2.0" }, @@ -14850,7 +14475,6 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14868,7 +14492,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==", - "peer": true, "engines": { "node": ">=0.6.21" } @@ -14878,7 +14501,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -14888,7 +14510,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14898,7 +14519,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -14907,8 +14527,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/path-scurry": { "version": "2.0.1", @@ -14931,7 +14550,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", "license": "MIT", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" @@ -14941,22 +14559,19 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/pkg-dir": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "license": "MIT", - "peer": true, "dependencies": { "find-up": "^5.0.0" }, @@ -14969,7 +14584,6 @@ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "license": "MIT", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", @@ -14984,7 +14598,6 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -15017,7 +14630,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6.0" } @@ -15026,15 +14638,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -15047,15 +14657,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.1.0" }, @@ -15071,7 +14679,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15081,7 +14688,6 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", @@ -15097,7 +14703,6 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -15114,7 +14719,6 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", - "peer": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -15130,7 +14734,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=8" } @@ -15140,7 +14743,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "license": "MIT", - "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -15171,7 +14773,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -15182,7 +14783,6 @@ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -15192,7 +14792,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -15202,7 +14801,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -15225,7 +14823,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", - "peer": true, "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", @@ -15246,7 +14843,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15256,7 +14852,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -15321,7 +14916,6 @@ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", @@ -15337,15 +14931,13 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/safe-stable-stringify": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -15354,15 +14946,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", "license": "WTFPL OR ISC", - "peer": true, "dependencies": { "truncate-utf8-bytes": "^1.0.0" } @@ -15372,8 +14962,7 @@ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/appium-safari-driver/node_modules/semver": { "version": "7.7.3", @@ -15392,7 +14981,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", @@ -15415,7 +15003,6 @@ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz", "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==", "license": "MIT", - "peer": true, "dependencies": { "etag": "~1.8.1", "fresh": "~0.5.2", @@ -15432,7 +15019,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -15455,15 +15041,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/serve-static": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -15484,8 +15068,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/sharp": { "version": "0.34.5", @@ -15494,7 +15077,6 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", @@ -15538,7 +15120,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15551,7 +15132,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15573,7 +15153,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -15593,7 +15172,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -15610,7 +15188,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15629,7 +15206,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -15648,8 +15224,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/source-map": { "version": "0.6.1", @@ -15675,7 +15250,6 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15685,15 +15259,13 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/appium-safari-driver/node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15703,8 +15275,7 @@ "version": "3.0.22", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/appium-safari-driver/node_modules/spdy": { "version": "4.0.2", @@ -15712,7 +15283,6 @@ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -15730,7 +15300,6 @@ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -15746,7 +15315,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -15761,7 +15329,6 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -15771,7 +15338,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -15781,7 +15347,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "license": "Unlicense", - "peer": true, "engines": { "node": ">= 0.10.0" } @@ -15791,7 +15356,6 @@ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "license": "MIT", - "peer": true, "dependencies": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -15802,7 +15366,6 @@ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "license": "MIT", - "peer": true, "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", @@ -15814,7 +15377,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -15837,15 +15399,13 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -15864,7 +15424,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15879,7 +15438,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15888,15 +15446,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15909,7 +15465,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -15926,7 +15481,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -15939,7 +15493,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15949,7 +15502,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15965,7 +15517,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -15978,7 +15529,6 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -15991,7 +15541,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "license": "MIT", - "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -16019,7 +15568,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "b4a": "^1.6.4" } @@ -16028,22 +15576,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -16053,7 +15598,6 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 14.0.0" } @@ -16063,7 +15607,6 @@ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", - "peer": true, "dependencies": { "utf8-byte-length": "^1.0.1" } @@ -16080,7 +15623,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.2.0.tgz", "integrity": "sha512-xxCJm+Bckc6kQBknN7i9fnP/xobQRsRQxR01CztFkp/h++yfVxUUcmMgfR2HttJx/dpWjS9ubVuyspJv24Q9DA==", "license": "(MIT OR CC0-1.0)", - "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -16096,7 +15638,6 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", - "peer": true, "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", @@ -16111,7 +15652,6 @@ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", "license": "MIT or GPL-2.0", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -16121,7 +15661,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16130,15 +15669,13 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "license": "(WTFPL OR MIT)", - "peer": true + "license": "(WTFPL OR MIT)" }, "node_modules/appium-safari-driver/node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/uuid": { "version": "13.0.0", @@ -16158,7 +15695,6 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -16169,7 +15705,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -16180,7 +15715,6 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -16190,7 +15724,6 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", - "peer": true, "dependencies": { "defaults": "^1.0.3" } @@ -16200,7 +15733,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "license": "ISC", - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -16216,7 +15748,6 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "license": "MIT", - "peer": true, "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.8", @@ -16239,7 +15770,6 @@ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "license": "MIT", - "peer": true, "dependencies": { "logform": "^2.7.0", "readable-stream": "^3.6.2", @@ -16254,7 +15784,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16269,7 +15798,6 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16284,7 +15812,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16303,7 +15830,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -16321,7 +15847,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16330,15 +15855,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16353,7 +15876,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16366,7 +15888,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -16375,15 +15896,13 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/wrap-ansi/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16398,7 +15917,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16410,15 +15928,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/appium-safari-driver/node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "license": "MIT", - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -16440,7 +15956,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "license": "MIT", - "peer": true, "engines": { "node": ">=8.0" } @@ -16450,7 +15965,6 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -16460,7 +15974,6 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "license": "ISC", - "peer": true, "bin": { "yaml": "bin.mjs" }, @@ -16473,7 +15986,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", @@ -16491,7 +16003,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "license": "ISC", - "peer": true, "engines": { "node": "^20.19.0 || ^22.12.0 || >=23" } @@ -16500,15 +16011,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/appium-safari-driver/node_modules/yargs/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -16526,7 +16035,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "license": "MIT", - "peer": true, "dependencies": { "buffer-crc32": "~0.2.3", "pend": "~1.2.0" @@ -16540,7 +16048,6 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", - "peer": true, "engines": { "node": "*" } @@ -16550,7 +16057,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -16563,7 +16069,6 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "license": "MIT", - "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -19614,6 +19119,7 @@ "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", "license": "MIT", + "peer": true, "engines": { "node": ">= 10.16.0" } diff --git a/core/src/scopes/cleanup.js b/core/src/scopes/cleanup.js index d23bf58..a909b13 100644 --- a/core/src/scopes/cleanup.js +++ b/core/src/scopes/cleanup.js @@ -103,20 +103,16 @@ function setupCleanupHandlers(config = { logLevel: 'info' }) { // Helper to run cleanup and then exit reliably const exitWithCleanup = (code, reason) => { - // Start cleanup and ensure we exit afterwards. Use finally-style behavior - // and a fallback timeout to avoid hanging indefinitely. - (async () => { - try { - await handleExit(reason); - } catch (err) { + handleExit(reason) + .catch((err) => { log(config, 'error', `Error during cleanup: ${err.stack || err}`); - } finally { - // allow stdio to flush then exit + }) + .finally(() => { + // Allow stdio to flush then exit setImmediate(() => process.exit(code)); - // force exit after 5s if something prevents exit + // Force exit after 5s if something prevents exit setTimeout(() => process.exit(code), 5000).unref(); - } - })(); + }); }; // SIGINT (Ctrl+C) diff --git a/core/src/scopes/waitUntil.js b/core/src/scopes/waitUntil.js index 5d1ff6b..399d3e7 100644 --- a/core/src/scopes/waitUntil.js +++ b/core/src/scopes/waitUntil.js @@ -73,32 +73,40 @@ function matchesCondition(output, condition) { * Waits for stdout/stderr conditions to be met by listening to streams. * * @param {object} options - Wait options - const stdoutListener = (chunk) => { - // append incoming chunk to buffer and test against the accumulated buffer - const full = scope.stdoutBuffer.join('\n'); - if (matchesCondition(full, conditions.stdout)) { - stdoutMet = true; - log(config, "info", `Stdout condition met: ${conditions.stdout}`); - - if (stderrMet) { - cleanup(); - resolve({ met: true }); - } + * @param {object} options.scope - The scope object with streams + * @param {object} options.conditions - Conditions to wait for + * @param {string} options.conditions.stdout - Stdout condition (optional) + * @param {string} options.conditions.stderr - Stderr condition (optional) + * @param {number} options.timeout - Timeout in milliseconds (default 30000) + * @param {object} options.config - Config for logging + * @returns {Promise} Resolves with {met: true} or rejects with timeout error + */ +async function waitForConditions({ scope, conditions, timeout = 30000, config }) { + // If no conditions specified, resolve immediately + if (!conditions || (!conditions.stdout && !conditions.stderr)) { + return { met: true }; + } + + return new Promise((resolve, reject) => { let stdoutMet = !conditions.stdout || conditions.stdout === ''; let stderrMet = !conditions.stderr || conditions.stderr === ''; let timeoutId; - const stderrListener = (chunk) => { - // append incoming chunk to buffer and test against the accumulated buffer - const full = scope.stderrBuffer.join('\n'); - if (matchesCondition(full, conditions.stderr)) { + // Check if already met from buffer + if (!stdoutMet && scope.stdoutBuffer) { + const stdoutContent = scope.stdoutBuffer.join('\n'); + if (matchesCondition(stdoutContent, conditions.stdout)) { + stdoutMet = true; + log(config, "debug", `Stdout condition already met in buffer: ${conditions.stdout}`); + } + } + + if (!stderrMet && scope.stderrBuffer) { + const stderrContent = scope.stderrBuffer.join('\n'); + if (matchesCondition(stderrContent, conditions.stderr)) { stderrMet = true; - log(config, "info", `Stderr condition met: ${conditions.stderr}`); - - if (stdoutMet) { - cleanup(); - resolve({ met: true }); - } + log(config, "debug", `Stderr condition already met in buffer: ${conditions.stderr}`); + } } // Check if all conditions already met @@ -116,13 +124,15 @@ function matchesCondition(output, condition) { reject(new Error(`Timeout waiting for conditions: ${unmetConditions.join(', ')}`)); }, timeout); - // Listen to stdout + // Listen to stdout - match against accumulated buffer to catch patterns spanning chunks const stdoutListener = (data) => { const chunk = data.toString(); log(config, "debug", `Stdout chunk: ${chunk.substring(0, 100)}...`); if (!stdoutMet && conditions.stdout) { - if (matchesCondition(chunk, conditions.stdout)) { + // Match against accumulated buffer to catch patterns spanning multiple chunks + const fullOutput = scope.stdoutBuffer.join('\n'); + if (matchesCondition(fullOutput, conditions.stdout)) { stdoutMet = true; log(config, "info", `Stdout condition met: ${conditions.stdout}`); @@ -134,13 +144,15 @@ function matchesCondition(output, condition) { } }; - // Listen to stderr + // Listen to stderr - match against accumulated buffer to catch patterns spanning chunks const stderrListener = (data) => { const chunk = data.toString(); log(config, "debug", `Stderr chunk: ${chunk.substring(0, 100)}...`); if (!stderrMet && conditions.stderr) { - if (matchesCondition(chunk, conditions.stderr)) { + // Match against accumulated buffer to catch patterns spanning multiple chunks + const fullOutput = scope.stderrBuffer.join('\n'); + if (matchesCondition(fullOutput, conditions.stderr)) { stderrMet = true; log(config, "info", `Stderr condition met: ${conditions.stderr}`); diff --git a/core/src/tests/typeKeys.js b/core/src/tests/typeKeys.js index 5c43624..a94add2 100644 --- a/core/src/tests/typeKeys.js +++ b/core/src/tests/typeKeys.js @@ -70,16 +70,43 @@ const specialKeyMap = { // Mapping of special keys to terminal control sequences for terminal scopes const specialKeyTerminalMap = { + // Basic control characters $ENTER$: '\r', $RETURN$: '\r', $TAB$: '\t', $BACKSPACE$: '\x7f', $ESCAPE$: '\x1b', $SPACE$: ' ', + // Arrow keys $ARROW_UP$: '\x1b[A', $ARROW_DOWN$: '\x1b[B', $ARROW_RIGHT$: '\x1b[C', $ARROW_LEFT$: '\x1b[D', + // Modifier keys (standalone escape sequences) + $CTRL$: '\x1b[17~', + $CONTROL$: '\x1b[17~', + $ALT$: '\x1b', + $SHIFT$: '\x1b[16~', + // Navigation keys + $HOME$: '\x1b[H', + $END$: '\x1b[F', + $PAGE_UP$: '\x1b[5~', + $PAGE_DOWN$: '\x1b[6~', + $INSERT$: '\x1b[2~', + $DELETE$: '\x1b[3~', + // Function keys (F1-F12) + $F1$: '\x1bOP', + $F2$: '\x1bOQ', + $F3$: '\x1bOR', + $F4$: '\x1bOS', + $F5$: '\x1b[15~', + $F6$: '\x1b[17~', + $F7$: '\x1b[18~', + $F8$: '\x1b[19~', + $F9$: '\x1b[20~', + $F10$: '\x1b[21~', + $F11$: '\x1b[23~', + $F12$: '\x1b[24~', }; // Type a sequence of keys in the active element. diff --git a/core/test/temp-all-contexts-skipped.json b/core/test/temp-all-contexts-skipped.json new file mode 100644 index 0000000..ceeef7a --- /dev/null +++ b/core/test/temp-all-contexts-skipped.json @@ -0,0 +1,24 @@ +{ + "id": "test-all-contexts-skipped", + "contexts": [ + { + "app": { + "name": "firefox" + }, + "platforms": [ + "windows" + ] + } + ], + "tests": [ + { + "id": "test-1", + "steps": [ + { + "action": "runShell", + "command": "echo 'This should not run'" + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-dom-timeout-test.json b/core/test/temp-dom-timeout-test.json new file mode 100644 index 0000000..6e2f7e2 --- /dev/null +++ b/core/test/temp-dom-timeout-test.json @@ -0,0 +1,17 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": { + "url": "http://localhost:8092/waitUntil-test-dom-mutations-forever.html", + "timeout": 5000, + "waitUntil": { + "domIdleTime": 500 + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-element-timeout-test.json b/core/test/temp-element-timeout-test.json new file mode 100644 index 0000000..ec4c584 --- /dev/null +++ b/core/test/temp-element-timeout-test.json @@ -0,0 +1,19 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": { + "url": "http://localhost:8092/index.html", + "timeout": 5000, + "waitUntil": { + "find": { + "selector": ".nonexistent-element-that-will-never-appear" + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-failure-test.json b/core/test/temp-failure-test.json new file mode 100644 index 0000000..516d8f3 --- /dev/null +++ b/core/test/temp-failure-test.json @@ -0,0 +1,14 @@ +{ + "tests": [ + { + "steps": [ + { + "runShell": "exit 1" + }, + { + "runShell": "echo 'This step should be skipped if the previous fails'" + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-initial-screenshot-test.json b/core/test/temp-initial-screenshot-test.json new file mode 100644 index 0000000..4edff59 --- /dev/null +++ b/core/test/temp-initial-screenshot-test.json @@ -0,0 +1,18 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": "http://localhost:8092" + }, + { + "screenshot": { + "path": "/Users/docdetective/Workspaces/.github/core/test/temp-regression-screenshot.png", + "maxVariation": 0.05, + "overwrite": "false" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-network-timeout-test.json b/core/test/temp-network-timeout-test.json new file mode 100644 index 0000000..75afdc6 --- /dev/null +++ b/core/test/temp-network-timeout-test.json @@ -0,0 +1,17 @@ +{ + "tests": [ + { + "steps": [ + { + "goTo": { + "url": "http://localhost:8092/waitUntil-test-network-forever.html", + "timeout": 5000, + "waitUntil": { + "networkIdleTime": 500 + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-regression-output.txt b/core/test/temp-regression-output.txt new file mode 100644 index 0000000..cbc4e2e --- /dev/null +++ b/core/test/temp-regression-output.txt @@ -0,0 +1 @@ +initial content \ No newline at end of file diff --git a/core/test/temp-regression-test.json b/core/test/temp-regression-test.json new file mode 100644 index 0000000..8262fe6 --- /dev/null +++ b/core/test/temp-regression-test.json @@ -0,0 +1,19 @@ +{ + "tests": [ + { + "steps": [ + { + "runShell": { + "command": "echo", + "args": [ + "completely different content" + ], + "path": "/Users/docdetective/Workspaces/.github/core/test/temp-regression-output.txt", + "maxVariation": 0.1, + "overwrite": "aboveVariation" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/core/test/temp-unsafe-test.json b/core/test/temp-unsafe-test.json new file mode 100644 index 0000000..d632fd9 --- /dev/null +++ b/core/test/temp-unsafe-test.json @@ -0,0 +1,12 @@ +{ + "tests": [ + { + "steps": [ + { + "runShell": "echo 'This step is unsafe'", + "unsafe": true + } + ] + } + ] +} \ No newline at end of file From 1485d1c26a6144e326df4859e107fb319daaa74c Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Tue, 16 Dec 2025 14:07:08 -0800 Subject: [PATCH 11/13] implement scope property for terminal management --- core/src/tests.js | 87 ++++++- core/src/tests/runCode.js | 12 +- core/src/tests/runShell.js | 100 ++++++++- core/src/tests/typeKeys.js | 57 ++++- core/test/core.test.js | 450 +++++++++++++++++++++++++++++++++++++ 5 files changed, 684 insertions(+), 22 deletions(-) diff --git a/core/src/tests.js b/core/src/tests.js index 5787966..61f1a8f 100644 --- a/core/src/tests.js +++ b/core/src/tests.js @@ -27,10 +27,83 @@ const { setAppiumHome } = require("./appium"); const { resolveExpression } = require("./expressions"); const { getEnvironment, getAvailableApps } = require("./config"); +class ScopeRegistry { + constructor() { + this.scopes = new Map(); + } + + has(name) { + return this.scopes.has(name); + } + + get(name) { + return this.scopes.get(name); + } + + create(name, process) { + if (this.scopes.has(name)) { + return this.scopes.get(name); + } + const scope = { + name, + process, + stdout: "", + stderr: "", + exitCode: null, + closed: false, + }; + + if (process) { + process.stdout?.on("data", (data) => { + scope.stdout += data.toString(); + }); + process.stderr?.on("data", (data) => { + scope.stderr += data.toString(); + }); + process.on("close", (code) => { + scope.exitCode = code; + scope.closed = true; + }); + process.on("error", (err) => { + scope.stderr += err.message; + scope.closed = true; + }); + } + + this.scopes.set(name, scope); + return scope; + } + + writeToScope(name, data) { + const scope = this.scopes.get(name); + if (!scope || !scope.process || scope.closed) { + return false; + } + try { + scope.process.stdin.write(data); + return true; + } catch (err) { + return false; + } + } + + async cleanup() { + for (const [name, scope] of this.scopes) { + if (scope.process && !scope.closed) { + try { + scope.process.kill("SIGTERM"); + } catch (err) { + } + } + } + this.scopes.clear(); + } +} + exports.runSpecs = runSpecs; exports.runViaApi = runViaApi; exports.getRunner = getRunner; -// exports.appiumStart = appiumStart; +exports.ScopeRegistry = ScopeRegistry; // exports.appiumIsReady = appiumIsReady; // exports.driverStart = driverStart; @@ -518,6 +591,7 @@ async function runSpecs({ resolvedTests }) { log(config, "debug", `CONTEXT:\n${JSON.stringify(context, null, 2)}`); let driver; + const scopeRegistry = new ScopeRegistry(); // Ensure context contains a 'steps' property if (!context.steps) { context.steps = []; @@ -646,6 +720,7 @@ async function runSpecs({ resolvedTests }) { step: step, driver: driver, metaValues: metaValues, + scopeRegistry: scopeRegistry, options: { openApiDefinitions: context.openApi || [], }, @@ -730,6 +805,9 @@ async function runSpecs({ resolvedTests }) { testReport.contexts.push(contextReport); report.summary.contexts[contextResult.toLowerCase()]++; + // Clean up scopes for this context + await scopeRegistry.cleanup(); + if (driverRequired) { // Close driver try { @@ -800,13 +878,13 @@ async function runSpecs({ resolvedTests }) { return report; } -// Run a specific step async function runStep({ config = {}, context = {}, step, driver, metaValues = {}, + scopeRegistry = null, options = {}, }) { let actionResult; @@ -861,9 +939,9 @@ async function runStep({ }); config.recording = actionResult.recording; } else if (typeof step.runCode !== "undefined") { - actionResult = await runCode({ config: config, step: step }); + actionResult = await runCode({ config: config, step: step, scopeRegistry: scopeRegistry }); } else if (typeof step.runShell !== "undefined") { - actionResult = await runShell({ config: config, step: step }); + actionResult = await runShell({ config: config, step: step, scopeRegistry: scopeRegistry }); } else if (typeof step.screenshot !== "undefined") { actionResult = await saveScreenshot({ config: config, @@ -875,6 +953,7 @@ async function runStep({ config: config, step: step, driver: driver, + scopeRegistry: scopeRegistry, }); } else if (typeof step.wait !== "undefined") { actionResult = await wait({ step: step, driver: driver }); diff --git a/core/src/tests/runCode.js b/core/src/tests/runCode.js index 5a745db..39333c2 100644 --- a/core/src/tests/runCode.js +++ b/core/src/tests/runCode.js @@ -7,7 +7,6 @@ const os = require("os"); exports.runCode = runCode; -// Create a temporary script file function createTempScript(code, language) { let extension; switch (language) { @@ -36,8 +35,7 @@ function createTempScript(code, language) { return tmpFile; } -// Run gather, compile, and run code. -async function runCode({ config, step }) { +async function runCode({ config, step, scopeRegistry = null }) { const result = { status: "PASS", description: "Executed code.", @@ -101,7 +99,6 @@ async function runCode({ config, step }) { return result; } - // Prepare shell command based on language const shellStep = { runShell: { command: @@ -113,10 +110,13 @@ async function runCode({ config, step }) { args: [scriptPath, ...step.runCode.args], }, }; + + if (step.runCode.scope) { + shellStep.runShell.scope = step.runCode.scope; + } delete shellStep.runCode; - // Execute script using runShell - const shellResult = await runShell({ config: config, step: shellStep }); + const shellResult = await runShell({ config: config, step: shellStep, scopeRegistry: scopeRegistry }); // Copy results result.status = shellResult.status; diff --git a/core/src/tests/runShell.js b/core/src/tests/runShell.js index 8e1925e..761dad6 100644 --- a/core/src/tests/runShell.js +++ b/core/src/tests/runShell.js @@ -6,11 +6,11 @@ const { } = require("../utils"); const fs = require("fs"); const path = require("path"); +const { spawn } = require("child_process"); exports.runShell = runShell; -// Run a shell command. -async function runShell({ config, step }) { +async function runShell({ config, step, scopeRegistry = null }) { // Promisify and execute command const result = { status: "PASS", @@ -48,7 +48,101 @@ async function runShell({ config, step }) { timeout: step.runShell.timeout || 60000, }; - // Execute command + const scopeName = step.runShell.scope; + if (scopeName && scopeRegistry) { + if (scopeRegistry.has(scopeName)) { + const existingScope = scopeRegistry.get(scopeName); + result.outputs.stdio.stdout = existingScope.stdout; + result.outputs.stdio.stderr = existingScope.stderr; + if (existingScope.exitCode !== null) { + result.outputs.exitCode = existingScope.exitCode; + } + result.description = `Interacted with existing scope '${scopeName}'.`; + + if (step.runShell.stdio) { + const combined = existingScope.stdout + existingScope.stderr; + if (step.runShell.stdio.startsWith("/") && step.runShell.stdio.endsWith("/")) { + const regex = new RegExp(step.runShell.stdio.slice(1, -1)); + if (!regex.test(combined)) { + result.status = "FAIL"; + result.description = `Couldn't find expected output (${step.runShell.stdio}) in scope '${scopeName}' output.`; + } + } else if (!combined.includes(step.runShell.stdio)) { + result.status = "FAIL"; + result.description = `Couldn't find expected output (${step.runShell.stdio}) in scope '${scopeName}' output.`; + } + } + return result; + } + + let shell = "bash"; + let shellArgs = ["-c"]; + if (process.platform === "win32") { + shell = "cmd"; + shellArgs = ["/c"]; + } + const fullCommand = [step.runShell.command, ...step.runShell.args].join(" "); + shellArgs.push(fullCommand); + + const spawnOptions = { + stdio: ["pipe", "pipe", "pipe"], + }; + if (process.platform === "win32") { + spawnOptions.shell = true; + spawnOptions.windowsHide = true; + } + if (step.runShell.workingDirectory) { + spawnOptions.cwd = step.runShell.workingDirectory; + } + + const childProcess = spawn(shell, shellArgs, spawnOptions); + scopeRegistry.create(scopeName, childProcess); + + const timeout = step.runShell.timeout; + const scopeObj = scopeRegistry.get(scopeName); + + await new Promise((resolve) => { + const checkComplete = setInterval(() => { + if (scopeObj.closed) { + clearInterval(checkComplete); + resolve(); + } + }, 50); + + setTimeout(() => { + clearInterval(checkComplete); + resolve(); + }, timeout); + }); + + result.outputs.stdio.stdout = scopeObj.stdout.replace(/\r$/, ""); + result.outputs.stdio.stderr = scopeObj.stderr.replace(/\r$/, ""); + result.outputs.exitCode = scopeObj.exitCode !== null ? scopeObj.exitCode : 0; + result.description = `Created scope '${scopeName}' and executed command.`; + + if (scopeObj.exitCode !== null && !step.runShell.exitCodes.includes(scopeObj.exitCode)) { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' returned exit code ${scopeObj.exitCode}. Expected one of ${JSON.stringify(step.runShell.exitCodes)}`; + return result; + } + + if (step.runShell.stdio) { + const combined = scopeObj.stdout + scopeObj.stderr; + if (step.runShell.stdio.startsWith("/") && step.runShell.stdio.endsWith("/")) { + const regex = new RegExp(step.runShell.stdio.slice(1, -1)); + if (!regex.test(combined)) { + result.status = "FAIL"; + result.description = `Couldn't find expected output (${step.runShell.stdio}) in scope '${scopeName}' output.`; + } + } else if (!combined.includes(step.runShell.stdio)) { + result.status = "FAIL"; + result.description = `Couldn't find expected output (${step.runShell.stdio}) in scope '${scopeName}' output.`; + } + } + + return result; + } + const timeout = step.runShell.timeout; const options = {}; if (step.runShell.workingDirectory) diff --git a/core/src/tests/typeKeys.js b/core/src/tests/typeKeys.js index c9f011c..174bb73 100644 --- a/core/src/tests/typeKeys.js +++ b/core/src/tests/typeKeys.js @@ -6,6 +6,16 @@ const { exports.typeKeys = typeKeys; +const terminalSpecialKeyMap = { + "$ENTER$": "\n", + "$RETURN$": "\n", + "$TAB$": "\t", + "$ESCAPE$": "\x1b", + "$BACKSPACE$": "\x7f", + "$CTRL$": "", + "$SPACE$": " ", +}; + const specialKeyMap = { $CTRL$: Key.Ctrl, $NULL$: Key.NULL, @@ -66,46 +76,75 @@ const specialKeyMap = { $ZANKAKU_HANDKAKU$: Key.ZenkakuHankaku, }; -// Type a sequence of keys in the active element. -async function typeKeys({ config, step, driver }) { +async function typeKeys({ config, step, driver, scopeRegistry = null }) { let result = { status: "PASS", description: "Typed keys." }; - // Validate step payload const isValidStep = validate({ schemaKey: "step_v3", object: step }); if (!isValidStep.valid) { result.status = "FAIL"; result.description = `Invalid step definition: ${isValidStep.errors}`; return result; } - // Accept coerced and defaulted values step = isValidStep.object; - // Convert to array if (typeof step.type === "string") { step.type = [step.type]; } - // Convert to object if (Array.isArray(step.type)) { step.type = { keys: step.type }; } - // Convert keys property to object if (typeof step.type.keys === "string") { step.type.keys = [step.type.keys]; } - // Set default values step.type = { ...step.type, keys: step.type.keys || [], inputDelay: step.type.inputDelay || 100, }; - // Skip if no keys to type if (!step.type.keys.length) { result.status = "SKIPPED"; result.description = "No keys to type."; return result; } + const scopeName = step.type.scope; + if (scopeName) { + if (!scopeRegistry || !scopeRegistry.has(scopeName)) { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' does not exist. Create it with a runShell or runCode step first.`; + return result; + } + + const scope = scopeRegistry.get(scopeName); + if (scope.closed) { + result.status = "FAIL"; + result.description = `Scope '${scopeName}' has already closed.`; + return result; + } + + let inputData = ""; + for (const key of step.type.keys) { + if (terminalSpecialKeyMap[key]) { + inputData += terminalSpecialKeyMap[key]; + } else if (key.startsWith("$") && key.endsWith("$")) { + inputData += key; + } else { + inputData += key; + } + } + + const success = scopeRegistry.writeToScope(scopeName, inputData); + if (!success) { + result.status = "FAIL"; + result.description = `Failed to write to scope '${scopeName}'.`; + return result; + } + + result.description = `Typed keys to scope '${scopeName}'.`; + return result; + } + // Find element to type into if any criteria are specified let element = null; const hasElementCriteria = step.type.selector || step.type.elementText || diff --git a/core/test/core.test.js b/core/test/core.test.js index 144473f..cff12e8 100644 --- a/core/test/core.test.js +++ b/core/test/core.test.js @@ -823,3 +823,453 @@ describe("getRunner() function", function () { } }); }); + +// ============================================================================= +// SCOPE PROPERTY TESTS +// Tests for the `scope` property on runShell, runCode, and type actions. +// The scope property enables: +// - runShell/runCode: Create named terminal scopes for long-running/parallel processes +// - type: Send input to an existing terminal scope +// ============================================================================= + +describe("Scope property for terminal management", function () { + this.timeout(0); // Indefinite timeout for browser/process operations + + describe("runShell with scope", function () { + it("should accept scope property in runShell step", async () => { + // Test that the schema accepts the scope property + const scopeTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'Hello from scope'", + scope: "my-test-scope", + exitCodes: [0], + stdio: "Hello from scope" + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-runshell-basic.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(scopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + // At minimum, the step should not fail due to invalid schema + assert.notEqual(result, null, "Result should not be null"); + // Step should pass (scope property accepted even if not yet fully implemented) + assert.equal(result.summary.specs.fail, 0, "Spec should not fail"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should create a named scope for a background process", async () => { + // This test verifies that runShell with scope creates a persistent process + // that can be interacted with later + const backgroundScopeTest = { + tests: [ + { + steps: [ + { + // Start a background process that waits for input + runShell: { + command: "cat", + scope: "background-cat", + timeout: 1000 // Short timeout since cat will wait indefinitely + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-background.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(backgroundScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + // When scope is properly implemented, the process should be created + // and managed in background without blocking + assert.notEqual(result, null, "Result should not be null"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should allow referencing an existing scope from another runShell step", async () => { + // This test verifies scope persistence across steps + const persistentScopeTest = { + tests: [ + { + steps: [ + { + // Create a scope + runShell: { + command: "echo 'Scope initialized'", + scope: "persistent-scope", + exitCodes: [0] + } + }, + { + // Reference the same scope + runShell: { + command: "echo 'Using same scope'", + scope: "persistent-scope", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-persistent.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(persistentScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + // Both steps should pass + assert.equal(result.summary.steps.fail, 0, "No steps should fail"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + }); + + describe("runCode with scope", function () { + it("should accept scope property in runCode step", async () => { + const scopeCodeTest = { + tests: [ + { + steps: [ + { + runCode: { + language: "javascript", + code: "console.log('Hello from code scope');", + scope: "code-scope", + exitCodes: [0], + stdio: "Hello from code scope" + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-runcode-basic.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(scopeCodeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + // Step should pass (scope property accepted) + assert.equal(result.summary.specs.fail, 0, "Spec should not fail"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should create a named scope for runCode background process", async () => { + const backgroundCodeTest = { + tests: [ + { + steps: [ + { + runCode: { + language: "javascript", + code: "setInterval(() => {}, 1000); console.log('Background started');", + scope: "js-background", + timeout: 2000 + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-runcode-background.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(backgroundCodeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + }); + + describe("type with scope", function () { + it("should fail when referencing a non-existent scope", async () => { + // Per schema: "If the specified scope doesn't exist, the step fails." + const nonExistentScopeTest = { + tests: [ + { + steps: [ + { + type: { + keys: ["hello"], + scope: "non-existent-scope" + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-type-nonexistent.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(nonExistentScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + // The step should fail because the scope doesn't exist + assert.equal(result.summary.steps.fail, 1, "Step should fail for non-existent scope"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should send input to an existing terminal scope", async () => { + // This test creates a scope with runShell and then sends input via type + const typeToScopeTest = { + tests: [ + { + steps: [ + { + // Start a process that reads stdin + runShell: { + command: "cat", + scope: "input-receiver", + timeout: 5000 + } + }, + { + // Send input to the scope + type: { + keys: ["hello world", "$ENTER$"], + scope: "input-receiver" + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-type-to-scope.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(typeToScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + }); + + describe("Scope lifecycle management", function () { + it("should cleanup scopes after test completion", async () => { + // Scopes should be cleaned up when a test completes to avoid resource leaks + const scopeCleanupTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'cleanup test'", + scope: "cleanup-scope", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-cleanup.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(scopeCleanupTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + // Test passes without hanging (scope cleanup worked) + assert.equal(result.summary.specs.fail, 0, "Spec should pass"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should isolate scopes between different tests", async () => { + const isolatedScopesTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'test 1'", + scope: "shared-name", + exitCodes: [0] + } + } + ] + }, + { + steps: [ + { + runShell: { + command: "echo 'test 2'", + scope: "shared-name", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-isolation.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(isolatedScopesTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + assert.equal(result.summary.tests.fail, 0, "No tests should fail"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + }); + + describe("Scope edge cases", function () { + it("should handle empty scope name gracefully", async () => { + const emptyScopeTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'empty scope'", + scope: "", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-empty.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(emptyScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should handle special characters in scope name", async () => { + const specialCharScopeTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'special chars'", + scope: "my-scope_123.test", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-special-chars.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(specialCharScopeTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + assert.equal(result.summary.specs.fail, 0, "Spec should pass"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + + it("should handle multiple concurrent scopes", async () => { + const concurrentScopesTest = { + tests: [ + { + steps: [ + { + runShell: { + command: "echo 'scope A'", + scope: "concurrent-a", + exitCodes: [0] + } + }, + { + runShell: { + command: "echo 'scope B'", + scope: "concurrent-b", + exitCodes: [0] + } + }, + { + runShell: { + command: "echo 'scope C'", + scope: "concurrent-c", + exitCodes: [0] + } + } + ] + } + ] + }; + + const tempFilePath = path.resolve("./test/temp-scope-concurrent.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(concurrentScopesTest, null, 2)); + const config = { input: tempFilePath, logLevel: "silent" }; + + let result; + try { + result = await runTests(config); + assert.notEqual(result, null, "Result should not be null"); + assert.equal(result.summary.steps.fail, 0, "All steps should pass"); + } finally { + fs.unlinkSync(tempFilePath); + } + }); + }); +}); From 8385ed40f5502e9808a48515f7eff6108d1a1613 Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 5 Jan 2026 15:40:15 -0800 Subject: [PATCH 12/13] fix: address PR review comments - Replace hardcoded absolute paths with relative paths in test files - Update regex flags documentation to include 'd' flag in waitUntil.js - Document potential race condition in waitForConditions() --- core/src/scopes/waitUntil.js | 8 +++++++- core/test/temp-initial-screenshot-test.json | 2 +- core/test/temp-regression-test.json | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/src/scopes/waitUntil.js b/core/src/scopes/waitUntil.js index 399d3e7..b477379 100644 --- a/core/src/scopes/waitUntil.js +++ b/core/src/scopes/waitUntil.js @@ -8,7 +8,7 @@ exports.waitForConditions = waitForConditions; /** * Checks if a pattern string represents a regex pattern. * Regex patterns must start and end with '/' and the last '/' must be at the end or followed only by flags. - * Valid flags are: g, i, m, u, y, s + * Valid flags are: g, i, m, u, y, s, d * * @param {string} pattern - The pattern to check * @returns {boolean} True if pattern is a regex @@ -72,6 +72,12 @@ function matchesCondition(output, condition) { /** * Waits for stdout/stderr conditions to be met by listening to streams. * + * Note: There is a potential race condition between the initial buffer check and listener + * attachment. If data arrives after the buffer check but before listeners are attached, + * it will be added to the buffer but won't trigger a condition check until the next chunk + * arrives. This is a known limitation that should be acceptable for most use cases since + * the pattern will still be detected when subsequent data arrives. + * * @param {object} options - Wait options * @param {object} options.scope - The scope object with streams * @param {object} options.conditions - Conditions to wait for diff --git a/core/test/temp-initial-screenshot-test.json b/core/test/temp-initial-screenshot-test.json index 4edff59..bea481a 100644 --- a/core/test/temp-initial-screenshot-test.json +++ b/core/test/temp-initial-screenshot-test.json @@ -7,7 +7,7 @@ }, { "screenshot": { - "path": "/Users/docdetective/Workspaces/.github/core/test/temp-regression-screenshot.png", + "path": "core/test/artifacts/temp-regression-screenshot.png", "maxVariation": 0.05, "overwrite": "false" } diff --git a/core/test/temp-regression-test.json b/core/test/temp-regression-test.json index 8262fe6..6791447 100644 --- a/core/test/temp-regression-test.json +++ b/core/test/temp-regression-test.json @@ -8,7 +8,7 @@ "args": [ "completely different content" ], - "path": "/Users/docdetective/Workspaces/.github/core/test/temp-regression-output.txt", + "path": "core/test/temp-regression-output.txt", "maxVariation": 0.1, "overwrite": "aboveVariation" } From 1a6d66ae2dbab11bd628eee1820e61ae9ce70d7f Mon Sep 17 00:00:00 2001 From: hawkeyexl Date: Mon, 5 Jan 2026 17:57:58 -0800 Subject: [PATCH 13/13] chore: update dependencies and improve scope management - Bump node-pty version to ^1.1.0 in package.json. - Add detailed comments for code scopes in index.js. - Implement line ending normalization in registry.js. - Enhance error handling for scope registration in registry.js. - Clean up stream listeners in removeScope function to prevent memory leaks. - Update runShell function to accept unused parameters for future scope-based commands. - Refactor tests to improve clarity and accuracy in core.test.js. --- core/package.json | 2 +- core/src/scopes/index.js | 4 ++- core/src/scopes/registry.js | 67 +++++++++++++++++++++++++++++++------ core/src/tests/runCode.js | 9 ++--- core/src/tests/runShell.js | 4 ++- core/test/core.test.js | 16 +++++---- 6 files changed, 75 insertions(+), 27 deletions(-) diff --git a/core/package.json b/core/package.json index 939c592..df6071a 100644 --- a/core/package.json +++ b/core/package.json @@ -42,7 +42,7 @@ "geckodriver": "^6.1.0", "jq-web": "^0.6.2", "json-schema-faker": "^0.5.9", - "node-pty": "^0.10.1", + "node-pty": "^1.1.0", "pixelmatch": "^7.1.0", "pngjs": "^7.0.0", "posthog-node": "^5.18.1", diff --git a/core/src/scopes/index.js b/core/src/scopes/index.js index e54925f..f196046 100644 --- a/core/src/scopes/index.js +++ b/core/src/scopes/index.js @@ -6,7 +6,9 @@ module.exports = { // Terminal scopes ...require('./terminal'), - // Code scopes (future) + // Code scopes - PLACEHOLDER: These functions throw "not implemented" errors. + // They are exported for API completeness and future implementation. + // See code.js for details. ...require('./code'), // WaitUntil utilities diff --git a/core/src/scopes/registry.js b/core/src/scopes/registry.js index edeb1e2..4be3c51 100644 --- a/core/src/scopes/registry.js +++ b/core/src/scopes/registry.js @@ -36,6 +36,17 @@ function validateScopeName(name) { return { valid: true }; } +/** + * Normalizes line endings for cross-platform support. + * Handles both \r\n (Windows) and \n (Unix) line endings. + * + * @param {string} text - Text to normalize + * @returns {string[]} Array of lines + */ +function splitLines(text) { + return text.toString().replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n'); +} + /** * Registers a new scope in the global registry. * @@ -50,6 +61,7 @@ function validateScopeName(name) { * @param {string} scopeData.workingDir - Working directory * @param {string} scopeData.testId - Test identifier * @param {object} config - Config for logging + * @throws {Error} If scope name is invalid or scope already exists */ function registerScope(name, scopeData, config) { const validation = validateScopeName(name); @@ -57,35 +69,51 @@ function registerScope(name, scopeData, config) { throw new Error(validation.error); } - // Initialize buffers + // Prevent silent overwriting of existing scopes + if (scopes.has(name)) { + throw new Error(`Scope '${name}' already exists. Use a different name or terminate the existing scope first.`); + } + + // Initialize buffers and listener references for cleanup scopeData.stdoutBuffer = []; scopeData.stderrBuffer = []; scopeData.createdAt = Date.now(); + scopeData._listeners = { stdout: null, stderr: null, stdoutError: null, stderrError: null }; // Set up buffer management for stdout if (scopeData.stdout) { - scopeData.stdout.on('data', (data) => { - const lines = data.toString().split('\n'); + scopeData._listeners.stdout = (data) => { + const lines = splitLines(data); scopeData.stdoutBuffer.push(...lines); // Trim buffer if needed if (scopeData.stdoutBuffer.length > MAX_BUFFER_SIZE) { scopeData.stdoutBuffer = scopeData.stdoutBuffer.slice(-MAX_BUFFER_SIZE); } - }); + }; + scopeData._listeners.stdoutError = (err) => { + log(config, "warn", `Stdout stream error for scope '${name}': ${err.message}`); + }; + scopeData.stdout.on('data', scopeData._listeners.stdout); + scopeData.stdout.on('error', scopeData._listeners.stdoutError); } // Set up buffer management for stderr if (scopeData.stderr) { - scopeData.stderr.on('data', (data) => { - const lines = data.toString().split('\n'); + scopeData._listeners.stderr = (data) => { + const lines = splitLines(data); scopeData.stderrBuffer.push(...lines); // Trim buffer if needed if (scopeData.stderrBuffer.length > MAX_BUFFER_SIZE) { scopeData.stderrBuffer = scopeData.stderrBuffer.slice(-MAX_BUFFER_SIZE); } - }); + }; + scopeData._listeners.stderrError = (err) => { + log(config, "warn", `Stderr stream error for scope '${name}': ${err.message}`); + }; + scopeData.stderr.on('data', scopeData._listeners.stderr); + scopeData.stderr.on('error', scopeData._listeners.stderrError); } scopes.set(name, scopeData); @@ -114,23 +142,42 @@ function hasScope(name) { /** * Removes a scope from the registry. + * Cleans up stream listeners to prevent memory leaks. * * @param {string} name - The scope name * @param {object} config - Config for logging */ function removeScope(name, config) { - if (scopes.delete(name)) { + const scopeData = scopes.get(name); + if (scopeData) { + // Clean up listeners to prevent memory leaks + if (scopeData._listeners) { + if (scopeData.stdout && scopeData._listeners.stdout) { + scopeData.stdout.removeListener('data', scopeData._listeners.stdout); + } + if (scopeData.stdout && scopeData._listeners.stdoutError) { + scopeData.stdout.removeListener('error', scopeData._listeners.stdoutError); + } + if (scopeData.stderr && scopeData._listeners.stderr) { + scopeData.stderr.removeListener('data', scopeData._listeners.stderr); + } + if (scopeData.stderr && scopeData._listeners.stderrError) { + scopeData.stderr.removeListener('error', scopeData._listeners.stderrError); + } + } + scopes.delete(name); log(config, "debug", `Removed scope from registry: ${name}`); } } /** * Gets all scopes in the registry. + * Returns a defensive copy to prevent external modification of internal state. * - * @returns {Map} The scopes map + * @returns {Map} Copy of the scopes map */ function getAllScopes() { - return scopes; + return new Map(scopes); } /** diff --git a/core/src/tests/runCode.js b/core/src/tests/runCode.js index a93bac6..012bb4a 100644 --- a/core/src/tests/runCode.js +++ b/core/src/tests/runCode.js @@ -109,17 +109,12 @@ async function runCode({ config, step }) { ? "node" : "bash", args: [scriptPath, ...step.runCode.args], - scope: step.runCode.scope, // Pass through scope - waitUntil: step.runCode.waitUntil, // Pass through waitUntil + scope: step.runCode.scope, + waitUntil: step.runCode.waitUntil, workingDirectory: step.runCode.workingDirectory, timeout: step.runCode.timeout, }, }; - - if (step.runCode.scope) { - shellStep.runShell.scope = step.runCode.scope; - } - delete shellStep.runCode; // Execute script using runShell const shellResult = await runShell({ config: config, step: shellStep }); diff --git a/core/src/tests/runShell.js b/core/src/tests/runShell.js index 8e1925e..f63cdbb 100644 --- a/core/src/tests/runShell.js +++ b/core/src/tests/runShell.js @@ -10,7 +10,9 @@ const path = require("path"); exports.runShell = runShell; // Run a shell command. -async function runShell({ config, step }) { +// Note: scopeRegistry and test are passed from tests.js but currently unused. +// For scope-based commands with persistent sessions, use createTerminalScope from scopes/terminal.js +async function runShell({ config, step, test = null, scopeRegistry = null }) { // Promisify and execute command const result = { status: "PASS", diff --git a/core/test/core.test.js b/core/test/core.test.js index cff12e8..310a4ff 100644 --- a/core/test/core.test.js +++ b/core/test/core.test.js @@ -1166,7 +1166,7 @@ describe("Scope property for terminal management", function () { }); describe("Scope edge cases", function () { - it("should handle empty scope name gracefully", async () => { + it("should reject empty scope name with validation error", async () => { const emptyScopeTest = { tests: [ { @@ -1191,20 +1191,22 @@ describe("Scope property for terminal management", function () { try { result = await runTests(config); assert.notEqual(result, null, "Result should not be null"); + // Empty scope name should fail schema validation + assert.equal(result.summary.tests.fail, 1, "Test with empty scope should fail"); } finally { fs.unlinkSync(tempFilePath); } }); - it("should handle special characters in scope name", async () => { - const specialCharScopeTest = { + it("should handle valid scope names with hyphens and underscores", async () => { + const validScopeTest = { tests: [ { steps: [ { runShell: { - command: "echo 'special chars'", - scope: "my-scope_123.test", + command: "echo 'valid scope'", + scope: "my-scope_123-test", exitCodes: [0] } } @@ -1213,8 +1215,8 @@ describe("Scope property for terminal management", function () { ] }; - const tempFilePath = path.resolve("./test/temp-scope-special-chars.json"); - fs.writeFileSync(tempFilePath, JSON.stringify(specialCharScopeTest, null, 2)); + const tempFilePath = path.resolve("./test/temp-scope-valid-chars.json"); + fs.writeFileSync(tempFilePath, JSON.stringify(validScopeTest, null, 2)); const config = { input: tempFilePath, logLevel: "silent" }; let result;