@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
package/dist/snapshot.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { workspaceLabel } from "./registry.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Chat-safe job row. Never includes a worktree path (ADR-0039).
|
|
4
|
+
*
|
|
5
|
+
* Deliberately carries **no computed duration** (M-067 P-S1). The server used
|
|
6
|
+
* to send `elapsedMs`, which broke three ways at once: it only changed when a
|
|
7
|
+
* job's snapshot key changed, so it froze and then jumped; every snapshot
|
|
8
|
+
* recomputed *all* rows against `Date.now()`, so a finished job's time kept
|
|
9
|
+
* growing whenever any unrelated job updated; and the statusline measured from
|
|
10
|
+
* a different field, so one job showed two durations in two places.
|
|
11
|
+
*
|
|
12
|
+
* Shipping the raw timestamps and letting each client tick locally through
|
|
13
|
+
* `jobDurations` in `@repo-prism/shared` removes all three at once.
|
|
14
|
+
*/
|
|
15
|
+
export function toSnapshot(job, workspacePath) {
|
|
10
16
|
return {
|
|
11
17
|
id: job.id,
|
|
12
18
|
title: job.title,
|
|
@@ -22,9 +28,29 @@ export function toSnapshot(job, workspacePath, now = Date.now()) {
|
|
|
22
28
|
? { verificationDetail: job.verificationDetail }
|
|
23
29
|
: {}),
|
|
24
30
|
...(job.commitSha ? { commitSha: job.commitSha } : {}),
|
|
31
|
+
// Without this the board can show that a job finished but never what it
|
|
32
|
+
// changed, which is the one thing a reviewer needs.
|
|
33
|
+
...(job.review ? { review: job.review } : {}),
|
|
34
|
+
...(job.nextStep ? { nextStep: job.nextStep } : {}),
|
|
35
|
+
// Whether a teammate is in your working tree is not a detail: it is the
|
|
36
|
+
// difference between "safe to keep editing" and "do not touch this repo".
|
|
37
|
+
...(job.placement ? { placement: job.placement } : {}),
|
|
38
|
+
...(job.worktreePath ? { worktreePath: job.worktreePath } : {}),
|
|
39
|
+
...(job.waitingOn ? { waitingOn: job.waitingOn } : {}),
|
|
40
|
+
...(job.lastHeartbeat ? { lastHeartbeat: job.lastHeartbeat } : {}),
|
|
41
|
+
// The gate question travels with the row so the board can render a Confirm
|
|
42
|
+
// action instead of the job silently never starting (ADR-0047).
|
|
43
|
+
...(job.confirm ? { confirm: job.confirm } : {}),
|
|
25
44
|
createdAt: job.createdAt,
|
|
45
|
+
...(job.queuedAt ? { queuedAt: job.queuedAt } : {}),
|
|
46
|
+
...(job.startedAt ? { startedAt: job.startedAt } : {}),
|
|
47
|
+
...(job.finishedAt ? { finishedAt: job.finishedAt } : {}),
|
|
26
48
|
updatedAt: job.updatedAt,
|
|
27
|
-
|
|
49
|
+
...(job.workerBackend ? { workerBackend: job.workerBackend } : {}),
|
|
50
|
+
...(job.workerModel ? { workerModel: job.workerModel } : {}),
|
|
51
|
+
...(job.workerThinking ? { workerThinking: job.workerThinking } : {}),
|
|
52
|
+
...(job.notes?.length ? { notes: job.notes } : {}),
|
|
53
|
+
...(job.citedMissing?.length ? { citedMissing: job.citedMissing } : {}),
|
|
28
54
|
};
|
|
29
55
|
}
|
|
30
56
|
export function snapshotKey(job) {
|
|
@@ -34,6 +60,10 @@ export function snapshotKey(job) {
|
|
|
34
60
|
job.lastActivity,
|
|
35
61
|
job.verification ?? "",
|
|
36
62
|
job.commitSha ?? "",
|
|
63
|
+
// A review arriving is a visible change; leaving it out of the key means
|
|
64
|
+
// the board would not re-render when the file list lands.
|
|
65
|
+
job.review ? String(job.review.files.length) : "",
|
|
66
|
+
job.review?.keptPaths?.length ? String(job.review.keptPaths.length) : "",
|
|
37
67
|
job.updatedAt,
|
|
38
68
|
].join(":");
|
|
39
69
|
}
|
package/dist/snapshot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/statusline.d.ts
CHANGED
|
@@ -28,6 +28,8 @@ export declare function formatStatusline(current: readonly JobRecord[], others:
|
|
|
28
28
|
* a quiet footer is the correct default.
|
|
29
29
|
*/
|
|
30
30
|
export declare function buildStatusline(stdinRaw: string, env?: HubEnv): Promise<string>;
|
|
31
|
+
/** Jobs parked on a gate need naming, or the user waits for something that will never move. */
|
|
32
|
+
export declare function confirmCount(jobs: readonly JobRecord[]): number;
|
|
31
33
|
/** The settings.json block Claude Code needs, for `statusline --setup`. */
|
|
32
34
|
export declare function statuslineSetupSnippet(): string;
|
|
33
35
|
//# sourceMappingURL=statusline.d.ts.map
|
package/dist/statusline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"statusline.d.ts","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAQjE;AAuBD,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,SAAS,EAAE,EAC7B,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,GAAG,SAAa,GACf,MAAM,CAwCR;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED,+FAA+F;AAC/F,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAE/D;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,IAAI,MAAM,CAa/C"}
|
package/dist/statusline.js
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* Claude Code pipes session JSON on stdin; we use `workspace.current_dir` to
|
|
10
10
|
* put the repo you're sitting in first.
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { isLiveJobStatus, reapJobs, } from "@repo-prism/dispatch";
|
|
13
|
+
import { formatDuration, primaryDurationMs } from "@repo-prism/shared";
|
|
13
14
|
import { loadRegistry } from "./registry.js";
|
|
14
15
|
export function parseStatuslineStdin(raw) {
|
|
15
16
|
try {
|
|
@@ -27,11 +28,17 @@ function isAwaitingReview(job) {
|
|
|
27
28
|
function isFailed(job) {
|
|
28
29
|
return job.status === "error";
|
|
29
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* The same duration the board shows for the same job (M-067 P-S1).
|
|
33
|
+
*
|
|
34
|
+
* This used to measure from `updatedAt` while the board measured from
|
|
35
|
+
* `createdAt`, so a single job displayed two different times depending on
|
|
36
|
+
* where you looked. Both now go through `primaryDurationMs`, and both show
|
|
37
|
+
* seconds — the old `formatStallDuration` floored to whole minutes, so a
|
|
38
|
+
* 40-second job read as `0m`.
|
|
39
|
+
*/
|
|
30
40
|
function elapsed(job, now) {
|
|
31
|
-
|
|
32
|
-
if (!Number.isFinite(started))
|
|
33
|
-
return "";
|
|
34
|
-
return formatStallDuration(Math.max(0, now - started));
|
|
41
|
+
return formatDuration(primaryDurationMs(job, now)) ?? "";
|
|
35
42
|
}
|
|
36
43
|
/** One line, ≤ ~120 chars, ADR-0039 voice: titles, never paths. */
|
|
37
44
|
export function formatStatusline(current, others, now = Date.now()) {
|
|
@@ -50,6 +57,13 @@ export function formatStatusline(current, others, now = Date.now()) {
|
|
|
50
57
|
if (live.length > 1)
|
|
51
58
|
parts.push(`+${live.length - 1} running`);
|
|
52
59
|
}
|
|
60
|
+
// A gated job will never move on its own, so it outranks a review in the
|
|
61
|
+
// footer: the user is the only thing that can unblock it.
|
|
62
|
+
for (const gated of current
|
|
63
|
+
.filter((row) => row.status === "needs_confirm")
|
|
64
|
+
.slice(0, 2)) {
|
|
65
|
+
parts.push(`? ${gated.title || gated.id} needs your OK`);
|
|
66
|
+
}
|
|
53
67
|
for (const job of review.slice(0, 2)) {
|
|
54
68
|
parts.push(`✓ ${job.title || job.id} ready for review`);
|
|
55
69
|
}
|
|
@@ -89,6 +103,10 @@ export async function buildStatusline(stdinRaw, env = process.env) {
|
|
|
89
103
|
}
|
|
90
104
|
return formatStatusline(current, others);
|
|
91
105
|
}
|
|
106
|
+
/** Jobs parked on a gate need naming, or the user waits for something that will never move. */
|
|
107
|
+
export function confirmCount(jobs) {
|
|
108
|
+
return jobs.filter((job) => job.status === "needs_confirm").length;
|
|
109
|
+
}
|
|
92
110
|
/** The settings.json block Claude Code needs, for `statusline --setup`. */
|
|
93
111
|
export function statuslineSetupSnippet() {
|
|
94
112
|
return JSON.stringify({
|
package/dist/statusline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"statusline.js","sourceRoot":"","sources":["../src/statusline.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { JobRecord } from "@repo-prism/dispatch";
|
|
1
|
+
import type { JobConfirm, JobRecord, JobReview } from "@repo-prism/dispatch";
|
|
2
2
|
export type JobStatus = JobRecord["status"];
|
|
3
|
+
export type { JobConfirm, JobReview };
|
|
3
4
|
export type HubRecord = {
|
|
4
5
|
readonly port: number;
|
|
5
6
|
readonly pid: number;
|
|
@@ -28,13 +29,70 @@ export type JobSnapshot = {
|
|
|
28
29
|
readonly verification?: "passed" | "failed" | "skipped";
|
|
29
30
|
readonly verificationDetail?: string;
|
|
30
31
|
readonly commitSha?: string;
|
|
32
|
+
/** What the job left for review. The board cannot show files without it. */
|
|
33
|
+
readonly review?: JobReview;
|
|
34
|
+
readonly nextStep?: string;
|
|
35
|
+
/** checkout = editing your working tree; worktree = isolated branch. */
|
|
36
|
+
readonly placement?: JobRecord["placement"];
|
|
37
|
+
/**
|
|
38
|
+
* Where the job's branch is checked out on disk.
|
|
39
|
+
*
|
|
40
|
+
* ADR-0039 keeps paths out of *chat*, because a spoken path is noise. A job
|
|
41
|
+
* detail is the opposite case: it is the one place someone needs the path,
|
|
42
|
+
* to go look at the branch themselves.
|
|
43
|
+
*/
|
|
44
|
+
readonly worktreePath?: string;
|
|
45
|
+
/** Why a job is waiting, e.g. "stalled". */
|
|
46
|
+
readonly waitingOn?: string;
|
|
47
|
+
/**
|
|
48
|
+
* When the worker last wrote output. The evidence behind a `running` badge:
|
|
49
|
+
* a status alone cannot say whether the process is still doing anything.
|
|
50
|
+
*/
|
|
51
|
+
readonly lastHeartbeat?: string;
|
|
52
|
+
/** The gate this job is parked on, when status is `needs_confirm`. */
|
|
53
|
+
readonly confirm?: JobConfirm;
|
|
54
|
+
/**
|
|
55
|
+
* Raw timestamps only — no server-computed duration (M-067 P-S1). Clients
|
|
56
|
+
* tick locally via `jobDurations` from `@repo-prism/shared`, which is what
|
|
57
|
+
* makes a running job advance smoothly and a finished job stay put.
|
|
58
|
+
*/
|
|
31
59
|
readonly createdAt: string;
|
|
60
|
+
readonly queuedAt?: string;
|
|
61
|
+
readonly startedAt?: string;
|
|
62
|
+
readonly finishedAt?: string;
|
|
32
63
|
readonly updatedAt: string;
|
|
33
|
-
|
|
64
|
+
/** Agent CLI that ran this job. Absent on older records. */
|
|
65
|
+
readonly workerBackend?: JobRecord["workerBackend"];
|
|
66
|
+
/** Model id the worker reported. */
|
|
67
|
+
readonly workerModel?: string;
|
|
68
|
+
/** Thinking / effort the worker reported. */
|
|
69
|
+
readonly workerThinking?: string;
|
|
70
|
+
/** Write-ups under `.prism/dispatch/notes/`. */
|
|
71
|
+
readonly notes?: readonly string[];
|
|
72
|
+
/** Cited paths the agent claimed but did not write. */
|
|
73
|
+
readonly citedMissing?: readonly string[];
|
|
74
|
+
};
|
|
75
|
+
/** A workspace the Console could not read, and why. */
|
|
76
|
+
export type WorkspaceError = {
|
|
77
|
+
readonly workspacePath: string;
|
|
78
|
+
readonly label: string;
|
|
79
|
+
readonly detail: string;
|
|
34
80
|
};
|
|
35
81
|
export type HubEvent = {
|
|
36
82
|
readonly type: "snapshot";
|
|
37
83
|
readonly jobs: readonly JobSnapshot[];
|
|
84
|
+
/**
|
|
85
|
+
* When this list was read. The client shows it, and marks itself stale
|
|
86
|
+
* when SSE drops, rather than presenting a frozen list as current
|
|
87
|
+
* (ADR-0048).
|
|
88
|
+
*/
|
|
89
|
+
readonly asOf: string;
|
|
90
|
+
/**
|
|
91
|
+
* Workspaces that failed to read. These used to be swallowed, so a repo
|
|
92
|
+
* whose `.prism/dispatch` went unreadable looked exactly like a repo
|
|
93
|
+
* with no jobs.
|
|
94
|
+
*/
|
|
95
|
+
readonly errors: readonly WorkspaceError[];
|
|
38
96
|
} | {
|
|
39
97
|
readonly type: "job.updated";
|
|
40
98
|
readonly job: JobSnapshot;
|
|
@@ -42,6 +100,9 @@ export type HubEvent = {
|
|
|
42
100
|
readonly type: "job.finished";
|
|
43
101
|
readonly job: JobSnapshot;
|
|
44
102
|
readonly notice: string;
|
|
103
|
+
} | {
|
|
104
|
+
readonly type: "job.removed";
|
|
105
|
+
readonly job: JobSnapshot;
|
|
45
106
|
};
|
|
46
107
|
export declare const IN_FLIGHT_STATUSES: readonly JobStatus[];
|
|
47
108
|
export declare const TERMINAL_STATUSES: readonly JobStatus[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export const IN_FLIGHT_STATUSES = [
|
|
2
|
+
// Accepted work the user is waiting on, whether or not a process exists yet.
|
|
3
|
+
// `queued` and `needs_confirm` belong here: leaving them out is what let the
|
|
4
|
+
// header say "nothing running" above a list with rows in it.
|
|
5
|
+
"queued",
|
|
6
|
+
"needs_confirm",
|
|
2
7
|
"ready",
|
|
3
8
|
"booting",
|
|
4
9
|
"running",
|
|
@@ -9,5 +14,9 @@ export const TERMINAL_STATUSES = [
|
|
|
9
14
|
"done",
|
|
10
15
|
"error",
|
|
11
16
|
"cancelled",
|
|
17
|
+
// The teammate has stopped and is waiting on a human decision. Leaving this
|
|
18
|
+
// out meant the one state that needs you never raised a finish notification,
|
|
19
|
+
// and the hub could idle out while a review sat unread.
|
|
20
|
+
"needs_review",
|
|
12
21
|
];
|
|
13
22
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgHA,MAAM,CAAC,MAAM,kBAAkB,GAAyB;IACtD,6EAA6E;IAC7E,6EAA6E;IAC7E,6DAA6D;IAC7D,QAAQ;IACR,eAAe;IACf,OAAO;IACP,SAAS;IACT,SAAS;IACT,gBAAgB;IAChB,SAAS;CACV,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAyB;IACrD,MAAM;IACN,OAAO;IACP,WAAW;IACX,4EAA4E;IAC5E,6EAA6E;IAC7E,wDAAwD;IACxD,cAAc;CACf,CAAC"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -1,22 +1,39 @@
|
|
|
1
|
-
import { type HubEvent, type JobSnapshot, type WorkspaceEntry } from "./types.js";
|
|
1
|
+
import { type HubEvent, type JobSnapshot, type WorkspaceEntry, type WorkspaceError } from "./types.js";
|
|
2
|
+
export type { WorkspaceError };
|
|
2
3
|
export type WatchEmit = (event: HubEvent) => void;
|
|
4
|
+
export type CollectResult = {
|
|
5
|
+
readonly jobs: JobSnapshot[];
|
|
6
|
+
readonly errors: WorkspaceError[];
|
|
7
|
+
};
|
|
3
8
|
export type WorkspaceWatch = {
|
|
4
|
-
readonly refresh: (
|
|
9
|
+
readonly refresh: (opts?: {
|
|
10
|
+
drain?: boolean;
|
|
11
|
+
}) => Promise<void>;
|
|
5
12
|
readonly close: () => void;
|
|
6
13
|
readonly jobs: () => readonly JobSnapshot[];
|
|
14
|
+
readonly errors: () => readonly WorkspaceError[];
|
|
15
|
+
/** When the last successful read completed — the board's "as of" time. */
|
|
16
|
+
readonly asOf: () => string;
|
|
7
17
|
};
|
|
8
18
|
declare function pathExists(path: string): Promise<boolean>;
|
|
9
19
|
export declare function isInFlight(job: JobSnapshot): boolean;
|
|
10
20
|
export declare function isTerminal(job: JobSnapshot): boolean;
|
|
11
|
-
export declare function collectJobs(workspaces: readonly WorkspaceEntry[], now?: number): Promise<JobSnapshot[]>;
|
|
12
21
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
22
|
+
* Read every registered workspace.
|
|
23
|
+
*
|
|
24
|
+
* Failures are **reported, not swallowed** (M-067 P-S2 data integrity). The
|
|
25
|
+
* old empty `catch` meant a repo whose `.prism/dispatch` had gone unreadable
|
|
26
|
+
* simply vanished from the board with no explanation — indistinguishable from
|
|
27
|
+
* a repo with no jobs. Now the caller gets the error and the UI can say which
|
|
28
|
+
* workspace it could not read.
|
|
15
29
|
*/
|
|
30
|
+
export declare function collectJobs(workspaces: readonly WorkspaceEntry[]): Promise<CollectResult>;
|
|
16
31
|
export declare function diffJobs(previous: readonly JobSnapshot[], next: readonly JobSnapshot[], seenFinished: Set<string>): HubEvent[];
|
|
17
32
|
export declare function watchWorkspaces(getWorkspaces: () => readonly WorkspaceEntry[], emit: WatchEmit, options?: {
|
|
18
33
|
readonly debounceMs?: number | undefined;
|
|
19
34
|
readonly pollMs?: number | undefined;
|
|
35
|
+
/** Advance the job queue for one workspace before reading it (ADR-0047). */
|
|
36
|
+
readonly drain?: ((workspacePath: string) => Promise<void>) | undefined;
|
|
20
37
|
}): WorkspaceWatch;
|
|
21
38
|
export { pathExists };
|
|
22
39
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,cAAc,EAAE,CAAC;AAK/B,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,WAAW,EAAE,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,cAAc,EAAE,CAAC;IACjD,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC;CAC7B,CAAC;AAEF,iBAAe,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOxD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAEpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,SAAS,cAAc,EAAE,GACpC,OAAO,CAAC,aAAa,CAAC,CAkBxB;AAUD,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,IAAI,EAAE,SAAS,WAAW,EAAE,EAC5B,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,QAAQ,EAAE,CA+BZ;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,SAAS,cAAc,EAAE,EAC9C,IAAI,EAAE,SAAS,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACpE,GACL,cAAc,CA8GhB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/watch.js
CHANGED
|
@@ -22,30 +22,48 @@ export function isInFlight(job) {
|
|
|
22
22
|
export function isTerminal(job) {
|
|
23
23
|
return TERMINAL_STATUSES.includes(job.status);
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Read every registered workspace.
|
|
27
|
+
*
|
|
28
|
+
* Failures are **reported, not swallowed** (M-067 P-S2 data integrity). The
|
|
29
|
+
* old empty `catch` meant a repo whose `.prism/dispatch` had gone unreadable
|
|
30
|
+
* simply vanished from the board with no explanation — indistinguishable from
|
|
31
|
+
* a repo with no jobs. Now the caller gets the error and the UI can say which
|
|
32
|
+
* workspace it could not read.
|
|
33
|
+
*/
|
|
34
|
+
export async function collectJobs(workspaces) {
|
|
26
35
|
const jobs = [];
|
|
36
|
+
const errors = [];
|
|
27
37
|
for (const entry of workspaces) {
|
|
28
38
|
try {
|
|
29
39
|
const records = await reapJobs(entry.path);
|
|
30
40
|
for (const record of records) {
|
|
31
|
-
jobs.push(toSnapshot(record, entry.path
|
|
41
|
+
jobs.push(toSnapshot(record, entry.path));
|
|
32
42
|
}
|
|
33
43
|
}
|
|
34
|
-
catch {
|
|
35
|
-
|
|
44
|
+
catch (cause) {
|
|
45
|
+
errors.push({
|
|
46
|
+
workspacePath: entry.path,
|
|
47
|
+
label: entry.label,
|
|
48
|
+
detail: cause instanceof Error ? cause.message : String(cause),
|
|
49
|
+
});
|
|
36
50
|
}
|
|
37
51
|
}
|
|
38
|
-
return jobs;
|
|
52
|
+
return { jobs, errors };
|
|
39
53
|
}
|
|
40
54
|
/**
|
|
41
55
|
* Diff two snapshots. `job.finished` fires once per terminal transition
|
|
42
56
|
* (deduped by workspace+id+status+updatedAt).
|
|
43
57
|
*/
|
|
58
|
+
function jobKey(job) {
|
|
59
|
+
return `${job.workspacePath}:${job.id}`;
|
|
60
|
+
}
|
|
44
61
|
export function diffJobs(previous, next, seenFinished) {
|
|
45
|
-
const prevById = new Map(previous.map((job) => [
|
|
62
|
+
const prevById = new Map(previous.map((job) => [jobKey(job), job]));
|
|
63
|
+
const nextKeys = new Set(next.map(jobKey));
|
|
46
64
|
const events = [];
|
|
47
65
|
for (const job of next) {
|
|
48
|
-
const key =
|
|
66
|
+
const key = jobKey(job);
|
|
49
67
|
const before = prevById.get(key);
|
|
50
68
|
if (!before) {
|
|
51
69
|
events.push({ type: "job.updated", job });
|
|
@@ -66,25 +84,48 @@ export function diffJobs(previous, next, seenFinished) {
|
|
|
66
84
|
}
|
|
67
85
|
}
|
|
68
86
|
}
|
|
87
|
+
for (const job of previous) {
|
|
88
|
+
if (!nextKeys.has(jobKey(job))) {
|
|
89
|
+
events.push({ type: "job.removed", job });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
69
92
|
return events;
|
|
70
93
|
}
|
|
71
94
|
export function watchWorkspaces(getWorkspaces, emit, options = {}) {
|
|
72
95
|
const debounceMs = options.debounceMs ?? DEBOUNCE_MS;
|
|
73
96
|
const pollMs = options.pollMs ?? POLL_MS;
|
|
74
97
|
let snapshots = [];
|
|
98
|
+
let workspaceErrors = [];
|
|
99
|
+
let asOf = new Date().toISOString();
|
|
75
100
|
const seenFinished = new Set();
|
|
76
101
|
const watchers = new Map();
|
|
77
102
|
let timer;
|
|
78
103
|
let poll;
|
|
79
104
|
let closed = false;
|
|
80
|
-
const refresh = async () => {
|
|
105
|
+
const refresh = async (opts) => {
|
|
81
106
|
if (closed)
|
|
82
107
|
return;
|
|
83
|
-
|
|
108
|
+
// Drain before reading, so a queued job becomes a running job in the same
|
|
109
|
+
// tick the board renders (ADR-0047). This is the safety net for jobs whose
|
|
110
|
+
// originating MCP process exited before its own kick landed.
|
|
111
|
+
// Control actions (delete) skip drain so the board does not wait on a
|
|
112
|
+
// worker spawn just to drop a row that is already gone from disk.
|
|
113
|
+
if (opts?.drain !== false && options.drain) {
|
|
114
|
+
for (const entry of getWorkspaces()) {
|
|
115
|
+
await options.drain(entry.path).catch(() => {
|
|
116
|
+
/* a failed drain leaves the job queued; the next tick retries */
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const { jobs: next, errors } = await collectJobs(getWorkspaces());
|
|
84
121
|
const events = diffJobs(snapshots, next, seenFinished);
|
|
122
|
+
const errorsChanged = errors.length !== workspaceErrors.length ||
|
|
123
|
+
errors.some((row, i) => row.detail !== workspaceErrors[i]?.detail);
|
|
85
124
|
snapshots = next;
|
|
86
|
-
|
|
87
|
-
|
|
125
|
+
workspaceErrors = errors;
|
|
126
|
+
asOf = new Date().toISOString();
|
|
127
|
+
if (events.length > 0 || errorsChanged) {
|
|
128
|
+
emit({ type: "snapshot", jobs: next, asOf, errors });
|
|
88
129
|
for (const event of events)
|
|
89
130
|
emit(event);
|
|
90
131
|
}
|
|
@@ -128,12 +169,15 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
|
|
|
128
169
|
}
|
|
129
170
|
};
|
|
130
171
|
void (async () => {
|
|
131
|
-
|
|
172
|
+
const initial = await collectJobs(getWorkspaces());
|
|
173
|
+
snapshots = initial.jobs;
|
|
174
|
+
workspaceErrors = initial.errors;
|
|
175
|
+
asOf = new Date().toISOString();
|
|
132
176
|
for (const job of snapshots) {
|
|
133
177
|
if (isTerminal(job))
|
|
134
178
|
seenFinished.add(finishedKey(job));
|
|
135
179
|
}
|
|
136
|
-
emit({ type: "snapshot", jobs: snapshots });
|
|
180
|
+
emit({ type: "snapshot", jobs: snapshots, asOf, errors: workspaceErrors });
|
|
137
181
|
syncWatchers();
|
|
138
182
|
if (closed)
|
|
139
183
|
return;
|
|
@@ -146,6 +190,8 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
|
|
|
146
190
|
return {
|
|
147
191
|
refresh,
|
|
148
192
|
jobs: () => snapshots,
|
|
193
|
+
errors: () => workspaceErrors,
|
|
194
|
+
asOf: () => asOf,
|
|
149
195
|
close: () => {
|
|
150
196
|
closed = true;
|
|
151
197
|
if (timer)
|
package/dist/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@repo-prism/dispatch-hub",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.17",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Prism Hub — loopback dashboard and OS notifications for Dispatch jobs",
|
|
6
6
|
"exports": {
|
|
@@ -16,15 +16,19 @@
|
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
|
-
"build": "tsc -p tsconfig.json && bun run scripts/build-dashboard.ts",
|
|
19
|
+
"build": "tsc -p tsconfig.json && bun run scripts/build-dashboard.ts && bun run scripts/build-notify.ts",
|
|
20
20
|
"start": "node dist/bin.js",
|
|
21
21
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
22
22
|
"test": "vitest run"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@repo-prism/dispatch": "1.1.
|
|
25
|
+
"@repo-prism/dispatch": "1.1.17",
|
|
26
|
+
"@repo-prism/host-session": "1.1.17",
|
|
27
|
+
"@repo-prism/shared": "1.1.1"
|
|
26
28
|
},
|
|
27
29
|
"devDependencies": {
|
|
30
|
+
"gsap": "^3.15.0",
|
|
31
|
+
"lucide-react": "^1.25.0",
|
|
28
32
|
"@types/react": "^19.2.17",
|
|
29
33
|
"@types/react-dom": "^19.2.3",
|
|
30
34
|
"react": "^19.2.7",
|