@ai-ecoverse/slicc-agent 5.5.4 → 5.6.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 +10 -4
- package/dist/approvals/index.js +26 -17
- package/dist/approvals/index.js.map +2 -2
- package/dist/approvals/judge.js +7 -1
- package/dist/approvals/judge.js.map +2 -2
- package/dist/approvals/record.js +7 -2
- package/dist/approvals/record.js.map +2 -2
- package/dist/approvals/sudo-client.js +112 -0
- package/dist/approvals/sudo-client.js.map +7 -0
- package/dist/approvals/sudo.js +166 -0
- package/dist/approvals/sudo.js.map +7 -0
- package/dist/host.js +46 -13
- package/dist/host.js.map +2 -2
- package/dist/index.js.map +2 -2
- package/dist/owner.js +22 -1
- package/dist/owner.js.map +2 -2
- package/dist/page.js +2 -0
- package/dist/page.js.map +2 -2
- package/dist/services.js +10 -0
- package/dist/services.js.map +2 -2
- package/dist/serving.js +2 -0
- package/dist/serving.js.map +2 -2
- package/dist/types/approvals/index.d.ts +6 -1
- package/dist/types/approvals/judge.d.ts +10 -0
- package/dist/types/approvals/record.d.ts +6 -0
- package/dist/types/approvals/sudo-client.d.ts +12 -0
- package/dist/types/approvals/sudo.d.ts +52 -0
- package/dist/types/host.d.ts +5 -2
- package/dist/types/index.d.ts +2 -1
- package/dist/types/owner.d.ts +4 -0
- package/dist/types/page.d.ts +2 -0
- package/dist/types/services.d.ts +2 -0
- package/dist/types/serving.d.ts +2 -0
- package/dist/worker.js +7 -1
- package/dist/worker.js.map +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
2
|
+
import {
|
|
3
|
+
cleanReason,
|
|
4
|
+
REASONS
|
|
5
|
+
} from "./record.js";
|
|
6
|
+
const SAFE = /^[\w@%+=:,./-]+$/;
|
|
7
|
+
const shellWord = (word) => SAFE.test(word) ? word : `'${word.replaceAll("'", `'\\''`)}'`;
|
|
8
|
+
const text = (value) => typeof value === "string";
|
|
9
|
+
function sudoRequest(value) {
|
|
10
|
+
const request = value;
|
|
11
|
+
if (typeof request !== "object" || request === null) return null;
|
|
12
|
+
const { argv, user, expiresAt } = request;
|
|
13
|
+
if (!Array.isArray(argv) || !argv.length || !argv.every(text)) return null;
|
|
14
|
+
if (!text(user) || typeof expiresAt !== "number" || !Number.isFinite(expiresAt)) return null;
|
|
15
|
+
return request;
|
|
16
|
+
}
|
|
17
|
+
function tagOf(tag) {
|
|
18
|
+
if (!text(tag)) return null;
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(tag);
|
|
21
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const TERMINAL = "terminal:";
|
|
27
|
+
const FOLLOWER = "follower:";
|
|
28
|
+
function shownWhere(where, given) {
|
|
29
|
+
if (given) return given;
|
|
30
|
+
if (where.startsWith(TERMINAL)) return "a terminal";
|
|
31
|
+
if (where.startsWith(FOLLOWER)) return "a linked device";
|
|
32
|
+
return where;
|
|
33
|
+
}
|
|
34
|
+
function sudoRequester(request, agents, where) {
|
|
35
|
+
const tag = tagOf(request.tag);
|
|
36
|
+
const name = request.user;
|
|
37
|
+
if (tag?.kind === "agent" && text(tag.agentId)) {
|
|
38
|
+
const id = tag.agentId.startsWith("cone:") ? tag.agentId.slice("cone:".length) : tag.agentId;
|
|
39
|
+
const known = agents?.cones[id]?.name ?? agents?.scoops[id]?.name ?? name;
|
|
40
|
+
return { requester: { kind: "agent", name: known, agentId: id }, agentId: id };
|
|
41
|
+
}
|
|
42
|
+
if (tag?.kind === "user" && text(tag.where)) {
|
|
43
|
+
const given = cleanReason(where);
|
|
44
|
+
const device = tag.where.startsWith(FOLLOWER) ? tag.where.slice(FOLLOWER.length) : "";
|
|
45
|
+
return {
|
|
46
|
+
requester: {
|
|
47
|
+
kind: "user",
|
|
48
|
+
name,
|
|
49
|
+
where: shownWhere(tag.where, given),
|
|
50
|
+
...device ? { device } : {}
|
|
51
|
+
},
|
|
52
|
+
agentId: ""
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return { requester: { kind: "user", name }, agentId: "" };
|
|
56
|
+
}
|
|
57
|
+
function sudoDetail(request) {
|
|
58
|
+
const command = [request.path || request.argv[0], ...request.argv.slice(1)].map((word) => shellWord(String(word))).join(" ");
|
|
59
|
+
return {
|
|
60
|
+
command,
|
|
61
|
+
...text(request.target) ? { target: request.target } : {},
|
|
62
|
+
...text(request.cwd) ? { cwd: request.cwd } : {},
|
|
63
|
+
...request.always === true ? { alwaysScope: "cwd" } : {}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function scoopLick(id, agentId, detail, agents) {
|
|
67
|
+
const scoop = agents?.scoops[agentId];
|
|
68
|
+
if (!scoop) return void 0;
|
|
69
|
+
const { command, target, cwd } = detail;
|
|
70
|
+
const as = target ? ` as ${target}` : "";
|
|
71
|
+
const at = cwd ? ` in ${cwd}` : "";
|
|
72
|
+
return {
|
|
73
|
+
channel: "sudo-request",
|
|
74
|
+
source: id,
|
|
75
|
+
title: `${scoop.name} waits for sudo`,
|
|
76
|
+
text: `[scoop ${scoop.name} waits for a person to approve sudo]`,
|
|
77
|
+
body: `${scoop.name} asked to run ${command}${as}${at}. A person answers it in the approvals dialog; you can't approve it. It ends when someone answers or it times out.`,
|
|
78
|
+
target: `cone:${scoop.cone}`
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function createSudo(options) {
|
|
82
|
+
const { approvals } = options;
|
|
83
|
+
const agents = () => options.agents?.();
|
|
84
|
+
const waiting = /* @__PURE__ */ new Map();
|
|
85
|
+
const send = (lick) => void options.licks?.deliver(lick, BACKGROUND_CONTEXT).catch(() => void 0);
|
|
86
|
+
const watch = (items) => {
|
|
87
|
+
for (const [id, lick] of waiting) {
|
|
88
|
+
const item = items.find((entry) => entry.id === id);
|
|
89
|
+
if (item?.state === "pending" && item.tier !== "user") continue;
|
|
90
|
+
waiting.delete(id);
|
|
91
|
+
if (item?.state === "pending") send(lick);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const off = approvals.state.subscribe((items) => watch(items));
|
|
95
|
+
return {
|
|
96
|
+
approvals: approvals.state,
|
|
97
|
+
async request(value, where, context) {
|
|
98
|
+
const request = sudoRequest(value);
|
|
99
|
+
if (!request) return { id: null, error: "This is not a sudo request." };
|
|
100
|
+
const { requester, agentId } = sudoRequester(request, agents(), where);
|
|
101
|
+
const detail = sudoDetail(request);
|
|
102
|
+
const item = await approvals.request(
|
|
103
|
+
{
|
|
104
|
+
kind: "sudo",
|
|
105
|
+
agentId,
|
|
106
|
+
requester,
|
|
107
|
+
tier: "user",
|
|
108
|
+
always: request.always === true,
|
|
109
|
+
expiresAt: request.expiresAt,
|
|
110
|
+
detail
|
|
111
|
+
},
|
|
112
|
+
context
|
|
113
|
+
);
|
|
114
|
+
const lick = scoopLick(item.id, agentId, detail, agents());
|
|
115
|
+
if (lick) {
|
|
116
|
+
waiting.set(item.id, lick);
|
|
117
|
+
watch(approvals.state.value);
|
|
118
|
+
}
|
|
119
|
+
return { id: item.id, error: null };
|
|
120
|
+
},
|
|
121
|
+
async withdraw(id, reason, context) {
|
|
122
|
+
await approvals.withdraw(id, reason, context);
|
|
123
|
+
},
|
|
124
|
+
close() {
|
|
125
|
+
off();
|
|
126
|
+
waiting.clear();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function ownedSudo(sudo) {
|
|
131
|
+
const mine = /* @__PURE__ */ new Set();
|
|
132
|
+
const forget = () => {
|
|
133
|
+
const open = new Set(
|
|
134
|
+
sudo.approvals.value.filter((item) => item.state === "pending").map(({ id }) => id)
|
|
135
|
+
);
|
|
136
|
+
for (const id of mine) if (!open.has(id)) mine.delete(id);
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
approvals: sudo.approvals,
|
|
140
|
+
async request(request, where, context) {
|
|
141
|
+
forget();
|
|
142
|
+
const asked = await sudo.request(request, where, context);
|
|
143
|
+
if (asked.id) mine.add(asked.id);
|
|
144
|
+
return asked;
|
|
145
|
+
},
|
|
146
|
+
async withdraw(id, reason, context) {
|
|
147
|
+
if (!mine.delete(id)) return;
|
|
148
|
+
await sudo.withdraw(id, reason, context);
|
|
149
|
+
},
|
|
150
|
+
release() {
|
|
151
|
+
forget();
|
|
152
|
+
for (const id of mine)
|
|
153
|
+
void sudo.withdraw(id, REASONS.disconnected, BACKGROUND_CONTEXT).catch(() => void 0);
|
|
154
|
+
mine.clear();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
createSudo,
|
|
160
|
+
ownedSudo,
|
|
161
|
+
shellWord,
|
|
162
|
+
sudoDetail,
|
|
163
|
+
sudoRequest,
|
|
164
|
+
sudoRequester
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=sudo.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/approvals/sudo.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context, ReplicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AgentsState } from '../agents.ts';\nimport type { Licks } from '../licks/licks.ts';\nimport type { Approvals } from './index.ts';\nimport {\n type Approval,\n type ApprovalRequester,\n cleanReason,\n REASONS,\n type SudoDetail,\n} from './record.ts';\n\nexport type SudoAnswer = 'once' | 'always' | 'deny';\n\nexport interface SudoRequest {\n id: string;\n kind: 'sudo';\n user: string;\n uid?: number;\n target?: string;\n argv: string[];\n path?: string;\n cwd?: string;\n pid?: number;\n tag?: string;\n tty?: string;\n createdAt?: number;\n expiresAt: number;\n always?: boolean;\n}\n\nexport type SudoAsked = { id: string; error: null } | { id: null; error: string };\n\nexport interface AgentSudo {\n readonly approvals: ReplicatedState<Approval[]>;\n request(request: SudoRequest, where: string | null, context: Context): Promise<SudoAsked>;\n withdraw(id: string, reason: string | null, context: Context): Promise<void>;\n}\n\nconst SAFE = /^[\\w@%+=:,./-]+$/;\n\nexport const shellWord = (word: string): string =>\n SAFE.test(word) ? word : `'${word.replaceAll(\"'\", `'\\\\''`)}'`;\n\nconst text = (value: unknown): value is string => typeof value === 'string';\n\nexport function sudoRequest(value: unknown): SudoRequest | null {\n const request = value as Partial<SudoRequest> | null;\n if (typeof request !== 'object' || request === null) return null;\n const { argv, user, expiresAt } = request;\n if (!Array.isArray(argv) || !argv.length || !argv.every(text)) return null;\n if (!text(user) || typeof expiresAt !== 'number' || !Number.isFinite(expiresAt)) return null;\n return request as SudoRequest;\n}\n\nfunction tagOf(tag: unknown): { kind?: unknown; agentId?: unknown; where?: unknown } | null {\n if (!text(tag)) return null;\n try {\n const parsed = JSON.parse(tag);\n return typeof parsed === 'object' && parsed !== null ? parsed : null;\n } catch {\n return null;\n }\n}\n\nconst TERMINAL = 'terminal:';\nconst FOLLOWER = 'follower:';\n\nfunction shownWhere(where: string, given: string | undefined): string {\n if (given) return given;\n if (where.startsWith(TERMINAL)) return 'a terminal';\n if (where.startsWith(FOLLOWER)) return 'a linked device';\n return where;\n}\n\nexport function sudoRequester(\n request: SudoRequest,\n agents: Readonly<AgentsState> | undefined,\n where?: string | null\n): { requester: ApprovalRequester; agentId: string } {\n const tag = tagOf(request.tag);\n const name = request.user;\n if (tag?.kind === 'agent' && text(tag.agentId)) {\n const id = tag.agentId.startsWith('cone:') ? tag.agentId.slice('cone:'.length) : tag.agentId;\n const known = agents?.cones[id]?.name ?? agents?.scoops[id]?.name ?? name;\n return { requester: { kind: 'agent', name: known, agentId: id }, agentId: id };\n }\n if (tag?.kind === 'user' && text(tag.where)) {\n const given = cleanReason(where);\n const device = tag.where.startsWith(FOLLOWER) ? tag.where.slice(FOLLOWER.length) : '';\n return {\n requester: {\n kind: 'user',\n name,\n where: shownWhere(tag.where, given),\n ...(device ? { device } : {}),\n },\n agentId: '',\n };\n }\n return { requester: { kind: 'user', name }, agentId: '' };\n}\n\nexport function sudoDetail(request: SudoRequest): SudoDetail {\n const command = [request.path || request.argv[0], ...request.argv.slice(1)]\n .map((word) => shellWord(String(word)))\n .join(' ');\n return {\n command,\n ...(text(request.target) ? { target: request.target } : {}),\n ...(text(request.cwd) ? { cwd: request.cwd } : {}),\n ...(request.always === true ? { alwaysScope: 'cwd' as const } : {}),\n };\n}\n\nfunction scoopLick(\n id: string,\n agentId: string,\n detail: SudoDetail,\n agents: Readonly<AgentsState> | undefined\n) {\n const scoop = agents?.scoops[agentId];\n if (!scoop) return undefined;\n const { command, target, cwd } = detail;\n const as = target ? ` as ${target}` : '';\n const at = cwd ? ` in ${cwd}` : '';\n return {\n channel: 'sudo-request' as const,\n source: id,\n title: `${scoop.name} waits for sudo`,\n text: `[scoop ${scoop.name} waits for a person to approve sudo]`,\n body: `${scoop.name} asked to run ${command}${as}${at}. A person answers it in the approvals dialog; you can't approve it. It ends when someone answers or it times out.`,\n target: `cone:${scoop.cone}` as const,\n };\n}\n\nexport interface SudoAttach {\n approvals: Approvals;\n agents?: () => Readonly<AgentsState> | undefined;\n licks?: Pick<Licks, 'deliver'>;\n}\n\ntype SudoLick = NonNullable<ReturnType<typeof scoopLick>>;\n\nexport function createSudo(options: SudoAttach): AgentSudo & { close(): void } {\n const { approvals } = options;\n const agents = () => options.agents?.();\n const waiting = new Map<string, SudoLick>();\n const send = (lick: SudoLick) =>\n void options.licks?.deliver(lick, BACKGROUND_CONTEXT).catch(() => undefined);\n const watch = (items: readonly Approval[]) => {\n for (const [id, lick] of waiting) {\n const item = items.find((entry) => entry.id === id);\n if (item?.state === 'pending' && item.tier !== 'user') continue;\n waiting.delete(id);\n if (item?.state === 'pending') send(lick);\n }\n };\n const off = approvals.state.subscribe((items) => watch(items));\n return {\n approvals: approvals.state,\n async request(value, where, context) {\n const request = sudoRequest(value);\n if (!request) return { id: null, error: 'This is not a sudo request.' };\n const { requester, agentId } = sudoRequester(request, agents(), where);\n const detail = sudoDetail(request);\n const item = await approvals.request(\n {\n kind: 'sudo',\n agentId,\n requester,\n tier: 'user',\n always: request.always === true,\n expiresAt: request.expiresAt,\n detail,\n },\n context\n );\n const lick = scoopLick(item.id, agentId, detail, agents());\n if (lick) {\n waiting.set(item.id, lick);\n watch(approvals.state.value as Approval[]);\n }\n return { id: item.id, error: null };\n },\n async withdraw(id, reason, context) {\n await approvals.withdraw(id, reason, context);\n },\n close() {\n off();\n waiting.clear();\n },\n };\n}\n\nexport function ownedSudo(sudo: AgentSudo): AgentSudo & { release(): void } {\n const mine = new Set<string>();\n const forget = () => {\n const open = new Set(\n (sudo.approvals.value as Approval[])\n .filter((item) => item.state === 'pending')\n .map(({ id }) => id)\n );\n for (const id of mine) if (!open.has(id)) mine.delete(id);\n };\n return {\n approvals: sudo.approvals,\n async request(request, where, context) {\n forget();\n const asked = await sudo.request(request, where, context);\n if (asked.id) mine.add(asked.id);\n return asked;\n },\n async withdraw(id, reason, context) {\n if (!mine.delete(id)) return;\n await sudo.withdraw(id, reason, context);\n },\n release() {\n forget();\n for (const id of mine)\n void sudo.withdraw(id, REASONS.disconnected, BACKGROUND_CONTEXT).catch(() => undefined);\n mine.clear();\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/host.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
attachApprovals
|
|
10
10
|
} from "./approvals/index.js";
|
|
11
11
|
import { alwaysFor, attachApprovalPolicy } from "./approvals/policy.js";
|
|
12
|
+
import { createSudo, ownedSudo } from "./approvals/sudo.js";
|
|
12
13
|
import { createAgentControl } from "./control.js";
|
|
13
14
|
import { trackDeliveries } from "./deliveries.js";
|
|
14
15
|
import { createGuests } from "./guests/index.js";
|
|
@@ -23,6 +24,7 @@ import {
|
|
|
23
24
|
AgentPagesService,
|
|
24
25
|
AgentRemoteService,
|
|
25
26
|
AgentSettings,
|
|
27
|
+
AgentSudoService,
|
|
26
28
|
AgentTranscript,
|
|
27
29
|
CONTROL_METHODS,
|
|
28
30
|
CONTROL_READS,
|
|
@@ -31,10 +33,12 @@ import {
|
|
|
31
33
|
PAGE_METHODS,
|
|
32
34
|
REMOTE_METHODS,
|
|
33
35
|
REMOTE_READS,
|
|
34
|
-
SETTINGS_METHODS
|
|
36
|
+
SETTINGS_METHODS,
|
|
37
|
+
SUDO_METHODS
|
|
35
38
|
} from "./services.js";
|
|
36
39
|
import {
|
|
37
40
|
AGENT_HOST,
|
|
41
|
+
deviceOf,
|
|
38
42
|
guestOf,
|
|
39
43
|
principalKey,
|
|
40
44
|
readable,
|
|
@@ -94,6 +98,17 @@ function gatedControls(control, shown, views, labels) {
|
|
|
94
98
|
const viewed = { ...control, image: gated(visible), toolLabel: watchLabel(labels) };
|
|
95
99
|
return { trusted, viewed };
|
|
96
100
|
}
|
|
101
|
+
function approving(agent, policy, judge, context) {
|
|
102
|
+
return attachApprovals(
|
|
103
|
+
{
|
|
104
|
+
harness: agent.harness,
|
|
105
|
+
guestAlways: alwaysFor(policy),
|
|
106
|
+
sudoApprover: () => policy.current().sudo.approver,
|
|
107
|
+
...judge ? { judge } : {}
|
|
108
|
+
},
|
|
109
|
+
context
|
|
110
|
+
);
|
|
111
|
+
}
|
|
97
112
|
const noRevision = () => replicatedState({ revision: 0 });
|
|
98
113
|
async function hostAgent(agent, options = {}) {
|
|
99
114
|
const context = options.context ?? BACKGROUND_CONTEXT;
|
|
@@ -113,14 +128,7 @@ async function hostAgent(agent, options = {}) {
|
|
|
113
128
|
const pages = options.pages ?? createPages();
|
|
114
129
|
const deliveries = trackDeliveries(agent.harness, state, context);
|
|
115
130
|
const policy = await attachApprovalPolicy(agent.harness, context);
|
|
116
|
-
const approvals = options.approvals ?? await
|
|
117
|
-
{
|
|
118
|
-
harness: agent.harness,
|
|
119
|
-
guestAlways: alwaysFor(policy),
|
|
120
|
-
...options.judge ? { judge: options.judge } : {}
|
|
121
|
-
},
|
|
122
|
-
context
|
|
123
|
-
);
|
|
131
|
+
const approvals = options.approvals ?? await approving(agent, policy, options.judge, context);
|
|
124
132
|
const monitor = createMonitor({
|
|
125
133
|
...options.monitor,
|
|
126
134
|
harness: agent.harness,
|
|
@@ -188,6 +196,11 @@ async function hostAgent(agent, options = {}) {
|
|
|
188
196
|
approvals: approvals.state,
|
|
189
197
|
approvalPolicy: policy.state
|
|
190
198
|
};
|
|
199
|
+
const sudo = createSudo({
|
|
200
|
+
approvals,
|
|
201
|
+
agents: () => agent.agents.state(),
|
|
202
|
+
...options.licks ? { licks: options.licks.licks } : {}
|
|
203
|
+
});
|
|
191
204
|
const settings = options.settings ?? noSettings;
|
|
192
205
|
const gates = gatedControls(control, slims.shown, shownViews, transcriptService.labels);
|
|
193
206
|
const { trusted, viewed } = gates;
|
|
@@ -196,6 +209,7 @@ async function hostAgent(agent, options = {}) {
|
|
|
196
209
|
viewed,
|
|
197
210
|
transcript: transcriptService,
|
|
198
211
|
viewMonitor: monitor.viewState,
|
|
212
|
+
sudo,
|
|
199
213
|
settings,
|
|
200
214
|
remote,
|
|
201
215
|
pages,
|
|
@@ -223,7 +237,10 @@ async function hostAgent(agent, options = {}) {
|
|
|
223
237
|
links += 1;
|
|
224
238
|
const link = new PortLink(endpoint);
|
|
225
239
|
link.greet(serverId);
|
|
226
|
-
|
|
240
|
+
const device = connectOptions?.device ? { device: connectOptions.device } : {};
|
|
241
|
+
host.accept(link, {
|
|
242
|
+
principal: { seat, link: links, ...device }
|
|
243
|
+
});
|
|
227
244
|
},
|
|
228
245
|
async close() {
|
|
229
246
|
offGuests();
|
|
@@ -233,6 +250,7 @@ async function hostAgent(agent, options = {}) {
|
|
|
233
250
|
await monitor.dispose();
|
|
234
251
|
await remote.dispose();
|
|
235
252
|
deliveries.dispose();
|
|
253
|
+
sudo.close();
|
|
236
254
|
approvals.close();
|
|
237
255
|
transcript.dispose();
|
|
238
256
|
mounted.dispose();
|
|
@@ -285,9 +303,12 @@ function lazily(state) {
|
|
|
285
303
|
events: (listener) => readable(state()).events(listener)
|
|
286
304
|
};
|
|
287
305
|
}
|
|
288
|
-
const seated = (serving, seat) => ({
|
|
306
|
+
const seated = (serving, seat, device) => ({
|
|
289
307
|
...seat === "view" ? serving.viewed : serving.trusted,
|
|
290
|
-
decide: serving.decide(
|
|
308
|
+
decide: serving.decide({
|
|
309
|
+
by: seat === "owner" ? "owner" : "follower",
|
|
310
|
+
...device ? { device } : {}
|
|
311
|
+
})
|
|
291
312
|
});
|
|
292
313
|
const VIEW_METHODS = [...CONTROL_READS, ...OWNER_DEVICE_METHODS];
|
|
293
314
|
function serveAgent(serving) {
|
|
@@ -295,7 +316,7 @@ function serveAgent(serving) {
|
|
|
295
316
|
const viewing = { ...serving.transcript, monitor: serving.viewMonitor };
|
|
296
317
|
host.serve(AgentControl, ((_input, principal) => {
|
|
297
318
|
const seat = seatOf(principal);
|
|
298
|
-
const control = seated(serving, seat);
|
|
319
|
+
const control = seated(serving, seat, deviceOf(principal));
|
|
299
320
|
if (seat === "view") return { kind: "view", ...served(() => control, VIEW_METHODS) };
|
|
300
321
|
return { kind: "control", ...served(() => control, CONTROL_METHODS) };
|
|
301
322
|
}));
|
|
@@ -345,6 +366,18 @@ function serveAgent(serving) {
|
|
|
345
366
|
};
|
|
346
367
|
})
|
|
347
368
|
);
|
|
369
|
+
host.serve(AgentSudoService, ((_input, principal, self) => {
|
|
370
|
+
const sudo = serving.sudo;
|
|
371
|
+
if (seatOf(principal) !== "owner" || !sudo) return { kind: "none" };
|
|
372
|
+
const held = self.resources({
|
|
373
|
+
mine: resource({ rev: 1, open: () => ownedSudo(sudo), close: (mine) => mine.release() })
|
|
374
|
+
});
|
|
375
|
+
return {
|
|
376
|
+
kind: "sudo",
|
|
377
|
+
approvals: readable(sudo.approvals),
|
|
378
|
+
...served(() => held.mine.value, SUDO_METHODS)
|
|
379
|
+
};
|
|
380
|
+
}));
|
|
348
381
|
return host;
|
|
349
382
|
}
|
|
350
383
|
export {
|
package/dist/host.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/host.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Context,\n createHost,\n forbidden,\n type Host,\n type Readable,\n type ReplicatedState,\n replicatedState,\n resource,\n type Self,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Agent } from './agent.ts';\nimport {\n type ApprovalJudge,\n type Approvals,\n attachApprovals,\n type DecidedBy,\n} from './approvals/index.ts';\nimport { alwaysFor, attachApprovalPolicy } from './approvals/policy.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { ChangesRuntime } from './changes/index.ts';\nimport { createAgentControl, type HostLicks, type HostScoops } from './control.ts';\nimport { trackDeliveries } from './deliveries.ts';\nimport type { FreezerRuntime, FrozenCone } from './freezer/index.ts';\nimport { createGuests, type Guests } from './guests/index.ts';\nimport { admitGuest, guestOpener } from './guests/serve.ts';\nimport type { UserClients } from './kernel/users.ts';\nimport type { McpRuntime } from './mcp/index.ts';\nimport type { MemoryEntry, MemoryScope } from './memory/format.ts';\nimport type { MemoryRuntime } from './memory/index.ts';\nimport { createMonitor, type MonitorOptions } from './monitor/index.ts';\nimport { viewRemote } from './readonly.ts';\nimport { type AgentRemote, createRemote } from './remote/host.ts';\nimport { createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AgentControl,\n type AgentGuest,\n AgentGuestService,\n AgentPagesService,\n AgentRemoteService,\n AgentSettings,\n AgentTranscript,\n CONTROL_METHODS,\n CONTROL_READS,\n type Command,\n GUEST_METHODS,\n OWNER_DEVICE_METHODS,\n PAGE_METHODS,\n type PrivateRevision,\n REMOTE_METHODS,\n REMOTE_READS,\n SETTINGS_METHODS,\n} from './services.ts';\nimport {\n AGENT_HOST,\n type AgentPrincipal,\n type GuestPrincipal,\n guestOf,\n principalKey,\n readable,\n readablesOf,\n type Seat,\n seatOf,\n served,\n} from './serving.ts';\nimport type { SkillsRuntime } from './skills/index.ts';\nimport type { SprinklesRuntime } from './sprinkles/index.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\nimport { slimmer, type Thumbnail, thumbnail } from './thumbs.ts';\nimport { type LabelsRuntime, visibleLabels, watchLabel } from './titles/labels.ts';\nimport type { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport { type PortEndpoint, PortLink } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n readonly guests: Guests;\n readonly approvals: Approvals;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nconst noSettings: AgentSettings = {\n state: replicatedState({ models: [], accounts: [] }),\n connect: async () => {\n throw new Error('this agent has no accounts');\n },\n disconnect: async () => {},\n signIn: async () => null,\n dismissMoved: async () => {},\n};\n\nasync function follow(\n agent: Agent,\n context: Context,\n slim: (view: ConversationView) => ConversationView\n) {\n let attached = await agent.cone().viewState(context);\n const state = replicatedState<ConversationView>(slim(attached.value));\n const mirror = (value: ConversationView, from: Context) => state.replace(from, slim(value));\n let off = attached.subscribe(mirror);\n const stop = agent.onCone(async (conversation) => {\n const next = await conversation.viewState(context);\n off();\n attached.dispose();\n attached = next;\n state.replace(context, slim(next.value));\n off = next.subscribe(mirror);\n });\n return {\n state,\n refresh: () => state.replace(context, slim(attached.value)),\n dispose() {\n stop();\n off();\n attached.dispose();\n },\n };\n}\n\nexport interface HostSecrets {\n vault: ReplicatedState<VaultState>;\n list(): readonly SecretName[];\n close?(): void;\n}\n\nconst idleVault = replicatedState<VaultState>({\n port: 'none',\n needed: false,\n version: 0,\n locked: 'no',\n held: 0,\n});\n\nfunction gatedControls(\n control: AgentControl,\n shown: (entry: number) => boolean,\n views: () => readonly ConversationView[],\n labels: ReplicatedState<Record<string, string>>\n) {\n const visible = (entry: number) =>\n views().some((view) => view.entries.some((item) => item.id === entry));\n const gated =\n (allowed: (entry: number) => boolean): AgentControl['image'] =>\n async (ref, using) =>\n allowed(ref.entry) ? control.image(ref, using) : { data: null, mimeType: null };\n const trusted: AgentControl = { ...control, image: gated(shown) };\n const viewed: AgentControl = { ...control, image: gated(visible), toolLabel: watchLabel(labels) };\n return { trusted, viewed };\n}\n\nconst noRevision = () => replicatedState<PrivateRevision>({ revision: 0 });\n\nexport async function hostAgent(\n agent: Agent,\n options: {\n serverId?: string;\n context?: Context;\n settings?: AgentSettings;\n licks?: HostLicks;\n scoops?: HostScoops;\n skills?: SkillsRuntime;\n sprinkles?: SprinklesRuntime;\n memory?: MemoryRuntime;\n freezer?: FreezerRuntime;\n changes?: ChangesRuntime;\n mcp?: Pick<McpRuntime, 'close'>;\n users?: UserClients;\n monitor?: Pick<MonitorOptions, 'kernel' | 'groups' | 'users'>;\n pages?: Pages;\n secrets?: HostSecrets;\n uploads?: Uploads;\n thumbnail?: Thumbnail;\n labels?: LabelsRuntime;\n approvals?: Approvals;\n judge?: ApprovalJudge;\n } = {}\n): Promise<AgentHost> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const serverId = options.serverId ?? crypto.randomUUID();\n let refresh = () => {};\n const slims = slimmer(options.thumbnail ?? thumbnail, () => refresh());\n const transcript = await follow(agent, context, slims.slim);\n const { state } = transcript;\n const mounted = await agentViews(agent, context, slims.slim);\n refresh = () => {\n transcript.refresh();\n mounted.refresh();\n };\n const touch = () => options.freezer?.touch();\n const untouch = [state.subscribe(touch), mounted.views.subscribe(touch)];\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, context);\n const policy = await attachApprovalPolicy(agent.harness, context);\n const approvals =\n options.approvals ??\n (await attachApprovals(\n {\n harness: agent.harness,\n guestAlways: alwaysFor(policy),\n ...(options.judge ? { judge: options.judge } : {}),\n },\n context\n ));\n const monitor = createMonitor({\n ...options.monitor,\n harness: agent.harness,\n agents: agent.agents,\n views: mounted.views,\n context,\n });\n const guests = await createGuests({\n harness: agent.harness,\n agents: agent.agents,\n approvals,\n policy,\n context,\n });\n const control: AgentControl = {\n ...createAgentControl(\n agent.harness,\n agent,\n deliveries,\n options.licks,\n options.scoops,\n options.skills,\n options.sprinkles,\n options.memory,\n options.freezer,\n options.changes,\n monitor,\n options.secrets?.list,\n options.uploads,\n options.labels,\n guests\n ),\n approvalPolicySet: (change, using) => policy.set(change, using),\n };\n const remote = createRemote({\n harness: agent.harness,\n send: (request, using) => control.send(request, using),\n vault: options.secrets?.vault ?? idleVault,\n async conversation(agentId, using) {\n if (!agentId) return agent.cone();\n const found = await agent.agents.conversation(agentId, using);\n if (!found) throw new Error(`There is no agent ${agentId}.`);\n return found;\n },\n });\n const shownViews = () => [state.value, ...Object.values(mounted.views.value)];\n const kept = options.labels?.labels ?? replicatedState<Record<string, string>>({});\n const labels = visibleLabels(kept, [state, mounted.views], shownViews);\n const transcriptService = {\n state,\n deliveries: deliveries.state,\n agents: mounted.agents,\n views: mounted.views,\n commands: options.skills?.commands ?? replicatedState<Command[]>([]),\n privateRevision: options.skills?.privateRevision ?? noRevision(),\n sprinkles: options.sprinkles?.sprinkles ?? replicatedState<Sprinkle[]>([]),\n memories: options.memory?.memories ?? replicatedState<MemoryEntry[]>([]),\n memoryScopes: options.memory?.scopes ?? replicatedState<MemoryScope[]>([]),\n frozen: options.freezer?.frozen ?? replicatedState<FrozenCone[]>([]),\n changes:\n options.changes?.view ?? replicatedState<ChangesView>({ unavailable: null, changes: [] }),\n monitor: monitor.state,\n vault: options.secrets?.vault ?? idleVault,\n labels: labels.state,\n guests: guests.seats,\n approvals: approvals.state,\n approvalPolicy: policy.state,\n };\n const settings = options.settings ?? noSettings;\n const gates = gatedControls(control, slims.shown, shownViews, transcriptService.labels);\n const { trusted, viewed } = gates;\n const host = serveAgent({\n trusted,\n viewed,\n transcript: transcriptService,\n viewMonitor: monitor.viewState,\n settings,\n remote,\n pages,\n guest: guestOpener(guests, agent.agents, mounted.views, context, approvals.state),\n decide: (by) => (id, decision, reason, using) =>\n approvals.decide(id, decision, reason, by, using),\n });\n const offGuests = guests.onEnd((id) => {\n void host.invalidatePrincipal((principal) => guestOf(principal)?.id === id);\n });\n let links = 0;\n return {\n serverId,\n agent,\n pages,\n guests,\n approvals,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n if (connectOptions?.guest) {\n links += 1;\n admitGuest(guests, endpoint, connectOptions.guest, serverId, links, host);\n return;\n }\n const seat: Seat = connectOptions?.readOnly\n ? 'view'\n : connectOptions?.pages === false\n ? 'control'\n : 'owner';\n links += 1;\n const link = new PortLink(endpoint);\n link.greet(serverId);\n host.accept(link, { principal: { seat, link: links } satisfies AgentPrincipal });\n },\n async close() {\n offGuests();\n await host.close();\n guests.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n approvals.close();\n transcript.dispose();\n mounted.dispose();\n labels.dispose();\n slims.dispose();\n for (const off of untouch) off();\n options.freezer?.close();\n options.secrets?.close?.();\n await options.changes?.close(context);\n await options.memory?.close(context);\n await options.sprinkles?.close(context);\n await options.skills?.close(context);\n await options.mcp?.close(context);\n await options.scoops?.runtime.close(context);\n await options.licks?.sources.close(context);\n await agent.close();\n await options.users?.close();\n },\n };\n}\n\ninterface Served {\n trusted: AgentControl;\n viewed: AgentControl;\n transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;\n viewMonitor: ReplicatedState<unknown>;\n settings: AgentSettings;\n remote: AgentRemote;\n pages: Pages;\n guest?: (principal: GuestPrincipal) => { value: AgentGuest; dispose(): void } | undefined;\n decide: (by: DecidedBy) => AgentControl['decide'];\n}\n\nexport const CLOSED_TO_GUESTS = 'a guest seat has only its transcript and propose';\n\nconst opened = new WeakSet<object>();\n\nexport const openToGuests = <F extends object>(factory: F): F => {\n opened.add(factory);\n return factory;\n};\n\nexport function closedToGuests(host: Host): Host {\n const serve = ((type: never, factory: (...args: unknown[]) => unknown, options?: never) =>\n host.serve(\n type,\n (opened.has(factory)\n ? factory\n : (input: unknown, principal: unknown, self: unknown) => {\n if (seatOf(principal as never) === 'guest') throw forbidden(CLOSED_TO_GUESTS);\n return factory(input, principal, self);\n }) as never,\n options\n )) as Host['serve'];\n return new Proxy(host, {\n get(target, key) {\n if (key === 'serve') return serve;\n const value = Reflect.get(target, key, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nexport function lazily<T>(state: () => ReplicatedState<T>): Readable<T> {\n return {\n get value() {\n return readable(state()).value;\n },\n subscribe: (listener) => readable(state()).subscribe(listener),\n events: (listener) => readable(state()).events(listener),\n };\n}\n\nconst seated = (serving: Served, seat: Seat): AgentControl => ({\n ...(seat === 'view' ? serving.viewed : serving.trusted),\n decide: serving.decide(seat === 'owner' ? 'owner' : 'follower'),\n});\n\nconst VIEW_METHODS = [...CONTROL_READS, ...OWNER_DEVICE_METHODS];\n\nexport function serveAgent(serving: Served): Host {\n const host = closedToGuests(createHost({ name: AGENT_HOST, principalKey }));\n const viewing = { ...serving.transcript, monitor: serving.viewMonitor };\n host.serve(AgentControl, ((_input: unknown, principal: unknown) => {\n const seat = seatOf(principal);\n const control = seated(serving, seat);\n if (seat === 'view') return { kind: 'view', ...served(() => control, VIEW_METHODS) };\n return { kind: 'control', ...served(() => control, CONTROL_METHODS) };\n }) as never);\n host.serve(AgentTranscript, ((_input: unknown, principal: unknown) => ({\n kind: 'transcript',\n ...readablesOf(seatOf(principal) === 'view' ? viewing : serving.transcript),\n })) as never);\n host.serve(AgentSettings, ((_input: unknown, principal: unknown) => ({\n kind: seatOf(principal) === 'view' ? 'view' : 'settings',\n state: readable(serving.settings.state),\n ...(seatOf(principal) === 'view' ? {} : served(() => serving.settings, SETTINGS_METHODS)),\n })) as never);\n host.serve(AgentRemoteService, ((_input: unknown, principal: unknown) => {\n if (seatOf(principal) !== 'view')\n return { kind: 'remote', ...served(() => serving.remote, REMOTE_METHODS) };\n const scoped = viewRemote(serving.remote);\n return { kind: 'watch', ...served(() => scoped, REMOTE_READS) };\n }) as never);\n host.serve(AgentPagesService, ((_input: unknown, principal: unknown, self: Self) => {\n if (seatOf(principal) !== 'owner') return { kind: 'none' };\n const held = self.resources({\n mine: resource({\n rev: 1,\n open: () => ownedPages(serving.pages),\n close: (mine) => mine.release(),\n }),\n });\n return { kind: 'pages', ...served(() => held.mine.value, PAGE_METHODS) };\n }) as never);\n host.serve(\n AgentGuestService,\n openToGuests((_input: unknown, principal: unknown, self: Self) => {\n const guest = guestOf(principal as never);\n if (!guest) return { kind: 'none' };\n const opening = serving.guest?.(guest);\n if (!opening) throw forbidden(CLOSED_TO_GUESTS);\n const held = self.resources({\n seat: resource({ rev: 1, open: () => opening, close: (made) => made.dispose() }),\n });\n const later = (name: 'transcript' | 'seat' | 'proposals') =>\n lazily(() => held.seat.value.value[name] as ReplicatedState<unknown>);\n return {\n kind: 'guest',\n transcript: later('transcript'),\n seat: later('seat'),\n proposals: later('proposals'),\n ...served(() => held.seat.value.value, GUEST_METHODS),\n };\n }) as never\n );\n return host;\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEE;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,0BAA0B;AAGnC;AAAA,EAGE;AAAA,OAEK;AACP,
|
|
4
|
+
"sourcesContent": ["import {\n type Context,\n createHost,\n forbidden,\n type Host,\n type Readable,\n type ReplicatedState,\n replicatedState,\n resource,\n type Self,\n} from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Agent } from './agent.ts';\nimport {\n type ApprovalJudge,\n type Approvals,\n attachApprovals,\n type Decider,\n} from './approvals/index.ts';\nimport { type ApprovalPolicies, alwaysFor, attachApprovalPolicy } from './approvals/policy.ts';\nimport { type AgentSudo, createSudo, ownedSudo } from './approvals/sudo.ts';\nimport type { ChangesView } from './changes/git.ts';\nimport type { ChangesRuntime } from './changes/index.ts';\nimport { createAgentControl, type HostLicks, type HostScoops } from './control.ts';\nimport { trackDeliveries } from './deliveries.ts';\nimport type { FreezerRuntime, FrozenCone } from './freezer/index.ts';\nimport { createGuests, type Guests } from './guests/index.ts';\nimport { admitGuest, guestOpener } from './guests/serve.ts';\nimport type { UserClients } from './kernel/users.ts';\nimport type { McpRuntime } from './mcp/index.ts';\nimport type { MemoryEntry, MemoryScope } from './memory/format.ts';\nimport type { MemoryRuntime } from './memory/index.ts';\nimport { createMonitor, type MonitorOptions } from './monitor/index.ts';\nimport { viewRemote } from './readonly.ts';\nimport { type AgentRemote, createRemote } from './remote/host.ts';\nimport { createPages, ownedPages, type Pages } from './remote/pages.ts';\nimport type { SecretName } from './secrets/names.ts';\nimport type { VaultState } from './secrets/vault.ts';\nimport {\n AgentControl,\n type AgentGuest,\n AgentGuestService,\n AgentPagesService,\n AgentRemoteService,\n AgentSettings,\n AgentSudoService,\n AgentTranscript,\n CONTROL_METHODS,\n CONTROL_READS,\n type Command,\n GUEST_METHODS,\n OWNER_DEVICE_METHODS,\n PAGE_METHODS,\n type PrivateRevision,\n REMOTE_METHODS,\n REMOTE_READS,\n SETTINGS_METHODS,\n SUDO_METHODS,\n} from './services.ts';\nimport {\n AGENT_HOST,\n type AgentPrincipal,\n deviceOf,\n type GuestPrincipal,\n guestOf,\n principalKey,\n readable,\n readablesOf,\n type Seat,\n seatOf,\n served,\n} from './serving.ts';\nimport type { SkillsRuntime } from './skills/index.ts';\nimport type { SprinklesRuntime } from './sprinkles/index.ts';\nimport type { Sprinkle } from './sprinkles/kind.ts';\nimport { slimmer, type Thumbnail, thumbnail } from './thumbs.ts';\nimport { type LabelsRuntime, visibleLabels, watchLabel } from './titles/labels.ts';\nimport type { Uploads } from './uploads.ts';\nimport { agentViews } from './views.ts';\nimport { type PortEndpoint, PortLink } from './wire.ts';\n\nexport interface ConnectOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n device?: string;\n}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\n readonly guests: Guests;\n readonly approvals: Approvals;\n connect(endpoint: PortEndpoint, options?: ConnectOptions): void;\n close(): Promise<void>;\n}\n\nconst noSettings: AgentSettings = {\n state: replicatedState({ models: [], accounts: [] }),\n connect: async () => {\n throw new Error('this agent has no accounts');\n },\n disconnect: async () => {},\n signIn: async () => null,\n dismissMoved: async () => {},\n};\n\nasync function follow(\n agent: Agent,\n context: Context,\n slim: (view: ConversationView) => ConversationView\n) {\n let attached = await agent.cone().viewState(context);\n const state = replicatedState<ConversationView>(slim(attached.value));\n const mirror = (value: ConversationView, from: Context) => state.replace(from, slim(value));\n let off = attached.subscribe(mirror);\n const stop = agent.onCone(async (conversation) => {\n const next = await conversation.viewState(context);\n off();\n attached.dispose();\n attached = next;\n state.replace(context, slim(next.value));\n off = next.subscribe(mirror);\n });\n return {\n state,\n refresh: () => state.replace(context, slim(attached.value)),\n dispose() {\n stop();\n off();\n attached.dispose();\n },\n };\n}\n\nexport interface HostSecrets {\n vault: ReplicatedState<VaultState>;\n list(): readonly SecretName[];\n close?(): void;\n}\n\nconst idleVault = replicatedState<VaultState>({\n port: 'none',\n needed: false,\n version: 0,\n locked: 'no',\n held: 0,\n});\n\nfunction gatedControls(\n control: AgentControl,\n shown: (entry: number) => boolean,\n views: () => readonly ConversationView[],\n labels: ReplicatedState<Record<string, string>>\n) {\n const visible = (entry: number) =>\n views().some((view) => view.entries.some((item) => item.id === entry));\n const gated =\n (allowed: (entry: number) => boolean): AgentControl['image'] =>\n async (ref, using) =>\n allowed(ref.entry) ? control.image(ref, using) : { data: null, mimeType: null };\n const trusted: AgentControl = { ...control, image: gated(shown) };\n const viewed: AgentControl = { ...control, image: gated(visible), toolLabel: watchLabel(labels) };\n return { trusted, viewed };\n}\n\nfunction approving(\n agent: Agent,\n policy: ApprovalPolicies,\n judge: ApprovalJudge | undefined,\n context: Context\n): Promise<Approvals> {\n return attachApprovals(\n {\n harness: agent.harness,\n guestAlways: alwaysFor(policy),\n sudoApprover: () => policy.current().sudo.approver,\n ...(judge ? { judge } : {}),\n },\n context\n );\n}\n\nconst noRevision = () => replicatedState<PrivateRevision>({ revision: 0 });\n\nexport async function hostAgent(\n agent: Agent,\n options: {\n serverId?: string;\n context?: Context;\n settings?: AgentSettings;\n licks?: HostLicks;\n scoops?: HostScoops;\n skills?: SkillsRuntime;\n sprinkles?: SprinklesRuntime;\n memory?: MemoryRuntime;\n freezer?: FreezerRuntime;\n changes?: ChangesRuntime;\n mcp?: Pick<McpRuntime, 'close'>;\n users?: UserClients;\n monitor?: Pick<MonitorOptions, 'kernel' | 'groups' | 'users'>;\n pages?: Pages;\n secrets?: HostSecrets;\n uploads?: Uploads;\n thumbnail?: Thumbnail;\n labels?: LabelsRuntime;\n approvals?: Approvals;\n judge?: ApprovalJudge;\n } = {}\n): Promise<AgentHost> {\n const context = options.context ?? BACKGROUND_CONTEXT;\n const serverId = options.serverId ?? crypto.randomUUID();\n let refresh = () => {};\n const slims = slimmer(options.thumbnail ?? thumbnail, () => refresh());\n const transcript = await follow(agent, context, slims.slim);\n const { state } = transcript;\n const mounted = await agentViews(agent, context, slims.slim);\n refresh = () => {\n transcript.refresh();\n mounted.refresh();\n };\n const touch = () => options.freezer?.touch();\n const untouch = [state.subscribe(touch), mounted.views.subscribe(touch)];\n const pages = options.pages ?? createPages();\n const deliveries = trackDeliveries(agent.harness, state, context);\n const policy = await attachApprovalPolicy(agent.harness, context);\n const approvals = options.approvals ?? (await approving(agent, policy, options.judge, context));\n const monitor = createMonitor({\n ...options.monitor,\n harness: agent.harness,\n agents: agent.agents,\n views: mounted.views,\n context,\n });\n const guests = await createGuests({\n harness: agent.harness,\n agents: agent.agents,\n approvals,\n policy,\n context,\n });\n const control: AgentControl = {\n ...createAgentControl(\n agent.harness,\n agent,\n deliveries,\n options.licks,\n options.scoops,\n options.skills,\n options.sprinkles,\n options.memory,\n options.freezer,\n options.changes,\n monitor,\n options.secrets?.list,\n options.uploads,\n options.labels,\n guests\n ),\n approvalPolicySet: (change, using) => policy.set(change, using),\n };\n const remote = createRemote({\n harness: agent.harness,\n send: (request, using) => control.send(request, using),\n vault: options.secrets?.vault ?? idleVault,\n async conversation(agentId, using) {\n if (!agentId) return agent.cone();\n const found = await agent.agents.conversation(agentId, using);\n if (!found) throw new Error(`There is no agent ${agentId}.`);\n return found;\n },\n });\n const shownViews = () => [state.value, ...Object.values(mounted.views.value)];\n const kept = options.labels?.labels ?? replicatedState<Record<string, string>>({});\n const labels = visibleLabels(kept, [state, mounted.views], shownViews);\n const transcriptService = {\n state,\n deliveries: deliveries.state,\n agents: mounted.agents,\n views: mounted.views,\n commands: options.skills?.commands ?? replicatedState<Command[]>([]),\n privateRevision: options.skills?.privateRevision ?? noRevision(),\n sprinkles: options.sprinkles?.sprinkles ?? replicatedState<Sprinkle[]>([]),\n memories: options.memory?.memories ?? replicatedState<MemoryEntry[]>([]),\n memoryScopes: options.memory?.scopes ?? replicatedState<MemoryScope[]>([]),\n frozen: options.freezer?.frozen ?? replicatedState<FrozenCone[]>([]),\n changes:\n options.changes?.view ?? replicatedState<ChangesView>({ unavailable: null, changes: [] }),\n monitor: monitor.state,\n vault: options.secrets?.vault ?? idleVault,\n labels: labels.state,\n guests: guests.seats,\n approvals: approvals.state,\n approvalPolicy: policy.state,\n };\n const sudo = createSudo({\n approvals,\n agents: () => agent.agents.state(),\n ...(options.licks ? { licks: options.licks.licks } : {}),\n });\n const settings = options.settings ?? noSettings;\n const gates = gatedControls(control, slims.shown, shownViews, transcriptService.labels);\n const { trusted, viewed } = gates;\n const host = serveAgent({\n trusted,\n viewed,\n transcript: transcriptService,\n viewMonitor: monitor.viewState,\n sudo,\n settings,\n remote,\n pages,\n guest: guestOpener(guests, agent.agents, mounted.views, context, approvals.state),\n decide: (by) => (id, decision, reason, using) =>\n approvals.decide(id, decision, reason, by, using),\n });\n const offGuests = guests.onEnd((id) => {\n void host.invalidatePrincipal((principal) => guestOf(principal)?.id === id);\n });\n let links = 0;\n return {\n serverId,\n agent,\n pages,\n guests,\n approvals,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\n if (connectOptions?.guest) {\n links += 1;\n admitGuest(guests, endpoint, connectOptions.guest, serverId, links, host);\n return;\n }\n const seat: Seat = connectOptions?.readOnly\n ? 'view'\n : connectOptions?.pages === false\n ? 'control'\n : 'owner';\n links += 1;\n const link = new PortLink(endpoint);\n link.greet(serverId);\n const device = connectOptions?.device ? { device: connectOptions.device } : {};\n host.accept(link, {\n principal: { seat, link: links, ...device } satisfies AgentPrincipal,\n });\n },\n async close() {\n offGuests();\n await host.close();\n guests.dispose();\n await pages.dispose();\n await monitor.dispose();\n await remote.dispose();\n deliveries.dispose();\n sudo.close();\n approvals.close();\n transcript.dispose();\n mounted.dispose();\n labels.dispose();\n slims.dispose();\n for (const off of untouch) off();\n options.freezer?.close();\n options.secrets?.close?.();\n await options.changes?.close(context);\n await options.memory?.close(context);\n await options.sprinkles?.close(context);\n await options.skills?.close(context);\n await options.mcp?.close(context);\n await options.scoops?.runtime.close(context);\n await options.licks?.sources.close(context);\n await agent.close();\n await options.users?.close();\n },\n };\n}\n\ninterface Served {\n trusted: AgentControl;\n viewed: AgentControl;\n transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;\n viewMonitor: ReplicatedState<unknown>;\n sudo?: AgentSudo;\n settings: AgentSettings;\n remote: AgentRemote;\n pages: Pages;\n guest?: (principal: GuestPrincipal) => { value: AgentGuest; dispose(): void } | undefined;\n decide: (by: Decider) => AgentControl['decide'];\n}\n\nexport const CLOSED_TO_GUESTS = 'a guest seat has only its transcript and propose';\n\nconst opened = new WeakSet<object>();\n\nexport const openToGuests = <F extends object>(factory: F): F => {\n opened.add(factory);\n return factory;\n};\n\nexport function closedToGuests(host: Host): Host {\n const serve = ((type: never, factory: (...args: unknown[]) => unknown, options?: never) =>\n host.serve(\n type,\n (opened.has(factory)\n ? factory\n : (input: unknown, principal: unknown, self: unknown) => {\n if (seatOf(principal as never) === 'guest') throw forbidden(CLOSED_TO_GUESTS);\n return factory(input, principal, self);\n }) as never,\n options\n )) as Host['serve'];\n return new Proxy(host, {\n get(target, key) {\n if (key === 'serve') return serve;\n const value = Reflect.get(target, key, target) as unknown;\n return typeof value === 'function' ? value.bind(target) : value;\n },\n });\n}\n\nexport function lazily<T>(state: () => ReplicatedState<T>): Readable<T> {\n return {\n get value() {\n return readable(state()).value;\n },\n subscribe: (listener) => readable(state()).subscribe(listener),\n events: (listener) => readable(state()).events(listener),\n };\n}\n\nconst seated = (serving: Served, seat: Seat, device: string | undefined): AgentControl => ({\n ...(seat === 'view' ? serving.viewed : serving.trusted),\n decide: serving.decide({\n by: seat === 'owner' ? 'owner' : 'follower',\n ...(device ? { device } : {}),\n }),\n});\n\nconst VIEW_METHODS = [...CONTROL_READS, ...OWNER_DEVICE_METHODS];\n\nexport function serveAgent(serving: Served): Host {\n const host = closedToGuests(createHost({ name: AGENT_HOST, principalKey }));\n const viewing = { ...serving.transcript, monitor: serving.viewMonitor };\n host.serve(AgentControl, ((_input: unknown, principal: unknown) => {\n const seat = seatOf(principal);\n const control = seated(serving, seat, deviceOf(principal));\n if (seat === 'view') return { kind: 'view', ...served(() => control, VIEW_METHODS) };\n return { kind: 'control', ...served(() => control, CONTROL_METHODS) };\n }) as never);\n host.serve(AgentTranscript, ((_input: unknown, principal: unknown) => ({\n kind: 'transcript',\n ...readablesOf(seatOf(principal) === 'view' ? viewing : serving.transcript),\n })) as never);\n host.serve(AgentSettings, ((_input: unknown, principal: unknown) => ({\n kind: seatOf(principal) === 'view' ? 'view' : 'settings',\n state: readable(serving.settings.state),\n ...(seatOf(principal) === 'view' ? {} : served(() => serving.settings, SETTINGS_METHODS)),\n })) as never);\n host.serve(AgentRemoteService, ((_input: unknown, principal: unknown) => {\n if (seatOf(principal) !== 'view')\n return { kind: 'remote', ...served(() => serving.remote, REMOTE_METHODS) };\n const scoped = viewRemote(serving.remote);\n return { kind: 'watch', ...served(() => scoped, REMOTE_READS) };\n }) as never);\n host.serve(AgentPagesService, ((_input: unknown, principal: unknown, self: Self) => {\n if (seatOf(principal) !== 'owner') return { kind: 'none' };\n const held = self.resources({\n mine: resource({\n rev: 1,\n open: () => ownedPages(serving.pages),\n close: (mine) => mine.release(),\n }),\n });\n return { kind: 'pages', ...served(() => held.mine.value, PAGE_METHODS) };\n }) as never);\n host.serve(\n AgentGuestService,\n openToGuests((_input: unknown, principal: unknown, self: Self) => {\n const guest = guestOf(principal as never);\n if (!guest) return { kind: 'none' };\n const opening = serving.guest?.(guest);\n if (!opening) throw forbidden(CLOSED_TO_GUESTS);\n const held = self.resources({\n seat: resource({ rev: 1, open: () => opening, close: (made) => made.dispose() }),\n });\n const later = (name: 'transcript' | 'seat' | 'proposals') =>\n lazily(() => held.seat.value.value[name] as ReplicatedState<unknown>);\n return {\n kind: 'guest',\n transcript: later('transcript'),\n seat: later('seat'),\n proposals: later('proposals'),\n ...served(() => held.seat.value.value, GUEST_METHODS),\n };\n }) as never\n );\n host.serve(AgentSudoService, ((_input: unknown, principal: unknown, self: Self) => {\n const sudo = serving.sudo;\n if (seatOf(principal) !== 'owner' || !sudo) return { kind: 'none' };\n const held = self.resources({\n mine: resource({ rev: 1, open: () => ownedSudo(sudo), close: (mine) => mine.release() }),\n });\n return {\n kind: 'sudo',\n approvals: readable(sudo.approvals),\n ...served(() => held.mine.value, SUDO_METHODS),\n };\n }) as never);\n return host;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeIdentity,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n SESSION_HEADER,\n VERSION_HEADER,\n withAdobeIdentity,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n APPROVAL_MS,\n type Approval,\n type ApprovalAnswer,\n type ApprovalDecided,\n type ApprovalDraft,\n type ApprovalJudge,\n type ApprovalKind,\n type ApprovalRequester,\n type ApprovalState,\n type Approvals,\n ApprovalsDoc,\n type ApprovalTier,\n type ApprovalVerdict,\n approvalJudge,\n attachApprovals,\n DEFAULT_POLICY,\n type DecidedBy,\n JUDGE_ALLOW,\n JUDGE_DENY,\n JUDGE_KIND,\n JUDGE_MODEL,\n JUDGE_QUESTIONS,\n type Judgement,\n judgeModelOf,\n judgeSpender,\n judgeState,\n type OwnerIntent,\n ownerIntent,\n POLICY_FILE,\n REASONS,\n seedPolicy,\n VERDICT_REASONS,\n verdictOf,\n verdictRecorder,\n} from './approvals/index.ts';\nexport {\n type ApprovalPolicy,\n type ApprovalPolicyChange,\n type ApprovalPolicySet,\n DEFAULT_APPROVAL_POLICY,\n type SudoPolicy,\n} from './approvals/policy.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nexport type { GateKind, GuestPolicy } from './guests/policy.ts';\nexport type { GuestDraft, GuestGate, GuestGates, GuestSeat } from './guests/seats.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AgentControl,\n AgentPagesService,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n PREFERRED_MODELS,\n preferredModel,\n resolveDefaultModel,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { type PortEndpoint, PortLink } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAwC,YAAY,iBAAiB;AACrE;AAAA,EACE;AAAA,EAUA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
4
|
+
"sourcesContent": ["export {\n ADOBE,\n ADOBE_PROXY,\n type AdobeConfig,\n type AdobeModelInfo,\n adobeClassifiers,\n adobeConfig,\n adobeIdentity,\n adobeModel,\n adobeProvider,\n adobeUsage,\n type Budget,\n SESSION_HEADER,\n VERSION_HEADER,\n withAdobeIdentity,\n} from './adobe.ts';\nexport { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';\nexport {\n APPROVAL_MS,\n type Approval,\n type ApprovalAnswer,\n type ApprovalDecided,\n type ApprovalDraft,\n type ApprovalJudge,\n type ApprovalKind,\n type ApprovalRequester,\n type ApprovalState,\n type Approvals,\n ApprovalsDoc,\n type ApprovalTier,\n type ApprovalVerdict,\n approvalJudge,\n attachApprovals,\n DEFAULT_POLICY,\n type DecidedBy,\n type Decider,\n JUDGE_ALLOW,\n JUDGE_DENY,\n JUDGE_KIND,\n JUDGE_MODEL,\n JUDGE_QUESTIONS,\n type Judgement,\n judgeModelOf,\n judgeSpender,\n judgeState,\n type OwnerIntent,\n ownerIntent,\n POLICY_FILE,\n REASONS,\n seedPolicy,\n VERDICT_REASONS,\n verdictOf,\n verdictRecorder,\n} from './approvals/index.ts';\nexport {\n type ApprovalPolicy,\n type ApprovalPolicyChange,\n type ApprovalPolicySet,\n DEFAULT_APPROVAL_POLICY,\n type SudoPolicy,\n} from './approvals/policy.ts';\nexport type { AgentSudo, SudoAnswer, SudoRequest } from './approvals/sudo.ts';\nexport {\n FILE_LIMIT,\n IMAGE_LIMIT,\n type SendAttachment,\n type ShownAttachment,\n splitUser,\n TOTAL_LIMIT,\n userParts,\n} from './attachments.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport { createAgentControl } from './control.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';\nexport type { GateKind, GuestPolicy } from './guests/policy.ts';\nexport type { GuestDraft, GuestGate, GuestGates, GuestSeat } from './guests/seats.ts';\nexport { type AgentHost, type ConnectOptions, hostAgent } from './host.ts';\nexport type {\n KernelClient,\n KernelFs,\n KernelProcess,\n KernelStat,\n SpawnOptions,\n} from './kernel/client.ts';\nexport { HOME, type KernelEnvOptions, kernelEnvironment, SliccKernelEnv } from './kernel/env.ts';\nexport {\n adminOver,\n type KernelAdmin,\n type KernelGroup,\n type KernelGroups,\n type KernelUser,\n type KernelUsers,\n serveAdmin,\n type UserClient,\n type UserClients,\n type UserConnect,\n type UserSpec,\n userClients,\n} from './kernel/users.ts';\nexport {\n type AgentWorkerOptions,\n type AgentWorkerScope,\n type KernelAttach,\n runAgentWorker,\n} from './main.ts';\nexport {\n type Loopback,\n type Transport,\n type TransportResponse,\n transportFetch,\n} from './net.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n startAgent,\n} from './owner.ts';\nexport { SliccPrompt, sliccPrompt } from './prompt.ts';\nexport {\n type AgentPages,\n createPages,\n type PageBatch,\n type PageCaller,\n type PageRequest,\n type PageResult,\n type Pages,\n type PagesOpened,\n type PageTab,\n} from './remote/pages.ts';\nexport {\n type AccountState,\n AgentControl,\n AgentPagesService,\n AgentSettings,\n type AgentSettingsChange,\n AgentTranscript,\n type BudgetState,\n type ModelChoice,\n type OperationError,\n type PromptResult,\n type SendMode,\n type SendRequest,\n type SendResponse,\n type SettingsState,\n type SignIn,\n} from './services.ts';\nexport {\n BEDROCK,\n createAgentSettings,\n createSliccModels,\n DEFAULT_MODEL,\n DEFAULT_REGIONS,\n PREFERRED_MODELS,\n preferredModel,\n resolveDefaultModel,\n sliccProviders,\n withDefaultRegions,\n} from './settings.ts';\nexport {\n AGENT_DIRECTORY,\n type OpfsSqliteOptions,\n openMemorySqliteStorage,\n openOpfsSqliteStorage,\n WasmSqliteDatabase,\n} from './sqlite.ts';\nexport { type SystemFacts, systemSection } from './system.ts';\nexport { UPLOADS, type Uploads, upload } from './uploads.ts';\nexport { type PortEndpoint, PortLink } from './wire.ts';\nexport {\n type KernelPorts,\n kernelPort,\n kernelPorts,\n serveConnections,\n type WorkerScope,\n} from './worker.ts';\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAwC,YAAY,iBAAiB;AACrE;AAAA,EACE;AAAA,EAUA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA+B,oBAAoB;AACnD,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAIP,SAA8C,iBAAiB;AAQ/D,SAAS,MAA6B,mBAAmB,sBAAsB;AAC/E;AAAA,EACE;AAAA,EAMA;AAAA,EAKA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAKA;AAAA,OACK;AACP,SAAS,aAAa,mBAAmB;AACzC;AAAA,EAEE;AAAA,OAQK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OAUK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAA2B,qBAAqB;AAChD,SAAS,SAAuB,cAAc;AAC9C,SAA4B,gBAAgB;AAC5C;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/owner.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { askSudo, unavailable } from "./approvals/sudo-client.js";
|
|
1
2
|
import { connectAgent } from "./client.js";
|
|
2
3
|
import { serveAdmin } from "./kernel/users.js";
|
|
3
4
|
import { holdLock } from "./opfs-pool.js";
|
|
@@ -35,6 +36,11 @@ async function startAgent(options) {
|
|
|
35
36
|
};
|
|
36
37
|
};
|
|
37
38
|
let worker = Promise.resolve().then(spawn);
|
|
39
|
+
const asking = /* @__PURE__ */ new Set();
|
|
40
|
+
const stopAsking = () => {
|
|
41
|
+
for (const stop of asking) stop.abort();
|
|
42
|
+
asking.clear();
|
|
43
|
+
};
|
|
38
44
|
try {
|
|
39
45
|
await worker;
|
|
40
46
|
} catch (error) {
|
|
@@ -48,7 +54,8 @@ async function startAgent(options) {
|
|
|
48
54
|
const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};
|
|
49
55
|
const pages = portOptions.pages === false ? { pages: false } : {};
|
|
50
56
|
const guest = portOptions.guest ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } } : {};
|
|
51
|
-
|
|
57
|
+
const device = portOptions.device ? { device: portOptions.device } : {};
|
|
58
|
+
ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest, ...device }, [port2]);
|
|
52
59
|
return port1;
|
|
53
60
|
};
|
|
54
61
|
return {
|
|
@@ -56,7 +63,20 @@ async function startAgent(options) {
|
|
|
56
63
|
return connectAgent(await open(portOptions));
|
|
57
64
|
},
|
|
58
65
|
port: open,
|
|
66
|
+
async approve(request, approveOptions) {
|
|
67
|
+
const stop = new AbortController();
|
|
68
|
+
asking.add(stop);
|
|
69
|
+
try {
|
|
70
|
+
const port = await open().catch((error) => {
|
|
71
|
+
throw unavailable(error);
|
|
72
|
+
});
|
|
73
|
+
return await askSudo(port, request, approveOptions, stop.signal);
|
|
74
|
+
} finally {
|
|
75
|
+
asking.delete(stop);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
59
78
|
restart() {
|
|
79
|
+
stopAsking();
|
|
60
80
|
worker = worker.catch(() => void 0).then((old) => {
|
|
61
81
|
old?.terminate();
|
|
62
82
|
return spawn();
|
|
@@ -64,6 +84,7 @@ async function startAgent(options) {
|
|
|
64
84
|
return worker.then(() => void 0);
|
|
65
85
|
},
|
|
66
86
|
async release() {
|
|
87
|
+
stopAsking();
|
|
67
88
|
const previous = worker;
|
|
68
89
|
worker = Promise.resolve(void 0);
|
|
69
90
|
try {
|
package/dist/owner.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/owner.ts"],
|
|
4
|
-
"sourcesContent": ["import { type AgentConnection, connectAgent } from './client.ts';\nimport { type KernelSource, serveAdmin } from './kernel/users.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface PortOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n}\n\nexport interface AgentOwner {\n connect(options?: PortOptions): Promise<AgentConnection>;\n port(options?: PortOptions): Promise<PortEndpoint & Transferable>;\n restart(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport type { KernelSource } from './kernel/users.ts';\n\nexport interface OwnerOptions {\n worker: () => AgentWorker;\n kernel?: KernelSource;\n locks?: LockManager;\n held?: boolean;\n channel?: () => { port1: PortEndpoint & Transferable; port2: Transferable };\n}\n\nexport async function startAgent(options: OwnerOptions): Promise<AgentOwner> {\n const release = options.held\n ? () => undefined\n : await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);\n const channel = options.channel ?? (() => new MessageChannel());\n const spawn = async (): Promise<AgentWorker> => {\n const created = options.worker();\n let admin: (PortEndpoint & Transferable) | undefined;\n try {\n if (options.kernel) {\n const port = await options.kernel.connect();\n if (!options.kernel.users) created.postMessage({ kernel: port }, [port]);\n else {\n const { port1, port2 } = channel();\n admin = port1;\n serveAdmin(port1, options.kernel);\n created.postMessage({ kernel: port, admin: port2 }, [port, port2]);\n }\n }\n } catch (error) {\n admin?.close?.();\n created.terminate();\n throw error;\n }\n if (!admin) return created;\n const served = admin;\n return {\n postMessage: (message, transfer) => created.postMessage(message, transfer),\n terminate() {\n served.close?.();\n created.terminate();\n },\n };\n };\n let worker: Promise<AgentWorker | undefined> = Promise.resolve().then(spawn);\n try {\n await worker;\n } catch (error) {\n release();\n throw error;\n }\n const open = async (portOptions: PortOptions = {}): Promise<PortEndpoint & Transferable> => {\n const ready = await worker;\n if (!ready) throw new Error('the agent was released');\n const { port1, port2 } = channel();\n const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};\n const pages = portOptions.pages === false ? { pages: false } : {};\n const guest = portOptions.guest\n ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } }\n : {};\n ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest }, [port2]);\n return port1;\n };\n return {\n async connect(portOptions) {\n return connectAgent(await open(portOptions));\n },\n port: open,\n restart() {\n worker = worker\n .catch(() => undefined)\n .then((old) => {\n old?.terminate();\n return spawn();\n });\n return worker.then(() => undefined);\n },\n async release() {\n const previous = worker;\n worker = Promise.resolve(undefined);\n try {\n (await previous.catch(() => undefined))?.terminate();\n } finally {\n release();\n }\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';\nimport { type ApproveOptions, askSudo, unavailable } from './approvals/sudo-client.ts';\nimport { type AgentConnection, connectAgent } from './client.ts';\nimport { type KernelSource, serveAdmin } from './kernel/users.ts';\nimport { holdLock } from './opfs-pool.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport const AGENT_LOCK = 'slicc-agent';\n\nexport interface AgentWorker {\n postMessage(message: unknown, transfer: Transferable[]): void;\n terminate(): void;\n}\n\nexport interface PortOptions {\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n device?: string;\n}\n\nexport interface AgentOwner {\n connect(options?: PortOptions): Promise<AgentConnection>;\n port(options?: PortOptions): Promise<PortEndpoint & Transferable>;\n approve(request: SudoRequest, options?: ApproveOptions): Promise<SudoAnswer>;\n restart(): Promise<void>;\n release(): Promise<void>;\n}\n\nexport type { KernelSource } from './kernel/users.ts';\n\nexport interface OwnerOptions {\n worker: () => AgentWorker;\n kernel?: KernelSource;\n locks?: LockManager;\n held?: boolean;\n channel?: () => { port1: PortEndpoint & Transferable; port2: Transferable };\n}\n\nexport async function startAgent(options: OwnerOptions): Promise<AgentOwner> {\n const release = options.held\n ? () => undefined\n : await holdLock(options.locks ?? navigator.locks, AGENT_LOCK);\n const channel = options.channel ?? (() => new MessageChannel());\n const spawn = async (): Promise<AgentWorker> => {\n const created = options.worker();\n let admin: (PortEndpoint & Transferable) | undefined;\n try {\n if (options.kernel) {\n const port = await options.kernel.connect();\n if (!options.kernel.users) created.postMessage({ kernel: port }, [port]);\n else {\n const { port1, port2 } = channel();\n admin = port1;\n serveAdmin(port1, options.kernel);\n created.postMessage({ kernel: port, admin: port2 }, [port, port2]);\n }\n }\n } catch (error) {\n admin?.close?.();\n created.terminate();\n throw error;\n }\n if (!admin) return created;\n const served = admin;\n return {\n postMessage: (message, transfer) => created.postMessage(message, transfer),\n terminate() {\n served.close?.();\n created.terminate();\n },\n };\n };\n let worker: Promise<AgentWorker | undefined> = Promise.resolve().then(spawn);\n const asking = new Set<AbortController>();\n const stopAsking = () => {\n for (const stop of asking) stop.abort();\n asking.clear();\n };\n try {\n await worker;\n } catch (error) {\n release();\n throw error;\n }\n const open = async (portOptions: PortOptions = {}): Promise<PortEndpoint & Transferable> => {\n const ready = await worker;\n if (!ready) throw new Error('the agent was released');\n const { port1, port2 } = channel();\n const readOnly = portOptions.readOnly === true ? { readOnly: true } : {};\n const pages = portOptions.pages === false ? { pages: false } : {};\n const guest = portOptions.guest\n ? { guest: { id: String(portOptions.guest.id), label: String(portOptions.guest.label) } }\n : {};\n const device = portOptions.device ? { device: portOptions.device } : {};\n ready.postMessage({ connect: port2, ...readOnly, ...pages, ...guest, ...device }, [port2]);\n return port1;\n };\n return {\n async connect(portOptions) {\n return connectAgent(await open(portOptions));\n },\n port: open,\n async approve(request, approveOptions) {\n const stop = new AbortController();\n asking.add(stop);\n try {\n const port = await open().catch((error: unknown) => {\n throw unavailable(error);\n });\n return await askSudo(port, request, approveOptions, stop.signal);\n } finally {\n asking.delete(stop);\n }\n },\n restart() {\n stopAsking();\n worker = worker\n .catch(() => undefined)\n .then((old) => {\n old?.terminate();\n return spawn();\n });\n return worker.then(() => undefined);\n },\n async release() {\n stopAsking();\n const previous = worker;\n worker = Promise.resolve(undefined);\n try {\n (await previous.catch(() => undefined))?.terminate();\n } finally {\n release();\n }\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/page.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { UNAVAILABLE } from "./approvals/sudo-client.js";
|
|
1
2
|
import { connectAgent } from "./client.js";
|
|
2
3
|
import {
|
|
3
4
|
connectGuest,
|
|
@@ -25,6 +26,7 @@ export {
|
|
|
25
26
|
GUEST_ONLY,
|
|
26
27
|
MAX_FRAME,
|
|
27
28
|
SEAT_REFUSED,
|
|
29
|
+
UNAVAILABLE,
|
|
28
30
|
VIEW_ONLY,
|
|
29
31
|
bridgePort,
|
|
30
32
|
connectAgent,
|
package/dist/page.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/page.ts"],
|
|
4
|
-
"sourcesContent": ["export { type AgentConnection, connectAgent } from './client.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport {\n type ByteSink,\n bridgePort,\n encodeFrame,\n FrameReader,\n type LinkEnd,\n linkEndpoint,\n MAX_FRAME,\n} from './link.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n type PortOptions,\n startAgent,\n} from './owner.ts';\nexport {\n type RemoteControl,\n type RemoteEvent,\n type RemoteOptions,\n remoteControl,\n} from './remote/client.ts';\nexport { VIEW_ONLY } from './view-only.ts';\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';\nexport { type ApproveOptions, UNAVAILABLE } from './approvals/sudo-client.ts';\nexport { type AgentConnection, connectAgent } from './client.ts';\nexport {\n connectGuest,\n GUEST_ONLY,\n type GuestConnection,\n SEAT_REFUSED,\n} from './guests/client.ts';\nexport {\n type ByteSink,\n bridgePort,\n encodeFrame,\n FrameReader,\n type LinkEnd,\n linkEndpoint,\n MAX_FRAME,\n} from './link.ts';\nexport {\n AGENT_LOCK,\n type AgentOwner,\n type AgentWorker,\n type KernelSource,\n type OwnerOptions,\n type PortOptions,\n startAgent,\n} from './owner.ts';\nexport {\n type RemoteControl,\n type RemoteEvent,\n type RemoteOptions,\n remoteControl,\n} from './remote/client.ts';\nexport { VIEW_ONLY } from './view-only.ts';\n"],
|
|
5
|
+
"mappings": "AACA,SAA8B,mBAAmB;AACjD,SAA+B,oBAAoB;AACnD;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAMA;AAAA,OACK;AACP;AAAA,EAIE;AAAA,OACK;AACP,SAAS,iBAAiB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|