@ai-ecoverse/slicc-agent 5.2.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.
Files changed (66) hide show
  1. package/README.md +16 -2
  2. package/dist/agent.js +6 -1
  3. package/dist/agent.js.map +2 -2
  4. package/dist/client.js +3 -0
  5. package/dist/client.js.map +2 -2
  6. package/dist/control.js +10 -4
  7. package/dist/control.js.map +2 -2
  8. package/dist/guests/attribution.js +22 -0
  9. package/dist/guests/attribution.js.map +7 -0
  10. package/dist/guests/client.js +150 -0
  11. package/dist/guests/client.js.map +7 -0
  12. package/dist/guests/guard.js +38 -0
  13. package/dist/guests/guard.js.map +7 -0
  14. package/dist/guests/index.js +282 -0
  15. package/dist/guests/index.js.map +7 -0
  16. package/dist/guests/seats.js +49 -0
  17. package/dist/guests/seats.js.map +7 -0
  18. package/dist/guests/serve.js +72 -0
  19. package/dist/guests/serve.js.map +7 -0
  20. package/dist/guests/view.js +40 -0
  21. package/dist/guests/view.js.map +7 -0
  22. package/dist/host.js +91 -3
  23. package/dist/host.js.map +2 -2
  24. package/dist/index.js +8 -0
  25. package/dist/index.js.map +2 -2
  26. package/dist/owner.js +2 -1
  27. package/dist/owner.js.map +2 -2
  28. package/dist/page.js +8 -0
  29. package/dist/page.js.map +2 -2
  30. package/dist/secrets/extension.js +4 -1
  31. package/dist/secrets/extension.js.map +2 -2
  32. package/dist/services.js +12 -0
  33. package/dist/services.js.map +2 -2
  34. package/dist/serving.js +7 -0
  35. package/dist/serving.js.map +2 -2
  36. package/dist/spectrum/agent-port.js +14 -1
  37. package/dist/spectrum/agent-port.js.map +2 -2
  38. package/dist/spectrum/guest-port.js +57 -0
  39. package/dist/spectrum/guest-port.js.map +7 -0
  40. package/dist/spectrum/index.js +19 -0
  41. package/dist/spectrum/index.js.map +3 -3
  42. package/dist/spectrum/messages.js +30 -8
  43. package/dist/spectrum/messages.js.map +2 -2
  44. package/dist/spectrum/proposals.js +56 -0
  45. package/dist/spectrum/proposals.js.map +7 -0
  46. package/dist/types/client.d.ts +7 -1
  47. package/dist/types/control.d.ts +2 -1
  48. package/dist/types/guests/attribution.d.ts +9 -0
  49. package/dist/types/guests/client.d.ts +12 -0
  50. package/dist/types/guests/guard.d.ts +5 -0
  51. package/dist/types/guests/index.d.ts +54 -0
  52. package/dist/types/guests/seats.d.ts +39 -0
  53. package/dist/types/guests/serve.d.ts +17 -0
  54. package/dist/types/guests/view.d.ts +3 -0
  55. package/dist/types/host.d.ts +19 -2
  56. package/dist/types/index.d.ts +3 -0
  57. package/dist/types/owner.d.ts +4 -0
  58. package/dist/types/page.d.ts +1 -0
  59. package/dist/types/services.d.ts +34 -2
  60. package/dist/types/serving.d.ts +8 -1
  61. package/dist/types/spectrum/guest-port.d.ts +26 -0
  62. package/dist/types/spectrum/index.d.ts +13 -0
  63. package/dist/types/spectrum/proposals.d.ts +8 -0
  64. package/dist/worker.js +2 -1
  65. package/dist/worker.js.map +2 -2
  66. package/package.json +5 -5
@@ -4,6 +4,8 @@ import type { Approval, ApprovalAnswer, ApprovalDecided } from './approvals/inde
4
4
  import type { SendAttachment, ShownAttachment } from './attachments.ts';
5
5
  import type { ChangesView } from './changes/git.ts';
6
6
  import type { FrozenCone } from './freezer/index.ts';
7
+ import type { GuestOpened, Proposed, ProposeRequest } from './guests/index.ts';
8
+ import type { GuestDraft, GuestGates, GuestSeat } from './guests/seats.ts';
7
9
  import type { MemoryEntry, MemoryScope, MemoryTag } from './memory/format.ts';
8
10
  import type { AgentRemote } from './remote/host.ts';
9
11
  import type { VaultState } from './secrets/vault.ts';
