@blue-soda/dsh-remote 0.5.8 → 0.5.9

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
@@ -4607,7 +4607,7 @@ async function waitForRelayCapacity(socket) {
4607
4607
  while ((socket.bufferedAmount ?? 0) > 512 * 1024) {
4608
4608
  if (socket.readyState !== 1 || Date.now() - started > 1e4)
4609
4609
  throw new Error("Relay consumer is too slow or disconnected");
4610
- await new Promise((resolve4) => setTimeout(resolve4, 10));
4610
+ await new Promise((resolve5) => setTimeout(resolve5, 10));
4611
4611
  }
4612
4612
  if (socket.readyState !== 1)
4613
4613
  throw new Error("Relay transport closed");
@@ -5085,8 +5085,8 @@ var RtcDataChannelTransport = class {
5085
5085
  if (this.connectPromise !== void 0)
5086
5086
  return this.connectPromise;
5087
5087
  this.armAbort(signal);
5088
- this.connectPromise = new Promise((resolve4, reject) => {
5089
- this.openResolve = resolve4;
5088
+ this.connectPromise = new Promise((resolve5, reject) => {
5089
+ this.openResolve = resolve5;
5090
5090
  this.openReject = reject;
5091
5091
  this.negotiateTimer = setTimeout(() => {
5092
5092
  void this.failOpenAfterStats(new RtcConnectError("RTC_CONNECT_TIMEOUT", `WebRTC negotiation timed out after ${this.negotiateTimeoutMs}ms.`));
@@ -5301,9 +5301,9 @@ var RtcDataChannelTransport = class {
5301
5301
  if (this.closed || this.opened)
5302
5302
  return;
5303
5303
  this.opened = true;
5304
- const resolve4 = this.openResolve;
5304
+ const resolve5 = this.openResolve;
5305
5305
  this.clearNegotiation();
5306
- void this.resolveSelectedTransport().then(() => resolve4?.());
5306
+ void this.resolveSelectedTransport().then(() => resolve5?.());
5307
5307
  };
5308
5308
  channel.onmessage = (event) => {
5309
5309
  if (this.closed || !this.opened)
@@ -5697,7 +5697,7 @@ function asError(error) {
5697
5697
  return error instanceof Error ? error : new RtcConnectError("RTC_FAILED", "WebRTC negotiation failed.");
5698
5698
  }
5699
5699
  function sleep(ms) {
5700
- return new Promise((resolve4) => setTimeout(resolve4, ms));
5700
+ return new Promise((resolve5) => setTimeout(resolve5, ms));
5701
5701
  }
5702
5702
 
5703
5703
  // ../webrtc/dist/adaptive-transport.js
@@ -5738,8 +5738,8 @@ var AdaptiveTransport = class extends BaseTransport {
5738
5738
  this.socket = new WebSocket(this.url);
5739
5739
  this.controlFrameLimits = {};
5740
5740
  this.socket.binaryType = "arraybuffer";
5741
- await new Promise((resolve4, reject) => {
5742
- this.readyResolve = resolve4;
5741
+ await new Promise((resolve5, reject) => {
5742
+ this.readyResolve = resolve5;
5743
5743
  this.readyReject = reject;
5744
5744
  this.handshakeTimer = setTimeout(() => this.failConnection(new Error("Adaptive control handshake timed out")), this.options.handshakeTimeoutMs ?? 15e3);
5745
5745
  const socket = this.socket;
@@ -13232,8 +13232,8 @@ function errorCode(error) {
13232
13232
  return typeof code === "string" ? code : void 0;
13233
13233
  }
13234
13234
  function sleep2(ms) {
13235
- return new Promise((resolve4) => {
13236
- setTimeout(resolve4, ms);
13235
+ return new Promise((resolve5) => {
13236
+ setTimeout(resolve5, ms);
13237
13237
  });
13238
13238
  }
13239
13239
 
@@ -13298,7 +13298,7 @@ var ServerCredentialStore = class {
13298
13298
  if (!(error instanceof Error) || !("code" in error) || error.code !== "EEXIST") throw error;
13299
13299
  if (await reclaimAbandonedRefreshLock(lock)) continue;
13300
13300
  if (Date.now() >= deadline) throw new ServerCredentialsBusyError();
13301
- await new Promise((resolve4) => setTimeout(resolve4, 50));
13301
+ await new Promise((resolve5) => setTimeout(resolve5, 50));
13302
13302
  }
13303
13303
  }
13304
13304
  try {
@@ -13543,7 +13543,7 @@ function normalizeServerUrl(value) {
13543
13543
  }
13544
13544
 
13545
13545
  // src/version.ts
13546
- var PLUGIN_VERSION = "0.5.8";
13546
+ var PLUGIN_VERSION = "0.5.9";
13547
13547
 
13548
13548
  // src/server-api.ts
13549
13549
  var ENABLED_QR_PROVIDERS = ["github"];
@@ -14166,7 +14166,7 @@ var HostServerConnection = class {
14166
14166
  this.controlFrameLimits = {};
14167
14167
  let acknowledged = false;
14168
14168
  let messageQueue = Promise.resolve();
14169
- await new Promise((resolve4, reject) => {
14169
+ await new Promise((resolve5, reject) => {
14170
14170
  let settled = false;
14171
14171
  const helloTimer = setTimeout(() => socket.close(4001, "hello timeout"), 1e4);
14172
14172
  const finish = (error) => {
@@ -14175,7 +14175,7 @@ var HostServerConnection = class {
14175
14175
  clearTimeout(helloTimer);
14176
14176
  this.online = false;
14177
14177
  if (this.socket === socket) this.socket = void 0;
14178
- void this.dropTunnels().finally(() => error === void 0 ? resolve4() : reject(error));
14178
+ void this.dropTunnels().finally(() => error === void 0 ? resolve5() : reject(error));
14179
14179
  };
14180
14180
  socket.onopen = () => {
14181
14181
  this.sendControl("hello", {
@@ -14735,14 +14735,14 @@ var HostServerConnection = class {
14735
14735
  waitBeforeRetry(baseDelay, exact = false) {
14736
14736
  const spread = exact ? 0 : baseDelay * this.config.reconnect.jitter;
14737
14737
  const delay = Math.max(0, Math.round(baseDelay - spread + Math.random() * spread * 2));
14738
- return new Promise((resolve4) => {
14738
+ return new Promise((resolve5) => {
14739
14739
  const timer = setTimeout(() => {
14740
14740
  this.retryWake = void 0;
14741
- resolve4();
14741
+ resolve5();
14742
14742
  }, delay);
14743
14743
  this.retryWake = () => {
14744
14744
  clearTimeout(timer);
14745
- resolve4();
14745
+ resolve5();
14746
14746
  };
14747
14747
  });
14748
14748
  }
@@ -14753,8 +14753,8 @@ async function drainWithin(promise, ms) {
14753
14753
  try {
14754
14754
  await Promise.race([
14755
14755
  promise.catch(() => void 0),
14756
- new Promise((resolve4) => {
14757
- timer = setTimeout(resolve4, ms);
14756
+ new Promise((resolve5) => {
14757
+ timer = setTimeout(resolve5, ms);
14758
14758
  timer.unref?.();
14759
14759
  })
14760
14760
  ]);
@@ -15108,7 +15108,7 @@ var LoopbackHost = class {
15108
15108
  const response = handle.response;
15109
15109
  let chunk = response.read(Math.min(response.readableLength || LOOPBACK_CHUNK_BYTES, LOOPBACK_CHUNK_BYTES));
15110
15110
  if (chunk === null && !response.readableEnded && !response.destroyed) {
15111
- await new Promise((resolve4, reject) => {
15111
+ await new Promise((resolve5, reject) => {
15112
15112
  const timer = setTimeout(() => finish(new Error("timeout")), 2e4);
15113
15113
  const ready = () => finish();
15114
15114
  const fail4 = () => finish(new Error("closed"));
@@ -15118,7 +15118,7 @@ var LoopbackHost = class {
15118
15118
  response.off("end", ready);
15119
15119
  response.off("close", ready);
15120
15120
  response.off("error", fail4);
15121
- error === void 0 ? resolve4() : reject(error);
15121
+ error === void 0 ? resolve5() : reject(error);
15122
15122
  };
15123
15123
  response.once("readable", ready);
15124
15124
  response.once("end", ready);
@@ -15149,22 +15149,22 @@ var LoopbackHost = class {
15149
15149
  this.close(value.id);
15150
15150
  throw new RpcError("RATE_LIMITED", "Preview WebSocket buffer exceeded its limit.");
15151
15151
  }
15152
- await new Promise((resolve4, reject) => handle.socket.send(data2, { binary: value.binary }, (error) => error ? reject(new RpcError("LOOPBACK_CLOSED", "Preview socket closed.")) : resolve4()));
15152
+ await new Promise((resolve5, reject) => handle.socket.send(data2, { binary: value.binary }, (error) => error ? reject(new RpcError("LOOPBACK_CLOSED", "Preview socket closed.")) : resolve5()));
15153
15153
  return { sent: true };
15154
15154
  }
15155
15155
  if (value.op === "ws.read") {
15156
15156
  if (handle.reading) throw new RpcError("REQUEST_CONFLICT", "Only one preview read may be pending.");
15157
15157
  handle.reading = true;
15158
15158
  try {
15159
- if (handle.messages.length === 0 && !handle.closed) await new Promise((resolve4) => {
15159
+ if (handle.messages.length === 0 && !handle.closed) await new Promise((resolve5) => {
15160
15160
  const timer = setTimeout(() => {
15161
15161
  handle.wake = void 0;
15162
- resolve4();
15162
+ resolve5();
15163
15163
  }, 2e4);
15164
15164
  handle.wake = () => {
15165
15165
  clearTimeout(timer);
15166
15166
  handle.wake = void 0;
15167
- resolve4();
15167
+ resolve5();
15168
15168
  };
15169
15169
  });
15170
15170
  let bytes = 0;
@@ -15211,7 +15211,7 @@ var LoopbackHost = class {
15211
15211
  openHttp(value) {
15212
15212
  const body = value.body === void 0 ? void 0 : Buffer.from(value.body, "base64");
15213
15213
  if ((body?.length ?? 0) > LOOPBACK_MAX_BODY_BYTES) throw new Error("body limit");
15214
- return new Promise((resolve4, reject) => {
15214
+ return new Promise((resolve5, reject) => {
15215
15215
  const headers = Object.fromEntries(cleanHeaders(value.headers));
15216
15216
  let handle;
15217
15217
  const request = httpRequest({
@@ -15230,7 +15230,7 @@ var LoopbackHost = class {
15230
15230
  handle.response = response;
15231
15231
  response.on("error", () => void 0);
15232
15232
  clearTimeout(timer);
15233
- resolve4({ status: response.statusCode ?? 502, headers: cleanHeaders(headerPairs(response.headers)) });
15233
+ resolve5({ status: response.statusCode ?? 502, headers: cleanHeaders(headerPairs(response.headers)) });
15234
15234
  });
15235
15235
  const timer = setTimeout(() => {
15236
15236
  request.destroy();
@@ -15246,7 +15246,7 @@ var LoopbackHost = class {
15246
15246
  });
15247
15247
  }
15248
15248
  openWs(value) {
15249
- return new Promise((resolve4, reject) => {
15249
+ return new Promise((resolve5, reject) => {
15250
15250
  const socket = new WebSocket2(`ws://127.0.0.1:${value.port}${value.path}`, value.protocols, {
15251
15251
  headers: Object.fromEntries(cleanHeaders(value.headers)),
15252
15252
  followRedirects: false,
@@ -15256,7 +15256,7 @@ var LoopbackHost = class {
15256
15256
  });
15257
15257
  const handle = { kind: "ws", port: value.port, socket, messages: [], bytes: 0, reading: false, closed: false, touched: Date.now() };
15258
15258
  this.handles.set(value.id, handle);
15259
- socket.once("open", () => resolve4({ protocol: socket.protocol }));
15259
+ socket.once("open", () => resolve5({ protocol: socket.protocol }));
15260
15260
  socket.on("message", (data2, binary) => {
15261
15261
  if (handle.closed) return;
15262
15262
  const message = { data: Buffer.from(data2).toString("base64"), binary };
@@ -15315,7 +15315,7 @@ var LoopbackPreview = class {
15315
15315
  for (const client of running.ws.clients) client.terminate();
15316
15316
  running.ws.close();
15317
15317
  running.server.closeAllConnections();
15318
- await new Promise((resolve4) => running.server.close(() => resolve4()));
15318
+ await new Promise((resolve5) => running.server.close(() => resolve5()));
15319
15319
  }
15320
15320
  this.servers.clear();
15321
15321
  }
@@ -15370,11 +15370,11 @@ var LoopbackPreview = class {
15370
15370
  void this.release(id4);
15371
15371
  });
15372
15372
  });
15373
- await new Promise((resolve4, reject) => {
15373
+ await new Promise((resolve5, reject) => {
15374
15374
  server.once("error", reject);
15375
15375
  server.listen(0, "127.0.0.1", () => {
15376
15376
  server.off("error", reject);
15377
- resolve4();
15377
+ resolve5();
15378
15378
  });
15379
15379
  });
15380
15380
  const address = server.address();
@@ -15440,10 +15440,10 @@ var LoopbackPreview = class {
15440
15440
  while (!signal.aborted) {
15441
15441
  const chunk = await this.client.rpc("loopback.call", { op: "http.read", id: id4 }, signal);
15442
15442
  if (chunk.data !== "" && !res.write(Buffer.from(chunk.data, "base64"))) {
15443
- await new Promise((resolve4, reject) => {
15443
+ await new Promise((resolve5, reject) => {
15444
15444
  const ready = () => {
15445
15445
  cleanup();
15446
- resolve4();
15446
+ resolve5();
15447
15447
  };
15448
15448
  const closed = () => {
15449
15449
  cleanup();
@@ -15503,7 +15503,7 @@ var LoopbackPreview = class {
15503
15503
  const result = await this.client.rpc("loopback.call", { op: "ws.read", id: id4 }, signal);
15504
15504
  for (const message of result.messages) {
15505
15505
  if (socket.bufferedAmount > 1024 * 1024) throw new Error("slow preview");
15506
- await new Promise((resolve4, reject) => socket.send(Buffer.from(message.data, "base64"), { binary: message.binary }, (error) => error ? reject(error) : resolve4()));
15506
+ await new Promise((resolve5, reject) => socket.send(Buffer.from(message.data, "base64"), { binary: message.binary }, (error) => error ? reject(error) : resolve5()));
15507
15507
  }
15508
15508
  if (result.closed) break;
15509
15509
  }
@@ -16191,13 +16191,13 @@ var RemoteClientCore = class {
16191
16191
  throw rpcAbortedError(method, signal.reason);
16192
16192
  const timeoutMs = callTimeoutMs(this.timeoutMs, options);
16193
16193
  const request = createRpcRequest(method, params);
16194
- const result = new Promise((resolve4, reject) => {
16194
+ const result = new Promise((resolve5, reject) => {
16195
16195
  const timer = setTimeout(() => {
16196
16196
  this.rejectPending(request.id, new RemoteClientError("RPC_TIMEOUT", `RPC ${method} timed out after ${timeoutMs}ms`));
16197
16197
  }, timeoutMs);
16198
16198
  const pending = {
16199
16199
  method,
16200
- resolve: resolve4,
16200
+ resolve: resolve5,
16201
16201
  reject,
16202
16202
  timer
16203
16203
  };
@@ -16506,7 +16506,7 @@ var ClientSecureTransport = class {
16506
16506
  }
16507
16507
  };
16508
16508
  async function waitForResponder(inner, noise) {
16509
- await new Promise((resolve4, reject) => {
16509
+ await new Promise((resolve5, reject) => {
16510
16510
  let settled = false;
16511
16511
  const timer = setTimeout(() => finish(new Error("Noise IK handshake timed out.")), 1e4);
16512
16512
  const unsubscribe = inner.onHandshake((step, data2) => {
@@ -16525,7 +16525,7 @@ async function waitForResponder(inner, noise) {
16525
16525
  settled = true;
16526
16526
  clearTimeout(timer);
16527
16527
  unsubscribe();
16528
- if (error === void 0) resolve4();
16528
+ if (error === void 0) resolve5();
16529
16529
  else reject(error);
16530
16530
  };
16531
16531
  void inner.sendHandshake(1, noise.writeHandshake()).catch((error) => {
@@ -17121,7 +17121,7 @@ var AsyncFrameQueue = class {
17121
17121
  continue;
17122
17122
  }
17123
17123
  if (this.closed) return;
17124
- const next = await new Promise((resolve4) => this.waiters.push(resolve4));
17124
+ const next = await new Promise((resolve5) => this.waiters.push(resolve5));
17125
17125
  if (next.done) return;
17126
17126
  yield next.value;
17127
17127
  }
@@ -17526,7 +17526,7 @@ var AsyncValueQueue = class {
17526
17526
  if (this.error !== void 0) throw this.error;
17527
17527
  return;
17528
17528
  }
17529
- const next = await new Promise((resolve4) => this.waiters.push(resolve4));
17529
+ const next = await new Promise((resolve5) => this.waiters.push(resolve5));
17530
17530
  if (next.done) {
17531
17531
  if (this.error !== void 0) throw this.error;
17532
17532
  return;
@@ -19195,7 +19195,6 @@ var CodexVirtualHarness = class _CodexVirtualHarness {
19195
19195
  if (scope.window !== void 0) scope.window.__dshCodexHistoryCacheStats = inspector;
19196
19196
  this.historyCacheInspector = inspector;
19197
19197
  this.publishHistoryCacheStats();
19198
- scope.console?.info?.("[dsh-remote] codex history cache inspector ready; call __dshCodexHistoryCacheStats()");
19199
19198
  }
19200
19199
  publishHistoryCacheStats() {
19201
19200
  const stats = this.historyCacheStats();
@@ -19231,6 +19230,7 @@ var CodexVirtualHarness = class _CodexVirtualHarness {
19231
19230
  }
19232
19231
  }
19233
19232
  logHistoryCache(event, threadId, page, records, ageMs) {
19233
+ if (!codexHistoryStatsFileEnabled()) return;
19234
19234
  const scope = globalThis;
19235
19235
  scope.console?.info?.("[dsh-remote] codex history page cache " + event, {
19236
19236
  threadId,
@@ -20467,7 +20467,7 @@ var AsyncValueQueue2 = class {
20467
20467
  continue;
20468
20468
  }
20469
20469
  if (this.closed) return;
20470
- const next = await new Promise((resolve4) => this.waiters.push(resolve4));
20470
+ const next = await new Promise((resolve5) => this.waiters.push(resolve5));
20471
20471
  if (next.done) return;
20472
20472
  yield next.value;
20473
20473
  }
@@ -20489,7 +20489,13 @@ function normalizeByteResult2(endpoint, result) {
20489
20489
 
20490
20490
  // src/typert-gateway-switch.ts
20491
20491
  var REMOTE_COMMAND_METHODS = ["execute", "list"];
20492
- var LOCAL_ONLY_NAMESPACES = /* @__PURE__ */ new Set(["dynamicCordisRunner"]);
20492
+ var LOCAL_ONLY_NAMESPACES = /* @__PURE__ */ new Set([
20493
+ "account",
20494
+ "dynamicCordisRunner",
20495
+ "remoteAccess",
20496
+ "schedule",
20497
+ "web"
20498
+ ]);
20493
20499
  var LOCAL_FALLBACK_NAMESPACES = /* @__PURE__ */ new Set(["$events", "settings", "credentials", "dynamicCordisRunner"]);
20494
20500
  var PEER_GONE_CODES = /* @__PURE__ */ new Set([
20495
20501
  "TRANSPORT_CLOSED",
@@ -21034,8 +21040,8 @@ var ExternalNativePeerConnection = class {
21034
21040
  request(method, payload) {
21035
21041
  if (this.closed) return Promise.reject(new Error("native rtc helper is closed"));
21036
21042
  const id4 = this.nextRequestId++;
21037
- const promise = new Promise((resolve4, reject) => {
21038
- this.pending.set(id4, { resolve: resolve4, reject });
21043
+ const promise = new Promise((resolve5, reject) => {
21044
+ this.pending.set(id4, { resolve: resolve5, reject });
21039
21045
  });
21040
21046
  this.write({ id: id4, method, payload });
21041
21047
  return promise;
@@ -21829,10 +21835,10 @@ function parseRouteTarget(value) {
21829
21835
  async function detectRouteHostIpv4(target2, timeoutMs) {
21830
21836
  const socket = createSocket("udp4");
21831
21837
  try {
21832
- return await new Promise((resolve4, reject) => {
21838
+ return await new Promise((resolve5, reject) => {
21833
21839
  const timer = setTimeout(() => {
21834
21840
  cleanup();
21835
- resolve4(void 0);
21841
+ resolve5(void 0);
21836
21842
  }, timeoutMs);
21837
21843
  const cleanup = () => {
21838
21844
  clearTimeout(timer);
@@ -21846,7 +21852,7 @@ async function detectRouteHostIpv4(target2, timeoutMs) {
21846
21852
  socket.connect(target2.port, target2.host, () => {
21847
21853
  cleanup();
21848
21854
  const address = socket.address();
21849
- resolve4(typeof address === "string" ? void 0 : address.address);
21855
+ resolve5(typeof address === "string" ? void 0 : address.address);
21850
21856
  });
21851
21857
  });
21852
21858
  } finally {
@@ -23416,7 +23422,6 @@ var ClientModeRuntime = class {
23416
23422
  globalScope.__dshCodexHistoryCacheStats = inspect;
23417
23423
  if (scope.window !== void 0) scope.window.__dshCodexHistoryCacheStats = inspect;
23418
23424
  this.writeCodexHistoryCacheStats(inspect());
23419
- scope.console?.info?.("[dsh-remote] codex history cache inspector ready (client runtime)");
23420
23425
  }
23421
23426
  writeCodexHistoryCacheStats(stats) {
23422
23427
  if (!codexHistoryStatsFileEnabled() || process.env.VITEST !== void 0) return;
@@ -24030,8 +24035,8 @@ function failureCode(error) {
24030
24035
  return own ?? safeErrorCode(error);
24031
24036
  }
24032
24037
  function sleep3(ms) {
24033
- return new Promise((resolve4) => {
24034
- setTimeout(resolve4, ms);
24038
+ return new Promise((resolve5) => {
24039
+ setTimeout(resolve5, ms);
24035
24040
  });
24036
24041
  }
24037
24042
  function remoteHostFeatures(clientVersion) {
@@ -24082,7 +24087,7 @@ async function probeRemoteHostFeatures(client, clientVersion) {
24082
24087
  }
24083
24088
  async function waitForCodexFrames(stream, signal) {
24084
24089
  if (signal?.aborted) throw new ClientModeError("RPC_ABORTED", "The Codex event poll was cancelled.");
24085
- await new Promise((resolve4, reject) => {
24090
+ await new Promise((resolve5, reject) => {
24086
24091
  const previousWake = stream.wake;
24087
24092
  const timer = setTimeout(done, 25e3);
24088
24093
  const onAbort = () => {
@@ -24096,7 +24101,7 @@ async function waitForCodexFrames(stream, signal) {
24096
24101
  }
24097
24102
  function done() {
24098
24103
  cleanup();
24099
- resolve4();
24104
+ resolve5();
24100
24105
  }
24101
24106
  stream.wake = () => {
24102
24107
  previousWake();
@@ -24633,15 +24638,15 @@ var CodexAppServerClient = class {
24633
24638
  const child = this.process;
24634
24639
  this.process = void 0;
24635
24640
  if (child === void 0 || child.exitCode !== null || child.killed) return;
24636
- await new Promise((resolve4) => {
24641
+ await new Promise((resolve5) => {
24637
24642
  const timer = setTimeout(() => {
24638
24643
  child.kill("SIGKILL");
24639
- resolve4();
24644
+ resolve5();
24640
24645
  }, 2e3);
24641
24646
  timer.unref?.();
24642
24647
  child.once("exit", () => {
24643
24648
  clearTimeout(timer);
24644
- resolve4();
24649
+ resolve5();
24645
24650
  });
24646
24651
  child.kill("SIGTERM");
24647
24652
  });
@@ -24697,13 +24702,13 @@ var CodexAppServerClient = class {
24697
24702
  }
24698
24703
  request(method, params, timeoutMs) {
24699
24704
  const id4 = this.nextId++;
24700
- const result = new Promise((resolve4, reject) => {
24705
+ const result = new Promise((resolve5, reject) => {
24701
24706
  const timer = setTimeout(() => {
24702
24707
  this.pending.delete(id4);
24703
24708
  reject(new CodexAppServerError("CODEX_REQUEST_TIMEOUT", "Codex App Server request timed out."));
24704
24709
  }, timeoutMs);
24705
24710
  timer.unref?.();
24706
- this.pending.set(id4, { resolve: resolve4, reject, timer });
24711
+ this.pending.set(id4, { resolve: resolve5, reject, timer });
24707
24712
  });
24708
24713
  try {
24709
24714
  this.write({ id: id4, method, params });
@@ -28667,7 +28672,7 @@ function frameSessionId(frame) {
28667
28672
  return typeof payload.sessionId === "string" && payload.sessionId.length > 0 ? payload.sessionId : void 0;
28668
28673
  }
28669
28674
  function withTimeout(promise, ms, message) {
28670
- return new Promise((resolve4, reject) => {
28675
+ return new Promise((resolve5, reject) => {
28671
28676
  const timer = setTimeout(() => {
28672
28677
  reject(new RpcError("TIMEOUT", message, void 0, true));
28673
28678
  }, ms);
@@ -28675,7 +28680,7 @@ function withTimeout(promise, ms, message) {
28675
28680
  promise.then(
28676
28681
  (value) => {
28677
28682
  clearTimeout(timer);
28678
- resolve4(value);
28683
+ resolve5(value);
28679
28684
  },
28680
28685
  (error) => {
28681
28686
  clearTimeout(timer);
@@ -28706,7 +28711,7 @@ function concatChunks2(chunks, totalBytes) {
28706
28711
 
28707
28712
  // src/harness-remote-bridge.ts
28708
28713
  import { Buffer as Buffer5 } from "node:buffer";
28709
- import { isAbsolute as isAbsolute4, join as join10, relative as relative2, sep } from "node:path";
28714
+ import { isAbsolute as isAbsolute4, join as join10, relative as relative2, resolve as resolve3, sep } from "node:path";
28710
28715
  var endpointSchema = external_exports.string().min(1).max(128).regex(/^(?:\$events(?:\/result)?|[A-Za-z0-9_$.-]+\/[A-Za-z0-9_$.-]+)$/);
28711
28716
  var callSchema3 = external_exports.object({ endpoint: endpointSchema, payload: external_exports.unknown() }).strict();
28712
28717
  var streamOpenSchema3 = external_exports.object({
@@ -28779,6 +28784,9 @@ var HARNESS_REMOTE_ALLOWLIST = [
28779
28784
  "goals/edit",
28780
28785
  "goals/pause",
28781
28786
  "goals/resume",
28787
+ "job/follow",
28788
+ "job/kill",
28789
+ "job/list",
28782
28790
  "llm/discoverModels",
28783
28791
  "llm/listConfigurableProviders",
28784
28792
  "llm/listProviders",
@@ -28895,6 +28903,10 @@ var HarnessRemoteBridge = class {
28895
28903
  const nativePayload = normalizeWorkspaceRequestPayload(params.endpoint, params.payload, this.harnessVersion);
28896
28904
  const nativeResult = REMOTE_HISTORY_CALL_ENDPOINTS.has(params.endpoint) ? await this.dispatchHistoryPage(params.endpoint, nativePayload, signal) : params.endpoint === "commands/execute" ? await dispatchCommandForHost(this.gateway, params.payload, signal, this.harnessVersion) : await this.dispatchWorkspaceFile(params.endpoint, nativePayload, signal);
28897
28905
  const result = params.endpoint === "directoryPicker/list" && needsDirectoryFallback(nativeResult) ? await this.directoryList(params.payload, signal) : nativeResult;
28906
+ if (params.endpoint === "workspace/create" && isInvalidWorkspacePath(result)) {
28907
+ const recovered = await this.recoverWorkspaceCreate(params.payload, signal);
28908
+ if (recovered !== void 0) return recovered;
28909
+ }
28898
28910
  this.logger?.debug("harness remote call ok", {
28899
28911
  endpoint: params.endpoint,
28900
28912
  durationMs: Math.round(performance.now() - startedAt)
@@ -28902,6 +28914,10 @@ var HarnessRemoteBridge = class {
28902
28914
  return reservation === void 0 ? result : this.terminal.result(params.endpoint, params.payload, result, reservation);
28903
28915
  } catch (error) {
28904
28916
  if (reservation !== void 0) this.terminal.result(params.endpoint, params.payload, { ok: false, error: { code: "FAILED", message: "", details: {} } }, reservation);
28917
+ if (params.endpoint === "workspace/create" && isInvalidWorkspacePath(error)) {
28918
+ const recovered = await this.recoverWorkspaceCreate(params.payload, signal);
28919
+ if (recovered !== void 0) return recovered;
28920
+ }
28905
28921
  if (params.endpoint === "directoryPicker/list") {
28906
28922
  const result = await this.directoryList(params.payload, signal);
28907
28923
  this.logger?.debug("harness remote call ok", {
@@ -28927,6 +28943,43 @@ var HarnessRemoteBridge = class {
28927
28943
  const params = directoryListSchema2.parse(args);
28928
28944
  return { ok: true, value: await listRemoteDirectory(params.path, signal) };
28929
28945
  }
28946
+ /**
28947
+ * Resolve an existing Workspace when `workspace/create` cannot realpath a
28948
+ * deleted directory.
28949
+ *
28950
+ * DSH keeps a registered Workspace open after its directory disappears, but
28951
+ * `workspace/create` canonicalizes the path first and fails with ENOENT. The
28952
+ * Client can still open the Workspace it sees in the Host's list; resolve that
28953
+ * list by lexical path and return the existing row instead of failing.
28954
+ * @param payload - workspace/create request payload.
28955
+ * @param signal - call lifetime.
28956
+ * @returns an existing-workspace result, or undefined when none matches.
28957
+ */
28958
+ async recoverWorkspaceCreate(payload, signal) {
28959
+ const path = requestArgs(payload).path;
28960
+ if (typeof path !== "string" || path === "") return void 0;
28961
+ let source;
28962
+ try {
28963
+ source = await this.gateway.open("workspace/follow", { args: {} }, signal);
28964
+ } catch {
28965
+ return void 0;
28966
+ }
28967
+ const iterator = source[Symbol.asyncIterator]();
28968
+ let first;
28969
+ try {
28970
+ first = await iterator.next();
28971
+ } catch {
28972
+ return void 0;
28973
+ } finally {
28974
+ await iterator.return?.().catch(() => void 0);
28975
+ }
28976
+ const frame = isRecord14(first.value) ? first.value : {};
28977
+ const baseline = isRecord14(frame.value) ? frame.value : frame;
28978
+ const items = Array.isArray(baseline.items) ? baseline.items : [];
28979
+ const target2 = workspacePathIdentity(path);
28980
+ const workspace = items.find((item) => isRecord14(item) && typeof item.path === "string" && workspacePathIdentity(item.path) === target2);
28981
+ return workspace === void 0 ? void 0 : { ok: true, value: { workspace, created: false } };
28982
+ }
28930
28983
  openTransfer(input2) {
28931
28984
  this.pruneTransfers();
28932
28985
  const params = transferOpenSchema3.parse(input2);
@@ -29507,6 +29560,17 @@ function record6(value) {
29507
29560
  function isRecord14(value) {
29508
29561
  return typeof value === "object" && value !== null && !Array.isArray(value);
29509
29562
  }
29563
+ function workspacePathIdentity(path) {
29564
+ const normalized = resolve3(path).replace(/[\\/]+$/, "");
29565
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
29566
+ }
29567
+ function isInvalidWorkspacePath(input2) {
29568
+ const error = isRecord14(input2) && input2.ok === false && isRecord14(input2.error) ? input2.error : input2;
29569
+ if (!isRecord14(error)) return false;
29570
+ const code = typeof error.code === "string" ? error.code : "";
29571
+ const message = typeof error.message === "string" ? error.message : "";
29572
+ return code === "workspace/invalid-path" || message.includes("cannot create a Workspace at") && message.includes("ENOENT");
29573
+ }
29510
29574
 
29511
29575
  // src/acp.ts
29512
29576
  import { spawn as spawn3 } from "node:child_process";
@@ -29596,7 +29660,7 @@ var StdioAcpAdapter = class {
29596
29660
  const c = this.ensure();
29597
29661
  const id4 = this.nextId++;
29598
29662
  c.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: id4, method, params }) + "\n");
29599
- return new Promise((resolve4, reject) => {
29663
+ return new Promise((resolve5, reject) => {
29600
29664
  let buf = "";
29601
29665
  const onData = async (d) => {
29602
29666
  buf += d;
@@ -29607,7 +29671,7 @@ var StdioAcpAdapter = class {
29607
29671
  const m = JSON.parse(l);
29608
29672
  if (m.id === id4) {
29609
29673
  c.stdout.off("data", onData);
29610
- m.error ? reject(new Error(m.error.message ?? "ACP error")) : resolve4(m.result);
29674
+ m.error ? reject(new Error(m.error.message ?? "ACP error")) : resolve5(m.result);
29611
29675
  } else if (m.method && onNotification) await onNotification(m.params);
29612
29676
  } catch {
29613
29677
  }
@@ -29625,7 +29689,7 @@ import { execFileSync as execFileSync2 } from "node:child_process";
29625
29689
  // src/codex-workspace-bridge.ts
29626
29690
  import { spawn as spawn4 } from "node:child_process";
29627
29691
  import { realpath as realpath2, lstat, readdir as readdir4, readFile as readFile5, stat as stat6, watch } from "node:fs/promises";
29628
- import { isAbsolute as isAbsolute5, join as join11, relative as relative3, resolve as resolve3 } from "node:path";
29692
+ import { isAbsolute as isAbsolute5, join as join11, relative as relative3, resolve as resolve4 } from "node:path";
29629
29693
  var MAX_READ_BYTES = 4 * 1024 * 1024;
29630
29694
  var MAX_INPUT_BYTES = 64 * 1024;
29631
29695
  var MAX_COLS = 240;
@@ -29656,7 +29720,7 @@ var AsyncQueue = class {
29656
29720
  const value = this.values.shift();
29657
29721
  if (value !== void 0) return Promise.resolve({ done: false, value });
29658
29722
  if (this.ended) return Promise.resolve({ done: true, value: void 0 });
29659
- return new Promise((resolve4) => this.waiters.push(resolve4));
29723
+ return new Promise((resolve5) => this.waiters.push(resolve5));
29660
29724
  }
29661
29725
  [Symbol.asyncIterator]() {
29662
29726
  return this;
@@ -29934,7 +29998,7 @@ var CodexWorkspaceBridge = class {
29934
29998
  }
29935
29999
  }
29936
30000
  async safePath(root, path, directory) {
29937
- const candidate = isAbsolute5(path) ? resolve3(path) : resolve3(root, path);
30001
+ const candidate = isAbsolute5(path) ? resolve4(path) : resolve4(root, path);
29938
30002
  const rel = relative3(root, candidate);
29939
30003
  if (rel.startsWith("..") || isAbsolute5(rel)) throw new RpcError("CODEX_WORKSPACE_PATH_DENIED", "The requested workspace path is outside the CodeX workspace.");
29940
30004
  try {
@@ -29985,14 +30049,14 @@ function pipeTerminalSpawner() {
29985
30049
  child.stdout.on("data", (data2) => queue.push(Buffer.from(data2).toString("utf8")));
29986
30050
  child.stderr.on("data", (data2) => queue.push(Buffer.from(data2).toString("utf8")));
29987
30051
  child.on("error", () => queue.end());
29988
- const completed = new Promise((resolve4) => {
30052
+ const completed = new Promise((resolve5) => {
29989
30053
  child.on("error", () => {
29990
30054
  queue.end();
29991
- resolve4({ exitCode: null });
30055
+ resolve5({ exitCode: null });
29992
30056
  });
29993
30057
  child.on("exit", (code) => {
29994
30058
  queue.end();
29995
- resolve4({ exitCode: code });
30059
+ resolve5({ exitCode: code });
29996
30060
  });
29997
30061
  });
29998
30062
  return {
@@ -30702,7 +30766,7 @@ function resolveDependencies(input2) {
30702
30766
  stdout: input2.stdout ?? process.stdout,
30703
30767
  stderr: input2.stderr ?? process.stderr,
30704
30768
  now: input2.now ?? Date.now,
30705
- wait: input2.wait ?? ((milliseconds) => new Promise((resolve4) => setTimeout(resolve4, milliseconds))),
30769
+ wait: input2.wait ?? ((milliseconds) => new Promise((resolve5) => setTimeout(resolve5, milliseconds))),
30706
30770
  renderQr: input2.renderQr ?? renderTerminalQr,
30707
30771
  createIdentityStore: input2.createIdentityStore ?? ((options) => new IdentityStore(options)),
30708
30772
  createHostApi: input2.createHostApi ?? ((serverUrl, store) => new HostServerApi(serverUrl, store))
@@ -31151,7 +31215,7 @@ function errorCode6(error) {
31151
31215
  return "CONNECTION_FAILED";
31152
31216
  }
31153
31217
  function wait(milliseconds) {
31154
- return new Promise((resolve4) => setTimeout(resolve4, milliseconds));
31218
+ return new Promise((resolve5) => setTimeout(resolve5, milliseconds));
31155
31219
  }
31156
31220
 
31157
31221
  // src/remote-file-content-provider.ts