@vzn/vx 0.0.28 → 0.0.29

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vzn/vx",
3
- "version": "0.0.28",
3
+ "version": "0.0.29",
4
4
  "description": "An open, extensible monorepo task runner.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -17,10 +17,10 @@
17
17
  "node": ">=18"
18
18
  },
19
19
  "optionalDependencies": {
20
- "@vzn/vx-linux-x64": "0.0.28",
21
- "@vzn/vx-linux-arm64": "0.0.28",
22
- "@vzn/vx-darwin-x64": "0.0.28",
23
- "@vzn/vx-darwin-arm64": "0.0.28"
20
+ "@vzn/vx-linux-x64": "0.0.29",
21
+ "@vzn/vx-linux-arm64": "0.0.29",
22
+ "@vzn/vx-darwin-x64": "0.0.29",
23
+ "@vzn/vx-darwin-arm64": "0.0.29"
24
24
  },
25
25
  "dependencies": {
26
26
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -277,7 +277,10 @@ export async function applyScheduleHooks(
277
277
  * `admit` stage, built once per run into the predicate the scheduler asks
278
278
  * at every local dispatch: every plugin that answers must admit. A plugin
279
279
  * that throws is reported once and admits from then on — a policy never
280
- * breaks a run — so the predicate is never the reason a task hangs.
280
+ * breaks a run — and one that refuses while nothing local is running is
281
+ * overridden with a word, since only a completion asks again: that
282
+ * refusal stalled the run for good (item 1023). So the predicate is never
283
+ * the reason a task hangs.
281
284
  * Undefined when no plugin answers, which keeps the scheduler on its
282
285
  * count-only path.
283
286
  */
@@ -290,6 +293,7 @@ export function buildAdmission(
290
293
  const answering = plugins.filter((p) => p.admit !== undefined)
291
294
  if (answering.length === 0) return undefined
292
295
  const broken = new Set<VxPlugin>()
296
+ const overridden = new Set<VxPlugin>()
293
297
  return (id, running) => {
294
298
  // The scheduler asks only about ids in this same map, so the lookup
295
299
  // always lands: an unknown-id arm here was deleted with the whole core
@@ -302,7 +306,14 @@ export function buildAdmission(
302
306
  for (const plugin of answering) {
303
307
  if (broken.has(plugin)) continue
304
308
  try {
305
- if (plugin.admit!(task, ctx) === false) return false
309
+ if (plugin.admit!(task, ctx) !== false) continue
310
+ if (running.size > 0) return false
311
+ if (!overridden.has(plugin)) {
312
+ overridden.add(plugin)
313
+ warn(
314
+ `plugin '${plugin.name}' refused ${id} in admit with nothing running; admitting it, since no completion would ask again`,
315
+ )
316
+ }
306
317
  } catch (err) {
307
318
  broken.add(plugin)
308
319
  const m = err instanceof Error ? err.message : String(err)