@polderlabs/bizar-omp 0.6.6 → 0.6.7
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 +3 -3
- package/dist/cli/agents.d.ts +1 -1
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +1 -1
- package/dist/cli/omb-commands.js +1 -1
- package/dist/cli/omb-commands.js.map +1 -1
- package/dist/cli/omb-update.d.ts +5 -0
- package/dist/cli/omb-update.d.ts.map +1 -1
- package/dist/cli/omb-update.js +14 -5
- package/dist/cli/omb-update.js.map +1 -1
- package/dist/cli/update-ink.d.ts +50 -0
- package/dist/cli/update-ink.d.ts.map +1 -0
- package/dist/cli/update-ink.js +185 -0
- package/dist/cli/update-ink.js.map +1 -0
- package/dist/omp/daemon-service.d.ts.map +1 -1
- package/dist/omp/daemon-service.js +116 -2
- package/dist/omp/daemon-service.js.map +1 -1
- package/dist/omp/dashboard-html.d.ts.map +1 -1
- package/dist/omp/dashboard-html.js +70 -3
- package/dist/omp/dashboard-html.js.map +1 -1
- package/dist/omp/omb-sessions.d.ts +9 -0
- package/dist/omp/omb-sessions.d.ts.map +1 -1
- package/dist/omp/omb-sessions.js +16 -8
- package/dist/omp/omb-sessions.js.map +1 -1
- package/docs/compatibility/baseline.json +1 -1
- package/docs/releases/0.6.6.md +3 -2
- package/docs/releases/0.6.7.md +29 -0
- package/docs/releases/native-stable.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -101,7 +101,7 @@ The installer:
|
|
|
101
101
|
For a reproducible install, pin the version:
|
|
102
102
|
|
|
103
103
|
```sh
|
|
104
|
-
npx --yes @polderlabs/bizar-omp@0.6.
|
|
104
|
+
npx --yes @polderlabs/bizar-omp@0.6.7 setup
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
For a named OMP profile or a non-standard OMP binary:
|
|
@@ -386,7 +386,7 @@ The role names are selectors, not guarantees of speed, cost, provider, or model
|
|
|
386
386
|
|
|
387
387
|
### Qualification boundary
|
|
388
388
|
|
|
389
|
-
The 0.6.
|
|
389
|
+
The 0.6.7 release ships the `omb a` alias for the agents view, an interactive Ink progress panel for `omb update`, and a live Server-Sent Events chat stream with connection status in the dashboard, published on [npm](https://www.npmjs.com/package/@polderlabs/bizar-omp) and available as a [GitHub release](https://github.com/PolderLabsVOF/BizarHarness-OMP/releases/tag/v0.6.7).
|
|
390
390
|
|
|
391
391
|
The release does not claim OS sandboxing, provider model quality, universal native task or eval interception, automatic cleanup of an unqualified native isolation backend, or Claude Code/AO compatibility. See the [support matrix](docs/releases/support-matrix.md) for the current boundary.
|
|
392
392
|
|
|
@@ -397,7 +397,7 @@ The release does not claim OS sandboxing, provider model quality, universal nati
|
|
|
397
397
|
| OMP | 18.2.7, with 18.2.6, 18.2.5, and 18.2.4 regression-qualified |
|
|
398
398
|
| Node.js | 22.x and 24.x |
|
|
399
399
|
| Bun | 1.3.14 compatibility job |
|
|
400
|
-
| Package | `@polderlabs/bizar-omp@0.6.
|
|
400
|
+
| Package | `@polderlabs/bizar-omp@0.6.7` |
|
|
401
401
|
|
|
402
402
|
Upstream OMP changes require a new compatibility baseline and contract run. The package does not widen a version range to hide an unqualified runtime.
|
|
403
403
|
|
package/dist/cli/agents.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ interface HubRenderOptions {
|
|
|
6
6
|
maxVisible?: number;
|
|
7
7
|
notice?: string;
|
|
8
8
|
}
|
|
9
|
-
export declare const AGENTS_USAGE = "omb agents [--new]\n\n Keyboard-first session hub across every project: attach, start, rename, and\n stop Bizar-owned sessions, and edit settings (tray, stopped-session rows).\n \"omb hub\"
|
|
9
|
+
export declare const AGENTS_USAGE = "omb agents [--new]\n\n Keyboard-first session hub across every project: attach, start, rename, and\n stop Bizar-owned sessions, and edit settings (tray, stopped-session rows).\n \"omb hub\" and \"omb a\" are aliases.\n\n --new open the new-session picker immediately";
|
|
10
10
|
export declare function renderAgentsHub(sessions: OmbSessionInfo[], selected: number, options?: HubRenderOptions): string;
|
|
11
11
|
export declare function renderSettingsOverlay(settings: OmbSettings, selected: number): string;
|
|
12
12
|
/** Run the keyboard-first cross-project session manager. */
|
package/dist/cli/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/cli/agents.ts"],"names":[],"mappings":";AAaA,OAAO,EAAsD,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAA0C,KAAK,cAAc,EAAwB,MAAM,wBAAwB,CAAC;AAM3H,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/cli/agents.ts"],"names":[],"mappings":";AAaA,OAAO,EAAsD,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,EAA0C,KAAK,cAAc,EAAwB,MAAM,wBAAwB,CAAC;AAM3H,UAAU,gBAAgB;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,sRAM0B,CAAC;AA6CpD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,cAAc,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAoCR;AAiBD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAerF;AAqCD,4DAA4D;AAC5D,wBAAsB,YAAY,CAChC,GAAG,SAAgB,EACnB,KAAK,GAAE,MAAM,EAAO,EACpB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,MAAM,CAAC,CAgCjB"}
|
package/dist/cli/agents.js
CHANGED
|
@@ -13,7 +13,7 @@ export const AGENTS_USAGE = `omb agents [--new]
|
|
|
13
13
|
|
|
14
14
|
Keyboard-first session hub across every project: attach, start, rename, and
|
|
15
15
|
stop Bizar-owned sessions, and edit settings (tray, stopped-session rows).
|
|
16
|
-
"omb hub"
|
|
16
|
+
"omb hub" and "omb a" are aliases.
|
|
17
17
|
|
|
18
18
|
--new open the new-session picker immediately`;
|
|
19
19
|
const RESET = "\u001b[0m";
|
package/dist/cli/omb-commands.js
CHANGED
|
@@ -65,7 +65,7 @@ export function runHelpCommand(args) {
|
|
|
65
65
|
*/
|
|
66
66
|
export const OMB_COMMANDS = [
|
|
67
67
|
{
|
|
68
|
-
names: ["agents", "hub"],
|
|
68
|
+
names: ["agents", "hub", "a"],
|
|
69
69
|
summary: "Session hub: attach, start, rename, and stop sessions",
|
|
70
70
|
usage: AGENTS_USAGE,
|
|
71
71
|
run: (args, env) => runAgentsHub(process.cwd(), args, env),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omb-commands.js","sourceRoot":"","sources":["../../src/cli/omb-commands.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"omb-commands.js","sourceRoot":"","sources":["../../src/cli/omb-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/omb-update.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/** Whether the current stdout can host the interactive Ink view. */
|
|
2
|
+
export declare const isStdoutTty: () => boolean;
|
|
3
|
+
export declare const PACKAGE_NAME = "@polderlabs/bizar-omp";
|
|
1
4
|
export declare const UPDATE_USAGE = "omb update [--check] [--dry-run] [--json]\n\n Updates the globally installed omb command to the latest published Bizar\n package and refreshes the enabled OMP plugin when omp is available.\n\n --check report the installed and latest versions without changing anything\n --dry-run show the update plan without changing anything\n --json print the result as a machine-readable object";
|
|
2
5
|
export interface UpdateReport {
|
|
3
6
|
ok: boolean;
|
|
@@ -18,6 +21,8 @@ export interface UpdateServices {
|
|
|
18
21
|
installGlobal(spec: string): void;
|
|
19
22
|
refreshPlugin(spec: string, env: NodeJS.ProcessEnv): unknown;
|
|
20
23
|
}
|
|
24
|
+
export declare const validVersion: (version: string) => string;
|
|
25
|
+
export declare const compareVersions: (left: string, right: string) => number;
|
|
21
26
|
export declare const updateServices: UpdateServices;
|
|
22
27
|
export declare function runUpdateCommand(args: string[], env?: NodeJS.ProcessEnv, services?: UpdateServices): Promise<number>;
|
|
23
28
|
//# sourceMappingURL=omb-update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omb-update.d.ts","sourceRoot":"","sources":["../../src/cli/omb-update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"omb-update.d.ts","sourceRoot":"","sources":["../../src/cli/omb-update.ts"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,eAAO,MAAM,WAAW,QAAO,OAAwC,CAAC;AACxE,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAEpD,eAAO,MAAM,YAAY,kZAOmC,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,QAAQ,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,IAAI,MAAM,CAAC;IACzB,aAAa,IAAI,MAAM,CAAC;IACxB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC;CAC9D;AAQD,eAAO,MAAM,YAAY,YAAa,MAAM,KAAG,MAI9C,CAAC;AAEF,eAAO,MAAM,eAAe,SAAU,MAAM,SAAS,MAAM,KAAG,MAO7D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAS5B,CAAC;AA6BF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,cAA+B,GACxC,OAAO,CAAC,MAAM,CAAC,CA4EjB"}
|
package/dist/cli/omb-update.js
CHANGED
|
@@ -3,7 +3,10 @@ import { join } from "node:path";
|
|
|
3
3
|
import { manageInstallation, packageRoot } from "./install.js";
|
|
4
4
|
import { runNpm } from "./process.js";
|
|
5
5
|
import { findOnPath } from "../omp/tmux.js";
|
|
6
|
-
|
|
6
|
+
import { runInkUpdate } from "./update-ink.js";
|
|
7
|
+
/** Whether the current stdout can host the interactive Ink view. */
|
|
8
|
+
export const isStdoutTty = () => process.stdout.isTTY === true;
|
|
9
|
+
export const PACKAGE_NAME = "@polderlabs/bizar-omp";
|
|
7
10
|
export const UPDATE_USAGE = `omb update [--check] [--dry-run] [--json]
|
|
8
11
|
|
|
9
12
|
Updates the globally installed omb command to the latest published Bizar
|
|
@@ -18,13 +21,13 @@ const packageVersion = () => {
|
|
|
18
21
|
throw new Error("installed Bizar package has no version");
|
|
19
22
|
return manifest.version;
|
|
20
23
|
};
|
|
21
|
-
const validVersion = (version) => {
|
|
24
|
+
export const validVersion = (version) => {
|
|
22
25
|
const normalized = version.trim().replace(/^"|"$/g, "");
|
|
23
26
|
if (!/^\d+\.\d+\.\d+$/.test(normalized))
|
|
24
27
|
throw new Error(`npm returned an invalid Bizar version: ${normalized || "<empty>"}`);
|
|
25
28
|
return normalized;
|
|
26
29
|
};
|
|
27
|
-
const compareVersions = (left, right) => {
|
|
30
|
+
export const compareVersions = (left, right) => {
|
|
28
31
|
const a = left.split(".").map(Number);
|
|
29
32
|
const b = right.split(".").map(Number);
|
|
30
33
|
for (let index = 0; index < 3; index += 1) {
|
|
@@ -35,7 +38,7 @@ const compareVersions = (left, right) => {
|
|
|
35
38
|
};
|
|
36
39
|
export const updateServices = {
|
|
37
40
|
currentVersion: packageVersion,
|
|
38
|
-
latestVersion: () => validVersion(String(runNpm(["view",
|
|
41
|
+
latestVersion: () => validVersion(String(runNpm(["view", PACKAGE_NAME, "version"], { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }))),
|
|
39
42
|
installGlobal: spec => { runNpm(["install", "--global", spec], { stdio: "ignore" }); },
|
|
40
43
|
refreshPlugin: (spec, env) => {
|
|
41
44
|
const omp = findOnPath(env.BIZAR_OMP_BIN || "omp", env);
|
|
@@ -83,6 +86,12 @@ export async function runUpdateCommand(args, env = process.env, services = updat
|
|
|
83
86
|
process.stderr.write(`omb update: ${parsed.error}\n\n${UPDATE_USAGE}\n`);
|
|
84
87
|
return 2;
|
|
85
88
|
}
|
|
89
|
+
// Interactive Ink UI when stdout is a TTY and the caller did not request a
|
|
90
|
+
// machine-readable or dry-run report. Text/JSON paths stay identical to
|
|
91
|
+
// before for scripts, CI, and automation.
|
|
92
|
+
if (!parsed.json && !parsed.check && !parsed.dryRun && isStdoutTty()) {
|
|
93
|
+
return runInkUpdate(services, env);
|
|
94
|
+
}
|
|
86
95
|
let currentVersion;
|
|
87
96
|
let latestVersion;
|
|
88
97
|
try {
|
|
@@ -109,7 +118,7 @@ export async function runUpdateCommand(args, env = process.env, services = updat
|
|
|
109
118
|
emit(report, parsed.json);
|
|
110
119
|
return 0;
|
|
111
120
|
}
|
|
112
|
-
const spec = `${
|
|
121
|
+
const spec = `${PACKAGE_NAME}@${latestVersion}`;
|
|
113
122
|
try {
|
|
114
123
|
services.installGlobal(spec);
|
|
115
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"omb-update.js","sourceRoot":"","sources":["../../src/cli/omb-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"omb-update.js","sourceRoot":"","sources":["../../src/cli/omb-update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type UpdateReport, type UpdateServices } from "./omb-update.js";
|
|
2
|
+
export type UpdateStageState = "pending" | "running" | "ok" | "failed";
|
|
3
|
+
export declare const UPDATE_STAGE_KEYS: readonly ["checking", "installing", "refreshing"];
|
|
4
|
+
export type UpdateStageKey = typeof UPDATE_STAGE_KEYS[number];
|
|
5
|
+
export declare const UPDATE_STAGE_LABELS: Record<UpdateStageKey, string>;
|
|
6
|
+
export declare const UPDATE_STATE_MARKS: Record<UpdateStageState, string>;
|
|
7
|
+
export declare function updateStageColor(state: UpdateStageState): string;
|
|
8
|
+
export interface UpdateProgressState {
|
|
9
|
+
currentVersion: string;
|
|
10
|
+
latestVersion: string;
|
|
11
|
+
updateAvailable: boolean;
|
|
12
|
+
stages: Record<UpdateStageKey, UpdateStageState>;
|
|
13
|
+
}
|
|
14
|
+
export interface UpdateInkResult {
|
|
15
|
+
report: UpdateReport;
|
|
16
|
+
exitCode: number;
|
|
17
|
+
progress: UpdateProgressState;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The update pipeline behind the Ink view. Runs the same services as the text
|
|
21
|
+
* path and produces the identical UpdateReport, but reports an immutable
|
|
22
|
+
* progress snapshot after every transition so the Ink renderer can paint each
|
|
23
|
+
* stage. Free of rendering side effects: a test drives it directly.
|
|
24
|
+
*/
|
|
25
|
+
export declare function performUpdate(services: UpdateServices, env: NodeJS.ProcessEnv, onProgress?: (progress: UpdateProgressState) => void): Promise<UpdateInkResult>;
|
|
26
|
+
/** The one-line outcome under the stage list, mirroring emit()'s text. */
|
|
27
|
+
export declare function summarize(report: UpdateReport): {
|
|
28
|
+
text: string;
|
|
29
|
+
color: string;
|
|
30
|
+
};
|
|
31
|
+
interface UpdateUiProps {
|
|
32
|
+
progress: UpdateProgressState;
|
|
33
|
+
report?: UpdateReport;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The Ink progress panel: header, three labelled stages, outcome summary.
|
|
37
|
+
* Repainted by the caller on every stage transition. Ctrl+C exits through Ink's
|
|
38
|
+
* own handler and is re-bound here so the panel is never a keyboard trap.
|
|
39
|
+
*/
|
|
40
|
+
export declare function UpdateUi({ progress, report }: UpdateUiProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* Render the interactive update view and return its exit code. Ink repaints on
|
|
43
|
+
* every stage transition; the final frame carries the outcome summary.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runInkUpdate(services: UpdateServices, env: NodeJS.ProcessEnv, streams?: {
|
|
46
|
+
stdout?: NodeJS.WriteStream;
|
|
47
|
+
stderr?: NodeJS.WriteStream;
|
|
48
|
+
}): Promise<number>;
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=update-ink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-ink.d.ts","sourceRoot":"","sources":["../../src/cli/update-ink.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+C,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEvE,eAAO,MAAM,iBAAiB,YAAI,UAAU,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI9D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAK/D,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAWhE;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AASD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GACnD,OAAO,CAAC,eAAe,CAAC,CA4F1B;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/E;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,2CAqC3D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAA;CAAO,GACzE,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text, render, useApp, useInput } from "ink";
|
|
3
|
+
import { OMP_THEME } from "./omp-theme.js";
|
|
4
|
+
import { PACKAGE_NAME, compareVersions, validVersion } from "./omb-update.js";
|
|
5
|
+
export const UPDATE_STAGE_KEYS = ["checking", "installing", "refreshing"];
|
|
6
|
+
export const UPDATE_STAGE_LABELS = {
|
|
7
|
+
checking: "Checking npm registry",
|
|
8
|
+
installing: "Installing global package",
|
|
9
|
+
refreshing: "Refreshing OMP plugin",
|
|
10
|
+
};
|
|
11
|
+
export const UPDATE_STATE_MARKS = {
|
|
12
|
+
pending: "○",
|
|
13
|
+
running: "◐",
|
|
14
|
+
ok: "●",
|
|
15
|
+
failed: "✗",
|
|
16
|
+
};
|
|
17
|
+
export function updateStageColor(state) {
|
|
18
|
+
switch (state) {
|
|
19
|
+
case "pending":
|
|
20
|
+
return OMP_THEME.muted;
|
|
21
|
+
case "running":
|
|
22
|
+
return OMP_THEME.accent;
|
|
23
|
+
case "ok":
|
|
24
|
+
return OMP_THEME.success;
|
|
25
|
+
case "failed":
|
|
26
|
+
return OMP_THEME.error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const initialProgress = () => ({
|
|
30
|
+
currentVersion: "checking…",
|
|
31
|
+
latestVersion: "checking…",
|
|
32
|
+
updateAvailable: false,
|
|
33
|
+
stages: { checking: "pending", installing: "pending", refreshing: "pending" },
|
|
34
|
+
});
|
|
35
|
+
/**
|
|
36
|
+
* The update pipeline behind the Ink view. Runs the same services as the text
|
|
37
|
+
* path and produces the identical UpdateReport, but reports an immutable
|
|
38
|
+
* progress snapshot after every transition so the Ink renderer can paint each
|
|
39
|
+
* stage. Free of rendering side effects: a test drives it directly.
|
|
40
|
+
*/
|
|
41
|
+
export async function performUpdate(services, env, onProgress) {
|
|
42
|
+
const progress = initialProgress();
|
|
43
|
+
const snapshot = () => ({ ...progress, stages: { ...progress.stages } });
|
|
44
|
+
const notify = () => onProgress?.(snapshot());
|
|
45
|
+
const setStage = (stage, state) => {
|
|
46
|
+
progress.stages[stage] = state;
|
|
47
|
+
notify();
|
|
48
|
+
};
|
|
49
|
+
setStage("checking", "running");
|
|
50
|
+
let currentVersion;
|
|
51
|
+
let latestVersion;
|
|
52
|
+
try {
|
|
53
|
+
currentVersion = validVersion(services.currentVersion());
|
|
54
|
+
latestVersion = validVersion(services.latestVersion());
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
setStage("checking", "failed");
|
|
58
|
+
return {
|
|
59
|
+
exitCode: 1,
|
|
60
|
+
progress: snapshot(),
|
|
61
|
+
report: {
|
|
62
|
+
ok: false, command: "update", currentVersion: "unknown", latestVersion: "unknown",
|
|
63
|
+
updateAvailable: false, dryRun: false, checked: false, global: "failed", plugin: "skipped",
|
|
64
|
+
pluginReason: "version lookup failed", error: error instanceof Error ? error.message : String(error),
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
progress.currentVersion = currentVersion;
|
|
69
|
+
progress.latestVersion = latestVersion;
|
|
70
|
+
progress.updateAvailable = compareVersions(latestVersion, currentVersion) > 0;
|
|
71
|
+
setStage("checking", "ok");
|
|
72
|
+
if (!progress.updateAvailable) {
|
|
73
|
+
setStage("installing", "ok");
|
|
74
|
+
setStage("refreshing", "ok");
|
|
75
|
+
return {
|
|
76
|
+
exitCode: 0,
|
|
77
|
+
progress: snapshot(),
|
|
78
|
+
report: {
|
|
79
|
+
ok: true, command: "update", currentVersion, latestVersion, updateAvailable: false,
|
|
80
|
+
dryRun: false, checked: false, global: "current", plugin: "skipped",
|
|
81
|
+
pluginReason: "no update required",
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const spec = `${PACKAGE_NAME}@${latestVersion}`;
|
|
86
|
+
setStage("installing", "running");
|
|
87
|
+
try {
|
|
88
|
+
services.installGlobal(spec);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
setStage("installing", "failed");
|
|
92
|
+
return {
|
|
93
|
+
exitCode: 1,
|
|
94
|
+
progress: snapshot(),
|
|
95
|
+
report: {
|
|
96
|
+
ok: false, command: "update", currentVersion, latestVersion, updateAvailable: true,
|
|
97
|
+
dryRun: false, checked: false, global: "failed", plugin: "skipped",
|
|
98
|
+
pluginReason: "global package was not updated",
|
|
99
|
+
error: error instanceof Error ? error.message : String(error),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
setStage("installing", "ok");
|
|
104
|
+
setStage("refreshing", "running");
|
|
105
|
+
try {
|
|
106
|
+
const pluginSkipped = services.refreshPlugin(spec, env) === undefined;
|
|
107
|
+
setStage("refreshing", "ok");
|
|
108
|
+
return {
|
|
109
|
+
exitCode: 0,
|
|
110
|
+
progress: snapshot(),
|
|
111
|
+
report: {
|
|
112
|
+
ok: true, command: "update", currentVersion, latestVersion, updateAvailable: true,
|
|
113
|
+
dryRun: false, checked: false, global: "updated", plugin: pluginSkipped ? "skipped" : "updated",
|
|
114
|
+
...(pluginSkipped ? { pluginReason: "omp executable not found" } : {}),
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
setStage("refreshing", "failed");
|
|
120
|
+
return {
|
|
121
|
+
exitCode: 1,
|
|
122
|
+
progress: snapshot(),
|
|
123
|
+
report: {
|
|
124
|
+
ok: false, command: "update", currentVersion, latestVersion, updateAvailable: true,
|
|
125
|
+
dryRun: false, checked: false, global: "updated", plugin: "failed",
|
|
126
|
+
error: `global package updated, but OMP plugin refresh failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** The one-line outcome under the stage list, mirroring emit()'s text. */
|
|
132
|
+
export function summarize(report) {
|
|
133
|
+
if (!report.ok)
|
|
134
|
+
return { text: report.error ?? "update failed", color: OMP_THEME.error };
|
|
135
|
+
if (report.global === "current")
|
|
136
|
+
return { text: `Already current at ${report.currentVersion}`, color: OMP_THEME.success };
|
|
137
|
+
const plugin = report.plugin === "updated" ? " · OMP plugin refreshed" : report.plugin === "skipped" ? ` · OMP plugin skipped${report.pluginReason ? ` (${report.pluginReason})` : ""}` : "";
|
|
138
|
+
return { text: `Updated ${report.currentVersion} → ${report.latestVersion}${plugin}`, color: OMP_THEME.success };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* The Ink progress panel: header, three labelled stages, outcome summary.
|
|
142
|
+
* Repainted by the caller on every stage transition. Ctrl+C exits through Ink's
|
|
143
|
+
* own handler and is re-bound here so the panel is never a keyboard trap.
|
|
144
|
+
*/
|
|
145
|
+
export function UpdateUi({ progress, report }) {
|
|
146
|
+
const { exit } = useApp();
|
|
147
|
+
useInput((input, key) => {
|
|
148
|
+
if (key.ctrl && input === "c")
|
|
149
|
+
exit();
|
|
150
|
+
});
|
|
151
|
+
const summary = report ? summarize(report) : undefined;
|
|
152
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { bold: true, color: OMP_THEME.accent, children: "Bizar OMP updater" }), _jsxs(Box, { gap: 1, marginTop: 1, children: [_jsx(Text, { color: OMP_THEME.text, children: progress.currentVersion }), _jsx(Text, { color: OMP_THEME.muted, children: "\u2192" }), _jsx(Text, { color: OMP_THEME.text, children: progress.latestVersion }), progress.updateAvailable && (_jsx(Text, { backgroundColor: OMP_THEME.accentSoft, color: OMP_THEME.surface, children: " update available " }))] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: UPDATE_STAGE_KEYS.map(stage => {
|
|
153
|
+
const state = progress.stages[stage];
|
|
154
|
+
const color = updateStageColor(state);
|
|
155
|
+
return (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: color, children: UPDATE_STATE_MARKS[state] }), _jsx(Text, { color: color, children: UPDATE_STAGE_LABELS[stage] })] }, stage));
|
|
156
|
+
}) }), summary && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: summary.color, children: summary.text }) }))] }));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Render the interactive update view and return its exit code. Ink repaints on
|
|
160
|
+
* every stage transition; the final frame carries the outcome summary.
|
|
161
|
+
*/
|
|
162
|
+
export async function runInkUpdate(services, env, streams = {}) {
|
|
163
|
+
let progress = initialProgress();
|
|
164
|
+
let report;
|
|
165
|
+
const renderOptions = {};
|
|
166
|
+
if (streams.stdout)
|
|
167
|
+
renderOptions.stdout = streams.stdout;
|
|
168
|
+
if (streams.stderr)
|
|
169
|
+
renderOptions.stderr = streams.stderr;
|
|
170
|
+
const app = render(_jsx(UpdateUi, { progress: progress, report: report }), renderOptions);
|
|
171
|
+
try {
|
|
172
|
+
const result = await performUpdate(services, env, next => {
|
|
173
|
+
progress = next;
|
|
174
|
+
app.rerender(_jsx(UpdateUi, { progress: progress, report: report }));
|
|
175
|
+
});
|
|
176
|
+
report = result.report;
|
|
177
|
+
progress = result.progress;
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
app.rerender(_jsx(UpdateUi, { progress: progress, report: report }));
|
|
181
|
+
app.unmount();
|
|
182
|
+
}
|
|
183
|
+
return report?.ok ? 0 : 1;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=update-ink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-ink.js","sourceRoot":"","sources":["../../src/cli/update-ink.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-service.d.ts","sourceRoot":"","sources":["../../src/omp/daemon-service.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAGD,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAClD,eAAO,MAAM,yBAAyB,QAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon-service.d.ts","sourceRoot":"","sources":["../../src/omp/daemon-service.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAGD,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAClD,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAuShD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CA4jBpF"}
|
|
@@ -4,7 +4,7 @@ import { deferred } from "./daemon.js";
|
|
|
4
4
|
import { randomBytes } from "node:crypto";
|
|
5
5
|
import { mkdirSync, statSync } from "node:fs";
|
|
6
6
|
import { resolve } from "node:path";
|
|
7
|
-
import { listOmbSessions, ombSessionDisplayName, readOmbSessionMessages } from "./omb-sessions.js";
|
|
7
|
+
import { listOmbSessions, ombSessionDisplayName, ombSessionJournalPath, readOmbSessionMessages } from "./omb-sessions.js";
|
|
8
8
|
import { ombSessionName } from "./tmux.js";
|
|
9
9
|
import { DAEMON_PROTOCOL_VERSION, DaemonError, daemonStateDir, writeSnapshot } from "./daemon.js";
|
|
10
10
|
import { captureOmbSessionConsole, createOmbSession, deleteOmbSession, forgetOmbSession, openOmbSessionInTerminal, renameOmbSession, sendOmbSessionInput, setOmbSessionMouse, } from "./tmux.js";
|
|
@@ -64,6 +64,88 @@ async function runDashboardOmp(env, args) {
|
|
|
64
64
|
throw new Error("OMP command failed");
|
|
65
65
|
return output;
|
|
66
66
|
}
|
|
67
|
+
const STREAM_POLL_MS = 1_000;
|
|
68
|
+
const STREAM_KEEPALIVE_MS = 15_000;
|
|
69
|
+
// Per-stream cleanup callbacks. service.close() iterates this to clear
|
|
70
|
+
// poll/keepalive timers immediately, so a streaming client cannot keep the
|
|
71
|
+
// daemon alive past shutdown.
|
|
72
|
+
const STREAM_CLEANUPS = new Map();
|
|
73
|
+
async function streamSessionMessages(res, session, env, log) {
|
|
74
|
+
let active = true;
|
|
75
|
+
let lastStamp = "";
|
|
76
|
+
let lastSnapshot = "";
|
|
77
|
+
let journalPath;
|
|
78
|
+
try {
|
|
79
|
+
journalPath = await ombSessionJournalPath(session, env) ?? undefined;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
journalPath = undefined;
|
|
83
|
+
}
|
|
84
|
+
res.writeHead(200, {
|
|
85
|
+
"content-type": "text/event-stream",
|
|
86
|
+
"cache-control": "no-cache, no-transform",
|
|
87
|
+
"x-bizar-daemon-stream": "messages",
|
|
88
|
+
"x-accel-buffering": "no",
|
|
89
|
+
});
|
|
90
|
+
const pollTimer = setInterval(async () => {
|
|
91
|
+
if (!active)
|
|
92
|
+
return;
|
|
93
|
+
let next;
|
|
94
|
+
try {
|
|
95
|
+
if (!journalPath) {
|
|
96
|
+
journalPath = await ombSessionJournalPath(session, env) ?? undefined;
|
|
97
|
+
}
|
|
98
|
+
if (journalPath) {
|
|
99
|
+
try {
|
|
100
|
+
next = JSON.stringify({ mtimeMs: statSync(journalPath).mtimeMs, size: statSync(journalPath).size });
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
journalPath = undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (next && next !== lastStamp) {
|
|
107
|
+
lastStamp = next;
|
|
108
|
+
const messages = journalPath ? await readOmbSessionMessages(session, env) : [];
|
|
109
|
+
const snapshot = JSON.stringify({ kind: "snapshot", capturedAt: Date.now(), messages });
|
|
110
|
+
if (snapshot !== lastSnapshot) {
|
|
111
|
+
lastSnapshot = snapshot;
|
|
112
|
+
send("snapshot", { capturedAt: Date.now(), messages });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (!next) {
|
|
116
|
+
send("idle", { capturedAt: Date.now() });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
log(`stream error for ${session.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
121
|
+
send("error", { capturedAt: Date.now(), error: error instanceof Error ? error.message : String(error) });
|
|
122
|
+
}
|
|
123
|
+
}, STREAM_POLL_MS);
|
|
124
|
+
const keepaliveTimer = setInterval(() => {
|
|
125
|
+
if (!active)
|
|
126
|
+
return;
|
|
127
|
+
res.write(`: keepalive ${Date.now()}\n\n`);
|
|
128
|
+
}, STREAM_KEEPALIVE_MS);
|
|
129
|
+
pollTimer.unref?.();
|
|
130
|
+
keepaliveTimer.unref?.();
|
|
131
|
+
const send = (event, payload) => {
|
|
132
|
+
if (!active)
|
|
133
|
+
return;
|
|
134
|
+
res.write(`event: ${event}\ndata: ${JSON.stringify(payload)}\n\n`);
|
|
135
|
+
};
|
|
136
|
+
const cleanup = () => {
|
|
137
|
+
if (!active)
|
|
138
|
+
return;
|
|
139
|
+
active = false;
|
|
140
|
+
STREAM_CLEANUPS.delete(res);
|
|
141
|
+
clearInterval(pollTimer);
|
|
142
|
+
clearInterval(keepaliveTimer);
|
|
143
|
+
res.end();
|
|
144
|
+
};
|
|
145
|
+
STREAM_CLEANUPS.set(res, cleanup);
|
|
146
|
+
res.on("close", cleanup);
|
|
147
|
+
res.on("error", cleanup);
|
|
148
|
+
}
|
|
67
149
|
function configEntries(value) {
|
|
68
150
|
const raw = Array.isArray(value) ? value : value && typeof value === "object"
|
|
69
151
|
? (Array.isArray(value.settings)
|
|
@@ -368,6 +450,11 @@ export function startDaemonService(options = {}) {
|
|
|
368
450
|
res.end('{"ok":true}\n');
|
|
369
451
|
return;
|
|
370
452
|
}
|
|
453
|
+
if (path === "/capabilities" && (req.method === "GET" || req.method === "HEAD")) {
|
|
454
|
+
res.writeHead(200, { "content-type": "application/json", "x-bizar-daemon-protocol": String(DAEMON_PROTOCOL_VERSION) });
|
|
455
|
+
res.end(`${JSON.stringify({ protocolVersion: DAEMON_PROTOCOL_VERSION, capabilities: ["ping", "overview", "messages", "messages-stream", "omp-collab", "settings-watch", "snapshots", "providers", "auth-status"] })}\n`);
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
371
458
|
if (!authorized(req)) {
|
|
372
459
|
res.writeHead(401, { "content-type": "application/json" });
|
|
373
460
|
res.end('{"error":"unauthorized"}\n');
|
|
@@ -675,6 +762,7 @@ export function startDaemonService(options = {}) {
|
|
|
675
762
|
}
|
|
676
763
|
const consoleMatch = path.match(/^\/sessions\/([^/]+)\/console$/);
|
|
677
764
|
const messagesMatch = path.match(/^\/sessions\/([^/]+)\/messages$/);
|
|
765
|
+
const streamMatch = path.match(/^\/sessions\/([^/]+)\/messages\/stream$/);
|
|
678
766
|
if (messagesMatch && req.method === "GET") {
|
|
679
767
|
const name = decodeURIComponent(messagesMatch[1]);
|
|
680
768
|
const current = sessions.find(candidate => candidate.name === name);
|
|
@@ -690,6 +778,16 @@ export function startDaemonService(options = {}) {
|
|
|
690
778
|
}
|
|
691
779
|
return;
|
|
692
780
|
}
|
|
781
|
+
if (streamMatch && req.method === "GET") {
|
|
782
|
+
const name = decodeURIComponent(streamMatch[1]);
|
|
783
|
+
const current = sessions.find(candidate => candidate.name === name);
|
|
784
|
+
if (!current) {
|
|
785
|
+
json(res, 404, { error: "unknown session" });
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
streamSessionMessages(res, current, env, log);
|
|
789
|
+
return;
|
|
790
|
+
}
|
|
693
791
|
if (consoleMatch && req.method === "GET") {
|
|
694
792
|
const name = decodeURIComponent(consoleMatch[1]);
|
|
695
793
|
const current = sessions.find(candidate => candidate.name === name);
|
|
@@ -802,7 +900,23 @@ export function startDaemonService(options = {}) {
|
|
|
802
900
|
close: async () => {
|
|
803
901
|
if (scanTimer)
|
|
804
902
|
clearInterval(scanTimer);
|
|
805
|
-
|
|
903
|
+
// Run every SSE cleanup so poll/keepalive timers drop the response
|
|
904
|
+
// reference immediately — otherwise the timers themselves keep the
|
|
905
|
+
// socket (and therefore server.close()) alive past shutdown.
|
|
906
|
+
for (const cleanup of [...STREAM_CLEANUPS.values()]) {
|
|
907
|
+
try {
|
|
908
|
+
cleanup();
|
|
909
|
+
}
|
|
910
|
+
catch { /* already gone */ }
|
|
911
|
+
}
|
|
912
|
+
STREAM_CLEANUPS.clear();
|
|
913
|
+
await new Promise(resolve => {
|
|
914
|
+
server.close(() => resolve());
|
|
915
|
+
// server.close() alone would wait on HTTP/1.1 keep-alive and undici's
|
|
916
|
+
// pooled fetch connections. closeAllConnections() tears them down at
|
|
917
|
+
// once so a streaming client cannot hold shutdown open.
|
|
918
|
+
server.closeAllConnections?.();
|
|
919
|
+
});
|
|
806
920
|
},
|
|
807
921
|
};
|
|
808
922
|
server.listen(options.port ?? 0, "127.0.0.1", () => {
|