@ai-sdk/harness-codex 1.0.118 → 1.0.120

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/index.js CHANGED
@@ -531,7 +531,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
531
531
  var CLI_SHIM_FILENAME = "harness-tool.mjs";
532
532
 
533
533
  // src/version.ts
534
- var VERSION = true ? "1.0.118" : "0.0.0-test";
534
+ var VERSION = true ? "1.0.120" : "0.0.0-test";
535
535
 
536
536
  // src/codex-harness.ts
537
537
  var DEFAULT_CODEX_MODEL = "gpt-5.5";
@@ -682,11 +682,12 @@ function createCodex(settings = {}) {
682
682
  token: coords.token
683
683
  });
684
684
  const attachChannel = new SandboxChannel({
685
- connect: () => openWebSocket(attachEndpoint),
685
+ connect: ({ abortSignal }) => openWebSocket({ ...attachEndpoint, abortSignal }),
686
686
  outboundSchema: outboundMessageSchema,
687
687
  initialLastSeenEventId: coords.lastSeenEventId,
688
688
  onDiagnostic,
689
- onBridgeError
689
+ onBridgeError,
690
+ reconnect: settings.reconnect
690
691
  });
691
692
  await attachChannel.open(isContinue ? { resume: true } : void 0);
692
693
  return createSession({
@@ -808,10 +809,11 @@ function createCodex(settings = {}) {
808
809
  });
809
810
  const bridgeEndpoint = withBridgeToken({ endpoint, token });
810
811
  const channel = new SandboxChannel({
811
- connect: () => openWebSocket(bridgeEndpoint),
812
+ connect: ({ abortSignal }) => openWebSocket({ ...bridgeEndpoint, abortSignal }),
812
813
  outboundSchema: outboundMessageSchema,
813
814
  onDiagnostic,
814
815
  onBridgeError,
816
+ reconnect: settings.reconnect,
815
817
  // In replay mode the respawned bridge reloaded the finished turn from
816
818
  // disk; seed the cursor and resume so it streams the tail (incl.
817
819
  // `finish`).
@@ -896,22 +898,54 @@ async function resolveBridgeEndpoint({
896
898
  }
897
899
  function openWebSocket({
898
900
  url,
899
- headers
901
+ headers,
902
+ abortSignal
900
903
  }) {
901
904
  return new Promise((resolve2, reject) => {
905
+ if (abortSignal.aborted) {
906
+ reject(abortSignal.reason ?? new Error("WebSocket connection aborted"));
907
+ return;
908
+ }
902
909
  const ws = new WebSocket(url, {
903
910
  headers: headers == null ? void 0 : { ...headers }
904
911
  });
905
- const onOpen = () => {
912
+ let settled = false;
913
+ const cleanup = () => {
914
+ abortSignal.removeEventListener("abort", onAbort);
915
+ ws.off("open", onOpen);
906
916
  ws.off("error", onError);
917
+ };
918
+ const rejectWithCleanup = (error) => {
919
+ if (settled) return;
920
+ settled = true;
921
+ cleanup();
922
+ ws.once("error", () => {
923
+ });
924
+ try {
925
+ ws.terminate();
926
+ } catch {
927
+ try {
928
+ ws.close();
929
+ } catch {
930
+ }
931
+ }
932
+ reject(error);
933
+ };
934
+ const onOpen = () => {
935
+ if (settled) return;
936
+ settled = true;
937
+ cleanup();
907
938
  resolve2(ws);
908
939
  };
909
940
  const onError = (err) => {
910
- ws.off("open", onOpen);
911
- reject(err);
941
+ rejectWithCleanup(err);
912
942
  };
943
+ const onAbort = () => rejectWithCleanup(
944
+ abortSignal.reason ?? new Error("WebSocket connection aborted")
945
+ );
913
946
  ws.once("open", onOpen);
914
947
  ws.once("error", onError);
948
+ abortSignal.addEventListener("abort", onAbort, { once: true });
915
949
  });
916
950
  }
917
951
  function createSession({