@roll-agent/relay-client 0.0.0 → 0.1.1

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.
@@ -0,0 +1 @@
1
+ import{relayInteractionRequestSchemaV11 as t,relayRequestMethodSchemasV11 as e}from"@roll-agent/relay-protocol";import{relayClientErrorCodeSchema as r}from"@roll-agent/relay-protocol/control";import{z as n}from"zod/v4";const a=e["thread.open"].params.def.innerType.shape.threadId,o=e["turn.cancel"].params.def.innerType.shape.turnId,s=e["thread.snapshot"].result;export const RELAY_CONNECTION_STATUSES={idle:"idle",connecting:"connecting",connected:"connected",reconnecting:"reconnecting",closed:"closed"};export const relayConnectionStateSchema=n.discriminatedUnion("status",[n.object({status:n.literal(RELAY_CONNECTION_STATUSES.idle)}).strict().readonly(),n.object({status:n.literal(RELAY_CONNECTION_STATUSES.connecting),attempt:n.number().int().positive()}).strict().readonly(),n.object({status:n.literal(RELAY_CONNECTION_STATUSES.connected),workspaceStatus:n.enum(["online","offline"])}).strict().readonly(),n.object({status:n.literal(RELAY_CONNECTION_STATUSES.reconnecting),attempt:n.number().int().positive(),retryAt:n.string().datetime({offset:!0})}).strict().readonly(),n.object({status:n.literal(RELAY_CONNECTION_STATUSES.closed),reason:n.enum(["client","session","transport","protocol"])}).strict().readonly()]);export const RELAY_CLIENT_TRANSPORT_ERROR_CODES={aborted:"ABORTED",closed:"CLIENT_CLOSED",connectionUnavailable:"CONNECTION_UNAVAILABLE",invalidSession:"INVALID_SESSION",outcomeUnknown:"OUTCOME_UNKNOWN",protocolError:"PROTOCOL_ERROR",requestTimeout:"REQUEST_TIMEOUT",transportError:"TRANSPORT_ERROR",workspaceOffline:"WORKSPACE_OFFLINE"};export const relayClientTransportErrorCodeSchema=n.enum(RELAY_CLIENT_TRANSPORT_ERROR_CODES);const i={message:n.string(),retryable:n.boolean()};export const relayClientErrorDetailsSchema=n.discriminatedUnion("kind",[n.object({kind:n.literal("transport"),...i,code:relayClientTransportErrorCodeSchema}).strict().readonly(),n.object({kind:n.literal("session"),...i,code:r}).strict().readonly(),n.object({kind:n.literal("remote"),...i,code:n.string().min(1)}).strict().readonly()]);export const relayLiveAssistantMessageSchema=n.discriminatedUnion("status",[n.object({status:n.literal("streaming"),streamId:n.string().uuid(),text:n.string()}).strict().readonly(),n.object({status:n.literal("completed"),streamId:n.string().uuid(),text:n.string()}).strict().readonly()]);const l={interactionId:t.options[0].def.innerType.shape.interactionId,threadId:a,turnId:o,method:t.options[0].def.innerType.shape.method.or(t.options[1].def.innerType.shape.method)};export const relayInteractionStateSchema=n.discriminatedUnion("status",[n.object({status:n.literal("pending"),request:t}).strict().readonly(),n.object({status:n.literal("responding"),request:t}).strict().readonly(),n.object({status:n.literal("resolved"),...l}).strict().readonly(),n.object({status:n.literal("cancelled"),...l}).strict().readonly()]);export const relayTurnStateSchema=n.discriminatedUnion("status",[n.object({status:n.literal("idle")}).strict().readonly(),n.object({status:n.literal("running"),turnId:o}).strict().readonly(),n.object({status:n.literal("cancelling"),turnId:o}).strict().readonly(),n.object({status:n.literal("completed"),turnId:o}).strict().readonly(),n.object({status:n.literal("cancelled"),turnId:o}).strict().readonly(),n.object({status:n.literal("failed"),turnId:o,stage:n.enum(["bootstrap","plan","execute"])}).strict().readonly()]);const c={threadId:a,liveAssistantMessages:n.array(relayLiveAssistantMessageSchema).readonly(),interactions:n.array(relayInteractionStateSchema).readonly(),turn:relayTurnStateSchema};export const relayThreadViewSchema=n.discriminatedUnion("status",[n.object({status:n.literal("loading"),...c,snapshot:n.null()}).strict().readonly(),n.object({status:n.literal("ready"),...c,snapshot:s}).strict().readonly(),n.object({status:n.literal("error"),...c,snapshot:s.nullable(),error:relayClientErrorDetailsSchema}).strict().readonly()]);export function getPendingInteractionRequest(t){return"pending"===t.status||"responding"===t.status?t.request:void 0}
@@ -0,0 +1,10 @@
1
+ import { type CreateRelayClientOptions, type RelayClient } from "./client.ts";
2
+ import { type RelayScheduler, type RelaySocketCloseEvent, type RelaySocketHandlers, type RelayTimerHandle, type RelayWebSocketFactory, type RelayWebSocketLike } from "./transport.ts";
3
+ export interface RelayClientTestingOptions {
4
+ readonly createWebSocket: RelayWebSocketFactory;
5
+ readonly createUuid?: () => string;
6
+ readonly scheduler?: RelayScheduler;
7
+ readonly reconnectDelayMs?: (attempt: number) => number;
8
+ }
9
+ export declare function createRelayClientForTesting(options: CreateRelayClientOptions, testing: RelayClientTestingOptions): RelayClient;
10
+ export type { RelayScheduler, RelaySocketCloseEvent, RelaySocketHandlers, RelayTimerHandle, RelayWebSocketFactory, RelayWebSocketLike, };
@@ -0,0 +1 @@
1
+ import{createRelayClientWithRuntime as e}from"./client.js";import{browserRelayRuntimeDependencies as r}from"./transport.js";export function createRelayClientForTesting(t,c){const n={createWebSocket:c.createWebSocket,createUuid:c.createUuid??r.createUuid,scheduler:c.scheduler??r.scheduler,reconnectDelayMs:c.reconnectDelayMs??r.reconnectDelayMs};return e(t,n)}
@@ -0,0 +1,31 @@
1
+ export interface RelaySocketCloseEvent {
2
+ readonly code: number;
3
+ readonly reason: string;
4
+ readonly wasClean: boolean;
5
+ }
6
+ export interface RelaySocketHandlers {
7
+ readonly onOpen: () => void;
8
+ readonly onMessage: (data: unknown) => void;
9
+ readonly onClose: (event: RelaySocketCloseEvent) => void;
10
+ readonly onError: () => void;
11
+ }
12
+ export interface RelayWebSocketLike {
13
+ readonly readyState: number;
14
+ setHandlers(handlers: RelaySocketHandlers): void;
15
+ send(data: string): void;
16
+ close(code?: number, reason?: string): void;
17
+ }
18
+ export type RelayWebSocketFactory = (url: string) => RelayWebSocketLike;
19
+ export type RelayTimerHandle = ReturnType<typeof globalThis.setTimeout>;
20
+ export interface RelayScheduler {
21
+ now(): number;
22
+ setTimer(callback: () => void, delayMs: number): RelayTimerHandle;
23
+ clearTimer(handle: RelayTimerHandle): void;
24
+ }
25
+ export interface RelayClientRuntimeDependencies {
26
+ readonly createWebSocket: RelayWebSocketFactory;
27
+ readonly createUuid: () => string;
28
+ readonly scheduler: RelayScheduler;
29
+ readonly reconnectDelayMs: (attempt: number) => number;
30
+ }
31
+ export declare const browserRelayRuntimeDependencies: RelayClientRuntimeDependencies;
@@ -0,0 +1 @@
1
+ class BrowserRelayWebSocket{#e;constructor(e){this.#e=new WebSocket(e)}get readyState(){return this.#e.readyState}setHandlers(e){this.#e.onopen=()=>{e.onOpen()},this.#e.onmessage=o=>{e.onMessage(o.data)},this.#e.onclose=o=>{e.onClose({code:o.code,reason:o.reason,wasClean:o.wasClean})},this.#e.onerror=()=>{e.onError()}}send(e){this.#e.send(e)}close(e,o){this.#e.close(e,o)}}export const browserRelayRuntimeDependencies={createWebSocket:e=>new BrowserRelayWebSocket(e),createUuid:()=>globalThis.crypto.randomUUID(),scheduler:{now:()=>Date.now(),setTimer:(e,o)=>globalThis.setTimeout(e,o),clearTimer:e=>{globalThis.clearTimeout(e)}},reconnectDelayMs:e=>Math.min(3e4,250*2**Math.min(e-1,7))};
package/package.json CHANGED
@@ -1,12 +1,47 @@
1
1
  {
2
2
  "name": "@roll-agent/relay-client",
3
- "version": "0.0.0",
4
- "description": "Bootstrap placeholder that creates this package on npm so Trusted Publishing can be configured. Contains no code; real releases start at 0.1.0.",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "sideEffects": false,
5
6
  "repository": {
6
7
  "type": "git",
7
8
  "url": "https://github.com/steveoon/roll-agent"
8
9
  },
10
+ "homepage": "https://github.com/steveoon/roll-agent",
11
+ "bugs": {
12
+ "url": "https://github.com/steveoon/roll-agent/issues"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "./testing": {
20
+ "types": "./dist/testing.d.ts",
21
+ "default": "./dist/testing.js"
22
+ }
23
+ },
9
24
  "publishConfig": {
10
25
  "access": "public"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "engines": {
31
+ "node": ">=22.6.0"
32
+ },
33
+ "dependencies": {
34
+ "zod": "3.25.76",
35
+ "@roll-agent/relay-protocol": "0.3.1"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^22.0.0",
39
+ "esbuild": "0.28.1"
40
+ },
41
+ "scripts": {
42
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/obfuscate.mjs",
43
+ "typecheck": "tsc --noEmit",
44
+ "test": "node --experimental-strip-types --test \"src/**/*.test.ts\"",
45
+ "clean": "rm -rf dist"
11
46
  }
12
- }
47
+ }