@repo-prism/dispatch-hub 1.1.15 → 1.1.17
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 +2 -1
- package/dist/Prism.app/Contents/Info.plist +16 -0
- package/dist/Prism.app/Contents/MacOS/prism-notify +0 -0
- package/dist/auth.d.ts +8 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +22 -1
- package/dist/auth.js.map +1 -1
- package/dist/dashboard/app.css +1 -1
- package/dist/dashboard/app.js +158 -108
- package/dist/dashboard/app.js.map +108 -5
- package/dist/dashboard/hub.css +13306 -1
- package/dist/dashboard/index.html +2 -1
- package/dist/dashboard/prism-mark.png +0 -0
- package/dist/hub-record.d.ts.map +1 -1
- package/dist/hub-record.js +36 -1
- package/dist/hub-record.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/intelligence.d.ts +37 -0
- package/dist/intelligence.d.ts.map +1 -0
- package/dist/intelligence.js +102 -0
- package/dist/intelligence.js.map +1 -0
- package/dist/notes.d.ts +32 -0
- package/dist/notes.d.ts.map +1 -0
- package/dist/notes.js +117 -0
- package/dist/notes.js.map +1 -0
- package/dist/notice.d.ts.map +1 -1
- package/dist/notice.js +15 -0
- package/dist/notice.js.map +1 -1
- package/dist/notify.d.ts +6 -0
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +73 -12
- package/dist/notify.js.map +1 -1
- package/dist/paths.d.ts +25 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +30 -2
- package/dist/paths.js.map +1 -1
- package/dist/server.d.ts +8 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +233 -17
- package/dist/server.js.map +1 -1
- package/dist/snapshot.d.ts +14 -2
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +39 -9
- package/dist/snapshot.js.map +1 -1
- package/dist/statusline.d.ts +2 -0
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +23 -5
- package/dist/statusline.js.map +1 -1
- package/dist/types.d.ts +63 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- package/dist/watch.d.ts +22 -5
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +59 -13
- package/dist/watch.js.map +1 -1
- package/package.json +7 -3
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>Prism
|
|
6
|
+
<title>Prism Dispatch</title>
|
|
7
|
+
<link rel="icon" href="/assets/prism-mark.png" />
|
|
7
8
|
<link rel="stylesheet" href="/assets/hub.css" />
|
|
8
9
|
</head>
|
|
9
10
|
<body class="prism-theme">
|
|
Binary file
|
package/dist/hub-record.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-record.d.ts","sourceRoot":"","sources":["../src/hub-record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hub-record.d.ts","sourceRoot":"","sources":["../src/hub-record.ts"],"names":[],"mappings":"AAMA,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;AAYD,wBAAgB,cAAc,IAAI,MAAM,CA0BvC"}
|
package/dist/hub-record.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { isProcessAlive } from "@repo-prism/dispatch";
|
|
3
6
|
import { readJsonFile, writeJsonFile } from "./json-file.js";
|
|
4
7
|
import { hubRecordPath, hubHome } from "./paths.js";
|
|
@@ -19,7 +22,39 @@ export async function writeHubRecord(record, env = process.env) {
|
|
|
19
22
|
export function isHubRecordLive(record) {
|
|
20
23
|
return Boolean(record && isProcessAlive(record.pid));
|
|
21
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* The Console's own version, read from its `package.json`.
|
|
27
|
+
*
|
|
28
|
+
* This used to be a hardcoded string, which is stale the moment anyone bumps
|
|
29
|
+
* the manifest and forgets — and it is reported by `/api/healthz`, so the
|
|
30
|
+
* number a user quotes in a bug report was wrong by construction (ADR-0048).
|
|
31
|
+
* Read once and cached: the file cannot change under a running process.
|
|
32
|
+
*/
|
|
33
|
+
let cachedVersion;
|
|
22
34
|
export function packageVersion() {
|
|
23
|
-
|
|
35
|
+
if (cachedVersion !== undefined)
|
|
36
|
+
return cachedVersion;
|
|
37
|
+
// `dist/` sits one level under the package root, and so does `src/` when
|
|
38
|
+
// vitest runs straight off TypeScript. Both resolve to the same manifest.
|
|
39
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
for (const candidate of [
|
|
41
|
+
join(here, "..", "package.json"),
|
|
42
|
+
join(here, "..", "..", "package.json"),
|
|
43
|
+
]) {
|
|
44
|
+
try {
|
|
45
|
+
const raw = JSON.parse(readFileSync(candidate, "utf8"));
|
|
46
|
+
if (raw.name === "@repo-prism/dispatch-hub" && raw.version) {
|
|
47
|
+
cachedVersion = raw.version;
|
|
48
|
+
return cachedVersion;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Try the next candidate.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Never invent a number. An unknown version is reported as unknown so a bug
|
|
56
|
+
// report says "unknown" rather than confidently naming the wrong release.
|
|
57
|
+
cachedVersion = "unknown";
|
|
58
|
+
return cachedVersion;
|
|
24
59
|
}
|
|
25
60
|
//# sourceMappingURL=hub-record.js.map
|
package/dist/hub-record.js.map
CHANGED
|
@@ -1 +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,
|
|
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,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,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;;;;;;;GAOG;AACH,IAAI,aAAiC,CAAC;AAEtC,MAAM,UAAU,cAAc;IAC5B,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACtD,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,KAAK,MAAM,SAAS,IAAI;QACtB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;KACvC,EAAE,CAAC;QACF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAGrD,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC3D,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;gBAC5B,OAAO,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IACD,4EAA4E;IAC5E,0EAA0E;IAC1E,aAAa,GAAG,SAAS,CAAC;IAC1B,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_NAME: "@repo-prism/dispatch-hub";
|
|
2
|
-
export { HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
2
|
+
export { CONSOLE_ALIAS_HOST, CONSOLE_HOST, HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
3
3
|
export { ensureHub, peekHub, resolveHubBin, type HubHandle } from "./ensure.js";
|
|
4
4
|
export { startHub, type HubOptions, type StartedHub } from "./server.js";
|
|
5
5
|
export { formatJobFinishedNotice, type JobNoticeCopy } from "./notice.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,EAAG,0BAAmC,CAAC;AAEhE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,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,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,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
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const PACKAGE_NAME = "@repo-prism/dispatch-hub";
|
|
2
|
-
export { HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
2
|
+
export { CONSOLE_ALIAS_HOST, CONSOLE_HOST, HUB_PORT, dashboardUrl, hubEnabled, hubHome, hubPort, } from "./paths.js";
|
|
3
3
|
export { ensureHub, peekHub, resolveHubBin } from "./ensure.js";
|
|
4
4
|
export { startHub } from "./server.js";
|
|
5
5
|
export { formatJobFinishedNotice } from "./notice.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAAmC,CAAC;AAEhE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,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,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { HostDispatchState, HostRequest, HostResponse, PrismSession } from "@repo-prism/host-session";
|
|
2
|
+
/**
|
|
3
|
+
* How long an idle Core session survives before it is closed.
|
|
4
|
+
*
|
|
5
|
+
* An indexed session holds the whole repository graph in memory. The Console
|
|
6
|
+
* is an always-on user-level daemon, so anything it keeps, it keeps for days
|
|
7
|
+
* (ADR-0048). Ten minutes is long enough that switching tabs or reading a
|
|
8
|
+
* report does not re-index, and short enough that a laptop left open
|
|
9
|
+
* overnight is not holding a repository it has forgotten about.
|
|
10
|
+
*/
|
|
11
|
+
export declare const SESSION_IDLE_MS: number;
|
|
12
|
+
export type IntelligenceDeps = {
|
|
13
|
+
/**
|
|
14
|
+
* Loads `@repo-prism/core` and its host-session wrapper. Injected so tests
|
|
15
|
+
* can drive the plane without an indexer, and — more importantly — so the
|
|
16
|
+
* import is a value passed at call time rather than a static edge the
|
|
17
|
+
* bundler would pull into the always-on path.
|
|
18
|
+
*/
|
|
19
|
+
readonly load?: () => Promise<IntelligenceModule>;
|
|
20
|
+
readonly idleMs?: number;
|
|
21
|
+
readonly now?: () => number;
|
|
22
|
+
};
|
|
23
|
+
export type IntelligenceModule = {
|
|
24
|
+
createSession(): PrismSession;
|
|
25
|
+
dispatch(session: PrismSession, request: HostRequest, state: HostDispatchState): Promise<HostResponse>;
|
|
26
|
+
};
|
|
27
|
+
export type IntelligencePlane = {
|
|
28
|
+
/** Answer one RPC, opening or reusing a session for `workspacePath`. */
|
|
29
|
+
handle(workspacePath: string, request: HostRequest): Promise<HostResponse>;
|
|
30
|
+
/** Which workspace is currently held open, if any. */
|
|
31
|
+
openWorkspace(): string | undefined;
|
|
32
|
+
/** True once Core has actually been loaded — what `/api/healthz` reports. */
|
|
33
|
+
loaded(): boolean;
|
|
34
|
+
close(): void;
|
|
35
|
+
};
|
|
36
|
+
export declare function createIntelligencePlane(deps?: IntelligenceDeps): IntelligencePlane;
|
|
37
|
+
//# sourceMappingURL=intelligence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,QAAiB,CAAC;AAE9C,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,IAAI,YAAY,CAAC;IAC9B,QAAQ,CACN,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,wEAAwE;IACxE,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3E,sDAAsD;IACtD,aAAa,IAAI,MAAM,GAAG,SAAS,CAAC;IACpC,6EAA6E;IAC7E,MAAM,IAAI,OAAO,CAAC;IAClB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAkBF,wBAAgB,uBAAuB,CACrC,IAAI,GAAE,gBAAqB,GAC1B,iBAAiB,CAqFnB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long an idle Core session survives before it is closed.
|
|
3
|
+
*
|
|
4
|
+
* An indexed session holds the whole repository graph in memory. The Console
|
|
5
|
+
* is an always-on user-level daemon, so anything it keeps, it keeps for days
|
|
6
|
+
* (ADR-0048). Ten minutes is long enough that switching tabs or reading a
|
|
7
|
+
* report does not re-index, and short enough that a laptop left open
|
|
8
|
+
* overnight is not holding a repository it has forgotten about.
|
|
9
|
+
*/
|
|
10
|
+
export const SESSION_IDLE_MS = 10 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* The default loader: a genuine dynamic `import()`.
|
|
13
|
+
*
|
|
14
|
+
* ADR-0043 kept Core out of the hub so the always-on daemon would stay small.
|
|
15
|
+
* ADR-0048 restates that as *no Core until asked* — this function is the
|
|
16
|
+
* "until asked". A user who only ever looks at jobs never runs it.
|
|
17
|
+
*/
|
|
18
|
+
async function loadCore() {
|
|
19
|
+
const mod = await import("@repo-prism/host-session");
|
|
20
|
+
return {
|
|
21
|
+
createSession: () => new mod.PrismSession(),
|
|
22
|
+
dispatch: (session, request, state) => mod.dispatchHostRequest(session, request, state),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function createIntelligencePlane(deps = {}) {
|
|
26
|
+
const load = deps.load ?? loadCore;
|
|
27
|
+
const idleMs = deps.idleMs ?? SESSION_IDLE_MS;
|
|
28
|
+
const now = deps.now ?? (() => Date.now());
|
|
29
|
+
let mod;
|
|
30
|
+
let session;
|
|
31
|
+
let openPath;
|
|
32
|
+
let lastUsed = 0;
|
|
33
|
+
let sweep;
|
|
34
|
+
// One in-flight open per workspace. Two tabs asking at once must not start
|
|
35
|
+
// two indexes of the same repository.
|
|
36
|
+
let opening;
|
|
37
|
+
// Every request shares one zoom/layer state, matching the extension's
|
|
38
|
+
// single-panel behaviour. Two browser tabs on the same repo will fight over
|
|
39
|
+
// it; that is a known limit of a single session, not a silent bug.
|
|
40
|
+
const state = {
|
|
41
|
+
zoom: "package",
|
|
42
|
+
layers: ["architecture", "dependency"],
|
|
43
|
+
};
|
|
44
|
+
const evict = () => {
|
|
45
|
+
session?.close();
|
|
46
|
+
session = undefined;
|
|
47
|
+
openPath = undefined;
|
|
48
|
+
};
|
|
49
|
+
const ensureSweep = () => {
|
|
50
|
+
if (sweep)
|
|
51
|
+
return;
|
|
52
|
+
sweep = setInterval(() => {
|
|
53
|
+
if (session && now() - lastUsed > idleMs)
|
|
54
|
+
evict();
|
|
55
|
+
}, Math.max(1000, Math.floor(idleMs / 4)));
|
|
56
|
+
sweep.unref?.();
|
|
57
|
+
};
|
|
58
|
+
async function ensureSession(workspacePath, id) {
|
|
59
|
+
if (session && openPath === workspacePath)
|
|
60
|
+
return undefined;
|
|
61
|
+
mod ??= await load();
|
|
62
|
+
// Only one workspace at a time. Caching several indexed repositories in a
|
|
63
|
+
// background process is how a local-first tool ends up blamed for a slow
|
|
64
|
+
// laptop, so opening a second closes the first.
|
|
65
|
+
evict();
|
|
66
|
+
const next = mod.createSession();
|
|
67
|
+
const opened = await next.open(workspacePath);
|
|
68
|
+
if (!opened.ok) {
|
|
69
|
+
next.close();
|
|
70
|
+
return { id, ok: false, error: opened.error.message };
|
|
71
|
+
}
|
|
72
|
+
session = next;
|
|
73
|
+
openPath = workspacePath;
|
|
74
|
+
ensureSweep();
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
async handle(workspacePath, request) {
|
|
79
|
+
lastUsed = now();
|
|
80
|
+
// Serialise opens so concurrent first requests share one index build.
|
|
81
|
+
opening = (opening ?? Promise.resolve(undefined)).then(() => ensureSession(workspacePath, request.id));
|
|
82
|
+
const failure = await opening;
|
|
83
|
+
opening = undefined;
|
|
84
|
+
if (failure)
|
|
85
|
+
return failure;
|
|
86
|
+
if (!session || !mod) {
|
|
87
|
+
return { id: request.id, ok: false, error: "No workspace open" };
|
|
88
|
+
}
|
|
89
|
+
lastUsed = now();
|
|
90
|
+
return await mod.dispatch(session, request, state);
|
|
91
|
+
},
|
|
92
|
+
openWorkspace: () => openPath,
|
|
93
|
+
loaded: () => mod !== undefined,
|
|
94
|
+
close: () => {
|
|
95
|
+
if (sweep)
|
|
96
|
+
clearInterval(sweep);
|
|
97
|
+
sweep = undefined;
|
|
98
|
+
evict();
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=intelligence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intelligence.js","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"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"}
|
package/dist/notes.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job write-ups under `.prism/dispatch/notes/`.
|
|
3
|
+
*
|
|
4
|
+
* The Console used to show only the clipped result summary. Notes are the
|
|
5
|
+
* full findings the worker actually wrote, served through the hub so the
|
|
6
|
+
* browser never reads the filesystem itself.
|
|
7
|
+
*/
|
|
8
|
+
export type JobNoteListItem = {
|
|
9
|
+
readonly path: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
};
|
|
12
|
+
export type JobNoteFile = {
|
|
13
|
+
readonly path: string;
|
|
14
|
+
readonly text: string;
|
|
15
|
+
readonly truncated: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare function noteTitle(rel: string): string;
|
|
18
|
+
/** Resolve a notes path against the job's workspace (and worktree, if any). */
|
|
19
|
+
export declare function resolveJobNotePath(workspace: string, rel: string, worktreePath?: string): string | undefined;
|
|
20
|
+
export declare function listJobNotes(input: {
|
|
21
|
+
readonly workspace: string;
|
|
22
|
+
readonly worktreePath?: string;
|
|
23
|
+
readonly jobId: string;
|
|
24
|
+
readonly summary?: string;
|
|
25
|
+
readonly stored?: readonly string[];
|
|
26
|
+
}): Promise<JobNoteListItem[]>;
|
|
27
|
+
export declare function readJobNote(input: {
|
|
28
|
+
readonly workspace: string;
|
|
29
|
+
readonly rel: string;
|
|
30
|
+
readonly worktreePath?: string;
|
|
31
|
+
}): Promise<JobNoteFile | undefined>;
|
|
32
|
+
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C;AAiBD,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,SAAS,CAWpB;AAcD,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB7B;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAsBnC"}
|
package/dist/notes.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job write-ups under `.prism/dispatch/notes/`.
|
|
3
|
+
*
|
|
4
|
+
* The Console used to show only the clipped result summary. Notes are the
|
|
5
|
+
* full findings the worker actually wrote, served through the hub so the
|
|
6
|
+
* browser never reads the filesystem itself.
|
|
7
|
+
*/
|
|
8
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
9
|
+
import { join, relative, resolve } from "node:path";
|
|
10
|
+
const NOTES_DIR = ".prism/dispatch/notes";
|
|
11
|
+
const MAX_NOTE_BYTES = 256 * 1024;
|
|
12
|
+
function isDispatchNotePath(value) {
|
|
13
|
+
const n = value.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
14
|
+
if (!n.startsWith(`${NOTES_DIR}/`) || !n.endsWith(".md"))
|
|
15
|
+
return false;
|
|
16
|
+
if (n.includes("..") || n.includes("//"))
|
|
17
|
+
return false;
|
|
18
|
+
return n.slice(NOTES_DIR.length + 1).length > 0;
|
|
19
|
+
}
|
|
20
|
+
function notePathsFromText(text) {
|
|
21
|
+
const found = new Set();
|
|
22
|
+
for (const match of text.matchAll(/`([^`\n]{2,200})`/g)) {
|
|
23
|
+
const raw = match[1]?.trim();
|
|
24
|
+
if (raw && isDispatchNotePath(raw)) {
|
|
25
|
+
found.add(raw.replace(/\\/g, "/").replace(/^\.\//, ""));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const match of text.matchAll(/\.prism\/dispatch\/notes\/[\w./-]+\.md/g)) {
|
|
29
|
+
if (isDispatchNotePath(match[0])) {
|
|
30
|
+
found.add(match[0].replace(/\\/g, "/").replace(/^\.\//, ""));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return [...found];
|
|
34
|
+
}
|
|
35
|
+
export function noteTitle(rel) {
|
|
36
|
+
const base = rel.replace(/\\/g, "/").split("/").pop() ?? rel;
|
|
37
|
+
return base.replace(/\.md$/i, "");
|
|
38
|
+
}
|
|
39
|
+
function containedIn(root, abs) {
|
|
40
|
+
const rel = relative(resolve(root), resolve(abs));
|
|
41
|
+
return rel !== "" && !rel.startsWith("..") && !rel.startsWith("/");
|
|
42
|
+
}
|
|
43
|
+
function candidateRoots(workspace, worktreePath) {
|
|
44
|
+
if (worktreePath && resolve(worktreePath) !== resolve(workspace)) {
|
|
45
|
+
return [workspace, worktreePath];
|
|
46
|
+
}
|
|
47
|
+
return [workspace];
|
|
48
|
+
}
|
|
49
|
+
/** Resolve a notes path against the job's workspace (and worktree, if any). */
|
|
50
|
+
export function resolveJobNotePath(workspace, rel, worktreePath) {
|
|
51
|
+
if (!isDispatchNotePath(rel))
|
|
52
|
+
return undefined;
|
|
53
|
+
const n = rel.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
54
|
+
for (const root of candidateRoots(workspace, worktreePath)) {
|
|
55
|
+
const abs = join(root, n);
|
|
56
|
+
const notesRoot = join(root, NOTES_DIR);
|
|
57
|
+
if (containedIn(notesRoot, abs) || resolve(abs) === resolve(notesRoot)) {
|
|
58
|
+
return abs;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
async function filesInNotesDir(root) {
|
|
64
|
+
const dir = join(root, NOTES_DIR);
|
|
65
|
+
try {
|
|
66
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
67
|
+
return entries
|
|
68
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
|
|
69
|
+
.map((entry) => `${NOTES_DIR}/${entry.name}`);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function listJobNotes(input) {
|
|
76
|
+
const found = new Set();
|
|
77
|
+
for (const path of input.stored ?? []) {
|
|
78
|
+
if (isDispatchNotePath(path)) {
|
|
79
|
+
found.add(path.replace(/\\/g, "/").replace(/^\.\//, ""));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
for (const path of notePathsFromText(input.summary ?? "")) {
|
|
83
|
+
found.add(path);
|
|
84
|
+
}
|
|
85
|
+
const slug = input.jobId.toLowerCase();
|
|
86
|
+
for (const root of candidateRoots(input.workspace, input.worktreePath)) {
|
|
87
|
+
for (const path of await filesInNotesDir(root)) {
|
|
88
|
+
const name = (path.split("/").pop() ?? "").toLowerCase();
|
|
89
|
+
if (name.includes(slug) || found.has(path))
|
|
90
|
+
found.add(path);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [...found].map((path) => ({ path, title: noteTitle(path) }));
|
|
94
|
+
}
|
|
95
|
+
export async function readJobNote(input) {
|
|
96
|
+
const abs = resolveJobNotePath(input.workspace, input.rel, input.worktreePath);
|
|
97
|
+
if (!abs)
|
|
98
|
+
return undefined;
|
|
99
|
+
try {
|
|
100
|
+
const info = await stat(abs);
|
|
101
|
+
if (!info.isFile())
|
|
102
|
+
return undefined;
|
|
103
|
+
const raw = await readFile(abs);
|
|
104
|
+
const truncated = raw.byteLength > MAX_NOTE_BYTES;
|
|
105
|
+
const slice = truncated ? raw.subarray(0, MAX_NOTE_BYTES) : raw;
|
|
106
|
+
const path = input.rel.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
107
|
+
return {
|
|
108
|
+
path,
|
|
109
|
+
text: slice.toString("utf8"),
|
|
110
|
+
truncated,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"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"}
|
package/dist/notice.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,CA2CvE"}
|
package/dist/notice.js
CHANGED
|
@@ -22,6 +22,21 @@ export function formatJobFinishedNotice(job) {
|
|
|
22
22
|
: job.verification === "passed"
|
|
23
23
|
? "Checks passed."
|
|
24
24
|
: "";
|
|
25
|
+
// A review is the one finish that needs the human to do something, so say
|
|
26
|
+
// what changed and that nothing landed for them.
|
|
27
|
+
if (job.status === "needs_review") {
|
|
28
|
+
const files = job.review?.files.length ?? 0;
|
|
29
|
+
const churn = job.review
|
|
30
|
+
? ` (+${job.review.totalAdded} -${job.review.totalRemoved})`
|
|
31
|
+
: "";
|
|
32
|
+
const what = files > 0
|
|
33
|
+
? `${files} file${files === 1 ? "" : "s"} changed${churn}, nothing merged for you.`
|
|
34
|
+
: "Nothing was merged for you.";
|
|
35
|
+
return {
|
|
36
|
+
title: `${title} is ready for your review`,
|
|
37
|
+
body: clip([what, checks].filter(Boolean).join(" ")),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
25
40
|
return {
|
|
26
41
|
title: `${title} finished`,
|
|
27
42
|
body: clip([result, checks].filter(Boolean).join(" ")),
|
package/dist/notice.js.map
CHANGED
|
@@ -1 +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;
|
|
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;IAEX,0EAA0E;IAC1E,iDAAiD;IACjD,IAAI,GAAG,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM;YACtB,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG;YAC5D,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GACR,KAAK,GAAG,CAAC;YACP,CAAC,CAAC,GAAG,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,KAAK,2BAA2B;YACnF,CAAC,CAAC,6BAA6B,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,GAAG,KAAK,2BAA2B;YAC1C,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IAED,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
CHANGED
|
@@ -3,5 +3,11 @@ import type { JobNoticeCopy } from "./notice.js";
|
|
|
3
3
|
declare const execFileAsync: typeof execFile.__promisify__;
|
|
4
4
|
export type NotifyFn = (copy: JobNoticeCopy, url?: string) => Promise<void>;
|
|
5
5
|
export declare function createOsNotifier(platform?: NodeJS.Platform, run?: typeof execFileAsync): NotifyFn;
|
|
6
|
+
/**
|
|
7
|
+
* `terminal-notifier -open` is for files. An HTTP Console URL handed to it
|
|
8
|
+
* is treated as a relative path, so the click reveals Finder instead of the
|
|
9
|
+
* dashboard. `-execute /usr/bin/open <url>` opens the browser.
|
|
10
|
+
*/
|
|
11
|
+
export declare function darwinNotifierArgs(copy: JobNoticeCopy, url?: string): string[];
|
|
6
12
|
export {};
|
|
7
13
|
//# sourceMappingURL=notify.d.ts.map
|
package/dist/notify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAS,MAAM,oBAAoB,CAAC;AAKrD,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,CAqBV;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,EAAE,CAcV"}
|
package/dist/notify.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { execFile } from "node:child_process";
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { promisify } from "node:util";
|
|
3
6
|
const execFileAsync = promisify(execFile);
|
|
4
7
|
export function createOsNotifier(platform = process.platform, run = execFileAsync) {
|
|
5
8
|
return async (copy, url) => {
|
|
6
9
|
try {
|
|
7
10
|
if (platform === "darwin") {
|
|
11
|
+
if (run === execFileAsync && notifyDarwinHelper(copy, url)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
8
14
|
await notifyDarwin(copy, url, run);
|
|
9
15
|
return;
|
|
10
16
|
}
|
|
@@ -21,19 +27,31 @@ export function createOsNotifier(platform = process.platform, run = execFileAsyn
|
|
|
21
27
|
}
|
|
22
28
|
};
|
|
23
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* `terminal-notifier -open` is for files. An HTTP Console URL handed to it
|
|
32
|
+
* is treated as a relative path, so the click reveals Finder instead of the
|
|
33
|
+
* dashboard. `-execute /usr/bin/open <url>` opens the browser.
|
|
34
|
+
*/
|
|
35
|
+
export function darwinNotifierArgs(copy, url) {
|
|
36
|
+
const args = [
|
|
37
|
+
"-title",
|
|
38
|
+
"Prism",
|
|
39
|
+
"-message",
|
|
40
|
+
copy.body,
|
|
41
|
+
"-subtitle",
|
|
42
|
+
copy.title,
|
|
43
|
+
];
|
|
44
|
+
const consoleUrl = httpConsoleUrl(url);
|
|
45
|
+
if (consoleUrl) {
|
|
46
|
+
args.push("-execute", `/usr/bin/open ${JSON.stringify(consoleUrl)}`);
|
|
47
|
+
}
|
|
48
|
+
return args;
|
|
49
|
+
}
|
|
24
50
|
async function notifyDarwin(copy, url, run) {
|
|
25
51
|
try {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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 });
|
|
52
|
+
await run("terminal-notifier", darwinNotifierArgs(copy, url), {
|
|
53
|
+
timeout: 4_000,
|
|
54
|
+
});
|
|
37
55
|
return;
|
|
38
56
|
}
|
|
39
57
|
catch {
|
|
@@ -42,6 +60,49 @@ async function notifyDarwin(copy, url, run) {
|
|
|
42
60
|
const script = `display notification ${osa(copy.body)} with title "Prism" subtitle ${osa(copy.title)}`;
|
|
43
61
|
await run("osascript", ["-e", script], { timeout: 4_000 });
|
|
44
62
|
}
|
|
63
|
+
function darwinNotifyHelperPath() {
|
|
64
|
+
if (process.platform !== "darwin")
|
|
65
|
+
return undefined;
|
|
66
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
67
|
+
const app = join(here, "Prism.app");
|
|
68
|
+
const bin = join(app, "Contents", "MacOS", "prism-notify");
|
|
69
|
+
return existsSync(bin) ? app : undefined;
|
|
70
|
+
}
|
|
71
|
+
function notifyDarwinHelper(copy, url) {
|
|
72
|
+
const app = darwinNotifyHelperPath();
|
|
73
|
+
if (!app)
|
|
74
|
+
return false;
|
|
75
|
+
try {
|
|
76
|
+
const child = spawn("/usr/bin/open", [
|
|
77
|
+
"-n",
|
|
78
|
+
"-g",
|
|
79
|
+
app,
|
|
80
|
+
"--args",
|
|
81
|
+
copy.title,
|
|
82
|
+
copy.body,
|
|
83
|
+
httpConsoleUrl(url) ?? "",
|
|
84
|
+
], { detached: true, stdio: "ignore" });
|
|
85
|
+
child.unref();
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function httpConsoleUrl(url) {
|
|
93
|
+
if (!url)
|
|
94
|
+
return undefined;
|
|
95
|
+
try {
|
|
96
|
+
const parsed = new URL(url);
|
|
97
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
return parsed.toString();
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
45
106
|
async function notifyWindows(copy, run) {
|
|
46
107
|
const title = ps(copy.title);
|
|
47
108
|
const body = ps(copy.body);
|
package/dist/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
|