@repo-prism/dispatch-hub 1.1.17 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api-errors.d.ts +26 -0
- package/dist/api-errors.d.ts.map +1 -0
- package/dist/api-errors.js +61 -0
- package/dist/api-errors.js.map +1 -0
- package/dist/bin.js +0 -0
- package/dist/dashboard/app.css +1 -1
- package/dist/dashboard/app.js +177 -139
- package/dist/dashboard/app.js.map +559 -31
- package/dist/dashboard/hub.css +4346 -477
- package/dist/dashboard/index.html +2 -2
- package/dist/host-telemetry.d.ts +9 -0
- package/dist/host-telemetry.d.ts.map +1 -0
- package/dist/host-telemetry.js +30 -0
- package/dist/host-telemetry.js.map +1 -0
- 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/notify.js +8 -15
- package/dist/notify.js.map +1 -1
- package/dist/pick-folder.d.ts +9 -0
- package/dist/pick-folder.d.ts.map +1 -0
- package/dist/pick-folder.js +49 -0
- package/dist/pick-folder.js.map +1 -0
- package/dist/registry.d.ts +7 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +45 -6
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +198 -22
- package/dist/server.js.map +1 -1
- package/dist/snapshot.d.ts.map +1 -1
- package/dist/snapshot.js +16 -0
- package/dist/snapshot.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/dist/Prism.app/Contents/Info.plist +0 -16
- package/dist/Prism.app/Contents/MacOS/prism-notify +0 -0
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<title>Prism Dispatch</title>
|
|
7
7
|
<link rel="icon" href="/assets/prism-mark.png" />
|
|
8
|
-
<link rel="stylesheet" href="/assets/hub.css" />
|
|
8
|
+
<link rel="stylesheet" href="/assets/hub.css?v=mtralwh5" />
|
|
9
9
|
</head>
|
|
10
10
|
<body class="prism-theme">
|
|
11
11
|
<div id="root"></div>
|
|
12
|
-
<script type="module" src="/assets/app.js"></script>
|
|
12
|
+
<script type="module" src="/assets/app.js?v=mtralwh5"></script>
|
|
13
13
|
</body>
|
|
14
14
|
</html>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type HostTelemetry = {
|
|
2
|
+
readonly cpu: number | undefined;
|
|
3
|
+
readonly memUsed: number | undefined;
|
|
4
|
+
readonly memTotal: number | undefined;
|
|
5
|
+
readonly diskUsed: number | undefined;
|
|
6
|
+
readonly diskTotal: number | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare function readHostTelemetry(diskPath?: string): Promise<HostTelemetry>;
|
|
9
|
+
//# sourceMappingURL=host-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-telemetry.d.ts","sourceRoot":"","sources":["../src/host-telemetry.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,QAAQ,GAAE,MAAsB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { cpus, freemem, totalmem } from "node:os";
|
|
2
|
+
import { statfs } from "node:fs/promises";
|
|
3
|
+
export async function readHostTelemetry(diskPath = process.cwd()) {
|
|
4
|
+
const memTotal = totalmem();
|
|
5
|
+
const memFree = freemem();
|
|
6
|
+
let diskUsed;
|
|
7
|
+
let diskTotal;
|
|
8
|
+
try {
|
|
9
|
+
const disk = await statfs(diskPath);
|
|
10
|
+
diskTotal = Number(disk.blocks) * Number(disk.bsize);
|
|
11
|
+
const free = Number(disk.bavail) * Number(disk.bsize);
|
|
12
|
+
diskUsed = diskTotal - free;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
diskUsed = undefined;
|
|
16
|
+
diskTotal = undefined;
|
|
17
|
+
}
|
|
18
|
+
const load = cpus().reduce((sum, cpu) => {
|
|
19
|
+
const total = Object.values(cpu.times).reduce((a, b) => a + b, 0);
|
|
20
|
+
return sum + (total === 0 ? 0 : 1 - cpu.times.idle / total);
|
|
21
|
+
}, 0);
|
|
22
|
+
return {
|
|
23
|
+
cpu: cpus().length === 0 ? undefined : (load / cpus().length) * 100,
|
|
24
|
+
memUsed: memTotal - memFree,
|
|
25
|
+
memTotal,
|
|
26
|
+
diskUsed,
|
|
27
|
+
diskTotal,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=host-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-telemetry.js","sourceRoot":"","sources":["../src/host-telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAU1C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAEhC,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;IAC1B,IAAI,QAA4B,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,SAAS,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC9D,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,OAAO;QACL,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,GAAG;QACnE,OAAO,EAAE,QAAQ,GAAG,OAAO;QAC3B,QAAQ;QACR,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { formatJobFinishedNotice, type JobNoticeCopy } from "./notice.js";
|
|
|
6
6
|
export { originAllowed, tokenFromRequest, tokensMatch } from "./auth.js";
|
|
7
7
|
export { diffJobs, collectJobs, isInFlight, isTerminal } from "./watch.js";
|
|
8
8
|
export { toSnapshot } from "./snapshot.js";
|
|
9
|
-
export { registerWorkspace, workspaceLabel, loadRegistry } from "./registry.js";
|
|
9
|
+
export { registerWorkspace, unregisterWorkspace, workspaceLabel, loadRegistry, } from "./registry.js";
|
|
10
10
|
export { buildStatusline, formatStatusline, parseStatuslineStdin, statuslineSetupSnippet, } from "./statusline.js";
|
|
11
11
|
export { readHubRecord, newHubToken } from "./hub-record.js";
|
|
12
12
|
export type { HubEvent, HubRecord, JobSnapshot, WorkspaceEntry, } from "./types.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,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,
|
|
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,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,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
|
@@ -6,7 +6,7 @@ export { formatJobFinishedNotice } from "./notice.js";
|
|
|
6
6
|
export { originAllowed, tokenFromRequest, tokensMatch } from "./auth.js";
|
|
7
7
|
export { diffJobs, collectJobs, isInFlight, isTerminal } from "./watch.js";
|
|
8
8
|
export { toSnapshot } from "./snapshot.js";
|
|
9
|
-
export { registerWorkspace, workspaceLabel, loadRegistry } from "./registry.js";
|
|
9
|
+
export { registerWorkspace, unregisterWorkspace, workspaceLabel, loadRegistry, } from "./registry.js";
|
|
10
10
|
export { buildStatusline, formatStatusline, parseStatuslineStdin, statuslineSetupSnippet, } from "./statusline.js";
|
|
11
11
|
export { readHubRecord, newHubToken } from "./hub-record.js";
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
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,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,
|
|
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,EACL,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/notify.js
CHANGED
|
@@ -60,28 +60,21 @@ async function notifyDarwin(copy, url, run) {
|
|
|
60
60
|
const script = `display notification ${osa(copy.body)} with title "Prism" subtitle ${osa(copy.title)}`;
|
|
61
61
|
await run("osascript", ["-e", script], { timeout: 4_000 });
|
|
62
62
|
}
|
|
63
|
-
function
|
|
63
|
+
function darwinNotifyHelperBin() {
|
|
64
64
|
if (process.platform !== "darwin")
|
|
65
65
|
return undefined;
|
|
66
66
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
return existsSync(bin) ? app : undefined;
|
|
67
|
+
const bin = join(here, "Prism.app", "Contents", "MacOS", "prism-notify");
|
|
68
|
+
return existsSync(bin) ? bin : undefined;
|
|
70
69
|
}
|
|
71
70
|
function notifyDarwinHelper(copy, url) {
|
|
72
|
-
const
|
|
73
|
-
if (!
|
|
71
|
+
const bin = darwinNotifyHelperBin();
|
|
72
|
+
if (!bin)
|
|
74
73
|
return false;
|
|
75
74
|
try {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
app,
|
|
80
|
-
"--args",
|
|
81
|
-
copy.title,
|
|
82
|
-
copy.body,
|
|
83
|
-
httpConsoleUrl(url) ?? "",
|
|
84
|
-
], { detached: true, stdio: "ignore" });
|
|
75
|
+
// Spawn the helper binary, not `open Prism.app`. Activating the .app is
|
|
76
|
+
// what made Notification Center's Show button reveal Finder.
|
|
77
|
+
const child = spawn(bin, [copy.title, copy.body, httpConsoleUrl(url) ?? ""], { detached: true, stdio: "ignore" });
|
|
85
78
|
child.unref();
|
|
86
79
|
return true;
|
|
87
80
|
}
|
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,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,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,IAAI,GAAG,KAAK,aAAa,IAAI,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC3D,OAAO;gBACT,CAAC;gBACD,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;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAmB,EACnB,GAAY;IAEZ,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,OAAO;QACP,UAAU;QACV,IAAI,CAAC,IAAI;QACT,WAAW;QACX,IAAI,CAAC,KAAK;KACX,CAAC;IACF,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,IAAmB,EACnB,GAAuB,EACvB,GAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YAC5D,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,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,SAAS,
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ExecFileFn = (file: string, args: readonly string[], options?: {
|
|
2
|
+
timeout?: number;
|
|
3
|
+
}) => Promise<{
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr?: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function pickLocalFolder(platform?: NodeJS.Platform, run?: ExecFileFn): Promise<string | undefined>;
|
|
8
|
+
export declare function normalizeDir(raw: string): string | undefined;
|
|
9
|
+
//# sourceMappingURL=pick-folder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick-folder.d.ts","sourceRoot":"","sources":["../src/pick-folder.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAC3B,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElD,wBAAsB,eAAe,CACnC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,UAGJ,GACA,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAyC7B;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native folder picker for "Select repository…" in the Console.
|
|
3
|
+
*
|
|
4
|
+
* The browser cannot give us an absolute path (`showDirectoryPicker` is
|
|
5
|
+
* origin-scoped). The hub runs on the user's machine, so it can open the
|
|
6
|
+
* platform dialog and return the POSIX path we then register.
|
|
7
|
+
*/
|
|
8
|
+
import { execFile } from "node:child_process";
|
|
9
|
+
import { promisify } from "node:util";
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
export async function pickLocalFolder(platform = process.platform, run = async (file, args, options) => {
|
|
12
|
+
const result = await execFileAsync(file, [...args], options);
|
|
13
|
+
return { stdout: String(result.stdout), stderr: String(result.stderr) };
|
|
14
|
+
}) {
|
|
15
|
+
try {
|
|
16
|
+
if (platform === "darwin") {
|
|
17
|
+
const { stdout } = await run("osascript", [
|
|
18
|
+
"-e",
|
|
19
|
+
'POSIX path of (choose folder with prompt "Select a Prism repository")',
|
|
20
|
+
], { timeout: 300_000 });
|
|
21
|
+
return normalizeDir(stdout);
|
|
22
|
+
}
|
|
23
|
+
if (platform === "linux") {
|
|
24
|
+
const { stdout } = await run("zenity", [
|
|
25
|
+
"--file-selection",
|
|
26
|
+
"--directory",
|
|
27
|
+
"--title=Select a Prism repository",
|
|
28
|
+
], { timeout: 300_000 });
|
|
29
|
+
return normalizeDir(stdout);
|
|
30
|
+
}
|
|
31
|
+
if (platform === "win32") {
|
|
32
|
+
const { stdout } = await run("powershell", [
|
|
33
|
+
"-NoProfile",
|
|
34
|
+
"-Command",
|
|
35
|
+
"Add-Type -AssemblyName System.Windows.Forms; $d = New-Object System.Windows.Forms.FolderBrowserDialog; $d.Description = 'Select a Prism repository'; if ($d.ShowDialog() -eq 'OK') { Write-Output $d.SelectedPath }",
|
|
36
|
+
], { timeout: 300_000 });
|
|
37
|
+
return normalizeDir(stdout);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
export function normalizeDir(raw) {
|
|
46
|
+
const path = raw.trim().replace(/[/\\]+$/, "");
|
|
47
|
+
return path.length > 0 ? path : undefined;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=pick-folder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pick-folder.js","sourceRoot":"","sources":["../src/pick-folder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAQ1C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAA4B,OAAO,CAAC,QAAQ,EAC5C,MAAkB,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1E,CAAC;IAED,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,WAAW,EACX;gBACE,IAAI;gBACJ,uEAAuE;aACxE,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CAAC;YACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,QAAQ,EACR;gBACE,kBAAkB;gBAClB,aAAa;gBACb,mCAAmC;aACpC,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CAAC;YACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,YAAY,EACZ;gBACE,YAAY;gBACZ,UAAU;gBACV,qNAAqN;aACtN,EACD,EAAE,OAAO,EAAE,OAAO,EAAE,CACrB,CAAC;YACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { type HubEnv } from "./paths.js";
|
|
2
2
|
import type { WorkspaceEntry } from "./types.js";
|
|
3
3
|
export declare function workspaceLabel(path: string): string;
|
|
4
|
+
/** Test fixtures under packages/.../fixtures — not user checkouts. */
|
|
5
|
+
export declare function isFixtureWorkspacePath(path: string): boolean;
|
|
6
|
+
export declare function isNestedWorkspace(path: string, parent: string): boolean;
|
|
7
|
+
/** Keep top-level checkouts. Drop nested folders and intelligence fixtures. */
|
|
8
|
+
export declare function pruneHubWorkspaces(workspaces: readonly WorkspaceEntry[]): WorkspaceEntry[];
|
|
4
9
|
export declare function loadRegistry(env?: HubEnv): Promise<WorkspaceEntry[]>;
|
|
5
10
|
export declare function saveRegistry(workspaces: readonly WorkspaceEntry[], env?: HubEnv): Promise<void>;
|
|
6
11
|
export declare function registerWorkspace(path: string, env?: HubEnv, now?: () => string): Promise<WorkspaceEntry[]>;
|
|
12
|
+
/** Drop a checkout from the Console. Does not delete the tree or its jobs. */
|
|
13
|
+
export declare function unregisterWorkspace(path: string, env?: HubEnv): Promise<WorkspaceEntry[]>;
|
|
7
14
|
export declare function dropMissingWorkspaces(exists: (path: string) => Promise<boolean>, env?: HubEnv): Promise<WorkspaceEntry[]>;
|
|
8
15
|
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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;AAMD,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAMvE;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,cAAc,EAAE,GACpC,cAAc,EAAE,CAUlB;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,CAmB3B;AAED,8EAA8E;AAC9E,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAO3B;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,CAc3B"}
|
package/dist/registry.js
CHANGED
|
@@ -1,9 +1,29 @@
|
|
|
1
|
-
import { basename } from "node:path";
|
|
1
|
+
import { basename, resolve, sep } from "node:path";
|
|
2
2
|
import { readJsonFile, writeJsonFile } from "./json-file.js";
|
|
3
3
|
import { hubHome, hubRegistryPath } from "./paths.js";
|
|
4
4
|
export function workspaceLabel(path) {
|
|
5
5
|
return basename(path.replace(/[/\\]+$/, "")) || path;
|
|
6
6
|
}
|
|
7
|
+
function resolvedPath(path) {
|
|
8
|
+
return resolve(path).replace(/[/\\]+$/, "");
|
|
9
|
+
}
|
|
10
|
+
/** Test fixtures under packages/.../fixtures — not user checkouts. */
|
|
11
|
+
export function isFixtureWorkspacePath(path) {
|
|
12
|
+
return /(?:^|[/\\])(?:packages|apps)[/\\][^/\\]+[/\\]fixtures[/\\]/.test(path.replace(/\\/g, "/"));
|
|
13
|
+
}
|
|
14
|
+
export function isNestedWorkspace(path, parent) {
|
|
15
|
+
const child = resolvedPath(path);
|
|
16
|
+
const root = resolvedPath(parent);
|
|
17
|
+
if (child === root)
|
|
18
|
+
return false;
|
|
19
|
+
const prefix = root.endsWith(sep) ? root : root + sep;
|
|
20
|
+
return child.startsWith(prefix);
|
|
21
|
+
}
|
|
22
|
+
/** Keep top-level checkouts. Drop nested folders and intelligence fixtures. */
|
|
23
|
+
export function pruneHubWorkspaces(workspaces) {
|
|
24
|
+
const withoutFixtures = workspaces.filter((entry) => !isFixtureWorkspacePath(entry.path));
|
|
25
|
+
return withoutFixtures.filter((entry) => !withoutFixtures.some((other) => isNestedWorkspace(entry.path, other.path)));
|
|
26
|
+
}
|
|
7
27
|
export async function loadRegistry(env = process.env) {
|
|
8
28
|
const file = await readJsonFile(hubRegistryPath(hubHome(env)), { workspaces: [] });
|
|
9
29
|
return [...(file.workspaces ?? [])];
|
|
@@ -16,25 +36,44 @@ export async function registerWorkspace(path, env = process.env, now = () => new
|
|
|
16
36
|
if (!root)
|
|
17
37
|
return loadRegistry(env);
|
|
18
38
|
const current = await loadRegistry(env);
|
|
19
|
-
|
|
39
|
+
if (isFixtureWorkspacePath(root)) {
|
|
40
|
+
const kept = pruneHubWorkspaces(current);
|
|
41
|
+
if (kept.length !== current.length)
|
|
42
|
+
await saveRegistry(kept, env);
|
|
43
|
+
return kept;
|
|
44
|
+
}
|
|
45
|
+
const next = pruneHubWorkspaces([
|
|
20
46
|
...current.filter((entry) => entry.path !== root),
|
|
21
47
|
{
|
|
22
48
|
path: root,
|
|
23
49
|
label: workspaceLabel(root),
|
|
24
50
|
lastSeenAt: now(),
|
|
25
51
|
},
|
|
26
|
-
];
|
|
52
|
+
]);
|
|
27
53
|
await saveRegistry(next, env);
|
|
28
54
|
return next;
|
|
29
55
|
}
|
|
56
|
+
/** Drop a checkout from the Console. Does not delete the tree or its jobs. */
|
|
57
|
+
export async function unregisterWorkspace(path, env = process.env) {
|
|
58
|
+
const root = resolvedPath(path.trim());
|
|
59
|
+
if (!root)
|
|
60
|
+
return loadRegistry(env);
|
|
61
|
+
const current = await loadRegistry(env);
|
|
62
|
+
const next = current.filter((entry) => resolvedPath(entry.path) !== root);
|
|
63
|
+
if (next.length !== current.length)
|
|
64
|
+
await saveRegistry(next, env);
|
|
65
|
+
return next;
|
|
66
|
+
}
|
|
30
67
|
export async function dropMissingWorkspaces(exists, env = process.env) {
|
|
31
68
|
const current = await loadRegistry(env);
|
|
32
|
-
const
|
|
69
|
+
const present = [];
|
|
33
70
|
for (const entry of current) {
|
|
34
71
|
if (await exists(entry.path))
|
|
35
|
-
|
|
72
|
+
present.push(entry);
|
|
36
73
|
}
|
|
37
|
-
|
|
74
|
+
const kept = pruneHubWorkspaces(present);
|
|
75
|
+
if (kept.length !== current.length ||
|
|
76
|
+
kept.some((entry, index) => entry.path !== current[index]?.path)) {
|
|
38
77
|
await saveRegistry(kept, env);
|
|
39
78
|
}
|
|
40
79
|
return kept;
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { type WorkerBackend, type WorkerModelOption } from "@repo-prism/dispatch";
|
|
1
2
|
import { type IntelligencePlane } from "./intelligence.js";
|
|
2
3
|
import { type NotifyFn } from "./notify.js";
|
|
3
4
|
import { type HubEnv } from "./paths.js";
|
|
4
5
|
import type { HubRecord } from "./types.js";
|
|
5
6
|
export type JobControlFn = (workspacePath: string, jobId: string, action: string, extra?: {
|
|
6
7
|
readonly path?: string;
|
|
8
|
+
readonly context?: string;
|
|
7
9
|
}) => Promise<unknown>;
|
|
10
|
+
export type JobStartFn = (workspacePath: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
8
11
|
export type HubOptions = {
|
|
9
12
|
readonly env?: HubEnv;
|
|
10
13
|
readonly notify?: NotifyFn;
|
|
@@ -12,11 +15,18 @@ export type HubOptions = {
|
|
|
12
15
|
readonly pollMs?: number;
|
|
13
16
|
readonly assetsDir?: string;
|
|
14
17
|
readonly control?: JobControlFn;
|
|
18
|
+
readonly startJob?: JobStartFn;
|
|
15
19
|
readonly version?: string;
|
|
16
20
|
/** Injected in tests; production drains through `@repo-prism/dispatch`. */
|
|
17
21
|
readonly drain?: (workspacePath: string) => Promise<void>;
|
|
18
22
|
/** Injected in tests; production lazily imports Core (ADR-0048). */
|
|
19
23
|
readonly intelligence?: IntelligencePlane;
|
|
24
|
+
/** Injected in tests; production opens the native folder picker. */
|
|
25
|
+
readonly pickFolder?: () => Promise<string | undefined>;
|
|
26
|
+
/** Injected in tests; production asks the selected agent for its model list. */
|
|
27
|
+
readonly listWorkerModels?: (input: {
|
|
28
|
+
readonly backend: WorkerBackend;
|
|
29
|
+
}) => Promise<readonly WorkerModelOption[]>;
|
|
20
30
|
};
|
|
21
31
|
export type StartedHub = {
|
|
22
32
|
readonly record: HubRecord;
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAiBL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAS9B,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAShE,OAAO,KAAK,EAEV,SAAS,EAIV,MAAM,YAAY,CAAC;AAiBpB,MAAM,MAAM,YAAY,GAAG,CACzB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,MAAM,UAAU,GAAG,CACvB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,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,QAAQ,CAAC,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,oEAAoE;IACpE,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAC1C,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,gFAAgF;IAChF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE;QAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;KACjC,KAAK,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CAC7C,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;AAkEF,wBAAsB,QAAQ,CAC5B,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,UAAU,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC,CAkoBhD"}
|