@@ -88,6 +90,10 @@ export interface AgentControl {
88
90
  image(ref: ImageRef, context: Context): Promise<StoredImage>;
89
91
  agentCommands(agentId: string, context: Context): Promise<Command[]>;
90
92
  toolLabel(agentId: string, callIds: string[], context: Context): Promise<string | null>;
93
+ guestOpen(draft: GuestDraft, context: Context): Promise<GuestOpened>;
94
+ guestRevoke(id: string, context: Context): Promise<{
95
+ revoked: boolean;
96
+ }>;
91
97
  decide(id: string, decision: ApprovalAnswer, reason: string | null, context: Context): Promise<ApprovalDecided>;
92
98
  }
93
99
  export interface ImageRef {
@@ -233,7 +239,7 @@ export interface AgentSettingsChange {
233
239
  thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;
234
240
  agentId?: string | null;
235
241
  }
236
- export declare const CONTROL_METHODS: ("abort" | "agentCommands" | "changeAccept" | "changeRevert" | "changesOpen" | "compact" | "compactAgent" | "configure" | "createCone" | "createScoop" | "decide" | "discard" | "drop" | "freeze" | "image" | "memoryRemove" | "memorySave" | "monitorClose" | "monitorOpen" | "newChat" | "reset" | "resolveAgentLick" | "resolveLick" | "rewind" | "rewindAgent" | "selectCone" | "send" | "sprinkleCall" | "sprinkleSend" | "stopAgent" | "thaw" | "toolLabel" | "unqueue" | "wait" | "webhook" | "withdraw")[];
242
+ export declare const CONTROL_METHODS: ("abort" | "agentCommands" | "changeAccept" | "changeRevert" | "changesOpen" | "compact" | "compactAgent" | "configure" | "createCone" | "createScoop" | "decide" | "discard" | "drop" | "freeze" | "guestOpen" | "guestRevoke" | "image" | "memoryRemove" | "memorySave" | "monitorClose" | "monitorOpen" | "newChat" | "reset" | "resolveAgentLick" | "resolveLick" | "rewind" | "rewindAgent" | "selectCone" | "send" | "sprinkleCall" | "sprinkleSend" | "stopAgent" | "thaw" | "toolLabel" | "unqueue" | "wait" | "webhook" | "withdraw")[];
237
243
  export declare const CONTROL_READS: readonly (keyof AgentControl & string)[];
238
244
  export declare const AgentControl: RemoteContract;
239
245
  export type Delivered = 'run' | 'steer' | 'follow-up';
@@ -252,6 +258,7 @@ export interface AgentTranscript {
252
258
  readonly monitor: ReplicatedState<MonitorFeed>;
253
259
  readonly vault: ReplicatedState<VaultState>;
254
260
  readonly labels: ReplicatedState<Record<string, string>>;
261
+ readonly guests: ReplicatedState<GuestSeat[]>;
255
262
  readonly approvals: ReplicatedState<Approval[]>;
256
263
  }
257
264
  export interface PrivateRevision {
@@ -262,10 +269,35 @@ export interface Command {
262
269
  description: string;
263
270
  kind: 'prompt' | 'skill' | 'action';
264
271
  }
265
- export declare const TRANSCRIPT_STATES: ("agents" | "approvals" | "changes" | "commands" | "deliveries" | "frozen" | "labels" | "memories" | "memoryScopes" | "monitor" | "privateRevision" | "sprinkles" | "state" | "vault" | "views")[];
272
+ export declare const TRANSCRIPT_STATES: ("agents" | "approvals" | "changes" | "commands" | "deliveries" | "frozen" | "guests" | "labels" | "memories" | "memoryScopes" | "monitor" | "privateRevision" | "sprinkles" | "state" | "vault" | "views")[];
266
273
  export declare const AgentTranscript: RemoteContract;
267
274
  export declare const REMOTE_METHODS: ("abort" | "close" | "next" | "prompt" | "watch")[];
268
275
  export declare const REMOTE_READS: readonly (keyof AgentRemote & string)[];
276
+ export interface GuestShown {
277
+ id: string;
278
+ label: string;
279
+ agentId: string;
280
+ name: string;
281
+ expiresAt: number | null;
282
+ gates: GuestGates;
283
+ }
284
+ export interface GuestProposal {
285
+ id: string;
286
+ text: string;
287
+ state: 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';
288
+ reason: string | null;
289
+ createdAt: number;
290
+ decidedAt: number | null;
291
+ }
292
+ export interface AgentGuest {
293
+ readonly transcript: ReplicatedState<ConversationView>;
294
+ readonly seat: ReplicatedState<GuestShown>;
295
+ readonly proposals: ReplicatedState<GuestProposal[]>;
296
+ propose(request: ProposeRequest, context: Context): Promise<Proposed>;
297
+ }
298
+ export declare const GUEST_STATES: readonly ['transcript', 'seat', 'proposals'];
299
+ export declare const GUEST_METHODS: readonly ['propose'];
300
+ export declare const AgentGuestService: RemoteContract;
269
301
  export declare const AgentRemoteService: RemoteContract;
270
302
  export declare const PAGE_METHODS: ("answer" | "close" | "next" | "open" | "report")[];
271
303
  export declare const AgentPagesService: RemoteContract;
@@ -1,12 +1,19 @@
1
1
  import { type Ctx, type Principal, type Readable, type RemoteContract, type ReplicatedState } from '@earendil-works/chord';
2
2
  import { type Context } from '@earendil-works/chord/context';
3
3
  export declare const AGENT_HOST = "agent";
4
- export type Seat = 'owner' | 'control' | 'view';
4
+ export type Seat = 'owner' | 'control' | 'view' | 'guest';
5
+ export interface GuestPrincipal {
6
+ id: string;
7
+ name: string;
8
+ epoch: number;
9
+ }
5
10
  export interface AgentPrincipal {
6
11
  seat: Seat;
7
12
  link: number;
13
+ guest?: GuestPrincipal;
8
14
  }
9
15
  export declare const seatOf: (principal: Principal) => Seat;
16
+ export declare const guestOf: (principal: Principal) => GuestPrincipal | undefined;
10
17
  export declare const principalKey: (principal: Principal) => string;
11
18
  export interface Members {
12
19
  methods?: readonly string[];
@@ -0,0 +1,26 @@
1
+ import type { GuestDraft, GuestEvents, GuestPort, GuestSeat } from '@ai-ecoverse/slicc-spectrum/ui';
2
+ import type { AgentConnection } from '../client.ts';
3
+ import { Emitter } from './emitter.ts';
4
+ export interface GuestHub {
5
+ mint(request: GuestDraft & {
6
+ agentId: string;
7
+ }): Promise<{
8
+ id: string;
9
+ url: string;
10
+ }>;
11
+ revoke(id: string): Promise<void>;
12
+ }
13
+ export declare const NO_HUB = "Inviting guests needs the tray hub.";
14
+ export declare const NO_CONTROL = "Only a tab with Control can invite guests.";
15
+ export declare const NO_OWNER = "Only the owner's tab can invite guests.";
16
+ export declare class GuestAdapter extends Emitter<GuestEvents> implements GuestPort {
17
+ #private;
18
+ constructor(connection: AgentConnection, hub: GuestHub | null);
19
+ list(): readonly GuestSeat[];
20
+ unavailable(): string | null;
21
+ mint(agentId: string, draft: GuestDraft): Promise<{
22
+ seat: GuestSeat;
23
+ url: string;
24
+ }>;
25
+ revoke(id: string): Promise<void>;
26
+ }
@@ -1,8 +1,10 @@
1
1
  import type { MonitorSection } from '@ai-ecoverse/slicc-spectrum/ui';
2
2
  import type { AgentConnection } from '../client.ts';
3
+ import type { GuestGates } from '../guests/seats.ts';
3
4
  import { AgentAdapter } from './agent-port.ts';
4
5
  import { ApprovalsAdapter, type HostApprovals } from './approvals-port.ts';
5
6
  import { ChangesAdapter } from './changes-port.ts';
7
+ import { GuestAdapter, type GuestHub } from './guest-port.ts';
6
8
  import { MemoryAdapter } from './memory-port.ts';
7
9
  import { MonitorAdapter } from './monitor-port.ts';
8
10
  import { type HostNotices, NoticesAdapter } from './notices-port.ts';
@@ -13,6 +15,7 @@ import { TrayAdapter } from './tray-port.ts';
13
15
  export { AgentAdapter, CONE } from './agent-port.ts';
14
16
  export { ApprovalsAdapter, type HostApprovals, NOT_HERE, shown as shownApproval, } from './approvals-port.ts';
15
17
  export { ChangesAdapter, type ChangesEvents } from './changes-port.ts';
18
+ export { GuestAdapter, type GuestHub, NO_CONTROL, NO_HUB, NO_OWNER, } from './guest-port.ts';
16
19
  export { MemoryAdapter } from './memory-port.ts';
17
20
  export { assistant, errorAction, errorPart, isBusy, queued, textOf, toMessages, } from './messages.ts';
18
21
  export { MonitorAdapter, type MonitorAdapterOptions, type MonitorInput, monitorSnapshot, } from './monitor-port.ts';
@@ -21,6 +24,13 @@ export { PageAdapter, type PageDocument, type PageOptions, type PageRun, type Pa
21
24
  export { type Login, SETTINGS_KEY, SettingsAdapter } from './settings-port.ts';
22
25
  export { SprinkleAdapter } from './sprinkle-port.ts';
23
26
  export { TrayAdapter } from './tray-port.ts';
27
+ export interface GuestSeatShown {
28
+ id: string;
29
+ label: string;
30
+ agentId: string;
31
+ expiresAt: number | null;
32
+ gates: GuestGates;
33
+ }
24
34
  export declare function createAgentModel(connection: AgentConnection, options?: {
25
35
  storage?: Pick<Storage, 'getItem' | 'setItem'> | null;
26
36
  login?: Login;
@@ -28,6 +38,7 @@ export declare function createAgentModel(connection: AgentConnection, options?:
28
38
  extra?: () => readonly MonitorSection[];
29
39
  };
30
40
  page?: PageOptions;
41
+ guests?: GuestHub;
31
42
  approvals?: HostApprovals;
32
43
  notices?: HostNotices;
33
44
  }): {
@@ -41,4 +52,6 @@ export declare function createAgentModel(connection: AgentConnection, options?:
41
52
  monitor: MonitorAdapter;
42
53
  notices: NoticesAdapter;
43
54
  page: PageAdapter | null;
55
+ guests: GuestAdapter;
56
+ seat?: GuestSeatShown;
44
57
  };
@@ -0,0 +1,8 @@
1
+ import type { Message, SystemMessage, UserMessage } from '@ai-ecoverse/slicc-spectrum/ui';
2
+ import type { GuestProposal } from '../services.ts';
3
+ export declare const UNANSWERED = "Nobody approved this in time.";
4
+ export declare const DECLINED = "It was declined.";
5
+ export declare const WITHDRAWN = "It was withdrawn.";
6
+ export declare function proposalQueue(proposals: readonly GuestProposal[] | undefined, label: string): UserMessage[];
7
+ export declare function proposalNotices(proposals: readonly GuestProposal[] | undefined): SystemMessage[];
8
+ export declare function merged(messages: readonly Message[], notices: readonly SystemMessage[]): Message[];
package/dist/worker.js CHANGED
@@ -4,8 +4,9 @@ function serveConnections(scope, host) {
4
4
  const port = message?.connect;
5
5
  if (!port) return;
6
6
  const pages = message?.pages === false ? { pages: false } : {};
7
+ const guest = message?.guest ? { guest: message.guest } : {};
7
8
  host.then(
8
- (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages }),
9
+ (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages, ...guest }),
9
10
  () => port.close?.()
10
11
  );
11
12
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/worker.ts"],
4
- "sourcesContent": ["import type { AgentHost } from './host.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface WorkerScope {\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n}\n\nexport function serveConnections(scope: WorkerScope, host: Promise<AgentHost>): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { connect?: PortEndpoint; readOnly?: boolean; pages?: boolean } | null;\n const port = message?.connect;\n if (!port) return;\n const pages = message?.pages === false ? { pages: false } : {};\n host.then(\n (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages }),\n () => port.close?.()\n );\n });\n}\n\nexport interface KernelPorts {\n kernel: MessagePort;\n admin?: MessagePort;\n}\n\nexport function kernelPorts(scope: WorkerScope): Promise<KernelPorts> {\n return new Promise((resolve) => {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { kernel?: MessagePort; admin?: MessagePort } | null;\n const kernel = message?.kernel;\n if (!kernel) return;\n resolve(message.admin ? { kernel, admin: message.admin } : { kernel });\n });\n });\n}\n\nexport function kernelPort(scope: WorkerScope): Promise<MessagePort> {\n return kernelPorts(scope).then((ports) => ports.kernel);\n}\n"],
5
- "mappings": "AAOO,SAAS,iBAAiB,OAAoB,MAAgC;AACnF,QAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,UAAM,UAAU;AAChB,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,SAAS,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAC7D,SAAK;AAAA,MACH,CAAC,UAAU,MAAM,QAAQ,MAAM,EAAE,UAAU,SAAS,aAAa,MAAM,GAAG,MAAM,CAAC;AAAA,MACjF,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAOO,SAAS,YAAY,OAA0C;AACpE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,YAAM,UAAU;AAChB,YAAM,SAAS,SAAS;AACxB,UAAI,CAAC,OAAQ;AACb,cAAQ,QAAQ,QAAQ,EAAE,QAAQ,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,WAAW,OAA0C;AACnE,SAAO,YAAY,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM;AACxD;",
4
+ "sourcesContent": ["import type { AgentHost } from './host.ts';\nimport type { PortEndpoint } from './wire.ts';\n\nexport interface WorkerScope {\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n}\n\nexport function serveConnections(scope: WorkerScope, host: Promise<AgentHost>): void {\n scope.addEventListener('message', ({ data }) => {\n const message = data as {\n connect?: PortEndpoint;\n readOnly?: boolean;\n pages?: boolean;\n guest?: { id: string; label: string };\n } | null;\n const port = message?.connect;\n if (!port) return;\n const pages = message?.pages === false ? { pages: false } : {};\n const guest = message?.guest ? { guest: message.guest } : {};\n host.then(\n (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages, ...guest }),\n () => port.close?.()\n );\n });\n}\n\nexport interface KernelPorts {\n kernel: MessagePort;\n admin?: MessagePort;\n}\n\nexport function kernelPorts(scope: WorkerScope): Promise<KernelPorts> {\n return new Promise((resolve) => {\n scope.addEventListener('message', ({ data }) => {\n const message = data as { kernel?: MessagePort; admin?: MessagePort } | null;\n const kernel = message?.kernel;\n if (!kernel) return;\n resolve(message.admin ? { kernel, admin: message.admin } : { kernel });\n });\n });\n}\n\nexport function kernelPort(scope: WorkerScope): Promise<MessagePort> {\n return kernelPorts(scope).then((ports) => ports.kernel);\n}\n"],
5
+ "mappings": "AAOO,SAAS,iBAAiB,OAAoB,MAAgC;AACnF,QAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,UAAM,UAAU;AAMhB,UAAM,OAAO,SAAS;AACtB,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,SAAS,UAAU,QAAQ,EAAE,OAAO,MAAM,IAAI,CAAC;AAC7D,UAAM,QAAQ,SAAS,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAC3D,SAAK;AAAA,MACH,CAAC,UAAU,MAAM,QAAQ,MAAM,EAAE,UAAU,SAAS,aAAa,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAAA,MAC3F,MAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAOO,SAAS,YAAY,OAA0C;AACpE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,iBAAiB,WAAW,CAAC,EAAE,KAAK,MAAM;AAC9C,YAAM,UAAU;AAChB,YAAM,SAAS,SAAS;AACxB,UAAI,CAAC,OAAQ;AACb,cAAQ,QAAQ,QAAQ,EAAE,QAAQ,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,WAAW,OAA0C;AACnE,SAAO,YAAY,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,MAAM;AACxD;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-ecoverse/slicc-agent",
3
- "version": "5.2.0",
3
+ "version": "5.3.0",
4
4
  "description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -62,12 +62,12 @@
62
62
  "release": "semantic-release"
63
63
  },
64
64
  "devDependencies": {
65
- "@ai-ecoverse/slicc-kernel": "1.94.0",
65
+ "@ai-ecoverse/slicc-kernel": "1.100.3",
66
66
  "@ai-ecoverse/slicc-scrub": "1.0.0",
67
67
  "@ai-ecoverse/slicc-shared-web": "1.21.0",
68
- "@ai-ecoverse/slicc-spectrum": "1.79.1",
68
+ "@ai-ecoverse/slicc-spectrum": "1.79.2",
69
69
  "@ai-ecoverse/wasm-bash": "5.3.0-18",
70
- "@ai-ecoverse/wasm-coreutils": "9.12.0-6",
70
+ "@ai-ecoverse/wasm-coreutils": "9.12.0-7",
71
71
  "@ai-ecoverse/wasm-git": "2.55.0-15",
72
72
  "@biomejs/biome": "2.5.15",
73
73
  "@types/node": "24.19.1",
@@ -93,7 +93,7 @@
93
93
  },
94
94
  "peerDependencies": {
95
95
  "@ai-ecoverse/slicc-kernel": ">=1.90.0 <2",
96
- "@ai-ecoverse/slicc-spectrum": "^1.78.0"
96
+ "@ai-ecoverse/slicc-spectrum": "^1.79.0"
97
97
  },
98
98
  "peerDependenciesMeta": {
99
99
  "@ai-ecoverse/slicc-spectrum": {