@btraut/browser-bridge 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -1
- package/README.md +9 -9
- package/dist/api.js +953 -409
- package/dist/api.js.map +4 -4
- package/dist/index.js +600 -400
- package/dist/index.js.map +4 -4
- package/extension/dist/background.js +272 -26
- package/extension/dist/background.js.map +3 -3
- package/extension/dist/content.js +42 -4
- package/extension/dist/content.js.map +3 -3
- package/extension/dist/options-ui.js +80 -0
- package/extension/dist/options-ui.js.map +2 -2
- package/extension/manifest.json +14 -4
- package/package.json +1 -1
- package/skills/browser-bridge/SKILL.md +3 -4
- package/skills/browser-bridge/skill.json +1 -1
package/dist/api.js
CHANGED
|
@@ -58,9 +58,49 @@ var ENV_CORE_PORT = "BROWSER_BRIDGE_CORE_PORT";
|
|
|
58
58
|
var ENV_VISION_PORT = "BROWSER_VISION_CORE_PORT";
|
|
59
59
|
var ENV_ISOLATED_MODE = "BROWSER_BRIDGE_ISOLATED_MODE";
|
|
60
60
|
var ENV_VISION_ISOLATED_MODE = "BROWSER_VISION_ISOLATED_MODE";
|
|
61
|
+
var ENV_BRIDGE_CWD = "BROWSER_BRIDGE_CWD";
|
|
62
|
+
var ENV_PROCESS_PWD = "PWD";
|
|
63
|
+
var ENV_PROCESS_INIT_CWD = "INIT_CWD";
|
|
64
|
+
var ENV_PROCESS_HOME = "HOME";
|
|
61
65
|
var RUNTIME_METADATA_RELATIVE_PATH = ".context/browser-bridge/dev.json";
|
|
62
66
|
var DEFAULT_LOG_DIRECTORY_RELATIVE_PATH = ".context/logs/browser-bridge";
|
|
63
|
-
var
|
|
67
|
+
var normalizeCandidatePath = (value) => {
|
|
68
|
+
if (typeof value !== "string") {
|
|
69
|
+
return void 0;
|
|
70
|
+
}
|
|
71
|
+
const trimmed = value.trim();
|
|
72
|
+
if (trimmed.length === 0) {
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
return (0, import_node_path.resolve)(trimmed);
|
|
76
|
+
};
|
|
77
|
+
var resolveCwd = (cwd) => {
|
|
78
|
+
const explicit = normalizeCandidatePath(cwd);
|
|
79
|
+
if (explicit) {
|
|
80
|
+
return explicit;
|
|
81
|
+
}
|
|
82
|
+
const envExplicit = normalizeCandidatePath(process.env[ENV_BRIDGE_CWD]);
|
|
83
|
+
if (envExplicit) {
|
|
84
|
+
return envExplicit;
|
|
85
|
+
}
|
|
86
|
+
const processCwd = normalizeCandidatePath(process.cwd());
|
|
87
|
+
if (processCwd && processCwd !== "/") {
|
|
88
|
+
return processCwd;
|
|
89
|
+
}
|
|
90
|
+
const processPwd = normalizeCandidatePath(process.env[ENV_PROCESS_PWD]);
|
|
91
|
+
if (processPwd && processPwd !== "/") {
|
|
92
|
+
return processPwd;
|
|
93
|
+
}
|
|
94
|
+
const initCwd = normalizeCandidatePath(process.env[ENV_PROCESS_INIT_CWD]);
|
|
95
|
+
if (initCwd && initCwd !== "/") {
|
|
96
|
+
return initCwd;
|
|
97
|
+
}
|
|
98
|
+
const home = normalizeCandidatePath(process.env[ENV_PROCESS_HOME]);
|
|
99
|
+
if (home) {
|
|
100
|
+
return home;
|
|
101
|
+
}
|
|
102
|
+
return processCwd ?? (0, import_node_path.resolve)(".");
|
|
103
|
+
};
|
|
64
104
|
var resolveOptionalPath = (cwd, value) => {
|
|
65
105
|
if (!value) {
|
|
66
106
|
return void 0;
|
|
@@ -205,8 +245,8 @@ var sanitizeMetadata = (raw) => {
|
|
|
205
245
|
updated_at: updatedAt
|
|
206
246
|
};
|
|
207
247
|
};
|
|
208
|
-
var findGitRoot = (cwd
|
|
209
|
-
let current = (
|
|
248
|
+
var findGitRoot = (cwd) => {
|
|
249
|
+
let current = resolveCwd(cwd);
|
|
210
250
|
while (true) {
|
|
211
251
|
if ((0, import_node_fs.existsSync)((0, import_node_path.join)(current, ".git"))) {
|
|
212
252
|
return current;
|
|
@@ -669,7 +709,7 @@ var createCoreReadinessController = (options = {}) => {
|
|
|
669
709
|
let response;
|
|
670
710
|
try {
|
|
671
711
|
response = await fetchImpl(`${baseUrl}/health`, {
|
|
672
|
-
method: "
|
|
712
|
+
method: "POST",
|
|
673
713
|
signal: controller.signal
|
|
674
714
|
});
|
|
675
715
|
} catch (error) {
|
|
@@ -783,9 +823,49 @@ var createCoreReadinessController = (options = {}) => {
|
|
|
783
823
|
};
|
|
784
824
|
};
|
|
785
825
|
|
|
826
|
+
// packages/shared/src/contract-version.ts
|
|
827
|
+
var HTTP_CONTRACT_VERSION_HEADER = "x-browser-bridge-contract-version";
|
|
828
|
+
var HTTP_CONTRACT_VERSION = "2026-02-17.1";
|
|
829
|
+
var DRIVE_WS_PROTOCOL_VERSION = "2026-02-17.1";
|
|
830
|
+
var resolveContractVersionMismatch = (receivedVersion) => {
|
|
831
|
+
if (!receivedVersion || receivedVersion.trim().length === 0) {
|
|
832
|
+
return void 0;
|
|
833
|
+
}
|
|
834
|
+
if (receivedVersion === HTTP_CONTRACT_VERSION) {
|
|
835
|
+
return void 0;
|
|
836
|
+
}
|
|
837
|
+
return {
|
|
838
|
+
expected: HTTP_CONTRACT_VERSION,
|
|
839
|
+
received: receivedVersion
|
|
840
|
+
};
|
|
841
|
+
};
|
|
842
|
+
|
|
786
843
|
// packages/shared/src/errors.ts
|
|
844
|
+
var import_zod2 = require("zod");
|
|
845
|
+
|
|
846
|
+
// packages/shared/src/retry-policy.ts
|
|
787
847
|
var import_zod = require("zod");
|
|
788
|
-
var
|
|
848
|
+
var RetryHintSchema = import_zod.z.object({
|
|
849
|
+
retryable: import_zod.z.boolean(),
|
|
850
|
+
reason: import_zod.z.string().optional(),
|
|
851
|
+
retry_after_ms: import_zod.z.number().int().nonnegative().optional(),
|
|
852
|
+
max_attempts: import_zod.z.number().int().positive().optional()
|
|
853
|
+
});
|
|
854
|
+
var DEFAULT_MAX_ATTEMPTS = 1;
|
|
855
|
+
var resolveRetryHint = (input) => ({
|
|
856
|
+
retryable: input.retry?.retryable ?? input.retryable,
|
|
857
|
+
reason: input.retry?.reason,
|
|
858
|
+
retry_after_ms: input.retry?.retry_after_ms,
|
|
859
|
+
max_attempts: input.retry?.max_attempts ?? DEFAULT_MAX_ATTEMPTS
|
|
860
|
+
});
|
|
861
|
+
var shouldRetryByPolicy = (options) => {
|
|
862
|
+
const hint = resolveRetryHint(options);
|
|
863
|
+
const maxAttempts = hint.max_attempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
864
|
+
return hint.retryable && options.attempt < maxAttempts;
|
|
865
|
+
};
|
|
866
|
+
|
|
867
|
+
// packages/shared/src/errors.ts
|
|
868
|
+
var ErrorCodeSchema = import_zod2.z.enum([
|
|
789
869
|
"UNKNOWN",
|
|
790
870
|
"INVALID_ARGUMENT",
|
|
791
871
|
"NOT_FOUND",
|
|
@@ -818,32 +898,168 @@ var ErrorCodeSchema = import_zod.z.enum([
|
|
|
818
898
|
"EVALUATION_FAILED",
|
|
819
899
|
"ARTIFACT_IO_ERROR"
|
|
820
900
|
]);
|
|
821
|
-
var
|
|
901
|
+
var PublicErrorCodeSchema = import_zod2.z.enum([
|
|
902
|
+
"UNKNOWN",
|
|
903
|
+
"INVALID_ARGUMENT",
|
|
904
|
+
"NOT_FOUND",
|
|
905
|
+
"ALREADY_EXISTS",
|
|
906
|
+
"FAILED_PRECONDITION",
|
|
907
|
+
"UNAUTHORIZED",
|
|
908
|
+
"FORBIDDEN",
|
|
909
|
+
"CONFLICT",
|
|
910
|
+
"TIMEOUT",
|
|
911
|
+
"CANCELLED",
|
|
912
|
+
"UNAVAILABLE",
|
|
913
|
+
"RATE_LIMITED",
|
|
914
|
+
"NOT_IMPLEMENTED",
|
|
915
|
+
"INTERNAL"
|
|
916
|
+
]);
|
|
917
|
+
var PublicErrorDetailsSchema = import_zod2.z.object({
|
|
918
|
+
legacy_code: ErrorCodeSchema.optional(),
|
|
919
|
+
reason: import_zod2.z.string().optional(),
|
|
920
|
+
resource: import_zod2.z.string().optional(),
|
|
921
|
+
field: import_zod2.z.string().optional(),
|
|
922
|
+
session_id: import_zod2.z.string().optional(),
|
|
923
|
+
tab_id: import_zod2.z.number().finite().optional(),
|
|
924
|
+
retry_after_ms: import_zod2.z.number().finite().optional(),
|
|
925
|
+
next_step: import_zod2.z.string().optional()
|
|
926
|
+
}).catchall(import_zod2.z.unknown());
|
|
927
|
+
var LEGACY_ERROR_CODE_MAP = {
|
|
928
|
+
PERMISSION_REQUIRED: {
|
|
929
|
+
code: "FORBIDDEN",
|
|
930
|
+
reason: "permission_required"
|
|
931
|
+
},
|
|
932
|
+
PERMISSION_DENIED: {
|
|
933
|
+
code: "FORBIDDEN",
|
|
934
|
+
reason: "permission_denied"
|
|
935
|
+
},
|
|
936
|
+
PERMISSION_PROMPT_TIMEOUT: {
|
|
937
|
+
code: "TIMEOUT",
|
|
938
|
+
reason: "permission_prompt_timeout"
|
|
939
|
+
},
|
|
940
|
+
SESSION_NOT_FOUND: {
|
|
941
|
+
code: "NOT_FOUND",
|
|
942
|
+
reason: "session_not_found",
|
|
943
|
+
resource: "session"
|
|
944
|
+
},
|
|
945
|
+
SESSION_CLOSED: {
|
|
946
|
+
code: "FAILED_PRECONDITION",
|
|
947
|
+
reason: "session_closed",
|
|
948
|
+
resource: "session"
|
|
949
|
+
},
|
|
950
|
+
SESSION_BROKEN: {
|
|
951
|
+
code: "FAILED_PRECONDITION",
|
|
952
|
+
reason: "session_broken",
|
|
953
|
+
resource: "session"
|
|
954
|
+
},
|
|
955
|
+
DRIVE_UNAVAILABLE: {
|
|
956
|
+
code: "UNAVAILABLE",
|
|
957
|
+
reason: "drive_unavailable"
|
|
958
|
+
},
|
|
959
|
+
INSPECT_UNAVAILABLE: {
|
|
960
|
+
code: "UNAVAILABLE",
|
|
961
|
+
reason: "inspect_unavailable"
|
|
962
|
+
},
|
|
963
|
+
EXTENSION_DISCONNECTED: {
|
|
964
|
+
code: "UNAVAILABLE",
|
|
965
|
+
reason: "extension_disconnected"
|
|
966
|
+
},
|
|
967
|
+
DEBUGGER_IN_USE: {
|
|
968
|
+
code: "CONFLICT",
|
|
969
|
+
reason: "debugger_in_use"
|
|
970
|
+
},
|
|
971
|
+
ATTACH_DENIED: {
|
|
972
|
+
code: "FORBIDDEN",
|
|
973
|
+
reason: "attach_denied"
|
|
974
|
+
},
|
|
975
|
+
TAB_NOT_FOUND: {
|
|
976
|
+
code: "NOT_FOUND",
|
|
977
|
+
reason: "tab_not_found",
|
|
978
|
+
resource: "tab"
|
|
979
|
+
},
|
|
980
|
+
LOCATOR_NOT_FOUND: {
|
|
981
|
+
code: "NOT_FOUND",
|
|
982
|
+
reason: "locator_not_found",
|
|
983
|
+
resource: "locator"
|
|
984
|
+
},
|
|
985
|
+
NOT_SUPPORTED: {
|
|
986
|
+
code: "NOT_IMPLEMENTED",
|
|
987
|
+
reason: "not_supported"
|
|
988
|
+
},
|
|
989
|
+
NAVIGATION_FAILED: {
|
|
990
|
+
code: "FAILED_PRECONDITION",
|
|
991
|
+
reason: "navigation_failed"
|
|
992
|
+
},
|
|
993
|
+
EVALUATION_FAILED: {
|
|
994
|
+
code: "FAILED_PRECONDITION",
|
|
995
|
+
reason: "evaluation_failed"
|
|
996
|
+
},
|
|
997
|
+
ARTIFACT_IO_ERROR: {
|
|
998
|
+
code: "FAILED_PRECONDITION",
|
|
999
|
+
reason: "artifact_io_error"
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1003
|
+
var normalizeErrorCode = (code) => LEGACY_ERROR_CODE_MAP[code]?.code ?? (PublicErrorCodeSchema.safeParse(code).success ? code : "INTERNAL");
|
|
1004
|
+
var ErrorInfoSchema = import_zod2.z.object({
|
|
822
1005
|
code: ErrorCodeSchema,
|
|
823
|
-
message:
|
|
824
|
-
retryable:
|
|
825
|
-
|
|
1006
|
+
message: import_zod2.z.string(),
|
|
1007
|
+
retryable: import_zod2.z.boolean(),
|
|
1008
|
+
retry: RetryHintSchema.optional(),
|
|
1009
|
+
details: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional()
|
|
826
1010
|
});
|
|
827
|
-
var
|
|
828
|
-
|
|
1011
|
+
var normalizeErrorInfo = (error) => {
|
|
1012
|
+
const parsedCode = ErrorCodeSchema.safeParse(error.code);
|
|
1013
|
+
const normalizedInputCode = parsedCode.success ? parsedCode.data : "INTERNAL";
|
|
1014
|
+
const existingDetails = isRecord(error.details) ? error.details : {};
|
|
1015
|
+
const normalizedInput = {
|
|
1016
|
+
...error,
|
|
1017
|
+
code: normalizedInputCode,
|
|
1018
|
+
...parsedCode.success ? {} : {
|
|
1019
|
+
details: {
|
|
1020
|
+
...existingDetails,
|
|
1021
|
+
legacy_code: error.code,
|
|
1022
|
+
reason: "unknown_code"
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
};
|
|
1026
|
+
const mapping = LEGACY_ERROR_CODE_MAP[normalizedInput.code];
|
|
1027
|
+
if (!mapping) {
|
|
1028
|
+
return normalizedInput;
|
|
1029
|
+
}
|
|
1030
|
+
const mappedDetails = isRecord(normalizedInput.details) ? normalizedInput.details : {};
|
|
1031
|
+
const details = {
|
|
1032
|
+
...mappedDetails,
|
|
1033
|
+
legacy_code: normalizedInput.code,
|
|
1034
|
+
reason: mapping.reason,
|
|
1035
|
+
...mapping.resource ? { resource: mapping.resource } : {}
|
|
1036
|
+
};
|
|
1037
|
+
return {
|
|
1038
|
+
...normalizedInput,
|
|
1039
|
+
code: mapping.code,
|
|
1040
|
+
details: PublicErrorDetailsSchema.parse(details)
|
|
1041
|
+
};
|
|
1042
|
+
};
|
|
1043
|
+
var ErrorEnvelopeSchema = import_zod2.z.object({
|
|
1044
|
+
ok: import_zod2.z.literal(false),
|
|
829
1045
|
error: ErrorInfoSchema
|
|
830
1046
|
});
|
|
831
|
-
var successEnvelopeSchema = (result) =>
|
|
832
|
-
ok:
|
|
1047
|
+
var successEnvelopeSchema = (result) => import_zod2.z.object({
|
|
1048
|
+
ok: import_zod2.z.literal(true),
|
|
833
1049
|
result
|
|
834
1050
|
});
|
|
835
1051
|
|
|
836
1052
|
// packages/shared/src/schemas.ts
|
|
837
|
-
var
|
|
838
|
-
var LocatorRoleSchema =
|
|
839
|
-
name:
|
|
840
|
-
value:
|
|
1053
|
+
var import_zod3 = require("zod");
|
|
1054
|
+
var LocatorRoleSchema = import_zod3.z.object({
|
|
1055
|
+
name: import_zod3.z.string(),
|
|
1056
|
+
value: import_zod3.z.string().optional()
|
|
841
1057
|
});
|
|
842
|
-
var LocatorSchema =
|
|
843
|
-
ref:
|
|
844
|
-
testid:
|
|
845
|
-
css:
|
|
846
|
-
text:
|
|
1058
|
+
var LocatorSchema = import_zod3.z.object({
|
|
1059
|
+
ref: import_zod3.z.string().min(1).optional(),
|
|
1060
|
+
testid: import_zod3.z.string().min(1).optional(),
|
|
1061
|
+
css: import_zod3.z.string().min(1).optional(),
|
|
1062
|
+
text: import_zod3.z.string().min(1).optional(),
|
|
847
1063
|
role: LocatorRoleSchema.optional()
|
|
848
1064
|
}).refine(
|
|
849
1065
|
(value) => Boolean(
|
|
@@ -853,12 +1069,12 @@ var LocatorSchema = import_zod2.z.object({
|
|
|
853
1069
|
message: "Locator must include at least one selector."
|
|
854
1070
|
}
|
|
855
1071
|
);
|
|
856
|
-
var OpResultSchema =
|
|
857
|
-
ok:
|
|
858
|
-
message:
|
|
859
|
-
warnings:
|
|
1072
|
+
var OpResultSchema = import_zod3.z.object({
|
|
1073
|
+
ok: import_zod3.z.literal(true),
|
|
1074
|
+
message: import_zod3.z.string().optional(),
|
|
1075
|
+
warnings: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
860
1076
|
});
|
|
861
|
-
var SessionStateSchema =
|
|
1077
|
+
var SessionStateSchema = import_zod3.z.enum([
|
|
862
1078
|
"INIT",
|
|
863
1079
|
"DRIVE_READY",
|
|
864
1080
|
"INSPECT_READY",
|
|
@@ -868,269 +1084,270 @@ var SessionStateSchema = import_zod2.z.enum([
|
|
|
868
1084
|
"BROKEN",
|
|
869
1085
|
"CLOSED"
|
|
870
1086
|
]);
|
|
871
|
-
var SessionInfoSchema =
|
|
872
|
-
session_id:
|
|
1087
|
+
var SessionInfoSchema = import_zod3.z.object({
|
|
1088
|
+
session_id: import_zod3.z.string(),
|
|
873
1089
|
state: SessionStateSchema,
|
|
874
|
-
created_at:
|
|
1090
|
+
created_at: import_zod3.z.string().datetime().optional()
|
|
875
1091
|
});
|
|
876
|
-
var SessionPlaneStatusSchema =
|
|
877
|
-
connected:
|
|
878
|
-
last_seen_at:
|
|
1092
|
+
var SessionPlaneStatusSchema = import_zod3.z.object({
|
|
1093
|
+
connected: import_zod3.z.boolean(),
|
|
1094
|
+
last_seen_at: import_zod3.z.string().datetime().optional(),
|
|
879
1095
|
error: ErrorInfoSchema.optional()
|
|
880
1096
|
});
|
|
881
|
-
var SessionStatusSchema =
|
|
882
|
-
session_id:
|
|
1097
|
+
var SessionStatusSchema = import_zod3.z.object({
|
|
1098
|
+
session_id: import_zod3.z.string(),
|
|
883
1099
|
state: SessionStateSchema,
|
|
884
1100
|
drive: SessionPlaneStatusSchema.optional(),
|
|
885
1101
|
inspect: SessionPlaneStatusSchema.optional(),
|
|
886
|
-
updated_at:
|
|
1102
|
+
updated_at: import_zod3.z.string().datetime().optional()
|
|
887
1103
|
});
|
|
888
|
-
var RecoverResultSchema =
|
|
889
|
-
session_id:
|
|
890
|
-
recovered:
|
|
1104
|
+
var RecoverResultSchema = import_zod3.z.object({
|
|
1105
|
+
session_id: import_zod3.z.string(),
|
|
1106
|
+
recovered: import_zod3.z.boolean(),
|
|
891
1107
|
state: SessionStateSchema,
|
|
892
|
-
message:
|
|
1108
|
+
message: import_zod3.z.string().optional()
|
|
893
1109
|
});
|
|
894
|
-
var DiagnosticCheckSchema =
|
|
895
|
-
name:
|
|
896
|
-
ok:
|
|
897
|
-
message:
|
|
898
|
-
details:
|
|
1110
|
+
var DiagnosticCheckSchema = import_zod3.z.object({
|
|
1111
|
+
name: import_zod3.z.string(),
|
|
1112
|
+
ok: import_zod3.z.boolean(),
|
|
1113
|
+
message: import_zod3.z.string().optional(),
|
|
1114
|
+
details: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.unknown()).optional()
|
|
899
1115
|
});
|
|
900
|
-
var DiagnosticsRuntimeEndpointSchema =
|
|
901
|
-
host:
|
|
902
|
-
port:
|
|
903
|
-
base_url:
|
|
904
|
-
host_source:
|
|
905
|
-
port_source:
|
|
906
|
-
metadata_path:
|
|
907
|
-
isolated_mode:
|
|
1116
|
+
var DiagnosticsRuntimeEndpointSchema = import_zod3.z.object({
|
|
1117
|
+
host: import_zod3.z.string().optional(),
|
|
1118
|
+
port: import_zod3.z.number().finite().optional(),
|
|
1119
|
+
base_url: import_zod3.z.string().optional(),
|
|
1120
|
+
host_source: import_zod3.z.string().optional(),
|
|
1121
|
+
port_source: import_zod3.z.string().optional(),
|
|
1122
|
+
metadata_path: import_zod3.z.string().optional(),
|
|
1123
|
+
isolated_mode: import_zod3.z.boolean().optional()
|
|
908
1124
|
});
|
|
909
|
-
var DiagnosticsRuntimeProcessSchema =
|
|
910
|
-
component:
|
|
911
|
-
version:
|
|
912
|
-
pid:
|
|
913
|
-
node_version:
|
|
914
|
-
binary_path:
|
|
915
|
-
argv_entry:
|
|
1125
|
+
var DiagnosticsRuntimeProcessSchema = import_zod3.z.object({
|
|
1126
|
+
component: import_zod3.z.enum(["cli", "mcp", "core"]).optional(),
|
|
1127
|
+
version: import_zod3.z.string().optional(),
|
|
1128
|
+
pid: import_zod3.z.number().int().positive().optional(),
|
|
1129
|
+
node_version: import_zod3.z.string().optional(),
|
|
1130
|
+
binary_path: import_zod3.z.string().optional(),
|
|
1131
|
+
argv_entry: import_zod3.z.string().optional()
|
|
916
1132
|
});
|
|
917
|
-
var DiagnosticsRuntimeCallerSchema =
|
|
1133
|
+
var DiagnosticsRuntimeCallerSchema = import_zod3.z.object({
|
|
918
1134
|
endpoint: DiagnosticsRuntimeEndpointSchema.optional(),
|
|
919
1135
|
process: DiagnosticsRuntimeProcessSchema.optional()
|
|
920
1136
|
});
|
|
921
|
-
var DiagnosticsRuntimeContextSchema =
|
|
1137
|
+
var DiagnosticsRuntimeContextSchema = import_zod3.z.object({
|
|
922
1138
|
caller: DiagnosticsRuntimeCallerSchema.optional(),
|
|
923
|
-
core:
|
|
1139
|
+
core: import_zod3.z.object({
|
|
924
1140
|
endpoint: DiagnosticsRuntimeEndpointSchema.optional(),
|
|
925
1141
|
process: DiagnosticsRuntimeProcessSchema.optional()
|
|
926
1142
|
}).optional(),
|
|
927
|
-
extension:
|
|
928
|
-
version:
|
|
1143
|
+
extension: import_zod3.z.object({
|
|
1144
|
+
version: import_zod3.z.string().optional(),
|
|
1145
|
+
protocol_version: import_zod3.z.string().optional(),
|
|
1146
|
+
capability_negotiated: import_zod3.z.boolean().optional(),
|
|
1147
|
+
capabilities: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.boolean()).optional(),
|
|
929
1148
|
endpoint: DiagnosticsRuntimeEndpointSchema.optional(),
|
|
930
|
-
port_source:
|
|
1149
|
+
port_source: import_zod3.z.enum(["default", "storage"]).optional()
|
|
931
1150
|
}).optional()
|
|
932
1151
|
});
|
|
933
|
-
var DiagnosticReportSchema =
|
|
934
|
-
ok:
|
|
935
|
-
session_id:
|
|
936
|
-
checks:
|
|
937
|
-
sessions:
|
|
938
|
-
count:
|
|
939
|
-
max_age_ms:
|
|
940
|
-
max_idle_ms:
|
|
1152
|
+
var DiagnosticReportSchema = import_zod3.z.object({
|
|
1153
|
+
ok: import_zod3.z.boolean(),
|
|
1154
|
+
session_id: import_zod3.z.string().optional(),
|
|
1155
|
+
checks: import_zod3.z.array(DiagnosticCheckSchema).optional(),
|
|
1156
|
+
sessions: import_zod3.z.object({
|
|
1157
|
+
count: import_zod3.z.number().finite().optional(),
|
|
1158
|
+
max_age_ms: import_zod3.z.number().finite().optional(),
|
|
1159
|
+
max_idle_ms: import_zod3.z.number().finite().optional()
|
|
941
1160
|
}).optional(),
|
|
942
|
-
extension:
|
|
943
|
-
connected:
|
|
944
|
-
version:
|
|
945
|
-
last_seen_at:
|
|
1161
|
+
extension: import_zod3.z.object({
|
|
1162
|
+
connected: import_zod3.z.boolean().optional(),
|
|
1163
|
+
version: import_zod3.z.string().optional(),
|
|
1164
|
+
last_seen_at: import_zod3.z.string().datetime().optional()
|
|
946
1165
|
}).optional(),
|
|
947
|
-
debugger:
|
|
948
|
-
attached:
|
|
949
|
-
idle_timeout_ms:
|
|
950
|
-
console_buffer_size:
|
|
951
|
-
network_buffer_size:
|
|
1166
|
+
debugger: import_zod3.z.object({
|
|
1167
|
+
attached: import_zod3.z.boolean().optional(),
|
|
1168
|
+
idle_timeout_ms: import_zod3.z.number().finite().optional(),
|
|
1169
|
+
console_buffer_size: import_zod3.z.number().finite().optional(),
|
|
1170
|
+
network_buffer_size: import_zod3.z.number().finite().optional(),
|
|
952
1171
|
last_error: ErrorInfoSchema.optional()
|
|
953
1172
|
}).optional(),
|
|
954
|
-
artifacts:
|
|
955
|
-
root_dir:
|
|
1173
|
+
artifacts: import_zod3.z.object({
|
|
1174
|
+
root_dir: import_zod3.z.string().optional()
|
|
956
1175
|
}).optional(),
|
|
957
|
-
recovery:
|
|
958
|
-
last_attempt:
|
|
959
|
-
session_id:
|
|
960
|
-
recovered:
|
|
1176
|
+
recovery: import_zod3.z.object({
|
|
1177
|
+
last_attempt: import_zod3.z.object({
|
|
1178
|
+
session_id: import_zod3.z.string(),
|
|
1179
|
+
recovered: import_zod3.z.boolean(),
|
|
961
1180
|
state: SessionStateSchema,
|
|
962
|
-
message:
|
|
963
|
-
at:
|
|
1181
|
+
message: import_zod3.z.string().optional(),
|
|
1182
|
+
at: import_zod3.z.string()
|
|
964
1183
|
}).optional(),
|
|
965
|
-
attempts:
|
|
966
|
-
|
|
967
|
-
session_id:
|
|
968
|
-
recovered:
|
|
1184
|
+
attempts: import_zod3.z.array(
|
|
1185
|
+
import_zod3.z.object({
|
|
1186
|
+
session_id: import_zod3.z.string(),
|
|
1187
|
+
recovered: import_zod3.z.boolean(),
|
|
969
1188
|
state: SessionStateSchema,
|
|
970
|
-
message:
|
|
971
|
-
at:
|
|
1189
|
+
message: import_zod3.z.string().optional(),
|
|
1190
|
+
at: import_zod3.z.string()
|
|
972
1191
|
})
|
|
973
1192
|
).optional(),
|
|
974
|
-
success_count:
|
|
975
|
-
failure_count:
|
|
976
|
-
success_rate:
|
|
977
|
-
recent_failure_count:
|
|
978
|
-
loop_detected:
|
|
1193
|
+
success_count: import_zod3.z.number().finite().optional(),
|
|
1194
|
+
failure_count: import_zod3.z.number().finite().optional(),
|
|
1195
|
+
success_rate: import_zod3.z.number().finite().optional(),
|
|
1196
|
+
recent_failure_count: import_zod3.z.number().finite().optional(),
|
|
1197
|
+
loop_detected: import_zod3.z.boolean().optional()
|
|
979
1198
|
}).optional(),
|
|
980
|
-
warnings:
|
|
981
|
-
notes:
|
|
1199
|
+
warnings: import_zod3.z.array(import_zod3.z.string()).optional(),
|
|
1200
|
+
notes: import_zod3.z.array(import_zod3.z.string()).optional(),
|
|
982
1201
|
runtime: DiagnosticsRuntimeContextSchema.optional()
|
|
983
1202
|
});
|
|
984
|
-
var SessionIdSchema =
|
|
985
|
-
session_id:
|
|
1203
|
+
var SessionIdSchema = import_zod3.z.object({
|
|
1204
|
+
session_id: import_zod3.z.string().min(1)
|
|
986
1205
|
});
|
|
987
|
-
var SessionCreateInputSchema =
|
|
1206
|
+
var SessionCreateInputSchema = import_zod3.z.object({}).strict().default({});
|
|
988
1207
|
var SessionCreateOutputSchema = SessionInfoSchema;
|
|
989
1208
|
var SessionStatusInputSchema = SessionIdSchema;
|
|
990
1209
|
var SessionStatusOutputSchema = SessionStatusSchema;
|
|
991
1210
|
var SessionRecoverInputSchema = SessionIdSchema;
|
|
992
1211
|
var SessionRecoverOutputSchema = RecoverResultSchema;
|
|
993
1212
|
var SessionCloseInputSchema = SessionIdSchema;
|
|
994
|
-
var SessionCloseOutputSchema =
|
|
995
|
-
ok:
|
|
1213
|
+
var SessionCloseOutputSchema = import_zod3.z.object({
|
|
1214
|
+
ok: import_zod3.z.boolean()
|
|
996
1215
|
});
|
|
997
|
-
var DriveWaitConditionSchema =
|
|
998
|
-
kind:
|
|
999
|
-
value:
|
|
1216
|
+
var DriveWaitConditionSchema = import_zod3.z.object({
|
|
1217
|
+
kind: import_zod3.z.enum(["locator_visible", "text_present", "url_matches"]),
|
|
1218
|
+
value: import_zod3.z.string().min(1)
|
|
1000
1219
|
});
|
|
1001
|
-
var DriveNavigateInputSchema =
|
|
1002
|
-
session_id:
|
|
1003
|
-
url:
|
|
1004
|
-
tab_id:
|
|
1005
|
-
wait:
|
|
1220
|
+
var DriveNavigateInputSchema = import_zod3.z.object({
|
|
1221
|
+
session_id: import_zod3.z.string().min(1).optional(),
|
|
1222
|
+
url: import_zod3.z.string().min(1),
|
|
1223
|
+
tab_id: import_zod3.z.number().finite().optional(),
|
|
1224
|
+
wait: import_zod3.z.enum(["none", "domcontentloaded"]).default("domcontentloaded")
|
|
1225
|
+
});
|
|
1226
|
+
var DriveNavigateOutputSchema = OpResultSchema.extend({
|
|
1227
|
+
session_id: import_zod3.z.string().min(1)
|
|
1006
1228
|
});
|
|
1007
|
-
var
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
tab_id: import_zod2.z.number().finite().optional()
|
|
1229
|
+
var DriveGoBackInputSchema = import_zod3.z.object({
|
|
1230
|
+
session_id: import_zod3.z.string().min(1),
|
|
1231
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1011
1232
|
});
|
|
1012
1233
|
var DriveGoBackOutputSchema = OpResultSchema;
|
|
1013
|
-
var DriveGoForwardInputSchema =
|
|
1014
|
-
session_id:
|
|
1015
|
-
tab_id:
|
|
1234
|
+
var DriveGoForwardInputSchema = import_zod3.z.object({
|
|
1235
|
+
session_id: import_zod3.z.string().min(1),
|
|
1236
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1016
1237
|
});
|
|
1017
1238
|
var DriveGoForwardOutputSchema = OpResultSchema;
|
|
1018
|
-
var
|
|
1019
|
-
|
|
1020
|
-
var DriveForwardInputSchema = DriveGoForwardInputSchema;
|
|
1021
|
-
var DriveForwardOutputSchema = OpResultSchema;
|
|
1022
|
-
var DriveClickInputSchema = import_zod2.z.object({
|
|
1023
|
-
session_id: import_zod2.z.string().min(1),
|
|
1239
|
+
var DriveClickInputSchema = import_zod3.z.object({
|
|
1240
|
+
session_id: import_zod3.z.string().min(1),
|
|
1024
1241
|
locator: LocatorSchema,
|
|
1025
|
-
tab_id:
|
|
1026
|
-
click_count:
|
|
1242
|
+
tab_id: import_zod3.z.number().finite().optional(),
|
|
1243
|
+
click_count: import_zod3.z.number().finite().optional()
|
|
1027
1244
|
});
|
|
1028
1245
|
var DriveClickOutputSchema = OpResultSchema;
|
|
1029
|
-
var DriveHoverInputSchema =
|
|
1030
|
-
session_id:
|
|
1246
|
+
var DriveHoverInputSchema = import_zod3.z.object({
|
|
1247
|
+
session_id: import_zod3.z.string().min(1),
|
|
1031
1248
|
locator: LocatorSchema,
|
|
1032
|
-
delay_ms:
|
|
1033
|
-
tab_id:
|
|
1249
|
+
delay_ms: import_zod3.z.number().min(0).max(1e4).optional(),
|
|
1250
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1034
1251
|
});
|
|
1035
|
-
var DriveHoverOutputSchema =
|
|
1036
|
-
format:
|
|
1037
|
-
snapshot:
|
|
1252
|
+
var DriveHoverOutputSchema = import_zod3.z.object({
|
|
1253
|
+
format: import_zod3.z.literal("html"),
|
|
1254
|
+
snapshot: import_zod3.z.string()
|
|
1038
1255
|
});
|
|
1039
|
-
var DriveSelectInputSchema =
|
|
1040
|
-
session_id:
|
|
1256
|
+
var DriveSelectInputSchema = import_zod3.z.object({
|
|
1257
|
+
session_id: import_zod3.z.string().min(1),
|
|
1041
1258
|
locator: LocatorSchema,
|
|
1042
|
-
value:
|
|
1043
|
-
text:
|
|
1044
|
-
index:
|
|
1045
|
-
tab_id:
|
|
1259
|
+
value: import_zod3.z.string().min(1).optional(),
|
|
1260
|
+
text: import_zod3.z.string().min(1).optional(),
|
|
1261
|
+
index: import_zod3.z.number().int().min(0).optional(),
|
|
1262
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1046
1263
|
}).refine((value) => value.value || value.text || value.index !== void 0, {
|
|
1047
1264
|
message: "Either value, text, or index must be provided.",
|
|
1048
1265
|
path: ["select"]
|
|
1049
1266
|
});
|
|
1050
1267
|
var DriveSelectOutputSchema = OpResultSchema;
|
|
1051
|
-
var DriveTypeInputSchema =
|
|
1052
|
-
session_id:
|
|
1268
|
+
var DriveTypeInputSchema = import_zod3.z.object({
|
|
1269
|
+
session_id: import_zod3.z.string().min(1),
|
|
1053
1270
|
locator: LocatorSchema.optional(),
|
|
1054
|
-
text:
|
|
1055
|
-
tab_id:
|
|
1056
|
-
clear:
|
|
1057
|
-
submit:
|
|
1271
|
+
text: import_zod3.z.string().min(1),
|
|
1272
|
+
tab_id: import_zod3.z.number().finite().optional(),
|
|
1273
|
+
clear: import_zod3.z.boolean().default(false),
|
|
1274
|
+
submit: import_zod3.z.boolean().default(false)
|
|
1058
1275
|
});
|
|
1059
1276
|
var DriveTypeOutputSchema = OpResultSchema;
|
|
1060
|
-
var DriveFillFormFieldSchema =
|
|
1061
|
-
selector:
|
|
1277
|
+
var DriveFillFormFieldSchema = import_zod3.z.object({
|
|
1278
|
+
selector: import_zod3.z.string().min(1).optional(),
|
|
1062
1279
|
locator: LocatorSchema.optional(),
|
|
1063
|
-
value:
|
|
1064
|
-
type:
|
|
1065
|
-
submit:
|
|
1280
|
+
value: import_zod3.z.union([import_zod3.z.string(), import_zod3.z.boolean()]),
|
|
1281
|
+
type: import_zod3.z.enum(["auto", "text", "select", "checkbox", "radio", "contentEditable"]).default("auto"),
|
|
1282
|
+
submit: import_zod3.z.boolean().default(false)
|
|
1066
1283
|
}).refine((value) => Boolean(value.selector || value.locator), {
|
|
1067
1284
|
message: "fill_form field requires selector or locator.",
|
|
1068
1285
|
path: ["selector"]
|
|
1069
1286
|
});
|
|
1070
|
-
var DriveFillFormInputSchema =
|
|
1071
|
-
session_id:
|
|
1072
|
-
fields:
|
|
1073
|
-
tab_id:
|
|
1287
|
+
var DriveFillFormInputSchema = import_zod3.z.object({
|
|
1288
|
+
session_id: import_zod3.z.string().min(1),
|
|
1289
|
+
fields: import_zod3.z.array(DriveFillFormFieldSchema).min(1),
|
|
1290
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1074
1291
|
});
|
|
1075
|
-
var DriveFillFormOutputSchema =
|
|
1076
|
-
filled:
|
|
1077
|
-
attempted:
|
|
1078
|
-
errors:
|
|
1292
|
+
var DriveFillFormOutputSchema = import_zod3.z.object({
|
|
1293
|
+
filled: import_zod3.z.number().finite(),
|
|
1294
|
+
attempted: import_zod3.z.number().finite(),
|
|
1295
|
+
errors: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
1079
1296
|
});
|
|
1080
|
-
var DriveDragInputSchema =
|
|
1081
|
-
session_id:
|
|
1297
|
+
var DriveDragInputSchema = import_zod3.z.object({
|
|
1298
|
+
session_id: import_zod3.z.string().min(1),
|
|
1082
1299
|
from: LocatorSchema,
|
|
1083
1300
|
to: LocatorSchema,
|
|
1084
|
-
steps:
|
|
1085
|
-
tab_id:
|
|
1301
|
+
steps: import_zod3.z.number().min(1).max(50).default(12),
|
|
1302
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1086
1303
|
});
|
|
1087
1304
|
var DriveDragOutputSchema = OpResultSchema;
|
|
1088
|
-
var DriveHandleDialogInputSchema =
|
|
1089
|
-
session_id:
|
|
1090
|
-
action:
|
|
1091
|
-
promptText:
|
|
1092
|
-
tab_id:
|
|
1305
|
+
var DriveHandleDialogInputSchema = import_zod3.z.object({
|
|
1306
|
+
session_id: import_zod3.z.string().min(1),
|
|
1307
|
+
action: import_zod3.z.enum(["accept", "dismiss"]),
|
|
1308
|
+
promptText: import_zod3.z.string().optional(),
|
|
1309
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1093
1310
|
});
|
|
1094
1311
|
var DriveHandleDialogOutputSchema = OpResultSchema;
|
|
1095
1312
|
var DialogAcceptInputSchema = SessionIdSchema.extend({
|
|
1096
|
-
promptText:
|
|
1097
|
-
tab_id:
|
|
1313
|
+
promptText: import_zod3.z.string().optional(),
|
|
1314
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1098
1315
|
});
|
|
1099
1316
|
var DialogAcceptOutputSchema = OpResultSchema;
|
|
1100
1317
|
var DialogDismissInputSchema = SessionIdSchema.extend({
|
|
1101
|
-
tab_id:
|
|
1318
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1102
1319
|
});
|
|
1103
1320
|
var DialogDismissOutputSchema = OpResultSchema;
|
|
1104
|
-
var DriveKeyModifiersSchema =
|
|
1105
|
-
ctrl:
|
|
1106
|
-
alt:
|
|
1107
|
-
shift:
|
|
1108
|
-
meta:
|
|
1321
|
+
var DriveKeyModifiersSchema = import_zod3.z.object({
|
|
1322
|
+
ctrl: import_zod3.z.boolean().optional(),
|
|
1323
|
+
alt: import_zod3.z.boolean().optional(),
|
|
1324
|
+
shift: import_zod3.z.boolean().optional(),
|
|
1325
|
+
meta: import_zod3.z.boolean().optional()
|
|
1109
1326
|
});
|
|
1110
|
-
var DriveKeyPressInputSchema =
|
|
1111
|
-
session_id:
|
|
1112
|
-
key:
|
|
1327
|
+
var DriveKeyPressInputSchema = import_zod3.z.object({
|
|
1328
|
+
session_id: import_zod3.z.string().min(1),
|
|
1329
|
+
key: import_zod3.z.string().min(1),
|
|
1113
1330
|
modifiers: DriveKeyModifiersSchema.optional(),
|
|
1114
|
-
tab_id:
|
|
1331
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1115
1332
|
});
|
|
1116
1333
|
var DriveKeyPressOutputSchema = OpResultSchema;
|
|
1117
|
-
var DriveKeyModifierSchema =
|
|
1118
|
-
var DriveKeyInputSchema =
|
|
1119
|
-
session_id:
|
|
1120
|
-
key:
|
|
1121
|
-
modifiers:
|
|
1122
|
-
repeat:
|
|
1123
|
-
tab_id:
|
|
1334
|
+
var DriveKeyModifierSchema = import_zod3.z.enum(["ctrl", "alt", "shift", "meta"]);
|
|
1335
|
+
var DriveKeyInputSchema = import_zod3.z.object({
|
|
1336
|
+
session_id: import_zod3.z.string().min(1),
|
|
1337
|
+
key: import_zod3.z.string().min(1),
|
|
1338
|
+
modifiers: import_zod3.z.array(DriveKeyModifierSchema).optional(),
|
|
1339
|
+
repeat: import_zod3.z.number().int().min(1).max(50).optional(),
|
|
1340
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1124
1341
|
});
|
|
1125
1342
|
var DriveKeyOutputSchema = OpResultSchema;
|
|
1126
|
-
var DriveScrollInputSchema =
|
|
1127
|
-
session_id:
|
|
1128
|
-
delta_x:
|
|
1129
|
-
delta_y:
|
|
1130
|
-
top:
|
|
1131
|
-
left:
|
|
1132
|
-
behavior:
|
|
1133
|
-
tab_id:
|
|
1343
|
+
var DriveScrollInputSchema = import_zod3.z.object({
|
|
1344
|
+
session_id: import_zod3.z.string().min(1),
|
|
1345
|
+
delta_x: import_zod3.z.number().finite().optional(),
|
|
1346
|
+
delta_y: import_zod3.z.number().finite().optional(),
|
|
1347
|
+
top: import_zod3.z.number().finite().optional(),
|
|
1348
|
+
left: import_zod3.z.number().finite().optional(),
|
|
1349
|
+
behavior: import_zod3.z.enum(["auto", "smooth"]).optional(),
|
|
1350
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1134
1351
|
}).refine(
|
|
1135
1352
|
(value) => value.delta_x !== void 0 || value.delta_y !== void 0 || value.top !== void 0 || value.left !== void 0,
|
|
1136
1353
|
{
|
|
@@ -1139,239 +1356,239 @@ var DriveScrollInputSchema = import_zod2.z.object({
|
|
|
1139
1356
|
}
|
|
1140
1357
|
);
|
|
1141
1358
|
var DriveScrollOutputSchema = OpResultSchema;
|
|
1142
|
-
var DriveWaitForInputSchema =
|
|
1143
|
-
session_id:
|
|
1359
|
+
var DriveWaitForInputSchema = import_zod3.z.object({
|
|
1360
|
+
session_id: import_zod3.z.string().min(1),
|
|
1144
1361
|
condition: DriveWaitConditionSchema,
|
|
1145
|
-
timeout_ms:
|
|
1146
|
-
tab_id:
|
|
1362
|
+
timeout_ms: import_zod3.z.number().finite().optional(),
|
|
1363
|
+
tab_id: import_zod3.z.number().finite().optional()
|
|
1147
1364
|
});
|
|
1148
1365
|
var DriveWaitForOutputSchema = OpResultSchema;
|
|
1149
|
-
var DriveTabInfoSchema =
|
|
1150
|
-
tab_id:
|
|
1151
|
-
window_id:
|
|
1152
|
-
url:
|
|
1153
|
-
title:
|
|
1154
|
-
active:
|
|
1155
|
-
last_active_at:
|
|
1366
|
+
var DriveTabInfoSchema = import_zod3.z.object({
|
|
1367
|
+
tab_id: import_zod3.z.number().finite(),
|
|
1368
|
+
window_id: import_zod3.z.number().finite(),
|
|
1369
|
+
url: import_zod3.z.string().min(1),
|
|
1370
|
+
title: import_zod3.z.string(),
|
|
1371
|
+
active: import_zod3.z.boolean().optional(),
|
|
1372
|
+
last_active_at: import_zod3.z.string().datetime().optional()
|
|
1156
1373
|
});
|
|
1157
1374
|
var DriveTabListInputSchema = SessionIdSchema;
|
|
1158
|
-
var DriveTabListOutputSchema =
|
|
1159
|
-
tabs:
|
|
1375
|
+
var DriveTabListOutputSchema = import_zod3.z.object({
|
|
1376
|
+
tabs: import_zod3.z.array(DriveTabInfoSchema)
|
|
1160
1377
|
});
|
|
1161
|
-
var DriveTabActivateInputSchema =
|
|
1162
|
-
session_id:
|
|
1163
|
-
tab_id:
|
|
1378
|
+
var DriveTabActivateInputSchema = import_zod3.z.object({
|
|
1379
|
+
session_id: import_zod3.z.string().min(1),
|
|
1380
|
+
tab_id: import_zod3.z.number().finite()
|
|
1164
1381
|
});
|
|
1165
1382
|
var DriveTabActivateOutputSchema = OpResultSchema;
|
|
1166
|
-
var DriveTabCloseInputSchema =
|
|
1167
|
-
session_id:
|
|
1168
|
-
tab_id:
|
|
1383
|
+
var DriveTabCloseInputSchema = import_zod3.z.object({
|
|
1384
|
+
session_id: import_zod3.z.string().min(1),
|
|
1385
|
+
tab_id: import_zod3.z.number().finite()
|
|
1169
1386
|
});
|
|
1170
1387
|
var DriveTabCloseOutputSchema = OpResultSchema;
|
|
1171
|
-
var InspectDomFormatSchema =
|
|
1172
|
-
var InspectConsistencySchema =
|
|
1173
|
-
var TargetHintSchema =
|
|
1174
|
-
url:
|
|
1175
|
-
title:
|
|
1176
|
-
last_active_at:
|
|
1177
|
-
lastActiveAt:
|
|
1388
|
+
var InspectDomFormatSchema = import_zod3.z.enum(["ax", "html"]);
|
|
1389
|
+
var InspectConsistencySchema = import_zod3.z.enum(["best_effort", "quiesce"]);
|
|
1390
|
+
var TargetHintSchema = import_zod3.z.object({
|
|
1391
|
+
url: import_zod3.z.string().min(1).optional(),
|
|
1392
|
+
title: import_zod3.z.string().min(1).optional(),
|
|
1393
|
+
last_active_at: import_zod3.z.string().optional(),
|
|
1394
|
+
lastActiveAt: import_zod3.z.string().optional()
|
|
1178
1395
|
});
|
|
1179
|
-
var FormFieldInfoSchema =
|
|
1180
|
-
name:
|
|
1181
|
-
type:
|
|
1182
|
-
value:
|
|
1183
|
-
options:
|
|
1396
|
+
var FormFieldInfoSchema = import_zod3.z.object({
|
|
1397
|
+
name: import_zod3.z.string(),
|
|
1398
|
+
type: import_zod3.z.string(),
|
|
1399
|
+
value: import_zod3.z.string(),
|
|
1400
|
+
options: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
1184
1401
|
});
|
|
1185
|
-
var FormInfoSchema =
|
|
1186
|
-
selector:
|
|
1187
|
-
action:
|
|
1188
|
-
method:
|
|
1189
|
-
fields:
|
|
1402
|
+
var FormInfoSchema = import_zod3.z.object({
|
|
1403
|
+
selector: import_zod3.z.string(),
|
|
1404
|
+
action: import_zod3.z.string().optional(),
|
|
1405
|
+
method: import_zod3.z.string().optional(),
|
|
1406
|
+
fields: import_zod3.z.array(FormFieldInfoSchema)
|
|
1190
1407
|
});
|
|
1191
|
-
var StorageEntrySchema =
|
|
1192
|
-
key:
|
|
1193
|
-
value:
|
|
1408
|
+
var StorageEntrySchema = import_zod3.z.object({
|
|
1409
|
+
key: import_zod3.z.string(),
|
|
1410
|
+
value: import_zod3.z.string()
|
|
1194
1411
|
});
|
|
1195
|
-
var PageStateSchema =
|
|
1196
|
-
forms:
|
|
1197
|
-
localStorage:
|
|
1198
|
-
sessionStorage:
|
|
1199
|
-
cookies:
|
|
1200
|
-
warnings:
|
|
1412
|
+
var PageStateSchema = import_zod3.z.object({
|
|
1413
|
+
forms: import_zod3.z.array(FormInfoSchema),
|
|
1414
|
+
localStorage: import_zod3.z.array(StorageEntrySchema),
|
|
1415
|
+
sessionStorage: import_zod3.z.array(StorageEntrySchema),
|
|
1416
|
+
cookies: import_zod3.z.array(StorageEntrySchema),
|
|
1417
|
+
warnings: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
1201
1418
|
});
|
|
1202
|
-
var DomSnapshotSchema =
|
|
1419
|
+
var DomSnapshotSchema = import_zod3.z.object({
|
|
1203
1420
|
format: InspectDomFormatSchema,
|
|
1204
|
-
snapshot:
|
|
1421
|
+
snapshot: import_zod3.z.unknown()
|
|
1205
1422
|
}).passthrough();
|
|
1206
|
-
var InspectDomSnapshotInputSchema =
|
|
1207
|
-
session_id:
|
|
1423
|
+
var InspectDomSnapshotInputSchema = import_zod3.z.object({
|
|
1424
|
+
session_id: import_zod3.z.string().min(1),
|
|
1208
1425
|
format: InspectDomFormatSchema.default("ax"),
|
|
1209
1426
|
consistency: InspectConsistencySchema.default("best_effort"),
|
|
1210
|
-
interactive:
|
|
1211
|
-
compact:
|
|
1427
|
+
interactive: import_zod3.z.boolean().default(false),
|
|
1428
|
+
compact: import_zod3.z.boolean().default(false),
|
|
1212
1429
|
// Used primarily to bound large AX trees for LLM/agent consumption.
|
|
1213
1430
|
// CLI passes this as a string, so coerce for convenience.
|
|
1214
|
-
max_nodes:
|
|
1215
|
-
selector:
|
|
1431
|
+
max_nodes: import_zod3.z.coerce.number().int().positive().max(5e4).optional(),
|
|
1432
|
+
selector: import_zod3.z.string().min(1).optional(),
|
|
1216
1433
|
target: TargetHintSchema.optional()
|
|
1217
1434
|
});
|
|
1218
1435
|
var InspectDomSnapshotOutputSchema = DomSnapshotSchema;
|
|
1219
|
-
var DomDiffResultSchema =
|
|
1220
|
-
added:
|
|
1221
|
-
removed:
|
|
1222
|
-
changed:
|
|
1223
|
-
summary:
|
|
1436
|
+
var DomDiffResultSchema = import_zod3.z.object({
|
|
1437
|
+
added: import_zod3.z.array(import_zod3.z.string()),
|
|
1438
|
+
removed: import_zod3.z.array(import_zod3.z.string()),
|
|
1439
|
+
changed: import_zod3.z.array(import_zod3.z.string()),
|
|
1440
|
+
summary: import_zod3.z.string()
|
|
1224
1441
|
});
|
|
1225
1442
|
var InspectDomDiffInputSchema = SessionIdSchema;
|
|
1226
1443
|
var InspectDomDiffOutputSchema = DomDiffResultSchema;
|
|
1227
1444
|
var InspectFindRoleInputSchema = SessionIdSchema.extend({
|
|
1228
|
-
kind:
|
|
1229
|
-
role:
|
|
1230
|
-
name:
|
|
1445
|
+
kind: import_zod3.z.literal("role"),
|
|
1446
|
+
role: import_zod3.z.string().min(1),
|
|
1447
|
+
name: import_zod3.z.string().min(1).optional(),
|
|
1231
1448
|
target: TargetHintSchema.optional()
|
|
1232
1449
|
});
|
|
1233
1450
|
var InspectFindTextInputSchema = SessionIdSchema.extend({
|
|
1234
|
-
kind:
|
|
1235
|
-
text:
|
|
1451
|
+
kind: import_zod3.z.literal("text"),
|
|
1452
|
+
text: import_zod3.z.string().min(1),
|
|
1236
1453
|
target: TargetHintSchema.optional()
|
|
1237
1454
|
});
|
|
1238
1455
|
var InspectFindLabelInputSchema = SessionIdSchema.extend({
|
|
1239
|
-
kind:
|
|
1240
|
-
label:
|
|
1456
|
+
kind: import_zod3.z.literal("label"),
|
|
1457
|
+
label: import_zod3.z.string().min(1),
|
|
1241
1458
|
target: TargetHintSchema.optional()
|
|
1242
1459
|
});
|
|
1243
|
-
var InspectFindInputSchema =
|
|
1460
|
+
var InspectFindInputSchema = import_zod3.z.discriminatedUnion("kind", [
|
|
1244
1461
|
InspectFindRoleInputSchema,
|
|
1245
1462
|
InspectFindTextInputSchema,
|
|
1246
1463
|
InspectFindLabelInputSchema
|
|
1247
1464
|
]);
|
|
1248
|
-
var InspectFindMatchSchema =
|
|
1249
|
-
ref:
|
|
1250
|
-
role:
|
|
1251
|
-
name:
|
|
1465
|
+
var InspectFindMatchSchema = import_zod3.z.object({
|
|
1466
|
+
ref: import_zod3.z.string(),
|
|
1467
|
+
role: import_zod3.z.string().optional(),
|
|
1468
|
+
name: import_zod3.z.string().optional()
|
|
1252
1469
|
});
|
|
1253
|
-
var InspectFindOutputSchema =
|
|
1254
|
-
matches:
|
|
1255
|
-
warnings:
|
|
1470
|
+
var InspectFindOutputSchema = import_zod3.z.object({
|
|
1471
|
+
matches: import_zod3.z.array(InspectFindMatchSchema),
|
|
1472
|
+
warnings: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
1256
1473
|
});
|
|
1257
1474
|
var InspectPageStateInputSchema = SessionIdSchema.extend({
|
|
1258
1475
|
target: TargetHintSchema.optional()
|
|
1259
1476
|
});
|
|
1260
1477
|
var InspectPageStateOutputSchema = PageStateSchema;
|
|
1261
|
-
var InspectExtractContentFormatSchema =
|
|
1478
|
+
var InspectExtractContentFormatSchema = import_zod3.z.enum([
|
|
1262
1479
|
"markdown",
|
|
1263
1480
|
"text",
|
|
1264
1481
|
"article_json"
|
|
1265
1482
|
]);
|
|
1266
1483
|
var InspectExtractContentInputSchema = SessionIdSchema.extend({
|
|
1267
1484
|
format: InspectExtractContentFormatSchema.default("markdown"),
|
|
1268
|
-
include_metadata:
|
|
1485
|
+
include_metadata: import_zod3.z.boolean().default(true),
|
|
1269
1486
|
target: TargetHintSchema.optional()
|
|
1270
1487
|
});
|
|
1271
|
-
var InspectExtractContentOutputSchema =
|
|
1272
|
-
content:
|
|
1273
|
-
title:
|
|
1274
|
-
byline:
|
|
1275
|
-
excerpt:
|
|
1276
|
-
siteName:
|
|
1277
|
-
warnings:
|
|
1488
|
+
var InspectExtractContentOutputSchema = import_zod3.z.object({
|
|
1489
|
+
content: import_zod3.z.string(),
|
|
1490
|
+
title: import_zod3.z.string().optional(),
|
|
1491
|
+
byline: import_zod3.z.string().optional(),
|
|
1492
|
+
excerpt: import_zod3.z.string().optional(),
|
|
1493
|
+
siteName: import_zod3.z.string().optional(),
|
|
1494
|
+
warnings: import_zod3.z.array(import_zod3.z.string()).optional()
|
|
1278
1495
|
});
|
|
1279
1496
|
var InspectConsoleListInputSchema = SessionIdSchema.extend({
|
|
1280
1497
|
target: TargetHintSchema.optional()
|
|
1281
1498
|
});
|
|
1282
|
-
var ConsoleSourceLocationSchema =
|
|
1283
|
-
url:
|
|
1499
|
+
var ConsoleSourceLocationSchema = import_zod3.z.object({
|
|
1500
|
+
url: import_zod3.z.string().optional(),
|
|
1284
1501
|
// 1-based line/column for human readability.
|
|
1285
|
-
line:
|
|
1286
|
-
column:
|
|
1502
|
+
line: import_zod3.z.number().int().positive().optional(),
|
|
1503
|
+
column: import_zod3.z.number().int().positive().optional()
|
|
1287
1504
|
}).passthrough();
|
|
1288
|
-
var ConsoleStackFrameSchema =
|
|
1289
|
-
functionName:
|
|
1290
|
-
url:
|
|
1505
|
+
var ConsoleStackFrameSchema = import_zod3.z.object({
|
|
1506
|
+
functionName: import_zod3.z.string().optional(),
|
|
1507
|
+
url: import_zod3.z.string().optional(),
|
|
1291
1508
|
// 1-based line/column for human readability.
|
|
1292
|
-
line:
|
|
1293
|
-
column:
|
|
1509
|
+
line: import_zod3.z.number().int().positive().optional(),
|
|
1510
|
+
column: import_zod3.z.number().int().positive().optional()
|
|
1294
1511
|
}).passthrough();
|
|
1295
|
-
var ConsoleRemoteObjectSchema =
|
|
1296
|
-
type:
|
|
1297
|
-
subtype:
|
|
1298
|
-
description:
|
|
1299
|
-
value:
|
|
1300
|
-
unserializableValue:
|
|
1512
|
+
var ConsoleRemoteObjectSchema = import_zod3.z.object({
|
|
1513
|
+
type: import_zod3.z.string().optional(),
|
|
1514
|
+
subtype: import_zod3.z.string().optional(),
|
|
1515
|
+
description: import_zod3.z.string().optional(),
|
|
1516
|
+
value: import_zod3.z.unknown().optional(),
|
|
1517
|
+
unserializableValue: import_zod3.z.string().optional()
|
|
1301
1518
|
}).passthrough();
|
|
1302
|
-
var ConsoleEntrySchema =
|
|
1303
|
-
level:
|
|
1304
|
-
text:
|
|
1305
|
-
timestamp:
|
|
1519
|
+
var ConsoleEntrySchema = import_zod3.z.object({
|
|
1520
|
+
level: import_zod3.z.string().optional(),
|
|
1521
|
+
text: import_zod3.z.string().optional(),
|
|
1522
|
+
timestamp: import_zod3.z.string().datetime().optional(),
|
|
1306
1523
|
source: ConsoleSourceLocationSchema.optional(),
|
|
1307
|
-
stack:
|
|
1524
|
+
stack: import_zod3.z.array(ConsoleStackFrameSchema).optional(),
|
|
1308
1525
|
exception: ConsoleRemoteObjectSchema.optional(),
|
|
1309
|
-
args:
|
|
1526
|
+
args: import_zod3.z.array(ConsoleRemoteObjectSchema).optional()
|
|
1310
1527
|
}).passthrough();
|
|
1311
|
-
var ConsoleListSchema =
|
|
1312
|
-
entries:
|
|
1528
|
+
var ConsoleListSchema = import_zod3.z.object({
|
|
1529
|
+
entries: import_zod3.z.array(ConsoleEntrySchema)
|
|
1313
1530
|
}).passthrough();
|
|
1314
1531
|
var InspectConsoleListOutputSchema = ConsoleListSchema;
|
|
1315
|
-
var ArtifactInfoSchema =
|
|
1316
|
-
artifact_id:
|
|
1317
|
-
path:
|
|
1318
|
-
mime:
|
|
1532
|
+
var ArtifactInfoSchema = import_zod3.z.object({
|
|
1533
|
+
artifact_id: import_zod3.z.string(),
|
|
1534
|
+
path: import_zod3.z.string(),
|
|
1535
|
+
mime: import_zod3.z.string()
|
|
1319
1536
|
});
|
|
1320
1537
|
var InspectNetworkHarInputSchema = SessionIdSchema.extend({
|
|
1321
1538
|
target: TargetHintSchema.optional()
|
|
1322
1539
|
});
|
|
1323
1540
|
var InspectNetworkHarOutputSchema = ArtifactInfoSchema;
|
|
1324
|
-
var InspectEvaluateInputSchema =
|
|
1325
|
-
session_id:
|
|
1326
|
-
expression:
|
|
1541
|
+
var InspectEvaluateInputSchema = import_zod3.z.object({
|
|
1542
|
+
session_id: import_zod3.z.string().min(1),
|
|
1543
|
+
expression: import_zod3.z.string().min(1).optional(),
|
|
1327
1544
|
target: TargetHintSchema.optional()
|
|
1328
1545
|
});
|
|
1329
|
-
var EvaluateResultSchema =
|
|
1330
|
-
value:
|
|
1331
|
-
exception:
|
|
1546
|
+
var EvaluateResultSchema = import_zod3.z.object({
|
|
1547
|
+
value: import_zod3.z.unknown().optional(),
|
|
1548
|
+
exception: import_zod3.z.unknown().optional()
|
|
1332
1549
|
}).passthrough();
|
|
1333
1550
|
var InspectEvaluateOutputSchema = EvaluateResultSchema;
|
|
1334
1551
|
var InspectPerformanceMetricsInputSchema = SessionIdSchema.extend({
|
|
1335
1552
|
target: TargetHintSchema.optional()
|
|
1336
1553
|
});
|
|
1337
|
-
var PerformanceMetricSchema =
|
|
1338
|
-
name:
|
|
1339
|
-
value:
|
|
1554
|
+
var PerformanceMetricSchema = import_zod3.z.object({
|
|
1555
|
+
name: import_zod3.z.string(),
|
|
1556
|
+
value: import_zod3.z.number().finite()
|
|
1340
1557
|
}).passthrough();
|
|
1341
|
-
var PerformanceMetricsSchema =
|
|
1342
|
-
metrics:
|
|
1558
|
+
var PerformanceMetricsSchema = import_zod3.z.object({
|
|
1559
|
+
metrics: import_zod3.z.array(PerformanceMetricSchema)
|
|
1343
1560
|
}).passthrough();
|
|
1344
1561
|
var InspectPerformanceMetricsOutputSchema = PerformanceMetricsSchema;
|
|
1345
|
-
var ArtifactsScreenshotInputSchema =
|
|
1346
|
-
session_id:
|
|
1347
|
-
target:
|
|
1348
|
-
fullPage:
|
|
1349
|
-
selector:
|
|
1350
|
-
format:
|
|
1351
|
-
quality:
|
|
1562
|
+
var ArtifactsScreenshotInputSchema = import_zod3.z.object({
|
|
1563
|
+
session_id: import_zod3.z.string().min(1),
|
|
1564
|
+
target: import_zod3.z.enum(["viewport", "full"]).default("viewport"),
|
|
1565
|
+
fullPage: import_zod3.z.boolean().default(false),
|
|
1566
|
+
selector: import_zod3.z.string().min(1).optional(),
|
|
1567
|
+
format: import_zod3.z.enum(["png", "jpeg", "webp"]).default("png"),
|
|
1568
|
+
quality: import_zod3.z.number().min(0).max(100).optional()
|
|
1352
1569
|
});
|
|
1353
1570
|
var ArtifactsScreenshotOutputSchema = ArtifactInfoSchema;
|
|
1354
|
-
var HealthCheckInputSchema =
|
|
1355
|
-
var HealthCheckOutputSchema =
|
|
1356
|
-
started_at:
|
|
1357
|
-
uptime_ms:
|
|
1358
|
-
memory:
|
|
1359
|
-
rss:
|
|
1360
|
-
heapTotal:
|
|
1361
|
-
heapUsed:
|
|
1362
|
-
external:
|
|
1363
|
-
arrayBuffers:
|
|
1571
|
+
var HealthCheckInputSchema = import_zod3.z.object({});
|
|
1572
|
+
var HealthCheckOutputSchema = import_zod3.z.object({
|
|
1573
|
+
started_at: import_zod3.z.string().min(1),
|
|
1574
|
+
uptime_ms: import_zod3.z.number().finite().nonnegative(),
|
|
1575
|
+
memory: import_zod3.z.object({
|
|
1576
|
+
rss: import_zod3.z.number().finite().nonnegative(),
|
|
1577
|
+
heapTotal: import_zod3.z.number().finite().nonnegative(),
|
|
1578
|
+
heapUsed: import_zod3.z.number().finite().nonnegative(),
|
|
1579
|
+
external: import_zod3.z.number().finite().nonnegative(),
|
|
1580
|
+
arrayBuffers: import_zod3.z.number().finite().nonnegative().optional()
|
|
1364
1581
|
}).passthrough(),
|
|
1365
|
-
sessions:
|
|
1366
|
-
active:
|
|
1582
|
+
sessions: import_zod3.z.object({
|
|
1583
|
+
active: import_zod3.z.number().finite().nonnegative()
|
|
1367
1584
|
}).passthrough(),
|
|
1368
|
-
extension:
|
|
1369
|
-
connected:
|
|
1370
|
-
last_seen_at:
|
|
1585
|
+
extension: import_zod3.z.object({
|
|
1586
|
+
connected: import_zod3.z.boolean(),
|
|
1587
|
+
last_seen_at: import_zod3.z.string().min(1).optional()
|
|
1371
1588
|
}).passthrough()
|
|
1372
1589
|
}).passthrough();
|
|
1373
|
-
var DiagnosticsDoctorInputSchema =
|
|
1374
|
-
session_id:
|
|
1590
|
+
var DiagnosticsDoctorInputSchema = import_zod3.z.object({
|
|
1591
|
+
session_id: import_zod3.z.string().min(1).optional(),
|
|
1375
1592
|
caller: DiagnosticsRuntimeCallerSchema.optional()
|
|
1376
1593
|
});
|
|
1377
1594
|
var DiagnosticsDoctorOutputSchema = DiagnosticReportSchema;
|
|
@@ -1452,7 +1669,7 @@ var transitionSession = (state, event) => {
|
|
|
1452
1669
|
throw new InvalidSessionTransition(state, event);
|
|
1453
1670
|
};
|
|
1454
1671
|
var shouldRetryDriveOp = (options) => {
|
|
1455
|
-
return options
|
|
1672
|
+
return shouldRetryByPolicy(options);
|
|
1456
1673
|
};
|
|
1457
1674
|
|
|
1458
1675
|
// packages/core/src/session.ts
|
|
@@ -1579,39 +1796,30 @@ var SessionRegistry = class {
|
|
|
1579
1796
|
|
|
1580
1797
|
// packages/core/src/routes/shared.ts
|
|
1581
1798
|
var sendError = (res, status, error) => {
|
|
1582
|
-
res.status(status).json({ ok: false, error });
|
|
1799
|
+
res.status(status).json({ ok: false, error: normalizeErrorInfo(error) });
|
|
1583
1800
|
};
|
|
1584
1801
|
var sendResult = (res, result) => {
|
|
1585
1802
|
res.status(200).json({ ok: true, result });
|
|
1586
1803
|
};
|
|
1587
|
-
var
|
|
1804
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1588
1805
|
var errorStatus = (code) => {
|
|
1589
|
-
switch (code) {
|
|
1806
|
+
switch (normalizeErrorCode(code)) {
|
|
1590
1807
|
case "INVALID_ARGUMENT":
|
|
1591
1808
|
return 400;
|
|
1592
1809
|
case "UNAUTHORIZED":
|
|
1593
1810
|
return 401;
|
|
1594
1811
|
case "FORBIDDEN":
|
|
1595
|
-
case "PERMISSION_REQUIRED":
|
|
1596
|
-
case "PERMISSION_PROMPT_TIMEOUT":
|
|
1597
|
-
case "PERMISSION_DENIED":
|
|
1598
1812
|
return 403;
|
|
1599
|
-
case "
|
|
1600
|
-
case "TAB_NOT_FOUND":
|
|
1601
|
-
case "LOCATOR_NOT_FOUND":
|
|
1813
|
+
case "NOT_FOUND":
|
|
1602
1814
|
return 404;
|
|
1603
|
-
case "SESSION_CLOSED":
|
|
1604
1815
|
case "FAILED_PRECONDITION":
|
|
1605
|
-
case "DEBUGGER_IN_USE":
|
|
1606
1816
|
return 409;
|
|
1607
|
-
case "ATTACH_DENIED":
|
|
1608
|
-
return 403;
|
|
1609
|
-
case "NOT_SUPPORTED":
|
|
1610
1817
|
case "NOT_IMPLEMENTED":
|
|
1611
1818
|
return 501;
|
|
1612
|
-
case "
|
|
1613
|
-
case "INSPECT_UNAVAILABLE":
|
|
1819
|
+
case "UNAVAILABLE":
|
|
1614
1820
|
return 503;
|
|
1821
|
+
case "CONFLICT":
|
|
1822
|
+
return 409;
|
|
1615
1823
|
case "TIMEOUT":
|
|
1616
1824
|
return 504;
|
|
1617
1825
|
case "RATE_LIMITED":
|
|
@@ -1650,7 +1858,7 @@ var deriveHintFromTabs = (tabs) => {
|
|
|
1650
1858
|
|
|
1651
1859
|
// packages/core/src/routes/session.ts
|
|
1652
1860
|
var readSessionId = (body) => {
|
|
1653
|
-
if (!
|
|
1861
|
+
if (!isRecord2(body)) {
|
|
1654
1862
|
return void 0;
|
|
1655
1863
|
}
|
|
1656
1864
|
const sessionId = body.session_id;
|
|
@@ -1664,7 +1872,7 @@ var createSessionRouter = (registry, options = {}) => {
|
|
|
1664
1872
|
router.post("/create", (req, res) => {
|
|
1665
1873
|
const body = req.body;
|
|
1666
1874
|
if (body !== void 0) {
|
|
1667
|
-
if (!
|
|
1875
|
+
if (!isRecord2(body)) {
|
|
1668
1876
|
return sendError(res, 400, {
|
|
1669
1877
|
code: "INVALID_ARGUMENT",
|
|
1670
1878
|
message: "Request body must be an object.",
|
|
@@ -1878,6 +2086,8 @@ var ExtensionBridge = class {
|
|
|
1878
2086
|
this.socket = null;
|
|
1879
2087
|
this.pending = /* @__PURE__ */ new Map();
|
|
1880
2088
|
this.connected = false;
|
|
2089
|
+
this.capabilityNegotiated = false;
|
|
2090
|
+
this.capabilities = {};
|
|
1881
2091
|
this.tabs = [];
|
|
1882
2092
|
this.badMessageLogsRemaining = 3;
|
|
1883
2093
|
this.heartbeatInterval = null;
|
|
@@ -1912,9 +2122,13 @@ var ExtensionBridge = class {
|
|
|
1912
2122
|
connected: this.connected,
|
|
1913
2123
|
lastSeenAt: this.lastSeenAt,
|
|
1914
2124
|
version: this.version,
|
|
2125
|
+
protocolVersion: this.protocolVersion,
|
|
2126
|
+
protocolMismatch: this.protocolMismatch,
|
|
1915
2127
|
coreHost: this.coreHost,
|
|
1916
2128
|
corePort: this.corePort,
|
|
1917
2129
|
corePortSource: this.corePortSource,
|
|
2130
|
+
capabilityNegotiated: this.capabilityNegotiated,
|
|
2131
|
+
capabilities: this.capabilities,
|
|
1918
2132
|
tabs: this.tabs
|
|
1919
2133
|
};
|
|
1920
2134
|
}
|
|
@@ -1933,6 +2147,14 @@ var ExtensionBridge = class {
|
|
|
1933
2147
|
};
|
|
1934
2148
|
}
|
|
1935
2149
|
async requestInternal(action, params, timeoutMs = 3e4) {
|
|
2150
|
+
if (this.protocolMismatch && action !== "drive.ping") {
|
|
2151
|
+
throw new ExtensionBridgeError(
|
|
2152
|
+
"FAILED_PRECONDITION",
|
|
2153
|
+
"Extension protocol version mismatch.",
|
|
2154
|
+
false,
|
|
2155
|
+
this.protocolMismatch
|
|
2156
|
+
);
|
|
2157
|
+
}
|
|
1936
2158
|
if (!this.socket || this.socket.readyState !== import_ws.WebSocket.OPEN) {
|
|
1937
2159
|
throw new ExtensionBridgeError(
|
|
1938
2160
|
"EXTENSION_DISCONNECTED",
|
|
@@ -1940,6 +2162,35 @@ var ExtensionBridge = class {
|
|
|
1940
2162
|
true
|
|
1941
2163
|
);
|
|
1942
2164
|
}
|
|
2165
|
+
if (action !== "drive.ping") {
|
|
2166
|
+
if (!this.capabilityNegotiated) {
|
|
2167
|
+
throw new ExtensionBridgeError(
|
|
2168
|
+
"FAILED_PRECONDITION",
|
|
2169
|
+
"Capability negotiation has not completed yet.",
|
|
2170
|
+
true,
|
|
2171
|
+
{ action, expected: "drive.hello.capabilities" }
|
|
2172
|
+
);
|
|
2173
|
+
}
|
|
2174
|
+
if (this.capabilityNegotiationFailure) {
|
|
2175
|
+
throw new ExtensionBridgeError(
|
|
2176
|
+
"FAILED_PRECONDITION",
|
|
2177
|
+
"Capability negotiation failed: extension hello payload is missing capabilities.",
|
|
2178
|
+
false,
|
|
2179
|
+
{
|
|
2180
|
+
action,
|
|
2181
|
+
...this.capabilityNegotiationFailure
|
|
2182
|
+
}
|
|
2183
|
+
);
|
|
2184
|
+
}
|
|
2185
|
+
if (this.capabilities[action] !== true) {
|
|
2186
|
+
throw new ExtensionBridgeError(
|
|
2187
|
+
"NOT_IMPLEMENTED",
|
|
2188
|
+
`Extension does not advertise capability for ${action}.`,
|
|
2189
|
+
false,
|
|
2190
|
+
{ action }
|
|
2191
|
+
);
|
|
2192
|
+
}
|
|
2193
|
+
}
|
|
1943
2194
|
const id = (0, import_crypto2.randomUUID)();
|
|
1944
2195
|
const request = typeof action === "string" && action.startsWith("debugger.") ? {
|
|
1945
2196
|
id,
|
|
@@ -2051,9 +2302,14 @@ var ExtensionBridge = class {
|
|
|
2051
2302
|
this.connected = false;
|
|
2052
2303
|
this.socket = null;
|
|
2053
2304
|
this.version = void 0;
|
|
2305
|
+
this.protocolVersion = void 0;
|
|
2306
|
+
this.protocolMismatch = void 0;
|
|
2054
2307
|
this.coreHost = void 0;
|
|
2055
2308
|
this.corePort = void 0;
|
|
2056
2309
|
this.corePortSource = void 0;
|
|
2310
|
+
this.capabilityNegotiated = false;
|
|
2311
|
+
this.capabilityNegotiationFailure = void 0;
|
|
2312
|
+
this.capabilities = {};
|
|
2057
2313
|
this.lastSeenAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
2058
2314
|
this.applyDriveDisconnected();
|
|
2059
2315
|
for (const [id, pending] of this.pending.entries()) {
|
|
@@ -2110,6 +2366,19 @@ var ExtensionBridge = class {
|
|
|
2110
2366
|
if (typeof params?.version === "string") {
|
|
2111
2367
|
this.version = params.version;
|
|
2112
2368
|
}
|
|
2369
|
+
if (typeof params?.protocol_version === "string") {
|
|
2370
|
+
this.protocolVersion = params.protocol_version;
|
|
2371
|
+
} else {
|
|
2372
|
+
this.protocolVersion = void 0;
|
|
2373
|
+
}
|
|
2374
|
+
if (this.protocolVersion && this.protocolVersion !== DRIVE_WS_PROTOCOL_VERSION) {
|
|
2375
|
+
this.protocolMismatch = {
|
|
2376
|
+
expected: DRIVE_WS_PROTOCOL_VERSION,
|
|
2377
|
+
received: this.protocolVersion
|
|
2378
|
+
};
|
|
2379
|
+
} else {
|
|
2380
|
+
this.protocolMismatch = void 0;
|
|
2381
|
+
}
|
|
2113
2382
|
if (typeof params?.core_host === "string") {
|
|
2114
2383
|
this.coreHost = params.core_host;
|
|
2115
2384
|
}
|
|
@@ -2119,6 +2388,23 @@ var ExtensionBridge = class {
|
|
|
2119
2388
|
if (params?.core_port_source === "default" || params?.core_port_source === "storage") {
|
|
2120
2389
|
this.corePortSource = params.core_port_source;
|
|
2121
2390
|
}
|
|
2391
|
+
const capabilities = params?.capabilities;
|
|
2392
|
+
if (capabilities && typeof capabilities === "object") {
|
|
2393
|
+
this.capabilities = Object.fromEntries(
|
|
2394
|
+
Object.entries(capabilities).filter(
|
|
2395
|
+
([name, supported]) => typeof name === "string" && typeof supported === "boolean"
|
|
2396
|
+
)
|
|
2397
|
+
);
|
|
2398
|
+
this.capabilityNegotiated = true;
|
|
2399
|
+
this.capabilityNegotiationFailure = void 0;
|
|
2400
|
+
} else {
|
|
2401
|
+
this.capabilities = {};
|
|
2402
|
+
this.capabilityNegotiated = true;
|
|
2403
|
+
this.capabilityNegotiationFailure = {
|
|
2404
|
+
reason: "missing_capabilities",
|
|
2405
|
+
expected: "drive.hello.capabilities"
|
|
2406
|
+
};
|
|
2407
|
+
}
|
|
2122
2408
|
}
|
|
2123
2409
|
}
|
|
2124
2410
|
if (typeof message.action === "string" && message.action.startsWith("debugger.")) {
|
|
@@ -2177,10 +2463,80 @@ var toDriveError = (error) => ({
|
|
|
2177
2463
|
code: error.code,
|
|
2178
2464
|
message: error.message,
|
|
2179
2465
|
retryable: error.retryable,
|
|
2466
|
+
retry: {
|
|
2467
|
+
retryable: error.retryable,
|
|
2468
|
+
reason: String(error.code).toLowerCase(),
|
|
2469
|
+
max_attempts: 1
|
|
2470
|
+
},
|
|
2180
2471
|
...error.details ? { details: error.details } : {}
|
|
2181
2472
|
});
|
|
2182
2473
|
|
|
2183
2474
|
// packages/core/src/drive.ts
|
|
2475
|
+
var LOOPBACK_NAVIGATION_PREFLIGHT_TIMEOUT_MS = 1200;
|
|
2476
|
+
var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
|
|
2477
|
+
var isLikelyUnreachableLoopbackError = (message) => {
|
|
2478
|
+
const normalized = message.toLowerCase();
|
|
2479
|
+
return normalized.includes("connection refused") || normalized.includes("econnrefused") || normalized.includes("err_connection_refused") || normalized.includes("enotfound") || normalized.includes("err_name_not_resolved") || normalized.includes("eai_again") || normalized.includes("ehostunreach") || normalized.includes("enetunreach");
|
|
2480
|
+
};
|
|
2481
|
+
var preflightLoopbackNavigation = async (action, params) => {
|
|
2482
|
+
if (action !== "drive.navigate") {
|
|
2483
|
+
return void 0;
|
|
2484
|
+
}
|
|
2485
|
+
const urlValue = params?.url;
|
|
2486
|
+
if (typeof urlValue !== "string" || urlValue.trim().length === 0) {
|
|
2487
|
+
return void 0;
|
|
2488
|
+
}
|
|
2489
|
+
let parsed;
|
|
2490
|
+
try {
|
|
2491
|
+
parsed = new URL(urlValue);
|
|
2492
|
+
} catch {
|
|
2493
|
+
return void 0;
|
|
2494
|
+
}
|
|
2495
|
+
if (!["http:", "https:"].includes(parsed.protocol)) {
|
|
2496
|
+
return void 0;
|
|
2497
|
+
}
|
|
2498
|
+
if (!LOOPBACK_HOSTS.has(parsed.hostname.toLowerCase())) {
|
|
2499
|
+
return void 0;
|
|
2500
|
+
}
|
|
2501
|
+
const controller = new AbortController();
|
|
2502
|
+
const timeout = setTimeout(() => {
|
|
2503
|
+
controller.abort();
|
|
2504
|
+
}, LOOPBACK_NAVIGATION_PREFLIGHT_TIMEOUT_MS);
|
|
2505
|
+
try {
|
|
2506
|
+
await fetch(urlValue, {
|
|
2507
|
+
method: "HEAD",
|
|
2508
|
+
redirect: "manual",
|
|
2509
|
+
signal: controller.signal
|
|
2510
|
+
});
|
|
2511
|
+
return void 0;
|
|
2512
|
+
} catch (error) {
|
|
2513
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
2514
|
+
return void 0;
|
|
2515
|
+
}
|
|
2516
|
+
const message = error instanceof Error ? error.message : "Navigation preflight failed.";
|
|
2517
|
+
if (!isLikelyUnreachableLoopbackError(message)) {
|
|
2518
|
+
return void 0;
|
|
2519
|
+
}
|
|
2520
|
+
return {
|
|
2521
|
+
code: "NAVIGATION_FAILED",
|
|
2522
|
+
message: `Navigation target is unreachable: ${urlValue}`,
|
|
2523
|
+
retryable: true,
|
|
2524
|
+
retry: {
|
|
2525
|
+
retryable: true,
|
|
2526
|
+
reason: "loopback_target_unreachable",
|
|
2527
|
+
retry_after_ms: 250,
|
|
2528
|
+
max_attempts: 1
|
|
2529
|
+
},
|
|
2530
|
+
details: {
|
|
2531
|
+
url: urlValue,
|
|
2532
|
+
preflight: "loopback_head",
|
|
2533
|
+
reason: message
|
|
2534
|
+
}
|
|
2535
|
+
};
|
|
2536
|
+
} finally {
|
|
2537
|
+
clearTimeout(timeout);
|
|
2538
|
+
}
|
|
2539
|
+
};
|
|
2184
2540
|
var DriveMutex = class {
|
|
2185
2541
|
constructor() {
|
|
2186
2542
|
this.tail = Promise.resolve();
|
|
@@ -2242,8 +2598,32 @@ var DriveController = class {
|
|
|
2242
2598
|
error: errorInfo
|
|
2243
2599
|
};
|
|
2244
2600
|
}
|
|
2245
|
-
if (this.bridge.isConnected()) {
|
|
2246
|
-
|
|
2601
|
+
if (!this.bridge.isConnected()) {
|
|
2602
|
+
const errorInfo = {
|
|
2603
|
+
code: "EXTENSION_DISCONNECTED",
|
|
2604
|
+
message: "Extension is not connected. Open Chrome with the Browser Bridge extension enabled, then retry.",
|
|
2605
|
+
retryable: true,
|
|
2606
|
+
retry: {
|
|
2607
|
+
retryable: true,
|
|
2608
|
+
reason: "extension_disconnected",
|
|
2609
|
+
retry_after_ms: 300,
|
|
2610
|
+
max_attempts: 1
|
|
2611
|
+
},
|
|
2612
|
+
details: {
|
|
2613
|
+
next_step: "Ensure Chrome is running and extension.connected=true."
|
|
2614
|
+
}
|
|
2615
|
+
};
|
|
2616
|
+
this.recordError(errorInfo);
|
|
2617
|
+
return { ok: false, error: errorInfo };
|
|
2618
|
+
}
|
|
2619
|
+
this.ensureDriveReady(sessionId);
|
|
2620
|
+
const preflightError = await preflightLoopbackNavigation(action, params);
|
|
2621
|
+
if (preflightError) {
|
|
2622
|
+
this.recordError(preflightError);
|
|
2623
|
+
return {
|
|
2624
|
+
ok: false,
|
|
2625
|
+
error: preflightError
|
|
2626
|
+
};
|
|
2247
2627
|
}
|
|
2248
2628
|
let attempt = 0;
|
|
2249
2629
|
while (true) {
|
|
@@ -2263,9 +2643,18 @@ var DriveController = class {
|
|
|
2263
2643
|
const errorInfo = response.error ?? {
|
|
2264
2644
|
code: "UNKNOWN",
|
|
2265
2645
|
message: "Drive operation failed.",
|
|
2266
|
-
retryable: false
|
|
2646
|
+
retryable: false,
|
|
2647
|
+
retry: {
|
|
2648
|
+
retryable: false,
|
|
2649
|
+
reason: "drive_response_error",
|
|
2650
|
+
max_attempts: 1
|
|
2651
|
+
}
|
|
2267
2652
|
};
|
|
2268
|
-
if (shouldRetryDriveOp({
|
|
2653
|
+
if (shouldRetryDriveOp({
|
|
2654
|
+
attempt,
|
|
2655
|
+
retryable: errorInfo.retryable,
|
|
2656
|
+
retry: errorInfo.retry
|
|
2657
|
+
})) {
|
|
2269
2658
|
attempt += 1;
|
|
2270
2659
|
continue;
|
|
2271
2660
|
}
|
|
@@ -2277,7 +2666,11 @@ var DriveController = class {
|
|
|
2277
2666
|
this.applyDriveDisconnected(sessionId);
|
|
2278
2667
|
}
|
|
2279
2668
|
const errorInfo2 = toDriveError(error);
|
|
2280
|
-
if (shouldRetryDriveOp({
|
|
2669
|
+
if (shouldRetryDriveOp({
|
|
2670
|
+
attempt,
|
|
2671
|
+
retryable: errorInfo2.retryable,
|
|
2672
|
+
retry: errorInfo2.retry
|
|
2673
|
+
})) {
|
|
2281
2674
|
attempt += 1;
|
|
2282
2675
|
continue;
|
|
2283
2676
|
}
|
|
@@ -4225,7 +4618,7 @@ var sendArtifactsError = (res, code, message, details, retryable = false) => {
|
|
|
4225
4618
|
var registerArtifactsRoutes = (router, options = {}) => {
|
|
4226
4619
|
const inspect = options.inspectService ?? (options.registry ? createInspectService({ registry: options.registry }) : void 0);
|
|
4227
4620
|
router.post("/artifacts/screenshot", async (req, res) => {
|
|
4228
|
-
if (!
|
|
4621
|
+
if (!isRecord2(req.body)) {
|
|
4229
4622
|
sendArtifactsError(
|
|
4230
4623
|
res,
|
|
4231
4624
|
"INVALID_ARGUMENT",
|
|
@@ -4527,6 +4920,9 @@ var buildDiagnosticReport = (sessionId, context = {}) => {
|
|
|
4527
4920
|
} : void 0,
|
|
4528
4921
|
extension: context.runtime.extension ? {
|
|
4529
4922
|
version: context.runtime.extension.version,
|
|
4923
|
+
protocol_version: context.runtime.extension.protocolVersion,
|
|
4924
|
+
capability_negotiated: context.runtime.extension.capabilityNegotiated,
|
|
4925
|
+
capabilities: context.runtime.extension.capabilities,
|
|
4530
4926
|
endpoint: toRuntimeEndpoint(context.runtime.extension.endpoint),
|
|
4531
4927
|
port_source: context.runtime.extension.portSource
|
|
4532
4928
|
} : void 0
|
|
@@ -4540,9 +4936,9 @@ var PROCESS_STARTED_AT = new Date(
|
|
|
4540
4936
|
Date.now() - Math.floor(process.uptime() * 1e3)
|
|
4541
4937
|
).toISOString();
|
|
4542
4938
|
var registerDiagnosticsRoutes = (router, options = {}) => {
|
|
4543
|
-
|
|
4939
|
+
const handleHealthCheck = (req, res) => {
|
|
4544
4940
|
const body = req.body ?? {};
|
|
4545
|
-
if (!
|
|
4941
|
+
if (!isRecord2(body)) {
|
|
4546
4942
|
sendError(res, 400, {
|
|
4547
4943
|
code: "INVALID_ARGUMENT",
|
|
4548
4944
|
message: "Request body must be an object.",
|
|
@@ -4573,10 +4969,12 @@ var registerDiagnosticsRoutes = (router, options = {}) => {
|
|
|
4573
4969
|
...extensionStatus?.lastSeenAt ? { last_seen_at: extensionStatus.lastSeenAt } : {}
|
|
4574
4970
|
}
|
|
4575
4971
|
});
|
|
4576
|
-
}
|
|
4972
|
+
};
|
|
4973
|
+
router.post("/health/check", handleHealthCheck);
|
|
4974
|
+
router.post("/health_check", handleHealthCheck);
|
|
4577
4975
|
router.post("/diagnostics/doctor", (req, res) => {
|
|
4578
4976
|
const body = req.body ?? {};
|
|
4579
|
-
if (!
|
|
4977
|
+
if (!isRecord2(body)) {
|
|
4580
4978
|
sendError(res, 400, {
|
|
4581
4979
|
code: "INVALID_ARGUMENT",
|
|
4582
4980
|
message: "Request body must be an object.",
|
|
@@ -4675,6 +5073,9 @@ var registerDiagnosticsRoutes = (router, options = {}) => {
|
|
|
4675
5073
|
if (status.connected) {
|
|
4676
5074
|
context.runtime.extension = {
|
|
4677
5075
|
version: status.version,
|
|
5076
|
+
protocolVersion: status.protocolVersion,
|
|
5077
|
+
capabilityNegotiated: status.capabilityNegotiated,
|
|
5078
|
+
capabilities: status.capabilities,
|
|
4678
5079
|
endpoint: status.coreHost && typeof status.corePort === "number" ? {
|
|
4679
5080
|
host: status.coreHost,
|
|
4680
5081
|
port: status.corePort,
|
|
@@ -4762,6 +5163,53 @@ var parseBody = (schema, body) => {
|
|
|
4762
5163
|
}
|
|
4763
5164
|
};
|
|
4764
5165
|
};
|
|
5166
|
+
var makeNavigateHandler = (schema, drive, registry) => {
|
|
5167
|
+
return (req, res) => {
|
|
5168
|
+
const parsed = parseBody(schema, req.body ?? {});
|
|
5169
|
+
if (parsed.error) {
|
|
5170
|
+
sendError(res, errorStatus("INVALID_ARGUMENT"), {
|
|
5171
|
+
code: "INVALID_ARGUMENT",
|
|
5172
|
+
message: parsed.error.message,
|
|
5173
|
+
retryable: false,
|
|
5174
|
+
...parsed.error.details ? { details: parsed.error.details } : {}
|
|
5175
|
+
});
|
|
5176
|
+
return;
|
|
5177
|
+
}
|
|
5178
|
+
const body = parsed.data;
|
|
5179
|
+
const parsedSessionId = body.session_id;
|
|
5180
|
+
const sessionId = typeof parsedSessionId === "string" && parsedSessionId.length > 0 ? parsedSessionId : registry.create().id;
|
|
5181
|
+
const params = { ...body };
|
|
5182
|
+
delete params.session_id;
|
|
5183
|
+
void drive.execute(
|
|
5184
|
+
sessionId,
|
|
5185
|
+
"drive.navigate",
|
|
5186
|
+
params
|
|
5187
|
+
).then((result) => {
|
|
5188
|
+
if (result.ok) {
|
|
5189
|
+
const payload = result.result && typeof result.result === "object" ? {
|
|
5190
|
+
...result.result,
|
|
5191
|
+
session_id: sessionId
|
|
5192
|
+
} : {
|
|
5193
|
+
ok: true,
|
|
5194
|
+
session_id: sessionId
|
|
5195
|
+
};
|
|
5196
|
+
sendResult(res, payload);
|
|
5197
|
+
return;
|
|
5198
|
+
}
|
|
5199
|
+
sendError(res, errorStatus(result.error.code), result.error);
|
|
5200
|
+
}).catch((error) => {
|
|
5201
|
+
console.error("Drive execute failed:", error);
|
|
5202
|
+
sendError(res, errorStatus("INTERNAL"), {
|
|
5203
|
+
code: "INTERNAL",
|
|
5204
|
+
message: "Unexpected error while executing drive action.",
|
|
5205
|
+
retryable: false,
|
|
5206
|
+
details: {
|
|
5207
|
+
hint: error instanceof Error ? error.message : "Unknown error."
|
|
5208
|
+
}
|
|
5209
|
+
});
|
|
5210
|
+
});
|
|
5211
|
+
};
|
|
5212
|
+
};
|
|
4765
5213
|
var makeHandler = (action, schema, drive, options = {}) => {
|
|
4766
5214
|
return (req, res) => {
|
|
4767
5215
|
const parsed = parseBody(schema, req.body ?? {});
|
|
@@ -4776,6 +5224,17 @@ var makeHandler = (action, schema, drive, options = {}) => {
|
|
|
4776
5224
|
}
|
|
4777
5225
|
const body = parsed.data;
|
|
4778
5226
|
const sessionId = body.session_id;
|
|
5227
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
5228
|
+
sendError(res, errorStatus("INVALID_ARGUMENT"), {
|
|
5229
|
+
code: "INVALID_ARGUMENT",
|
|
5230
|
+
message: "session_id is required",
|
|
5231
|
+
retryable: false,
|
|
5232
|
+
details: {
|
|
5233
|
+
field: "session_id"
|
|
5234
|
+
}
|
|
5235
|
+
});
|
|
5236
|
+
return;
|
|
5237
|
+
}
|
|
4779
5238
|
const params = { ...body };
|
|
4780
5239
|
delete params.session_id;
|
|
4781
5240
|
const timeoutMs = options.timeoutFromParams ? options.timeoutFromParams(params) : void 0;
|
|
@@ -4799,7 +5258,7 @@ var makeHandler = (action, schema, drive, options = {}) => {
|
|
|
4799
5258
|
});
|
|
4800
5259
|
};
|
|
4801
5260
|
};
|
|
4802
|
-
var makeDialogHandler = (action, schema, drive) => {
|
|
5261
|
+
var makeDialogHandler = (action, schema, drive, aliasName) => {
|
|
4803
5262
|
return (req, res) => {
|
|
4804
5263
|
const parsed = parseBody(schema, req.body ?? {});
|
|
4805
5264
|
if (parsed.error) {
|
|
@@ -4816,8 +5275,20 @@ var makeDialogHandler = (action, schema, drive) => {
|
|
|
4816
5275
|
const params = { ...rest, action };
|
|
4817
5276
|
void drive.execute(sessionId, "drive.handle_dialog", params).then((result) => {
|
|
4818
5277
|
if (result.ok) {
|
|
4819
|
-
const
|
|
4820
|
-
|
|
5278
|
+
const basePayload = result.result === void 0 ? { ok: true } : result.result;
|
|
5279
|
+
if (!aliasName || typeof basePayload !== "object" || basePayload === null) {
|
|
5280
|
+
sendResult(res, basePayload);
|
|
5281
|
+
return;
|
|
5282
|
+
}
|
|
5283
|
+
const warning = `${aliasName} is deprecated; use drive.handle_dialog.`;
|
|
5284
|
+
const payload = basePayload;
|
|
5285
|
+
const warnings = Array.isArray(payload.warnings) ? payload.warnings.filter(
|
|
5286
|
+
(item) => typeof item === "string"
|
|
5287
|
+
) : [];
|
|
5288
|
+
sendResult(res, {
|
|
5289
|
+
...payload,
|
|
5290
|
+
warnings: warnings.includes(warning) ? warnings : [...warnings, warning]
|
|
5291
|
+
});
|
|
4821
5292
|
return;
|
|
4822
5293
|
}
|
|
4823
5294
|
sendError(res, errorStatus(result.error.code), result.error);
|
|
@@ -4835,10 +5306,10 @@ var makeDialogHandler = (action, schema, drive) => {
|
|
|
4835
5306
|
};
|
|
4836
5307
|
};
|
|
4837
5308
|
var registerDriveRoutes = (router, options) => {
|
|
4838
|
-
const { drive } = options;
|
|
5309
|
+
const { drive, registry } = options;
|
|
4839
5310
|
router.post(
|
|
4840
5311
|
"/drive/navigate",
|
|
4841
|
-
|
|
5312
|
+
makeNavigateHandler(DriveNavigateInputSchema, drive, registry)
|
|
4842
5313
|
);
|
|
4843
5314
|
router.post(
|
|
4844
5315
|
"/drive/go_back",
|
|
@@ -4848,14 +5319,6 @@ var registerDriveRoutes = (router, options) => {
|
|
|
4848
5319
|
"/drive/go_forward",
|
|
4849
5320
|
makeHandler("drive.go_forward", DriveGoForwardInputSchema, drive)
|
|
4850
5321
|
);
|
|
4851
|
-
router.post(
|
|
4852
|
-
"/drive/back",
|
|
4853
|
-
makeHandler("drive.back", DriveBackInputSchema, drive)
|
|
4854
|
-
);
|
|
4855
|
-
router.post(
|
|
4856
|
-
"/drive/forward",
|
|
4857
|
-
makeHandler("drive.forward", DriveForwardInputSchema, drive)
|
|
4858
|
-
);
|
|
4859
5322
|
router.post(
|
|
4860
5323
|
"/drive/click",
|
|
4861
5324
|
makeHandler("drive.click", DriveClickInputSchema, drive)
|
|
@@ -4886,11 +5349,16 @@ var registerDriveRoutes = (router, options) => {
|
|
|
4886
5349
|
);
|
|
4887
5350
|
router.post(
|
|
4888
5351
|
"/dialog/accept",
|
|
4889
|
-
makeDialogHandler("accept", DialogAcceptInputSchema, drive)
|
|
5352
|
+
makeDialogHandler("accept", DialogAcceptInputSchema, drive, "dialog.accept")
|
|
4890
5353
|
);
|
|
4891
5354
|
router.post(
|
|
4892
5355
|
"/dialog/dismiss",
|
|
4893
|
-
makeDialogHandler(
|
|
5356
|
+
makeDialogHandler(
|
|
5357
|
+
"dismiss",
|
|
5358
|
+
DialogDismissInputSchema,
|
|
5359
|
+
drive,
|
|
5360
|
+
"dialog.dismiss"
|
|
5361
|
+
)
|
|
4894
5362
|
);
|
|
4895
5363
|
router.post(
|
|
4896
5364
|
"/drive/key",
|
|
@@ -5480,6 +5948,29 @@ var createCoreServer = (options = {}) => {
|
|
|
5480
5948
|
});
|
|
5481
5949
|
const recoveryTracker = new RecoveryTracker();
|
|
5482
5950
|
app.use(import_express2.default.json({ limit: "1mb" }));
|
|
5951
|
+
app.use((req, res, next) => {
|
|
5952
|
+
res.setHeader(HTTP_CONTRACT_VERSION_HEADER, HTTP_CONTRACT_VERSION);
|
|
5953
|
+
const mismatch = resolveContractVersionMismatch(
|
|
5954
|
+
req.header(HTTP_CONTRACT_VERSION_HEADER) ?? void 0
|
|
5955
|
+
);
|
|
5956
|
+
if (mismatch) {
|
|
5957
|
+
res.status(409).json({
|
|
5958
|
+
ok: false,
|
|
5959
|
+
error: {
|
|
5960
|
+
code: "FAILED_PRECONDITION",
|
|
5961
|
+
message: "HTTP contract version mismatch between client and core server.",
|
|
5962
|
+
retryable: false,
|
|
5963
|
+
details: {
|
|
5964
|
+
header: HTTP_CONTRACT_VERSION_HEADER,
|
|
5965
|
+
expected: mismatch.expected,
|
|
5966
|
+
received: mismatch.received
|
|
5967
|
+
}
|
|
5968
|
+
}
|
|
5969
|
+
});
|
|
5970
|
+
return;
|
|
5971
|
+
}
|
|
5972
|
+
next();
|
|
5973
|
+
});
|
|
5483
5974
|
if (logger) {
|
|
5484
5975
|
app.use((req, res, next) => {
|
|
5485
5976
|
const startedAt = process.hrtime.bigint();
|
|
@@ -5495,9 +5986,11 @@ var createCoreServer = (options = {}) => {
|
|
|
5495
5986
|
next();
|
|
5496
5987
|
});
|
|
5497
5988
|
}
|
|
5498
|
-
|
|
5989
|
+
const sendHealthOk = (_req, res) => {
|
|
5499
5990
|
res.status(200).json({ ok: true });
|
|
5500
|
-
}
|
|
5991
|
+
};
|
|
5992
|
+
app.post("/health", sendHealthOk);
|
|
5993
|
+
app.get("/health", sendHealthOk);
|
|
5501
5994
|
app.use(
|
|
5502
5995
|
"/session",
|
|
5503
5996
|
createSessionRouter(registry, {
|
|
@@ -5506,7 +5999,7 @@ var createCoreServer = (options = {}) => {
|
|
|
5506
5999
|
recordRecovery: (attempt) => recoveryTracker.record(attempt)
|
|
5507
6000
|
})
|
|
5508
6001
|
);
|
|
5509
|
-
registerDriveRoutes(app, { drive });
|
|
6002
|
+
registerDriveRoutes(app, { drive, registry });
|
|
5510
6003
|
registerInspectRoutes(app, {
|
|
5511
6004
|
registry,
|
|
5512
6005
|
extensionBridge,
|
|
@@ -5734,6 +6227,12 @@ var toReadinessErrorEnvelope = (error, baseUrl) => ({
|
|
|
5734
6227
|
code: "UNAVAILABLE",
|
|
5735
6228
|
message: error instanceof Error ? `Core not ready at ${baseUrl}: ${error.message}` : `Core not ready at ${baseUrl}.`,
|
|
5736
6229
|
retryable: true,
|
|
6230
|
+
retry: {
|
|
6231
|
+
retryable: true,
|
|
6232
|
+
reason: "core_not_ready",
|
|
6233
|
+
retry_after_ms: 250,
|
|
6234
|
+
max_attempts: 1
|
|
6235
|
+
},
|
|
5737
6236
|
details: {
|
|
5738
6237
|
base_url: baseUrl
|
|
5739
6238
|
}
|
|
@@ -5811,7 +6310,8 @@ startCoreServer({ ${startOptions.join(
|
|
|
5811
6310
|
const response = await fetchImpl(`${readiness.baseUrl}${requestPath}`, {
|
|
5812
6311
|
method: "POST",
|
|
5813
6312
|
headers: {
|
|
5814
|
-
"content-type": "application/json"
|
|
6313
|
+
"content-type": "application/json",
|
|
6314
|
+
[HTTP_CONTRACT_VERSION_HEADER]: HTTP_CONTRACT_VERSION
|
|
5815
6315
|
},
|
|
5816
6316
|
body: body === void 0 ? void 0 : JSON.stringify(body),
|
|
5817
6317
|
signal: controller.signal
|
|
@@ -5924,6 +6424,22 @@ var toInternalErrorEnvelope = (error) => ({
|
|
|
5924
6424
|
}
|
|
5925
6425
|
});
|
|
5926
6426
|
var envelope = (schema) => successEnvelopeSchema(schema);
|
|
6427
|
+
var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6428
|
+
var addDeprecatedAliasWarning = (envelopeResult, deprecationAlias) => {
|
|
6429
|
+
if (!deprecationAlias || !envelopeResult.ok || typeof envelopeResult.result !== "object" || !envelopeResult.result) {
|
|
6430
|
+
return envelopeResult;
|
|
6431
|
+
}
|
|
6432
|
+
const warning = `${deprecationAlias.alias} is deprecated; use ${deprecationAlias.replacement}.`;
|
|
6433
|
+
const result = envelopeResult.result;
|
|
6434
|
+
const existingWarnings = Array.isArray(result.warnings) ? result.warnings.filter((item) => typeof item === "string") : [];
|
|
6435
|
+
return {
|
|
6436
|
+
ok: true,
|
|
6437
|
+
result: {
|
|
6438
|
+
...result,
|
|
6439
|
+
warnings: existingWarnings.includes(warning) ? existingWarnings : [...existingWarnings, warning]
|
|
6440
|
+
}
|
|
6441
|
+
};
|
|
6442
|
+
};
|
|
5927
6443
|
var TOOL_DEFINITIONS = [
|
|
5928
6444
|
{
|
|
5929
6445
|
name: "session.create",
|
|
@@ -5999,20 +6515,28 @@ var TOOL_DEFINITIONS = [
|
|
|
5999
6515
|
name: "drive.back",
|
|
6000
6516
|
config: {
|
|
6001
6517
|
title: "Drive Back",
|
|
6002
|
-
description: "
|
|
6003
|
-
inputSchema:
|
|
6004
|
-
outputSchema: envelope(
|
|
6005
|
-
corePath: "/drive/
|
|
6518
|
+
description: "Deprecated alias for drive.go_back.",
|
|
6519
|
+
inputSchema: DriveGoBackInputSchema,
|
|
6520
|
+
outputSchema: envelope(DriveGoBackOutputSchema),
|
|
6521
|
+
corePath: "/drive/go_back",
|
|
6522
|
+
deprecationAlias: {
|
|
6523
|
+
alias: "drive.back",
|
|
6524
|
+
replacement: "drive.go_back"
|
|
6525
|
+
}
|
|
6006
6526
|
}
|
|
6007
6527
|
},
|
|
6008
6528
|
{
|
|
6009
6529
|
name: "drive.forward",
|
|
6010
6530
|
config: {
|
|
6011
6531
|
title: "Drive Forward",
|
|
6012
|
-
description: "
|
|
6013
|
-
inputSchema:
|
|
6014
|
-
outputSchema: envelope(
|
|
6015
|
-
corePath: "/drive/
|
|
6532
|
+
description: "Deprecated alias for drive.go_forward.",
|
|
6533
|
+
inputSchema: DriveGoForwardInputSchema,
|
|
6534
|
+
outputSchema: envelope(DriveGoForwardOutputSchema),
|
|
6535
|
+
corePath: "/drive/go_forward",
|
|
6536
|
+
deprecationAlias: {
|
|
6537
|
+
alias: "drive.forward",
|
|
6538
|
+
replacement: "drive.go_forward"
|
|
6539
|
+
}
|
|
6016
6540
|
}
|
|
6017
6541
|
},
|
|
6018
6542
|
{
|
|
@@ -6089,20 +6613,30 @@ var TOOL_DEFINITIONS = [
|
|
|
6089
6613
|
name: "dialog.accept",
|
|
6090
6614
|
config: {
|
|
6091
6615
|
title: "Dialog Accept",
|
|
6092
|
-
description: "
|
|
6616
|
+
description: "Deprecated alias for drive.handle_dialog (action=accept).",
|
|
6093
6617
|
inputSchema: DialogAcceptInputSchema,
|
|
6094
6618
|
outputSchema: envelope(DialogAcceptOutputSchema),
|
|
6095
|
-
corePath: "/
|
|
6619
|
+
corePath: "/drive/handle_dialog",
|
|
6620
|
+
deprecationAlias: {
|
|
6621
|
+
alias: "dialog.accept",
|
|
6622
|
+
replacement: "drive.handle_dialog"
|
|
6623
|
+
},
|
|
6624
|
+
transformInput: (args) => isRecord3(args) ? { ...args, action: "accept" } : args
|
|
6096
6625
|
}
|
|
6097
6626
|
},
|
|
6098
6627
|
{
|
|
6099
6628
|
name: "dialog.dismiss",
|
|
6100
6629
|
config: {
|
|
6101
6630
|
title: "Dialog Dismiss",
|
|
6102
|
-
description: "
|
|
6631
|
+
description: "Deprecated alias for drive.handle_dialog (action=dismiss).",
|
|
6103
6632
|
inputSchema: DialogDismissInputSchema,
|
|
6104
6633
|
outputSchema: envelope(DialogDismissOutputSchema),
|
|
6105
|
-
corePath: "/
|
|
6634
|
+
corePath: "/drive/handle_dialog",
|
|
6635
|
+
deprecationAlias: {
|
|
6636
|
+
alias: "dialog.dismiss",
|
|
6637
|
+
replacement: "drive.handle_dialog"
|
|
6638
|
+
},
|
|
6639
|
+
transformInput: (args) => isRecord3(args) ? { ...args, action: "dismiss" } : args
|
|
6106
6640
|
}
|
|
6107
6641
|
},
|
|
6108
6642
|
{
|
|
@@ -6282,7 +6816,7 @@ var TOOL_DEFINITIONS = [
|
|
|
6282
6816
|
description: "Check server health including uptime, memory usage, active session count, and extension connection status.",
|
|
6283
6817
|
inputSchema: HealthCheckInputSchema,
|
|
6284
6818
|
outputSchema: envelope(HealthCheckOutputSchema),
|
|
6285
|
-
corePath: "/
|
|
6819
|
+
corePath: "/health/check"
|
|
6286
6820
|
}
|
|
6287
6821
|
},
|
|
6288
6822
|
{
|
|
@@ -6296,13 +6830,18 @@ var TOOL_DEFINITIONS = [
|
|
|
6296
6830
|
}
|
|
6297
6831
|
}
|
|
6298
6832
|
];
|
|
6299
|
-
var createToolHandler = (clientProvider, corePath) => {
|
|
6833
|
+
var createToolHandler = (clientProvider, corePath, deprecationAlias, transformInput) => {
|
|
6300
6834
|
return (async (args, _extra) => {
|
|
6301
6835
|
void _extra;
|
|
6302
6836
|
try {
|
|
6303
6837
|
const client = typeof clientProvider === "function" ? await clientProvider() : clientProvider;
|
|
6304
|
-
const envelopeResult = await client.post(
|
|
6305
|
-
|
|
6838
|
+
const envelopeResult = await client.post(
|
|
6839
|
+
corePath,
|
|
6840
|
+
transformInput ? transformInput(args) : args
|
|
6841
|
+
);
|
|
6842
|
+
return toToolResult(
|
|
6843
|
+
addDeprecatedAliasWarning(envelopeResult, deprecationAlias)
|
|
6844
|
+
);
|
|
6306
6845
|
} catch (error) {
|
|
6307
6846
|
const parsed = ErrorEnvelopeSchema.safeParse(error);
|
|
6308
6847
|
if (parsed.success) {
|
|
@@ -6322,7 +6861,12 @@ var registerBrowserBridgeTools = (server, clientProvider) => {
|
|
|
6322
6861
|
inputSchema: tool.config.inputSchema,
|
|
6323
6862
|
outputSchema: tool.config.outputSchema
|
|
6324
6863
|
},
|
|
6325
|
-
createToolHandler(
|
|
6864
|
+
createToolHandler(
|
|
6865
|
+
clientProvider,
|
|
6866
|
+
tool.config.corePath,
|
|
6867
|
+
tool.config.deprecationAlias,
|
|
6868
|
+
tool.config.transformInput
|
|
6869
|
+
)
|
|
6326
6870
|
);
|
|
6327
6871
|
}
|
|
6328
6872
|
};
|