@impz/testing 6.8.1 → 6.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 (2) hide show
  1. package/dist/index.js +376 -205
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -18924,7 +18924,7 @@ var BACKUP_TREE = {
18924
18924
  };
18925
18925
 
18926
18926
  // packages/daemon/src/test-utils/start-test-impd.ts
18927
- import { copyFileSync as copyFileSync5, mkdirSync as mkdirSync31, mkdtempSync, writeFileSync as writeFileSync16 } from "fs";
18927
+ import { copyFileSync as copyFileSync5, mkdirSync as mkdirSync31, mkdtempSync, writeFileSync as writeFileSync17 } from "fs";
18928
18928
  import { rm as rm2 } from "fs/promises";
18929
18929
  import { tmpdir } from "os";
18930
18930
 
@@ -18994,7 +18994,7 @@ function readBusyPorts() {
18994
18994
  // packages/daemon/src/test-utils/start-test-impd.ts
18995
18995
  import { createORPCClient as createORPCClient2 } from "@orpc/client";
18996
18996
  import { RPCLink } from "@orpc/client/fetch";
18997
- import invariant7 from "tiny-invariant";
18997
+ import invariant8 from "tiny-invariant";
18998
18998
 
18999
18999
  // packages/daemon/src/config.ts
19000
19000
  import { join as join4 } from "path";
@@ -21739,6 +21739,7 @@ var EnvSchema = z53.object({
21739
21739
  IMP_KSM_HEADROOM_PERCENT: z53.string().default("100"),
21740
21740
  IMP_HUGE_PAGES: z53.enum(["off", "2M"]).default("off"),
21741
21741
  IMP_UFFD_HANDLER: z53.string().default("uffd-handler"),
21742
+ IMP_WARM_CAP_MIB: CountSchema3.default(256),
21742
21743
  IMP_DNS: z53.string().default("1.1.1.1,8.8.8.8").transform(splitList).pipe(DnsServersSchema),
21743
21744
  IMP_SUBNET: z53.cidrv4().default("10.66.0.0/16"),
21744
21745
  IMP_SUBNET6: z53.string().default("auto"),
@@ -21908,7 +21909,7 @@ function loadConfig(env) {
21908
21909
  jailerBin: parsed.IMP_JAILER === "true" ? parsed.IMP_JAILER_BIN : null,
21909
21910
  jailDir: join4(parsed.IMP_DATA_DIR, "jail"),
21910
21911
  ksm: parseKsmConfig(parsed),
21911
- hugePages: parsed.IMP_HUGE_PAGES === "2M" ? { handlerBin: parsed.IMP_UFFD_HANDLER } : null,
21912
+ hugePages: parsed.IMP_HUGE_PAGES === "2M" ? { handlerBin: parsed.IMP_UFFD_HANDLER, warmCapMib: parsed.IMP_WARM_CAP_MIB } : null,
21912
21913
  kernelPath: join4(parsed.IMP_DATA_DIR, "system", "vmlinux"),
21913
21914
  kernelSource: parsed.IMP_KERNEL ?? null,
21914
21915
  systemDriveSource: parsed.IMP_SYSTEM_DRIVE ?? join4(parsed.IMP_DATA_DIR, "system", "imp-system.squashfs"),
@@ -21991,7 +21992,7 @@ import { join as join48 } from "path";
21991
21992
  // packages/daemon/package.json
21992
21993
  var package_default = {
21993
21994
  name: "@impz/daemon",
21994
- version: "6.8.1",
21995
+ version: "6.9.0",
21995
21996
  private: true,
21996
21997
  description: "impd: the imp host daemon",
21997
21998
  type: "module",
@@ -38658,6 +38659,7 @@ function createImpCommands(parts) {
38658
38659
  const leases = parts.leases;
38659
38660
  const removeLockedImp = async (imp) => {
38660
38661
  const paths = context.findPaths(imp.id);
38662
+ await context.memoryWarm?.stop(imp.id, "destroyed");
38661
38663
  if (imp.pid !== null) {
38662
38664
  await context.vms.stopVm(imp.pid, paths, false);
38663
38665
  }
@@ -39701,6 +39703,113 @@ function splitRun(run) {
39701
39703
  });
39702
39704
  }
39703
39705
 
39706
+ // packages/daemon/src/vm/vmm/create-memory-warm.ts
39707
+ import invariant5 from "tiny-invariant";
39708
+ import { match as match11 } from "ts-pattern";
39709
+ import * as z76 from "zod";
39710
+ var BLOCK_MIB2 = 2;
39711
+ var WARM_CONCURRENCY = 2;
39712
+ var WarmReportSchema = z76.object({ blocks: z76.int().nonnegative() });
39713
+ function createMemoryWarm(deps) {
39714
+ const running = new Map;
39715
+ const lifetime = { isStopped: false };
39716
+ const slots = createSemaphore(WARM_CONCURRENCY);
39717
+ const readBlocks = async (mode, memFile, signal) => {
39718
+ signal.throwIfAborted();
39719
+ const argv = [deps.handlerBin, mode, memFile];
39720
+ const stdout = await runChecked(argv, { signal }, deps.run);
39721
+ return WarmReportSchema.parse(JSON.parse(stdout)).blocks;
39722
+ };
39723
+ const runWarm = async (memFile, signal) => {
39724
+ const startedMs = performance.now();
39725
+ try {
39726
+ const blocks = await readBlocks("--count-data", memFile, signal);
39727
+ if (blocks * BLOCK_MIB2 > deps.capMib) {
39728
+ return { kind: "overCap", blocks };
39729
+ }
39730
+ const read = await readBlocks("--warm", memFile, signal);
39731
+ return { kind: "warmed", blocks: read, warmMs: Math.round(performance.now() - startedMs) };
39732
+ } catch (error) {
39733
+ return { kind: "failed", error: getErrorMessage(error) };
39734
+ }
39735
+ };
39736
+ const stop = async (impID, end) => {
39737
+ const warm = running.get(impID);
39738
+ if (warm === undefined) {
39739
+ return;
39740
+ }
39741
+ warm.state.end = end;
39742
+ warm.controller.abort();
39743
+ if (warm.state.phase === "running") {
39744
+ await warm.done;
39745
+ return;
39746
+ }
39747
+ running.delete(impID);
39748
+ const warmMs = Math.round(performance.now() - warm.startedMs);
39749
+ logWarm(warm.target, { kind: "ended", end, warmMs }, deps.capMib);
39750
+ };
39751
+ return {
39752
+ start: (target) => {
39753
+ if (lifetime.isStopped) {
39754
+ logWarm(target, { kind: "closed" }, deps.capMib);
39755
+ return;
39756
+ }
39757
+ invariant5(!running.has(target.impID), `imp ${target.impID} slept with its warm running`);
39758
+ const controller = new AbortController;
39759
+ const state = { phase: "queued", end: null };
39760
+ const startedMs = performance.now();
39761
+ const runInSlot = () => {
39762
+ if (controller.signal.aborted) {
39763
+ return Promise.resolve(null);
39764
+ }
39765
+ state.phase = "running";
39766
+ return runWarm(target.memFile, controller.signal);
39767
+ };
39768
+ const runAndLog = async () => {
39769
+ const outcome = await slots.run(runInSlot);
39770
+ if (outcome === null) {
39771
+ return;
39772
+ }
39773
+ running.delete(target.impID);
39774
+ const end = state.end;
39775
+ const warmMs = Math.round(performance.now() - startedMs);
39776
+ const isEnded = outcome.kind === "failed" && end !== null;
39777
+ const logged = isEnded ? { kind: "ended", end, warmMs } : outcome;
39778
+ logWarm(target, logged, deps.capMib);
39779
+ };
39780
+ running.set(target.impID, { target, controller, state, startedMs, done: runAndLog() });
39781
+ },
39782
+ stop,
39783
+ stopAll: async () => {
39784
+ lifetime.isStopped = true;
39785
+ await Promise.all([...running.keys()].map((impID) => stop(impID, "impdStopped")));
39786
+ }
39787
+ };
39788
+ }
39789
+ function logWarm(target, outcome, capMib) {
39790
+ const logger = getImpdLogger("imps").with({ imp: target.name });
39791
+ match11(outcome).with({ kind: "warmed" }, (warmed) => {
39792
+ logger.info("warmed the memory file in {warmMs}ms: {blocks} blocks of 2 MiB", {
39793
+ warmMs: String(warmed.warmMs),
39794
+ blocks: String(warmed.blocks)
39795
+ });
39796
+ }).with({ kind: "overCap" }, (over) => {
39797
+ logger.info("left the memory file cold: its {dataMib} MiB of data pass the warm cap of {capMib} MiB", { dataMib: String(over.blocks * BLOCK_MIB2), capMib: String(capMib) });
39798
+ }).with({ kind: "ended" }, (ended) => {
39799
+ logger.info("stopped the memory file's warm after {warmMs}ms: {reason}", {
39800
+ warmMs: String(ended.warmMs),
39801
+ reason: formatWarmEnd(ended.end)
39802
+ });
39803
+ }).with({ kind: "closed" }, () => {
39804
+ logger.info("left the memory file cold: impd is stopping");
39805
+ }).with({ kind: "failed" }, (failed) => {
39806
+ logger.warning("the memory file's warm failed: {error}", { error: failed.error });
39807
+ }).exhaustive();
39808
+ }
39809
+ function formatWarmEnd(end) {
39810
+ return match11(end).with("woke", () => "the imp woke").with("stopped", () => "the imp stopped").with("destroyed", () => "the imp is destroyed").with("impdStopped", () => "impd stopped").exhaustive();
39811
+ }
39812
+
39704
39813
  // packages/daemon/src/vm/vmm/vm-stats.ts
39705
39814
  import { readFileSync as readFileSync19, readdirSync as readdirSync4 } from "fs";
39706
39815
  import { readFile as readFile3 } from "fs/promises";
@@ -40017,7 +40126,7 @@ function readStep(last, current) {
40017
40126
  }
40018
40127
 
40019
40128
  // packages/daemon/src/imps/imps/session-logs/session-log-service.ts
40020
- import * as z77 from "zod";
40129
+ import * as z78 from "zod";
40021
40130
 
40022
40131
  // packages/daemon/src/imps/imps/session-logs/build-log-key.ts
40023
40132
  function buildLogKey(impId, generation) {
@@ -40036,7 +40145,7 @@ import { basename as basename2, dirname as dirname8, join as join20, resolve as
40036
40145
  import { existsSync as existsSync10, readFileSync as readFileSync20, readdirSync as readdirSync5, rmSync as rmSync16 } from "fs";
40037
40146
  import { mkdir, open as open4, stat, truncate, unlink } from "fs/promises";
40038
40147
  import { join as join19 } from "path";
40039
- import * as z76 from "zod";
40148
+ import * as z77 from "zod";
40040
40149
 
40041
40150
  // packages/daemon/src/imps/imps/session-logs/plan-log-read.ts
40042
40151
  function getLogBounds(segments, origin) {
@@ -40081,20 +40190,20 @@ function planLogRead(segments, origin, from, limit) {
40081
40190
  var META_FILE = "meta.json";
40082
40191
  var SEGMENT_SUFFIX = ".seg";
40083
40192
  var COMMIT_DELAY_MS = 1000;
40084
- var OffsetSchema2 = z76.int().nonnegative();
40085
- var GenerationMetaSchema = z76.object({
40086
- version: z76.literal(1),
40193
+ var OffsetSchema2 = z77.int().nonnegative();
40194
+ var GenerationMetaSchema = z77.object({
40195
+ version: z77.literal(1),
40087
40196
  session: AgentSessionNameSchema,
40088
40197
  executionGeneration: AgentGenerationSchema,
40089
40198
  bootId: AgentBootIdSchema,
40090
- startedAt: z76.int(),
40199
+ startedAt: z77.int(),
40091
40200
  origin: OffsetSchema2,
40092
- segments: z76.array(z76.object({ start: OffsetSchema2, length: OffsetSchema2 })),
40093
- state: z76.enum(["live", "ended"]),
40094
- endedAt: z76.int().optional(),
40201
+ segments: z77.array(z77.object({ start: OffsetSchema2, length: OffsetSchema2 })),
40202
+ state: z77.enum(["live", "ended"]),
40203
+ endedAt: z77.int().optional(),
40095
40204
  end: OffsetSchema2.optional(),
40096
- exitCode: z76.int().nullable().optional(),
40097
- stopped: z76.enum(["disk_full", "imp_limit"]).optional()
40205
+ exitCode: z77.int().nullable().optional(),
40206
+ stopped: z77.enum(["disk_full", "imp_limit"]).optional()
40098
40207
  });
40099
40208
  function getSegmentPath(directory, start) {
40100
40209
  return join19(directory, `${String(start)}${SEGMENT_SUFFIX}`);
@@ -40874,7 +40983,7 @@ function toExitCode(code, signal) {
40874
40983
  }
40875
40984
 
40876
40985
  // packages/daemon/src/imps/imps/session-logs/session-log-service.ts
40877
- var NoSessionPreviousSchema = z77.object({ previous: PreviousGenerationSchema.optional() });
40986
+ var NoSessionPreviousSchema = z78.object({ previous: PreviousGenerationSchema.optional() });
40878
40987
  function createSessionLogs(deps) {
40879
40988
  const openTap = deps.openTap ?? openTapStream;
40880
40989
  const createLog = deps.createLog ?? createGenerationLog;
@@ -41266,6 +41375,11 @@ function createImpContext(deps) {
41266
41375
  readNetBytes: deps.readNetBytes,
41267
41376
  readMemory: deps.readVmMemory,
41268
41377
  readThreadIds: deps.readThreadIds
41378
+ }),
41379
+ memoryWarm: deps.config.hugePages === null ? null : createMemoryWarm({
41380
+ handlerBin: deps.config.hugePages.handlerBin,
41381
+ capMib: deps.config.hugePages.warmCapMib,
41382
+ run: deps.runCommand
41269
41383
  })
41270
41384
  };
41271
41385
  const guest = {
@@ -42344,6 +42458,7 @@ function createImpRuntime(parts) {
42344
42458
  },
42345
42459
  tracker: context.tracker,
42346
42460
  bootTemplates: context.templates,
42461
+ memoryWarm: context.memoryWarm,
42347
42462
  readDiskFullError: () => lastDiskFull.error
42348
42463
  };
42349
42464
  }
@@ -42568,13 +42683,17 @@ function makeSleepImpVm(deps) {
42568
42683
  const sessions = await readSessionsForSleep(imp, paths);
42569
42684
  const services = await sendServicesList(paths.vsockSocket, SERVICES_FOR_SLEEP_MS).catch(() => null);
42570
42685
  const started = context.sleepTiming.now();
42571
- const slept = { detail: { trigger: reason } };
42686
+ const slept = {
42687
+ detail: { trigger: reason },
42688
+ isOnHugePages: false
42689
+ };
42572
42690
  removeSnapshotMeta(paths);
42573
42691
  const hasOomKill = startOomWatch(context.cgroups, imp.id);
42574
42692
  try {
42575
42693
  const cgroup = context.cgroups.setup(imp.id, imp.cpu, imp.memoryMib);
42576
42694
  const timings = await deps.withSleepSlot(() => context.vms.sleepVm(pid, paths, cgroup, paths));
42577
42695
  const booted = readVmIdentity(paths);
42696
+ slept.isOnHugePages = booted?.hugePages === "2M";
42578
42697
  writeSnapshotMeta(paths, {
42579
42698
  ...buildSnapshotIdentity(booted, context.identity),
42580
42699
  createdAt: Date.now(),
@@ -42627,13 +42746,17 @@ function makeSleepImpVm(deps) {
42627
42746
  throw isOomKill ? new Error(`sleep failed: ${OOM_KILL_TRIGGER}`, { cause: error }) : error;
42628
42747
  }
42629
42748
  context.admission.release(imp.id);
42630
- return updateState(imp, {
42749
+ const sleeping = await updateState(imp, {
42631
42750
  reason: "slept",
42632
42751
  detail: slept.detail,
42633
42752
  state: "sleeping",
42634
42753
  pid: null,
42635
42754
  sleptAt: new Date
42636
42755
  });
42756
+ if (slept.isOnHugePages) {
42757
+ context.memoryWarm?.start({ impID: imp.id, name: imp.name, memFile: paths.memFile });
42758
+ }
42759
+ return sleeping;
42637
42760
  };
42638
42761
  const sleepImpVm = async (imp, reason, youngGuest = ALWAYS_WAIT) => {
42639
42762
  requireTransition(imp.state, "sleeping", "sleep");
@@ -42710,6 +42833,7 @@ function makeWakeImpVm(deps) {
42710
42833
  throw buildStoppingError();
42711
42834
  }
42712
42835
  requireNoOopsHold(context, imp);
42836
+ await context.memoryWarm?.stop(imp.id, "woke");
42713
42837
  const paths = context.findPaths(imp.id);
42714
42838
  const meta = readSnapshotMeta(paths);
42715
42839
  const mismatch = meta === null ? "no snapshot it can load" : readColdBootReason(meta, context.identity);
@@ -42907,18 +43031,18 @@ async function waitForAgent(vsockPath, options) {
42907
43031
  }
42908
43032
 
42909
43033
  // packages/daemon/src/vm/vmm/firecracker-client.ts
42910
- import * as z78 from "zod";
42911
- var InstanceInfoSchema = z78.object({ state: z78.enum(["Not started", "Running", "Paused"]) });
42912
- var MachineConfigSchema = z78.object({
42913
- track_dirty_pages: z78.boolean().optional(),
42914
- huge_pages: z78.string().optional()
43034
+ import * as z79 from "zod";
43035
+ var InstanceInfoSchema = z79.object({ state: z79.enum(["Not started", "Running", "Paused"]) });
43036
+ var MachineConfigSchema = z79.object({
43037
+ track_dirty_pages: z79.boolean().optional(),
43038
+ huge_pages: z79.string().optional()
42915
43039
  });
42916
- var BalloonStatsSchema = z78.object({ total_memory: z78.number(), available_memory: z78.number() });
42917
- var HotplugMemorySchema = z78.object({
42918
- plugged_size_mib: z78.number(),
42919
- requested_size_mib: z78.number()
43040
+ var BalloonStatsSchema = z79.object({ total_memory: z79.number(), available_memory: z79.number() });
43041
+ var HotplugMemorySchema = z79.object({
43042
+ plugged_size_mib: z79.number(),
43043
+ requested_size_mib: z79.number()
42920
43044
  });
42921
- var VersionSchema = z78.object({ firecracker_version: z78.string() });
43045
+ var VersionSchema = z79.object({ firecracker_version: z79.string() });
42922
43046
  var DEFAULT_TIMEOUTS = { requestMs: 1e4, snapshotMs: 120000 };
42923
43047
 
42924
43048
  class FirecrackerApiError extends Error {
@@ -43909,6 +44033,7 @@ function createImpVmOps(host) {
43909
44033
  const startNewImpVm = (imp, diskReady) => startColdImpVm(imp, "start", null, diskReady);
43910
44034
  const stopImpVm = async (imp, graceful = true) => {
43911
44035
  const paths = context.findPaths(imp.id);
44036
+ await context.memoryWarm?.stop(imp.id, "stopped");
43912
44037
  if (imp.pid !== null) {
43913
44038
  await context.vms.stopVm(imp.pid, paths, graceful);
43914
44039
  }
@@ -44016,7 +44141,7 @@ function countStepsMs(timings) {
44016
44141
  }
44017
44142
 
44018
44143
  // packages/daemon/src/imps/imps/services/service-api.ts
44019
- import { match as match11 } from "ts-pattern";
44144
+ import { match as match12 } from "ts-pattern";
44020
44145
 
44021
44146
  // packages/daemon/src/imps/imps/services/create-log-decoders.ts
44022
44147
  function createLogDecoders() {
@@ -44240,7 +44365,7 @@ function handleAgentError(service) {
44240
44365
  if (!(error instanceof AgentError)) {
44241
44366
  throw error;
44242
44367
  }
44243
- throw match11(error.code).with("NO_SERVICE", () => buildNotFoundError("service", service)).with("SERVICE_EXISTS", () => buildConflictError("service", service)).with("BAD_REQUEST", () => new ImpdError("BAD_REQUEST", { message: error.detail })).with("AGENT_OUTDATED", () => buildAgentOutdatedApiError(error.message)).otherwise(() => error);
44368
+ throw match12(error.code).with("NO_SERVICE", () => buildNotFoundError("service", service)).with("SERVICE_EXISTS", () => buildConflictError("service", service)).with("BAD_REQUEST", () => new ImpdError("BAD_REQUEST", { message: error.detail })).with("AGENT_OUTDATED", () => buildAgentOutdatedApiError(error.message)).otherwise(() => error);
44244
44369
  };
44245
44370
  }
44246
44371
  function stopStreams(streams) {
@@ -45676,6 +45801,7 @@ function createImpdImps(config, deps, parts) {
45676
45801
  cgroups,
45677
45802
  memoryLimit,
45678
45803
  readExecEnv: parts.broker.readExecEnv,
45804
+ runCommand: deps.runCommand ?? runCommand,
45679
45805
  storageGate: parts.storage.storageGate,
45680
45806
  diskBudget: parts.storage.diskBudget,
45681
45807
  readDiskUsage: parts.storage.diskUsage.read,
@@ -45876,79 +46002,79 @@ function buildOfferedDigests(digest, receivedDigest) {
45876
46002
  var COMMIT_WINDOW_MS = 24 * 60 * 60 * 1000;
45877
46003
 
45878
46004
  // packages/daemon/src/imp-ops/moves/move-header.ts
45879
- import * as z79 from "zod";
45880
- var CpuSchema = z79.object({ limit: z79.number().positive().nullable(), weight: z79.int() }).readonly();
45881
- var EgressSchema = z79.object({ mode: z79.string(), allow: z79.array(z79.string()).readonly() }).readonly();
45882
- var CheckpointSchema3 = z79.object({
45883
- label: z79.string().nullable(),
45884
- createdAt: z79.coerce.date(),
45885
- diskBytes: z79.int().positive()
46005
+ import * as z80 from "zod";
46006
+ var CpuSchema = z80.object({ limit: z80.number().positive().nullable(), weight: z80.int() }).readonly();
46007
+ var EgressSchema = z80.object({ mode: z80.string(), allow: z80.array(z80.string()).readonly() }).readonly();
46008
+ var CheckpointSchema3 = z80.object({
46009
+ label: z80.string().nullable(),
46010
+ createdAt: z80.coerce.date(),
46011
+ diskBytes: z80.int().positive()
45886
46012
  }).readonly();
45887
- var MovedBootSchema = z79.object({ bootId: z79.uuid(), cause: ColdBootCauseSchema, at: z79.iso.datetime() }).readonly();
46013
+ var MovedBootSchema = z80.object({ bootId: z80.uuid(), cause: ColdBootCauseSchema, at: z80.iso.datetime() }).readonly();
45888
46014
  var MAX_MOVED_LEASES = 1024;
45889
46015
  var MAX_LEASE_REMAINING_MS = 100 * 365 * 24 * 60 * 60 * 1000;
45890
- var LeaseOwnerTextSchema = z79.string().min(1).max(256);
45891
- var MovedLeaseOwnerSchema = z79.object({
46016
+ var LeaseOwnerTextSchema = z80.string().min(1).max(256);
46017
+ var MovedLeaseOwnerSchema = z80.object({
45892
46018
  principal: LeaseOwnerTextSchema,
45893
46019
  label: LeaseLabelSchema,
45894
46020
  display: LeaseOwnerTextSchema
45895
46021
  });
45896
46022
  var MovedLeaseSchema = MovedLeaseOwnerSchema.extend({
45897
- remainingMs: z79.int().nonnegative().max(MAX_LEASE_REMAINING_MS).nullable(),
45898
- createdAt: z79.coerce.date()
46023
+ remainingMs: z80.int().nonnegative().max(MAX_LEASE_REMAINING_MS).nullable(),
46024
+ createdAt: z80.coerce.date()
45899
46025
  }).readonly();
45900
- var FilteredGrantSchema2 = z79.object({ secret: z79.string(), filter: GrantFilterSchema }).readonly();
45901
- var ImpSchema2 = z79.object({
45902
- id: z79.uuid(),
45903
- name: z79.string(),
45904
- clonedDigest: z79.string().optional(),
45905
- vcpus: z79.int().positive(),
45906
- memoryMib: z79.int().positive(),
45907
- maxMemoryMib: z79.int().positive().optional(),
45908
- httpPort: z79.int().positive(),
45909
- diskBytes: z79.int().positive(),
46026
+ var FilteredGrantSchema2 = z80.object({ secret: z80.string(), filter: GrantFilterSchema }).readonly();
46027
+ var ImpSchema2 = z80.object({
46028
+ id: z80.uuid(),
46029
+ name: z80.string(),
46030
+ clonedDigest: z80.string().optional(),
46031
+ vcpus: z80.int().positive(),
46032
+ memoryMib: z80.int().positive(),
46033
+ maxMemoryMib: z80.int().positive().optional(),
46034
+ httpPort: z80.int().positive(),
46035
+ diskBytes: z80.int().positive(),
45910
46036
  cpu: CpuSchema,
45911
46037
  egress: EgressSchema,
45912
- grants: z79.array(z79.string()).readonly(),
45913
- filteredGrants: z79.array(FilteredGrantSchema2).readonly().default([]),
45914
- isIdentityResetPending: z79.boolean(),
45915
- isDiskGrowPending: z79.boolean().default(false),
45916
- isBackedUp: z79.boolean().default(true),
45917
- coldBoots: z79.array(MovedBootSchema).max(4).readonly().default([]),
45918
- leases: z79.array(MovedLeaseSchema).max(MAX_MOVED_LEASES).readonly().optional()
46038
+ grants: z80.array(z80.string()).readonly(),
46039
+ filteredGrants: z80.array(FilteredGrantSchema2).readonly().default([]),
46040
+ isIdentityResetPending: z80.boolean(),
46041
+ isDiskGrowPending: z80.boolean().default(false),
46042
+ isBackedUp: z80.boolean().default(true),
46043
+ coldBoots: z80.array(MovedBootSchema).max(4).readonly().default([]),
46044
+ leases: z80.array(MovedLeaseSchema).max(MAX_MOVED_LEASES).readonly().optional()
45919
46045
  }).readonly();
45920
- var StreamStepSchema = z79.object({
45921
- checkpoint: z79.int().nonnegative().nullable(),
45922
- dataset: z79.int().nonnegative(),
45923
- base: z79.int().nonnegative().nullable()
46046
+ var StreamStepSchema = z80.object({
46047
+ checkpoint: z80.int().nonnegative().nullable(),
46048
+ dataset: z80.int().nonnegative(),
46049
+ base: z80.int().nonnegative().nullable()
45924
46050
  }).readonly();
45925
- var HeldAnswerSchema = z79.object({
45926
- names: z79.array(z79.string()).readonly(),
45927
- address: z79.string(),
45928
- ttlS: z79.int().positive()
46051
+ var HeldAnswerSchema = z80.object({
46052
+ names: z80.array(z80.string()).readonly(),
46053
+ address: z80.string(),
46054
+ ttlS: z80.int().positive()
45929
46055
  }).readonly();
45930
- var WarmSchema = z79.object({
46056
+ var WarmSchema = z80.object({
45931
46057
  move: WarmMoveSchema,
45932
46058
  meta: SnapshotMetaSchema.extend({ systemDrive: SystemDriveSchema }),
45933
46059
  vm: VmIdentitySchema.nullable(),
45934
- isDriveIncluded: z79.boolean(),
45935
- answers: z79.array(HeldAnswerSchema).readonly()
46060
+ isDriveIncluded: z80.boolean(),
46061
+ answers: z80.array(HeldAnswerSchema).readonly()
45936
46062
  }).readonly();
45937
- var MoveHeaderSchema = z79.object({
45938
- version: z79.literal(1),
46063
+ var MoveHeaderSchema = z80.object({
46064
+ version: z80.literal(1),
45939
46065
  imp: ImpSchema2,
45940
- image: z79.object({
45941
- name: z79.string(),
45942
- ref: z79.string(),
45943
- digest: z79.string(),
45944
- receivedDigest: z79.string().nullable().default(null),
45945
- sizeBytes: z79.int().nonnegative(),
46066
+ image: z80.object({
46067
+ name: z80.string(),
46068
+ ref: z80.string(),
46069
+ digest: z80.string(),
46070
+ receivedDigest: z80.string().nullable().default(null),
46071
+ sizeBytes: z80.int().nonnegative(),
45946
46072
  source: ImageSourceSchema,
45947
- sourceImp: z79.string().nullable(),
45948
- isIncluded: z79.boolean()
46073
+ sourceImp: z80.string().nullable(),
46074
+ isIncluded: z80.boolean()
45949
46075
  }),
45950
- checkpoints: z79.array(CheckpointSchema3).readonly(),
45951
- streams: z79.array(StreamStepSchema).readonly().nullable(),
46076
+ checkpoints: z80.array(CheckpointSchema3).readonly(),
46077
+ streams: z80.array(StreamStepSchema).readonly().nullable(),
45952
46078
  warm: WarmSchema.nullable().default(null)
45953
46079
  }).readonly();
45954
46080
  var MOVE_PART_HEADER = "x-imp-move-part";
@@ -46110,7 +46236,7 @@ class MoveRequestError extends ImpdError {
46110
46236
  }
46111
46237
 
46112
46238
  // packages/daemon/src/imp-ops/moves/move-tickets.ts
46113
- import * as z80 from "zod";
46239
+ import * as z81 from "zod";
46114
46240
  var MOVE_AUTH_SCHEME = "ImpMove";
46115
46241
  var MOVE_TICKET_PREFIX = "";
46116
46242
  function isSameHash(leftItem, rightItem) {
@@ -46124,19 +46250,19 @@ function readTicketHeader(request) {
46124
46250
  function buildTicketHeader(ticket) {
46125
46251
  return { authorization: `${MOVE_AUTH_SCHEME} ${ticket}` };
46126
46252
  }
46127
- var ReceiptFileSchema = z80.object({
46128
- kind: z80.string(),
46129
- index: z80.int().nonnegative().optional(),
46130
- sha256: z80.string(),
46131
- bytes: z80.int().nonnegative()
46253
+ var ReceiptFileSchema = z81.object({
46254
+ kind: z81.string(),
46255
+ index: z81.int().nonnegative().optional(),
46256
+ sha256: z81.string(),
46257
+ bytes: z81.int().nonnegative()
46132
46258
  });
46133
- var ReceiptBodySchema = z80.object({
46134
- ticketId: z80.string(),
46135
- name: z80.string(),
46136
- impId: z80.string(),
46137
- files: z80.array(ReceiptFileSchema)
46259
+ var ReceiptBodySchema = z81.object({
46260
+ ticketId: z81.string(),
46261
+ name: z81.string(),
46262
+ impId: z81.string(),
46263
+ files: z81.array(ReceiptFileSchema)
46138
46264
  });
46139
- var ReceiptSchema = z80.object({ body: z80.string(), mac: z80.string() });
46265
+ var ReceiptSchema = z81.object({ body: z81.string(), mac: z81.string() });
46140
46266
  function buildReceipt(body, secret) {
46141
46267
  const text = JSON.stringify(body);
46142
46268
  return { body: text, mac: sign(secret, text).toString("hex") };
@@ -46152,7 +46278,7 @@ function readReceipt(receipt, secret) {
46152
46278
  import { mkdirSync as mkdirSync19, rmSync as rmSync23 } from "fs";
46153
46279
  import { open as open7 } from "fs/promises";
46154
46280
  import { join as join25 } from "path";
46155
- import invariant5 from "tiny-invariant";
46281
+ import invariant6 from "tiny-invariant";
46156
46282
 
46157
46283
  // packages/daemon/src/imp-ops/moves/build-received-digest.ts
46158
46284
  import { createHash as createHash5 } from "crypto";
@@ -46361,7 +46487,7 @@ function createByteCounter(limit) {
46361
46487
  // packages/daemon/src/imp-ops/moves/move-frames.ts
46362
46488
  import { createHash as createHash8 } from "crypto";
46363
46489
  import { open as open6 } from "fs/promises";
46364
- import * as z81 from "zod";
46490
+ import * as z82 from "zod";
46365
46491
 
46366
46492
  // packages/daemon/src/imp-ops/moves/create-content-hash.ts
46367
46493
  import { createHash as createHash7 } from "crypto";
@@ -46399,8 +46525,8 @@ var MOVE_BLOCK_BYTES = 1024 * 1024;
46399
46525
  var OFFSET_BYTES = 8;
46400
46526
  var HEADER_BYTES3 = 5;
46401
46527
  var MAX_PAYLOAD_BYTES = MOVE_BLOCK_BYTES + OFFSET_BYTES;
46402
- var MoveFileSchema = z81.object({
46403
- kind: z81.enum([
46528
+ var MoveFileSchema = z82.object({
46529
+ kind: z82.enum([
46404
46530
  "image-rootfs",
46405
46531
  "image-config",
46406
46532
  "checkpoint",
@@ -46410,13 +46536,13 @@ var MoveFileSchema = z81.object({
46410
46536
  "vmstate",
46411
46537
  "mem"
46412
46538
  ]),
46413
- index: z81.int().nonnegative().optional(),
46414
- sizeBytes: z81.int().nonnegative()
46539
+ index: z82.int().nonnegative().optional(),
46540
+ sizeBytes: z82.int().nonnegative()
46415
46541
  });
46416
46542
  function createFileContentHash(file) {
46417
46543
  return file.kind === "image-rootfs" || file.kind === "image-config" ? createContentHash(file.sizeBytes) : null;
46418
46544
  }
46419
- var FileEndSchema = z81.object({ sha256: z81.string() });
46545
+ var FileEndSchema = z82.object({ sha256: z82.string() });
46420
46546
  function encodeFrame2(type, payload) {
46421
46547
  const frame = new Uint8Array(HEADER_BYTES3 + payload.length);
46422
46548
  const view = new DataView(frame.buffer);
@@ -46943,7 +47069,7 @@ async function requireImage(deps, options) {
46943
47069
  { kind: "image-rootfs", sha256: rootfs.sha256, bytes: rootfs.bytes },
46944
47070
  { kind: "image-config", sha256: config.sha256, bytes: config.bytes }
46945
47071
  ];
46946
- invariant5(rootfs.contentSha256 !== null && config.contentSha256 !== null);
47072
+ invariant6(rootfs.contentSha256 !== null && config.contentSha256 !== null);
46947
47073
  const digest = buildReceivedDigest(rootfs.contentSha256, config.contentSha256);
46948
47074
  const known = await readImageInUse(deps.db, [digest], deps.now());
46949
47075
  if (known !== undefined) {
@@ -47252,8 +47378,8 @@ function readSettled2(row, imp) {
47252
47378
  }
47253
47379
 
47254
47380
  // packages/daemon/src/imp-ops/moves/move-sender.ts
47255
- import invariant6 from "tiny-invariant";
47256
- import { match as match12 } from "ts-pattern";
47381
+ import invariant7 from "tiny-invariant";
47382
+ import { match as match13 } from "ts-pattern";
47257
47383
 
47258
47384
  // packages/daemon/src/platform/db/move-send-steps.ts
47259
47385
  var MOVE_SEND_STEPS = [
@@ -47816,7 +47942,7 @@ function createMoveSender(deps) {
47816
47942
  };
47817
47943
  const recoverSend = async (imp, row) => {
47818
47944
  const log = getImpdLogger("move").with({ imp: imp.name });
47819
- await match12(pickSendRecovery(imp.moveState, row?.step)).with("unmark", () => removeMark(imp)).with("wait", () => {
47945
+ await match13(pickSendRecovery(imp.moveState, row?.step)).with("unmark", () => removeMark(imp)).with("wait", () => {
47820
47946
  log.info("a prepared send waits for its send after a restart");
47821
47947
  }).with("abort", async () => {
47822
47948
  const isUndone = await resetSend(imp, row?.peer_url ?? null, row?.ticket ?? null);
@@ -47824,7 +47950,7 @@ function createMoveSender(deps) {
47824
47950
  log.info("a send cut short by a restart was undone");
47825
47951
  }
47826
47952
  }).with("commit", async () => {
47827
- invariant6(row !== undefined && row.peer_url !== null && row.ticket !== null);
47953
+ invariant7(row !== undefined && row.peer_url !== null && row.ticket !== null);
47828
47954
  const moved = imp.moveState === "moved" ? imp : await updateImpMove(deps.db, imp.id, "moved");
47829
47955
  await runCommitAfterRestart(moved, row.peer_url, row.ticket);
47830
47956
  }).with("none", () => {}).exhaustive();
@@ -47938,7 +48064,7 @@ function buildPublicError(name) {
47938
48064
  }
47939
48065
  function pickSendRecovery(moveState, step) {
47940
48066
  if (moveState === "sending") {
47941
- return match12(step).with(undefined, () => "unmark").with("prepared", () => "wait").with("streaming", () => "abort").with("sent", () => "commit").exhaustive();
48067
+ return match13(step).with(undefined, () => "unmark").with("prepared", () => "wait").with("streaming", () => "abort").with("sent", () => "commit").exhaustive();
47942
48068
  }
47943
48069
  return moveState === "moved" && step === "sent" ? "commit" : "none";
47944
48070
  }
@@ -47990,7 +48116,7 @@ function createMoveService(deps) {
47990
48116
  // packages/daemon/src/surface/moves/create-move-peer-handler.ts
47991
48117
  import { OpenAPIHandler } from "@orpc/openapi/fetch";
47992
48118
  import { ORPCError as ORPCError7, implement as implement3, onError as onError3 } from "@orpc/server";
47993
- import { match as match13 } from "ts-pattern";
48119
+ import { match as match14 } from "ts-pattern";
47994
48120
  function createMovePeerHandler(deps) {
47995
48121
  const withTicket = async (step, context, call) => {
47996
48122
  const startedAt = deps.now();
@@ -48041,7 +48167,7 @@ function createMovePeerHandler(deps) {
48041
48167
  const respondReceive = async (context) => {
48042
48168
  try {
48043
48169
  const received = await withTicket("receive", context, (checked) => deps.calls.receive(checked, context.request));
48044
- return match13(received).with({ kind: "part" }, (sent) => Response.json({ part: sent.part }, { status: 202 })).with({ kind: "receipt" }, (sent) => Response.json(sent.receipt)).exhaustive();
48170
+ return match14(received).with({ kind: "part" }, (sent) => Response.json({ part: sent.part }, { status: 202 })).with({ kind: "receipt" }, (sent) => Response.json(sent.receipt)).exhaustive();
48045
48171
  } catch (error) {
48046
48172
  const failure = toPeerError(error);
48047
48173
  return Response.json(encodePeerError(failure), { status: failure.status });
@@ -48085,7 +48211,7 @@ import {
48085
48211
  } from "@orpc/client";
48086
48212
  import { ResponseValidationPlugin } from "@orpc/contract/plugins";
48087
48213
  import { OpenAPILink } from "@orpc/openapi-client/fetch";
48088
- import * as z82 from "zod";
48214
+ import * as z83 from "zod";
48089
48215
  function makeConnectMovePeer(deps) {
48090
48216
  return (target) => {
48091
48217
  const sendLinkRequest = async (request) => {
@@ -48131,7 +48257,7 @@ function makeConnectMovePeer(deps) {
48131
48257
  };
48132
48258
  };
48133
48259
  }
48134
- var PeerErrorBodySchema = z82.looseObject({ error: z82.string().optional() });
48260
+ var PeerErrorBodySchema = z83.looseObject({ error: z83.string().optional() });
48135
48261
  function decodePeerError(body, response) {
48136
48262
  const parsed = PeerErrorBodySchema.safeParse(body);
48137
48263
  if (!parsed.success) {
@@ -48891,7 +49017,7 @@ import { join as join30, posix as posix3 } from "path";
48891
49017
 
48892
49018
  // packages/local-tar/src/extract-local.ts
48893
49019
  import tar from "tar-stream";
48894
- import * as z83 from "zod";
49020
+ import * as z84 from "zod";
48895
49021
  // packages/local-tar/src/pack-build-context.ts
48896
49022
  import { existsSync as existsSync18 } from "fs";
48897
49023
  import { lstat, readFile as readFile4, readdir } from "fs/promises";
@@ -50021,14 +50147,14 @@ function renderPinnedDockerfile(dockerfile, pins, platform) {
50021
50147
  }
50022
50148
 
50023
50149
  // packages/daemon/src/imps/images/pull/image-pin.ts
50024
- import * as z84 from "zod";
50150
+ import * as z85 from "zod";
50025
50151
  var PIN_INSPECT_FORMAT = '{"Id":{{json .Id}},"RepoDigests":{{json .RepoDigests}},"Os":{{json .Os}},"Architecture":{{json .Architecture}},"Config":{{json .Config}}}';
50026
- var ConfigSchema = z84.object({ OnBuild: z84.array(z84.unknown()).readonly().nullish() }).nullable();
50027
- var PinInspectSchema = z84.object({
50028
- Id: z84.string(),
50029
- RepoDigests: z84.array(z84.string()).readonly().nullable(),
50030
- Os: z84.string(),
50031
- Architecture: z84.string(),
50152
+ var ConfigSchema = z85.object({ OnBuild: z85.array(z85.unknown()).readonly().nullish() }).nullable();
50153
+ var PinInspectSchema = z85.object({
50154
+ Id: z85.string(),
50155
+ RepoDigests: z85.array(z85.string()).readonly().nullable(),
50156
+ Os: z85.string(),
50157
+ Architecture: z85.string(),
50032
50158
  Config: ConfigSchema
50033
50159
  }).transform((inspect) => ({
50034
50160
  Id: inspect.Id,
@@ -50090,7 +50216,7 @@ impd pinned ${pinned}. On the containerd image store a retag of a multi-platform
50090
50216
  }
50091
50217
 
50092
50218
  // packages/daemon/src/imps/images/build/build-engine.ts
50093
- import * as z85 from "zod";
50219
+ import * as z86 from "zod";
50094
50220
 
50095
50221
  // packages/daemon/src/imps/docker-contract/dockerfile-frontend.ts
50096
50222
  var DOCKERFILE_FRONTEND = "docker/dockerfile:1.28@sha256:bb22d9815c728170f72750f4e5b0d672e06176142e1d602c7e66c050100b7e5b";
@@ -50124,7 +50250,7 @@ function createBuildEngine(run) {
50124
50250
  if (version.exitCode !== 0) {
50125
50251
  throw new Error(`docker version: ${version.stderr.trim()}`);
50126
50252
  }
50127
- const [os, arch] = z85.tuple([z85.string(), z85.string()]).parse(version.stdout.trim().split(" ").map((part) => JSON.parse(part)));
50253
+ const [os, arch] = z86.tuple([z86.string(), z86.string()]).parse(version.stdout.trim().split(" ").map((part) => JSON.parse(part)));
50128
50254
  return normalizePlatform(os, arch);
50129
50255
  },
50130
50256
  loadImage: async (image, signal) => {
@@ -50226,7 +50352,7 @@ class DockerBuildError extends Error {
50226
50352
  }
50227
50353
 
50228
50354
  // packages/daemon/src/imps/images/build/guest-build.ts
50229
- import * as z86 from "zod";
50355
+ import * as z87 from "zod";
50230
50356
 
50231
50357
  // packages/daemon/src/imps/images/build/image-limit-error.ts
50232
50358
  class ImageLimitError extends ImpdError {
@@ -50498,8 +50624,8 @@ function createPlainLines(output) {
50498
50624
  // packages/daemon/src/imps/images/build/guest-build.ts
50499
50625
  var GUEST_BUILD_TAG = "imp-build:latest";
50500
50626
  var LOG_MAX_CHARS = 8000;
50501
- var ContainerIdSchema = z86.string().regex(/^[a-f0-9]{64}$/v);
50502
- var OciConfigSchema = z86.record(z86.string(), z86.unknown()).nullable();
50627
+ var ContainerIdSchema = z87.string().regex(/^[a-f0-9]{64}$/v);
50628
+ var OciConfigSchema = z87.record(z87.string(), z87.unknown()).nullable();
50503
50629
  async function runGuestBuild(exec, options) {
50504
50630
  const lines = options.output === undefined ? null : createPlainLines(options.output);
50505
50631
  const result = await exec([
@@ -50854,7 +50980,7 @@ function normalizeDockerfilePath(path) {
50854
50980
  }
50855
50981
 
50856
50982
  // packages/daemon/src/imps/images/image-naming.ts
50857
- import * as z87 from "zod";
50983
+ import * as z88 from "zod";
50858
50984
  var MAX_NAME_LENGTH2 = 31;
50859
50985
  function deriveImageName(ref) {
50860
50986
  const lastSegment = parseImageReference(ref).path.split("/").at(-1) ?? "";
@@ -50864,10 +50990,10 @@ function deriveImageName(ref) {
50864
50990
  }
50865
50991
  return name;
50866
50992
  }
50867
- var OciConfigSchema2 = z87.object({
50868
- Env: z87.array(z87.string()).nullish(),
50869
- WorkingDir: z87.string().nullish(),
50870
- User: z87.string().nullish()
50993
+ var OciConfigSchema2 = z88.object({
50994
+ Env: z88.array(z88.string()).nullish(),
50995
+ WorkingDir: z88.string().nullish(),
50996
+ User: z88.string().nullish()
50871
50997
  }).nullish();
50872
50998
  function buildImageRuntimeConfig(ociConfig) {
50873
50999
  const parsed = OciConfigSchema2.parse(ociConfig);
@@ -50883,10 +51009,10 @@ import { existsSync as existsSync20, mkdirSync as mkdirSync22, rmSync as rmSync2
50883
51009
  import { join as join32 } from "path";
50884
51010
 
50885
51011
  // packages/daemon/src/imps/images/rootfs/read-oci-config.ts
50886
- import * as z88 from "zod";
50887
- var OciConfigSchema3 = z88.object({
50888
- digest: z88.string().regex(/^sha256:[a-f0-9]{64}$/v),
50889
- config: z88.record(z88.string(), z88.unknown()).nullable()
51012
+ import * as z89 from "zod";
51013
+ var OciConfigSchema3 = z89.object({
51014
+ digest: z89.string().regex(/^sha256:[a-f0-9]{64}$/v),
51015
+ config: z89.record(z89.string(), z89.unknown()).nullable()
50890
51016
  });
50891
51017
  async function readOciConfig(ref, signal, run) {
50892
51018
  const argv = ["oci-fetch", "config", ref];
@@ -51710,11 +51836,11 @@ function createImpdStorage(config, deps) {
51710
51836
  }
51711
51837
 
51712
51838
  // packages/daemon/src/host-net/net/tailscale-status.ts
51713
- import * as z89 from "zod";
51714
- var IpListSchema = z89.array(z89.string()).nullable().optional();
51715
- var StatusSchema = z89.object({
51716
- BackendState: z89.string(),
51717
- Self: z89.object({ HostName: z89.string(), DNSName: z89.string().optional(), TailscaleIPs: IpListSchema }).optional()
51839
+ import * as z90 from "zod";
51840
+ var IpListSchema = z90.array(z90.string()).nullable().optional();
51841
+ var StatusSchema = z90.object({
51842
+ BackendState: z90.string(),
51843
+ Self: z90.object({ HostName: z90.string(), DNSName: z90.string().optional(), TailscaleIPs: IpListSchema }).optional()
51718
51844
  });
51719
51845
  var UNKNOWN = { state: null, hostname: null, dnsName: null, ip: null, ips: [] };
51720
51846
  var STATUS_TTL_MS = 30000;
@@ -51997,18 +52123,18 @@ import { getOAuthProviderApi } from "@better-auth/oauth-provider";
51997
52123
  import { createAuthEndpoint } from "better-auth/api";
51998
52124
  import { setSessionCookie } from "better-auth/cookies";
51999
52125
  import { generateRandomString } from "better-auth/crypto";
52000
- import * as z90 from "zod";
52126
+ import * as z91 from "zod";
52001
52127
  var CLIENT_SCOPES = [...ScopeSchema.options, "offline_access"];
52002
52128
  var APPROVAL_EMAIL_DOMAIN = "approval.imp.invalid";
52003
- var SignInBodySchema = z90.object({
52004
- oauth_query: z90.string(),
52005
- tokenID: z90.string().min(1),
52006
- tokenName: z90.string().min(1),
52007
- imps: z90.array(z90.string()).nullable()
52129
+ var SignInBodySchema = z91.object({
52130
+ oauth_query: z91.string(),
52131
+ tokenID: z91.string().min(1),
52132
+ tokenName: z91.string().min(1),
52133
+ imps: z91.array(z91.string()).nullable()
52008
52134
  });
52009
- var FixedClientBodySchema = z90.object({
52010
- name: z90.string().min(1),
52011
- redirectURIs: z90.array(z90.string()).min(1)
52135
+ var FixedClientBodySchema = z91.object({
52136
+ name: z91.string().min(1),
52137
+ redirectURIs: z91.array(z91.string()).min(1)
52012
52138
  });
52013
52139
  function createApproverPlugin() {
52014
52140
  return {
@@ -52034,7 +52160,7 @@ function createApproverPlugin() {
52034
52160
  }),
52035
52161
  verifyMCPAccessToken: createAuthEndpoint("/imp/verify-access-token", {
52036
52162
  method: "POST",
52037
- body: z90.object({ token: z90.string() }),
52163
+ body: z91.object({ token: z91.string() }),
52038
52164
  metadata: { SERVER_ONLY: true }
52039
52165
  }, async (ctx) => {
52040
52166
  const provider = ctx.context.getPlugin("oauth-provider");
@@ -52078,7 +52204,7 @@ function createApproverPlugin() {
52078
52204
 
52079
52205
  // packages/daemon/src/identity/oauth/create-oauth-handlers.ts
52080
52206
  import { verifyOAuthQueryParams } from "@better-auth/oauth-provider";
52081
- import * as z91 from "zod";
52207
+ import * as z92 from "zod";
52082
52208
 
52083
52209
  // packages/daemon/src/identity/oauth/build-bad-token-request.ts
52084
52210
  function buildBadTokenRequest() {
@@ -52306,14 +52432,14 @@ function expandScopes(asked) {
52306
52432
  }
52307
52433
 
52308
52434
  // packages/daemon/src/platform/http/render-html.ts
52309
- import { P as P4, match as match14 } from "ts-pattern";
52435
+ import { P as P4, match as match15 } from "ts-pattern";
52310
52436
  var MARKUP = Symbol("markup");
52311
52437
  function renderHTML(strings, ...parts) {
52312
52438
  const html = parts.reduce((text, part, index) => `${text}${toHTML(part)}${strings[index + 1] ?? ""}`, strings[0] ?? "");
52313
52439
  return { [MARKUP]: true, html };
52314
52440
  }
52315
52441
  function toHTML(part) {
52316
- return match14(part).with(P4.string, (text) => escapeHTML(text)).with(P4.array(), (list) => list.map((each) => each.html).join("")).with({ html: P4.string }, (markup) => markup.html).exhaustive();
52442
+ return match15(part).with(P4.string, (text) => escapeHTML(text)).with(P4.array(), (list) => list.map((each) => each.html).join("")).with({ html: P4.string }, (markup) => markup.html).exhaustive();
52317
52443
  }
52318
52444
  function escapeHTML(text) {
52319
52445
  return text.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
@@ -52450,9 +52576,9 @@ var MINUTE_MS2 = 60000;
52450
52576
  var CONSENT_MS = 10 * MINUTE_MS2;
52451
52577
  var MAX_FORM_BYTES = 16 * 1024;
52452
52578
  var METADATA_HEADERS = { "cache-control": "no-store" };
52453
- var PKCEMissSchema = z91.object({
52454
- error: z91.literal("invalid_request"),
52455
- error_description: z91.literal("code verification failed")
52579
+ var PKCEMissSchema = z92.object({
52580
+ error: z92.literal("invalid_request"),
52581
+ error_description: z92.literal("code verification failed")
52456
52582
  });
52457
52583
  function createOAuthHandlers(deps) {
52458
52584
  const host = new URL(deps.origin).host;
@@ -53144,8 +53270,8 @@ function loadOrCreateHostId(dataDir) {
53144
53270
 
53145
53271
  // packages/daemon/src/network/tailnet-names/oauth-credential.ts
53146
53272
  import { readFileSync as readFileSync29, statSync as statSync14 } from "fs";
53147
- import * as z92 from "zod";
53148
- var CredentialSchema = z92.object({ clientId: z92.string().min(1), clientSecret: z92.string().min(1) });
53273
+ import * as z93 from "zod";
53274
+ var CredentialSchema = z93.object({ clientId: z93.string().min(1), clientSecret: z93.string().min(1) });
53149
53275
  function readOAuthCredential(path) {
53150
53276
  const mode = statSync14(path).mode & 511;
53151
53277
  if ((mode & 63) !== 0) {
@@ -53166,17 +53292,17 @@ function readJson(path) {
53166
53292
  }
53167
53293
 
53168
53294
  // packages/daemon/src/host-net/net/tailscale-serve.ts
53169
- import * as z93 from "zod";
53170
- var HandlerSchema = z93.object({ Proxy: z93.string().optional() });
53171
- var WebSchema = z93.object({
53172
- Handlers: z93.record(z93.string(), HandlerSchema).nullable().optional()
53295
+ import * as z94 from "zod";
53296
+ var HandlerSchema = z94.object({ Proxy: z94.string().optional() });
53297
+ var WebSchema = z94.object({
53298
+ Handlers: z94.record(z94.string(), HandlerSchema).nullable().optional()
53173
53299
  });
53174
- var ServiceConfigSchema = z93.object({
53175
- Web: z93.record(z93.string(), WebSchema).nullable().optional()
53300
+ var ServiceConfigSchema = z94.object({
53301
+ Web: z94.record(z94.string(), WebSchema).nullable().optional()
53176
53302
  });
53177
- var ServeStatusSchema = z93.object({
53178
- TCP: z93.record(z93.string(), z93.unknown()).optional(),
53179
- Services: z93.record(z93.string(), ServiceConfigSchema).nullable().optional()
53303
+ var ServeStatusSchema = z94.object({
53304
+ TCP: z94.record(z94.string(), z94.unknown()).optional(),
53305
+ Services: z94.record(z94.string(), ServiceConfigSchema).nullable().optional()
53180
53306
  });
53181
53307
  function parseServeStatus(json) {
53182
53308
  try {
@@ -53227,17 +53353,17 @@ function createServiceServe(run = runChecked) {
53227
53353
  }
53228
53354
 
53229
53355
  // packages/daemon/src/network/tailnet-names/services-api.ts
53230
- import * as z94 from "zod";
53356
+ import * as z95 from "zod";
53231
53357
  var TAILSCALE_API = "https://api.tailscale.com/api/v2";
53232
53358
  var TOKEN_MARGIN_MS = 60000;
53233
- var ServiceSchema2 = z94.object({
53234
- name: z94.string(),
53235
- comment: z94.string().optional(),
53236
- ports: z94.array(z94.string()).readonly().optional(),
53237
- tags: z94.array(z94.string()).readonly().nullable().optional()
53359
+ var ServiceSchema2 = z95.object({
53360
+ name: z95.string(),
53361
+ comment: z95.string().optional(),
53362
+ ports: z95.array(z95.string()).readonly().optional(),
53363
+ tags: z95.array(z95.string()).readonly().nullable().optional()
53238
53364
  }).readonly();
53239
- var ServiceListSchema2 = z94.object({ vipServices: z94.array(ServiceSchema2).nullable().optional() });
53240
- var TokenSchema3 = z94.object({ access_token: z94.string(), expires_in: z94.number().positive() });
53365
+ var ServiceListSchema2 = z95.object({ vipServices: z95.array(ServiceSchema2).nullable().optional() });
53366
+ var TokenSchema3 = z95.object({ access_token: z95.string(), expires_in: z95.number().positive() });
53241
53367
 
53242
53368
  class TailscaleApiError extends Error {
53243
53369
  status;
@@ -53326,7 +53452,7 @@ function createServicesApi(options) {
53326
53452
  }
53327
53453
  };
53328
53454
  }
53329
- var ErrorSchema = z94.object({ message: z94.string() });
53455
+ var ErrorSchema = z95.object({ message: z95.string() });
53330
53456
  function readErrorText(text) {
53331
53457
  try {
53332
53458
  return ErrorSchema.parse(JSON.parse(text)).message;
@@ -53753,14 +53879,14 @@ function formatAcmeError(error) {
53753
53879
  // packages/daemon/src/network/https/acme/cert-store.ts
53754
53880
  import { existsSync as existsSync23, mkdirSync as mkdirSync24, readFileSync as readFileSync30, rmSync as rmSync29 } from "fs";
53755
53881
  import { join as join37 } from "path";
53756
- import * as z95 from "zod";
53757
- var AttemptStateSchema = z95.object({
53758
- failures: z95.int().nonnegative(),
53759
- lastAttemptAt: z95.number().nullable(),
53760
- lastError: z95.string().nullable()
53882
+ import * as z96 from "zod";
53883
+ var AttemptStateSchema = z96.object({
53884
+ failures: z96.int().nonnegative(),
53885
+ lastAttemptAt: z96.number().nullable(),
53886
+ lastError: z96.string().nullable()
53761
53887
  });
53762
- var AccountSchema = z95.object({ directoryUrl: z95.string(), url: z95.string(), keyPem: z95.string() });
53763
- var LegacyAccountSchema = z95.object({ directoryUrl: z95.string(), url: z95.string() });
53888
+ var AccountSchema = z96.object({ directoryUrl: z96.string(), url: z96.string(), keyPem: z96.string() });
53889
+ var LegacyAccountSchema = z96.object({ directoryUrl: z96.string(), url: z96.string() });
53764
53890
  var NO_ATTEMPTS = { failures: 0, lastAttemptAt: null, lastError: null };
53765
53891
  function createCertStore(dataDir) {
53766
53892
  const directory = join37(dataDir, "tls");
@@ -53898,7 +54024,7 @@ function createChalltestsrvProvider(apiUrl) {
53898
54024
  }
53899
54025
 
53900
54026
  // packages/daemon/src/network/https/dns/cloudflare-provider.ts
53901
- import * as z96 from "zod";
54027
+ import * as z97 from "zod";
53902
54028
 
53903
54029
  // packages/daemon/src/network/https/dns/wait-for-txt.ts
53904
54030
  import { Resolver as Resolver2 } from "dns/promises";
@@ -53960,30 +54086,30 @@ var CLOUDFLARE_API = "https://api.cloudflare.com/client/v4";
53960
54086
  var TXT_TTL_S = 60;
53961
54087
  var A_TTL_S = 300;
53962
54088
  var PAGE_SIZE = 500;
53963
- var ApiErrorSchema = z96.object({ code: z96.number().optional(), message: z96.string() });
53964
- var EnvelopeSchema = z96.object({
53965
- success: z96.boolean(),
53966
- errors: z96.array(ApiErrorSchema).default([]),
53967
- result: z96.unknown().optional(),
53968
- result_info: z96.object({ page: z96.number(), total_pages: z96.number() }).optional()
54089
+ var ApiErrorSchema = z97.object({ code: z97.number().optional(), message: z97.string() });
54090
+ var EnvelopeSchema = z97.object({
54091
+ success: z97.boolean(),
54092
+ errors: z97.array(ApiErrorSchema).default([]),
54093
+ result: z97.unknown().optional(),
54094
+ result_info: z97.object({ page: z97.number(), total_pages: z97.number() }).optional()
53969
54095
  });
53970
- var ZoneSchema = z96.object({
53971
- id: z96.string(),
53972
- name: z96.string(),
53973
- name_servers: z96.array(z96.string())
54096
+ var ZoneSchema = z97.object({
54097
+ id: z97.string(),
54098
+ name: z97.string(),
54099
+ name_servers: z97.array(z97.string())
53974
54100
  });
53975
- var RecordSchema = z96.object({
53976
- id: z96.string(),
53977
- name: z96.string().optional(),
53978
- type: z96.string().optional(),
53979
- content: z96.string(),
53980
- proxied: z96.boolean().optional(),
53981
- comment: z96.string().nullable().optional()
54101
+ var RecordSchema = z97.object({
54102
+ id: z97.string(),
54103
+ name: z97.string().optional(),
54104
+ type: z97.string().optional(),
54105
+ content: z97.string(),
54106
+ proxied: z97.boolean().optional(),
54107
+ comment: z97.string().nullable().optional()
53982
54108
  });
53983
54109
  var MANAGED_COMMENT = "managed by impd";
53984
54110
  var ADDRESS_TYPES = new Set(["A", "AAAA", "CNAME"]);
53985
- var ZoneListSchema = z96.array(ZoneSchema);
53986
- var RecordListSchema = z96.array(RecordSchema);
54111
+ var ZoneListSchema = z97.array(ZoneSchema);
54112
+ var RecordListSchema = z97.array(RecordSchema);
53987
54113
  function createCloudflareProvider(options) {
53988
54114
  const base = options.apiUrl ?? CLOUDFLARE_API;
53989
54115
  const send = options.fetch ?? fetch;
@@ -56380,6 +56506,7 @@ async function stopImpd(parts, options) {
56380
56506
  if (imps !== undefined) {
56381
56507
  state.settled = options.sleepImps ? await runStep("sleep", readLeftMs(), () => imps.sleepAllImps()) : await runStep("lifecycle", readLeftMs(), () => imps.waitForLifecycle());
56382
56508
  await runStep("templates", readStepMs(), () => imps.bootTemplates?.stop());
56509
+ await runStep("memory-warms", readStepMs(), () => imps.memoryWarm?.stopAll());
56383
56510
  if (options.sleepImps) {
56384
56511
  const sleptMs = Math.round(performance.now() - started);
56385
56512
  getImpdLogger("stop").info("every imp asleep in {sleptMs}ms", { sleptMs: String(sleptMs) });
@@ -56479,8 +56606,8 @@ import {
56479
56606
  statSync as statSync15
56480
56607
  } from "fs";
56481
56608
  import { basename as basename5, dirname as dirname11, join as join39 } from "path";
56482
- import * as z97 from "zod";
56483
- var CopiesSchema = z97.record(z97.string(), z97.object({ ino: z97.string(), ctimeNs: z97.string(), size: z97.string() }));
56609
+ import * as z98 from "zod";
56610
+ var CopiesSchema = z98.record(z98.string(), z98.object({ ino: z98.string(), ctimeNs: z98.string(), size: z98.string() }));
56484
56611
  function createXfsBackups(ctx) {
56485
56612
  const backup = buildBackupPaths(ctx.dataDir);
56486
56613
  const freshCopies = new Set;
@@ -59156,6 +59283,45 @@ log tail`);
59156
59283
  };
59157
59284
  }
59158
59285
 
59286
+ // packages/daemon/src/test-utils/vm/create-stub-uffd-handler.ts
59287
+ import { existsSync as existsSync34, readFileSync as readFileSync39, writeFileSync as writeFileSync16 } from "fs";
59288
+ import { join as join49 } from "path";
59289
+ import * as z99 from "zod";
59290
+ var StartSchema = z99.object({
59291
+ options: z99.object({
59292
+ socket: z99.string().optional(),
59293
+ uid: z99.string().optional(),
59294
+ gid: z99.string().optional()
59295
+ }),
59296
+ served: z99.string()
59297
+ });
59298
+ var WarmRunSchema = z99.object({
59299
+ mode: z99.enum(["--count-data", "--warm"]),
59300
+ memFile: z99.string(),
59301
+ pid: z99.int()
59302
+ });
59303
+ function createStubUffdHandler(directory, mode = "serve") {
59304
+ const path = join49(directory, `uffd-handler-${mode}`);
59305
+ const recorded = join49(directory, `uffd-handler-${mode}.starts`);
59306
+ const warmAnswer = join49(directory, `uffd-handler-${mode}.warm.json`);
59307
+ const script = join49(import.meta.dir, "run-stub-uffd-handler.ts");
59308
+ writeFileSync16(path, `#!/bin/sh
59309
+ exec '${process.execPath}' '${script}' '${mode}' '${recorded}' '${warmAnswer}' "$@"
59310
+ `, { mode: 493 });
59311
+ return {
59312
+ path,
59313
+ readStarts: () => readRecords(recorded, StartSchema),
59314
+ readWarmRuns: () => readRecords(`${recorded}.warms`, WarmRunSchema),
59315
+ answerWarm: (answer) => {
59316
+ writeFileSync16(warmAnswer, JSON.stringify(answer));
59317
+ }
59318
+ };
59319
+ }
59320
+ function readRecords(path, schema) {
59321
+ return existsSync34(path) ? readFileSync39(path, "utf8").trimEnd().split(`
59322
+ `).map((line) => schema.parse(JSON.parse(line))) : [];
59323
+ }
59324
+
59159
59325
  // packages/daemon/src/test-utils/start-test-impd.ts
59160
59326
  var FAKE_VM_RAM_MIB = 300;
59161
59327
  var FAKE_VM_RSS_MIB = 340;
@@ -59172,6 +59338,9 @@ async function startTestImpd(stack, options = {}) {
59172
59338
  if (options.dataDir === undefined) {
59173
59339
  stack.defer(() => rm2(dataDir, { recursive: true, force: true }));
59174
59340
  }
59341
+ const handlerDir = mkdtempSync(`${tmpdir()}/${formatRunPrefix(readRunOwner())}uffd-handler-`);
59342
+ stack.defer(() => rm2(handlerDir, { recursive: true, force: true }));
59343
+ const uffdHandler = createStubUffdHandler(handlerDir);
59175
59344
  const db = await openMigratedCopy();
59176
59345
  stack.defer(async () => {
59177
59346
  await db.destroy();
@@ -59190,6 +59359,7 @@ async function startTestImpd(stack, options = {}) {
59190
59359
  IMP_BROKER_PORT: String(ports.take()),
59191
59360
  IMP_EGRESS_DNS_PORT: String(ports.take()),
59192
59361
  IMP_SSH_PORT: "0",
59362
+ IMP_UFFD_HANDLER: uffdHandler.path,
59193
59363
  ...options.env
59194
59364
  }),
59195
59365
  defaultDiskBytes: 0
@@ -59224,7 +59394,7 @@ async function startTestImpd(stack, options = {}) {
59224
59394
  const createSystemDrive = (drive) => {
59225
59395
  const identity = buildTestIdentity(dataDir, drive);
59226
59396
  mkdirSync31(buildSystemDrivesDir(dataDir), { recursive: true });
59227
- writeFileSync16(identity.systemDrivePath, drive);
59397
+ writeFileSync17(identity.systemDrivePath, drive);
59228
59398
  return identity;
59229
59399
  };
59230
59400
  const host = { identity: createSystemDrive(TEST_DRIVE) };
@@ -59398,6 +59568,7 @@ async function startTestImpd(stack, options = {}) {
59398
59568
  db,
59399
59569
  dataDir,
59400
59570
  fake,
59571
+ uffdHandler,
59401
59572
  tickers,
59402
59573
  taps,
59403
59574
  removedTaps,
@@ -59416,7 +59587,7 @@ async function startTestImpd(stack, options = {}) {
59416
59587
  clock.offsetMs += durationMs;
59417
59588
  },
59418
59589
  setClock: (nowMs) => {
59419
- invariant7(options.frozenClockMs !== undefined, "setClock needs a frozen clock");
59590
+ invariant8(options.frozenClockMs !== undefined, "setClock needs a frozen clock");
59420
59591
  clock.frozenAt = nowMs;
59421
59592
  clock.offsetMs = 0;
59422
59593
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@impz/testing",
3
- "version": "6.8.1",
3
+ "version": "6.9.0",
4
4
  "description": "A real impd on stand-ins, for Bun tests of code that drives impd through @impz/client",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -43,7 +43,7 @@
43
43
  "ts-pattern": "^5.9.2",
44
44
  "xstate": "^5.33.3",
45
45
  "zod": "^4.6.7",
46
- "@impz/client": "6.8.1"
46
+ "@impz/client": "6.9.0"
47
47
  },
48
48
  "engines": {
49
49
  "bun": ">=1.4.3"