@repo-prism/dispatch-hub 1.9.0 → 1.11.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/trees.js ADDED
@@ -0,0 +1,170 @@
1
+ import { resolve } from "node:path";
2
+ import { commitJobWork, defaultGitRunner, discoverWorktrees, gitDirtyPaths, isSkillPlaybook, mergeJobBranch, removeGitWorktree, sameWorktreePath, } from "@repo-prism/dispatch";
3
+ const TREE_JOB_RANK = {
4
+ running: 0,
5
+ booting: 0,
6
+ ready: 0,
7
+ queued: 1,
8
+ needs_confirm: 1,
9
+ paused: 2,
10
+ waiting_on_you: 2,
11
+ blocked: 2,
12
+ failed: 3,
13
+ error: 3,
14
+ needs_review: 4,
15
+ done: 5,
16
+ };
17
+ export function sortTreeJobs(jobs) {
18
+ return [...jobs].sort((a, b) => {
19
+ const rankA = TREE_JOB_RANK[a.status] ?? 6;
20
+ const rankB = TREE_JOB_RANK[b.status] ?? 6;
21
+ return rankA - rankB;
22
+ });
23
+ }
24
+ function treeSortRank(tree) {
25
+ if (tree.kind === "primary")
26
+ return 0;
27
+ const live = tree.jobStatus === "running" ||
28
+ tree.jobStatus === "booting" ||
29
+ tree.jobStatus === "ready";
30
+ if (live)
31
+ return 1;
32
+ if (tree.dirty)
33
+ return 2;
34
+ return 3;
35
+ }
36
+ function samePath(a, b) {
37
+ return sameWorktreePath(a, b);
38
+ }
39
+ function isSkillTreeJob(job) {
40
+ if (isSkillPlaybook(job.playbook))
41
+ return true;
42
+ return /^\s*skill:\s/i.test(job.title);
43
+ }
44
+ const TREE_CACHE_TTL_MS = 45_000;
45
+ const treeCache = new Map();
46
+ export function invalidateRepoTrees(workspacePath) {
47
+ if (!workspacePath) {
48
+ treeCache.clear();
49
+ return;
50
+ }
51
+ treeCache.delete(resolve(workspacePath));
52
+ }
53
+ export async function collectRepoTrees(input, opts) {
54
+ const key = resolve(input.workspacePath);
55
+ const hit = treeCache.get(key);
56
+ if (!opts?.force && hit && Date.now() - hit.at < TREE_CACHE_TTL_MS) {
57
+ return hit.value;
58
+ }
59
+ const discovered = await discoverWorktrees(input.workspacePath);
60
+ const listed = discovered.length > 0
61
+ ? discovered
62
+ : [
63
+ {
64
+ path: input.workspacePath,
65
+ branch: "",
66
+ source: "git",
67
+ },
68
+ ];
69
+ const dirtyLists = await Promise.all(listed.map((tree) => gitDirtyPaths(tree.path).catch(() => [])));
70
+ const trees = [];
71
+ listed.forEach((tree, index) => {
72
+ const kind = samePath(tree.path, input.workspacePath)
73
+ ? "primary"
74
+ : "linked";
75
+ const files = dirtyLists[index] ?? [];
76
+ const matches = input.jobs.filter((row) => {
77
+ if (isSkillTreeJob(row))
78
+ return false;
79
+ if (row.worktreePath)
80
+ return samePath(row.worktreePath, tree.path);
81
+ return (kind === "primary" &&
82
+ Boolean(row.workspacePath) &&
83
+ samePath(row.workspacePath, input.workspacePath));
84
+ });
85
+ const job = matches.find((row) => row.status === "running" ||
86
+ row.status === "booting" ||
87
+ row.status === "ready") ?? matches[0];
88
+ trees.push({
89
+ path: tree.path,
90
+ branch: tree.branch,
91
+ source: tree.source,
92
+ kind,
93
+ dirty: files.length > 0,
94
+ files: files.length,
95
+ jobCount: matches.length,
96
+ jobs: sortTreeJobs(matches)
97
+ .slice(0, 40)
98
+ .map((row) => ({
99
+ id: row.id,
100
+ title: row.title,
101
+ status: row.status,
102
+ })),
103
+ ...(job
104
+ ? {
105
+ jobId: job.id,
106
+ jobTitle: job.title,
107
+ jobStatus: job.status,
108
+ }
109
+ : {}),
110
+ });
111
+ });
112
+ trees.sort((a, b) => {
113
+ const rank = treeSortRank(a) - treeSortRank(b);
114
+ if (rank !== 0)
115
+ return rank;
116
+ return a.branch.localeCompare(b.branch);
117
+ });
118
+ const value = { path: input.workspacePath, label: input.label, trees };
119
+ treeCache.set(key, { at: Date.now(), value });
120
+ return value;
121
+ }
122
+ export async function runTreeAction(input) {
123
+ const tree = input.treePath.trim();
124
+ if (!tree)
125
+ return { ok: false, detail: "Missing worktree." };
126
+ if (input.action === "remove") {
127
+ if (samePath(tree, input.workspacePath)) {
128
+ return { ok: false, detail: "The primary checkout cannot be removed." };
129
+ }
130
+ const ok = await removeGitWorktree(input.workspacePath, tree);
131
+ return {
132
+ ok,
133
+ detail: ok ? "Removed the linked tree." : "Could not remove that tree.",
134
+ };
135
+ }
136
+ if (input.action === "merge") {
137
+ const branch = input.branch?.trim();
138
+ if (!branch)
139
+ return { ok: false, detail: "That tree has no branch." };
140
+ const result = await mergeJobBranch(input.workspacePath, branch);
141
+ return {
142
+ ok: result.ok,
143
+ detail: result.ok
144
+ ? result.already
145
+ ? `Already on ${result.into}.`
146
+ : `Merged into ${result.into}.`
147
+ : (result.error ?? "Merge failed."),
148
+ };
149
+ }
150
+ if (input.action === "commit") {
151
+ const result = await commitJobWork(tree, {
152
+ jobId: input.jobId?.trim() || "tree",
153
+ title: input.title?.trim() || input.branch?.trim() || "worktree",
154
+ });
155
+ return {
156
+ ok: result.committed,
157
+ detail: result.committed
158
+ ? result.summary || "Committed."
159
+ : "Nothing to commit.",
160
+ };
161
+ }
162
+ const pushed = await defaultGitRunner(tree, ["push", "-u", "origin", "HEAD"]);
163
+ return {
164
+ ok: pushed.ok,
165
+ detail: pushed.ok
166
+ ? "Pushed this branch."
167
+ : pushed.stderr.trim() || "Push failed.",
168
+ };
169
+ }
170
+ //# sourceMappingURL=trees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trees.js","sourceRoot":"","sources":["../src/trees.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -15,6 +15,7 @@ export type WorkspaceEntry = {
15
15
  };
