@ai-ecoverse/slicc-spectrum 1.87.0 → 1.88.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.
@@ -2551,6 +2551,156 @@ var DummyGuests = class extends Emitter {
2551
2551
  }
2552
2552
  };
2553
2553
 
2554
+ // src/dummy/import.ts
2555
+ var day3 = 864e5;
2556
+ var importNotV6 = "That zip isn\u2019t a SLICC 6 profile export.";
2557
+ var importCancelled = "The import was cancelled.";
2558
+ var importReport = "/root/v6-import-2026-10-18.md";
2559
+ var importTotal = 14;
2560
+ var importBefore = Date.UTC(2026, 9, 15, 14, 30);
2561
+ function importPreview(already) {
2562
+ return {
2563
+ origin: "www.sliccy.ai",
2564
+ createdAt: Date.UTC(2026, 9, 12, 16, 20),
2565
+ cones: 3,
2566
+ scoops: 14,
2567
+ frozen: 2,
2568
+ bytes: 4823449,
2569
+ skills: ["ferry-times", "pantry-labels"],
2570
+ crons: 2,
2571
+ webhooks: 1,
2572
+ flagged: ["files/cones/cone/.env"],
2573
+ providers: ["anthropic", "openai"],
2574
+ mounts: ["/mnt/photos", "/mnt/recipes"],
2575
+ already,
2576
+ text: "This export from www.sliccy.ai has 3 cones with 14 scoops and 2 frozen conversations. They arrive frozen, so nothing runs until you thaw them."
2577
+ };
2578
+ }
2579
+ var importCones = [
2580
+ {
2581
+ id: "cone-v6-lighthouse",
2582
+ kind: "cone",
2583
+ name: "lighthouse",
2584
+ title: "Plan the lighthouse open day",
2585
+ model: "claude-sonnet-5-5",
2586
+ messages: 31,
2587
+ age: 36,
2588
+ v6: true
2589
+ },
2590
+ {
2591
+ id: "cone-v6-pantry",
2592
+ kind: "cone",
2593
+ name: "pantry",
2594
+ title: "Sort the pantry inventory and print the labels",
2595
+ model: "claude-haiku-4-5",
2596
+ messages: 12,
2597
+ age: 44,
2598
+ v6: true
2599
+ },
2600
+ {
2601
+ id: "cone-v6-ferry",
2602
+ kind: "cone",
2603
+ name: "ferry-times",
2604
+ title: "Check the ferry timetable changes every morning",
2605
+ model: "gpt-6-mini",
2606
+ messages: 58,
2607
+ age: 71,
2608
+ v6: true
2609
+ }
2610
+ ];
2611
+ var idle = { phase: "idle", done: 0, total: 0, text: "" };
2612
+ function conversation(id, title, at3) {
2613
+ return [
2614
+ { id: `${id}-1`, role: "user", text: title, createdAt: at3 },
2615
+ {
2616
+ id: `${id}-2`,
2617
+ role: "assistant",
2618
+ status: "done",
2619
+ createdAt: at3 + 6e4,
2620
+ parts: [
2621
+ { type: "text", text: "Imported from SLICC 6. The earlier turns are in the report." }
2622
+ ]
2623
+ }
2624
+ ];
2625
+ }
2626
+ var DummyImport = class {
2627
+ scenario;
2628
+ #agent;
2629
+ #clock;
2630
+ #run = 0;
2631
+ #imports = 0;
2632
+ #already;
2633
+ #progress = idle;
2634
+ constructor(scenario, agent, clock2) {
2635
+ this.scenario = scenario;
2636
+ this.#agent = agent;
2637
+ this.#clock = clock2;
2638
+ this.#already = scenario === "again" ? importBefore : null;
2639
+ }
2640
+ importing() {
2641
+ return { ...this.#progress };
2642
+ }
2643
+ importCancel() {
2644
+ this.#run++;
2645
+ this.#set(idle);
2646
+ }
2647
+ async importProfile(_file, options) {
2648
+ const run = ++this.#run;
2649
+ this.#set({ phase: "checking", done: 0, total: 0, text: "Checking the profile\u2026" });
2650
+ await this.#step(run, this.scenario === "cancel-check" ? 200 : 4);
2651
+ if (this.scenario === "fail") {
2652
+ this.#set({ phase: "failed", done: 0, total: 0, text: importNotV6 });
2653
+ throw new Error(importNotV6);
2654
+ }
2655
+ const preview = importPreview(this.#already);
2656
+ if (options.preview) {
2657
+ this.#set(idle);
2658
+ return { preview, cones: [], report: null, text: preview.text };
2659
+ }
2660
+ for (const done of [0, 5, 10, importTotal]) {
2661
+ this.#set({
2662
+ phase: "writing",
2663
+ done,
2664
+ total: importTotal,
2665
+ text: `Importing ${done}/${importTotal}`
2666
+ });
2667
+ await this.#step(run, 6);
2668
+ }
2669
+ const cones = this.#write();
2670
+ this.#already = Date.now();
2671
+ this.#set({ phase: "done", done: importTotal, total: importTotal, text: "Imported" });
2672
+ return {
2673
+ preview,
2674
+ cones,
2675
+ report: importReport,
2676
+ text: "Their scoops, skills and crons came along. Sign in to Anthropic and OpenAI again before you thaw them."
2677
+ };
2678
+ }
2679
+ #write() {
2680
+ const suffix = this.#imports ? `-${this.#imports + 1}` : "";
2681
+ this.#imports++;
2682
+ const now2 = Date.now();
2683
+ const rows = importCones.map(({ age, ...cone }) => {
2684
+ const id = `${cone.id}${suffix}`;
2685
+ const frozenAt = now2 - age * day3;
2686
+ return {
2687
+ cone: { ...cone, id, frozenAt },
2688
+ messages: conversation(id, cone.title, frozenAt)
2689
+ };
2690
+ });
2691
+ this.#agent.addFrozen(rows);
2692
+ return rows.map((row) => row.cone.id);
2693
+ }
2694
+ async #step(run, ticks2) {
2695
+ await this.#clock.sleep(ticks2);
2696
+ if (run !== this.#run) throw new Error(importCancelled);
2697
+ }
2698
+ #set(progress) {
2699
+ this.#progress = progress;
2700
+ this.#agent.emit("importing", this.importing());
2701
+ }
2702
+ };
2703
+
2554
2704
  // src/dummy/script.ts
