@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/README.md +6 -4
- package/dist/index.js +136 -72
- package/dist/index.js.map +3 -3
- package/dsh-plugin.json +1 -1
- package/package.json +1 -1
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((
|
|
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((
|
|
5089
|
-
this.openResolve =
|
|
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
|
|
5304
|
+
const resolve5 = this.openResolve;
|
|
5305
5305
|
this.clearNegotiation();
|
|
5306
|
-
void this.resolveSelectedTransport().then(() =>
|
|
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((
|
|
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((
|
|
5742
|
-
this.readyResolve =
|
|
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((
|
|
13236
|
-
setTimeout(
|
|
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((
|
|
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.
|
|
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((
|
|
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 ?
|
|
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((
|
|
14738
|
+
return new Promise((resolve5) => {
|
|
14739
14739
|
const timer = setTimeout(() => {
|
|
14740
14740
|
this.retryWake = void 0;
|
|
14741
|
-
|
|
14741
|
+
resolve5();
|
|
14742
14742
|
}, delay);
|
|
14743
14743
|
this.retryWake = () => {
|
|
14744
14744
|
clearTimeout(timer);
|
|
14745
|
-
|
|
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((
|
|
14757
|
-
timer = setTimeout(
|
|
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((
|
|
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 ?
|
|
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((
|
|
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((
|
|
15159
|
+
if (handle.messages.length === 0 && !handle.closed) await new Promise((resolve5) => {
|
|
15160
15160
|
const timer = setTimeout(() => {
|
|
15161
15161
|
handle.wake = void 0;
|
|
15162
|
-
|
|
15162
|
+
resolve5();
|
|
15163
15163
|
}, 2e4);
|
|
15164
15164
|
handle.wake = () => {
|
|
15165
15165
|
clearTimeout(timer);
|
|
15166
15166
|
handle.wake = void 0;
|
|
15167
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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", () =>
|
|
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((
|
|
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((
|
|
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
|
-
|
|
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((
|
|
15443
|
+
await new Promise((resolve5, reject) => {
|
|
15444
15444
|
const ready = () => {
|
|
15445
15445
|
cleanup();
|
|
15446
|
-
|
|
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((
|
|
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((
|
|
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:
|
|
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((
|
|
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)
|
|
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((
|
|
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((
|
|
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((
|
|
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([
|
|
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((
|
|
21038
|
-
this.pending.set(id4, { resolve:
|
|
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((
|
|
21838
|
+
return await new Promise((resolve5, reject) => {
|
|
21833
21839
|
const timer = setTimeout(() => {
|
|
21834
21840
|
cleanup();
|
|
21835
|
-
|
|
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
|
-
|
|
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((
|
|
24034
|
-
setTimeout(
|
|
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((
|
|
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
|
-
|
|
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((
|
|
24641
|
+
await new Promise((resolve5) => {
|
|
24637
24642
|
const timer = setTimeout(() => {
|
|
24638
24643
|
child.kill("SIGKILL");
|
|
24639
|
-
|
|
24644
|
+
resolve5();
|
|
24640
24645
|
}, 2e3);
|
|
24641
24646
|
timer.unref?.();
|
|
24642
24647
|
child.once("exit", () => {
|
|
24643
24648
|
clearTimeout(timer);
|
|
24644
|
-
|
|
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((
|
|
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:
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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")) :
|
|
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
|
|
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((
|
|
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) ?
|
|
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((
|
|
30052
|
+
const completed = new Promise((resolve5) => {
|
|
29989
30053
|
child.on("error", () => {
|
|
29990
30054
|
queue.end();
|
|
29991
|
-
|
|
30055
|
+
resolve5({ exitCode: null });
|
|
29992
30056
|
});
|
|
29993
30057
|
child.on("exit", (code) => {
|
|
29994
30058
|
queue.end();
|
|
29995
|
-
|
|
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((
|
|
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((
|
|
31218
|
+
return new Promise((resolve5) => setTimeout(resolve5, milliseconds));
|
|
31155
31219
|
}
|
|
31156
31220
|
|
|
31157
31221
|
// src/remote-file-content-provider.ts
|