@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/README.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# `@repo-prism/dispatch-hub`
|
|
2
|
+
|
|
3
|
+
Loopback dashboard and OS notifications for Prism Dispatch jobs (ADR-0043).
|
|
4
|
+
|
|
5
|
+
The host MCP server (`prism-mcp`) spawns this daemon when a chat session
|
|
6
|
+
starts. It binds `127.0.0.1:17330`, watches every registered workspace's
|
|
7
|
+
`.prism/dispatch/` tree, and serves a live jobs board.
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
npx prism-hub
|
|
11
|
+
# or: bun run --filter @repo-prism/dispatch-hub start
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`PRISM_HUB=0` on the MCP process skips spawn. `PRISM_HUB_HOME` and
|
|
15
|
+
`PRISM_HUB_PORT` override the state directory and bind port (tests).
|
|
16
|
+
|
|
17
|
+
**Must never** be imported by `@repo-prism/core` or any engine package. The
|
|
18
|
+
IDE extension talks to it over HTTP rather than importing this package.
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
export declare function originAllowed(origin: string | undefined): boolean;
|
|
3
|
+
export declare function tokenFromRequest(req: IncomingMessage, url: URL): string | undefined;
|
|
4
|
+
export declare function tokensMatch(expected: string, given: string | undefined): boolean;
|
|
5
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQjE;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,GAAG,GACP,MAAM,GAAG,SAAS,CAiBpB;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAET"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const LOOPBACK = new Set(["127.0.0.1", "localhost", "::1", "[::1]"]);
|
|
2
|
+
export function originAllowed(origin) {
|
|
3
|
+
if (!origin)
|
|
4
|
+
return true;
|
|
5
|
+
try {
|
|
6
|
+
const url = new URL(origin);
|
|
7
|
+
return LOOPBACK.has(url.hostname);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function tokenFromRequest(req, url) {
|
|
14
|
+
const header = req.headers.authorization;
|
|
15
|
+
if (typeof header === "string" && header.startsWith("Bearer ")) {
|
|
16
|
+
const bearer = header.slice("Bearer ".length).trim();
|
|
17
|
+
if (bearer)
|
|
18
|
+
return bearer;
|
|
19
|
+
}
|
|
20
|
+
const query = url.searchParams.get("token")?.trim();
|
|
21
|
+
if (query)
|
|
22
|
+
return query;
|
|
23
|
+
const cookie = req.headers.cookie;
|
|
24
|
+
if (!cookie)
|
|
25
|
+
return undefined;
|
|
26
|
+
for (const part of cookie.split(";")) {
|
|
27
|
+
const [name, ...rest] = part.trim().split("=");
|
|
28
|
+
if (name === "prism_hub") {
|
|
29
|
+
return decodeURIComponent(rest.join("="));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
export function tokensMatch(expected, given) {
|
|
35
|
+
return Boolean(given) && given === expected;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAErE,MAAM,UAAU,aAAa,CAAC,MAA0B;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,GAAoB,EACpB,GAAQ;IAER,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,KAAyB;IAEzB,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC;AAC9C,CAAC"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { startHub } from "./server.js";
|
|
3
|
+
async function main() {
|
|
4
|
+
const started = await startHub();
|
|
5
|
+
if ("alreadyRunning" in started) {
|
|
6
|
+
process.exit(0);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
main().catch((error) => {
|
|
10
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
11
|
+
process.stderr.write(`prism-hub: ${detail}\n`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,EAAE,CAAC;IACjC,IAAI,gBAAgB,IAAI,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
html,body{background:var(--prism-canvas);color:var(--prism-ink);font-family:var(--prism-font,Inter,system-ui,sans-serif);min-height:100%;margin:0}#root{min-height:100vh}.hub{max-width:960px;margin:0 auto;padding:32px 24px 64px}.hub-header{display:flex;justify-content:space-between;align-items: flex-end;gap:16px;margin-bottom:28px}.hub-kicker{color:var(--prism-brand);letter-spacing:.08em;text-transform:uppercase;margin:0 0 4px;font-size:12px}.hub h1{margin:0;font-size:28px;font-weight:600}.hub-meta,.hub-error,.ov-empty{color:var(--prism-ink-muted)}.hub-error{color:var(--prism-rose)}.hub-repo{margin-top:28px}.hub-repo h2{color:var(--prism-ink-muted);margin:0 0 12px;font-size:14px;font-weight:600}.hub-list{list-style:none;display:grid;gap:12px;margin:0;padding:0}.hub-card{background:var(--prism-panel);border:1px solid var(--prism-line);border-radius:12px;padding:16px 18px}.hub-card-top{display:flex;justify-content:space-between;align-items: center;gap:12px}.hub-activity{color:var(--prism-ink-muted);margin:8px 0 0;font-size:14px}.hub-facts{display:flex;flex-wrap:wrap;gap:16px;margin:12px 0 0}.hub-facts dt{text-transform:uppercase;letter-spacing:.06em;color:var(--prism-ink-muted);font-size:11px}.hub-facts dd{margin:2px 0 0;font-size:13px}.hub-facts code{font-family:var(--prism-mono,ui-monospace,monospace);font-size:12px}.hub-pill{text-transform:capitalize;border-radius:999px;padding:2px 10px;font-size:12px}.hub-pill-brand{background:color-mix(in srgb,var(--prism-brand)18%,transparent);color:var(--prism-brand-strong)}.hub-pill-emerald{background:color-mix(in srgb,var(--prism-emerald)18%,transparent);color:var(--prism-emerald)}.hub-pill-rose{background:color-mix(in srgb,var(--prism-rose)18%,transparent);color:var(--prism-rose)}.hub-pill-amber{background:color-mix(in srgb,var(--prism-amber)18%,transparent);color:var(--prism-amber)}.hub-pill-muted{background:var(--prism-tile);color:var(--prism-ink-muted)}.hub-actions{display:flex;gap:8px;margin-top:12px}.hub-actions button{appearance:none;border:1px solid var(--prism-line);background:var(--prism-tile);color:var(--prism-ink);cursor:pointer;font:inherit;border-radius:8px;padding:6px 12px;font-size:13px}.hub-actions button:hover{border-color:var(--prism-brand)}
|