2555
2705
  var units2 = "/workspace/harbor/src/lib/units.ts";
2556
2706
  var kelvin = `
@@ -2869,24 +3019,29 @@ var DummyAgent = class extends Emitter {
2869
3019
  this.#queues.set(agent.id, structuredClone([...queues2[agent.id] ?? []]));
2870
3020
  }
2871
3021
  this.#active = this.#agents[0]?.id ?? "";
2872
- for (const { cone, messages } of frozen2) {
2873
- this.#frozen.push({ ...cone });
2874
- this.#ice.set(cone.id, [
2875
- {
2876
- agent: {
2877
- id: cone.id,
2878
- name: cone.name,
2879
- kind: "cone",
2880
- parentId: null,
2881
- status: "idle",
2882
- model: cone.model,
2883
- contextFill: 0.2,
2884
- unread: 0
2885
- },
2886
- messages: structuredClone([...messages])
2887
- }
2888
- ]);
2889
- }
3022
+ for (const { cone, messages } of frozen2) this.#store(cone, messages);
3023
+ }
3024
+ #store(cone, messages) {
3025
+ this.#frozen.push({ ...cone });
3026
+ this.#ice.set(cone.id, [
3027
+ {
3028
+ agent: {
3029
+ id: cone.id,
3030
+ name: cone.name,
3031
+ kind: "cone",
3032
+ parentId: null,
3033
+ status: "idle",
3034
+ model: cone.model,
3035
+ contextFill: 0.2,
3036
+ unread: 0
3037
+ },
3038
+ messages: structuredClone([...messages])
3039
+ }
3040
+ ]);
3041
+ }
3042
+ addFrozen(rows) {
3043
+ for (const { cone, messages } of rows) this.#store(cone, messages);
3044
+ this.emit("frozen", this.frozen());
2890
3045
  }
2891
3046
  list() {
2892
3047
  return this.#agents.map((agent) => ({ ...agent }));
@@ -4448,16 +4603,16 @@ var status = `<!DOCTYPE html>
4448
4603
  `;
4449
4604
 
4450
4605
  // src/dummy/extras.ts
4451
- var day3 = 864e5;
4606
+ var day4 = 864e5;
4452
4607
  var now = Date.UTC(2026, 9, 5, 9, 0);
4453
4608
  function frozenConversation(topic, reply) {
4454
4609
  return [
4455
- { id: `f-${topic}-1`, role: "user", text: topic, createdAt: now - 3 * day3 },
4610
+ { id: `f-${topic}-1`, role: "user", text: topic, createdAt: now - 3 * day4 },
4456
4611
  {
4457
4612
  id: `f-${topic}-2`,
4458
4613
  role: "assistant",
4459
4614
  status: "done",
4460
- createdAt: now - 3 * day3 + 6e4,
4615
+ createdAt: now - 3 * day4 + 6e4,
4461
4616
  parts: [{ type: "text", text: reply }]
4462
4617
  }
4463
4618
  ];
@@ -4471,7 +4626,7 @@ var frozen = [
4471
4626
  title: "Write the onboarding guide for new contributors",
4472
4627
  model: "claude-sonnet-5-5",
4473
4628
  messages: 42,
4474
- frozenAt: now - 2 * day3
4629
+ frozenAt: now - 2 * day4
4475
4630
  },
4476
4631
  messages: frozenConversation(
4477
4632
  "Write the onboarding guide for new contributors",
@@ -4486,7 +4641,7 @@ var frozen = [
4486
4641
  title: "Spike: can the cache move to KV without a cold start?",
4487
4642
  model: "claude-opus-5-5",
4488
4643
  messages: 118,
4489
- frozenAt: now - 6 * day3
4644
+ frozenAt: now - 6 * day4
4490
4645
  },
4491
4646
  messages: frozenConversation(
4492
4647
  "Spike: can the cache move to KV without a cold start?",
@@ -4501,7 +4656,7 @@ var frozen = [
4501
4656
  title: "Summarize Q3 uptime and incidents",
4502
4657
  model: "claude-haiku-4-5",
4503
4658
  messages: 17,
4504
- frozenAt: now - 21 * day3
4659
+ frozenAt: now - 21 * day4
4505
4660
  },
4506
4661
  messages: frozenConversation(
4507
4662
  "Summarize Q3 uptime and incidents",
@@ -4516,7 +4671,7 @@ var frozen = [
4516
4671
  title: "Check the tide tables against the harbor feed",
4517
4672
  model: "claude-haiku-4-5",
4518
4673
  messages: 9,
4519
- frozenAt: now - 1 * day3
4674
+ frozenAt: now - 1 * day4
4520
4675
  },
4521
4676
  messages: frozenConversation(
4522
4677
  "Check the tide tables against the harbor feed",
@@ -4531,7 +4686,7 @@ var frozen = [
4531
4686
  title: "Write the nightly digest of merged pull requests",
4532
4687
  model: "claude-sonnet-5-5",
4533
4688
  messages: 6,
4534
- frozenAt: now - 3 * day3
4689
+ frozenAt: now - 3 * day4
4535
4690
  },
4536
4691
  messages: frozenConversation(
4537
4692
  "Write the nightly digest of merged pull requests",
@@ -4547,7 +4702,7 @@ var memories = [
4547
4702
  title: "Lead with the result",
4548
4703
  body: "Keep replies short. Lead with the result, then the evidence.",
4549
4704
  tag: "feedback",
4550
- updatedAt: now - 5 * day3
4705
+ updatedAt: now - 5 * day4
4551
4706
  },
4552
4707
  {
4553
4708
  id: "mem-2",
@@ -4556,7 +4711,7 @@ var memories = [
4556
4711
  title: "Tests before \u201Cfixed\u201D",
4557
4712
  body: "Run the tests before saying something is fixed, and quote the summary line.",
4558
4713
  tag: "feedback",
4559
- updatedAt: now - 9 * day3
4714
+ updatedAt: now - 9 * day4
4560
4715
  },
4561
4716
  {
4562
4717
  id: "mem-3",
@@ -4565,7 +4720,7 @@ var memories = [
4565
4720
  title: "Works in UTC",
4566
4721
  body: "Schedules, timestamps and cron expressions are in UTC unless stated otherwise.",
4567
4722
  tag: "user",
4568
- updatedAt: now - 30 * day3
4723
+ updatedAt: now - 30 * day4
4569
4724
  },
4570
4725
  {
4571
4726
  id: "mem-4",
@@ -4574,7 +4729,7 @@ var memories = [
4574
4729
  title: "harbor",
4575
4730
  body: "Forecast API, deployed as a worker. Cache bugs show up around midnight UTC. Staging deploys are frozen on Fridays.",
4576
4731
  tag: "project",
4577
- updatedAt: now - day3
4732
+ updatedAt: now - day4
4578
4733
  },
4579
4734
  {
4580
4735
  id: "mem-5",
@@ -4583,7 +4738,7 @@ var memories = [
4583
4738
  title: "release-notes",
4584
4739
  body: "Drafted every Friday from merged pull requests, grouped as features, fixes and chores.",
4585
4740
  tag: "project",
4586
- updatedAt: now - 4 * day3
4741
+ updatedAt: now - 4 * day4
4587
4742
  },
4588
4743
  {
4589
4744
  id: "mem-6",
@@ -4592,7 +4747,7 @@ var memories = [
4592
4747
  title: "Cache keys",
4593
4748
  body: "Cache keys are `city:UTC-date`. Never key on local time.",
4594
4749
  tag: "project",
4595
- updatedAt: now - 2 * day3
4750
+ updatedAt: now - 2 * day4
4596
4751
  },
4597
4752
  {
4598
4753
  id: "mem-7",
@@ -4601,7 +4756,7 @@ var memories = [
4601
4756
  title: "Retries",
4602
4757
  body: "Retry upstream calls three times with exponential backoff starting at 250 ms.",
4603
4758
  tag: null,
4604
- updatedAt: now - 2 * day3
4759
+ updatedAt: now - 2 * day4
4605
4760
  },
4606
4761
  {
4607
4762
  id: "mem-8",
@@ -4610,7 +4765,7 @@ var memories = [
4610
4765
  title: "Past tense, no ticket numbers",
4611
4766
  body: "One sentence per change, in the past tense, without ticket numbers.",
4612
4767
  tag: "feedback",
4613
- updatedAt: now - 7 * day3
4768
+ updatedAt: now - 7 * day4
4614
4769
  },
4615
4770
  {
4616
4771
  id: "mem-9",
@@ -4619,7 +4774,7 @@ var memories = [
4619
4774
  title: "Read the tests first",
4620
4775
  body: "Start a review from the tests, then read the change they cover.",
4621
4776
  tag: "feedback",
4622
- updatedAt: now - 3 * day3,
4777
+ updatedAt: now - 3 * day4,
4623
4778
  source: "entry"
4624
4779
  },
4625
4780
  {
@@ -4629,7 +4784,7 @@ var memories = [
4629
4784
  title: "Checks",
4630
4785
  body: "Flag any change to cache keys. Ask for a test when a retry count changes.",
4631
4786
  tag: null,
4632
- updatedAt: now - 3 * day3,
4787
+ updatedAt: now - 3 * day4,
4633
4788
  source: "notes"
4634
4789
  }
4635
4790
  ];
@@ -5390,6 +5545,27 @@ var followers = [
5390
5545
  access: { view: false, control: false, terminal: false }
5391
5546
  }
5392
5547
  ];
5548
+ var pairingCode = "ab12\u2026ef";
5549
+ var pairingRefused = "That isn\u2019t a pairing link from slicc pair.";
5550
+ var pairingStopped = "slicc on this computer stopped answering. Run slicc pair again.";
5551
+ var pairedDevice = {
5552
+ id: "link-quay",
5553
+ name: "slicc on quay-studio",
5554
+ host: "quay-studio.slicc.internal",
5555
+ address: "198.18.57.11",
5556
+ mode: "local",
5557
+ kind: "cli",
5558
+ offers: ["net", "http", "ssh"],
5559
+ exit: true,
5560
+ state: "connected",
5561
+ folders: [{ name: "sketches", source: "quay-studio/sketches", readonly: false }]
5562
+ };
5563
+ var forgottenDevice = {
5564
+ ...pairedDevice,
5565
+ state: "offline",
5566
+ note: "SLICC on quay-studio no longer knows this seven. Pair it again."
5567
+ };
5568
+ var others = linkedDevices.filter((device) => device.id !== pairedDevice.id);
5393
5569
  function grant(device, key, allowed) {
5394
5570
  const access = { ...device.access, [key]: allowed };
5395
5571
  if (key === "view" && !allowed && "control" in access) access.control = false;
@@ -5413,6 +5589,16 @@ function linksFixtures(scenario, rotation = 0) {
5413
5589
  exit: null
5414
5590
  };
5415
5591
  }
5592
+ if (scenario === "pairing")
5593
+ return { links: { ...base, devices: others, pairing: { state: "idle" } }, exit: null };
5594
+ if (scenario === "pairing-notray")
5595
+ return { links: { devices: others, permission: null, pairing: { state: "idle" } }, exit: null };
5596
+ if (scenario === "forgotten") {
5597
+ return {
5598
+ links: { ...base, devices: [forgottenDevice, ...others], pairing: { state: "idle" } },
5599
+ exit: null
5600
+ };
5601
+ }
5416
5602
  if (scenario === "followers") return { links: { ...base, devices: followers }, exit: null };
5417
5603
  if (scenario === "none") return { links: { ...base, devices: [] }, exit: null };
5418
5604
  if (scenario === "prompt") {
@@ -5473,6 +5659,10 @@ var DummyNetwork = class extends Emitter {
5473
5659
  disconnectLeader;
5474
5660
  reconnectLeader;
5475
5661
  forgetLeader;
5662
+ pairComputer;
5663
+ confirmPairing;
5664
+ cancelPairing;
5665
+ #pairUrl = "";
5476
5666
  #leaders;
5477
5667
  #files;
5478
5668
  constructor(scenario, clock2, tailnet, links, files3, leaders) {
@@ -5490,6 +5680,9 @@ var DummyNetwork = class extends Emitter {
5490
5680
  this.retryLinks = () => this.#retry();
5491
5681
  this.mountFolder = (source) => this.#mountFolder(source);
5492
5682
  this.ejectFolder = (source) => this.#ejectFolder(source);
5683
+ this.pairComputer = (url) => this.#pair(url);
5684
+ this.confirmPairing = () => this.#confirmPairing();
5685
+ this.cancelPairing = () => this.#cancelPairing();
5493
5686
  this.#files = files3;
5494
5687
  files3?.on("mounts", (targets) => this.#mounted(targets));
5495
5688
  }
@@ -5671,6 +5864,38 @@ var DummyNetwork = class extends Emitter {
5671
5864
  };
5672
5865
  this.#emit();
5673
5866
  }
5867
+ #pairing(pairing, devices) {
5868
+ const links = this.#links;
5869
+ this.#links = { ...links, pairing, devices: devices ?? links.devices };
5870
+ this.#emit();
5871
+ }
5872
+ async #pair(url) {
5873
+ await this.#clock.sleep(4);
5874
+ if (!url.startsWith("http://127.0.0.1:")) throw new Error(pairingRefused);
5875
+ this.#pairUrl = url;
5876
+ this.#pairing({ state: "confirm", code: pairingCode });
5877
+ }
5878
+ async #confirmPairing() {
5879
+ this.#pairing({ state: "linking", code: pairingCode });
5880
+ await this.#clock.sleep(8);
5881
+ if (this.#links?.pairing?.state !== "linking") return;
5882
+ if (this.#pairUrl.includes("fail")) {
5883
+ this.#pairing({ state: "failed", code: pairingCode, error: pairingStopped });
5884
+ return;
5885
+ }
5886
+ const devices = this.#links.devices.filter(
5887
+ (device) => device.id !== pairedDevice.id
5888
+ );
5889
+ this.#pairing({ state: "linked", code: pairingCode, name: "SLICC on quay-studio" }, [
5890
+ pairedDevice,
5891
+ ...devices
5892
+ ]);
5893
+ }
5894
+ async #cancelPairing() {
5895
+ await this.#clock.sleep(2);
5896
+ this.#pairUrl = "";
5897
+ this.#pairing({ state: "idle" });
5898
+ }
5674
5899
  async #retry() {
5675
5900
  await this.#clock.sleep(4);
5676
5901
  const links = this.#links;
@@ -6501,7 +6726,7 @@ Done in 3.8s`
6501
6726
  // src/dummy/vault.ts
