pinomad 0.13.0 → 0.14.1
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/{chunk-kmzzjv53.js → chunk-1mjbt2z2.js} +143 -10
- package/dist/{chunk-90g1cg9n.js → chunk-3hfaejdx.js} +1 -1
- package/dist/{chunk-d9mq5d46.js → chunk-5ayqca95.js} +10 -8
- package/dist/{chunk-7mn38n4f.js → chunk-63ymn5c9.js} +2 -2
- package/dist/{chunk-563fnad9.js → chunk-6j6hkfbj.js} +8 -4
- package/dist/{chunk-pqe7q1s7.js → chunk-6vbp1vva.js} +2 -1
- package/dist/chunk-8g2e77gf.js +46 -0
- package/dist/{chunk-6th9xv39.js → chunk-97ssw1c0.js} +9 -7
- package/dist/{chunk-g3ahp7b9.js → chunk-9trbbz4r.js} +1 -1
- package/dist/{chunk-4fferbxw.js → chunk-e59k3bmz.js} +213 -30
- package/dist/{chunk-s0h7c7da.js → chunk-ega1wnkg.js} +1 -1
- package/dist/{chunk-maqv34cs.js → chunk-evbv1fkn.js} +3 -3
- package/dist/{chunk-d4tq62yr.js → chunk-f6741a5q.js} +12 -11
- package/dist/{chunk-m51mq8vh.js → chunk-fdhbzwxj.js} +12 -10
- package/dist/{chunk-aapsc9g0.js → chunk-hfwa1vt5.js} +1952 -295
- package/dist/{chunk-t91zt5f0.js → chunk-hg9gs396.js} +1 -1
- package/dist/chunk-mdjk0s0t.js +23 -0
- package/dist/{chunk-wd7aracm.js → chunk-mxwcnnkg.js} +1 -303
- package/dist/chunk-pte4peaf.js +315 -0
- package/dist/{chunk-53xv3fny.js → chunk-s66evzar.js} +2446 -416
- package/dist/chunk-vedqqhbd.js +240 -0
- package/dist/{chunk-ra86wjp5.js → chunk-w9zpff3n.js} +11 -6
- package/dist/pinomad.js +12 -12
- package/package.json +5 -1
- package/web/assets/{core-BHm2gdHL.js → core-BWHGsFpV.js} +1 -1
- package/web/assets/{highlighted-diff-DrHvSLK9.js → highlighted-diff-DJ7KZCpS.js} +2 -2
- package/web/assets/{highlights-1aLwssz-.js → highlights-CyEmo6OI.js} +1 -1
- package/web/assets/{highlights-themes-C1p4pFYS.js → highlights-themes-CSNkBojy.js} +1 -1
- package/web/assets/index-C_qkbyL7.css +1 -0
- package/web/assets/index-DefQtCI2.js +396 -0
- package/web/assets/{shiki-BwyCm3kZ.js → shiki-BzCmRG-v.js} +2 -2
- package/web/assets/{shiki-langs-CMlALLSg.js → shiki-langs-DOkjyV4d.js} +1 -1
- package/web/assets/{stream-tokenizer-BlgIhw0y.js → stream-tokenizer-CBPqFe4Z.js} +1 -1
- package/web/assets/{theming-themes-DDvoqEqT.js → theming-themes-wKVca0aB.js} +1 -1
- package/web/assets/{xterm-view-BnKOnF3C.js → xterm-view-CKa1-QCM.js} +12 -12
- package/web/index.html +3 -2
- package/web/theme-boot.js +11 -0
- package/dist/chunk-sd640dt7.js +0 -22
- package/dist/chunk-t6fw0wa9.js +0 -96
- package/web/assets/index-A_AUJoO6.css +0 -1
- package/web/assets/index-BafYMKiN.js +0 -396
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
UNAUTHORIZED_CLOSE_CODE,
|
|
8
8
|
addEarlier,
|
|
9
9
|
checkoutOf,
|
|
10
|
+
classify,
|
|
10
11
|
conversationStream,
|
|
11
12
|
docStream,
|
|
12
13
|
homeOf,
|
|
@@ -14,12 +15,14 @@ import {
|
|
|
14
15
|
hostSupportsCall,
|
|
15
16
|
hostSupportsFeature,
|
|
16
17
|
isBusy,
|
|
18
|
+
isProcessesHello,
|
|
17
19
|
isRtcHello,
|
|
18
20
|
organize,
|
|
19
21
|
parseRtcMaxMessageSize,
|
|
22
|
+
processStream,
|
|
20
23
|
rtcSelectedPair,
|
|
21
24
|
withEarlier
|
|
22
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-1mjbt2z2.js";
|
|
23
26
|
import {
|
|
24
27
|
SECURE_PROLOGUE,
|
|
25
28
|
SecureSession,
|
|
@@ -28,7 +31,7 @@ import {
|
|
|
28
31
|
initiateIK,
|
|
29
32
|
isLoopbackUrl,
|
|
30
33
|
parseEndpointSet
|
|
31
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-6vbp1vva.js";
|
|
32
35
|
|
|
33
36
|
// packages/protocol/src/remote-durable.ts
|
|
34
37
|
import { applyImmutable } from "@earendil-works/chord/delta";
|
|
@@ -454,6 +457,7 @@ class RemoteClient {
|
|
|
454
457
|
#state;
|
|
455
458
|
#current;
|
|
456
459
|
#side;
|
|
460
|
+
#acquiring = new Map;
|
|
457
461
|
#nextCall = 1;
|
|
458
462
|
#nextNotice = 1;
|
|
459
463
|
#submissions = new Map;
|
|
@@ -466,10 +470,14 @@ class RemoteClient {
|
|
|
466
470
|
#helloDefaults = {};
|
|
467
471
|
#hostVersion;
|
|
468
472
|
#hostTerminals;
|
|
473
|
+
#hostProcesses;
|
|
469
474
|
#terminalWatchers = new Map;
|
|
470
475
|
#terminalSinks = new Map;
|
|
471
476
|
#terminalPositions = new Map;
|
|
472
477
|
#terminalSizes = new Map;
|
|
478
|
+
#processWatchers = new Map;
|
|
479
|
+
#processSinks = new Map;
|
|
480
|
+
#processPositions = new Map;
|
|
473
481
|
#attempt = 0;
|
|
474
482
|
#rtcAttemptNonce = randomHex(8);
|
|
475
483
|
#closed = false;
|
|
@@ -723,6 +731,7 @@ class RemoteClient {
|
|
|
723
731
|
this.#helloDefaults = frame.defaults ?? {};
|
|
724
732
|
this.#hostVersion = frame.hostVersion;
|
|
725
733
|
this.#hostTerminals = isTerminalsHello(frame.terminals) ? frame.terminals : undefined;
|
|
734
|
+
this.#hostProcesses = isProcessesHello(frame.processes) ? frame.processes : undefined;
|
|
726
735
|
this.#fresh.clear();
|
|
727
736
|
const covered = new Set(hostStreams(hostMinor));
|
|
728
737
|
for (const name of HOST_STREAM_NAMES) {
|
|
@@ -741,6 +750,7 @@ class RemoteClient {
|
|
|
741
750
|
for (const stream of this.#conversationStreams(this.#side))
|
|
742
751
|
this.#wanted.add(stream);
|
|
743
752
|
this.#terminalsAvailability();
|
|
753
|
+
this.#processesAvailability();
|
|
744
754
|
for (const stream of this.#wanted)
|
|
745
755
|
this.#subscribe(stream);
|
|
746
756
|
if (frame.endpointSet !== undefined) {
|
|
@@ -823,6 +833,7 @@ class RemoteClient {
|
|
|
823
833
|
providers: null,
|
|
824
834
|
settings: null,
|
|
825
835
|
agents: null,
|
|
836
|
+
upgrade: null,
|
|
826
837
|
host: this.#hostInfo()
|
|
827
838
|
};
|
|
828
839
|
this.#refresh();
|
|
@@ -830,6 +841,7 @@ class RemoteClient {
|
|
|
830
841
|
view: this.#viewSource(),
|
|
831
842
|
controller: this.#controller(),
|
|
832
843
|
terminals: this.#terminals(),
|
|
844
|
+
processes: this.#processes(),
|
|
833
845
|
setConnectionMode: (mode) => this.setConnectionMode(mode),
|
|
834
846
|
rtcDiagnostics: () => this.rtcDiagnostics(),
|
|
835
847
|
close: () => this.#close()
|
|
@@ -1990,6 +2002,8 @@ class RemoteClient {
|
|
|
1990
2002
|
this.#fresh.add(frame.stream);
|
|
1991
2003
|
this.#streamVersions.set(frame.stream, (this.#streamVersions.get(frame.stream) ?? 0) + 1);
|
|
1992
2004
|
this.#refresh();
|
|
2005
|
+
if (this.#processWatchers.has(frame.stream))
|
|
2006
|
+
this.#notifyProcesses(frame.stream);
|
|
1993
2007
|
for (const waiter of this.#snapshotWaiters.get(frame.stream)?.splice(0) ?? [])
|
|
1994
2008
|
waiter.resolve();
|
|
1995
2009
|
return;
|
|
@@ -1998,12 +2012,18 @@ class RemoteClient {
|
|
|
1998
2012
|
return;
|
|
1999
2013
|
this.#values.set(frame.stream, applyImmutable(this.#values.get(frame.stream), frame.ops));
|
|
2000
2014
|
this.#refresh();
|
|
2015
|
+
if (this.#processWatchers.has(frame.stream))
|
|
2016
|
+
this.#notifyProcesses(frame.stream);
|
|
2001
2017
|
return;
|
|
2002
2018
|
case "output": {
|
|
2003
|
-
const
|
|
2019
|
+
const processSink = this.#processSinks.get(frame.stream);
|
|
2020
|
+
const sink = processSink ?? this.#terminalSinks.get(frame.stream);
|
|
2004
2021
|
if (sink === undefined || !this.#wanted.has(frame.stream))
|
|
2005
2022
|
return;
|
|
2006
|
-
|
|
2023
|
+
if (processSink === undefined)
|
|
2024
|
+
this.#terminalPositions.set(frame.stream, frame.seq);
|
|
2025
|
+
else
|
|
2026
|
+
this.#processPositions.set(frame.stream, frame.seq);
|
|
2007
2027
|
sink.output(frame.data, frame.reset === true);
|
|
2008
2028
|
return;
|
|
2009
2029
|
}
|
|
@@ -2012,6 +2032,10 @@ class RemoteClient {
|
|
|
2012
2032
|
this.#endTerminalStream(frame.stream, frame.reason);
|
|
2013
2033
|
return;
|
|
2014
2034
|
}
|
|
2035
|
+
if (frame.stream.startsWith("process:")) {
|
|
2036
|
+
this.#endProcessStream(frame.stream, frame.reason);
|
|
2037
|
+
return;
|
|
2038
|
+
}
|
|
2015
2039
|
this.#wanted.delete(frame.stream);
|
|
2016
2040
|
this.#values.delete(frame.stream);
|
|
2017
2041
|
this.#earlier.delete(frame.stream);
|
|
@@ -2030,6 +2054,8 @@ class RemoteClient {
|
|
|
2030
2054
|
this.#side = undefined;
|
|
2031
2055
|
}
|
|
2032
2056
|
this.#refresh();
|
|
2057
|
+
if (this.#processWatchers.has(frame.stream))
|
|
2058
|
+
this.#notifyProcesses(frame.stream);
|
|
2033
2059
|
return;
|
|
2034
2060
|
}
|
|
2035
2061
|
case "result": {
|
|
@@ -2083,35 +2109,55 @@ class RemoteClient {
|
|
|
2083
2109
|
return [conversationStream(id), ...this.#docs.map((doc) => docStream(doc.kind, id))];
|
|
2084
2110
|
}
|
|
2085
2111
|
async#acquire(id) {
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
this.#wanted.
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2112
|
+
this.#acquiring.set(id, (this.#acquiring.get(id) ?? 0) + 1);
|
|
2113
|
+
try {
|
|
2114
|
+
const missing = this.#conversationStreams(id).filter((stream) => !this.#wanted.has(stream));
|
|
2115
|
+
const stale = this.#conversationStreams(id).filter((stream) => this.#wanted.has(stream) && !this.#fresh.has(stream));
|
|
2116
|
+
for (const stream of missing)
|
|
2117
|
+
this.#wanted.add(stream);
|
|
2118
|
+
const shown = Promise.all([...missing, ...stale].map((stream) => this.#snapshot(stream)));
|
|
2119
|
+
for (const stream of missing) {
|
|
2120
|
+
if (this.#helloReceived)
|
|
2121
|
+
this.#subscribe(stream);
|
|
2122
|
+
}
|
|
2123
|
+
await shown;
|
|
2124
|
+
} finally {
|
|
2125
|
+
const left = (this.#acquiring.get(id) ?? 1) - 1;
|
|
2126
|
+
if (left > 0)
|
|
2127
|
+
this.#acquiring.set(id, left);
|
|
2128
|
+
else
|
|
2129
|
+
this.#acquiring.delete(id);
|
|
2130
|
+
}
|
|
2131
|
+
}
|
|
2132
|
+
#streamStillWanted(stream) {
|
|
2133
|
+
if (this.#processWatchers.has(stream))
|
|
2134
|
+
return true;
|
|
2135
|
+
for (const id of [this.#current, this.#side, ...this.#acquiring.keys()]) {
|
|
2136
|
+
if (id !== undefined && this.#conversationStreams(id).includes(stream))
|
|
2137
|
+
return true;
|
|
2138
|
+
}
|
|
2139
|
+
return false;
|
|
2140
|
+
}
|
|
2141
|
+
#releaseStream(stream) {
|
|
2142
|
+
this.#wanted.delete(stream);
|
|
2143
|
+
this.#values.delete(stream);
|
|
2144
|
+
this.#earlier.delete(stream);
|
|
2145
|
+
this.#loadingEarlier.delete(stream);
|
|
2146
|
+
this.#fresh.delete(stream);
|
|
2147
|
+
for (const waiter of this.#snapshotWaiters.get(stream)?.splice(0) ?? [])
|
|
2148
|
+
waiter.resolve();
|
|
2149
|
+
this.#send({ type: "unsubscribe", stream });
|
|
2150
|
+
}
|
|
2151
|
+
#release(id) {
|
|
2099
2152
|
for (const stream of this.#conversationStreams(id)) {
|
|
2100
|
-
if (
|
|
2153
|
+
if (this.#streamStillWanted(stream))
|
|
2101
2154
|
continue;
|
|
2102
|
-
this.#
|
|
2103
|
-
this.#values.delete(stream);
|
|
2104
|
-
this.#earlier.delete(stream);
|
|
2105
|
-
this.#loadingEarlier.delete(stream);
|
|
2106
|
-
this.#fresh.delete(stream);
|
|
2107
|
-
for (const waiter of this.#snapshotWaiters.get(stream)?.splice(0) ?? [])
|
|
2108
|
-
waiter.resolve();
|
|
2109
|
-
this.#send({ type: "unsubscribe", stream });
|
|
2155
|
+
this.#releaseStream(stream);
|
|
2110
2156
|
}
|
|
2111
2157
|
}
|
|
2112
2158
|
#subscribe(stream) {
|
|
2113
2159
|
const refs = stream.startsWith("conversation:") && hostSupportsFeature(this.#hostMinor, "imageRefs");
|
|
2114
|
-
const since = this.#terminalPositions.get(stream);
|
|
2160
|
+
const since = stream.startsWith("process:") ? this.#processPositions.get(stream) : this.#terminalPositions.get(stream);
|
|
2115
2161
|
const window = this.#window(stream);
|
|
2116
2162
|
this.#send({
|
|
2117
2163
|
type: "subscribe",
|
|
@@ -2268,6 +2314,122 @@ class RemoteClient {
|
|
|
2268
2314
|
close: (terminalId) => this.#terminalCall("closeTerminal", { terminalId }).then(() => {})
|
|
2269
2315
|
};
|
|
2270
2316
|
}
|
|
2317
|
+
#processesUnavailable() {
|
|
2318
|
+
if (!hostSupportsFeature(this.#hostMinor, "processes")) {
|
|
2319
|
+
return "The host is too old for background processes (needs protocol 5.32); run `pinomad upgrade` on the host";
|
|
2320
|
+
}
|
|
2321
|
+
if (this.#hostProcesses === undefined)
|
|
2322
|
+
return "The host couldn't load its process module; its log says which package is missing";
|
|
2323
|
+
return;
|
|
2324
|
+
}
|
|
2325
|
+
#processDocDeclared() {
|
|
2326
|
+
return this.#docs.some((doc) => doc.kind === "pinomad.processes");
|
|
2327
|
+
}
|
|
2328
|
+
#processesAvailability() {
|
|
2329
|
+
const listable = hostSupportsFeature(this.#hostMinor, "processes") && this.#processDocDeclared();
|
|
2330
|
+
for (const stream of [...this.#processWatchers.keys()]) {
|
|
2331
|
+
if (listable) {
|
|
2332
|
+
this.#wanted.add(stream);
|
|
2333
|
+
} else {
|
|
2334
|
+
this.#wanted.delete(stream);
|
|
2335
|
+
this.#values.delete(stream);
|
|
2336
|
+
for (const waiter of this.#snapshotWaiters.get(stream)?.splice(0) ?? [])
|
|
2337
|
+
waiter.resolve();
|
|
2338
|
+
}
|
|
2339
|
+
this.#notifyProcesses(stream);
|
|
2340
|
+
}
|
|
2341
|
+
const reason = this.#processesUnavailable();
|
|
2342
|
+
if (reason === undefined) {
|
|
2343
|
+
for (const stream of this.#processSinks.keys())
|
|
2344
|
+
this.#wanted.add(stream);
|
|
2345
|
+
return;
|
|
2346
|
+
}
|
|
2347
|
+
for (const stream of [...this.#processSinks.keys()])
|
|
2348
|
+
this.#endProcessStream(stream, reason);
|
|
2349
|
+
}
|
|
2350
|
+
#notifyProcesses(stream) {
|
|
2351
|
+
const state = this.#processState(stream);
|
|
2352
|
+
for (const listener of [...this.#processWatchers.get(stream) ?? []])
|
|
2353
|
+
listener(state);
|
|
2354
|
+
}
|
|
2355
|
+
#processState(stream) {
|
|
2356
|
+
const value = this.#values.get(stream);
|
|
2357
|
+
const presentation = this.#docs.find((doc) => doc.kind === "pinomad.processes")?.presentation ?? "pinomad.processes";
|
|
2358
|
+
const classified = classify(presentation, value);
|
|
2359
|
+
const processes = classified.type === "pinomad.processes" ? classified.value.processes : [];
|
|
2360
|
+
const reason = this.#processesUnavailable();
|
|
2361
|
+
return {
|
|
2362
|
+
processes: [...processes],
|
|
2363
|
+
...reason === undefined ? {} : { unavailable: reason }
|
|
2364
|
+
};
|
|
2365
|
+
}
|
|
2366
|
+
#endProcessStream(stream, reason) {
|
|
2367
|
+
this.#wanted.delete(stream);
|
|
2368
|
+
const sink = this.#processSinks.get(stream);
|
|
2369
|
+
this.#processSinks.delete(stream);
|
|
2370
|
+
this.#processPositions.delete(stream);
|
|
2371
|
+
sink?.ended(reason);
|
|
2372
|
+
}
|
|
2373
|
+
#processCall(method, args) {
|
|
2374
|
+
const reason = this.#processesUnavailable();
|
|
2375
|
+
return reason === undefined ? this.#call(method, args) : Promise.reject(new Error(reason));
|
|
2376
|
+
}
|
|
2377
|
+
#processes() {
|
|
2378
|
+
return {
|
|
2379
|
+
watch: (conversationId, listener) => {
|
|
2380
|
+
const stream = docStream("pinomad.processes", conversationId);
|
|
2381
|
+
let listeners = this.#processWatchers.get(stream);
|
|
2382
|
+
const first = listeners === undefined;
|
|
2383
|
+
if (listeners === undefined)
|
|
2384
|
+
this.#processWatchers.set(stream, listeners = new Set);
|
|
2385
|
+
listeners.add(listener);
|
|
2386
|
+
listener(this.#processState(stream));
|
|
2387
|
+
if (first && hostSupportsFeature(this.#hostMinor, "processes") && this.#processDocDeclared()) {
|
|
2388
|
+
this.#wanted.add(stream);
|
|
2389
|
+
if (this.#helloReceived)
|
|
2390
|
+
this.#subscribe(stream);
|
|
2391
|
+
}
|
|
2392
|
+
return () => {
|
|
2393
|
+
if (!listeners.delete(listener) || listeners.size > 0)
|
|
2394
|
+
return;
|
|
2395
|
+
this.#processWatchers.delete(stream);
|
|
2396
|
+
if (this.#streamStillWanted(stream))
|
|
2397
|
+
return;
|
|
2398
|
+
if (!this.#wanted.has(stream))
|
|
2399
|
+
return;
|
|
2400
|
+
this.#releaseStream(stream);
|
|
2401
|
+
};
|
|
2402
|
+
},
|
|
2403
|
+
attach: (processId, since, sink) => {
|
|
2404
|
+
const stream = processStream(processId);
|
|
2405
|
+
const reason = this.#processesUnavailable();
|
|
2406
|
+
if (reason !== undefined) {
|
|
2407
|
+
sink.ended(reason);
|
|
2408
|
+
return () => {};
|
|
2409
|
+
}
|
|
2410
|
+
if (this.#processSinks.has(stream) && this.#wanted.has(stream))
|
|
2411
|
+
this.#send({ type: "unsubscribe", stream });
|
|
2412
|
+
this.#processSinks.set(stream, sink);
|
|
2413
|
+
if (since === undefined)
|
|
2414
|
+
this.#processPositions.delete(stream);
|
|
2415
|
+
else
|
|
2416
|
+
this.#processPositions.set(stream, since);
|
|
2417
|
+
this.#wanted.add(stream);
|
|
2418
|
+
if (this.#helloReceived)
|
|
2419
|
+
this.#subscribe(stream);
|
|
2420
|
+
return () => {
|
|
2421
|
+
if (this.#processSinks.get(stream) !== sink)
|
|
2422
|
+
return;
|
|
2423
|
+
this.#processSinks.delete(stream);
|
|
2424
|
+
this.#processPositions.delete(stream);
|
|
2425
|
+
if (this.#wanted.delete(stream))
|
|
2426
|
+
this.#send({ type: "unsubscribe", stream });
|
|
2427
|
+
};
|
|
2428
|
+
},
|
|
2429
|
+
stop: (conversationId, processId) => this.#processCall("stopProcess", { conversationId, id: processId }).then(({ state }) => state),
|
|
2430
|
+
unavailable: () => this.#processesUnavailable()
|
|
2431
|
+
};
|
|
2432
|
+
}
|
|
2271
2433
|
#host(name) {
|
|
2272
2434
|
return this.#values.get(name);
|
|
2273
2435
|
}
|
|
@@ -2782,6 +2944,7 @@ class RemoteClient {
|
|
|
2782
2944
|
providers: this.#host("providers") ?? null,
|
|
2783
2945
|
settings: this.#host("settings") ?? null,
|
|
2784
2946
|
agents: this.#host("agents") ?? null,
|
|
2947
|
+
upgrade: this.#host("upgrade") ?? null,
|
|
2785
2948
|
defaults: this.#effectiveDefaults(this.#helloDefaults)
|
|
2786
2949
|
});
|
|
2787
2950
|
}
|
|
@@ -2846,6 +3009,11 @@ class RemoteClient {
|
|
|
2846
3009
|
}
|
|
2847
3010
|
});
|
|
2848
3011
|
}
|
|
3012
|
+
#requireUpgrade() {
|
|
3013
|
+
if (!hostSupportsCall(this.#hostMinor, "startUpgrade")) {
|
|
3014
|
+
throw new Error("The host is too old for this (needs protocol 5.30); run `pinomad upgrade` on the host");
|
|
3015
|
+
}
|
|
3016
|
+
}
|
|
2849
3017
|
#command(operation) {
|
|
2850
3018
|
this.#commands = this.#commands.then(operation).then(() => {}, (error) => this.#notice("error", error instanceof Error ? error.message : String(error)));
|
|
2851
3019
|
return this.#commands;
|
|
@@ -3133,8 +3301,23 @@ class RemoteClient {
|
|
|
3133
3301
|
if (patch.hostName !== undefined && !hostSupportsFeature(this.#hostMinor, "hostName")) {
|
|
3134
3302
|
throw new Error("The host is too old for this (needs protocol 5.12); run `pinomad upgrade` on the host");
|
|
3135
3303
|
}
|
|
3304
|
+
if (patch.autoUpgrade !== undefined && !hostSupportsFeature(this.#hostMinor, "autoUpgrade")) {
|
|
3305
|
+
throw new Error("The host is too old for this (needs protocol 5.30); run `pinomad upgrade` on the host");
|
|
3306
|
+
}
|
|
3136
3307
|
return this.#call("updateSettings", { patch });
|
|
3137
3308
|
}),
|
|
3309
|
+
startUpgrade: async (when) => {
|
|
3310
|
+
this.#requireUpgrade();
|
|
3311
|
+
await this.#call("startUpgrade", { when });
|
|
3312
|
+
},
|
|
3313
|
+
cancelUpgrade: async () => {
|
|
3314
|
+
this.#requireUpgrade();
|
|
3315
|
+
await this.#call("cancelUpgrade", {});
|
|
3316
|
+
},
|
|
3317
|
+
checkUpgrade: async () => {
|
|
3318
|
+
this.#requireUpgrade();
|
|
3319
|
+
await this.#call("checkUpgrade", {});
|
|
3320
|
+
},
|
|
3138
3321
|
createAgent: (role) => this.#request(async () => {
|
|
3139
3322
|
if (!hostSupportsCall(this.#hostMinor, "createAgent")) {
|
|
3140
3323
|
throw new Error("The host is too old for this (needs protocol 5.6); run `pinomad upgrade` on the host");
|
|
@@ -3171,7 +3354,7 @@ class RemoteClient {
|
|
|
3171
3354
|
await this.#acquire(id);
|
|
3172
3355
|
this.#current = id;
|
|
3173
3356
|
if (previous !== undefined)
|
|
3174
|
-
this.#release(previous
|
|
3357
|
+
this.#release(previous);
|
|
3175
3358
|
this.#refresh();
|
|
3176
3359
|
}
|
|
3177
3360
|
#unshow() {
|
|
@@ -3179,7 +3362,7 @@ class RemoteClient {
|
|
|
3179
3362
|
if (previous === undefined)
|
|
3180
3363
|
return;
|
|
3181
3364
|
this.#current = undefined;
|
|
3182
|
-
this.#release(previous
|
|
3365
|
+
this.#release(previous);
|
|
3183
3366
|
this.#refresh();
|
|
3184
3367
|
}
|
|
3185
3368
|
async#clear() {
|
|
@@ -3194,7 +3377,7 @@ class RemoteClient {
|
|
|
3194
3377
|
await this.#acquire(id);
|
|
3195
3378
|
this.#side = id;
|
|
3196
3379
|
if (previous !== undefined)
|
|
3197
|
-
this.#release(previous
|
|
3380
|
+
this.#release(previous);
|
|
3198
3381
|
this.#refresh();
|
|
3199
3382
|
}
|
|
3200
3383
|
#close() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// apps/host/src/distribution.ts
|
|
2
2
|
import { fileURLToPath } from "node:url";
|
|
3
|
-
var packagedVersion = "0.
|
|
3
|
+
var packagedVersion = "0.14.1";
|
|
4
4
|
var webRoot = fileURLToPath(new URL(packagedVersion === undefined ? "../../web/dist" : "../web/", import.meta.url));
|
|
5
5
|
var hostEntry = packagedVersion === undefined ? { script: fileURLToPath(new URL("./main.ts", import.meta.url)), args: [] } : { script: fileURLToPath(new URL("./pinomad.js", import.meta.url)), args: ["host"] };
|
|
6
6
|
var commandHint = (name) => packagedVersion === undefined ? `bun run ${name}` : `pinomad ${name}`;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
connectRemoteDurable
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import"./chunk-
|
|
3
|
+
} from "./chunk-e59k3bmz.js";
|
|
4
|
+
import"./chunk-1mjbt2z2.js";
|
|
5
5
|
import {
|
|
6
6
|
isLoopbackUrl
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6vbp1vva.js";
|
|
8
8
|
import {
|
|
9
9
|
hostAddress
|
|
10
10
|
} from "./chunk-ngf1zatm.js";
|
|
@@ -3,16 +3,19 @@ import {
|
|
|
3
3
|
joinServer,
|
|
4
4
|
openServiceSlot,
|
|
5
5
|
writeService
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import"./chunk-
|
|
8
|
-
import"./chunk-
|
|
9
|
-
import"./chunk-
|
|
6
|
+
} from "./chunk-5ayqca95.js";
|
|
7
|
+
import"./chunk-63ymn5c9.js";
|
|
8
|
+
import"./chunk-6j6hkfbj.js";
|
|
9
|
+
import"./chunk-hg9gs396.js";
|
|
10
10
|
import {
|
|
11
11
|
normalizeOrigin,
|
|
12
12
|
readRemovalNotice,
|
|
13
13
|
readServerConfig
|
|
14
14
|
} from "./chunk-nq57fdnq.js";
|
|
15
|
-
import"./chunk-
|
|
15
|
+
import"./chunk-9trbbz4r.js";
|
|
16
|
+
import"./chunk-pte4peaf.js";
|
|
17
|
+
import"./chunk-e59k3bmz.js";
|
|
18
|
+
import"./chunk-kzbzacz9.js";
|
|
16
19
|
import {
|
|
17
20
|
LAUNCHER_EXECUTABLE,
|
|
18
21
|
argValue,
|
|
@@ -20,17 +23,15 @@ import {
|
|
|
20
23
|
serviceManager,
|
|
21
24
|
withoutArg,
|
|
22
25
|
withoutRelayArgs
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import"./chunk-
|
|
25
|
-
import"./chunk-
|
|
26
|
-
import"./chunk-kmzzjv53.js";
|
|
27
|
-
import"./chunk-pqe7q1s7.js";
|
|
26
|
+
} from "./chunk-mxwcnnkg.js";
|
|
27
|
+
import"./chunk-1mjbt2z2.js";
|
|
28
|
+
import"./chunk-6vbp1vva.js";
|
|
28
29
|
import {
|
|
29
30
|
DEFAULT_DATA_DIR
|
|
30
31
|
} from "./chunk-ngf1zatm.js";
|
|
31
32
|
import {
|
|
32
33
|
commandHint
|
|
33
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-ega1wnkg.js";
|
|
34
35
|
import"./chunk-df32avw6.js";
|
|
35
36
|
|
|
36
37
|
// apps/host/src/cli/up.ts
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
assertSecureServerOrigin,
|
|
4
4
|
probeServerAccounts,
|
|
5
5
|
runServerOperation
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-63ymn5c9.js";
|
|
7
7
|
import {
|
|
8
8
|
loadHostKey,
|
|
9
9
|
loadRelayKey
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-hg9gs396.js";
|
|
11
11
|
import {
|
|
12
12
|
readRemovalNotice,
|
|
13
13
|
readServerConfig,
|
|
@@ -15,23 +15,25 @@ import {
|
|
|
15
15
|
} from "./chunk-nq57fdnq.js";
|
|
16
16
|
import {
|
|
17
17
|
relayHostId
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-9trbbz4r.js";
|
|
19
|
+
import {
|
|
20
|
+
restartService
|
|
21
|
+
} from "./chunk-pte4peaf.js";
|
|
22
|
+
import"./chunk-e59k3bmz.js";
|
|
23
|
+
import"./chunk-kzbzacz9.js";
|
|
19
24
|
import {
|
|
20
25
|
argValue,
|
|
21
|
-
restartService,
|
|
22
26
|
serviceManager,
|
|
23
27
|
withoutRelayArgs
|
|
24
|
-
} from "./chunk-
|
|
25
|
-
import"./chunk-
|
|
26
|
-
import"./chunk-
|
|
27
|
-
import"./chunk-kmzzjv53.js";
|
|
28
|
-
import"./chunk-pqe7q1s7.js";
|
|
28
|
+
} from "./chunk-mxwcnnkg.js";
|
|
29
|
+
import"./chunk-1mjbt2z2.js";
|
|
30
|
+
import"./chunk-6vbp1vva.js";
|
|
29
31
|
import {
|
|
30
32
|
DEFAULT_DATA_DIR
|
|
31
33
|
} from "./chunk-ngf1zatm.js";
|
|
32
34
|
import {
|
|
33
35
|
commandHint
|
|
34
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-ega1wnkg.js";
|
|
35
37
|
import"./chunk-df32avw6.js";
|
|
36
38
|
|
|
37
39
|
// apps/host/src/cli/leave.ts
|