@vzn/vx 0.0.598 → 0.0.599

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.598",
3
+ "version": "0.0.599",
4
4
  "description": "The fastest task runner and build cache for JavaScript monorepos.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -21,10 +21,10 @@
21
21
  "node": ">=18"
22
22
  },
23
23
  "optionalDependencies": {
24
- "@vzn/vx-linux-x64": "0.0.598",
25
- "@vzn/vx-linux-arm64": "0.0.598",
26
- "@vzn/vx-darwin-x64": "0.0.598",
27
- "@vzn/vx-darwin-arm64": "0.0.598"
24
+ "@vzn/vx-linux-x64": "0.0.599",
25
+ "@vzn/vx-linux-arm64": "0.0.599",
26
+ "@vzn/vx-darwin-x64": "0.0.599",
27
+ "@vzn/vx-darwin-arm64": "0.0.599"
28
28
  },
29
29
  "dependencies": {
30
30
  "@anthropic-ai/sandbox-runtime": "^0.0.76"
@@ -209,6 +209,9 @@ interface PackArgs {
209
209
  within?: string
210
210
  }
211
211
 
212
+ /** The largest second count ustar's 12-byte mtime field holds: 11 octal digits. */
213
+ const USTAR_MTIME_MAX = 8 ** 11 - 1
214
+
212
215
  /** At or below this many outputs, `planArtifact` stats them on the calling thread. */
213
216
  const ON_THREAD_STATS = 32
214
217
 
@@ -309,10 +312,10 @@ export async function planArtifact(args: PackArgs): Promise<ArtifactPlan> {
309
312
  size: st.size,
310
313
  mode,
311
314
  mtimeMs: Math.floor(st.mtimeMs),
312
- // ustar's octal field holds no sign: an mtime before 1970 made the
313
- // header unreadable and every save of it a "corrupt artifact". The
314
- // sidecar above carries the real value.
315
- mtime: Math.max(0, Math.floor(st.mtimeMs / 1000)),
315
+ // ustar's octal field holds no sign and 11 digits: an mtime before
316
+ // 1970 made the header unreadable, and one past March 2242 failed
317
+ // every save of the task. The sidecar above carries the real value.
318
+ mtime: Math.min(USTAR_MTIME_MAX, Math.max(0, Math.floor(st.mtimeMs / 1000))),
316
319
  }
317
320
  }),
318
321
  )
@@ -1570,13 +1570,14 @@ export class Cache implements CacheLayer {
1570
1570
  } catch (err) {
1571
1571
  // A UserError here is the extractor naming the tree's fault (an
1572
1572
  // output directory that links out of the project).
1573
- if (
1574
- err instanceof ArchiveSecurityError ||
1575
- err instanceof CorruptArtifactError ||
1576
- err instanceof UserError
1577
- ) {
1578
- throw err
1579
- }
1573
+ if (err instanceof CorruptArtifactError || err instanceof UserError) throw err
1574
+ // The save and the ingest proved every name safe, so one that reads
1575
+ // unsafe now is damaged or tampered bytes: a long name's pax record
1576
+ // has no header checksum, and the name is judged before the CRC at
1577
+ // the end is read. Thrown as is, it failed the task on every run with
1578
+ // the entry kept (X-115).
1579
+ if (err instanceof ArchiveSecurityError)
1580
+ throw new CorruptArtifactError(hash, err.message, err)
1580
1581
  // What is on disk, not what is in the archive: a directory standing
1581
1582
  // where the entry holds a file, or a file where it needs a directory.
1582
1583
  // The clean removes the FILES the output globs select and the
@@ -531,7 +531,12 @@ async function executePersistentTask(args: ExecuteArgs): Promise<TaskOutcome> {
531
531
  return {
532
532
  node,
533
533
  status: 'failed',
534
- exitCode: ready?.reason === 'timeout' ? await spawn.child.exited : (ready?.exitCode ?? 1),
534
+ // A server that traps the TERM and exits 0 still timed out, as a
535
+ // one-shot task that does so reports 143 (X-116).
536
+ exitCode:
537
+ ready?.reason === 'timeout'
538
+ ? (await spawn.child.exited) || signalExitCode('SIGTERM')
539
+ : (ready?.exitCode ?? 1),
535
540
  durationMs: spawn.readyMs(),
536
541
  ...(ready !== undefined ? { notReady: ready.reason } : {}),
537
542
  wallclockStartNs,