@ai-ecoverse/slicc-agent 5.1.0 → 5.3.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 +30 -3
- package/dist/agent.js +6 -1
- package/dist/agent.js.map +2 -2
- package/dist/approvals/index.js +63 -13
- package/dist/approvals/index.js.map +2 -2
- package/dist/approvals/intent.js +85 -0
- package/dist/approvals/intent.js.map +7 -0
- package/dist/approvals/judge.js +207 -0
- package/dist/approvals/judge.js.map +7 -0
- package/dist/approvals/record.js +2 -1
- package/dist/approvals/record.js.map +2 -2
- package/dist/client.js +3 -0
- package/dist/client.js.map +2 -2
- package/dist/control.js +10 -4
- package/dist/control.js.map +2 -2
- package/dist/guests/attribution.js +22 -0
- package/dist/guests/attribution.js.map +7 -0
- package/dist/guests/client.js +150 -0
- package/dist/guests/client.js.map +7 -0
- package/dist/guests/guard.js +38 -0
- package/dist/guests/guard.js.map +7 -0
- package/dist/guests/index.js +282 -0
- package/dist/guests/index.js.map +7 -0
- package/dist/guests/seats.js +49 -0
- package/dist/guests/seats.js.map +7 -0
- package/dist/guests/serve.js +72 -0
- package/dist/guests/serve.js.map +7 -0
- package/dist/guests/view.js +40 -0
- package/dist/guests/view.js.map +7 -0
- package/dist/host.js +98 -5
- package/dist/host.js.map +2 -2
- package/dist/index.js +41 -1
- package/dist/index.js.map +2 -2
- package/dist/main.js +23 -2
- package/dist/main.js.map +2 -2
- package/dist/owner.js +2 -1
- package/dist/owner.js.map +2 -2
- package/dist/page.js +8 -0
- package/dist/page.js.map +2 -2
- package/dist/secrets/extension.js +4 -1
- package/dist/secrets/extension.js.map +2 -2
- package/dist/services.js +12 -0
- package/dist/services.js.map +2 -2
- package/dist/serving.js +7 -0
- package/dist/serving.js.map +2 -2
- package/dist/spectrum/agent-port.js +14 -1
- package/dist/spectrum/agent-port.js.map +2 -2
- package/dist/spectrum/approvals-port.js +1 -1
- package/dist/spectrum/approvals-port.js.map +2 -2
- package/dist/spectrum/guest-port.js +57 -0
- package/dist/spectrum/guest-port.js.map +7 -0
- package/dist/spectrum/index.js +19 -0
- package/dist/spectrum/index.js.map +3 -3
- package/dist/spectrum/messages.js +30 -8
- package/dist/spectrum/messages.js.map +2 -2
- package/dist/spectrum/proposals.js +56 -0
- package/dist/spectrum/proposals.js.map +7 -0
- package/dist/titles/labels.js +1 -0
- package/dist/titles/labels.js.map +2 -2
- package/dist/types/approvals/index.d.ts +4 -0
- package/dist/types/approvals/intent.d.ts +32 -0
- package/dist/types/approvals/judge.d.ts +86 -0
- package/dist/types/approvals/record.d.ts +5 -1
- package/dist/types/client.d.ts +7 -1
- package/dist/types/control.d.ts +2 -1
- package/dist/types/guests/attribution.d.ts +9 -0
- package/dist/types/guests/client.d.ts +12 -0
- package/dist/types/guests/guard.d.ts +5 -0
- package/dist/types/guests/index.d.ts +54 -0
- package/dist/types/guests/seats.d.ts +39 -0
- package/dist/types/guests/serve.d.ts +17 -0
- package/dist/types/guests/view.d.ts +3 -0
- package/dist/types/host.d.ts +21 -3
- package/dist/types/index.d.ts +4 -1
- package/dist/types/owner.d.ts +4 -0
- package/dist/types/page.d.ts +1 -0
- package/dist/types/services.d.ts +34 -2
- package/dist/types/serving.d.ts +8 -1
- package/dist/types/spectrum/guest-port.d.ts +26 -0
- package/dist/types/spectrum/index.d.ts +13 -0
- package/dist/types/spectrum/proposals.d.ts +8 -0
- package/dist/types/titles/labels.d.ts +3 -1
- package/dist/worker.js +2 -1
- package/dist/worker.js.map +2 -2
- package/package.json +7 -6
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { replicatedState } from "@earendil-works/chord";
|
|
2
|
+
import { PortLink } from "../wire.js";
|
|
3
|
+
import { guestView } from "./view.js";
|
|
4
|
+
function proposalsOf(items, seat) {
|
|
5
|
+
return (items ?? []).filter((item) => item.kind === "guest-message" && item.seat === seat).map((item) => ({
|
|
6
|
+
id: item.id,
|
|
7
|
+
text: item.detail.text ?? "",
|
|
8
|
+
state: item.state,
|
|
9
|
+
reason: item.reason ?? null,
|
|
10
|
+
createdAt: item.createdAt,
|
|
11
|
+
decidedAt: item.decidedAt ?? null
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
function guestOpener(guests, agents, views, context, approvals) {
|
|
15
|
+
return (principal) => {
|
|
16
|
+
const record = guests.current(principal);
|
|
17
|
+
if (!record) return void 0;
|
|
18
|
+
const pick = (all) => all?.[record.agentId];
|
|
19
|
+
let shown = pick(views.value);
|
|
20
|
+
const transcript = replicatedState(guestView(shown, record.id));
|
|
21
|
+
const off = views.subscribe((all) => {
|
|
22
|
+
if (pick(all) === shown) return;
|
|
23
|
+
shown = pick(all);
|
|
24
|
+
transcript.replace(context, guestView(shown, record.id));
|
|
25
|
+
});
|
|
26
|
+
const seat = replicatedState({
|
|
27
|
+
id: record.id,
|
|
28
|
+
label: record.label,
|
|
29
|
+
agentId: record.agentId,
|
|
30
|
+
name: agents.state().cones[record.agentId]?.name ?? record.agentId,
|
|
31
|
+
expiresAt: record.expiresAt,
|
|
32
|
+
gates: { ...record.gates }
|
|
33
|
+
});
|
|
34
|
+
let listed = JSON.stringify(proposalsOf(approvals?.value, record.id));
|
|
35
|
+
const proposals = replicatedState(JSON.parse(listed));
|
|
36
|
+
const offProposals = approvals?.subscribe((items) => {
|
|
37
|
+
const next = JSON.stringify(proposalsOf(items, record.id));
|
|
38
|
+
if (next === listed) return;
|
|
39
|
+
listed = next;
|
|
40
|
+
proposals.replace(context, JSON.parse(next));
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
value: {
|
|
44
|
+
transcript,
|
|
45
|
+
seat,
|
|
46
|
+
proposals,
|
|
47
|
+
propose: (request, using) => guests.propose(principal, request, using)
|
|
48
|
+
},
|
|
49
|
+
dispose() {
|
|
50
|
+
off();
|
|
51
|
+
offProposals?.();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function admitGuest(guests, endpoint, asked, serverId, link, host) {
|
|
57
|
+
const port = new PortLink(endpoint);
|
|
58
|
+
const guest = guests.admit(String(asked.id), String(asked.label));
|
|
59
|
+
if (!guest) {
|
|
60
|
+
port.close("this guest seat is not valid");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
void port.ended.then(guests.joined(guest.id));
|
|
64
|
+
port.greet(serverId);
|
|
65
|
+
host.accept(port, { principal: { seat: "guest", link, guest } });
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
admitGuest,
|
|
69
|
+
guestOpener,
|
|
70
|
+
proposalsOf
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/guests/serve.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Context, Host, ReplicatedState } from '@earendil-works/chord';\nimport { replicatedState } from '@earendil-works/chord';\nimport type { ConversationView } from '@earendil-works/pi-durable';\nimport type { Agents } from '../agents.ts';\nimport type { Approval } from '../approvals/index.ts';\nimport type { AgentGuest, GuestProposal, GuestShown } from '../services.ts';\nimport type { AgentPrincipal, GuestPrincipal } from '../serving.ts';\nimport { type PortEndpoint, PortLink } from '../wire.ts';\nimport type { Guests } from './index.ts';\nimport { guestView } from './view.ts';\n\nexport function proposalsOf(items: readonly Approval[] | undefined, seat: string): GuestProposal[] {\n return (items ?? [])\n .filter((item) => item.kind === 'guest-message' && item.seat === seat)\n .map((item) => ({\n id: item.id,\n text: (item.detail as { text?: string }).text ?? '',\n state: item.state,\n reason: item.reason ?? null,\n createdAt: item.createdAt,\n decidedAt: item.decidedAt ?? null,\n }));\n}\n\nexport function guestOpener(\n guests: Guests,\n agents: Pick<Agents, 'state'>,\n views: ReplicatedState<Record<string, ConversationView>>,\n context: Context,\n approvals?: ReplicatedState<Approval[]>\n) {\n return (principal: GuestPrincipal): { value: AgentGuest; dispose(): void } | undefined => {\n const record = guests.current(principal);\n if (!record) return undefined;\n const pick = (all: Record<string, ConversationView> | undefined) => all?.[record.agentId];\n let shown = pick(views.value);\n const transcript = replicatedState<ConversationView>(guestView(shown, record.id));\n const off = views.subscribe((all) => {\n if (pick(all) === shown) return;\n shown = pick(all);\n transcript.replace(context, guestView(shown, record.id));\n });\n const seat = replicatedState<GuestShown>({\n id: record.id,\n label: record.label,\n agentId: record.agentId,\n name: agents.state().cones[record.agentId]?.name ?? record.agentId,\n expiresAt: record.expiresAt,\n gates: { ...record.gates },\n });\n let listed = JSON.stringify(proposalsOf(approvals?.value, record.id));\n const proposals = replicatedState<GuestProposal[]>(JSON.parse(listed) as GuestProposal[]);\n const offProposals = approvals?.subscribe((items) => {\n const next = JSON.stringify(proposalsOf(items, record.id));\n if (next === listed) return;\n listed = next;\n proposals.replace(context, JSON.parse(next) as GuestProposal[]);\n });\n return {\n value: {\n transcript,\n seat,\n proposals,\n propose: (request, using) => guests.propose(principal, request, using),\n },\n dispose() {\n off();\n offProposals?.();\n },\n };\n };\n}\n\nexport function admitGuest(\n guests: Guests,\n endpoint: PortEndpoint,\n asked: { id: string; label: string },\n serverId: string,\n link: number,\n host: Pick<Host, 'accept'>\n): void {\n const port = new PortLink(endpoint);\n const guest = guests.admit(String(asked.id), String(asked.label));\n if (!guest) {\n port.close('this guest seat is not valid');\n return;\n }\n void port.ended.then(guests.joined(guest.id));\n port.greet(serverId);\n host.accept(port, { principal: { seat: 'guest', link, guest } satisfies AgentPrincipal });\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,uBAAuB;AAMhC,SAA4B,gBAAgB;AAE5C,SAAS,iBAAiB;AAEnB,SAAS,YAAY,OAAwC,MAA+B;AACjG,UAAQ,SAAS,CAAC,GACf,OAAO,CAAC,SAAS,KAAK,SAAS,mBAAmB,KAAK,SAAS,IAAI,EACpE,IAAI,CAAC,UAAU;AAAA,IACd,IAAI,KAAK;AAAA,IACT,MAAO,KAAK,OAA6B,QAAQ;AAAA,IACjD,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK,UAAU;AAAA,IACvB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK,aAAa;AAAA,EAC/B,EAAE;AACN;AAEO,SAAS,YACd,QACA,QACA,OACA,SACA,WACA;AACA,SAAO,CAAC,cAAkF;AACxF,UAAM,SAAS,OAAO,QAAQ,SAAS;AACvC,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,OAAO,CAAC,QAAsD,MAAM,OAAO,OAAO;AACxF,QAAI,QAAQ,KAAK,MAAM,KAAK;AAC5B,UAAM,aAAa,gBAAkC,UAAU,OAAO,OAAO,EAAE,CAAC;AAChF,UAAM,MAAM,MAAM,UAAU,CAAC,QAAQ;AACnC,UAAI,KAAK,GAAG,MAAM,MAAO;AACzB,cAAQ,KAAK,GAAG;AAChB,iBAAW,QAAQ,SAAS,UAAU,OAAO,OAAO,EAAE,CAAC;AAAA,IACzD,CAAC;AACD,UAAM,OAAO,gBAA4B;AAAA,MACvC,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO,MAAM,EAAE,MAAM,OAAO,OAAO,GAAG,QAAQ,OAAO;AAAA,MAC3D,WAAW,OAAO;AAAA,MAClB,OAAO,EAAE,GAAG,OAAO,MAAM;AAAA,IAC3B,CAAC;AACD,QAAI,SAAS,KAAK,UAAU,YAAY,WAAW,OAAO,OAAO,EAAE,CAAC;AACpE,UAAM,YAAY,gBAAiC,KAAK,MAAM,MAAM,CAAoB;AACxF,UAAM,eAAe,WAAW,UAAU,CAAC,UAAU;AACnD,YAAM,OAAO,KAAK,UAAU,YAAY,OAAO,OAAO,EAAE,CAAC;AACzD,UAAI,SAAS,OAAQ;AACrB,eAAS;AACT,gBAAU,QAAQ,SAAS,KAAK,MAAM,IAAI,CAAoB;AAAA,IAChE,CAAC;AACD,WAAO;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,CAAC,SAAS,UAAU,OAAO,QAAQ,WAAW,SAAS,KAAK;AAAA,MACvE;AAAA,MACA,UAAU;AACR,YAAI;AACJ,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WACd,QACA,UACA,OACA,UACA,MACA,MACM;AACN,QAAM,OAAO,IAAI,SAAS,QAAQ;AAClC,QAAM,QAAQ,OAAO,MAAM,OAAO,MAAM,EAAE,GAAG,OAAO,MAAM,KAAK,CAAC;AAChE,MAAI,CAAC,OAAO;AACV,SAAK,MAAM,8BAA8B;AACzC;AAAA,EACF;AACA,OAAK,KAAK,MAAM,KAAK,OAAO,OAAO,MAAM,EAAE,CAAC;AAC5C,OAAK,MAAM,QAAQ;AACnB,OAAK,OAAO,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,MAAM,MAAM,EAA2B,CAAC;AAC1F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { GUEST_INPUT_KIND } from "./attribution.js";
|
|
2
|
+
const SHOWN = /* @__PURE__ */ new Set([
|
|
3
|
+
"pi.user",
|
|
4
|
+
"pi.assistant",
|
|
5
|
+
"pi.tool-result",
|
|
6
|
+
"pi.compaction",
|
|
7
|
+
"slicc.rewound",
|
|
8
|
+
"slicc.from",
|
|
9
|
+
GUEST_INPUT_KIND
|
|
10
|
+
]);
|
|
11
|
+
const EMPTY_VIEW = {
|
|
12
|
+
conversation: {},
|
|
13
|
+
entries: [],
|
|
14
|
+
docs: {}
|
|
15
|
+
};
|
|
16
|
+
const own = (seat) => (item) => item.entry?.kind === GUEST_INPUT_KIND && item.entry.data?.seat === seat;
|
|
17
|
+
function guestView(view, seat) {
|
|
18
|
+
if (!view) return EMPTY_VIEW;
|
|
19
|
+
const docs = {};
|
|
20
|
+
const live = view.docs["pi.live"];
|
|
21
|
+
if (live) docs["pi.live"] = live;
|
|
22
|
+
const agent = view.docs["pi.agent"];
|
|
23
|
+
if (agent)
|
|
24
|
+
docs["pi.agent"] = {
|
|
25
|
+
...agent.model ? { model: agent.model } : {},
|
|
26
|
+
...agent.thinkingLevel ? { thinkingLevel: agent.thinkingLevel } : {}
|
|
27
|
+
};
|
|
28
|
+
const inbox = view.docs["pi.inbox"];
|
|
29
|
+
if (inbox) docs["pi.inbox"] = { items: (inbox.items ?? []).filter(own(seat)) };
|
|
30
|
+
return {
|
|
31
|
+
conversation: view.conversation,
|
|
32
|
+
entries: view.entries.filter((entry) => SHOWN.has(entry.kind)),
|
|
33
|
+
docs
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
EMPTY_VIEW,
|
|
38
|
+
guestView
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/guests/view.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ConversationView, EntryRecord, JsonObject } from '@earendil-works/pi-durable';\nimport { GUEST_INPUT_KIND } from './attribution.ts';\n\nconst SHOWN = new Set([\n 'pi.user',\n 'pi.assistant',\n 'pi.tool-result',\n 'pi.compaction',\n 'slicc.rewound',\n 'slicc.from',\n GUEST_INPUT_KIND,\n]);\n\nexport const EMPTY_VIEW = {\n conversation: {},\n entries: [],\n docs: {},\n} as unknown as ConversationView;\n\ntype InboxItem = { mode?: string; entry?: { kind?: string; data?: { seat?: unknown } } };\n\nconst own = (seat: string) => (item: InboxItem) =>\n item.entry?.kind === GUEST_INPUT_KIND && item.entry.data?.seat === seat;\n\nexport function guestView(view: ConversationView | undefined, seat: string): ConversationView {\n if (!view) return EMPTY_VIEW;\n const docs: Record<string, JsonObject> = {};\n const live = view.docs['pi.live'];\n if (live) docs['pi.live'] = live;\n const agent = view.docs['pi.agent'] as { model?: JsonObject; thinkingLevel?: string } | undefined;\n if (agent)\n docs['pi.agent'] = {\n ...(agent.model ? { model: agent.model } : {}),\n ...(agent.thinkingLevel ? { thinkingLevel: agent.thinkingLevel } : {}),\n };\n const inbox = view.docs['pi.inbox'] as { items?: InboxItem[] } | undefined;\n if (inbox) docs['pi.inbox'] = { items: (inbox.items ?? []).filter(own(seat)) } as JsonObject;\n return {\n conversation: view.conversation,\n entries: view.entries.filter((entry: EntryRecord) => SHOWN.has(entry.kind)),\n docs,\n };\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,wBAAwB;AAEjC,MAAM,QAAQ,oBAAI,IAAI;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,MAAM,aAAa;AAAA,EACxB,cAAc,CAAC;AAAA,EACf,SAAS,CAAC;AAAA,EACV,MAAM,CAAC;AACT;AAIA,MAAM,MAAM,CAAC,SAAiB,CAAC,SAC7B,KAAK,OAAO,SAAS,oBAAoB,KAAK,MAAM,MAAM,SAAS;AAE9D,SAAS,UAAU,MAAoC,MAAgC;AAC5F,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAmC,CAAC;AAC1C,QAAM,OAAO,KAAK,KAAK,SAAS;AAChC,MAAI,KAAM,MAAK,SAAS,IAAI;AAC5B,QAAM,QAAQ,KAAK,KAAK,UAAU;AAClC,MAAI;AACF,SAAK,UAAU,IAAI;AAAA,MACjB,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,MAC5C,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,IACtE;AACF,QAAM,QAAQ,KAAK,KAAK,UAAU;AAClC,MAAI,MAAO,MAAK,UAAU,IAAI,EAAE,QAAQ,MAAM,SAAS,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,EAAE;AAC7E,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,IACnB,SAAS,KAAK,QAAQ,OAAO,CAAC,UAAuB,MAAM,IAAI,MAAM,IAAI,CAAC;AAAA,IAC1E;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/host.js
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createHost,
|
|
3
|
+
forbidden,
|
|
3
4
|
replicatedState,
|
|
4
5
|
resource
|
|
5
6
|
} from "@earendil-works/chord";
|
|
6
7
|
import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
|
|
7
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
attachApprovals
|
|
10
|
+
} from "./approvals/index.js";
|
|
8
11
|
import { createAgentControl } from "./control.js";
|
|
9
12
|
import { trackDeliveries } from "./deliveries.js";
|
|
13
|
+
import { createGuests } from "./guests/index.js";
|
|
14
|
+
import { admitGuest, guestOpener } from "./guests/serve.js";
|
|
10
15
|
import { createMonitor } from "./monitor/index.js";
|
|
11
16
|
import { viewRemote } from "./readonly.js";
|
|
12
17
|
import { createRemote } from "./remote/host.js";
|
|
13
18
|
import { createPages, ownedPages } from "./remote/pages.js";
|
|
14
19
|
import {
|
|
15
20
|
AgentControl,
|
|
21
|
+
AgentGuestService,
|
|
16
22
|
AgentPagesService,
|
|
17
23
|
AgentRemoteService,
|
|
18
24
|
AgentSettings,
|
|
19
25
|
AgentTranscript,
|
|
20
26
|
CONTROL_METHODS,
|
|
21
27
|
CONTROL_READS,
|
|
28
|
+
GUEST_METHODS,
|
|
22
29
|
PAGE_METHODS,
|
|
23
30
|
REMOTE_METHODS,
|
|
24
31
|
REMOTE_READS,
|
|
@@ -26,6 +33,7 @@ import {
|
|
|
26
33
|
} from "./services.js";
|
|
27
34
|
import {
|
|
28
35
|
AGENT_HOST,
|
|
36
|
+
guestOf,
|
|
29
37
|
principalKey,
|
|
30
38
|
readable,
|
|
31
39
|
readablesOf,
|
|
@@ -102,7 +110,10 @@ async function hostAgent(agent, options = {}) {
|
|
|
102
110
|
const untouch = [state.subscribe(touch), mounted.views.subscribe(touch)];
|
|
103
111
|
const pages = options.pages ?? createPages();
|
|
104
112
|
const deliveries = trackDeliveries(agent.harness, state, context);
|
|
105
|
-
const approvals = options.approvals ?? await attachApprovals(
|
|
113
|
+
const approvals = options.approvals ?? await attachApprovals(
|
|
114
|
+
{ harness: agent.harness, ...options.judge ? { judge: options.judge } : {} },
|
|
115
|
+
context
|
|
116
|
+
);
|
|
106
117
|
const monitor = createMonitor({
|
|
107
118
|
...options.monitor,
|
|
108
119
|
harness: agent.harness,
|
|
@@ -110,6 +121,12 @@ async function hostAgent(agent, options = {}) {
|
|
|
110
121
|
views: mounted.views,
|
|
111
122
|
context
|
|
112
123
|
});
|
|
124
|
+
const guests = await createGuests({
|
|
125
|
+
harness: agent.harness,
|
|
126
|
+
agents: agent.agents,
|
|
127
|
+
approvals,
|
|
128
|
+
context
|
|
129
|
+
});
|
|
113
130
|
const control = createAgentControl(
|
|
114
131
|
agent.harness,
|
|
115
132
|
agent,
|
|
@@ -124,7 +141,8 @@ async function hostAgent(agent, options = {}) {
|
|
|
124
141
|
monitor,
|
|
125
142
|
options.secrets?.list,
|
|
126
143
|
options.uploads,
|
|
127
|
-
options.labels
|
|
144
|
+
options.labels,
|
|
145
|
+
guests
|
|
128
146
|
);
|
|
129
147
|
const remote = createRemote({
|
|
130
148
|
harness: agent.harness,
|
|
@@ -155,6 +173,7 @@ async function hostAgent(agent, options = {}) {
|
|
|
155
173
|
monitor: monitor.state,
|
|
156
174
|
vault: options.secrets?.vault ?? idleVault,
|
|
157
175
|
labels: labels.state,
|
|
176
|
+
guests: guests.seats,
|
|
158
177
|
approvals: approvals.state
|
|
159
178
|
};
|
|
160
179
|
const settings = options.settings ?? noSettings;
|
|
@@ -168,16 +187,26 @@ async function hostAgent(agent, options = {}) {
|
|
|
168
187
|
settings,
|
|
169
188
|
remote,
|
|
170
189
|
pages,
|
|
190
|
+
guest: guestOpener(guests, agent.agents, mounted.views, context, approvals.state),
|
|
171
191
|
decide: (by) => (id, decision, reason, using) => approvals.decide(id, decision, reason, by, using)
|
|
172
192
|
});
|
|
193
|
+
const offGuests = guests.onEnd((id) => {
|
|
194
|
+
void host.invalidatePrincipal((principal) => guestOf(principal)?.id === id);
|
|
195
|
+
});
|
|
173
196
|
let links = 0;
|
|
174
197
|
return {
|
|
175
198
|
serverId,
|
|
176
199
|
agent,
|
|
177
200
|
pages,
|
|
201
|
+
guests,
|
|
178
202
|
approvals,
|
|
179
203
|
...options.users ? { users: options.users } : {},
|
|
180
204
|
connect(endpoint, connectOptions) {
|
|
205
|
+
if (connectOptions?.guest) {
|
|
206
|
+
links += 1;
|
|
207
|
+
admitGuest(guests, endpoint, connectOptions.guest, serverId, links, host);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
181
210
|
const seat = connectOptions?.readOnly ? "view" : connectOptions?.pages === false ? "control" : "owner";
|
|
182
211
|
links += 1;
|
|
183
212
|
const link = new PortLink(endpoint);
|
|
@@ -185,7 +214,9 @@ async function hostAgent(agent, options = {}) {
|
|
|
185
214
|
host.accept(link, { principal: { seat, link: links } });
|
|
186
215
|
},
|
|
187
216
|
async close() {
|
|
217
|
+
offGuests();
|
|
188
218
|
await host.close();
|
|
219
|
+
guests.dispose();
|
|
189
220
|
await pages.dispose();
|
|
190
221
|
await monitor.dispose();
|
|
191
222
|
await remote.dispose();
|
|
@@ -210,12 +241,48 @@ async function hostAgent(agent, options = {}) {
|
|
|
210
241
|
}
|
|
211
242
|
};
|
|
212
243
|
}
|
|
244
|
+
const CLOSED_TO_GUESTS = "a guest seat has only its transcript and propose";
|
|
245
|
+
const opened = /* @__PURE__ */ new WeakSet();
|
|
246
|
+
const openToGuests = (factory) => {
|
|
247
|
+
opened.add(factory);
|
|
248
|
+
return factory;
|
|
249
|
+
};
|
|
250
|
+
function closedToGuests(host) {
|
|
251
|
+
const serve = ((type, factory, options) => host.serve(
|
|
252
|
+
type,
|
|
253
|
+
opened.has(factory) ? factory : (input, principal, self) => {
|
|
254
|
+
if (seatOf(principal) === "guest") throw forbidden(CLOSED_TO_GUESTS);
|
|
255
|
+
return factory(input, principal, self);
|
|
256
|
+
},
|
|
257
|
+
options
|
|
258
|
+
));
|
|
259
|
+
return new Proxy(host, {
|
|
260
|
+
get(target, key) {
|
|
261
|
+
if (key === "serve") return serve;
|
|
262
|
+
const value = Reflect.get(target, key, target);
|
|
263
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
function lazily(state) {
|
|
268
|
+
return {
|
|
269
|
+
get value() {
|
|
270
|
+
return readable(state()).value;
|
|
271
|
+
},
|
|
272
|
+
subscribe: (listener) => readable(state()).subscribe(listener),
|
|
273
|
+
events: (listener) => readable(state()).events(listener)
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
const GUEST_MANAGERS = /* @__PURE__ */ new Set(["owner"]);
|
|
277
|
+
const OWNER_GUESTS = "only the owner can invite or revoke guests";
|
|
278
|
+
const notOwner = () => Promise.reject(forbidden(OWNER_GUESTS));
|
|
213
279
|
const seated = (serving, seat) => ({
|
|
214
280
|
...serving.trusted,
|
|
215
|
-
decide: serving.decide(seat === "owner" ? "owner" : "follower")
|
|
281
|
+
decide: serving.decide(seat === "owner" ? "owner" : "follower"),
|
|
282
|
+
...GUEST_MANAGERS.has(seat) ? {} : { guestOpen: notOwner, guestRevoke: notOwner }
|
|
216
283
|
});
|
|
217
284
|
function serveAgent(serving) {
|
|
218
|
-
const host = createHost({ name: AGENT_HOST, principalKey });
|
|
285
|
+
const host = closedToGuests(createHost({ name: AGENT_HOST, principalKey }));
|
|
219
286
|
const viewing = { ...serving.transcript, monitor: serving.viewMonitor };
|
|
220
287
|
host.serve(AgentControl, ((_input, principal) => {
|
|
221
288
|
const seat = seatOf(principal);
|
|
@@ -249,10 +316,36 @@ function serveAgent(serving) {
|
|
|
249
316
|
});
|
|
250
317
|
return { kind: "pages", ...served(() => held.mine.value, PAGE_METHODS) };
|
|
251
318
|
}));
|
|
319
|
+
host.serve(
|
|
320
|
+
AgentGuestService,
|
|
321
|
+
openToGuests((_input, principal, self) => {
|
|
322
|
+
const guest = guestOf(principal);
|
|
323
|
+
if (!guest) return { kind: "none" };
|
|
324
|
+
const opening = serving.guest?.(guest);
|
|
325
|
+
if (!opening) throw forbidden(CLOSED_TO_GUESTS);
|
|
326
|
+
const held = self.resources({
|
|
327
|
+
seat: resource({ rev: 1, open: () => opening, close: (made) => made.dispose() })
|
|
328
|
+
});
|
|
329
|
+
const later = (name) => lazily(() => held.seat.value.value[name]);
|
|
330
|
+
return {
|
|
331
|
+
kind: "guest",
|
|
332
|
+
transcript: later("transcript"),
|
|
333
|
+
seat: later("seat"),
|
|
334
|
+
proposals: later("proposals"),
|
|
335
|
+
...served(() => held.seat.value.value, GUEST_METHODS)
|
|
336
|
+
};
|
|
337
|
+
})
|
|
338
|
+
);
|
|
252
339
|
return host;
|
|
253
340
|
}
|
|
254
341
|
export {
|
|
342
|
+
CLOSED_TO_GUESTS,
|
|
343
|
+
GUEST_MANAGERS,
|
|
344
|
+
OWNER_GUESTS,
|
|
345
|
+
closedToGuests,
|
|
255
346
|
hostAgent,
|
|
347
|
+
lazily,
|
|
348
|
+
openToGuests,
|
|
256
349
|
serveAgent
|
|
257
350
|
};
|
|
258
351
|
//# sourceMappingURL=host.js.map
|
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 type Host,\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 { type Approvals, attachApprovals, type DecidedBy } from './approvals/index.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 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 AgentPagesService,\n AgentRemoteService,\n AgentSettings,\n AgentTranscript,\n CONTROL_METHODS,\n CONTROL_READS,\n type Command,\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 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}\n\nexport interface AgentHost {\n readonly serverId: string;\n readonly agent: Agent;\n readonly users?: UserClients;\n readonly pages: Pages;\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 } = {}\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 approvals =\n options.approvals ?? (await attachApprovals({ harness: agent.harness }, 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 control = 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 );\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 approvals: approvals.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 decide: (by) => (id, decision, reason, using) =>\n approvals.decide(id, decision, reason, by, using),\n });\n let links = 0;\n return {\n serverId,\n agent,\n pages,\n approvals,\n ...(options.users ? { users: options.users } : {}),\n connect(endpoint, connectOptions) {\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 await host.close();\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 decide: (by: DecidedBy) => AgentControl['decide'];\n}\n\nconst seated = (serving: Served, seat: Seat): AgentControl => ({\n ...serving.trusted,\n decide: serving.decide(seat === 'owner' ? 'owner' : 'follower'),\n});\n\nexport function serveAgent(serving: Served): Host {\n const host = 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 if (seat === 'view') return { kind: 'view', ...served(() => serving.viewed, CONTROL_READS) };\n const control = seated(serving, seat);\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 return host;\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA,EAEE;AAAA,
|
|
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 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 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 approvals =\n options.approvals ??\n (await attachApprovals(\n { harness: agent.harness, ...(options.judge ? { judge: options.judge } : {}) },\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 context,\n });\n const control = 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 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 };\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\nexport const GUEST_MANAGERS: ReadonlySet<Seat> = new Set<Seat>(['owner']);\n\nexport const OWNER_GUESTS = 'only the owner can invite or revoke guests';\n\nconst notOwner = () => Promise.reject(forbidden(OWNER_GUESTS));\n\nconst seated = (serving: Served, seat: Seat): AgentControl => ({\n ...serving.trusted,\n decide: serving.decide(seat === 'owner' ? 'owner' : 'follower'),\n ...(GUEST_MANAGERS.has(seat) ? {} : { guestOpen: notOwner, guestRevoke: notOwner }),\n});\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 if (seat === 'view') return { kind: 'view', ...served(() => serving.viewed, CONTROL_READS) };\n const control = seated(serving, seat);\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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -15,8 +15,24 @@ import { answerText, openAgent } from "./agent.js";
|
|
|
15
15
|
import {
|
|
16
16
|
APPROVAL_MS,
|
|
17
17
|
ApprovalsDoc,
|
|
18
|
+
approvalJudge,
|
|
18
19
|
attachApprovals,
|
|
19
|
-
|
|
20
|
+
DEFAULT_POLICY,
|
|
21
|
+
JUDGE_ALLOW,
|
|
22
|
+
JUDGE_DENY,
|
|
23
|
+
JUDGE_KIND,
|
|
24
|
+
JUDGE_MODEL,
|
|
25
|
+
JUDGE_QUESTIONS,
|
|
26
|
+
judgeModelOf,
|
|
27
|
+
judgeSpender,
|
|
28
|
+
judgeState,
|
|
29
|
+
ownerIntent,
|
|
30
|
+
POLICY_FILE,
|
|
31
|
+
REASONS,
|
|
32
|
+
seedPolicy,
|
|
33
|
+
VERDICT_REASONS,
|
|
34
|
+
verdictOf,
|
|
35
|
+
verdictRecorder
|
|
20
36
|
} from "./approvals/index.js";
|
|
21
37
|
import {
|
|
22
38
|
FILE_LIMIT,
|
|
@@ -27,6 +43,11 @@ import {
|
|
|
27
43
|
} from "./attachments.js";
|
|
28
44
|
import { connectAgent } from "./client.js";
|
|
29
45
|
import { createAgentControl } from "./control.js";
|
|
46
|
+
import {
|
|
47
|
+
connectGuest,
|
|
48
|
+
GUEST_ONLY,
|
|
49
|
+
SEAT_REFUSED
|
|
50
|
+
} from "./guests/client.js";
|
|
30
51
|
import { hostAgent } from "./host.js";
|
|
31
52
|
import { HOME, kernelEnvironment, SliccKernelEnv } from "./kernel/env.js";
|
|
32
53
|
import {
|
|
@@ -93,19 +114,29 @@ export {
|
|
|
93
114
|
ApprovalsDoc,
|
|
94
115
|
BEDROCK,
|
|
95
116
|
DEFAULT_MODEL,
|
|
117
|
+
DEFAULT_POLICY,
|
|
96
118
|
DEFAULT_REGIONS,
|
|
97
119
|
FILE_LIMIT,
|
|
120
|
+
GUEST_ONLY,
|
|
98
121
|
HOME,
|
|
99
122
|
IMAGE_LIMIT,
|
|
123
|
+
JUDGE_ALLOW,
|
|
124
|
+
JUDGE_DENY,
|
|
125
|
+
JUDGE_KIND,
|
|
126
|
+
JUDGE_MODEL,
|
|
127
|
+
JUDGE_QUESTIONS,
|
|
100
128
|
LINK_PROTOCOL,
|
|
129
|
+
POLICY_FILE,
|
|
101
130
|
PREFERRED_MODELS,
|
|
102
131
|
PortLink,
|
|
103
132
|
REASONS,
|
|
133
|
+
SEAT_REFUSED,
|
|
104
134
|
SESSION_HEADER,
|
|
105
135
|
SliccKernelEnv,
|
|
106
136
|
SliccPrompt,
|
|
107
137
|
TOTAL_LIMIT,
|
|
108
138
|
UPLOADS,
|
|
139
|
+
VERDICT_REASONS,
|
|
109
140
|
VERSION_HEADER,
|
|
110
141
|
WasmSqliteDatabase,
|
|
111
142
|
adminOver,
|
|
@@ -116,22 +147,29 @@ export {
|
|
|
116
147
|
adobeProvider,
|
|
117
148
|
adobeUsage,
|
|
118
149
|
answerText,
|
|
150
|
+
approvalJudge,
|
|
119
151
|
attachApprovals,
|
|
120
152
|
connectAgent,
|
|
153
|
+
connectGuest,
|
|
121
154
|
createAgentControl,
|
|
122
155
|
createAgentSettings,
|
|
123
156
|
createPages,
|
|
124
157
|
createSliccModels,
|
|
125
158
|
hostAgent,
|
|
159
|
+
judgeModelOf,
|
|
160
|
+
judgeSpender,
|
|
161
|
+
judgeState,
|
|
126
162
|
kernelEnvironment,
|
|
127
163
|
kernelPort,
|
|
128
164
|
kernelPorts,
|
|
129
165
|
openAgent,
|
|
130
166
|
openMemorySqliteStorage,
|
|
131
167
|
openOpfsSqliteStorage,
|
|
168
|
+
ownerIntent,
|
|
132
169
|
preferredModel,
|
|
133
170
|
resolveDefaultModel,
|
|
134
171
|
runAgentWorker,
|
|
172
|
+
seedPolicy,
|
|
135
173
|
serveAdmin,
|
|
136
174
|
serveConnections,
|
|
137
175
|
sliccPrompt,
|
|
@@ -143,6 +181,8 @@ export {
|
|
|
143
181
|
upload,
|
|
144
182
|
userClients,
|
|
145
183
|
userParts,
|
|
184
|
+
verdictOf,
|
|
185
|
+
verdictRecorder,
|
|
146
186
|
withAdobeIdentity,
|
|
147
187
|
withDefaultRegions
|
|
148
188
|
};
|
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 ApprovalKind,\n type ApprovalRequester,\n type ApprovalState,\n type Approvals,\n ApprovalsDoc,\n type ApprovalTier,\n type ApprovalVerdict,\n attachApprovals,\n type DecidedBy,\n REASONS,\n} from './approvals/index.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 { 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 { LINK_PROTOCOL, 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,
|
|
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 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 { 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 { LINK_PROTOCOL, 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,EAEA;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,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;AAGP,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,SAAS,eAAkC,gBAAgB;AAC3D;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/main.js
CHANGED
|
@@ -5,6 +5,14 @@ import {
|
|
|
5
5
|
} from "@earendil-works/pi-durable";
|
|
6
6
|
import { CodingTools } from "@earendil-works/pi-durable/tools";
|
|
7
7
|
import { openAgent } from "./agent.js";
|
|
8
|
+
import {
|
|
9
|
+
approvalJudge,
|
|
10
|
+
judgeModelOf,
|
|
11
|
+
judgeSpender,
|
|
12
|
+
ownerIntent,
|
|
13
|
+
seedPolicy,
|
|
14
|
+
verdictRecorder
|
|
15
|
+
} from "./approvals/index.js";
|
|
8
16
|
import { browserGuard } from "./browser/guard.js";
|
|
9
17
|
import { attachChanges, CHANGES_MS } from "./changes/index.js";
|
|
10
18
|
import {
|
|
@@ -241,6 +249,19 @@ async function settingsOf(made, mcp, moved) {
|
|
|
241
249
|
settings.state.subscribe(() => void endpoints.models(bases()).catch(() => void 0));
|
|
242
250
|
return settings;
|
|
243
251
|
}
|
|
252
|
+
async function setupJudge(models, home, at, agent, memories) {
|
|
253
|
+
await seedPolicy(home, BACKGROUND_CONTEXT).catch(() => false);
|
|
254
|
+
const settings = settingsText(home, HOME, at.agentDir);
|
|
255
|
+
return {
|
|
256
|
+
judge: approvalJudge({
|
|
257
|
+
models,
|
|
258
|
+
model: async (context) => judgeModelOf(await settings(context)),
|
|
259
|
+
intent: ownerIntent({ env: home, agents: agent.agents, memories }),
|
|
260
|
+
spend: judgeSpender((agentId, context) => agent.agents.conversation(agentId, context))
|
|
261
|
+
}),
|
|
262
|
+
record: verdictRecorder((agentId, context) => agent.agents.conversation(agentId, context))
|
|
263
|
+
};
|
|
264
|
+
}
|
|
244
265
|
function setupTitles(registry, models, home, at, opened) {
|
|
245
266
|
const settings = settingsText(home, HOME, at.agentDir);
|
|
246
267
|
const titleFn = titler(models, settings);
|
|
@@ -394,8 +415,8 @@ async function start(scope, ports, options, vault) {
|
|
|
394
415
|
...options.catalog ? { catalog: options.catalog } : {}
|
|
395
416
|
});
|
|
396
417
|
await memoryRuntime.reload(BACKGROUND_CONTEXT).catch(() => void 0);
|
|
397
|
-
const changes = attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS });
|
|
398
418
|
return hostAgent(agent, {
|
|
419
|
+
judge: await setupJudge(models, home, at, agent, () => memoryRuntime.memories.value),
|
|
399
420
|
settings,
|
|
400
421
|
licks: { licks: licks.licks, sources },
|
|
401
422
|
scoops: { scoops: scoops.scoops, runtime },
|
|
@@ -403,7 +424,7 @@ async function start(scope, ports, options, vault) {
|
|
|
403
424
|
sprinkles,
|
|
404
425
|
memory: memoryRuntime,
|
|
405
426
|
freezer,
|
|
406
|
-
changes,
|
|
427
|
+
changes: attachChanges({ agents: agent.agents, env: home, reloadMs: CHANGES_MS }),
|
|
407
428
|
pages,
|
|
408
429
|
labels: await attachLabels({ ...agent, label: titles.label, vault: vault.state }),
|
|
409
430
|
mcp: mcpRuntime,
|