@ai-ecoverse/slicc-spectrum 1.86.7 → 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.
- package/README.md +22 -5
- package/dist/{chunk-X4C3AZJT.js → chunk-VRFAMBWK.js} +12 -2
- package/dist/chunk-VRFAMBWK.js.map +7 -0
- package/dist/slicc-dummy.js +321 -54
- package/dist/slicc-dummy.js.map +4 -4
- package/dist/slicc-kernel-model.js +1 -1
- package/dist/slicc-ui.js +26751 -25918
- 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 +12 -1
- package/dist/types/app/network.d.ts +23 -2
- package/dist/types/app/settings.d.ts +1 -0
- 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 +4 -1
- package/dist/types/dummy/network.d.ts +9 -1
- package/dist/types/dummy/settings.d.ts +6 -1
- package/dist/types/dummy.d.ts +3 -1
- package/dist/types/model/types.d.ts +54 -2
- package/dist/types/ui.d.ts +3 -1
- package/package.json +2 -2
- package/dist/chunk-X4C3AZJT.js.map +0 -7
package/dist/slicc-dummy.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
DummySettings,
|
|
8
8
|
clock
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-VRFAMBWK.js";
|
|
10
10
|
import {
|
|
11
11
|
Emitter
|
|
12
12
|
} from "./chunk-T5NHW4KC.js";
|
|
@@ -1209,6 +1209,7 @@ function events() {
|
|
|
1209
1209
|
title: "docs-pass failed",
|
|
1210
1210
|
text: "The Adobe session expired. Log in again to continue.",
|
|
1211
1211
|
action: "login",
|
|
1212
|
+
account: "ai-adobe",
|
|
1212
1213
|
createdAt: at(1476)
|
|
1213
1214
|
},
|
|
1214
1215
|
{
|
|
@@ -1578,6 +1579,13 @@ var accounts = [
|
|
|
1578
1579
|
{ id: "anthropic", provider: "Anthropic", identity: "API key ending 3f2a", status: "connected" },
|
|
1579
1580
|
{ id: "github", provider: "GitHub", identity: "@example-dev", status: "connected" },
|
|
1580
1581
|
{ id: "adobe", provider: "Adobe", identity: "dev@example.com", status: "expired" },
|
|
1582
|
+
{
|
|
1583
|
+
id: "ai-adobe",
|
|
1584
|
+
provider: "Adobe AI",
|
|
1585
|
+
identity: "harbor-ops@example.com",
|
|
1586
|
+
status: "expired",
|
|
1587
|
+
auth: "oauth"
|
|
1588
|
+
},
|
|
1581
1589
|
{ id: "openai", provider: "OpenAI", identity: "", status: "disconnected", auth: "api-key" },
|
|
1582
1590
|
{
|
|
1583
1591
|
id: "mcp:docs",
|
|
@@ -1994,6 +2002,16 @@ var conversations = {
|
|
|
1994
2002
|
title: "Mail connector",
|
|
1995
2003
|
text: "The connector returned 401. Reconnect the account in Settings.",
|
|
1996
2004
|
createdAt: at2(-19)
|
|
2005
|
+
},
|
|
2006
|
+
{
|
|
2007
|
+
id: "m-t4",
|
|
2008
|
+
role: "system",
|
|
2009
|
+
kind: "error",
|
|
2010
|
+
action: "login",
|
|
2011
|
+
account: "mcp:tickets",
|
|
2012
|
+
title: "Tickets connector",
|
|
2013
|
+
text: "The tickets server rejected its token.",
|
|
2014
|
+
createdAt: at2(-18)
|
|
1997
2015
|
}
|
|
1998
2016
|
]
|
|
1999
2017
|
};
|
|
@@ -2533,6 +2551,156 @@ var DummyGuests = class extends Emitter {
|
|
|
2533
2551
|
}
|
|
2534
2552
|
};
|
|
2535
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
|
+
|
|
2536
2704
|
// src/dummy/script.ts
|
|
2537
2705
|
var units2 = "/workspace/harbor/src/lib/units.ts";
|
|
2538
2706
|
var kelvin = `
|
|
@@ -2851,24 +3019,29 @@ var DummyAgent = class extends Emitter {
|
|
|
2851
3019
|
this.#queues.set(agent.id, structuredClone([...queues2[agent.id] ?? []]));
|
|
2852
3020
|
}
|
|
2853
3021
|
this.#active = this.#agents[0]?.id ?? "";
|
|
2854
|
-
for (const { cone, messages } of frozen2)
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
}
|
|
2870
|
-
|
|
2871
|
-
|
|
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());
|
|
2872
3045
|
}
|
|
2873
3046
|
list() {
|
|
2874
3047
|
return this.#agents.map((agent) => ({ ...agent }));
|
|
@@ -4430,16 +4603,16 @@ var status = `<!DOCTYPE html>
|
|
|
4430
4603
|
`;
|
|
4431
4604
|
|
|
4432
4605
|
// src/dummy/extras.ts
|
|
4433
|
-
var
|
|
4606
|
+
var day4 = 864e5;
|
|
4434
4607
|
var now = Date.UTC(2026, 9, 5, 9, 0);
|
|
4435
4608
|
function frozenConversation(topic, reply) {
|
|
4436
4609
|
return [
|
|
4437
|
-
{ id: `f-${topic}-1`, role: "user", text: topic, createdAt: now - 3 *
|
|
4610
|
+
{ id: `f-${topic}-1`, role: "user", text: topic, createdAt: now - 3 * day4 },
|
|
4438
4611
|
{
|
|
4439
4612
|
id: `f-${topic}-2`,
|
|
4440
4613
|
role: "assistant",
|
|
4441
4614
|
status: "done",
|
|
4442
|
-
createdAt: now - 3 *
|
|
4615
|
+
createdAt: now - 3 * day4 + 6e4,
|
|
4443
4616
|
parts: [{ type: "text", text: reply }]
|
|
4444
4617
|
}
|
|
4445
4618
|
];
|
|
@@ -4453,7 +4626,7 @@ var frozen = [
|
|
|
4453
4626
|
title: "Write the onboarding guide for new contributors",
|
|
4454
4627
|
model: "claude-sonnet-5-5",
|
|
4455
4628
|
messages: 42,
|
|
4456
|
-
frozenAt: now - 2 *
|
|
4629
|
+
frozenAt: now - 2 * day4
|
|
4457
4630
|
},
|
|
4458
4631
|
messages: frozenConversation(
|
|
4459
4632
|
"Write the onboarding guide for new contributors",
|
|
@@ -4468,7 +4641,7 @@ var frozen = [
|
|
|
4468
4641
|
title: "Spike: can the cache move to KV without a cold start?",
|
|
4469
4642
|
model: "claude-opus-5-5",
|
|
4470
4643
|
messages: 118,
|
|
4471
|
-
frozenAt: now - 6 *
|
|
4644
|
+
frozenAt: now - 6 * day4
|
|
4472
4645
|
},
|
|
4473
4646
|
messages: frozenConversation(
|
|
4474
4647
|
"Spike: can the cache move to KV without a cold start?",
|
|
@@ -4483,7 +4656,7 @@ var frozen = [
|
|
|
4483
4656
|
title: "Summarize Q3 uptime and incidents",
|
|
4484
4657
|
model: "claude-haiku-4-5",
|
|
4485
4658
|
messages: 17,
|
|
4486
|
-
frozenAt: now - 21 *
|
|
4659
|
+
frozenAt: now - 21 * day4
|
|
4487
4660
|
},
|
|
4488
4661
|
messages: frozenConversation(
|
|
4489
4662
|
"Summarize Q3 uptime and incidents",
|
|
@@ -4498,7 +4671,7 @@ var frozen = [
|
|
|
4498
4671
|
title: "Check the tide tables against the harbor feed",
|
|
4499
4672
|
model: "claude-haiku-4-5",
|
|
4500
4673
|
messages: 9,
|
|
4501
|
-
frozenAt: now - 1 *
|
|
4674
|
+
frozenAt: now - 1 * day4
|
|
4502
4675
|
},
|
|
4503
4676
|
messages: frozenConversation(
|
|
4504
4677
|
"Check the tide tables against the harbor feed",
|
|
@@ -4513,7 +4686,7 @@ var frozen = [
|
|
|
4513
4686
|
title: "Write the nightly digest of merged pull requests",
|
|
4514
4687
|
model: "claude-sonnet-5-5",
|
|
4515
4688
|
messages: 6,
|
|
4516
|
-
frozenAt: now - 3 *
|
|
4689
|
+
frozenAt: now - 3 * day4
|
|
4517
4690
|
},
|
|
4518
4691
|
messages: frozenConversation(
|
|
4519
4692
|
"Write the nightly digest of merged pull requests",
|
|
@@ -4529,7 +4702,7 @@ var memories = [
|
|
|
4529
4702
|
title: "Lead with the result",
|
|
4530
4703
|
body: "Keep replies short. Lead with the result, then the evidence.",
|
|
4531
4704
|
tag: "feedback",
|
|
4532
|
-
updatedAt: now - 5 *
|
|
4705
|
+
updatedAt: now - 5 * day4
|
|
4533
4706
|
},
|
|
4534
4707
|
{
|
|
4535
4708
|
id: "mem-2",
|
|
@@ -4538,7 +4711,7 @@ var memories = [
|
|
|
4538
4711
|
title: "Tests before \u201Cfixed\u201D",
|
|
4539
4712
|
body: "Run the tests before saying something is fixed, and quote the summary line.",
|
|
4540
4713
|
tag: "feedback",
|
|
4541
|
-
updatedAt: now - 9 *
|
|
4714
|
+
updatedAt: now - 9 * day4
|
|
4542
4715
|
},
|
|
4543
4716
|
{
|
|
4544
4717
|
id: "mem-3",
|
|
@@ -4547,7 +4720,7 @@ var memories = [
|
|
|
4547
4720
|
title: "Works in UTC",
|
|
4548
4721
|
body: "Schedules, timestamps and cron expressions are in UTC unless stated otherwise.",
|
|
4549
4722
|
tag: "user",
|
|
4550
|
-
updatedAt: now - 30 *
|
|
4723
|
+
updatedAt: now - 30 * day4
|
|
4551
4724
|
},
|
|
4552
4725
|
{
|
|
4553
4726
|
id: "mem-4",
|
|
@@ -4556,7 +4729,7 @@ var memories = [
|
|
|
4556
4729
|
title: "harbor",
|
|
4557
4730
|
body: "Forecast API, deployed as a worker. Cache bugs show up around midnight UTC. Staging deploys are frozen on Fridays.",
|
|
4558
4731
|
tag: "project",
|
|
4559
|
-
updatedAt: now -
|
|
4732
|
+
updatedAt: now - day4
|
|
4560
4733
|
},
|
|
4561
4734
|
{
|
|
4562
4735
|
id: "mem-5",
|
|
@@ -4565,7 +4738,7 @@ var memories = [
|
|
|
4565
4738
|
title: "release-notes",
|
|
4566
4739
|
body: "Drafted every Friday from merged pull requests, grouped as features, fixes and chores.",
|
|
4567
4740
|
tag: "project",
|
|
4568
|
-
updatedAt: now - 4 *
|
|
4741
|
+
updatedAt: now - 4 * day4
|
|
4569
4742
|
},
|
|
4570
4743
|
{
|
|
4571
4744
|
id: "mem-6",
|
|
@@ -4574,7 +4747,7 @@ var memories = [
|
|
|
4574
4747
|
title: "Cache keys",
|
|
4575
4748
|
body: "Cache keys are `city:UTC-date`. Never key on local time.",
|
|
4576
4749
|
tag: "project",
|
|
4577
|
-
updatedAt: now - 2 *
|
|
4750
|
+
updatedAt: now - 2 * day4
|
|
4578
4751
|
},
|
|
4579
4752
|
{
|
|
4580
4753
|
id: "mem-7",
|
|
@@ -4583,7 +4756,7 @@ var memories = [
|
|
|
4583
4756
|
title: "Retries",
|
|
4584
4757
|
body: "Retry upstream calls three times with exponential backoff starting at 250 ms.",
|
|
4585
4758
|
tag: null,
|
|
4586
|
-
updatedAt: now - 2 *
|
|
4759
|
+
updatedAt: now - 2 * day4
|
|
4587
4760
|
},
|
|
4588
4761
|
{
|
|
4589
4762
|
id: "mem-8",
|
|
@@ -4592,7 +4765,7 @@ var memories = [
|
|
|
4592
4765
|
title: "Past tense, no ticket numbers",
|
|
4593
4766
|
body: "One sentence per change, in the past tense, without ticket numbers.",
|
|
4594
4767
|
tag: "feedback",
|
|
4595
|
-
updatedAt: now - 7 *
|
|
4768
|
+
updatedAt: now - 7 * day4
|
|
4596
4769
|
},
|
|
4597
4770
|
{
|
|
4598
4771
|
id: "mem-9",
|
|
@@ -4601,7 +4774,7 @@ var memories = [
|
|
|
4601
4774
|
title: "Read the tests first",
|
|
4602
4775
|
body: "Start a review from the tests, then read the change they cover.",
|
|
4603
4776
|
tag: "feedback",
|
|
4604
|
-
updatedAt: now - 3 *
|
|
4777
|
+
updatedAt: now - 3 * day4,
|
|
4605
4778
|
source: "entry"
|
|
4606
4779
|
},
|
|
4607
4780
|
{
|
|
@@ -4611,7 +4784,7 @@ var memories = [
|
|
|
4611
4784
|
title: "Checks",
|
|
4612
4785
|
body: "Flag any change to cache keys. Ask for a test when a retry count changes.",
|
|
4613
4786
|
tag: null,
|
|
4614
|
-
updatedAt: now - 3 *
|
|
4787
|
+
updatedAt: now - 3 * day4,
|
|
4615
4788
|
source: "notes"
|
|
4616
4789
|
}
|
|
4617
4790
|
];
|
|
@@ -5372,6 +5545,27 @@ var followers = [
|
|
|
5372
5545
|
access: { view: false, control: false, terminal: false }
|
|
5373
5546
|
}
|
|
5374
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);
|
|
5375
5569
|
function grant(device, key, allowed) {
|
|
5376
5570
|
const access = { ...device.access, [key]: allowed };
|
|
5377
5571
|
if (key === "view" && !allowed && "control" in access) access.control = false;
|
|
@@ -5395,6 +5589,16 @@ function linksFixtures(scenario, rotation = 0) {
|
|
|
5395
5589
|
exit: null
|
|
5396
5590
|
};
|
|
5397
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
|
+
}
|
|
5398
5602
|
if (scenario === "followers") return { links: { ...base, devices: followers }, exit: null };
|
|
5399
5603
|
if (scenario === "none") return { links: { ...base, devices: [] }, exit: null };
|
|
5400
5604
|
if (scenario === "prompt") {
|
|
@@ -5455,6 +5659,10 @@ var DummyNetwork = class extends Emitter {
|
|
|
5455
5659
|
disconnectLeader;
|
|
5456
5660
|
reconnectLeader;
|
|
5457
5661
|
forgetLeader;
|
|
5662
|
+
pairComputer;
|
|
5663
|
+
confirmPairing;
|
|
5664
|
+
cancelPairing;
|
|
5665
|
+
#pairUrl = "";
|
|
5458
5666
|
#leaders;
|
|
5459
5667
|
#files;
|
|
5460
5668
|
constructor(scenario, clock2, tailnet, links, files3, leaders) {
|
|
@@ -5472,6 +5680,9 @@ var DummyNetwork = class extends Emitter {
|
|
|
5472
5680
|
this.retryLinks = () => this.#retry();
|
|
5473
5681
|
this.mountFolder = (source) => this.#mountFolder(source);
|
|
5474
5682
|
this.ejectFolder = (source) => this.#ejectFolder(source);
|
|
5683
|
+
this.pairComputer = (url) => this.#pair(url);
|
|
5684
|
+
this.confirmPairing = () => this.#confirmPairing();
|
|
5685
|
+
this.cancelPairing = () => this.#cancelPairing();
|
|
5475
5686
|
this.#files = files3;
|
|
5476
5687
|
files3?.on("mounts", (targets) => this.#mounted(targets));
|
|
5477
5688
|
}
|
|
@@ -5653,6 +5864,38 @@ var DummyNetwork = class extends Emitter {
|
|
|
5653
5864
|
};
|
|
5654
5865
|
this.#emit();
|
|
5655
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
|
+
}
|
|
5656
5899
|
async #retry() {
|
|
5657
5900
|
await this.#clock.sleep(4);
|
|
5658
5901
|
const links = this.#links;
|
|
@@ -6483,7 +6726,7 @@ Done in 3.8s`
|
|
|
6483
6726
|
// src/dummy/vault.ts
|
|
6484
6727
|
var minute3 = 6e4;
|
|
6485
6728
|
var hour3 = 60 * minute3;
|
|
6486
|
-
var
|
|
6729
|
+
var day5 = 24 * hour3;
|
|
6487
6730
|
var harbor = { domain: "api.harbor.example", header: "Authorization", methods: [], paths: [] };
|
|
6488
6731
|
var pier = {
|
|
6489
6732
|
domain: "packages.pier.example",
|
|
@@ -6504,7 +6747,7 @@ function vaultSecrets(now2 = Date.now()) {
|
|
|
6504
6747
|
rules: [harbor],
|
|
6505
6748
|
exits: ["proxy", "tailscale", "device:link-pier"],
|
|
6506
6749
|
exec: false,
|
|
6507
|
-
createdAt: now2 - 12 *
|
|
6750
|
+
createdAt: now2 - 12 * day5,
|
|
6508
6751
|
usedAt: now2 - 4 * minute3
|
|
6509
6752
|
},
|
|
6510
6753
|
{
|
|
@@ -6518,9 +6761,9 @@ function vaultSecrets(now2 = Date.now()) {
|
|
|
6518
6761
|
rules: [pier],
|
|
6519
6762
|
exec: "argv",
|
|
6520
6763
|
execArgv: [["pier", "publish"]],
|
|
6521
|
-
createdAt: now2 - 3 *
|
|
6764
|
+
createdAt: now2 - 3 * day5,
|
|
6522
6765
|
usedAt: now2 - 2 * hour3,
|
|
6523
|
-
expiresAt: now2 + 3 *
|
|
6766
|
+
expiresAt: now2 + 3 * day5
|
|
6524
6767
|
},
|
|
6525
6768
|
{
|
|
6526
6769
|
name: "TIDE_MAIL",
|
|
@@ -6547,7 +6790,7 @@ function vaultSecrets(now2 = Date.now()) {
|
|
|
6547
6790
|
}
|
|
6548
6791
|
],
|
|
6549
6792
|
exec: false,
|
|
6550
|
-
createdAt: now2 - 20 *
|
|
6793
|
+
createdAt: now2 - 20 * day5,
|
|
6551
6794
|
expiresAt: now2 + 50 * minute3
|
|
6552
6795
|
},
|
|
6553
6796
|
{
|
|
@@ -6572,8 +6815,8 @@ function vaultSecrets(now2 = Date.now()) {
|
|
|
6572
6815
|
domains: ["buoy.example"],
|
|
6573
6816
|
rules: [{ domain: "buoy.example", header: "X-Buoy-Key", methods: ["GET"], paths: [] }],
|
|
6574
6817
|
exec: "shell",
|
|
6575
|
-
createdAt: now2 - 40 *
|
|
6576
|
-
removedAt: now2 -
|
|
6818
|
+
createdAt: now2 - 40 * day5,
|
|
6819
|
+
removedAt: now2 - day5
|
|
6577
6820
|
}
|
|
6578
6821
|
];
|
|
6579
6822
|
}
|
|
@@ -6590,7 +6833,7 @@ function accountRecords(now2 = Date.now()) {
|
|
|
6590
6833
|
domains: ["docs.example"],
|
|
6591
6834
|
rules: [{ domain: "docs.example", header: "Authorization", methods: [], paths: [] }],
|
|
6592
6835
|
exec: false,
|
|
6593
|
-
createdAt: now2 - 6 *
|
|
6836
|
+
createdAt: now2 - 6 * day5,
|
|
6594
6837
|
usedAt: now2 - 20 * minute3
|
|
6595
6838
|
}
|
|
6596
6839
|
];
|
|
@@ -6663,7 +6906,7 @@ function vaultAudit(now2 = Date.now()) {
|
|
|
6663
6906
|
type: "policy",
|
|
6664
6907
|
seq: 8,
|
|
6665
6908
|
id: "audit-8",
|
|
6666
|
-
at: now2 -
|
|
6909
|
+
at: now2 - day5,
|
|
6667
6910
|
file: "/etc/slicc/secrets-policy.toml",
|
|
6668
6911
|
sha256: "4e07408562bedb8b60ce05c1decfe3ad",
|
|
6669
6912
|
accepted: true,
|
|
@@ -6681,7 +6924,7 @@ function vaultAudit(now2 = Date.now()) {
|
|
|
6681
6924
|
type: "remove",
|
|
6682
6925
|
seq: 7,
|
|
6683
6926
|
id: "audit-7",
|
|
6684
|
-
at: now2 -
|
|
6927
|
+
at: now2 - day5 - hour3,
|
|
6685
6928
|
name: "BUOY_OLD_TOKEN"
|
|
6686
6929
|
},
|
|
6687
6930
|
{
|
|
@@ -6689,7 +6932,7 @@ function vaultAudit(now2 = Date.now()) {
|
|
|
6689
6932
|
type: "seal",
|
|
6690
6933
|
seq: 6,
|
|
6691
6934
|
id: "audit-6",
|
|
6692
|
-
at: now2 - 3 *
|
|
6935
|
+
at: now2 - 3 * day5,
|
|
6693
6936
|
name: "PIER_PUBLISH_TOKEN",
|
|
6694
6937
|
source: "jerk:cone@link-pier",
|
|
6695
6938
|
rotated: false
|
|
@@ -6702,7 +6945,7 @@ function vaultOlder(now2 = Date.now()) {
|
|
|
6702
6945
|
type: "materialize",
|
|
6703
6946
|
seq: 5,
|
|
6704
6947
|
id: "audit-5",
|
|
6705
|
-
at: now2 - 4 *
|
|
6948
|
+
at: now2 - 4 * day5,
|
|
6706
6949
|
name: "PIER_PUBLISH_TOKEN",
|
|
6707
6950
|
uid: 1e3,
|
|
6708
6951
|
tag: null,
|
|
@@ -6720,7 +6963,7 @@ function vaultOlder(now2 = Date.now()) {
|
|
|
6720
6963
|
type: "policy",
|
|
6721
6964
|
seq: 4,
|
|
6722
6965
|
id: "audit-4",
|
|
6723
|
-
at: now2 - 5 *
|
|
6966
|
+
at: now2 - 5 * day5,
|
|
6724
6967
|
file: "/etc/fnox/config.toml",
|
|
6725
6968
|
sha256: "8f14e45fceea167a5a36dedd4bea2543",
|
|
6726
6969
|
accepted: false,
|
|
@@ -6731,7 +6974,7 @@ function vaultOlder(now2 = Date.now()) {
|
|
|
6731
6974
|
type: "restore",
|
|
6732
6975
|
seq: 3,
|
|
6733
6976
|
id: "audit-3",
|
|
6734
|
-
at: now2 - 6 *
|
|
6977
|
+
at: now2 - 6 * day5,
|
|
6735
6978
|
name: "TIDE_MAIL",
|
|
6736
6979
|
uid: 0,
|
|
6737
6980
|
tag: null
|
|
@@ -6740,7 +6983,7 @@ function vaultOlder(now2 = Date.now()) {
|
|
|
6740
6983
|
type: "mcp",
|
|
6741
6984
|
seq: 2,
|
|
6742
6985
|
id: "audit-2",
|
|
6743
|
-
at: now2 - 7 *
|
|
6986
|
+
at: now2 - 7 * day5,
|
|
6744
6987
|
name: "DOCS_MCP_TOKEN",
|
|
6745
6988
|
uid: 1e3,
|
|
6746
6989
|
tag: "cone",
|
|
@@ -7185,6 +7428,13 @@ function vaultAccounts(accounts2) {
|
|
|
7185
7428
|
function guestsPort(guests, time) {
|
|
7186
7429
|
return guests === "off" ? {} : { guests: new DummyGuests(guests, time) };
|
|
7187
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
|
+
}
|
|
7188
7438
|
function createDummyModel({
|
|
7189
7439
|
delay = 30,
|
|
7190
7440
|
storage = null,
|
|
@@ -7209,7 +7459,9 @@ function createDummyModel({
|
|
|
7209
7459
|
readonly = "off",
|
|
7210
7460
|
browser: scenario = "idle",
|
|
7211
7461
|
sprinkles: sprinkles2 = "builtin",
|
|
7212
|
-
monitor = "dummy"
|
|
7462
|
+
monitor = "dummy",
|
|
7463
|
+
import: imports = "off",
|
|
7464
|
+
login
|
|
7213
7465
|
} = {}) {
|
|
7214
7466
|
const time = clock(delay);
|
|
7215
7467
|
const mount = mounts === "off" ? null : { scenario: mounts, point: mountPoint, files: mounted };
|
|
@@ -7232,6 +7484,7 @@ function createDummyModel({
|
|
|
7232
7484
|
stop(agentId);
|
|
7233
7485
|
browser.release(agentId);
|
|
7234
7486
|
};
|
|
7487
|
+
importPort(imports, agent, time);
|
|
7235
7488
|
if (hold !== "off") agent.setHold({ reason: hold, held: 2 });
|
|
7236
7489
|
if (readonly !== "off") agent.setReadOnly(readOnlyText);
|
|
7237
7490
|
const notice = readonly !== "off" ? "readonly" : notices;
|
|
@@ -7254,7 +7507,8 @@ function createDummyModel({
|
|
|
7254
7507
|
storage,
|
|
7255
7508
|
time,
|
|
7256
7509
|
void 0,
|
|
7257
|
-
providers === "none"
|
|
7510
|
+
providers === "none",
|
|
7511
|
+
login
|
|
7258
7512
|
),
|
|
7259
7513
|
memory: new DummyMemory(memories, () => [
|
|
7260
7514
|
{ id: "global", label: "Everyone" },
|
|
@@ -7297,6 +7551,7 @@ export {
|
|
|
7297
7551
|
DummyFollow,
|
|
7298
7552
|
DummyGuestAgent,
|
|
7299
7553
|
DummyGuests,
|
|
7554
|
+
DummyImport,
|
|
7300
7555
|
DummyNetwork,
|
|
7301
7556
|
DummyNotices,
|
|
7302
7557
|
DummyTabs,
|
|
@@ -7310,6 +7565,7 @@ export {
|
|
|
7310
7565
|
createGuestModel,
|
|
7311
7566
|
followFixtures,
|
|
7312
7567
|
forecastSprinkle,
|
|
7568
|
+
forgottenDevice,
|
|
7313
7569
|
guestApproved,
|
|
7314
7570
|
guestDeclined,
|
|
7315
7571
|
guestLabel,
|
|
@@ -7321,6 +7577,13 @@ export {
|
|
|
7321
7577
|
guestsPolicy,
|
|
7322
7578
|
guestsRefused,
|
|
7323
7579
|
guestsUnavailable,
|
|
7580
|
+
importBefore,
|
|
7581
|
+
importCancelled,
|
|
7582
|
+
importCones,
|
|
7583
|
+
importNotV6,
|
|
7584
|
+
importPreview,
|
|
7585
|
+
importReport,
|
|
7586
|
+
importTotal,
|
|
7324
7587
|
joinUrl,
|
|
7325
7588
|
leadersFixtures,
|
|
7326
7589
|
linksFixtures,
|
|
@@ -7329,6 +7592,10 @@ export {
|
|
|
7329
7592
|
otherGuest,
|
|
7330
7593
|
packageFixtures,
|
|
7331
7594
|
page,
|
|
7595
|
+
pairedDevice,
|
|
7596
|
+
pairingCode,
|
|
7597
|
+
pairingRefused,
|
|
7598
|
+
pairingStopped,
|
|
7332
7599
|
tabsFixtures,
|
|
7333
7600
|
tailnetFixtures,
|
|
7334
7601
|
updateFixtures,
|