@ai-ecoverse/slicc-agent 5.10.1 → 6.0.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.
@@ -16,7 +16,7 @@ import { type Pages } from './remote/pages.ts';
16
16
  import type { SecretName } from './secrets/names.ts';
17
17
  import type { VaultState } from './secrets/vault.ts';
18
18
  import { AgentControl, type AgentGuest, AgentSettings, AgentTranscript } from './services.ts';
19
- import { type GuestPrincipal } from './serving.ts';
19
+ import { type AgentPrincipal, type GuestPrincipal } from './serving.ts';
20
20
  import type { SkillsRuntime } from './skills/index.ts';
21
21
  import type { SprinklesRuntime } from './sprinkles/index.ts';
22
22
  import { type Thumbnail } from './thumbs.ts';
@@ -88,7 +88,7 @@ interface Served {
88
88
  }
89
89
  export declare const CLOSED_TO_GUESTS = "a guest seat has only its transcript and propose";
90
90
  export declare const openToGuests: <F extends object>(factory: F) => F;
91
- export declare function closedToGuests(host: Host): Host;
91
+ export declare function closedToGuests(host: Host<AgentPrincipal>): Host<AgentPrincipal>;
92
92
  export declare function lazily<T>(state: () => ReplicatedState<T>): Readable<T>;
93
- export declare function serveAgent(serving: Served): Host;
93
+ export declare function serveAgent(serving: Served): Host<AgentPrincipal>;
94
94
  export {};