6502
6727
  var minute3 = 6e4;
6503
6728
  var hour3 = 60 * minute3;
6504
- var day4 = 24 * hour3;
6729
+ var day5 = 24 * hour3;
6505
6730
  var harbor = { domain: "api.harbor.example", header: "Authorization", methods: [], paths: [] };
6506
6731
  var pier = {
6507
6732
  domain: "packages.pier.example",
@@ -6522,7 +6747,7 @@ function vaultSecrets(now2 = Date.now()) {
6522
6747
  rules: [harbor],
6523
6748
  exits: ["proxy", "tailscale", "device:link-pier"],
6524
6749
  exec: false,
6525
- createdAt: now2 - 12 * day4,
6750
+ createdAt: now2 - 12 * day5,
6526
6751
  usedAt: now2 - 4 * minute3
6527
6752
  },
6528
6753
  {
@@ -6536,9 +6761,9 @@ function vaultSecrets(now2 = Date.now()) {
6536
6761
  rules: [pier],
6537
6762
  exec: "argv",
6538
6763
  execArgv: [["pier", "publish"]],
6539
- createdAt: now2 - 3 * day4,
6764
+ createdAt: now2 - 3 * day5,
6540
6765
  usedAt: now2 - 2 * hour3,
6541
- expiresAt: now2 + 3 * day4
6766
+ expiresAt: now2 + 3 * day5
6542
6767
  },
6543
6768
  {
6544
6769
  name: "TIDE_MAIL",
@@ -6565,7 +6790,7 @@ function vaultSecrets(now2 = Date.now()) {
6565
6790
  }
6566
6791
  ],
6567
6792
  exec: false,
6568
- createdAt: now2 - 20 * day4,
6793
+ createdAt: now2 - 20 * day5,
6569
6794
  expiresAt: now2 + 50 * minute3
6570
6795
  },
6571
6796
  {
@@ -6590,8 +6815,8 @@ function vaultSecrets(now2 = Date.now()) {
6590
6815
  domains: ["buoy.example"],
6591
6816
  rules: [{ domain: "buoy.example", header: "X-Buoy-Key", methods: ["GET"], paths: [] }],
6592
6817
  exec: "shell",
6593
- createdAt: now2 - 40 * day4,
6594
- removedAt: now2 - day4
6818
+ createdAt: now2 - 40 * day5,
6819
+ removedAt: now2 - day5
6595
6820
  }
6596
6821
  ];
6597
6822
  }
