opensteer 0.9.6 → 0.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/{chunk-3I3A5OLB.js → chunk-BPGXP3RF.js} +257 -24
- package/dist/chunk-BPGXP3RF.js.map +1 -0
- package/dist/{chunk-3XBQRZZC.js → chunk-EXXRLPLI.js} +158 -46
- package/dist/chunk-EXXRLPLI.js.map +1 -0
- package/dist/{chunk-T5P2QGZ3.js → chunk-GKYBP3KD.js} +154 -13
- package/dist/chunk-GKYBP3KD.js.map +1 -0
- package/dist/{chunk-BVRIPCWA.js → chunk-LFWP5RXF.js} +500 -513
- package/dist/chunk-LFWP5RXF.js.map +1 -0
- package/dist/{chunk-L4NF74KI.js → chunk-SOJEWKSW.js} +5 -5
- package/dist/{chunk-L4NF74KI.js.map → chunk-SOJEWKSW.js.map} +1 -1
- package/dist/cli/bin.cjs +1230 -660
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.js +166 -72
- package/dist/cli/bin.js.map +1 -1
- package/dist/index.cjs +793 -565
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -51
- package/dist/index.d.ts +36 -51
- package/dist/index.js +4 -4
- package/dist/local-view/public/assets/app.js +10 -1
- package/dist/local-view/serve-entry.cjs +1022 -591
- package/dist/local-view/serve-entry.cjs.map +1 -1
- package/dist/local-view/serve-entry.js +2 -2
- package/dist/opensteer-XLPY343Y.js +6 -0
- package/dist/{opensteer-UGA6YBRN.js.map → opensteer-XLPY343Y.js.map} +1 -1
- package/dist/{session-control-U3L5H2ZI.js → session-control-FVKKD45R.js} +4 -4
- package/dist/{session-control-U3L5H2ZI.js.map → session-control-FVKKD45R.js.map} +1 -1
- package/package.json +5 -5
- package/skills/recorder/SKILL.md +2 -2
- package/dist/chunk-3I3A5OLB.js.map +0 -1
- package/dist/chunk-3XBQRZZC.js.map +0 -1
- package/dist/chunk-BVRIPCWA.js.map +0 -1
- package/dist/chunk-T5P2QGZ3.js.map +0 -1
- package/dist/opensteer-UGA6YBRN.js +0 -6
package/dist/cli/bin.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { runLocalViewService } from '../chunk-
|
|
3
|
-
import { createOpensteerSemanticRuntime, dispatchSemanticOperation, isBrowserCoreError, loadEnvironment, normalizeOpensteerProviderMode, resolveOpensteerRuntimeConfig, assertProviderSupportsEngine, resolveOpensteerProvider, requireCloudAppBaseUrl, CloudSessionProxy, FlowRecorderCollector, generateReplayScript, OpensteerCloudClient } from '../chunk-
|
|
4
|
-
import { isOpensteerProtocolError, OpensteerBrowserManager, stopLocalViewService, setLocalViewMode, ensureLocalViewServiceRunning, buildLocalViewSessionUrl, resolveOpensteerEngineName, resolveFilesystemWorkspacePath } from '../chunk-
|
|
5
|
-
import { discoverLocalCdpBrowsers, inspectCdpEndpoint, readPersistedLocalBrowserSessionRecord, isProcessRunning,
|
|
2
|
+
import { runLocalViewService } from '../chunk-BPGXP3RF.js';
|
|
3
|
+
import { createOpensteerSemanticRuntime, dispatchSemanticOperation, isBrowserCoreError, loadEnvironment, normalizeOpensteerProviderMode, resolveOpensteerRuntimeConfig, assertProviderSupportsEngine, resolveOpensteerProvider, requireCloudAppBaseUrl, CloudSessionProxy, FlowRecorderCollector, generateReplayScript, OpensteerCloudClient } from '../chunk-LFWP5RXF.js';
|
|
4
|
+
import { isOpensteerProtocolError, OpensteerBrowserManager, stopLocalViewService, setLocalViewMode, ensureLocalViewServiceRunning, buildLocalViewSessionUrl, resolveOpensteerEngineName, resolveFilesystemWorkspacePath } from '../chunk-EXXRLPLI.js';
|
|
5
|
+
import { discoverLocalCdpBrowsers, inspectCdpEndpoint, readPersistedLocalBrowserSessionRecord, getPersistedLocalBrowserSessionOwnership, isAttachedLocalBrowserSessionReachable, isProcessRunning, buildLocalViewSessionIdForRecord, pathExists, readPersistedCloudSessionRecord } from '../chunk-GKYBP3KD.js';
|
|
6
6
|
import process4 from 'process';
|
|
7
7
|
import { mkdir, writeFile } from 'fs/promises';
|
|
8
8
|
import path2 from 'path';
|
|
@@ -14,7 +14,7 @@ import { fileURLToPath } from 'url';
|
|
|
14
14
|
|
|
15
15
|
// package.json
|
|
16
16
|
var package_default = {
|
|
17
|
-
version: "0.9.
|
|
17
|
+
version: "0.9.8"};
|
|
18
18
|
|
|
19
19
|
// src/cli/env-loader.ts
|
|
20
20
|
async function loadCliEnvironment(cwd) {
|
|
@@ -656,14 +656,22 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
656
656
|
return parsed.rest[0] === void 0 ? {} : { mode: parsed.rest[0] };
|
|
657
657
|
case "page.evaluate":
|
|
658
658
|
if (parsed.rest[0] === void 0) {
|
|
659
|
-
throw new CliError(
|
|
659
|
+
throw new CliError(
|
|
660
|
+
"missing_arguments",
|
|
661
|
+
"evaluate requires a script.",
|
|
662
|
+
CLI_USAGE_HINTS[operation]
|
|
663
|
+
);
|
|
660
664
|
}
|
|
661
665
|
return {
|
|
662
666
|
script: joinRest(parsed.rest, 0)
|
|
663
667
|
};
|
|
664
668
|
case "page.add-init-script":
|
|
665
669
|
if (parsed.rest[0] === void 0) {
|
|
666
|
-
throw new CliError(
|
|
670
|
+
throw new CliError(
|
|
671
|
+
"missing_arguments",
|
|
672
|
+
"init-script requires a script.",
|
|
673
|
+
CLI_USAGE_HINTS[operation]
|
|
674
|
+
);
|
|
667
675
|
}
|
|
668
676
|
return {
|
|
669
677
|
script: joinRest(parsed.rest, 0)
|
|
@@ -679,7 +687,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
679
687
|
return buildElementTargetInput(parsed, "hover");
|
|
680
688
|
case "dom.input": {
|
|
681
689
|
if (parsed.rest[1] === void 0) {
|
|
682
|
-
throw new CliError(
|
|
690
|
+
throw new CliError(
|
|
691
|
+
"missing_arguments",
|
|
692
|
+
"input requires an element number and text.",
|
|
693
|
+
CLI_USAGE_HINTS[operation]
|
|
694
|
+
);
|
|
683
695
|
}
|
|
684
696
|
const pressEnter = readOptionalBoolean(parsed.rawOptions, "press-enter");
|
|
685
697
|
return {
|
|
@@ -710,7 +722,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
710
722
|
}
|
|
711
723
|
case "dom.extract": {
|
|
712
724
|
if (parsed.rest[0] === void 0) {
|
|
713
|
-
throw new CliError(
|
|
725
|
+
throw new CliError(
|
|
726
|
+
"missing_arguments",
|
|
727
|
+
"extract requires a template.",
|
|
728
|
+
CLI_USAGE_HINTS[operation]
|
|
729
|
+
);
|
|
714
730
|
}
|
|
715
731
|
const persist = readPersistKey(parsed, "extract");
|
|
716
732
|
return {
|
|
@@ -746,7 +762,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
746
762
|
}
|
|
747
763
|
case "network.detail": {
|
|
748
764
|
if (parsed.rest[0] === void 0) {
|
|
749
|
-
throw new CliError(
|
|
765
|
+
throw new CliError(
|
|
766
|
+
"missing_arguments",
|
|
767
|
+
"network detail requires a record id.",
|
|
768
|
+
CLI_USAGE_HINTS[operation]
|
|
769
|
+
);
|
|
750
770
|
}
|
|
751
771
|
const probeFlag = readOptionalBoolean(parsed.rawOptions, "probe");
|
|
752
772
|
return {
|
|
@@ -757,7 +777,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
757
777
|
case "session.fetch": {
|
|
758
778
|
const url = parsed.rest[0];
|
|
759
779
|
if (url === void 0) {
|
|
760
|
-
throw new CliError(
|
|
780
|
+
throw new CliError(
|
|
781
|
+
"missing_arguments",
|
|
782
|
+
"fetch requires a URL.",
|
|
783
|
+
CLI_USAGE_HINTS[operation]
|
|
784
|
+
);
|
|
761
785
|
}
|
|
762
786
|
const bodyJson = readJsonValue(parsed.rawOptions, "body");
|
|
763
787
|
const bodyText = readSingle(parsed.rawOptions, "body-text");
|
|
@@ -796,7 +820,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
796
820
|
const siteKey = readSingle(parsed.rawOptions, "site-key");
|
|
797
821
|
const pageUrl = readSingle(parsed.rawOptions, "page-url");
|
|
798
822
|
if (provider === void 0 || apiKey === void 0) {
|
|
799
|
-
throw new CliError(
|
|
823
|
+
throw new CliError(
|
|
824
|
+
"missing_arguments",
|
|
825
|
+
'captcha solve requires "--provider" and "--api-key".',
|
|
826
|
+
CLI_USAGE_HINTS[operation]
|
|
827
|
+
);
|
|
800
828
|
}
|
|
801
829
|
return {
|
|
802
830
|
provider: readCaptchaProvider(provider),
|
|
@@ -826,7 +854,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
826
854
|
case "scripts.beautify":
|
|
827
855
|
case "scripts.deobfuscate": {
|
|
828
856
|
if (parsed.rest[0] === void 0) {
|
|
829
|
-
throw new CliError(
|
|
857
|
+
throw new CliError(
|
|
858
|
+
"missing_arguments",
|
|
859
|
+
`${parsed.command.join(" ")} requires an artifact id.`,
|
|
860
|
+
CLI_USAGE_HINTS[operation]
|
|
861
|
+
);
|
|
830
862
|
}
|
|
831
863
|
const persist = readOptionalBoolean(parsed.rawOptions, "persist");
|
|
832
864
|
return {
|
|
@@ -836,7 +868,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
836
868
|
}
|
|
837
869
|
case "scripts.sandbox":
|
|
838
870
|
if (parsed.rest[0] === void 0) {
|
|
839
|
-
throw new CliError(
|
|
871
|
+
throw new CliError(
|
|
872
|
+
"missing_arguments",
|
|
873
|
+
"scripts sandbox requires an artifact id.",
|
|
874
|
+
CLI_USAGE_HINTS[operation]
|
|
875
|
+
);
|
|
840
876
|
}
|
|
841
877
|
{
|
|
842
878
|
const fidelity = readSingle(parsed.rawOptions, "fidelity");
|
|
@@ -885,14 +921,22 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
885
921
|
case "interaction.get":
|
|
886
922
|
case "interaction.replay":
|
|
887
923
|
if (parsed.rest[0] === void 0) {
|
|
888
|
-
throw new CliError(
|
|
924
|
+
throw new CliError(
|
|
925
|
+
"missing_arguments",
|
|
926
|
+
`${parsed.command.join(" ")} requires a trace id.`,
|
|
927
|
+
CLI_USAGE_HINTS[operation]
|
|
928
|
+
);
|
|
889
929
|
}
|
|
890
930
|
return {
|
|
891
931
|
traceId: parsed.rest[0]
|
|
892
932
|
};
|
|
893
933
|
case "interaction.diff":
|
|
894
934
|
if (parsed.rest[0] === void 0 || parsed.rest[1] === void 0) {
|
|
895
|
-
throw new CliError(
|
|
935
|
+
throw new CliError(
|
|
936
|
+
"missing_arguments",
|
|
937
|
+
"interaction diff requires two trace ids.",
|
|
938
|
+
CLI_USAGE_HINTS[operation]
|
|
939
|
+
);
|
|
896
940
|
}
|
|
897
941
|
return {
|
|
898
942
|
leftTraceId: parsed.rest[0],
|
|
@@ -900,7 +944,11 @@ async function buildOperationInput(operation, parsed, runtime) {
|
|
|
900
944
|
};
|
|
901
945
|
case "artifact.read":
|
|
902
946
|
if (parsed.rest[0] === void 0) {
|
|
903
|
-
throw new CliError(
|
|
947
|
+
throw new CliError(
|
|
948
|
+
"missing_arguments",
|
|
949
|
+
"artifact read requires an artifact id.",
|
|
950
|
+
CLI_USAGE_HINTS[operation]
|
|
951
|
+
);
|
|
904
952
|
}
|
|
905
953
|
return {
|
|
906
954
|
artifactId: parsed.rest[0]
|
|
@@ -1038,7 +1086,10 @@ function buildComputerExecuteInput(parsed) {
|
|
|
1038
1086
|
}
|
|
1039
1087
|
};
|
|
1040
1088
|
default:
|
|
1041
|
-
throw new CliError(
|
|
1089
|
+
throw new CliError(
|
|
1090
|
+
"unknown_command",
|
|
1091
|
+
`Unknown computer command: ${parsed.command.join(" ")}`
|
|
1092
|
+
);
|
|
1042
1093
|
}
|
|
1043
1094
|
}
|
|
1044
1095
|
async function resolvePageRefByIndex(runtime, index) {
|
|
@@ -1068,7 +1119,10 @@ function readRequiredNumber(value, message) {
|
|
|
1068
1119
|
}
|
|
1069
1120
|
function readSingleDirection(value) {
|
|
1070
1121
|
if (value === void 0 || !SCROLL_DIRECTIONS.has(value)) {
|
|
1071
|
-
throw new CliError(
|
|
1122
|
+
throw new CliError(
|
|
1123
|
+
"missing_arguments",
|
|
1124
|
+
"scroll requires a direction: up, down, left, or right."
|
|
1125
|
+
);
|
|
1072
1126
|
}
|
|
1073
1127
|
return value;
|
|
1074
1128
|
}
|
|
@@ -1095,13 +1149,19 @@ function readCaptchaProvider(value) {
|
|
|
1095
1149
|
}
|
|
1096
1150
|
function readCaptchaType(value) {
|
|
1097
1151
|
if (value === void 0 || !CAPTCHA_TYPES.has(value)) {
|
|
1098
|
-
throw new CliError(
|
|
1152
|
+
throw new CliError(
|
|
1153
|
+
"invalid_value",
|
|
1154
|
+
'Expected "--type" to be one of: recaptcha-v2, hcaptcha, turnstile.'
|
|
1155
|
+
);
|
|
1099
1156
|
}
|
|
1100
1157
|
return value;
|
|
1101
1158
|
}
|
|
1102
1159
|
function readSandboxFidelity(value) {
|
|
1103
1160
|
if (value === void 0 || !SANDBOX_FIDELITIES.has(value)) {
|
|
1104
|
-
throw new CliError(
|
|
1161
|
+
throw new CliError(
|
|
1162
|
+
"invalid_value",
|
|
1163
|
+
'Expected "--fidelity" to be one of: minimal, standard, full.'
|
|
1164
|
+
);
|
|
1105
1165
|
}
|
|
1106
1166
|
return value;
|
|
1107
1167
|
}
|
|
@@ -1124,7 +1184,10 @@ function readKeyModifiers(value) {
|
|
|
1124
1184
|
}
|
|
1125
1185
|
for (const modifier of modifiers) {
|
|
1126
1186
|
if (!KEY_MODIFIERS.has(modifier)) {
|
|
1127
|
-
throw new CliError(
|
|
1187
|
+
throw new CliError(
|
|
1188
|
+
"invalid_value",
|
|
1189
|
+
'Expected "--modifiers" to contain only: Shift, Control, Alt, Meta.'
|
|
1190
|
+
);
|
|
1128
1191
|
}
|
|
1129
1192
|
}
|
|
1130
1193
|
return [...new Set(modifiers)];
|
|
@@ -1159,6 +1222,7 @@ function joinRest(rest, startIndex) {
|
|
|
1159
1222
|
function renderOperationOutput(operation, result, input) {
|
|
1160
1223
|
switch (operation) {
|
|
1161
1224
|
case "session.open":
|
|
1225
|
+
case "page.activate":
|
|
1162
1226
|
case "page.goto":
|
|
1163
1227
|
return renderJson(formatNavigationOutput(result));
|
|
1164
1228
|
case "page.snapshot":
|
|
@@ -1167,14 +1231,14 @@ function renderOperationOutput(operation, result, input) {
|
|
|
1167
1231
|
case "dom.hover":
|
|
1168
1232
|
case "dom.input":
|
|
1169
1233
|
case "dom.scroll":
|
|
1170
|
-
return renderJson(formatActionOutput(result
|
|
1234
|
+
return renderJson(formatActionOutput(result));
|
|
1171
1235
|
case "dom.extract":
|
|
1172
1236
|
return renderJson(formatExtractOutput(result));
|
|
1173
1237
|
case "page.list":
|
|
1174
|
-
case "page.new":
|
|
1175
|
-
case "page.activate":
|
|
1176
1238
|
case "page.close":
|
|
1177
1239
|
return formatTabOutput(result);
|
|
1240
|
+
case "page.new":
|
|
1241
|
+
return renderJson(formatCreatedPageOutput(result));
|
|
1178
1242
|
case "network.query":
|
|
1179
1243
|
return formatNetworkQueryOutput(result, input);
|
|
1180
1244
|
case "network.detail":
|
|
@@ -1212,6 +1276,12 @@ function formatNavigationOutput(result) {
|
|
|
1212
1276
|
...readStringField(result, "title") === void 0 ? {} : { title: readStringField(result, "title") }
|
|
1213
1277
|
};
|
|
1214
1278
|
}
|
|
1279
|
+
function formatCreatedPageOutput(result) {
|
|
1280
|
+
return {
|
|
1281
|
+
...readStringField(result, "pageRef") === void 0 ? {} : { pageRef: readStringField(result, "pageRef") },
|
|
1282
|
+
...formatNavigationOutput(result)
|
|
1283
|
+
};
|
|
1284
|
+
}
|
|
1215
1285
|
function formatSnapshotOutput(result) {
|
|
1216
1286
|
if (result !== null && typeof result === "object" && typeof result.html === "string") {
|
|
1217
1287
|
return `${result.html}
|
|
@@ -1219,36 +1289,11 @@ function formatSnapshotOutput(result) {
|
|
|
1219
1289
|
}
|
|
1220
1290
|
return renderJson(result);
|
|
1221
1291
|
}
|
|
1222
|
-
function formatActionOutput(result
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
...readStringField(
|
|
1226
|
-
...readStringField(target, "pathHint") === void 0 ? {} : { pathHint: readStringField(target, "pathHint") }
|
|
1292
|
+
function formatActionOutput(result) {
|
|
1293
|
+
return {
|
|
1294
|
+
...readStringField(result, "tagName") === void 0 ? {} : { tagName: readStringField(result, "tagName") },
|
|
1295
|
+
...readStringField(result, "persist") === void 0 ? {} : { persist: readStringField(result, "persist") }
|
|
1227
1296
|
};
|
|
1228
|
-
const point = readObjectField(result, "point");
|
|
1229
|
-
if (point !== void 0) {
|
|
1230
|
-
output.point = {
|
|
1231
|
-
...readNumberField(point, "x") === void 0 ? {} : { x: readNumberField(point, "x") },
|
|
1232
|
-
...readNumberField(point, "y") === void 0 ? {} : { y: readNumberField(point, "y") }
|
|
1233
|
-
};
|
|
1234
|
-
}
|
|
1235
|
-
const persist = readStringField(target, "persist");
|
|
1236
|
-
if (persist !== void 0) {
|
|
1237
|
-
output.persist = persist;
|
|
1238
|
-
}
|
|
1239
|
-
const text = readStringField(input, "text");
|
|
1240
|
-
if (text !== void 0) {
|
|
1241
|
-
output.text = text;
|
|
1242
|
-
}
|
|
1243
|
-
const direction = readStringField(input, "direction");
|
|
1244
|
-
if (direction !== void 0) {
|
|
1245
|
-
output.direction = direction;
|
|
1246
|
-
}
|
|
1247
|
-
const amount = readNumberField(input, "amount");
|
|
1248
|
-
if (amount !== void 0) {
|
|
1249
|
-
output.amount = amount;
|
|
1250
|
-
}
|
|
1251
|
-
return output;
|
|
1252
1297
|
}
|
|
1253
1298
|
function formatExtractOutput(result) {
|
|
1254
1299
|
const data = readUnknownField(result, "data");
|
|
@@ -1480,20 +1525,18 @@ function formatStateOutput(result) {
|
|
|
1480
1525
|
`;
|
|
1481
1526
|
}
|
|
1482
1527
|
function formatComputerOutput(result) {
|
|
1483
|
-
const action = readObjectField(result, "action");
|
|
1484
1528
|
const screenshot = readObjectField(result, "screenshot");
|
|
1485
1529
|
const payload = readObjectField(screenshot, "payload");
|
|
1486
|
-
const timing = readObjectField(result, "timing");
|
|
1487
1530
|
return {
|
|
1488
|
-
...
|
|
1531
|
+
...readStringField(result, "url") === void 0 ? {} : { url: readStringField(result, "url") },
|
|
1532
|
+
...readStringField(result, "title") === void 0 ? {} : { title: readStringField(result, "title") },
|
|
1489
1533
|
...payload === void 0 ? {} : {
|
|
1490
1534
|
screenshot: {
|
|
1491
1535
|
...readStringField(payload, "uri") === void 0 ? {} : { uri: readStringField(payload, "uri") },
|
|
1492
1536
|
...readStringField(screenshot, "format") === void 0 ? {} : { format: readStringField(screenshot, "format") },
|
|
1493
1537
|
...readObjectField(screenshot, "size") === void 0 ? {} : { size: readObjectField(screenshot, "size") }
|
|
1494
1538
|
}
|
|
1495
|
-
}
|
|
1496
|
-
...timing === void 0 ? {} : { timingMs: timing }
|
|
1539
|
+
}
|
|
1497
1540
|
};
|
|
1498
1541
|
}
|
|
1499
1542
|
function formatScriptsCaptureOutput(result) {
|
|
@@ -2141,7 +2184,7 @@ async function collectOpensteerStatus(input) {
|
|
|
2141
2184
|
...output,
|
|
2142
2185
|
rootPath,
|
|
2143
2186
|
lanes: {
|
|
2144
|
-
local: describeLocalLane(localRecord, input.provider.mode === "local"),
|
|
2187
|
+
local: await describeLocalLane(localRecord, input.provider.mode === "local"),
|
|
2145
2188
|
cloud: await describeCloudLane({
|
|
2146
2189
|
record: cloudRecord,
|
|
2147
2190
|
current: input.provider.mode === "cloud",
|
|
@@ -2193,8 +2236,38 @@ async function readWorkspaceCloudRecord(rootPath) {
|
|
|
2193
2236
|
}
|
|
2194
2237
|
return readPersistedCloudSessionRecord(rootPath);
|
|
2195
2238
|
}
|
|
2196
|
-
function describeLocalLane(record, current) {
|
|
2197
|
-
if (record === void 0
|
|
2239
|
+
async function describeLocalLane(record, current) {
|
|
2240
|
+
if (record === void 0) {
|
|
2241
|
+
return {
|
|
2242
|
+
provider: "local",
|
|
2243
|
+
status: "idle",
|
|
2244
|
+
current,
|
|
2245
|
+
summary: "none"
|
|
2246
|
+
};
|
|
2247
|
+
}
|
|
2248
|
+
if (getPersistedLocalBrowserSessionOwnership(record) === "attached") {
|
|
2249
|
+
if (!await isAttachedLocalBrowserSessionReachable(record)) {
|
|
2250
|
+
return {
|
|
2251
|
+
provider: "local",
|
|
2252
|
+
status: "stale",
|
|
2253
|
+
current,
|
|
2254
|
+
summary: "attached browser unavailable",
|
|
2255
|
+
detail: record.engine,
|
|
2256
|
+
engine: record.engine
|
|
2257
|
+
};
|
|
2258
|
+
}
|
|
2259
|
+
const browser2 = record.executablePath ? path2.basename(record.executablePath).replace(/\.[A-Za-z0-9]+$/u, "") : void 0;
|
|
2260
|
+
return {
|
|
2261
|
+
provider: "local",
|
|
2262
|
+
status: "active",
|
|
2263
|
+
current,
|
|
2264
|
+
summary: "attached browser",
|
|
2265
|
+
detail: browser2 ?? record.engine,
|
|
2266
|
+
engine: record.engine,
|
|
2267
|
+
...browser2 === void 0 ? {} : { browser: browser2 }
|
|
2268
|
+
};
|
|
2269
|
+
}
|
|
2270
|
+
if (!isProcessRunning(record.pid)) {
|
|
2198
2271
|
return {
|
|
2199
2272
|
provider: "local",
|
|
2200
2273
|
status: "idle",
|
|
@@ -2340,13 +2413,19 @@ async function resolveWorkspaceSessionId(input) {
|
|
|
2340
2413
|
workspace: input.workspace
|
|
2341
2414
|
});
|
|
2342
2415
|
const live = await readPersistedLocalBrowserSessionRecord(rootPath);
|
|
2343
|
-
if (!live
|
|
2416
|
+
if (!live) {
|
|
2344
2417
|
return void 0;
|
|
2345
2418
|
}
|
|
2346
|
-
|
|
2419
|
+
if (getPersistedLocalBrowserSessionOwnership(live) === "attached") {
|
|
2420
|
+
if (!await isAttachedLocalBrowserSessionReachable(live)) {
|
|
2421
|
+
return void 0;
|
|
2422
|
+
}
|
|
2423
|
+
} else if (!isProcessRunning(live.pid)) {
|
|
2424
|
+
return void 0;
|
|
2425
|
+
}
|
|
2426
|
+
return buildLocalViewSessionIdForRecord({
|
|
2347
2427
|
rootPath,
|
|
2348
|
-
|
|
2349
|
-
startedAt: live.startedAt
|
|
2428
|
+
live
|
|
2350
2429
|
});
|
|
2351
2430
|
}
|
|
2352
2431
|
function assertNoViewPreferenceFlag(parsed) {
|
|
@@ -2442,7 +2521,10 @@ async function main() {
|
|
|
2442
2521
|
throw new CliError("unknown_command", `Unknown command: ${parsed.command.join(" ")}`);
|
|
2443
2522
|
}
|
|
2444
2523
|
if (parsed.options.workspace === void 0) {
|
|
2445
|
-
throw new CliError(
|
|
2524
|
+
throw new CliError(
|
|
2525
|
+
"missing_workspace",
|
|
2526
|
+
'Stateful commands require "--workspace <id>" or OPENSTEER_WORKSPACE.'
|
|
2527
|
+
);
|
|
2446
2528
|
}
|
|
2447
2529
|
const { engineName, provider, runtimeProvider } = resolveCliRuntimeSelection(parsed);
|
|
2448
2530
|
if (operation === "session.close") {
|
|
@@ -2489,7 +2571,10 @@ async function main() {
|
|
|
2489
2571
|
}
|
|
2490
2572
|
async function handleExecCommand(parsed) {
|
|
2491
2573
|
if (parsed.options.workspace === void 0) {
|
|
2492
|
-
throw new CliError(
|
|
2574
|
+
throw new CliError(
|
|
2575
|
+
"missing_workspace",
|
|
2576
|
+
'exec requires "--workspace <id>" or OPENSTEER_WORKSPACE.'
|
|
2577
|
+
);
|
|
2493
2578
|
}
|
|
2494
2579
|
const expression = parsed.rest.join(" ");
|
|
2495
2580
|
if (!expression) {
|
|
@@ -2500,7 +2585,7 @@ async function handleExecCommand(parsed) {
|
|
|
2500
2585
|
);
|
|
2501
2586
|
}
|
|
2502
2587
|
const { engineName, runtimeProvider } = resolveCliRuntimeSelection(parsed);
|
|
2503
|
-
const { Opensteer } = await import('../opensteer-
|
|
2588
|
+
const { Opensteer } = await import('../opensteer-XLPY343Y.js');
|
|
2504
2589
|
const opensteer = new Opensteer({
|
|
2505
2590
|
workspace: parsed.options.workspace,
|
|
2506
2591
|
rootDir: process4.cwd(),
|
|
@@ -2632,7 +2717,10 @@ async function handleCloseCommand(parsed, engineName, providerMode, runtimeProvi
|
|
|
2632
2717
|
}
|
|
2633
2718
|
async function handleRecordCommandEntry(parsed) {
|
|
2634
2719
|
if (parsed.options.workspace === void 0) {
|
|
2635
|
-
throw new CliError(
|
|
2720
|
+
throw new CliError(
|
|
2721
|
+
"missing_workspace",
|
|
2722
|
+
'record requires "--workspace <id>" or OPENSTEER_WORKSPACE.'
|
|
2723
|
+
);
|
|
2636
2724
|
}
|
|
2637
2725
|
const url = parsed.options.url ?? parsed.rest[0];
|
|
2638
2726
|
if (url === void 0) {
|
|
@@ -2672,7 +2760,10 @@ async function handleRecordCommandEntry(parsed) {
|
|
|
2672
2760
|
return;
|
|
2673
2761
|
}
|
|
2674
2762
|
if (parsed.options.launch?.headless === true) {
|
|
2675
|
-
throw new CliError(
|
|
2763
|
+
throw new CliError(
|
|
2764
|
+
"config_conflict",
|
|
2765
|
+
'record requires a headed browser. Remove "--headless true".'
|
|
2766
|
+
);
|
|
2676
2767
|
}
|
|
2677
2768
|
if (typeof recordBrowser === "object") {
|
|
2678
2769
|
throw new CliError("config_conflict", 'record does not support browser.mode="attach".');
|
|
@@ -2744,7 +2835,10 @@ function resolveCliBootstrapAction(argv) {
|
|
|
2744
2835
|
}
|
|
2745
2836
|
function buildCliBrowserProfile(parsed) {
|
|
2746
2837
|
if (parsed.options.cloudProfileReuseIfActive === true && parsed.options.cloudProfileId === void 0) {
|
|
2747
|
-
throw new CliError(
|
|
2838
|
+
throw new CliError(
|
|
2839
|
+
"invalid_option",
|
|
2840
|
+
'"--cloud-profile-reuse-if-active" requires "--cloud-profile-id <id>".'
|
|
2841
|
+
);
|
|
2748
2842
|
}
|
|
2749
2843
|
return parsed.options.cloudProfileId === void 0 ? void 0 : {
|
|
2750
2844
|
profileId: parsed.options.cloudProfileId,
|