@@ -1,4 +1,4 @@
1
- import { type Ctx, type Principal, type Readable, type RemoteContract, type ReplicatedState } from '@earendil-works/chord';
1
+ import { type Ctx, 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
4
  export type Seat = 'owner' | 'control' | 'view' | 'guest';
@@ -7,16 +7,19 @@ export interface GuestPrincipal {
7
7
  name: string;
8
8
  epoch: number;
9
9
  }
10
- export interface AgentPrincipal {
11
- seat: Seat;
10
+ export type AgentPrincipal = {
11
+ seat: 'owner' | 'control' | 'view';
12
12
  link: number;
13
- guest?: GuestPrincipal;
14
13
  device?: string;
15
- }
16
- export declare const seatOf: (principal: Principal) => Seat;
17
- export declare const guestOf: (principal: Principal) => GuestPrincipal | undefined;
18
- export declare const deviceOf: (principal: Principal) => string | undefined;
19
- export declare const principalKey: (principal: Principal) => string;
14
+ } | {
15
+ seat: 'guest';
16
+ link: number;
17
+ guest: GuestPrincipal;
18
+ } | {
19
+ seat: 'host';
20
+ };
21
+ export declare const SELF: AgentPrincipal;
22
+ export declare const principalKey: (principal: AgentPrincipal) => string;
20
23
  export interface Members {
21
24
  methods?: readonly string[];
22
25
  state?: readonly string[];
@@ -28,16 +31,12 @@ export declare function served(impl: () => object, names: readonly string[]): Re
28
31
  export declare function readable<T>(state: ReplicatedState<T>): Readable<T>;
29
32
  export declare function readablesOf(states: Record<string, ReplicatedState<unknown>>): Record<string, Readable<unknown>>;
30
33
  export interface Remote {
31
- readonly kind: string | undefined;
34
+ readonly variant: string | undefined;
32
35
  readonly ready: Promise<void>;
33
36
  release(): void;
34
37
  [member: string]: unknown;
35
38
  }
36
- export declare function replicated<T>(member: Readable<T | undefined>): ReplicatedState<T>;
37
- export declare function kept(member: Readable<unknown>): {
38
- ready: Promise<void>;
39
- stop(): void;
40
- };
39
+ export declare function replicated<T>(member: Readable<T>): ReplicatedState<T>;
41
40
  export declare const CLOSED = "the connection to the agent is closed";
42
41
  export declare function plain(error: unknown): unknown;
43
42
  export type Root = <R>(run: (ctx: Ctx) => Promise<R>, options: {
@@ -1,4 +1,4 @@
1
- import type { Frame as ChordFrame, Link } from '@earendil-works/chord';
1
+ import { type Frame as ChordFrame, type Link } from '@earendil-works/chord';
2
2
  export interface PortEndpoint {
3
3
  postMessage(message: unknown, transfer?: Transferable[]): void;
4
4
  addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
@@ -11,6 +11,8 @@ export type Frame = {
11
11
  } | {
12
12
  close: true;
13
13
  } | Uint8Array;
14
+ export declare const OTHER_VERSION = "That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.";
15
+ export declare const otherVersion: (cause?: unknown) => Error;
14
16
  export declare class PortLink implements Link {
15
17
  #private;
16
18
  readonly hello: Promise<string>;
@@ -18,7 +20,8 @@ export declare class PortLink implements Link {
18
20
  constructor(endpoint: PortEndpoint);
19
21
  get closed(): boolean;
20
22
  greet(serverId: string): void;
21
- send(frame: ChordFrame): void;
23
+ mismatched(): void;
24
+ send(frame: ChordFrame): number;
22
25
  receive(handler: (frame: ChordFrame) => void): void;
23
26
  onClose(handler: (reason: string) => void): void;
24
27
  close(reason?: string): void;
package/dist/wire.js CHANGED
@@ -1,3 +1,8 @@
1
+ import { PROTOCOL_VERSION } from "@earendil-works/chord";
2
+ const OTHER_VERSION = "That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.";
3
+ const otherVersion = (cause) => Object.assign(new Error(OTHER_VERSION, cause === void 0 ? void 0 : { cause }), {
4
+ code: "EVERSION"
5
+ });
1
6
  const encoder = new TextEncoder();
2
7
  const decoder = new TextDecoder();
3
8
  function parse(chunk) {
@@ -14,14 +19,18 @@ class PortLink {
14
19
  #closers = /* @__PURE__ */ new Set();
15
20
  #handler;
16
21
  #closed = false;
22
+ #held;
23
+ #heard = false;
24
+ #legacy = false;
25
+ #mismatch = false;
17
26
  #greet;
18
- #refuse;
27
+ #unwelcome;
19
28
  #finish;
20
29
  constructor(endpoint) {
21
30
  this.#endpoint = endpoint;
22
- this.hello = new Promise((greet, refuse) => {
31
+ this.hello = new Promise((greet, unwelcome) => {
23
32
  this.#greet = greet;
24
- this.#refuse = refuse;
33
+ this.#unwelcome = unwelcome;
25
34
  });
26
35
  this.hello.catch(() => void 0);
27
36
  this.ended = new Promise((finish) => {
@@ -38,11 +47,21 @@ class PortLink {
38
47
  return this.#closed;
39
48
  }
40
49
  greet(serverId) {
50
+ this.#held ??= [];
41
51
  this.#endpoint.postMessage({ hello: serverId });
42
52
  }
53
+ mismatched() {
54
+ this.#mismatch = true;
55
+ }
43
56
  send(frame) {
44
- if (this.#closed) return;
57
+ if (this.#closed) return 0;
45
58
  const bytes = encoder.encode(JSON.stringify(frame));
59
+ const size = bytes.byteLength;
60
+ if (this.#held) this.#held.push(bytes);
61
+ else this.#post(bytes);
62
+ return size;
63
+ }
64
+ #post(bytes) {
46
65
  this.#endpoint.postMessage(bytes, [bytes.buffer]);
47
66
  }
48
67
  receive(handler) {
@@ -55,6 +74,7 @@ class PortLink {
55
74
  }
56
75
  close(reason = "closed") {
57
76
  if (this.#closed) return;
77
+ this.#held = void 0;
58
78
  this.send({ t: "bye", reason });
59
79
  this.#endpoint.postMessage({ close: true });
60
80
  this.#end(reason, false);
@@ -76,21 +96,43 @@ class PortLink {
76
96
  return;
77
97
  }
78
98
  if (frame.t === "bye") this.#end(frame.reason ?? "peer closed", false);
99
+ else if (!this.#heard) this.#hello(frame);
100
+ else if (this.#legacy) this.#refuse(frame);
79
101
  else this.#handler?.(frame);
80
102
  }
103
+ #hello(frame) {
104
+ this.#heard = true;
105
+ const held = this.#held;
106
+ this.#held = void 0;
107
+ if (frame.t !== "hello" || frame.protocol !== void 0) {
108
+ for (const bytes of held ?? []) this.#post(bytes);
109
+ this.#handler?.(frame);
110
+ return;
111
+ }
112
+ this.#legacy = true;
113
+ this.#mismatch = true;
114
+ if (!held) this.close(`protocol-version ${PROTOCOL_VERSION}`);
115
+ }
116
+ #refuse(frame) {
117
+ if (frame.t !== "hold") return;
118
+ const error = { code: "upgrade_required", message: `upgrade_required: ${OTHER_VERSION}` };
119
+ this.#post(encoder.encode(JSON.stringify({ t: "gone", id: frame.id, error })));
120
+ }
81
121
  #end(reason, failed) {
82
122
  if (this.#closed) return;
83
123
  this.#closed = true;
84
124
  this.#queue.length = 0;
125
+ this.#held = void 0;
85
126
  this.#endpoint.close?.();
86
- const error = new Error(reason);
87
- this.#refuse(new Error(`agent port closed before hello: ${reason}`));
88
- this.#finish(failed ? error : void 0);
127
+ this.#unwelcome(new Error(`agent port closed before hello: ${reason}`));
89
128
  for (const handler of [...this.#closers]) handler(reason);
90
129
  this.#closers.clear();
130
+ this.#finish(this.#mismatch ? otherVersion() : failed ? new Error(reason) : void 0);
91
131
  }
92
132
  }
93
133
  export {
94
- PortLink
134
+ OTHER_VERSION,
135
+ PortLink,
136
+ otherVersion
95
137
  };
96
138
  //# sourceMappingURL=wire.js.map
package/dist/wire.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/wire.ts"],
4
- "sourcesContent": ["import type { Frame as ChordFrame, Link } from '@earendil-works/chord';\n\nexport interface PortEndpoint {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n addEventListener(\n type: 'close' | 'messageerror' | 'error',\n listener: (event: Event) => void\n ): void;\n start?(): void;\n close?(): void;\n}\n\nexport type Frame = { hello: string } | { close: true } | Uint8Array;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction parse(chunk: Uint8Array): ChordFrame {\n const frame = JSON.parse(decoder.decode(chunk)) as { t?: unknown } | null;\n if (frame === null || typeof frame !== 'object' || typeof frame.t !== 'string')\n throw new TypeError('not a chord frame');\n return frame as ChordFrame;\n}\n\nexport class PortLink implements Link {\n readonly hello: Promise<string>;\n readonly ended: Promise<Error | undefined>;\n readonly #endpoint: PortEndpoint;\n readonly #queue: Uint8Array[] = [];\n readonly #closers = new Set<(reason: string) => void>();\n #handler: ((frame: ChordFrame) => void) | undefined;\n #closed = false;\n #greet!: (hello: string) => void;\n #refuse!: (error: Error) => void;\n #finish!: (reason: Error | undefined) => void;\n\n constructor(endpoint: PortEndpoint) {\n this.#endpoint = endpoint;\n this.hello = new Promise((greet, refuse) => {\n this.#greet = greet;\n this.#refuse = refuse;\n });\n this.hello.catch(() => undefined);\n this.ended = new Promise((finish) => {\n this.#finish = finish;\n });\n endpoint.addEventListener('message', ({ data }) => this.#receive(data as Frame));\n const failed = (event: Event) => this.#end(`agent port ${event.type}`, true);\n endpoint.addEventListener('messageerror', failed);\n endpoint.addEventListener('error', failed);\n endpoint.addEventListener('close', () => this.#end('peer closed', false));\n endpoint.start?.();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n greet(serverId: string): void {\n this.#endpoint.postMessage({ hello: serverId } satisfies Frame);\n }\n\n send(frame: ChordFrame): void {\n if (this.#closed) return;\n const bytes = encoder.encode(JSON.stringify(frame));\n this.#endpoint.postMessage(bytes, [bytes.buffer]);\n }\n\n receive(handler: (frame: ChordFrame) => void): void {\n this.#handler = handler;\n for (const chunk of this.#queue.splice(0)) this.#deliver(chunk);\n }\n\n onClose(handler: (reason: string) => void): void {\n if (this.#closed) handler('closed');\n else this.#closers.add(handler);\n }\n\n close(reason = 'closed'): void {\n if (this.#closed) return;\n this.send({ t: 'bye', reason });\n this.#endpoint.postMessage({ close: true } satisfies Frame);\n this.#end(reason, false);\n }\n\n #receive(frame: Frame): void {\n if (this.#closed) return;\n if (frame instanceof Uint8Array) {\n if (this.#handler) this.#deliver(frame);\n else this.#queue.push(frame);\n } else if ('hello' in frame) this.#greet(frame.hello);\n else this.#end('peer closed', false);\n }\n\n #deliver(chunk: Uint8Array): void {\n let frame: ChordFrame;\n try {\n frame = parse(chunk);\n } catch {\n this.close('protocol error');\n return;\n }\n if (frame.t === 'bye') this.#end(frame.reason ?? 'peer closed', false);\n else this.#handler?.(frame);\n }\n\n #end(reason: string, failed: boolean): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#queue.length = 0;\n this.#endpoint.close?.();\n const error = new Error(reason);\n this.#refuse(new Error(`agent port closed before hello: ${reason}`));\n this.#finish(failed ? error : undefined);\n for (const handler of [...this.#closers]) handler(reason);\n this.#closers.clear();\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type Frame as ChordFrame, type Link, PROTOCOL_VERSION } from '@earendil-works/chord';\n\nexport interface PortEndpoint {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;\n addEventListener(\n type: 'close' | 'messageerror' | 'error',\n listener: (event: Event) => void\n ): void;\n start?(): void;\n close?(): void;\n}\n\nexport type Frame = { hello: string } | { close: true } | Uint8Array;\n\nexport const OTHER_VERSION =\n \"That SLICC runs another version of the agent, so this tab can't follow it. Update both SLICCs, then reload this page.\";\n\nexport const otherVersion = (cause?: unknown): Error =>\n Object.assign(new Error(OTHER_VERSION, cause === undefined ? undefined : { cause }), {\n code: 'EVERSION',\n });\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction parse(chunk: Uint8Array): ChordFrame {\n const frame = JSON.parse(decoder.decode(chunk)) as { t?: unknown } | null;\n if (frame === null || typeof frame !== 'object' || typeof frame.t !== 'string')\n throw new TypeError('not a chord frame');\n return frame as ChordFrame;\n}\n\nexport class PortLink implements Link {\n readonly hello: Promise<string>;\n readonly ended: Promise<Error | undefined>;\n readonly #endpoint: PortEndpoint;\n readonly #queue: Uint8Array[] = [];\n readonly #closers = new Set<(reason: string) => void>();\n #handler: ((frame: ChordFrame) => void) | undefined;\n #closed = false;\n #held: Uint8Array[] | undefined;\n #heard = false;\n #legacy = false;\n #mismatch = false;\n #greet!: (hello: string) => void;\n #unwelcome!: (error: Error) => void;\n #finish!: (reason: Error | undefined) => void;\n\n constructor(endpoint: PortEndpoint) {\n this.#endpoint = endpoint;\n this.hello = new Promise((greet, unwelcome) => {\n this.#greet = greet;\n this.#unwelcome = unwelcome;\n });\n this.hello.catch(() => undefined);\n this.ended = new Promise((finish) => {\n this.#finish = finish;\n });\n endpoint.addEventListener('message', ({ data }) => this.#receive(data as Frame));\n const failed = (event: Event) => this.#end(`agent port ${event.type}`, true);\n endpoint.addEventListener('messageerror', failed);\n endpoint.addEventListener('error', failed);\n endpoint.addEventListener('close', () => this.#end('peer closed', false));\n endpoint.start?.();\n }\n\n get closed(): boolean {\n return this.#closed;\n }\n\n greet(serverId: string): void {\n this.#held ??= [];\n this.#endpoint.postMessage({ hello: serverId } satisfies Frame);\n }\n\n mismatched(): void {\n this.#mismatch = true;\n }\n\n send(frame: ChordFrame): number {\n if (this.#closed) return 0;\n const bytes = encoder.encode(JSON.stringify(frame));\n const size = bytes.byteLength;\n if (this.#held) this.#held.push(bytes);\n else this.#post(bytes);\n return size;\n }\n\n #post(bytes: Uint8Array): void {\n this.#endpoint.postMessage(bytes, [bytes.buffer]);\n }\n\n receive(handler: (frame: ChordFrame) => void): void {\n this.#handler = handler;\n for (const chunk of this.#queue.splice(0)) this.#deliver(chunk);\n }\n\n onClose(handler: (reason: string) => void): void {\n if (this.#closed) handler('closed');\n else this.#closers.add(handler);\n }\n\n close(reason = 'closed'): void {\n if (this.#closed) return;\n this.#held = undefined;\n this.send({ t: 'bye', reason });\n this.#endpoint.postMessage({ close: true } satisfies Frame);\n this.#end(reason, false);\n }\n\n #receive(frame: Frame): void {\n if (this.#closed) return;\n if (frame instanceof Uint8Array) {\n if (this.#handler) this.#deliver(frame);\n else this.#queue.push(frame);\n } else if ('hello' in frame) this.#greet(frame.hello);\n else this.#end('peer closed', false);\n }\n\n #deliver(chunk: Uint8Array): void {\n let frame: ChordFrame;\n try {\n frame = parse(chunk);\n } catch {\n this.close('protocol error');\n return;\n }\n if (frame.t === 'bye') this.#end(frame.reason ?? 'peer closed', false);\n else if (!this.#heard) this.#hello(frame);\n else if (this.#legacy) this.#refuse(frame);\n else this.#handler?.(frame);\n }\n\n #hello(frame: ChordFrame): void {\n this.#heard = true;\n const held = this.#held;\n this.#held = undefined;\n if (frame.t !== 'hello' || frame.protocol !== undefined) {\n for (const bytes of held ?? []) this.#post(bytes);\n this.#handler?.(frame);\n return;\n }\n this.#legacy = true;\n this.#mismatch = true;\n if (!held) this.close(`protocol-version ${PROTOCOL_VERSION}`);\n }\n\n #refuse(frame: ChordFrame): void {\n if (frame.t !== 'hold') return;\n const error = { code: 'upgrade_required', message: `upgrade_required: ${OTHER_VERSION}` };\n this.#post(encoder.encode(JSON.stringify({ t: 'gone', id: frame.id, error })));\n }\n\n #end(reason: string, failed: boolean): void {\n if (this.#closed) return;\n this.#closed = true;\n this.#queue.length = 0;\n this.#held = undefined;\n this.#endpoint.close?.();\n this.#unwelcome(new Error(`agent port closed before hello: ${reason}`));\n for (const handler of [...this.#closers]) handler(reason);\n this.#closers.clear();\n this.#finish(this.#mismatch ? otherVersion() : failed ? new Error(reason) : undefined);\n }\n}\n"],
5
+ "mappings": "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",
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.10.1",
3
+ "version": "6.0.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",
@@ -65,7 +65,7 @@
65
65
  "devDependencies": {
66
66
  "@ai-ecoverse/slicc-kernel": "1.110.0",
67
67
  "@ai-ecoverse/slicc-scrub": "1.0.0",
68
- "@ai-ecoverse/slicc-shared-web": "1.23.0",
68
+ "@ai-ecoverse/slicc-shared-web": "1.23.1",
69
69
  "@ai-ecoverse/slicc-spectrum": "1.84.2",
70
70
  "@ai-ecoverse/wasm-bash": "5.3.0-18",
71
71
  "@ai-ecoverse/wasm-coreutils": "9.12.0-8",
@@ -78,12 +78,13 @@
78
78
  "monocart-coverage-reports": "2.13.2",
79
79
  "playwright-core": "1.64.0",
80
80
  "semantic-release": "25.0.9",
81
+ "slicc-agent-5": "npm:@ai-ecoverse/slicc-agent@5.10.0",
81
82
  "typescript": "7.0.2"
82
83
  },
83
84
  "dependencies": {
84
85
  "@ai-ecoverse/slicc-browsers": "1.7.6",
85
86
  "@ai-ecoverse/slicc-vault": "1.9.1",
86
- "@earendil-works/chord": "1.2.0",
87
+ "@earendil-works/chord": "1.3.0",
87
88
  "@earendil-works/pi-ai": "1.3.0",
88
89
  "@earendil-works/pi-codemode": "1.3.0",
89
90
  "@earendil-works/pi-durable": "1.3.0",