@@ -6608,7 +6833,7 @@ function accountRecords(now2 = Date.now()) {
6608
6833
  domains: ["docs.example"],
6609
6834
  rules: [{ domain: "docs.example", header: "Authorization", methods: [], paths: [] }],
6610
6835
  exec: false,
6611
- createdAt: now2 - 6 * day4,
6836
+ createdAt: now2 - 6 * day5,
6612
6837
  usedAt: now2 - 20 * minute3
6613
6838
  }
6614
6839
  ];
@@ -6681,7 +6906,7 @@ function vaultAudit(now2 = Date.now()) {
6681
6906
  type: "policy",
6682
6907
  seq: 8,
6683
6908
  id: "audit-8",
6684
- at: now2 - day4,
6909
+ at: now2 - day5,
6685
6910
  file: "/etc/slicc/secrets-policy.toml",
6686
6911
  sha256: "4e07408562bedb8b60ce05c1decfe3ad",
6687
6912
  accepted: true,
@@ -6699,7 +6924,7 @@ function vaultAudit(now2 = Date.now()) {
6699
6924
  type: "remove",
6700
6925
  seq: 7,
6701
6926
  id: "audit-7",
6702
- at: now2 - day4 - hour3,
6927
+ at: now2 - day5 - hour3,
6703
6928
  name: "BUOY_OLD_TOKEN"
6704
6929
  },
6705
6930
  {
@@ -6707,7 +6932,7 @@ function vaultAudit(now2 = Date.now()) {
6707
6932
  type: "seal",
6708
6933
  seq: 6,
6709
6934
  id: "audit-6",
6710
- at: now2 - 3 * day4,
6935
+ at: now2 - 3 * day5,
6711
6936
  name: "PIER_PUBLISH_TOKEN",
6712
6937
  source: "jerk:cone@link-pier",
6713
6938
  rotated: false
@@ -6720,7 +6945,7 @@ function vaultOlder(now2 = Date.now()) {
6720
6945
  type: "materialize",
6721
6946
  seq: 5,
6722
6947
  id: "audit-5",
6723
- at: now2 - 4 * day4,
6948
+ at: now2 - 4 * day5,
6724
6949
  name: "PIER_PUBLISH_TOKEN",
6725
6950
  uid: 1e3,
6726
6951
  tag: null,
@@ -6738,7 +6963,7 @@ function vaultOlder(now2 = Date.now()) {
6738
6963
  type: "policy",
6739
6964
  seq: 4,
6740
6965
  id: "audit-4",
6741
- at: now2 - 5 * day4,
6966
+ at: now2 - 5 * day5,
6742
6967
  file: "/etc/fnox/config.toml",
6743
6968
  sha256: "8f14e45fceea167a5a36dedd4bea2543",
6744
6969
  accepted: false,
@@ -6749,7 +6974,7 @@ function vaultOlder(now2 = Date.now()) {
6749
6974
  type: "restore",
6750
6975
  seq: 3,
6751
6976
  id: "audit-3",
6752
- at: now2 - 6 * day4,
6977
+ at: now2 - 6 * day5,
6753
6978
  name: "TIDE_MAIL",
6754
6979
  uid: 0,
6755
6980
  tag: null
@@ -6758,7 +6983,7 @@ function vaultOlder(now2 = Date.now()) {
6758
6983
  type: "mcp",
6759
6984
  seq: 2,
6760
6985
  id: "audit-2",
6761
- at: now2 - 7 * day4,
6986
+ at: now2 - 7 * day5,
6762
6987
  name: "DOCS_MCP_TOKEN",
6763
6988
  uid: 1e3,
6764
6989
  tag: "cone",
@@ -7203,6 +7428,13 @@ function vaultAccounts(accounts2) {
7203
7428
  function guestsPort(guests, time) {
7204
7429
  return guests === "off" ? {} : { guests: new DummyGuests(guests, time) };
7205
7430
  }
7431
+ function importPort(scenario, agent, time) {
7432
+ if (scenario === "off") return;
7433
+ const port = new DummyImport(scenario, agent, time);
7434
+ agent.importProfile = port.importProfile.bind(port);
7435
+ agent.importCancel = port.importCancel.bind(port);
7436
+ agent.importing = port.importing.bind(port);
7437
+ }
7206
7438
  function createDummyModel({
7207
7439
  delay = 30,
7208
7440
  storage = null,
@@ -7228,6 +7460,7 @@ function createDummyModel({
7228
7460
  browser: scenario = "idle",
7229
7461
  sprinkles: sprinkles2 = "builtin",
7230
7462
  monitor = "dummy",
7463
+ import: imports = "off",
7231
7464
  login
7232
7465
  } = {}) {
7233
7466
  const time = clock(delay);
@@ -7251,6 +7484,7 @@ function createDummyModel({
7251
7484
  stop(agentId);
7252
7485
  browser.release(agentId);
7253
7486
  };
7487
+ importPort(imports, agent, time);
7254
7488
  if (hold !== "off") agent.setHold({ reason: hold, held: 2 });
7255
7489
  if (readonly !== "off") agent.setReadOnly(readOnlyText);
7256
7490
  const notice = readonly !== "off" ? "readonly" : notices;
@@ -7317,6 +7551,7 @@ export {
7317
7551
  DummyFollow,
7318
7552
  DummyGuestAgent,
7319
7553
  DummyGuests,
7554
+ DummyImport,
7320
7555
  DummyNetwork,
7321
7556
  DummyNotices,
7322
7557
  DummyTabs,
@@ -7330,6 +7565,7 @@ export {
7330
7565
  createGuestModel,
7331
7566
  followFixtures,
7332
7567
  forecastSprinkle,
7568
+ forgottenDevice,
7333
7569
  guestApproved,
7334
7570
  guestDeclined,
7335
7571
  guestLabel,
@@ -7341,6 +7577,13 @@ export {
7341
7577
  guestsPolicy,
7342
7578
  guestsRefused,
7343
7579
  guestsUnavailable,
7580
+ importBefore,
7581
+ importCancelled,
7582
+ importCones,
7583
+ importNotV6,
7584
+ importPreview,
7585
+ importReport,
7586
+ importTotal,
7344
7587
  joinUrl,
7345
7588
  leadersFixtures,
7346
7589
  linksFixtures,
@@ -7349,6 +7592,10 @@ export {
7349
7592
  otherGuest,
7350
7593
  packageFixtures,
7351
7594
  page,
7595
+ pairedDevice,
7596
+ pairingCode,
7597
+ pairingRefused,
7598
+ pairingStopped,
7352
7599
  tabsFixtures,
7353
7600
  tailnetFixtures,
7354
7601
  updateFixtures,