@ai-ecoverse/slicc-spectrum 1.87.0 → 1.88.1
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/README.md +19 -5
- package/dist/slicc-dummy.js +298 -51
- package/dist/slicc-dummy.js.map +4 -4
- package/dist/slicc-ui.js +25970 -25231
- package/dist/slicc-ui.js.map +4 -4
- package/dist/types/app/chat.d.ts +1 -0
- package/dist/types/app/freezer-import.d.ts +67 -0
- package/dist/types/app/freezer.d.ts +13 -0
- package/dist/types/app/messages.d.ts +3 -0
- package/dist/types/app/network.d.ts +23 -2
- package/dist/types/dummy/agent.d.ts +7 -0
- package/dist/types/dummy/import.d.ts +21 -0
- package/dist/types/dummy/index.d.ts +3 -1
- package/dist/types/dummy/network.d.ts +9 -1
- package/dist/types/dummy.d.ts +3 -1
- package/dist/types/model/types.d.ts +52 -2
- package/dist/types/ui.d.ts +3 -1
- package/package.json +2 -2
package/dist/slicc-dummy.js
CHANGED
|
@@ -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
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
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
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 -
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 (!/#slicc-pair=./.test(url)) 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
|
|
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 *
|
|
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 *
|
|
6764
|
+
createdAt: now2 - 3 * day5,
|
|
6540
6765
|
usedAt: now2 - 2 * hour3,
|
|
6541
|
-
expiresAt: now2 + 3 *
|
|
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 *
|
|
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 *
|
|
6594
|
-
removedAt: now2 -
|
|
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 *
|
|
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 -
|
|
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 -
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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 *
|
|
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,
|