@repo-prism/dispatch-hub 1.1.11
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 +18 -0
- package/dist/auth.d.ts +5 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +37 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +14 -0
- package/dist/bin.js.map +1 -0
- package/dist/dashboard/app.css +1 -0
- package/dist/dashboard/app.js +237 -0
- package/dist/dashboard/app.js.map +18 -0
- package/dist/dashboard/hub.css +707 -0
- package/dist/dashboard/index.html +13 -0
- package/dist/ensure.d.ts +27 -0
- package/dist/ensure.d.ts.map +1 -0
- package/dist/ensure.js +117 -0
- package/dist/ensure.js.map +1 -0
- package/dist/hub-record.d.ts +8 -0
- package/dist/hub-record.d.ts.map +1 -0
- package/dist/hub-record.js +25 -0
- package/dist/hub-record.js.map +1 -0
- package/dist/idle.d.ts +16 -0
- package/dist/idle.d.ts.map +1 -0
- package/dist/idle.js +33 -0
- package/dist/idle.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/json-file.d.ts +3 -0
- package/dist/json-file.d.ts.map +1 -0
- package/dist/json-file.js +19 -0
- package/dist/json-file.js.map +1 -0
- package/dist/notice.d.ts +11 -0
- package/dist/notice.d.ts.map +1 -0
- package/dist/notice.js +36 -0
- package/dist/notice.js.map +1 -0
- package/dist/notify.d.ts +7 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +59 -0
- package/dist/notify.js.map +1 -0
- package/dist/paths.d.ts +17 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +38 -0
- package/dist/paths.js.map +1 -0
- package/dist/registry.d.ts +8 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +42 -0
- package/dist/registry.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +264 -0
- package/dist/server.js.map +1 -0
- package/dist/snapshot.d.ts +7 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +43 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/watch.d.ts +22 -0
- package/dist/watch.d.ts.map +1 -0
- package/dist/watch.js +164 -0
- package/dist/watch.js.map +1 -0
- package/package.json +45 -0
package/dist/ensure.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { hubPort, type HubEnv } from "./paths.js";
|
|
2
|
+
export type HubHandle = {
|
|
3
|
+
readonly enabled: boolean;
|
|
4
|
+
readonly detail: string;
|
|
5
|
+
readonly port?: number;
|
|
6
|
+
readonly token?: string;
|
|
7
|
+
/** Public URL, no token — safe to speak in chat. */
|
|
8
|
+
readonly url?: string;
|
|
9
|
+
/** Tokenised URL for the dashboard / MCP App / extension. */
|
|
10
|
+
readonly dashboardUrl?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function resolveHubBin(): string;
|
|
13
|
+
export type EnsureHubInput = {
|
|
14
|
+
readonly workspaceRoot: string;
|
|
15
|
+
readonly env?: HubEnv;
|
|
16
|
+
readonly fetchImpl?: typeof fetch;
|
|
17
|
+
readonly spawnBin?: string;
|
|
18
|
+
readonly spawnHub?: () => void;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Make sure a hub is listening, then register this workspace.
|
|
22
|
+
* No-ops when `PRISM_HUB=0` or under vitest (unless `PRISM_HUB=1`).
|
|
23
|
+
*/
|
|
24
|
+
export declare function ensureHub(input: EnsureHubInput): Promise<HubHandle>;
|
|
25
|
+
export declare function peekHub(env?: HubEnv, fetchImpl?: typeof fetch): Promise<HubHandle>;
|
|
26
|
+
export { hubPort };
|
|
27
|
+
//# sourceMappingURL=ensure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.d.ts","sourceRoot":"","sources":["../src/ensure.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAI5E,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAKF,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AA2CD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CA8CzE;AAED,wBAAsB,OAAO,CAC3B,GAAG,GAAE,MAAoB,EACzB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,SAAS,CAAC,CAYpB;AAkBD,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/ensure.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { dashboardUrl, hubEnabled, hubPort } from "./paths.js";
|
|
5
|
+
import { isHubRecordLive, readHubRecord } from "./hub-record.js";
|
|
6
|
+
const WAIT_MS = 3_000;
|
|
7
|
+
const STEP_MS = 100;
|
|
8
|
+
export function resolveHubBin() {
|
|
9
|
+
return join(dirname(fileURLToPath(import.meta.url)), "bin.js");
|
|
10
|
+
}
|
|
11
|
+
async function healthz(port, fetchImpl) {
|
|
12
|
+
try {
|
|
13
|
+
const response = await fetchImpl(`http://127.0.0.1:${port}/api/healthz`, {
|
|
14
|
+
signal: AbortSignal.timeout(500),
|
|
15
|
+
});
|
|
16
|
+
return response.ok;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function register(record, workspaceRoot, fetchImpl) {
|
|
23
|
+
await fetchImpl(`http://127.0.0.1:${record.port}/api/workspaces`, {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${record.token}`,
|
|
27
|
+
"Content-Type": "application/json",
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ path: workspaceRoot }),
|
|
30
|
+
signal: AbortSignal.timeout(2_000),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function handleFrom(record, detail) {
|
|
34
|
+
return {
|
|
35
|
+
enabled: true,
|
|
36
|
+
detail,
|
|
37
|
+
port: record.port,
|
|
38
|
+
token: record.token,
|
|
39
|
+
url: dashboardUrl(record.port),
|
|
40
|
+
dashboardUrl: dashboardUrl(record.port, record.token),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Make sure a hub is listening, then register this workspace.
|
|
45
|
+
* No-ops when `PRISM_HUB=0` or under vitest (unless `PRISM_HUB=1`).
|
|
46
|
+
*/
|
|
47
|
+
export async function ensureHub(input) {
|
|
48
|
+
const env = input.env ?? process.env;
|
|
49
|
+
if (!hubEnabled(env)) {
|
|
50
|
+
return { enabled: false, detail: "Jobs board is off." };
|
|
51
|
+
}
|
|
52
|
+
const fetchImpl = input.fetchImpl ?? fetch;
|
|
53
|
+
const existing = await readHubRecord(env);
|
|
54
|
+
if (existing && (await healthz(existing.port, fetchImpl))) {
|
|
55
|
+
try {
|
|
56
|
+
await register(existing, input.workspaceRoot, fetchImpl);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
/* registration is best-effort */
|
|
60
|
+
}
|
|
61
|
+
return handleFrom(existing, "Jobs board is up.");
|
|
62
|
+
}
|
|
63
|
+
if (existing &&
|
|
64
|
+
isHubRecordLive(existing) &&
|
|
65
|
+
!(await healthz(existing.port, fetchImpl))) {
|
|
66
|
+
return {
|
|
67
|
+
enabled: false,
|
|
68
|
+
detail: "Jobs board is running but not answering.",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
(input.spawnHub ??
|
|
72
|
+
(() => spawnDetached(input.spawnBin ?? resolveHubBin(), env)))();
|
|
73
|
+
const deadline = Date.now() + WAIT_MS;
|
|
74
|
+
while (Date.now() < deadline) {
|
|
75
|
+
await sleep(STEP_MS);
|
|
76
|
+
const record = await readHubRecord(env);
|
|
77
|
+
if (record && (await healthz(record.port, fetchImpl))) {
|
|
78
|
+
try {
|
|
79
|
+
await register(record, input.workspaceRoot, fetchImpl);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
/* ignore */
|
|
83
|
+
}
|
|
84
|
+
return handleFrom(record, "Jobs board is up.");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { enabled: false, detail: "Jobs board did not start." };
|
|
88
|
+
}
|
|
89
|
+
export async function peekHub(env = process.env, fetchImpl = fetch) {
|
|
90
|
+
if (!hubEnabled(env)) {
|
|
91
|
+
return { enabled: false, detail: "Jobs board is off." };
|
|
92
|
+
}
|
|
93
|
+
const record = await readHubRecord(env);
|
|
94
|
+
if (!record) {
|
|
95
|
+
return { enabled: false, detail: "Jobs board is not running." };
|
|
96
|
+
}
|
|
97
|
+
if (!(await healthz(record.port, fetchImpl))) {
|
|
98
|
+
return { enabled: false, detail: "Jobs board is not running." };
|
|
99
|
+
}
|
|
100
|
+
return handleFrom(record, "Jobs board is up.");
|
|
101
|
+
}
|
|
102
|
+
function spawnDetached(bin, env) {
|
|
103
|
+
const child = spawn(process.execPath, [bin], {
|
|
104
|
+
detached: true,
|
|
105
|
+
stdio: "ignore",
|
|
106
|
+
env: { ...process.env, ...env },
|
|
107
|
+
windowsHide: true,
|
|
108
|
+
});
|
|
109
|
+
child.unref();
|
|
110
|
+
}
|
|
111
|
+
function sleep(ms) {
|
|
112
|
+
return new Promise((resolve) => {
|
|
113
|
+
setTimeout(resolve, ms).unref?.();
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export { hubPort };
|
|
117
|
+
//# sourceMappingURL=ensure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure.js","sourceRoot":"","sources":["../src/ensure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type HubEnv } from "./paths.js";
|
|
2
|
+
import type { HubRecord } from "./types.js";
|
|
3
|
+
export declare function newHubToken(): string;
|
|
4
|
+
export declare function readHubRecord(env?: HubEnv): Promise<HubRecord | undefined>;
|
|
5
|
+
export declare function writeHubRecord(record: HubRecord, env?: HubEnv): Promise<void>;
|
|
6
|
+
export declare function isHubRecordLive(record: HubRecord | undefined): boolean;
|
|
7
|
+
export declare function packageVersion(): string;
|
|
8
|
+
//# sourceMappingURL=hub-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-record.d.ts","sourceRoot":"","sources":["../src/hub-record.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,MAAM,EAAW,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAsB,aAAa,CACjC,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAShC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { isProcessAlive } from "@repo-prism/dispatch";
|
|
3
|
+
import { readJsonFile, writeJsonFile } from "./json-file.js";
|
|
4
|
+
import { hubRecordPath, hubHome } from "./paths.js";
|
|
5
|
+
const RECORD_MODE = 0o600;
|
|
6
|
+
export function newHubToken() {
|
|
7
|
+
return randomBytes(24).toString("base64url");
|
|
8
|
+
}
|
|
9
|
+
export async function readHubRecord(env = process.env) {
|
|
10
|
+
const raw = await readJsonFile(hubRecordPath(hubHome(env)), null);
|
|
11
|
+
if (!raw || typeof raw.token !== "string" || typeof raw.port !== "number") {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return raw;
|
|
15
|
+
}
|
|
16
|
+
export async function writeHubRecord(record, env = process.env) {
|
|
17
|
+
await writeJsonFile(hubRecordPath(hubHome(env)), record, RECORD_MODE);
|
|
18
|
+
}
|
|
19
|
+
export function isHubRecordLive(record) {
|
|
20
|
+
return Boolean(record && isProcessAlive(record.pid));
|
|
21
|
+
}
|
|
22
|
+
export function packageVersion() {
|
|
23
|
+
return "1.1.11";
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hub-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-record.js","sourceRoot":"","sources":["../src/hub-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,YAAY,CAAC;AAGjE,MAAM,WAAW,GAAG,KAAK,CAAC;AAE1B,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,OAAO,CAAC,GAAG;IAEzB,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAC3B,IAAI,CACL,CAAC;IACF,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAiB,EACjB,MAAc,OAAO,CAAC,GAAG;IAEzB,MAAM,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,OAAO,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/idle.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const IDLE_MS: number;
|
|
2
|
+
export type IdleClock = {
|
|
3
|
+
now: () => number;
|
|
4
|
+
setTimeout: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
|
|
5
|
+
clearTimeout: (id: ReturnType<typeof setTimeout>) => void;
|
|
6
|
+
};
|
|
7
|
+
export declare function createIdleTimer(options: {
|
|
8
|
+
readonly idleMs?: number;
|
|
9
|
+
readonly clock?: IdleClock;
|
|
10
|
+
readonly shouldExit: () => boolean;
|
|
11
|
+
readonly onIdle: () => void;
|
|
12
|
+
}): {
|
|
13
|
+
touch: () => void;
|
|
14
|
+
stop: () => void;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=idle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../src/idle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,QAAiB,CAAC;AAEtC,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAC1E,YAAY,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,CAAC;CAC3D,CAAC;AAQF,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC7B,GAAG;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAuB1C"}
|
package/dist/idle.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const IDLE_MS = 15 * 60 * 1000;
|
|
2
|
+
const systemClock = {
|
|
3
|
+
now: () => Date.now(),
|
|
4
|
+
setTimeout,
|
|
5
|
+
clearTimeout,
|
|
6
|
+
};
|
|
7
|
+
export function createIdleTimer(options) {
|
|
8
|
+
const idleMs = options.idleMs ?? IDLE_MS;
|
|
9
|
+
const clock = options.clock ?? systemClock;
|
|
10
|
+
let handle;
|
|
11
|
+
const arm = () => {
|
|
12
|
+
if (handle)
|
|
13
|
+
clock.clearTimeout(handle);
|
|
14
|
+
handle = clock.setTimeout(() => {
|
|
15
|
+
if (options.shouldExit())
|
|
16
|
+
options.onIdle();
|
|
17
|
+
else
|
|
18
|
+
arm();
|
|
19
|
+
}, idleMs);
|
|
20
|
+
if (typeof handle === "object" && "unref" in handle) {
|
|
21
|
+
handle.unref();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
arm();
|
|
25
|
+
return {
|
|
26
|
+
touch: arm,
|
|
27
|
+
stop: () => {
|
|
28
|
+
if (handle)
|
|
29
|
+
clock.clearTimeout(handle);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=idle.js.map
|
package/dist/idle.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.js","sourceRoot":"","sources":["../src/idle.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAQtC,MAAM,WAAW,GAAc;IAC7B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,UAAU;IACV,YAAY;CACb,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,OAK/B;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC3C,IAAI,MAAiD,CAAC;IAEtD,MAAM,GAAG,GAAG,GAAS,EAAE;QACrB,IAAI,MAAM;YAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;YAC7B,IAAI,OAAO,CAAC,UAAU,EAAE;gBAAE,OAAO,CAAC,MAAM,EAAE,CAAC;;gBACtC,GAAG,EAAE,CAAC;QACb,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACpD,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,GAAG,EAAE,CAAC;IACN,OAAO;QACL,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,MAAM;gBAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME: "@repo-prism/dispatch-hub";
|
|
2
|
+
export { HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
3
|
+
export { ensureHub, peekHub, resolveHubBin, type HubHandle } from "./ensure.js";
|
|
4
|
+
export { startHub, type HubOptions, type StartedHub } from "./server.js";
|
|
5
|
+
export { formatJobFinishedNotice, type JobNoticeCopy } from "./notice.js";
|
|
6
|
+
export { originAllowed, tokenFromRequest, tokensMatch } from "./auth.js";
|
|
7
|
+
export { diffJobs, collectJobs, isInFlight, isTerminal } from "./watch.js";
|
|
8
|
+
export { toSnapshot } from "./snapshot.js";
|
|
9
|
+
export { registerWorkspace, workspaceLabel, loadRegistry } from "./registry.js";
|
|
10
|
+
export { readHubRecord, newHubToken } from "./hub-record.js";
|
|
11
|
+
export type { HubEvent, HubRecord, JobSnapshot, WorkspaceEntry, } from "./types.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const PACKAGE_NAME = "@repo-prism/dispatch-hub";
|
|
2
|
+
export { HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
3
|
+
export { ensureHub, peekHub, resolveHubBin } from "./ensure.js";
|
|
4
|
+
export { startHub } from "./server.js";
|
|
5
|
+
export { formatJobFinishedNotice } from "./notice.js";
|
|
6
|
+
export { originAllowed, tokenFromRequest, tokensMatch } from "./auth.js";
|
|
7
|
+
export { diffJobs, collectJobs, isInFlight, isTerminal } from "./watch.js";
|
|
8
|
+
export { toSnapshot } from "./snapshot.js";
|
|
9
|
+
export { registerWorkspace, workspaceLabel, loadRegistry } from "./registry.js";
|
|
10
|
+
export { readHubRecord, newHubToken } from "./hub-record.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;AAEhE,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,OAAO,EACP,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAkB,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAoC,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAsB,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file.d.ts","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAO3E;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
export async function readJsonFile(path, fallback) {
|
|
4
|
+
try {
|
|
5
|
+
const raw = JSON.parse(await readFile(path, "utf8"));
|
|
6
|
+
return raw ?? fallback;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return fallback;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function writeJsonFile(path, value, mode) {
|
|
13
|
+
await mkdir(dirname(path), { recursive: true });
|
|
14
|
+
await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
15
|
+
if (mode !== undefined) {
|
|
16
|
+
await chmod(path, mode);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=json-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file.js","sourceRoot":"","sources":["../src/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAY,EAAE,QAAW;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;QAChE,OAAQ,GAAS,IAAI,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,KAAc,EACd,IAAa;IAEb,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
package/dist/notice.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { JobSnapshot } from "./types.js";
|
|
2
|
+
export type JobNoticeCopy = {
|
|
3
|
+
readonly title: string;
|
|
4
|
+
readonly body: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Chat-safe toast copy (ADR-0039). Title is the job title; body is the
|
|
8
|
+
* result or error. Never a worktree path, never a job-<hex> id.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatJobFinishedNotice(job: JobSnapshot): JobNoticeCopy;
|
|
11
|
+
//# sourceMappingURL=notice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../src/notice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,aAAa,CAyBvE"}
|
package/dist/notice.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat-safe toast copy (ADR-0039). Title is the job title; body is the
|
|
3
|
+
* result or error. Never a worktree path, never a job-<hex> id.
|
|
4
|
+
*/
|
|
5
|
+
export function formatJobFinishedNotice(job) {
|
|
6
|
+
const title = job.title.trim() || "Dispatch job";
|
|
7
|
+
if (job.status === "error") {
|
|
8
|
+
return {
|
|
9
|
+
title: `${title} failed`,
|
|
10
|
+
body: clip(job.errorMessage || "The teammate hit an error."),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
if (job.status === "cancelled") {
|
|
14
|
+
return {
|
|
15
|
+
title: `${title} was cancelled`,
|
|
16
|
+
body: "Say where are we in chat if you want to resume.",
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const result = job.resultSummary?.trim() || "Wrapped up.";
|
|
20
|
+
const checks = job.verification === "failed"
|
|
21
|
+
? job.verificationDetail || "Checks failed."
|
|
22
|
+
: job.verification === "passed"
|
|
23
|
+
? "Checks passed."
|
|
24
|
+
: "";
|
|
25
|
+
return {
|
|
26
|
+
title: `${title} finished`,
|
|
27
|
+
body: clip([result, checks].filter(Boolean).join(" ")),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function clip(text, max = 180) {
|
|
31
|
+
const cleaned = text.replace(/\s+/g, " ").trim();
|
|
32
|
+
if (cleaned.length <= max)
|
|
33
|
+
return cleaned;
|
|
34
|
+
return `${cleaned.slice(0, max - 1)}…`;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice.js","sourceRoot":"","sources":["../src/notice.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAgB;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,cAAc,CAAC;IACjD,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,GAAG,KAAK,SAAS;YACxB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,4BAA4B,CAAC;SAC7D,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,GAAG,KAAK,gBAAgB;YAC/B,IAAI,EAAE,iDAAiD;SACxD,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,aAAa,CAAC;IAC1D,MAAM,MAAM,GACV,GAAG,CAAC,YAAY,KAAK,QAAQ;QAC3B,CAAC,CAAC,GAAG,CAAC,kBAAkB,IAAI,gBAAgB;QAC5C,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,QAAQ;YAC7B,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,EAAE,CAAC;IACX,OAAO;QACL,KAAK,EAAE,GAAG,KAAK,WAAW;QAC1B,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACzC,CAAC"}
|
package/dist/notify.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import type { JobNoticeCopy } from "./notice.js";
|
|
3
|
+
declare const execFileAsync: typeof execFile.__promisify__;
|
|
4
|
+
export type NotifyFn = (copy: JobNoticeCopy, url?: string) => Promise<void>;
|
|
5
|
+
export declare function createOsNotifier(platform?: NodeJS.Platform, run?: typeof execFileAsync): NotifyFn;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,QAAA,MAAM,aAAa,+BAAsB,CAAC;AAE1C,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5E,wBAAgB,gBAAgB,CAC9B,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,OAAO,aAA6B,GACxC,QAAQ,CAkBV"}
|
package/dist/notify.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export function createOsNotifier(platform = process.platform, run = execFileAsync) {
|
|
5
|
+
return async (copy, url) => {
|
|
6
|
+
try {
|
|
7
|
+
if (platform === "darwin") {
|
|
8
|
+
await notifyDarwin(copy, url, run);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (platform === "linux") {
|
|
12
|
+
await run("notify-send", [copy.title, copy.body], { timeout: 4_000 });
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (platform === "win32") {
|
|
16
|
+
await notifyWindows(copy, run);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
/* notifications are best-effort */
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function notifyDarwin(copy, url, run) {
|
|
25
|
+
try {
|
|
26
|
+
const args = [
|
|
27
|
+
"-title",
|
|
28
|
+
"Prism",
|
|
29
|
+
"-message",
|
|
30
|
+
copy.body,
|
|
31
|
+
"-subtitle",
|
|
32
|
+
copy.title,
|
|
33
|
+
];
|
|
34
|
+
if (url)
|
|
35
|
+
args.push("-open", url);
|
|
36
|
+
await run("terminal-notifier", args, { timeout: 4_000 });
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* fall through to osascript */
|
|
41
|
+
}
|
|
42
|
+
const script = `display notification ${osa(copy.body)} with title "Prism" subtitle ${osa(copy.title)}`;
|
|
43
|
+
await run("osascript", ["-e", script], { timeout: 4_000 });
|
|
44
|
+
}
|
|
45
|
+
async function notifyWindows(copy, run) {
|
|
46
|
+
const title = ps(copy.title);
|
|
47
|
+
const body = ps(copy.body);
|
|
48
|
+
const script = `[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null; Write-Output ${title}; Write-Output ${body}`;
|
|
49
|
+
await run("powershell", ["-NoProfile", "-Command", script], {
|
|
50
|
+
timeout: 6_000,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function osa(value) {
|
|
54
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
55
|
+
}
|
|
56
|
+
function ps(value) {
|
|
57
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAI1C,MAAM,UAAU,gBAAgB,CAC9B,WAA4B,OAAO,CAAC,QAAQ,EAC5C,MAA4B,aAAa;IAEzC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAmB,EACnB,GAAuB,EACvB,GAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG;YACX,QAAQ;YACR,OAAO;YACP,UAAU;YACV,IAAI,CAAC,IAAI;YACT,WAAW;YACX,IAAI,CAAC,KAAK;SACX,CAAC;QACF,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,MAAM,MAAM,GAAG,wBAAwB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACvG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,IAAmB,EACnB,GAAyB;IAEzB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,wIAAwI,KAAK,kBAAkB,IAAI,EAAE,CAAC;IACrL,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;QAC1D,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,SAAS,EAAE,CAAC,KAAa;IACvB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAC1C,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Loopback-only port for the jobs dashboard (ADR-0043). */
|
|
2
|
+
export declare const HUB_PORT = 17330;
|
|
3
|
+
export declare const HUB_DIR_NAME = ".prism/hub";
|
|
4
|
+
export type HubEnv = {
|
|
5
|
+
readonly PRISM_HUB?: string;
|
|
6
|
+
readonly PRISM_HUB_HOME?: string;
|
|
7
|
+
readonly PRISM_HUB_PORT?: string;
|
|
8
|
+
readonly VITEST?: string;
|
|
9
|
+
readonly [key: string]: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
export declare function hubHome(env?: HubEnv): string;
|
|
12
|
+
export declare function hubRecordPath(home?: string): string;
|
|
13
|
+
export declare function hubRegistryPath(home?: string): string;
|
|
14
|
+
export declare function hubPort(env?: HubEnv): number;
|
|
15
|
+
export declare function hubEnabled(env?: HubEnv): boolean;
|
|
16
|
+
export declare function dashboardUrl(port: number, token?: string): string;
|
|
17
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,QAAQ,CAAC;AAE9B,eAAO,MAAM,YAAY,eAAe,CAAC;AAEzC,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5C,CAAC;AAEF,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAoB,GAAG,MAAM,CAIzD;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAY,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,IAAI,SAAY,GAAG,MAAM,CAExD;AAED,wBAAgB,OAAO,CAAC,GAAG,GAAE,MAAoB,GAAG,MAAM,CAKzD;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAoB,GAAG,OAAO,CAM7D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjE"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Loopback-only port for the jobs dashboard (ADR-0043). */
|
|
4
|
+
export const HUB_PORT = 17330;
|
|
5
|
+
export const HUB_DIR_NAME = ".prism/hub";
|
|
6
|
+
export function hubHome(env = process.env) {
|
|
7
|
+
const override = env.PRISM_HUB_HOME?.trim();
|
|
8
|
+
if (override)
|
|
9
|
+
return override;
|
|
10
|
+
return join(homedir(), ".prism", "hub");
|
|
11
|
+
}
|
|
12
|
+
export function hubRecordPath(home = hubHome()) {
|
|
13
|
+
return join(home, "hub.json");
|
|
14
|
+
}
|
|
15
|
+
export function hubRegistryPath(home = hubHome()) {
|
|
16
|
+
return join(home, "registry.json");
|
|
17
|
+
}
|
|
18
|
+
export function hubPort(env = process.env) {
|
|
19
|
+
const raw = env.PRISM_HUB_PORT?.trim();
|
|
20
|
+
if (raw === "0")
|
|
21
|
+
return 0;
|
|
22
|
+
const parsed = raw ? Number.parseInt(raw, 10) : HUB_PORT;
|
|
23
|
+
return Number.isInteger(parsed) && parsed >= 0 ? parsed : HUB_PORT;
|
|
24
|
+
}
|
|
25
|
+
export function hubEnabled(env = process.env) {
|
|
26
|
+
if (env.PRISM_HUB === "0")
|
|
27
|
+
return false;
|
|
28
|
+
// Vitest sets VITEST=true. Do not spawn a user-level daemon from the suite
|
|
29
|
+
// unless a test opts in with PRISM_HUB=1.
|
|
30
|
+
if (env.VITEST === "true" && env.PRISM_HUB !== "1")
|
|
31
|
+
return false;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
export function dashboardUrl(port, token) {
|
|
35
|
+
const base = `http://127.0.0.1:${port}/`;
|
|
36
|
+
return token ? `${base}?token=${encodeURIComponent(token)}` : base;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC;AAE9B,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAUzC,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAI,GAAG,OAAO,EAAE;IAC5C,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAI,GAAG,OAAO,EAAE;IAC9C,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzD,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG;IAClD,IAAI,GAAG,CAAC,SAAS,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACxC,2EAA2E;IAC3E,0CAA0C;IAC1C,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAc;IACvD,MAAM,IAAI,GAAG,oBAAoB,IAAI,GAAG,CAAC;IACzC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type HubEnv } from "./paths.js";
|
|
2
|
+
import type { WorkspaceEntry } from "./types.js";
|
|
3
|
+
export declare function workspaceLabel(path: string): string;
|
|
4
|
+
export declare function loadRegistry(env?: HubEnv): Promise<WorkspaceEntry[]>;
|
|
5
|
+
export declare function saveRegistry(workspaces: readonly WorkspaceEntry[], env?: HubEnv): Promise<void>;
|
|
6
|
+
export declare function registerWorkspace(path: string, env?: HubEnv, now?: () => string): Promise<WorkspaceEntry[]>;
|
|
7
|
+
export declare function dropMissingWorkspaces(exists: (path: string) => Promise<boolean>, env?: HubEnv): Promise<WorkspaceEntry[]>;
|
|
8
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAEpE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAsB,YAAY,CAChC,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAM3B;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,SAAS,cAAc,EAAE,EACrC,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAoB,EACzB,GAAG,GAAE,MAAM,MAAuC,GACjD,OAAO,CAAC,cAAc,EAAE,CAAC,CAc3B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC1C,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAU3B"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { readJsonFile, writeJsonFile } from "./json-file.js";
|
|
3
|
+
import { hubHome, hubRegistryPath } from "./paths.js";
|
|
4
|
+
export function workspaceLabel(path) {
|
|
5
|
+
return basename(path.replace(/[/\\]+$/, "")) || path;
|
|
6
|
+
}
|
|
7
|
+
export async function loadRegistry(env = process.env) {
|
|
8
|
+
const file = await readJsonFile(hubRegistryPath(hubHome(env)), { workspaces: [] });
|
|
9
|
+
return [...(file.workspaces ?? [])];
|
|
10
|
+
}
|
|
11
|
+
export async function saveRegistry(workspaces, env = process.env) {
|
|
12
|
+
await writeJsonFile(hubRegistryPath(hubHome(env)), { workspaces });
|
|
13
|
+
}
|
|
14
|
+
export async function registerWorkspace(path, env = process.env, now = () => new Date().toISOString()) {
|
|
15
|
+
const root = path.trim();
|
|
16
|
+
if (!root)
|
|
17
|
+
return loadRegistry(env);
|
|
18
|
+
const current = await loadRegistry(env);
|
|
19
|
+
const next = [
|
|
20
|
+
...current.filter((entry) => entry.path !== root),
|
|
21
|
+
{
|
|
22
|
+
path: root,
|
|
23
|
+
label: workspaceLabel(root),
|
|
24
|
+
lastSeenAt: now(),
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
await saveRegistry(next, env);
|
|
28
|
+
return next;
|
|
29
|
+
}
|
|
30
|
+
export async function dropMissingWorkspaces(exists, env = process.env) {
|
|
31
|
+
const current = await loadRegistry(env);
|
|
32
|
+
const kept = [];
|
|
33
|
+
for (const entry of current) {
|
|
34
|
+
if (await exists(entry.path))
|
|
35
|
+
kept.push(entry);
|
|
36
|
+
}
|
|
37
|
+
if (kept.length !== current.length) {
|
|
38
|
+
await saveRegistry(kept, env);
|
|
39
|
+
}
|
|
40
|
+
return kept;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAe,MAAM,YAAY,CAAC;AAGnE,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,OAAO,CAAC,GAAG;IAEzB,MAAM,IAAI,GAAG,MAAM,YAAY,CAC7B,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAC7B,EAAE,UAAU,EAAE,EAAE,EAAE,CACnB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAqC,EACrC,MAAc,OAAO,CAAC,GAAG;IAEzB,MAAM,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,MAAc,OAAO,CAAC,GAAG,EACzB,MAAoB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IAElD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAqB;QAC7B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QACjD;YACE,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC;YAC3B,UAAU,EAAE,GAAG,EAAE;SAClB;KACF,CAAC;IACF,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA0C,EAC1C,MAAc,OAAO,CAAC,GAAG;IAEzB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type NotifyFn } from "./notify.js";
|
|
2
|
+
import { type HubEnv } from "./paths.js";
|
|
3
|
+
import type { HubRecord } from "./types.js";
|
|
4
|
+
export type JobControlFn = (workspacePath: string, jobId: string, action: string) => Promise<unknown>;
|
|
5
|
+
export type HubOptions = {
|
|
6
|
+
readonly env?: HubEnv;
|
|
7
|
+
readonly notify?: NotifyFn;
|
|
8
|
+
readonly idleMs?: number;
|
|
9
|
+
readonly pollMs?: number;
|
|
10
|
+
readonly assetsDir?: string;
|
|
11
|
+
readonly control?: JobControlFn;
|
|
12
|
+
readonly version?: string;
|
|
13
|
+
};
|
|
14
|
+
export type StartedHub = {
|
|
15
|
+
readonly record: HubRecord;
|
|
16
|
+
readonly url: string;
|
|
17
|
+
readonly close: () => Promise<void>;
|
|
18
|
+
};
|
|
19
|
+
export declare function startHub(options?: HubOptions): Promise<StartedHub | {
|
|
20
|
+
alreadyRunning: true;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhE,OAAO,KAAK,EAEV,SAAS,EAGV,MAAM,YAAY,CAAC;AAgBpB,MAAM,MAAM,YAAY,GAAG,CACzB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAsBF,wBAAsB,QAAQ,CAC5B,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,UAAU,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC,CAsPhD"}
|