16
16
  export type WorkspaceRegistry = {
17
17
  readonly workspaces: readonly WorkspaceEntry[];
18
+ readonly selectedPath?: string;
18
19
  };
19
20
  export type JobSnapshot = {
20
21
  readonly id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA2HA,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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA4HA,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"}
@@ -0,0 +1,37 @@
1
+ export type NpmPack = (version: string, dest: string) => Promise<{
2
+ readonly ok: boolean;
3
+ readonly detail: string;
4
+ }>;
5
+ export declare function isNewerVersion(latest: string, current: string): boolean;
6
+ /**
7
+ * A checkout of this repo must not hop to npm — that would replace the code
8
+ * under development. Published npx/node_modules copies still hop.
9
+ */
10
+ export declare function isLocalPrismInstall(entry?: string | undefined): boolean;
11
+ export declare function fetchLatestMcpVersion(fetchImpl?: typeof fetch): Promise<string | undefined>;
12
+ export type McpUpdateStatus = {
13
+ readonly current: string;
14
+ readonly latest?: string;
15
+ readonly stale: boolean;
16
+ readonly localCheckout: boolean;
17
+ readonly hop: "current" | "reload" | "local";
18
+ };
19
+ export declare function mcpUpdateStatus(currentVersion: string, fetchImpl?: typeof fetch, localCheckout?: boolean): Promise<McpUpdateStatus>;
20
+ export declare function defaultNpmPack(version: string, dest: string): Promise<{
21
+ readonly ok: boolean;
22
+ readonly detail: string;
23
+ }>;
24
+ export type ApplyMcpUpdateResult = {
25
+ readonly ok: boolean;
26
+ readonly current: string;
27
+ readonly latest?: string;
28
+ readonly cached: boolean;
29
+ readonly localCheckout: boolean;
30
+ readonly message: string;
31
+ };
32
+ export declare function applyMcpUpdate(currentVersion: string, options?: {
33
+ readonly pack?: NpmPack;
34
+ readonly fetchImpl?: typeof fetch;
35
+ readonly localCheckout?: boolean;
36
+ }): Promise<ApplyMcpUpdateResult>;
37
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,OAAO,GAAG,CACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEhE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CASvE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,qBAAkB,GAAG,OAAO,CASpE;AAED,wBAAsB,qBAAqB,CACzC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB7B;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CAC9C,CAAC;AAEF,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,SAAS,GAAE,OAAO,KAAa,EAC/B,aAAa,UAAwB,GACpC,OAAO,CAAC,eAAe,CAAC,CAkB1B;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAe5D;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC7B,GACL,OAAO,CAAC,oBAAoB,CAAC,CA2D/B"}
package/dist/update.js ADDED
@@ -0,0 +1,146 @@
1
+ import { execFile } from "node:child_process";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { promisify } from "node:util";
6
+ const PACKAGE_NAME = "@repo-prism/mcp-server";
7
+ const REGISTRY_URL = "https://registry.npmjs.org/@repo-prism/mcp-server/latest";
8
+ const PACK_MS = 45_000;
9
+ const execFileAsync = promisify(execFile);
10
+ export function isNewerVersion(latest, current) {
11
+ const a = latest.split(".").map((part) => Number.parseInt(part, 10));
12
+ const b = current.split(".").map((part) => Number.parseInt(part, 10));
13
+ for (let i = 0; i < 3; i++) {
14
+ const left = Number.isFinite(a[i]) ? a[i] : 0;
15
+ const right = Number.isFinite(b[i]) ? b[i] : 0;
16
+ if (left !== right)
17
+ return left > right;
18
+ }
19
+ return false;
20
+ }
21
+ /**
22
+ * A checkout of this repo must not hop to npm — that would replace the code
23
+ * under development. Published npx/node_modules copies still hop.
24
+ */
25
+ export function isLocalPrismInstall(entry = process.argv[1]) {
26
+ if (!entry)
27
+ return false;
28
+ const normalized = entry.replaceAll("\\", "/");
29
+ if (normalized.includes("/node_modules/"))
30
+ return false;
31
+ return (normalized.includes("/packages/dispatch-hub/") ||
32
+ normalized.includes("/packages/mcp-server/") ||
33
+ normalized.endsWith("/src/bin.ts"));
34
+ }
35
+ export async function fetchLatestMcpVersion(fetchImpl = fetch) {
36
+ const controller = new AbortController();
37
+ const timer = setTimeout(() => controller.abort(), 2000);
38
+ try {
39
+ const response = await fetchImpl(REGISTRY_URL, {
40
+ signal: controller.signal,
41
+ headers: { accept: "application/json" },
42
+ });
43
+ if (!response.ok)
44
+ return undefined;
45
+ const body = (await response.json());
46
+ return typeof body.version === "string" ? body.version : undefined;
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ finally {
52
+ clearTimeout(timer);
53
+ }
54
+ }
55
+ export async function mcpUpdateStatus(currentVersion, fetchImpl = fetch, localCheckout = isLocalPrismInstall()) {
56
+ const latest = await fetchLatestMcpVersion(fetchImpl);
57
+ if (!latest) {
58
+ return {
59
+ current: currentVersion,
60
+ stale: false,
61
+ localCheckout,
62
+ hop: "current",
63
+ };
64
+ }
65
+ const stale = isNewerVersion(latest, currentVersion);
66
+ return {
67
+ current: currentVersion,
68
+ latest,
69
+ stale,
70
+ localCheckout,
71
+ hop: stale ? (localCheckout ? "local" : "reload") : "current",
72
+ };
73
+ }
74
+ export async function defaultNpmPack(version, dest) {
75
+ try {
76
+ await execFileAsync("npm", ["pack", `${PACKAGE_NAME}@${version}`, "--pack-destination", dest], { timeout: PACK_MS });
77
+ return { ok: true, detail: `Cached ${version}.` };
78
+ }
79
+ catch (cause) {
80
+ const detail = cause instanceof Error
81
+ ? (cause.message.split("\n")[0] ?? cause.message)
82
+ : "npm pack failed.";
83
+ return { ok: false, detail };
84
+ }
85
+ }
86
+ export async function applyMcpUpdate(currentVersion, options = {}) {
87
+ const pack = options.pack ?? defaultNpmPack;
88
+ const fetchImpl = options.fetchImpl ?? fetch;
89
+ const localCheckout = options.localCheckout ?? isLocalPrismInstall();
90
+ const latest = await fetchLatestMcpVersion(fetchImpl);
91
+ if (!latest) {
92
+ return {
93
+ ok: false,
94
+ current: currentVersion,
95
+ cached: false,
96
+ localCheckout,
97
+ message: "Could not reach npm to see the latest Prism.",
98
+ };
99
+ }
100
+ if (!isNewerVersion(latest, currentVersion)) {
101
+ return {
102
+ ok: true,
103
+ current: currentVersion,
104
+ latest,
105
+ cached: false,
106
+ localCheckout,
107
+ message: `Already on ${currentVersion}.`,
108
+ };
109
+ }
110
+ if (localCheckout) {
111
+ return {
112
+ ok: false,
113
+ current: currentVersion,
114
+ latest,
115
+ cached: false,
116
+ localCheckout,
117
+ message: `Prism ${latest} is on npm. This Console is a local ${currentVersion} build — reload will not hop until you publish or run the npx install.`,
118
+ };
119
+ }
120
+ const dir = await mkdtemp(join(tmpdir(), "prism-mcp-pack-"));
121
+ try {
122
+ const packed = await pack(latest, dir);
123
+ if (!packed.ok) {
124
+ return {
125
+ ok: false,
126
+ current: currentVersion,
127
+ latest,
128
+ cached: false,
129
+ localCheckout,
130
+ message: packed.detail,
131
+ };
132
+ }
133
+ return {
134
+ ok: true,
135
+ current: currentVersion,
136
+ latest,
137
+ cached: true,
138
+ localCheckout,
139
+ message: `Cached Prism ${latest}. Reload Prism MCP in this chat to hop — a running session cannot swap mid-flight.`,
140
+ };
141
+ }
142
+ finally {
143
+ await rm(dir, { recursive: true, force: true });
144
+ }
145
+ }
146
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
package/dist/watch.d.ts CHANGED
@@ -27,11 +27,12 @@ export declare function isTerminal(job: JobSnapshot): boolean;
27
27
  * a repo with no jobs. Now the caller gets the error and the UI can say which
28
28
  * workspace it could not read.
29
29
  */
30
- export declare function collectJobs(workspaces: readonly WorkspaceEntry[]): Promise<CollectResult>;
30
+ export declare function collectJobs(workspaces: readonly WorkspaceEntry[], env?: NodeJS.ProcessEnv): Promise<CollectResult>;
31
31
  export declare function diffJobs(previous: readonly JobSnapshot[], next: readonly JobSnapshot[], seenFinished: Set<string>): HubEvent[];
32
32
  export declare function watchWorkspaces(getWorkspaces: () => readonly WorkspaceEntry[], emit: WatchEmit, options?: {
33
33
  readonly debounceMs?: number | undefined;
34
34
  readonly pollMs?: number | undefined;
35
+ readonly env?: NodeJS.ProcessEnv | undefined;
35
36
  /** Advance the job queue for one workspace before reading it (ADR-0047). */
36
37
  readonly drain?: ((workspacePath: string) => Promise<void>) | undefined;
37
38
  }): WorkspaceWatch;
@@ -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,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"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAcA,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,EACrC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,aAAa,CAAC,CAsBxB;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,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;IAC7C,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;CACpE,GACL,cAAc,CAqJhB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
package/dist/watch.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import { access } from "node:fs/promises";
2
2
  import { watch } from "node:fs";
3
- import { join } from "node:path";
4
- import { reapJobs } from "@repo-prism/dispatch";
3
+ import { dirname, join } from "node:path";
4
+ import { jobsPath, listStoredWorkspaceRoots, reapJobs, runWithJobsEnv, useGlobalJobStore, } from "@repo-prism/dispatch";
5
5
  import { formatJobFinishedNotice } from "./notice.js";
6
+ import { mergeHubEnv } from "./paths.js";
7
+ import { mergeWorkspaceEntries } from "./registry.js";
6
8
  import { finishedKey, snapshotKey, toSnapshot } from "./snapshot.js";
7
9
  import { IN_FLIGHT_STATUSES, TERMINAL_STATUSES, } from "./types.js";
8
10
  const DEBOUNCE_MS = 250;
@@ -31,12 +33,13 @@ export function isTerminal(job) {
31
33
  * a repo with no jobs. Now the caller gets the error and the UI can say which
32
34
  * workspace it could not read.
33
35
  */
34
- export async function collectJobs(workspaces) {
36
+ export async function collectJobs(workspaces, env = process.env) {
37
+ const listed = mergeWorkspaceEntries(workspaces, await listStoredWorkspaceRoots(env));
35
38
  const jobs = [];
36
39
  const errors = [];
37
- for (const entry of workspaces) {
40
+ for (const entry of listed) {
38
41
  try {
39
- const records = await reapJobs(entry.path);
42
+ const records = await runWithJobsEnv(env, () => reapJobs(entry.path));
40
43
  for (const record of records) {
41
44
  jobs.push(toSnapshot(record, entry.path));
42
45
  }
@@ -71,7 +74,7 @@ export function diffJobs(previous, next, seenFinished) {
71
74
  else if (snapshotKey(before) !== snapshotKey(job)) {
72
75
  events.push({ type: "job.updated", job });
73
76
  }
74
- if (isTerminal(job) && (!before || !isTerminal(before))) {
77
+ if (isTerminal(job) && before && !isTerminal(before)) {
75
78
  const finish = finishedKey(job);
76
79
  if (!seenFinished.has(finish)) {
77
80
  seenFinished.add(finish);
@@ -94,30 +97,28 @@ export function diffJobs(previous, next, seenFinished) {
94
97
  export function watchWorkspaces(getWorkspaces, emit, options = {}) {
95
98
  const debounceMs = options.debounceMs ?? DEBOUNCE_MS;
96
99
  const pollMs = options.pollMs ?? POLL_MS;
100
+ const env = mergeHubEnv(options.env);
97
101
  let snapshots = [];
98
102
  let workspaceErrors = [];
99
103
  let asOf = new Date().toISOString();
100
104
  const seenFinished = new Set();
101
105
  const watchers = new Map();
106
+ let extraPaths = [];
102
107
  let timer;
103
108
  let poll;
104
109
  let closed = false;
105
- const refresh = async (opts) => {
110
+ const listed = () => mergeWorkspaceEntries(getWorkspaces(), extraPaths);
111
+ const applySnapshot = async () => {
106
112
  if (closed)
107
113
  return;
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());
114
+ extraPaths = await listStoredWorkspaceRoots(env);
115
+ const { jobs: collected, errors } = await collectJobs(getWorkspaces(), env);
116
+ const failed = new Set(errors.map((row) => row.workspacePath));
117
+ const next = [
118
+ ...collected,
119
+ ...snapshots.filter((job) => failed.has(job.workspacePath) &&
120
+ !collected.some((row) => row.id === job.id && row.workspacePath === job.workspacePath)),
121
+ ];
121
122
  const events = diffJobs(snapshots, next, seenFinished);
122
123
  const errorsChanged = errors.length !== workspaceErrors.length ||
123
124
  errors.some((row, i) => row.detail !== workspaceErrors[i]?.detail);
@@ -130,6 +131,36 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
130
131
  emit(event);
131
132
  }
132
133
  };
134
+ const runDrain = async () => {
135
+ if (!options.drain)
136
+ return;
137
+ for (const entry of listed()) {
138
+ if (closed)
139
+ return;
140
+ await options.drain(entry.path).catch(() => {
141
+ /* a failed drain leaves the job queued; the next tick retries */
142
+ });
143
+ }
144
+ };
145
+ const refresh = async (opts) => {
146
+ if (closed)
147
+ return;
148
+ // Drain so a queued job can become running (ADR-0047). Await it only when
149
+ // the caller just enqueued work (`drain: true`). The poll tick and
150
+ // workspace register must not wait — a slow worker-auth drain would freeze
151
+ // GET /api/jobs, which is how the board and these tests observe disk.
152
+ // Control actions (delete) skip drain so the board does not wait on a
153
+ // spawn just to drop a row that is already gone from disk.
154
+ if (opts?.drain === true && options.drain) {
155
+ await runDrain();
156
+ }
157
+ else if (opts?.drain !== false && options.drain) {
158
+ void runDrain().then(() => {
159
+ void applySnapshot();
160
+ });
161
+ }
162
+ await applySnapshot();
163
+ };
133
164
  const schedule = () => {
134
165
  if (timer)
135
166
  clearTimeout(timer);
@@ -139,7 +170,7 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
139
170
  timer.unref?.();
140
171
  };
141
172
  const syncWatchers = () => {
142
- const live = new Set(getWorkspaces().map((entry) => entry.path));
173
+ const live = new Set(listed().map((entry) => entry.path));
143
174
  for (const [path, group] of watchers) {
144
175
  if (live.has(path))
145
176
  continue;
@@ -153,7 +184,11 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
153
184
  const group = [];
154
185
  const dispatch = join(path, ".prism", "dispatch");
155
186
  const runs = join(dispatch, "runs");
156
- for (const target of [dispatch, runs]) {
187
+ const targets = [dispatch, runs];
188
+ if (useGlobalJobStore(env)) {
189
+ targets.push(dirname(jobsPath(path, env)));
190
+ }
191
+ for (const target of targets) {
157
192
  try {
158
193
  const watcher = watch(target, { persistent: false }, () => schedule());
159
194
  watcher.on("error", () => {
@@ -169,7 +204,8 @@ export function watchWorkspaces(getWorkspaces, emit, options = {}) {
169
204
  }
170
205
  };
171
206
  void (async () => {
172
- const initial = await collectJobs(getWorkspaces());
207
+ extraPaths = await listStoredWorkspaceRoots(env);
208
+ const initial = await collectJobs(getWorkspaces(), env);
173
209
  snapshots = initial.jobs;
174
210
  workspaceErrors = initial.errors;
175
211
  asOf = new Date().toISOString();
package/dist/watch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}