@sapiom/harness 0.8.8 → 0.9.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.
Files changed (88) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +11 -1
  3. package/dist/core/agent-project-discovery.d.ts +235 -1
  4. package/dist/core/agent-project-discovery.d.ts.map +1 -1
  5. package/dist/core/agent-project-discovery.js +303 -1
  6. package/dist/core/agent-project-discovery.js.map +1 -1
  7. package/dist/core/canvas-interconnections.d.ts +31 -0
  8. package/dist/core/canvas-interconnections.d.ts.map +1 -1
  9. package/dist/core/canvas-interconnections.js +294 -21
  10. package/dist/core/canvas-interconnections.js.map +1 -1
  11. package/dist/core/canvas-render.d.ts +32 -0
  12. package/dist/core/canvas-render.d.ts.map +1 -1
  13. package/dist/core/canvas-render.js +50 -41
  14. package/dist/core/canvas-render.js.map +1 -1
  15. package/dist/core/definition-name.d.ts +12 -0
  16. package/dist/core/definition-name.d.ts.map +1 -1
  17. package/dist/core/definition-name.js +14 -5
  18. package/dist/core/definition-name.js.map +1 -1
  19. package/dist/core/system-graph-inventory.d.ts +68 -0
  20. package/dist/core/system-graph-inventory.d.ts.map +1 -0
  21. package/dist/core/system-graph-inventory.js +312 -0
  22. package/dist/core/system-graph-inventory.js.map +1 -0
  23. package/dist/core/system-graph-relationships.d.ts +41 -0
  24. package/dist/core/system-graph-relationships.d.ts.map +1 -0
  25. package/dist/core/system-graph-relationships.js +98 -0
  26. package/dist/core/system-graph-relationships.js.map +1 -0
  27. package/dist/core/system-graph-store.d.ts +45 -0
  28. package/dist/core/system-graph-store.d.ts.map +1 -0
  29. package/dist/core/system-graph-store.js +222 -0
  30. package/dist/core/system-graph-store.js.map +1 -0
  31. package/dist/core/system-graph-watcher.d.ts +51 -0
  32. package/dist/core/system-graph-watcher.d.ts.map +1 -0
  33. package/dist/core/system-graph-watcher.js +448 -0
  34. package/dist/core/system-graph-watcher.js.map +1 -0
  35. package/dist/core/system-graph.d.ts +43 -0
  36. package/dist/core/system-graph.d.ts.map +1 -0
  37. package/dist/core/system-graph.js +321 -0
  38. package/dist/core/system-graph.js.map +1 -0
  39. package/dist/core/workflow-registry.d.ts +84 -6
  40. package/dist/core/workflow-registry.d.ts.map +1 -1
  41. package/dist/core/workflow-registry.js +191 -91
  42. package/dist/core/workflow-registry.js.map +1 -1
  43. package/dist/core/workspace-watcher.d.ts +21 -13
  44. package/dist/core/workspace-watcher.d.ts.map +1 -1
  45. package/dist/core/workspace-watcher.js +79 -81
  46. package/dist/core/workspace-watcher.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/profiles/default.d.ts.map +1 -1
  51. package/dist/profiles/default.js +4 -2
  52. package/dist/profiles/default.js.map +1 -1
  53. package/dist/server/agent-move.d.ts +134 -0
  54. package/dist/server/agent-move.d.ts.map +1 -0
  55. package/dist/server/agent-move.js +343 -0
  56. package/dist/server/agent-move.js.map +1 -0
  57. package/dist/server/index.d.ts.map +1 -1
  58. package/dist/server/index.js +275 -22
  59. package/dist/server/index.js.map +1 -1
  60. package/dist/server/rest.d.ts +3 -0
  61. package/dist/server/rest.d.ts.map +1 -1
  62. package/dist/server/rest.js +3 -0
  63. package/dist/server/rest.js.map +1 -1
  64. package/dist/server/studio-rail.d.ts +76 -0
  65. package/dist/server/studio-rail.d.ts.map +1 -0
  66. package/dist/server/studio-rail.js +234 -0
  67. package/dist/server/studio-rail.js.map +1 -0
  68. package/dist/server/system-graph.d.ts +14 -0
  69. package/dist/server/system-graph.d.ts.map +1 -0
  70. package/dist/server/system-graph.js +40 -0
  71. package/dist/server/system-graph.js.map +1 -0
  72. package/dist/server/workflow-graph.d.ts +43 -0
  73. package/dist/server/workflow-graph.d.ts.map +1 -0
  74. package/dist/server/workflow-graph.js +200 -0
  75. package/dist/server/workflow-graph.js.map +1 -0
  76. package/dist/shared/system-graph.d.ts +59 -0
  77. package/dist/shared/system-graph.d.ts.map +1 -0
  78. package/dist/shared/system-graph.js +76 -0
  79. package/dist/shared/system-graph.js.map +1 -0
  80. package/dist/shared/types.d.ts +45 -0
  81. package/dist/shared/types.d.ts.map +1 -1
  82. package/dist/shared/types.js.map +1 -1
  83. package/dist/web/assets/index-2Fab6dzf.js +508 -0
  84. package/dist/web/assets/index-D0doaFvT.css +32 -0
  85. package/dist/web/index.html +2 -2
  86. package/package.json +5 -5
  87. package/dist/web/assets/index-DrTPW10E.js +0 -494
  88. package/dist/web/assets/index-jGBbXx9R.css +0 -32
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * Workflow registry (workstream W2's backend slice).
3
3
  *
4
- * Discovers orchestration projects by scanning a directory tree (bounded
5
- * depth) for `sapiom.json` marker files, tracks manually-connected paths,
6
- * and persists the combined list to HARNESS_PATHS.workflows. Exposes an
4
+ * Discovers orchestration projects by scanning a directory tree (bounded by
5
+ * depth, by directories visited, and by the scan root's own repository) for
6
+ * `sapiom.json` marker files, tracks
7
+ * manually-connected paths, and persists the combined list to
8
+ * HARNESS_PATHS.workflows. Exposes an
7
9
  * Express router implementing the /api/workflows surface from
8
10
  * src/shared/types.ts; the integrator mounts it (and express.json()) on the
9
11
  * shared app.
@@ -13,7 +15,7 @@ import * as os from "node:os";
13
15
  import * as path from "node:path";
14
16
  import { Router } from "express";
15
17
  import { HARNESS_PATHS } from "../shared/types.js";
16
- import { AGENT_PROJECT_SCAN_MAX_DEPTH, inspectAgentProjectMarker, isAgentProjectScanIgnoredDir, readAgentProjectMarker, } from "./agent-project-discovery.js";
18
+ import { AgentProjectScanBudget, inspectAgentProjectMarker, isAgentProjectScanIgnoredDir, readAgentProjectMarker, walkAgentProjectTreeAsync, } from "./agent-project-discovery.js";
17
19
  import { hasTraversalSegment, resolveWithinRoot } from "./path-safety.js";
18
20
  function expandHome(inputPath) {
19
21
  if (inputPath === "~")
@@ -23,7 +25,8 @@ function expandHome(inputPath) {
23
25
  return inputPath;
24
26
  }
25
27
  // `dir` reaching these sinks is always a resolved absolute path (from
26
- // path.resolve in scan/connectPath, or a confined descent in scanDir), so a
28
+ // path.resolve in scan/connectPath, or a confined descent in the scan walk),
29
+ // so a
27
30
  // `..` segment can never survive. Asserting it anyway keeps the no-traversal
28
31
  // guarantee explicit and local to each fs read, and covers the arbitrary
29
32
  // path connectPath accepts (which has no scan root to confine it to).
@@ -37,10 +40,6 @@ async function inspectMarker(dir) {
37
40
  return { status: "invalid" };
38
41
  return inspectAgentProjectMarker(dir);
39
42
  }
40
- function isConfirmedMissingPath(error) {
41
- const code = error.code;
42
- return code === "ENOENT" || code === "ENOTDIR";
43
- }
44
43
  async function nameFor(dir) {
45
44
  if (hasTraversalSegment(dir))
46
45
  return path.basename(dir);
@@ -56,64 +55,82 @@ async function nameFor(dir) {
56
55
  return path.basename(dir);
57
56
  }
58
57
  /**
59
- * Depth-first scan; a directory carrying a marker is registered and not
60
- * descended into. Every directory touched is confined to `root` (the tree the
61
- * caller asked to scan): the initial call is `root` itself, and recursion only
62
- * ever descends into a direct child, so no crafted entry name can walk the
63
- * scan outside `root`. Symlinked entries report `isDirectory() === false`
64
- * (withFileTypes uses raw dirent info, not a followed stat) and so are never
65
- * descended into either.
58
+ * Scans `root` for agent projects, bounded by depth, by directories visited,
59
+ * AND by the repository the root belongs to (core/agent-project-discovery.ts
60
+ * owns that policy and the numbers behind it). A directory carrying a marker is
61
+ * registered and not descended into; a directory that is a repository checkout
62
+ * of its own is reported as a boundary and not descended into either, so one
63
+ * scan registers one project tree rather than every neighbouring clone.
64
+ *
65
+ * Every directory touched is confined to `root` (the tree the caller asked to
66
+ * scan): the walk starts at `root` itself and only ever descends into a direct
67
+ * child, so no crafted entry name can walk the scan outside `root` — and
68
+ * `resolveWithinRoot` re-asserts that at the sink, local to each fs read.
69
+ * Symlinked entries report `isDirectory() === false` (withFileTypes uses raw
70
+ * dirent info, not a followed stat) and so are never descended into either,
71
+ * which is what makes a symlink cycle terminate.
72
+ *
73
+ * Exported so the perf benchmark can measure the real scanner against an
74
+ * explicit budget rather than a copy of its traversal.
66
75
  */
67
- async function scanDir(root, dir, depth, found, unreconciledRoots) {
68
- if (depth > AGENT_PROJECT_SCAN_MAX_DEPTH)
69
- return;
70
- const safeDir = resolveWithinRoot(root, dir);
71
- if (!safeDir)
72
- return;
73
- const markerResult = await inspectMarker(safeDir);
74
- if (markerResult.status === "valid") {
75
- const marker = markerResult.marker;
76
- found.push({
77
- name: await nameFor(safeDir),
78
- path: safeDir,
79
- definitionId: marker.definitionId ?? null,
80
- definitionSlug: marker.name ?? null,
81
- templateId: marker.templateId ?? null,
82
- forkId: marker.forkId ?? null,
83
- starterId: marker.starterId ?? null,
84
- source: "scan",
85
- });
86
- return;
87
- }
88
- if (markerResult.status === "unreadable") {
89
- // The directory may still be a valid project. Treat the whole subtree as
90
- // opaque for this pass so a transient filesystem error neither removes an
91
- // existing entry nor discovers children that should be hidden beneath it.
92
- unreconciledRoots.push(safeDir);
93
- return;
94
- }
95
- let entries;
96
- try {
97
- entries = await fs.readdir(safeDir, { withFileTypes: true });
98
- }
99
- catch (error) {
100
- if (!isConfirmedMissingPath(error))
76
+ export async function scanAgentProjects(root, budget = new AgentProjectScanBudget(), options = {}) {
77
+ const absoluteRoot = path.resolve(root);
78
+ const found = [];
79
+ const unreconciledRoots = [];
80
+ const repositoryBoundaries = [];
81
+ const onDirectory = async (dir) => {
82
+ const safeDir = resolveWithinRoot(absoluteRoot, dir);
83
+ if (!safeDir)
84
+ return "stop";
85
+ const markerResult = await inspectMarker(safeDir);
86
+ if (markerResult.status === "valid") {
87
+ const marker = markerResult.marker;
88
+ found.push({
89
+ name: await nameFor(safeDir),
90
+ path: safeDir,
91
+ definitionId: marker.definitionId ?? null,
92
+ definitionSlug: marker.name ?? null,
93
+ templateId: marker.templateId ?? null,
94
+ forkId: marker.forkId ?? null,
95
+ starterId: marker.starterId ?? null,
96
+ source: "scan",
97
+ });
98
+ return "stop";
99
+ }
100
+ if (markerResult.status === "unreadable") {
101
+ // The directory may still be a valid project. Treat the whole subtree as
102
+ // opaque for this pass so a transient filesystem error neither removes an
103
+ // existing entry nor discovers children that should be hidden beneath it.
101
104
  unreconciledRoots.push(safeDir);
102
- return;
103
- }
104
- for (const entry of entries) {
105
- if (!entry.isDirectory() || isAgentProjectScanIgnoredDir(entry.name))
106
- continue;
107
- await scanDir(root, path.join(safeDir, entry.name), depth + 1, found, unreconciledRoots);
108
- }
105
+ return "stop";
106
+ }
107
+ return "descend";
108
+ };
109
+ await walkAgentProjectTreeAsync(absoluteRoot, {
110
+ onDirectory,
111
+ onUnreadable: (dir) => unreconciledRoots.push(dir),
112
+ onRepositoryBoundary: (dir) => {
113
+ repositoryBoundaries.push(dir);
114
+ // Also onto the budget, so a caller that only holds the budget (the
115
+ // server's scan wrapper) can explain an empty result.
116
+ budget.repositoryBoundaries.push(dir);
117
+ },
118
+ }, budget, options);
119
+ return { found, unreconciledRoots, repositoryBoundaries, budget };
109
120
  }
110
121
  /**
111
122
  * Whether a previously scanned path is inside the exact traversal envelope of
112
123
  * a new scan. Only those entries may be reconciled away when their marker is no
113
124
  * longer found; a narrow scan must never delete projects discovered from a
114
125
  * different root.
126
+ *
127
+ * `envelopeDepth` is the scan's own report of how deep it got, not the static
128
+ * cap: a scan the node budget cut short covered fewer levels than it was
129
+ * allowed to, and reconciling at the allowance would delete rows it simply
130
+ * never looked for. The walk is breadth-first, so every level at or above
131
+ * `envelopeDepth` is complete and safe to reconcile.
115
132
  */
116
- function isCoveredByScan(root, candidate) {
133
+ function isCoveredByScan(root, candidate, envelopeDepth) {
117
134
  const relative = path.relative(root, candidate);
118
135
  if (relative === "")
119
136
  return true;
@@ -121,12 +138,58 @@ function isCoveredByScan(root, candidate) {
121
138
  return false;
122
139
  }
123
140
  const segments = relative.split(path.sep).filter(Boolean);
124
- return (segments.length <= AGENT_PROJECT_SCAN_MAX_DEPTH &&
141
+ return (segments.length <= envelopeDepth &&
125
142
  !segments.some((segment) => isAgentProjectScanIgnoredDir(segment)));
126
143
  }
127
144
  function isProtectedByIncompleteScan(candidate, unreconciledRoots) {
128
145
  return unreconciledRoots.some((unreconciledRoot) => resolveWithinRoot(unreconciledRoot, candidate) !== null);
129
146
  }
147
+ /**
148
+ * Whether a previously known path sits inside a nested checkout this scan
149
+ * deliberately did not enter.
150
+ *
151
+ * Reconciliation's rule is "the registry may only forget a project it can prove
152
+ * it would have looked for", and the repository boundary changes what a scan
153
+ * looks for. Without this, opening `~/src` after having opened `~/src/some-repo`
154
+ * would DELETE that repo's agents: the scan stops at the boundary, finds no
155
+ * marker below it, and the depth envelope alone would call them gone.
156
+ */
157
+ function isBehindRepositoryBoundary(candidate, repositoryBoundaries) {
158
+ return repositoryBoundaries.some((boundary) => resolveWithinRoot(boundary, candidate) !== null);
159
+ }
160
+ /**
161
+ * How often {@link WorkflowRegistry.list} re-checks that every registered path
162
+ * still exists. Round 1's note claimed the registry "prunes lazily"; it did
163
+ * not — pruning only happened where a caller remembered to ask (server boot, a
164
+ * session's workspace rescan, an agent move), so a deleted agent stayed on the
165
+ * rail until one of those happened to run. This interval is what makes the
166
+ * claim true: one `stat` per entry, at most this often, on any read.
167
+ */
168
+ const LAZY_PRUNE_INTERVAL_MS = 30000;
169
+ /**
170
+ * Splits entries into "path still there" and "path confirmed gone". Only
171
+ * ENOENT/ENOTDIR counts as gone: an unbuilt, unreadable or momentarily
172
+ * unstattable directory is kept, because losing a real project to a transient
173
+ * filesystem error is far worse than carrying a dead row for one more sweep.
174
+ */
175
+ async function partitionByPathExists(workflows) {
176
+ const kept = [];
177
+ const pruned = [];
178
+ for (const workflow of workflows) {
179
+ try {
180
+ await fs.stat(workflow.path);
181
+ kept.push(workflow);
182
+ }
183
+ catch (err) {
184
+ const code = err.code;
185
+ if (code === "ENOENT" || code === "ENOTDIR")
186
+ pruned.push(workflow);
187
+ else
188
+ kept.push(workflow);
189
+ }
190
+ }
191
+ return { kept, pruned };
192
+ }
130
193
  export class WorkflowRegistry {
131
194
  constructor(registryPath = expandHome(HARNESS_PATHS.workflows)) {
132
195
  this.registryPath = registryPath;
@@ -136,6 +199,8 @@ export class WorkflowRegistry {
136
199
  * interleave and drop entries from the persisted file. Mirrors the pattern
137
200
  * used by SessionManager.persist() (session-manager.ts:278,851-853). */
138
201
  this.writeQueue = Promise.resolve();
202
+ /** Epoch ms of the last confirmed-missing sweep — see LAZY_PRUNE_INTERVAL_MS. */
203
+ this.lastPruneAt = 0;
139
204
  }
140
205
  async ensureLoaded() {
141
206
  if (this.loaded)
@@ -167,8 +232,24 @@ export class WorkflowRegistry {
167
232
  this.writeQueue = next.then(() => { }, () => { });
168
233
  return next;
169
234
  }
235
+ /**
236
+ * The registry as it stands — and the point at which stale entries actually
237
+ * leave. A read runs {@link prune} when one is due
238
+ * (LAZY_PRUNE_INTERVAL_MS), so an agent whose directory the user deleted
239
+ * disappears from `GET /api/workflows` on its own rather than waiting for the
240
+ * next server boot. Cheap by construction: one `stat` per entry, throttled,
241
+ * and the file is only rewritten when something was actually dropped.
242
+ */
170
243
  async list() {
171
244
  await this.ensureLoaded();
245
+ if (Date.now() - this.lastPruneAt >= LAZY_PRUNE_INTERVAL_MS) {
246
+ // CLAIM THE INTERVAL BEFORE SWEEPING. `lastPruneAt` used to be written
247
+ // only inside the queued task, so every read in a burst passed the
248
+ // throttle and queued its own full stat sweep of the whole registry.
249
+ // Claiming it here closes the burst to one sweep per interval.
250
+ this.lastPruneAt = Date.now();
251
+ await this.prune();
252
+ }
172
253
  return this.workflows;
173
254
  }
174
255
  /**
@@ -180,58 +261,72 @@ export class WorkflowRegistry {
180
261
  * stays registered. Returns what was pruned so the caller can log it.
181
262
  */
182
263
  async prune() {
264
+ await this.ensureLoaded();
265
+ // THE STAT SWEEP RUNS OUTSIDE THE WRITE QUEUE. It only reads the
266
+ // filesystem, so putting it behind `enqueue` made the rail's hot read
267
+ // (`GET /api/workflows`, via list()) block until any in-flight `scan()`
268
+ // finished — 239 ms on a measured real root, 6.8 s uncapped — where it used
269
+ // to answer from memory. Only the WRITE needs the lock, and only when
270
+ // something was actually dropped, which is the rare case.
271
+ const { pruned } = await partitionByPathExists(this.workflows);
272
+ this.lastPruneAt = Date.now();
273
+ if (pruned.length === 0)
274
+ return [];
275
+ const gone = new Set(pruned.map((workflow) => workflow.path));
183
276
  return this.enqueue(async () => {
184
- await this.ensureLoaded();
185
- const kept = [];
186
- const pruned = [];
187
- for (const workflow of this.workflows) {
188
- try {
189
- await fs.stat(workflow.path);
190
- kept.push(workflow);
191
- }
192
- catch (err) {
193
- const code = err.code;
194
- if (code === "ENOENT" || code === "ENOTDIR")
195
- pruned.push(workflow);
196
- else
197
- kept.push(workflow);
198
- }
199
- }
200
- if (pruned.length > 0) {
201
- this.workflows = kept;
202
- await this.persist();
203
- }
204
- return pruned;
277
+ // RE-DERIVE FROM CURRENT STATE rather than assigning the `kept` computed
278
+ // above: a scan may have registered entries while we were statting, and
279
+ // writing a stale snapshot back would silently drop them. Removing a set
280
+ // of known-missing paths is safe whatever else changed meanwhile.
281
+ const before = this.workflows;
282
+ const removed = before.filter((workflow) => gone.has(workflow.path));
283
+ if (removed.length === 0)
284
+ return [];
285
+ this.workflows = before.filter((workflow) => !gone.has(workflow.path));
286
+ await this.persist();
287
+ return removed;
205
288
  });
206
289
  }
207
290
  /**
291
+ * `budget` is overridable so a caller (and the tests that pin this rule) can
292
+ * scan with a narrower allowance than the shipped default; the reconciliation
293
+ * envelope follows whatever the scan actually managed to cover.
294
+ *
208
295
  * Scans `root`, refreshes discovered projects, and removes scan-sourced rows
209
296
  * in this scan's traversal envelope when their marker is confirmed gone or
210
- * invalid. Rows beneath a temporarily unreadable directory survive this pass;
211
- * manually connected rows remain until their path itself is pruned.
297
+ * invalid. Rows beneath a temporarily unreadable directory survive this pass,
298
+ * as do rows below the depth the scan actually completed when the node budget
299
+ * cut it short; manually connected rows remain until their path itself is
300
+ * pruned.
212
301
  */
213
- async scan(root) {
302
+ async scan(root, budget = new AgentProjectScanBudget()) {
214
303
  return this.enqueue(async () => {
215
304
  await this.ensureLoaded();
216
305
  const absoluteRoot = path.resolve(expandHome(root));
217
- const found = [];
218
- const unreconciledRoots = [];
219
- await scanDir(absoluteRoot, absoluteRoot, 0, found, unreconciledRoots);
306
+ const { found, unreconciledRoots, repositoryBoundaries } = await scanAgentProjects(absoluteRoot, budget);
220
307
  const foundPaths = new Set(found.map((workflow) => workflow.path));
221
308
  const byPath = new Map(this.workflows
222
309
  .filter((workflow) => workflow.source !== "scan" ||
223
- !isCoveredByScan(absoluteRoot, workflow.path) ||
310
+ !isCoveredByScan(absoluteRoot, workflow.path, budget.envelopeDepth) ||
224
311
  foundPaths.has(workflow.path) ||
225
- isProtectedByIncompleteScan(workflow.path, unreconciledRoots))
312
+ isProtectedByIncompleteScan(workflow.path, unreconciledRoots) ||
313
+ isBehindRepositoryBoundary(workflow.path, repositoryBoundaries))
226
314
  .map((workflow) => [workflow.path, workflow]));
227
315
  for (const workflow of found) {
228
316
  const existing = byPath.get(workflow.path);
229
317
  // A manually-connected entry keeps its `source`; a scan only refreshes name/definitionId.
230
318
  byPath.set(workflow.path, existing ? { ...existing, ...workflow, source: existing.source } : workflow);
231
319
  }
232
- this.workflows = Array.from(byPath.values());
320
+ // Registry-wide, not envelope-wide: a scan is the most frequent write
321
+ // this file gets, and an entry whose directory is CONFIRMED gone has no
322
+ // claim to survive it regardless of which root turned it up. Without
323
+ // this, a dead row rooted somewhere the studio never scans again lives
324
+ // for as long as the install does.
325
+ const { kept, pruned } = await partitionByPathExists(Array.from(byPath.values()));
326
+ this.lastPruneAt = Date.now();
327
+ this.workflows = kept;
233
328
  await this.persist();
234
- return found;
329
+ return found.filter((workflow) => !pruned.some((dead) => dead.path === workflow.path));
235
330
  });
236
331
  }
237
332
  /** Registers an arbitrary path (the "+ Connect" flow); marker is optional at connect time. */
@@ -285,7 +380,12 @@ export function createWorkflowsRouter(registry) {
285
380
  return;
286
381
  }
287
382
  try {
288
- res.json(await registry.scan(root));
383
+ // Responds with the OUTCOME, not a bare array: see WorkflowScanOutcome
384
+ // for why `found` alone lets a caller state a falsehood.
385
+ const outcome = registry.scanWithBoundaries
386
+ ? await registry.scanWithBoundaries(root)
387
+ : { found: await registry.scan(root), repositoryBoundaries: [] };
388
+ res.json(outcome);
289
389
  }
290
390
  catch (err) {
291
391
  res.status(500).json({ error: err.message });
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../../src/core/workflow-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../../src/core/workflow-registry.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,31 @@
1
+ import { AgentProjectScanBudget } from "./agent-project-discovery.js";
1
2
  /**
2
3
  * Fingerprint of the set of workflow-marker directories under `root` (sorted,
3
- * bounded depth, ignored subtrees skipped), plus opaque sentinels for subtrees
4
- * that are temporarily unreadable. Changes when a workflow is added, removed,
5
- * renamed, or crosses that unreadable boundary not when unrelated readable
4
+ * bounded by depth AND by directories visited, ignored subtrees skipped), plus
5
+ * opaque sentinels for subtrees that are temporarily unreadable or that the
6
+ * node budget kept the walk out of. Changes when a workflow is added, removed,
7
+ * renamed, or crosses one of those boundaries — not when unrelated readable
6
8
  * files are edited. Exported for direct testing.
7
9
  *
8
- * The synchronous form is retained for callers that need an immediate
9
- * baseline at construction time (before async I/O is possible). The
10
- * polling fallback uses the async form to avoid blocking the event loop on
11
- * a wide directory tree.
10
+ * The synchronous form remains for the session watcher, whose constructor
11
+ * requires an immediate baseline. Project-graph watchers use the async form
12
+ * for startup, native-event checks, and polling so a wide Project never walks
13
+ * synchronously on the server loop.
14
+ *
15
+ * `budget` is injectable so a benchmark can read the directories visited off
16
+ * the same object the walk spends, and so a test can force truncation. Pass the
17
+ * SAME limits to both forms: the two produce identical fingerprints on one tree
18
+ * only when their bounds match, and SessionWorkspaceWatcher compares a sync
19
+ * baseline against an async poll result.
12
20
  */
13
- export declare function snapshotWorkspaceWorkflows(root: string): string;
21
+ export declare function snapshotWorkspaceWorkflows(root: string, budget?: AgentProjectScanBudget): string;
14
22
  /**
15
- * Async variant used by the polling fallback yields between directories so
16
- * a wide workspace can't stutter the event loop on platforms without recursive
17
- * fs.watch. Produces the same fingerprint as the sync version. Exported for
18
- * direct testing.
23
+ * Async variant for graph watcher baselines/event checks and polling
24
+ * fallbacks yields between directories so a wide workspace cannot stutter
25
+ * the event loop. Produces the same fingerprint as the sync version. Exported
26
+ * for direct testing.
19
27
  */
20
- export declare function snapshotWorkspaceWorkflowsAsync(root: string): Promise<string>;
28
+ export declare function snapshotWorkspaceWorkflowsAsync(root: string, budget?: AgentProjectScanBudget): Promise<string>;
21
29
  export interface WorkspaceWatcherManagerDeps {
22
30
  /** Debounced per-session notification that the workspace's workflow set may
23
31
  * have changed — the integrator re-scans that session's cwd and broadcasts
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-watcher.d.ts","sourceRoot":"","sources":["../../src/core/workspace-watcher.ts"],"names":[],"mappings":"AA+DA;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoC/D;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCnF;AAmGD,MAAM,WAAW,2BAA2B;IAC1C;;4DAEwD;IACxD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,0EAA0E;AAC1E,qBAAa,uBAAuB;IAGtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;gBAE1C,IAAI,EAAE,2BAA2B;IAE9D,kEAAkE;IAClE,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAQlD,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAKpC,OAAO,IAAI,IAAI;IAIf,8EAA8E;IAC9E,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
1
+ {"version":3,"file":"workspace-watcher.d.ts","sourceRoot":"","sources":["../../src/core/workspace-watcher.ts"],"names":[],"mappings":"AAsCA,OAAO,EAEL,sBAAsB,EAOvB,MAAM,8BAA8B,CAAC;AAwEtC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,sBAAsC,GAC7C,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,sBAAsC,GAC7C,OAAO,CAAC,MAAM,CAAC,CAajB;AAmGD,MAAM,WAAW,2BAA2B;IAC1C;;4DAEwD;IACxD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,0EAA0E;AAC1E,qBAAa,uBAAuB;IAGtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;gBAE1C,IAAI,EAAE,2BAA2B;IAE9D,kEAAkE;IAClE,KAAK,CAAC,gBAAgB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAQlD,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAKpC,OAAO,IAAI,IAAI;IAIf,8EAA8E;IAC9E,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}