@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/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 resolveCwd = (cwd) => (0, import_node_path.resolve)(cwd ?? process.cwd());
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 = process.cwd()) => {
209
- let current = (0, import_node_path.resolve)(cwd);
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: "GET",
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 ErrorCodeSchema = import_zod.z.enum([
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 ErrorInfoSchema = import_zod.z.object({
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: import_zod.z.string(),
824
- retryable: import_zod.z.boolean(),
825
- details: import_zod.z.record(import_zod.z.string(), import_zod.z.unknown()).optional()
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 ErrorEnvelopeSchema = import_zod.z.object({
828
- ok: import_zod.z.literal(false),
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) => import_zod.z.object({
832
- ok: import_zod.z.literal(true),
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 import_zod2 = require("zod");
838
- var LocatorRoleSchema = import_zod2.z.object({
839
- name: import_zod2.z.string(),
840
- value: import_zod2.z.string().optional()
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 = import_zod2.z.object({
843
- ref: import_zod2.z.string().min(1).optional(),
844
- testid: import_zod2.z.string().min(1).optional(),
845
- css: import_zod2.z.string().min(1).optional(),
846
- text: import_zod2.z.string().min(1).optional(),
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 = import_zod2.z.object({
857
- ok: import_zod2.z.literal(true),
858
- message: import_zod2.z.string().optional(),
859
- warnings: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.enum([
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 = import_zod2.z.object({
872
- session_id: import_zod2.z.string(),
1087
+ var SessionInfoSchema = import_zod3.z.object({
1088
+ session_id: import_zod3.z.string(),
873
1089
  state: SessionStateSchema,
874
- created_at: import_zod2.z.string().datetime().optional()
1090
+ created_at: import_zod3.z.string().datetime().optional()
875
1091
  });
876
- var SessionPlaneStatusSchema = import_zod2.z.object({
877
- connected: import_zod2.z.boolean(),
878
- last_seen_at: import_zod2.z.string().datetime().optional(),
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 = import_zod2.z.object({
882
- session_id: import_zod2.z.string(),
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: import_zod2.z.string().datetime().optional()
1102
+ updated_at: import_zod3.z.string().datetime().optional()
887
1103
  });
888
- var RecoverResultSchema = import_zod2.z.object({
889
- session_id: import_zod2.z.string(),
890
- recovered: import_zod2.z.boolean(),
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: import_zod2.z.string().optional()
1108
+ message: import_zod3.z.string().optional()
893
1109
  });
894
- var DiagnosticCheckSchema = import_zod2.z.object({
895
- name: import_zod2.z.string(),
896
- ok: import_zod2.z.boolean(),
897
- message: import_zod2.z.string().optional(),
898
- details: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional()
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 = import_zod2.z.object({
901
- host: import_zod2.z.string().optional(),
902
- port: import_zod2.z.number().finite().optional(),
903
- base_url: import_zod2.z.string().optional(),
904
- host_source: import_zod2.z.string().optional(),
905
- port_source: import_zod2.z.string().optional(),
906
- metadata_path: import_zod2.z.string().optional(),
907
- isolated_mode: import_zod2.z.boolean().optional()
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 = import_zod2.z.object({
910
- component: import_zod2.z.enum(["cli", "mcp", "core"]).optional(),
911
- version: import_zod2.z.string().optional(),
912
- pid: import_zod2.z.number().int().positive().optional(),
913
- node_version: import_zod2.z.string().optional(),
914
- binary_path: import_zod2.z.string().optional(),
915
- argv_entry: import_zod2.z.string().optional()
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 = import_zod2.z.object({
1133
+ var DiagnosticsRuntimeCallerSchema = import_zod3.z.object({
918
1134
  endpoint: DiagnosticsRuntimeEndpointSchema.optional(),
919
1135
  process: DiagnosticsRuntimeProcessSchema.optional()
920
1136
  });
921
- var DiagnosticsRuntimeContextSchema = import_zod2.z.object({
1137
+ var DiagnosticsRuntimeContextSchema = import_zod3.z.object({
922
1138
  caller: DiagnosticsRuntimeCallerSchema.optional(),
923
- core: import_zod2.z.object({
1139
+ core: import_zod3.z.object({
924
1140
  endpoint: DiagnosticsRuntimeEndpointSchema.optional(),
925
1141
  process: DiagnosticsRuntimeProcessSchema.optional()
926
1142
  }).optional(),
927
- extension: import_zod2.z.object({
928
- version: import_zod2.z.string().optional(),
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: import_zod2.z.enum(["default", "storage"]).optional()
1149
+ port_source: import_zod3.z.enum(["default", "storage"]).optional()
931
1150
  }).optional()
932
1151
  });
933
- var DiagnosticReportSchema = import_zod2.z.object({
934
- ok: import_zod2.z.boolean(),
935
- session_id: import_zod2.z.string().optional(),
936
- checks: import_zod2.z.array(DiagnosticCheckSchema).optional(),
937
- sessions: import_zod2.z.object({
938
- count: import_zod2.z.number().finite().optional(),
939
- max_age_ms: import_zod2.z.number().finite().optional(),
940
- max_idle_ms: import_zod2.z.number().finite().optional()
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: import_zod2.z.object({
943
- connected: import_zod2.z.boolean().optional(),
944
- version: import_zod2.z.string().optional(),
945
- last_seen_at: import_zod2.z.string().datetime().optional()
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: import_zod2.z.object({
948
- attached: import_zod2.z.boolean().optional(),
949
- idle_timeout_ms: import_zod2.z.number().finite().optional(),
950
- console_buffer_size: import_zod2.z.number().finite().optional(),
951
- network_buffer_size: import_zod2.z.number().finite().optional(),
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: import_zod2.z.object({
955
- root_dir: import_zod2.z.string().optional()
1173
+ artifacts: import_zod3.z.object({
1174
+ root_dir: import_zod3.z.string().optional()
956
1175
  }).optional(),
957
- recovery: import_zod2.z.object({
958
- last_attempt: import_zod2.z.object({
959
- session_id: import_zod2.z.string(),
960
- recovered: import_zod2.z.boolean(),
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: import_zod2.z.string().optional(),
963
- at: import_zod2.z.string()
1181
+ message: import_zod3.z.string().optional(),
1182
+ at: import_zod3.z.string()
964
1183
  }).optional(),
965
- attempts: import_zod2.z.array(
966
- import_zod2.z.object({
967
- session_id: import_zod2.z.string(),
968
- recovered: import_zod2.z.boolean(),
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: import_zod2.z.string().optional(),
971
- at: import_zod2.z.string()
1189
+ message: import_zod3.z.string().optional(),
1190
+ at: import_zod3.z.string()
972
1191
  })
973
1192
  ).optional(),
974
- success_count: import_zod2.z.number().finite().optional(),
975
- failure_count: import_zod2.z.number().finite().optional(),
976
- success_rate: import_zod2.z.number().finite().optional(),
977
- recent_failure_count: import_zod2.z.number().finite().optional(),
978
- loop_detected: import_zod2.z.boolean().optional()
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: import_zod2.z.array(import_zod2.z.string()).optional(),
981
- notes: import_zod2.z.array(import_zod2.z.string()).optional(),
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 = import_zod2.z.object({
985
- session_id: import_zod2.z.string().min(1)
1203
+ var SessionIdSchema = import_zod3.z.object({
1204
+ session_id: import_zod3.z.string().min(1)
986
1205
  });
987
- var SessionCreateInputSchema = import_zod2.z.object({}).strict().default({});
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 = import_zod2.z.object({
995
- ok: import_zod2.z.boolean()
1213
+ var SessionCloseOutputSchema = import_zod3.z.object({
1214
+ ok: import_zod3.z.boolean()
996
1215
  });
997
- var DriveWaitConditionSchema = import_zod2.z.object({
998
- kind: import_zod2.z.enum(["locator_visible", "text_present", "url_matches"]),
999
- value: import_zod2.z.string().min(1)
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 = import_zod2.z.object({
1002
- session_id: import_zod2.z.string().min(1),
1003
- url: import_zod2.z.string().min(1),
1004
- tab_id: import_zod2.z.number().finite().optional(),
1005
- wait: import_zod2.z.enum(["none", "domcontentloaded"]).default("domcontentloaded")
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 DriveNavigateOutputSchema = OpResultSchema;
1008
- var DriveGoBackInputSchema = import_zod2.z.object({
1009
- session_id: import_zod2.z.string().min(1),
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 = import_zod2.z.object({
1014
- session_id: import_zod2.z.string().min(1),
1015
- tab_id: import_zod2.z.number().finite().optional()
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 DriveBackInputSchema = DriveGoBackInputSchema;
1019
- var DriveBackOutputSchema = OpResultSchema;
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: import_zod2.z.number().finite().optional(),
1026
- click_count: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1030
- session_id: import_zod2.z.string().min(1),
1246
+ var DriveHoverInputSchema = import_zod3.z.object({
1247
+ session_id: import_zod3.z.string().min(1),
1031
1248
  locator: LocatorSchema,
1032
- delay_ms: import_zod2.z.number().min(0).max(1e4).optional(),
1033
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1036
- format: import_zod2.z.literal("html"),
1037
- snapshot: import_zod2.z.string()
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 = import_zod2.z.object({
1040
- session_id: import_zod2.z.string().min(1),
1256
+ var DriveSelectInputSchema = import_zod3.z.object({
1257
+ session_id: import_zod3.z.string().min(1),
1041
1258
  locator: LocatorSchema,
1042
- value: import_zod2.z.string().min(1).optional(),
1043
- text: import_zod2.z.string().min(1).optional(),
1044
- index: import_zod2.z.number().int().min(0).optional(),
1045
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1052
- session_id: import_zod2.z.string().min(1),
1268
+ var DriveTypeInputSchema = import_zod3.z.object({
1269
+ session_id: import_zod3.z.string().min(1),
1053
1270
  locator: LocatorSchema.optional(),
1054
- text: import_zod2.z.string().min(1),
1055
- tab_id: import_zod2.z.number().finite().optional(),
1056
- clear: import_zod2.z.boolean().default(false),
1057
- submit: import_zod2.z.boolean().default(false)
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 = import_zod2.z.object({
1061
- selector: import_zod2.z.string().min(1).optional(),
1277
+ var DriveFillFormFieldSchema = import_zod3.z.object({
1278
+ selector: import_zod3.z.string().min(1).optional(),
1062
1279
  locator: LocatorSchema.optional(),
1063
- value: import_zod2.z.union([import_zod2.z.string(), import_zod2.z.boolean()]),
1064
- type: import_zod2.z.enum(["auto", "text", "select", "checkbox", "radio", "contentEditable"]).default("auto"),
1065
- submit: import_zod2.z.boolean().default(false)
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 = import_zod2.z.object({
1071
- session_id: import_zod2.z.string().min(1),
1072
- fields: import_zod2.z.array(DriveFillFormFieldSchema).min(1),
1073
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1076
- filled: import_zod2.z.number().finite(),
1077
- attempted: import_zod2.z.number().finite(),
1078
- errors: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.object({
1081
- session_id: import_zod2.z.string().min(1),
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: import_zod2.z.number().min(1).max(50).default(12),
1085
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1089
- session_id: import_zod2.z.string().min(1),
1090
- action: import_zod2.z.enum(["accept", "dismiss"]),
1091
- promptText: import_zod2.z.string().optional(),
1092
- tab_id: import_zod2.z.number().finite().optional()
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: import_zod2.z.string().optional(),
1097
- tab_id: import_zod2.z.number().finite().optional()
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: import_zod2.z.number().finite().optional()
1318
+ tab_id: import_zod3.z.number().finite().optional()
1102
1319
  });
1103
1320
  var DialogDismissOutputSchema = OpResultSchema;
1104
- var DriveKeyModifiersSchema = import_zod2.z.object({
1105
- ctrl: import_zod2.z.boolean().optional(),
1106
- alt: import_zod2.z.boolean().optional(),
1107
- shift: import_zod2.z.boolean().optional(),
1108
- meta: import_zod2.z.boolean().optional()
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 = import_zod2.z.object({
1111
- session_id: import_zod2.z.string().min(1),
1112
- key: import_zod2.z.string().min(1),
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: import_zod2.z.number().finite().optional()
1331
+ tab_id: import_zod3.z.number().finite().optional()
1115
1332
  });
1116
1333
  var DriveKeyPressOutputSchema = OpResultSchema;
1117
- var DriveKeyModifierSchema = import_zod2.z.enum(["ctrl", "alt", "shift", "meta"]);
1118
- var DriveKeyInputSchema = import_zod2.z.object({
1119
- session_id: import_zod2.z.string().min(1),
1120
- key: import_zod2.z.string().min(1),
1121
- modifiers: import_zod2.z.array(DriveKeyModifierSchema).optional(),
1122
- repeat: import_zod2.z.number().int().min(1).max(50).optional(),
1123
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1127
- session_id: import_zod2.z.string().min(1),
1128
- delta_x: import_zod2.z.number().finite().optional(),
1129
- delta_y: import_zod2.z.number().finite().optional(),
1130
- top: import_zod2.z.number().finite().optional(),
1131
- left: import_zod2.z.number().finite().optional(),
1132
- behavior: import_zod2.z.enum(["auto", "smooth"]).optional(),
1133
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1143
- session_id: import_zod2.z.string().min(1),
1359
+ var DriveWaitForInputSchema = import_zod3.z.object({
1360
+ session_id: import_zod3.z.string().min(1),
1144
1361
  condition: DriveWaitConditionSchema,
1145
- timeout_ms: import_zod2.z.number().finite().optional(),
1146
- tab_id: import_zod2.z.number().finite().optional()
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 = import_zod2.z.object({
1150
- tab_id: import_zod2.z.number().finite(),
1151
- window_id: import_zod2.z.number().finite(),
1152
- url: import_zod2.z.string().min(1),
1153
- title: import_zod2.z.string(),
1154
- active: import_zod2.z.boolean().optional(),
1155
- last_active_at: import_zod2.z.string().datetime().optional()
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 = import_zod2.z.object({
1159
- tabs: import_zod2.z.array(DriveTabInfoSchema)
1375
+ var DriveTabListOutputSchema = import_zod3.z.object({
1376
+ tabs: import_zod3.z.array(DriveTabInfoSchema)
1160
1377
  });
1161
- var DriveTabActivateInputSchema = import_zod2.z.object({
1162
- session_id: import_zod2.z.string().min(1),
1163
- tab_id: import_zod2.z.number().finite()
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 = import_zod2.z.object({
1167
- session_id: import_zod2.z.string().min(1),
1168
- tab_id: import_zod2.z.number().finite()
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 = import_zod2.z.enum(["ax", "html"]);
1172
- var InspectConsistencySchema = import_zod2.z.enum(["best_effort", "quiesce"]);
1173
- var TargetHintSchema = import_zod2.z.object({
1174
- url: import_zod2.z.string().min(1).optional(),
1175
- title: import_zod2.z.string().min(1).optional(),
1176
- last_active_at: import_zod2.z.string().optional(),
1177
- lastActiveAt: import_zod2.z.string().optional()
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 = import_zod2.z.object({
1180
- name: import_zod2.z.string(),
1181
- type: import_zod2.z.string(),
1182
- value: import_zod2.z.string(),
1183
- options: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.object({
1186
- selector: import_zod2.z.string(),
1187
- action: import_zod2.z.string().optional(),
1188
- method: import_zod2.z.string().optional(),
1189
- fields: import_zod2.z.array(FormFieldInfoSchema)
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 = import_zod2.z.object({
1192
- key: import_zod2.z.string(),
1193
- value: import_zod2.z.string()
1408
+ var StorageEntrySchema = import_zod3.z.object({
1409
+ key: import_zod3.z.string(),
1410
+ value: import_zod3.z.string()
1194
1411
  });
1195
- var PageStateSchema = import_zod2.z.object({
1196
- forms: import_zod2.z.array(FormInfoSchema),
1197
- localStorage: import_zod2.z.array(StorageEntrySchema),
1198
- sessionStorage: import_zod2.z.array(StorageEntrySchema),
1199
- cookies: import_zod2.z.array(StorageEntrySchema),
1200
- warnings: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.object({
1419
+ var DomSnapshotSchema = import_zod3.z.object({
1203
1420
  format: InspectDomFormatSchema,
1204
- snapshot: import_zod2.z.unknown()
1421
+ snapshot: import_zod3.z.unknown()
1205
1422
  }).passthrough();
1206
- var InspectDomSnapshotInputSchema = import_zod2.z.object({
1207
- session_id: import_zod2.z.string().min(1),
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: import_zod2.z.boolean().default(false),
1211
- compact: import_zod2.z.boolean().default(false),
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: import_zod2.z.coerce.number().int().positive().max(5e4).optional(),
1215
- selector: import_zod2.z.string().min(1).optional(),
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 = import_zod2.z.object({
1220
- added: import_zod2.z.array(import_zod2.z.string()),
1221
- removed: import_zod2.z.array(import_zod2.z.string()),
1222
- changed: import_zod2.z.array(import_zod2.z.string()),
1223
- summary: import_zod2.z.string()
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: import_zod2.z.literal("role"),
1229
- role: import_zod2.z.string().min(1),
1230
- name: import_zod2.z.string().min(1).optional(),
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: import_zod2.z.literal("text"),
1235
- text: import_zod2.z.string().min(1),
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: import_zod2.z.literal("label"),
1240
- label: import_zod2.z.string().min(1),
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 = import_zod2.z.discriminatedUnion("kind", [
1460
+ var InspectFindInputSchema = import_zod3.z.discriminatedUnion("kind", [
1244
1461
  InspectFindRoleInputSchema,
1245
1462
  InspectFindTextInputSchema,
1246
1463
  InspectFindLabelInputSchema
1247
1464
  ]);
1248
- var InspectFindMatchSchema = import_zod2.z.object({
1249
- ref: import_zod2.z.string(),
1250
- role: import_zod2.z.string().optional(),
1251
- name: import_zod2.z.string().optional()
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 = import_zod2.z.object({
1254
- matches: import_zod2.z.array(InspectFindMatchSchema),
1255
- warnings: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.enum([
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: import_zod2.z.boolean().default(true),
1485
+ include_metadata: import_zod3.z.boolean().default(true),
1269
1486
  target: TargetHintSchema.optional()
1270
1487
  });
1271
- var InspectExtractContentOutputSchema = import_zod2.z.object({
1272
- content: import_zod2.z.string(),
1273
- title: import_zod2.z.string().optional(),
1274
- byline: import_zod2.z.string().optional(),
1275
- excerpt: import_zod2.z.string().optional(),
1276
- siteName: import_zod2.z.string().optional(),
1277
- warnings: import_zod2.z.array(import_zod2.z.string()).optional()
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 = import_zod2.z.object({
1283
- url: import_zod2.z.string().optional(),
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: import_zod2.z.number().int().positive().optional(),
1286
- column: import_zod2.z.number().int().positive().optional()
1502
+ line: import_zod3.z.number().int().positive().optional(),
1503
+ column: import_zod3.z.number().int().positive().optional()
1287
1504
  }).passthrough();
1288
- var ConsoleStackFrameSchema = import_zod2.z.object({
1289
- functionName: import_zod2.z.string().optional(),
1290
- url: import_zod2.z.string().optional(),
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: import_zod2.z.number().int().positive().optional(),
1293
- column: import_zod2.z.number().int().positive().optional()
1509
+ line: import_zod3.z.number().int().positive().optional(),
1510
+ column: import_zod3.z.number().int().positive().optional()
1294
1511
  }).passthrough();
1295
- var ConsoleRemoteObjectSchema = import_zod2.z.object({
1296
- type: import_zod2.z.string().optional(),
1297
- subtype: import_zod2.z.string().optional(),
1298
- description: import_zod2.z.string().optional(),
1299
- value: import_zod2.z.unknown().optional(),
1300
- unserializableValue: import_zod2.z.string().optional()
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 = import_zod2.z.object({
1303
- level: import_zod2.z.string().optional(),
1304
- text: import_zod2.z.string().optional(),
1305
- timestamp: import_zod2.z.string().datetime().optional(),
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: import_zod2.z.array(ConsoleStackFrameSchema).optional(),
1524
+ stack: import_zod3.z.array(ConsoleStackFrameSchema).optional(),
1308
1525
  exception: ConsoleRemoteObjectSchema.optional(),
1309
- args: import_zod2.z.array(ConsoleRemoteObjectSchema).optional()
1526
+ args: import_zod3.z.array(ConsoleRemoteObjectSchema).optional()
1310
1527
  }).passthrough();
1311
- var ConsoleListSchema = import_zod2.z.object({
1312
- entries: import_zod2.z.array(ConsoleEntrySchema)
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 = import_zod2.z.object({
1316
- artifact_id: import_zod2.z.string(),
1317
- path: import_zod2.z.string(),
1318
- mime: import_zod2.z.string()
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 = import_zod2.z.object({
1325
- session_id: import_zod2.z.string().min(1),
1326
- expression: import_zod2.z.string().min(1).optional(),
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 = import_zod2.z.object({
1330
- value: import_zod2.z.unknown().optional(),
1331
- exception: import_zod2.z.unknown().optional()
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 = import_zod2.z.object({
1338
- name: import_zod2.z.string(),
1339
- value: import_zod2.z.number().finite()
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 = import_zod2.z.object({
1342
- metrics: import_zod2.z.array(PerformanceMetricSchema)
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 = import_zod2.z.object({
1346
- session_id: import_zod2.z.string().min(1),
1347
- target: import_zod2.z.enum(["viewport", "full"]).default("viewport"),
1348
- fullPage: import_zod2.z.boolean().default(false),
1349
- selector: import_zod2.z.string().min(1).optional(),
1350
- format: import_zod2.z.enum(["png", "jpeg", "webp"]).default("png"),
1351
- quality: import_zod2.z.number().min(0).max(100).optional()
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 = import_zod2.z.object({});
1355
- var HealthCheckOutputSchema = import_zod2.z.object({
1356
- started_at: import_zod2.z.string().min(1),
1357
- uptime_ms: import_zod2.z.number().finite().nonnegative(),
1358
- memory: import_zod2.z.object({
1359
- rss: import_zod2.z.number().finite().nonnegative(),
1360
- heapTotal: import_zod2.z.number().finite().nonnegative(),
1361
- heapUsed: import_zod2.z.number().finite().nonnegative(),
1362
- external: import_zod2.z.number().finite().nonnegative(),
1363
- arrayBuffers: import_zod2.z.number().finite().nonnegative().optional()
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: import_zod2.z.object({
1366
- active: import_zod2.z.number().finite().nonnegative()
1582
+ sessions: import_zod3.z.object({
1583
+ active: import_zod3.z.number().finite().nonnegative()
1367
1584
  }).passthrough(),
1368
- extension: import_zod2.z.object({
1369
- connected: import_zod2.z.boolean(),
1370
- last_seen_at: import_zod2.z.string().min(1).optional()
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 = import_zod2.z.object({
1374
- session_id: import_zod2.z.string().min(1).optional(),
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.retryable && options.attempt === 0;
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 isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
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 "SESSION_NOT_FOUND":
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 "EXTENSION_DISCONNECTED":
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 (!isRecord(body)) {
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 (!isRecord(body)) {
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
- this.ensureDriveReady(sessionId);
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({ attempt, retryable: errorInfo.retryable })) {
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({ attempt, retryable: errorInfo2.retryable })) {
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 (!isRecord(req.body)) {
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
- router.post("/health_check", (req, res) => {
4939
+ const handleHealthCheck = (req, res) => {
4544
4940
  const body = req.body ?? {};
4545
- if (!isRecord(body)) {
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 (!isRecord(body)) {
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 payload = result.result === void 0 ? { ok: true } : result.result;
4820
- sendResult(res, payload);
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
- makeHandler("drive.navigate", DriveNavigateInputSchema, drive)
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("dismiss", DialogDismissInputSchema, drive)
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
- app.get("/health", (_req, res) => {
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: "Go back in browser history.",
6003
- inputSchema: DriveBackInputSchema,
6004
- outputSchema: envelope(DriveBackOutputSchema),
6005
- corePath: "/drive/back"
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: "Go forward in browser history.",
6013
- inputSchema: DriveForwardInputSchema,
6014
- outputSchema: envelope(DriveForwardOutputSchema),
6015
- corePath: "/drive/forward"
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: "Accept a JavaScript dialog.",
6616
+ description: "Deprecated alias for drive.handle_dialog (action=accept).",
6093
6617
  inputSchema: DialogAcceptInputSchema,
6094
6618
  outputSchema: envelope(DialogAcceptOutputSchema),
6095
- corePath: "/dialog/accept"
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: "Dismiss a JavaScript dialog.",
6631
+ description: "Deprecated alias for drive.handle_dialog (action=dismiss).",
6103
6632
  inputSchema: DialogDismissInputSchema,
6104
6633
  outputSchema: envelope(DialogDismissOutputSchema),
6105
- corePath: "/dialog/dismiss"
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: "/health_check"
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(corePath, args);
6305
- return toToolResult(envelopeResult);
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(clientProvider, tool.config.corePath)
6864
+ createToolHandler(
6865
+ clientProvider,
6866
+ tool.config.corePath,
6867
+ tool.config.deprecationAlias,
6868
+ tool.config.transformInput
6869
+ )
6326
6870
  );
6327
6871
  }
6328
6872
  };