@ai-ecoverse/slicc-agent 5.5.4 → 5.7.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 (63) hide show
  1. package/README.md +10 -4
  2. package/dist/agent.js +4 -0
  3. package/dist/agent.js.map +2 -2
  4. package/dist/approvals/index.js +87 -45
  5. package/dist/approvals/index.js.map +2 -2
  6. package/dist/approvals/judge.js +7 -1
  7. package/dist/approvals/judge.js.map +2 -2
  8. package/dist/approvals/record.js +7 -2
  9. package/dist/approvals/record.js.map +2 -2
  10. package/dist/approvals/sudo-client.js +112 -0
  11. package/dist/approvals/sudo-client.js.map +7 -0
  12. package/dist/approvals/sudo.js +166 -0
  13. package/dist/approvals/sudo.js.map +7 -0
  14. package/dist/guests/attribution.js +19 -0
  15. package/dist/guests/attribution.js.map +2 -2
  16. package/dist/guests/client.js +4 -3
  17. package/dist/guests/client.js.map +2 -2
  18. package/dist/guests/index.js +116 -63
  19. package/dist/guests/index.js.map +2 -2
  20. package/dist/guests/review.js +262 -0
  21. package/dist/guests/review.js.map +7 -0
  22. package/dist/guests/seats.js.map +2 -2
  23. package/dist/guests/serve.js +13 -13
  24. package/dist/guests/serve.js.map +2 -2
  25. package/dist/host.js +48 -14
  26. package/dist/host.js.map +2 -2
  27. package/dist/index.js.map +2 -2
  28. package/dist/owner.js +22 -1
  29. package/dist/owner.js.map +2 -2
  30. package/dist/page.js +2 -0
  31. package/dist/page.js.map +2 -2
  32. package/dist/services.js +10 -0
  33. package/dist/services.js.map +2 -2
  34. package/dist/serving.js +2 -0
  35. package/dist/serving.js.map +2 -2
  36. package/dist/spectrum/agent-port.js +1 -1
  37. package/dist/spectrum/agent-port.js.map +2 -2
  38. package/dist/spectrum/messages.js +50 -6
  39. package/dist/spectrum/messages.js.map +2 -2
  40. package/dist/spectrum/proposals.js +7 -3
  41. package/dist/spectrum/proposals.js.map +2 -2
  42. package/dist/types/agent.d.ts +2 -0
  43. package/dist/types/approvals/index.d.ts +11 -3
  44. package/dist/types/approvals/judge.d.ts +10 -0
  45. package/dist/types/approvals/record.d.ts +6 -0
  46. package/dist/types/approvals/sudo-client.d.ts +12 -0
  47. package/dist/types/approvals/sudo.d.ts +52 -0
  48. package/dist/types/guests/attribution.d.ts +16 -0
  49. package/dist/types/guests/index.d.ts +7 -4
  50. package/dist/types/guests/review.d.ts +68 -0
  51. package/dist/types/guests/seats.d.ts +12 -1
  52. package/dist/types/guests/serve.d.ts +3 -3
  53. package/dist/types/host.d.ts +5 -2
  54. package/dist/types/index.d.ts +2 -1
  55. package/dist/types/owner.d.ts +4 -0
  56. package/dist/types/page.d.ts +2 -0
  57. package/dist/types/services.d.ts +3 -1
  58. package/dist/types/serving.d.ts +2 -0
  59. package/dist/types/spectrum/messages.d.ts +2 -0
  60. package/dist/types/spectrum/proposals.d.ts +2 -1
  61. package/dist/worker.js +7 -1
  62. package/dist/worker.js.map +2 -2
  63. package/package.json +2 -2
@@ -44,8 +44,18 @@ export declare const VERDICT_REASONS: {
44
44
  export declare const JUDGE_QUESTIONS: Record<string, ClassifierQuestion>;
45
45
  export declare function fenced(text: string, nonce: string): string;
46
46
  export declare function untrustedOf(item: Approval): string;
47
+ export declare function sudoContext(item: Approval): {
48
+ sudo?: {
49
+ target: string;
50
+ cwd: string | null;
51
+ };
52
+ };
47
53
  export declare function judgeState(item: Approval, intent: OwnerIntent, nonce: string): {
48
54
  request: {
55
+ sudo?: {
56
+ target: string;
57
+ cwd: string | null;
58
+ };
49
59
  kind: "guest-message" | "guest-tool" | "sudo";
50
60
  requester: {
51
61
  kind: "agent" | "guest" | "user";
@@ -9,6 +9,7 @@ export type ApprovalRequester = {
9
9
  seat?: string;
10
10
  agentId?: string;
11
11
  where?: string;
12
+ device?: string;
12
13
  };
13
14
  export type ApprovalVerdict = {
14
15
  decision: 'allow' | 'deny' | 'unsure';
@@ -44,6 +45,7 @@ type Base = {
44
45
  tier: string;
45
46
  state: ApprovalState;
46
47
  decidedBy: DecidedBy | null;
48
+ device?: string;
47
49
  answer?: 'once' | 'always';
48
50
  reason?: string;
49
51
  verdict?: ApprovalVerdict;
@@ -88,6 +90,7 @@ export declare const REASONS: {
88
90
  readonly restart: 'restart';
89
91
  readonly revoked: 'revoked';
90
92
  readonly aborted: 'aborted';
93
+ readonly disconnected: 'disconnected';
91
94
  };
92
95
  export declare const guestKind: (kind: ApprovalKind) => boolean;
93
96
  export declare function knownTier(tier: unknown): tier is ApprovalTier;
@@ -95,6 +98,9 @@ export declare function routable(kind: ApprovalKind, tier: ApprovalTier): boolea
95
98
  export declare function answerOf(value: unknown): ApprovalAnswer | null;
96
99
  export declare const personal: (by: DecidedBy) => boolean;
97
100
  export declare function answerer(by: DecidedBy, tier: string): boolean;
101
+ export type SudoApprover = 'user' | 'agent';
102
+ export declare const sudoApprover: (value: unknown) => SudoApprover;
103
+ export declare const tierOf: (kind: ApprovalKind, tier: string, sudo: SudoApprover) => string;
98
104
  export declare function gone(state: ApprovalState): string;
99
105
  export declare function cleanReason(reason: unknown): string | undefined;
100
106
  export declare function prune(items: Approval[], kept?: number): Approval[];
@@ -0,0 +1,12 @@
1
+ import { type PortEndpoint } from '../wire.ts';
2
+ import type { Approval } from './record.ts';
3
+ import type { SudoAnswer, SudoRequest } from './sudo.ts';
4
+ export interface ApproveOptions {
5
+ signal?: AbortSignal;
6
+ where?: string;
7
+ }
8
+ export declare const UNAVAILABLE = "The agent can't take this sudo request.";
9
+ export declare const unavailable: (cause?: unknown) => Error;
10
+ export declare function answerOf(item: Approval | undefined): SudoAnswer | null;
11
+ export declare const WITHDRAW_MS = 5000;
12
+ export declare function askSudo(endpoint: PortEndpoint, request: SudoRequest, options?: ApproveOptions, stop?: AbortSignal): Promise<SudoAnswer>;
@@ -0,0 +1,52 @@
1
+ import type { Context, ReplicatedState } from '@earendil-works/chord';
2
+ import type { AgentsState } from '../agents.ts';
3
+ import type { Licks } from '../licks/licks.ts';
4
+ import type { Approvals } from './index.ts';
5
+ import { type Approval, type ApprovalRequester, type SudoDetail } from './record.ts';
6
+ export type SudoAnswer = 'once' | 'always' | 'deny';
7
+ export interface SudoRequest {
8
+ id: string;
9
+ kind: 'sudo';
10
+ user: string;
11
+ uid?: number;
12
+ target?: string;
13
+ argv: string[];
14
+ path?: string;
15
+ cwd?: string;
16
+ pid?: number;
17
+ tag?: string;
18
+ tty?: string;
19
+ createdAt?: number;
20
+ expiresAt: number;
21
+ always?: boolean;
22
+ }
23
+ export type SudoAsked = {
24
+ id: string;
25
+ error: null;
26
+ } | {
27
+ id: null;
28
+ error: string;
29
+ };
30
+ export interface AgentSudo {
31
+ readonly approvals: ReplicatedState<Approval[]>;
32
+ request(request: SudoRequest, where: string | null, context: Context): Promise<SudoAsked>;
33
+ withdraw(id: string, reason: string | null, context: Context): Promise<void>;
34
+ }
35
+ export declare const shellWord: (word: string) => string;
36
+ export declare function sudoRequest(value: unknown): SudoRequest | null;
37
+ export declare function sudoRequester(request: SudoRequest, agents: Readonly<AgentsState> | undefined, where?: string | null): {
38
+ requester: ApprovalRequester;
39
+ agentId: string;
40
+ };
41
+ export declare function sudoDetail(request: SudoRequest): SudoDetail;
42
+ export interface SudoAttach {
43
+ approvals: Approvals;
44
+ agents?: () => Readonly<AgentsState> | undefined;
45
+ licks?: Pick<Licks, 'deliver'>;
46
+ }
47
+ export declare function createSudo(options: SudoAttach): AgentSudo & {
48
+ close(): void;
49
+ };
50
+ export declare function ownedSudo(sudo: AgentSudo): AgentSudo & {
51
+ release(): void;
52
+ };
@@ -1,4 +1,20 @@
1
1
  export declare const GUEST_INPUT_KIND = "slicc.guest-input";
2
+ export declare const ASKED_KIND = "slicc.guest-asked";
3
+ export declare const ASKED_CLIP = 200;
4
+ export declare const REVIEWED_KIND = "slicc.guest-reviewed";
5
+ export type GuestAsked = {
6
+ seat: string;
7
+ name: string;
8
+ review: string;
9
+ text: string;
10
+ at: number;
11
+ };
12
+ export type GuestOutcome = 'approved' | 'rejected' | 'unanswered' | 'withdrawn';
13
+ export type GuestReviewed = {
14
+ review: string;
15
+ outcome: GuestOutcome;
16
+ };
17
+ export declare function askedLine(name: string, text: string, outcome?: GuestOutcome): string;
2
18
  export type GuestInput = {
3
19
  seat: string;
4
20
  name: string;
@@ -5,6 +5,7 @@ import type { Approvals } from '../approvals/index.ts';
5
5
  import type { ApprovalPolicies } from '../approvals/policy.ts';
6
6
  import type { GuestPrincipal } from '../serving.ts';
7
7
  import { type GuestPolicy } from './policy.ts';
8
+ import { type GuestReviews, type ReviewsState } from './review.ts';
8
9
  import { type GuestDraft, type GuestSeat, type SeatRecord } from './seats.ts';
9
10
  export type GuestOpened = {
10
11
  seat: GuestSeat;
@@ -18,9 +19,9 @@ export type Proposed = {
18
19
  submissionId: string;
19
20
  reason: null;
20
21
  } | {
21
- state: 'pending';
22
+ state: 'queued';
22
23
  submissionId: null;
23
- approval: string;
24
+ review: string;
24
25
  reason: null;
25
26
  } | {
26
27
  state: 'unanswered';
@@ -33,6 +34,7 @@ export interface ProposeRequest {
33
34
  }
34
35
  export interface Guests {
35
36
  readonly seats: ReplicatedState<GuestSeat[]>;
37
+ readonly reviews: ReplicatedState<ReviewsState | null>;
36
38
  open(draft: GuestDraft, context: Context): Promise<GuestOpened>;
37
39
  revoke(id: string, context: Context): Promise<{
38
40
  revoked: boolean;
@@ -47,10 +49,11 @@ export interface Guests {
47
49
  dispose(): void;
48
50
  }
49
51
  export interface GuestsOptions {
50
- harness: Pick<Harness, 'commit' | 'abortSubmission'>;
52
+ harness: Pick<Harness, 'commit' | 'abortSubmission' | 'documentState'>;
51
53
  agents: Pick<Agents, 'state' | 'conversation'>;
52
- approvals?: Pick<Approvals, 'state' | 'request' | 'withdrawSeat'>;
54
+ approvals?: Pick<Approvals, 'state' | 'request' | 'withdrawSeat' | 'expire' | 'withdraw'>;
53
55
  policy?: Pick<ApprovalPolicies, 'current'>;
56
+ reviews?: Pick<GuestReviews, 'task' | 'bind'>;
54
57
  now?: () => number;
55
58
  context?: Context;
56
59
  }
@@ -0,0 +1,68 @@
1
+ import { type Extension, type Tx } from '@earendil-works/pi-durable';
2
+ import type { Agents } from '../agents.ts';
3
+ import type { Approvals } from '../approvals/index.ts';
4
+ import { type GuestGate } from './seats.ts';
5
+ export type ReviewState = 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';
6
+ export type Review = {
7
+ id: string;
8
+ seat: string;
9
+ agentId: string;
10
+ label: string;
11
+ text: string;
12
+ request: string;
13
+ tier: GuestGate;
14
+ tools: GuestGate;
15
+ n: number;
16
+ task: number;
17
+ state: ReviewState;
18
+ reason: string | null;
19
+ createdAt: number;
20
+ decidedAt: number | null;
21
+ submissionId: string | null;
22
+ ended: boolean;
23
+ conversation: number;
24
+ auto?: boolean;
25
+ told?: boolean;
26
+ };
27
+ export type ReviewsState = {
28
+ next: number;
29
+ reviews: Record<string, Review>;
30
+ };
31
+ export declare const GuestReviewsDoc: import("@earendil-works/pi-durable").SessionDocToken<ReviewsState>;
32
+ export declare const GUEST_REVIEWS = "slicc-guest-reviews";
33
+ export declare const REVIEW_TASK = "slicc.guest-review";
34
+ export declare const MAX_QUEUED = 8;
35
+ export declare const KEPT_REVIEWS = 100;
36
+ export declare const KEPT_SUBMISSIONS = 100;
37
+ export interface ReviewHost {
38
+ approvals: Pick<Approvals, 'request' | 'expire' | 'withdraw'>;
39
+ agents: Pick<Agents, 'conversation'>;
40
+ line<T>(seat: string, run: () => Promise<T>): Promise<T>;
41
+ alwaysAllowed(): boolean;
42
+ }
43
+ type Input = {
44
+ review: string;
45
+ };
46
+ type Phase = {
47
+ phase: 'turn';
48
+ after?: number;
49
+ } | {
50
+ phase: 'ask';
51
+ } | {
52
+ phase: 'decide';
53
+ } | {
54
+ phase: 'deliver';
55
+ };
56
+ export declare const liveReviews: (state: ReviewsState | null | undefined, seat: string) => Review[];
57
+ export declare function endReview(review: Review, state: ReviewState, reason: string | null, at: number): void;
58
+ export declare function told(tx: Pick<Tx, 'appendEntry'>, review: Review): Promise<void>;
59
+ export declare function pruneReviews(state: ReviewsState, kept?: number): void;
60
+ export declare const deliveryId: (seat: string, review: string) => string;
61
+ export interface GuestReviews {
62
+ readonly extension: Extension;
63
+ readonly task: ReturnType<typeof reviewTask>;
64
+ bind(host: ReviewHost): void;
65
+ }
66
+ declare function reviewTask(lookup: () => Promise<ReviewHost>): import("@earendil-works/pi-durable").Task<Input, Phase, null, object>;
67
+ export declare function guestReviews(): GuestReviews;
68
+ export {};
@@ -1,4 +1,4 @@
1
- import type { ApprovalTier } from '../approvals/record.ts';
1
+ import type { ApprovalTier, DecidedBy } from '../approvals/record.ts';
2
2
  import { type GuestPolicy } from './policy.ts';
3
3
  export type GuestGate = ApprovalTier | 'off';
4
4
  export type GuestGates = {
@@ -12,11 +12,22 @@ export type GuestDraft = {
12
12
  expiresAt: number | null;
13
13
  gates: GuestGates;
14
14
  };
15
+ export type SeatSubmission = {
16
+ id: string;
17
+ approval: string | null;
18
+ tools: GuestGate;
19
+ };
15
20
  export type SeatRecord = GuestDraft & {
16
21
  createdAt: number;
17
22
  epoch: number;
18
23
  revoked: number | null;
19
24
  delivered?: string[];
25
+ submissions?: SeatSubmission[];
26
+ always?: {
27
+ by: DecidedBy | null;
28
+ approval: string;
29
+ at: number;
30
+ };
20
31
  };
21
32
  export interface GuestSeat {
22
33
  id: string;
@@ -1,13 +1,13 @@
1
1
  import type { Context, Host, ReplicatedState } from '@earendil-works/chord';
2
2
  import type { ConversationView } from '@earendil-works/pi-durable';
3
3
  import type { Agents } from '../agents.ts';
4
- import type { Approval } from '../approvals/index.ts';
5
4
  import type { AgentGuest, GuestProposal } from '../services.ts';
6
5
  import type { GuestPrincipal } from '../serving.ts';
7
6
  import { type PortEndpoint } from '../wire.ts';
8
7
  import type { Guests } from './index.ts';
9
- export declare function proposalsOf(items: readonly Approval[] | undefined, seat: string): GuestProposal[];
10
- export declare function guestOpener(guests: Guests, agents: Pick<Agents, 'state'>, views: ReplicatedState<Record<string, ConversationView>>, context: Context, approvals?: ReplicatedState<Approval[]>): (principal: GuestPrincipal) => {
8
+ import type { ReviewsState } from './review.ts';
9
+ export declare function proposalsOf(state: ReviewsState | null | undefined, seat: string): GuestProposal[];
10
+ export declare function guestOpener(guests: Guests, agents: Pick<Agents, 'state'>, views: ReplicatedState<Record<string, ConversationView>>, context: Context): (principal: GuestPrincipal) => {
11
11
  value: AgentGuest;
12
12
  dispose(): void;
13
13
  } | undefined;
@@ -1,6 +1,7 @@
1
1
  import { type Context, type Host, type Readable, type ReplicatedState } from '@earendil-works/chord';
2
2
  import type { Agent } from './agent.ts';
3
- import { type ApprovalJudge, type Approvals, type DecidedBy } from './approvals/index.ts';
3
+ import { type ApprovalJudge, type Approvals, type Decider } from './approvals/index.ts';
4
+ import { type AgentSudo } from './approvals/sudo.ts';
4
5
  import type { ChangesRuntime } from './changes/index.ts';
5
6
  import { type HostLicks, type HostScoops } from './control.ts';
6
7
  import type { FreezerRuntime } from './freezer/index.ts';
@@ -28,6 +29,7 @@ export interface ConnectOptions {
28
29
  id: string;
29
30
  label: string;
30
31
  };
32
+ device?: string;
31
33
  }
32
34
  export interface AgentHost {
33
35
  readonly serverId: string;
@@ -71,6 +73,7 @@ interface Served {
71
73
  viewed: AgentControl;
72
74
  transcript: Record<keyof AgentTranscript, ReplicatedState<unknown>>;
73
75
  viewMonitor: ReplicatedState<unknown>;
76
+ sudo?: AgentSudo;
74
77
  settings: AgentSettings;
75
78
  remote: AgentRemote;
76
79
  pages: Pages;
@@ -78,7 +81,7 @@ interface Served {
78
81
  value: AgentGuest;
79
82
  dispose(): void;
80
83
  } | undefined;
81
- decide: (by: DecidedBy) => AgentControl['decide'];
84
+ decide: (by: Decider) => AgentControl['decide'];
82
85
  }
83
86
  export declare const CLOSED_TO_GUESTS = "a guest seat has only its transcript and propose";
84
87
  export declare const openToGuests: <F extends object>(factory: F) => F;
@@ -1,7 +1,8 @@
1
1
  export { ADOBE, ADOBE_PROXY, type AdobeConfig, type AdobeModelInfo, adobeClassifiers, adobeConfig, adobeIdentity, adobeModel, adobeProvider, adobeUsage, type Budget, SESSION_HEADER, VERSION_HEADER, withAdobeIdentity, } from './adobe.ts';
2
2
  export { type Agent, type AgentOptions, answerText, openAgent } from './agent.ts';
3
- export { APPROVAL_MS, type Approval, type ApprovalAnswer, type ApprovalDecided, type ApprovalDraft, type ApprovalJudge, type ApprovalKind, type ApprovalRequester, type ApprovalState, type Approvals, ApprovalsDoc, type ApprovalTier, type ApprovalVerdict, approvalJudge, attachApprovals, DEFAULT_POLICY, type DecidedBy, JUDGE_ALLOW, JUDGE_DENY, JUDGE_KIND, JUDGE_MODEL, JUDGE_QUESTIONS, type Judgement, judgeModelOf, judgeSpender, judgeState, type OwnerIntent, ownerIntent, POLICY_FILE, REASONS, seedPolicy, VERDICT_REASONS, verdictOf, verdictRecorder, } from './approvals/index.ts';
3
+ export { APPROVAL_MS, type Approval, type ApprovalAnswer, type ApprovalDecided, type ApprovalDraft, type ApprovalJudge, type ApprovalKind, type ApprovalRequester, type ApprovalState, type Approvals, ApprovalsDoc, type ApprovalTier, type ApprovalVerdict, approvalJudge, attachApprovals, DEFAULT_POLICY, type DecidedBy, type Decider, JUDGE_ALLOW, JUDGE_DENY, JUDGE_KIND, JUDGE_MODEL, JUDGE_QUESTIONS, type Judgement, judgeModelOf, judgeSpender, judgeState, type OwnerIntent, ownerIntent, POLICY_FILE, REASONS, seedPolicy, VERDICT_REASONS, verdictOf, verdictRecorder, } from './approvals/index.ts';
4
4
  export { type ApprovalPolicy, type ApprovalPolicyChange, type ApprovalPolicySet, DEFAULT_APPROVAL_POLICY, type SudoPolicy, } from './approvals/policy.ts';
5
+ export type { AgentSudo, SudoAnswer, SudoRequest } from './approvals/sudo.ts';
5
6
  export { FILE_LIMIT, IMAGE_LIMIT, type SendAttachment, type ShownAttachment, splitUser, TOTAL_LIMIT, userParts, } from './attachments.ts';
6
7
  export { type AgentConnection, connectAgent } from './client.ts';
7
8
  export { createAgentControl } from './control.ts';
@@ -1,3 +1,5 @@
1
+ import type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';
2
+ import { type ApproveOptions } from './approvals/sudo-client.ts';
1
3
  import { type AgentConnection } from './client.ts';
2
4
  import { type KernelSource } from './kernel/users.ts';
3
5
  import type { PortEndpoint } from './wire.ts';
@@ -13,10 +15,12 @@ export interface PortOptions {
13
15
  id: string;
14
16
  label: string;
15
17
  };
18
+ device?: string;
16
19
  }
17
20
  export interface AgentOwner {
18
21
  connect(options?: PortOptions): Promise<AgentConnection>;
19
22
  port(options?: PortOptions): Promise<PortEndpoint & Transferable>;
23
+ approve(request: SudoRequest, options?: ApproveOptions): Promise<SudoAnswer>;
20
24
  restart(): Promise<void>;
21
25
  release(): Promise<void>;
22
26
  }
@@ -1,3 +1,5 @@
1
+ export type { SudoAnswer, SudoRequest } from './approvals/sudo.ts';
2
+ export { type ApproveOptions, UNAVAILABLE } from './approvals/sudo-client.ts';
1
3
  export { type AgentConnection, connectAgent } from './client.ts';
2
4
  export { connectGuest, GUEST_ONLY, type GuestConnection, SEAT_REFUSED, } from './guests/client.ts';
3
5
  export { type ByteSink, bridgePort, encodeFrame, FrameReader, type LinkEnd, linkEndpoint, MAX_FRAME, } from './link.ts';
@@ -288,7 +288,7 @@ export interface GuestShown {
288
288
  export interface GuestProposal {
289
289
  id: string;
290
290
  text: string;
291
- state: 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';
291
+ state: 'queued' | 'pending' | 'approved' | 'rejected' | 'unanswered' | 'withdrawn';
292
292
  reason: string | null;
293
293
  createdAt: number;
294
294
  decidedAt: number | null;
@@ -309,6 +309,8 @@ export declare const AgentGuestService: RemoteContract;
309
309
  export declare const AgentRemoteService: RemoteContract;
310
310
  export declare const PAGE_METHODS: ("answer" | "close" | "next" | "open" | "report")[];
311
311
  export declare const AgentPagesService: RemoteContract;
312
+ export declare const SUDO_METHODS: ("request" | "withdraw")[];
313
+ export declare const AgentSudoService: RemoteContract;
312
314
  export interface ModelChoice {
313
315
  id: string;
314
316
  label: string;
@@ -11,9 +11,11 @@ export interface AgentPrincipal {
11
11
  seat: Seat;
12
12
  link: number;
13
13
  guest?: GuestPrincipal;
14
+ device?: string;
14
15
  }
15
16
  export declare const seatOf: (principal: Principal) => Seat;
16
17
  export declare const guestOf: (principal: Principal) => GuestPrincipal | undefined;
18
+ export declare const deviceOf: (principal: Principal) => string | undefined;
17
19
  export declare const principalKey: (principal: Principal) => string;
18
20
  export interface Members {
19
21
  methods?: readonly string[];
@@ -1,5 +1,6 @@
1
1
  import type { AssistantMessage, AssistantStatus, ErrorAction, Message, MessagePart, ToolCall, UserMessage } from '@ai-ecoverse/slicc-spectrum/ui';
2
2
  import type { ConversationView, EntryRecord } from '@earendil-works/pi-durable';
3
+ import { type GuestOutcome } from '../guests/attribution.ts';
3
4
  import { type From } from '../scoops/from.ts';
4
5
  import type { Delivered } from '../services.ts';
5
6
  type Json = Record<string, unknown>;
@@ -42,6 +43,7 @@ export declare function errorPart(error: string, provider?: string): MessagePart
42
43
  export declare function errorAction(message: string): ErrorAction;
43
44
  export declare function assistant(id: string, message: ModelMessage, status?: AssistantStatus): AssistantMessage;
44
45
  export declare function origins(entries: readonly EntryRecord[]): Map<number, From>;
46
+ export declare function reviewed(entries: readonly EntryRecord[]): Map<string, GuestOutcome>;
45
47
  export declare function toMessages(view: ConversationView | undefined, deliveries?: Readonly<Record<string, Delivered>>): Message[];
46
48
  export declare function isBusy(view: ConversationView | undefined): boolean;
47
49
  export declare function queued(view: ConversationView | undefined, at?: (id: string) => number): UserMessage[];
@@ -1,8 +1,9 @@
1
1
  import type { Message, SystemMessage, UserMessage } from '@ai-ecoverse/slicc-spectrum/ui';
2
2
  import type { GuestProposal } from '../services.ts';
3
+ export declare const APPROVED = "It was approved.";
3
4
  export declare const UNANSWERED = "Nobody approved this in time.";
4
5
  export declare const DECLINED = "It was declined.";
5
6
  export declare const WITHDRAWN = "It was withdrawn.";
6
- export declare function proposalQueue(proposals: readonly GuestProposal[] | undefined, label: string): UserMessage[];
7
+ export declare function proposalQueue(proposals: readonly GuestProposal[] | undefined, label: string, seat: string): UserMessage[];
7
8
  export declare function proposalNotices(proposals: readonly GuestProposal[] | undefined): SystemMessage[];
8
9
  export declare function merged(messages: readonly Message[], notices: readonly SystemMessage[]): Message[];
package/dist/worker.js CHANGED
@@ -5,8 +5,14 @@ function serveConnections(scope, host) {
5
5
  if (!port) return;
6
6
  const pages = message?.pages === false ? { pages: false } : {};
7
7
  const guest = message?.guest ? { guest: message.guest } : {};
8
+ const device = typeof message?.device === "string" && message.device ? { device: message.device } : {};
8
9
  host.then(
9
- (ready) => ready.connect(port, { readOnly: message?.readOnly === true, ...pages, ...guest }),
10
+ (ready) => ready.connect(port, {
11
+ readOnly: message?.readOnly === true,
12
+ ...pages,
13
+ ...guest,
14
+ ...device
15
+ }),
10
16
  () => port.close?.()
11
17
  );
12
18
  });
@@ -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 {\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;",
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 device?: unknown;\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 const device =\n typeof message?.device === 'string' && message.device ? { device: message.device } : {};\n host.then(\n (ready) =>\n ready.connect(port, {\n readOnly: message?.readOnly === true,\n ...pages,\n ...guest,\n ...device,\n }),\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;AAOhB,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,UAAM,SACJ,OAAO,SAAS,WAAW,YAAY,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AACxF,SAAK;AAAA,MACH,CAAC,UACC,MAAM,QAAQ,MAAM;AAAA,QAClB,UAAU,SAAS,aAAa;AAAA,QAChC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,CAAC;AAAA,MACH,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.5.4",
3
+ "version": "5.7.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",
@@ -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.80.0"
96
+ "@ai-ecoverse/slicc-spectrum": "^1.81.0"
97
97
  },
98
98
  "peerDependenciesMeta": {
99
99
  "@ai-ecoverse/slicc-spectrum": {