@ziprack/sdk 0.1.1 → 0.1.2
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/dist/broadcast/index.d.ts +8 -1
- package/dist/core/mock/MockRack.d.ts +6 -0
- package/dist/core/types.d.ts +4 -0
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/{store-DSV5q7C7.js → store-BXGon4iJ.js} +15 -5
- package/dist/store-BXGon4iJ.js.map +1 -0
- package/dist/testing.js +1 -1
- package/dist/ziprack-sdk.iife.js +1 -1
- package/dist/ziprack-sdk.iife.js.map +1 -1
- package/package.json +1 -1
- package/dist/store-DSV5q7C7.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Link } from '../core/link';
|
|
2
|
-
import type { AckResult, JsonObject, LaunchRoom, RackEvent, RoomMember, RoomRole, RoomStatus } from '../core/types';
|
|
2
|
+
import type { AckResult, JsonObject, LaunchRoom, RackEvent, RoomInvite, RoomMember, RoomRole, RoomStatus } from '../core/types';
|
|
3
3
|
export declare const ROOM_CHANNEL = "$room";
|
|
4
4
|
export type RoomEventName = 'presence' | 'state' | 'role' | 'status';
|
|
5
5
|
export interface RoomEvents {
|
|
@@ -68,6 +68,13 @@ export declare class BroadcastApi {
|
|
|
68
68
|
/** Locally known state (launch snapshot plus pushed updates). */
|
|
69
69
|
snapshot: () => JsonObject;
|
|
70
70
|
};
|
|
71
|
+
/**
|
|
72
|
+
* Where the next person scans to get in. Only the Rack knows its own host
|
|
73
|
+
* and join prefix, so it hands back the code and the URL; rendering them as
|
|
74
|
+
* a slide, a link or a QR is yours. Refused with `conflict` once the room is
|
|
75
|
+
* locked or closed, so a stale QR can be taken down.
|
|
76
|
+
*/
|
|
77
|
+
invite(): Promise<AckResult<RoomInvite>>;
|
|
71
78
|
/** Claim the facilitator role (opt_in rooms). */
|
|
72
79
|
claim(): Promise<AckResult<{
|
|
73
80
|
role: RoomRole;
|
|
@@ -131,6 +131,12 @@ export declare class MockRack {
|
|
|
131
131
|
/** An earlier facilitator wins; a later optimistic one steps down. */
|
|
132
132
|
private reconcileFacilitator;
|
|
133
133
|
private onRoomMessage;
|
|
134
|
+
/**
|
|
135
|
+
* A mock room is two tabs of the dev server, so the invite is this page:
|
|
136
|
+
* scan it and the second tab joins over BroadcastChannel, exactly as the
|
|
137
|
+
* real join URL would.
|
|
138
|
+
*/
|
|
139
|
+
private invite;
|
|
134
140
|
private setRole;
|
|
135
141
|
private publish;
|
|
136
142
|
private stateSet;
|
package/dist/core/types.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as f, c as h, i as g, a as u, M as l, b as w, L as b } from "./store-
|
|
2
|
-
import { F as K, P as V, d as W } from "./store-
|
|
1
|
+
import { n as f, c as h, i as g, a as u, M as l, b as w, L as b } from "./store-BXGon4iJ.js";
|
|
2
|
+
import { F as K, P as V, d as W } from "./store-BXGon4iJ.js";
|
|
3
3
|
class v {
|
|
4
4
|
constructor(t) {
|
|
5
5
|
this.link = t;
|
|
@@ -189,6 +189,15 @@ class T {
|
|
|
189
189
|
const t = await this.link.send("broadcast:presence", {});
|
|
190
190
|
return t.ok && t.data && (this.localMembers = t.data.members), t;
|
|
191
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Where the next person scans to get in. Only the Rack knows its own host
|
|
194
|
+
* and join prefix, so it hands back the code and the URL; rendering them as
|
|
195
|
+
* a slide, a link or a QR is yours. Refused with `conflict` once the room is
|
|
196
|
+
* locked or closed, so a stale QR can be taken down.
|
|
197
|
+
*/
|
|
198
|
+
invite() {
|
|
199
|
+
return this.link.send("broadcast:invite", {});
|
|
200
|
+
}
|
|
192
201
|
/** Claim the facilitator role (opt_in rooms). */
|
|
193
202
|
claim() {
|
|
194
203
|
return this.link.send("broadcast:claim", {});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/activity/index.ts","../src/ai/index.ts","../src/attempt/index.ts","../src/auth/index.ts","../src/broadcast/index.ts","../src/core/link.ts","../src/db/index.ts","../src/media/index.ts","../src/storage/index.ts","../src/core/bridge.ts","../src/core/rack.ts","../src/index.ts"],"sourcesContent":["import type { Link } from '../core/link';\nimport type { AckResult, JsonObject, LaunchActivity } from '../core/types';\n\nexport interface StatementInput {\n verb: string;\n activity: { id: string; type?: string };\n result?: JsonObject;\n context?: JsonObject;\n occurred_at?: string;\n}\n\nexport interface AnswerOptions {\n type?: string;\n context?: JsonObject;\n}\n\n/**\n * activity@1 — append-only statements. Answers are statements, not state.\n */\nexport class ActivityApi {\n public constructor(private readonly link: Link) {}\n\n /** The manifest's declared activities for this version. */\n public activities(): LaunchActivity[] {\n return this.link.launch()?.activity?.activities ?? [];\n }\n\n public activity(id: string): LaunchActivity | null {\n return this.activities().find((a) => a.id === id) ?? null;\n }\n\n public statement(input: StatementInput): Promise<AckResult<{ id: string }>> {\n return this.link.send<{ id: string }>('activity:statement', {\n ...input,\n occurred_at: input.occurred_at ?? new Date().toISOString(),\n });\n }\n\n /** `answered` statement with the value in result.response — the only field reporting reads. */\n public answer(activityId: string, response: unknown, options: AnswerOptions = {}): Promise<AckResult<{ id: string }>> {\n return this.statement({\n verb: 'answered',\n activity: { id: activityId, type: options.type ?? this.activity(activityId)?.type },\n result: { response },\n context: options.context,\n });\n }\n\n /** `progressed` statement with activity.type = 'step'. */\n public progress(stepId: string, context?: JsonObject): Promise<AckResult<{ id: string }>> {\n return this.statement({ verb: 'progressed', activity: { id: stepId, type: 'step' }, context });\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, JsonObject } from '../core/types';\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport interface ChatReply {\n message_id: string;\n text: string;\n usage: Usage;\n}\n\nexport class Chat {\n public constructor(private readonly link: Link, public readonly promptId: string) {}\n\n /**\n * Send a participant message. onDelta receives text as it streams; the\n * resolved result carries the full text.\n */\n public async send(message: string, onDelta?: (delta: string, soFar: string) => void): Promise<AckResult<ChatReply>> {\n let text = '';\n const result = await this.link.send<Partial<ChatReply>>('ai:chat', { prompt: this.promptId, message }, {\n timeoutMs: 60_000,\n onPartial: (chunk) => {\n const delta = typeof chunk.delta === 'string' ? chunk.delta : '';\n text += delta;\n onDelta?.(delta, text);\n },\n });\n\n if (!result.ok) {\n return result as AckResult<ChatReply>;\n }\n\n return {\n ok: true,\n data: {\n message_id: String(result.data?.message_id ?? ''),\n text: result.data?.text ?? text,\n usage: result.data?.usage ?? { input_tokens: 0, output_tokens: 0 },\n },\n };\n }\n\n public reset(): Promise<AckResult> {\n return this.link.send('ai:chat.reset', { prompt: this.promptId });\n }\n}\n\n/**\n * ai@1 — declared prompt templates. The applet supplies variables, never\n * instructions; model, prompt and budget are Rack-owned.\n */\nexport class AiApi {\n public constructor(private readonly link: Link) {}\n\n public prompts(): Array<{ id: string; mode: 'analysis' | 'chat' }> {\n return this.link.launch()?.ai?.prompts ?? [];\n }\n\n /** Analysis prompt: structured JSON conforming to the declared output_schema. */\n public ask<T extends object = JsonObject>(promptId: string, vars: JsonObject = {}): Promise<AckResult<{ output: T; usage: Usage }>> {\n return this.link.send<{ output: T; usage: Usage }>('ai:ask', { prompt: promptId, vars }, { timeoutMs: 60_000 });\n }\n\n /** Chat prompt: conversation history is held by the Rack. */\n public chat(promptId: string): Chat {\n return new Chat(this.link, promptId);\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, AttemptStatus, JsonObject, LaunchAttempt } from '../core/types';\n\n/**\n * attempt@1 — lifecycle, resume state, completion. Declaring it also pins\n * every participant to the version they started on.\n */\nexport class AttemptApi {\n private local: Partial<LaunchAttempt> = {};\n\n public constructor(private readonly link: Link) {}\n\n /** The attempt as launched, with local updates applied. */\n public current(): LaunchAttempt | null {\n const launched = this.link.launch()?.attempt;\n\n return launched ? { ...launched, ...this.local } : null;\n }\n\n public get status(): AttemptStatus | null {\n return this.current()?.status ?? null;\n }\n\n public get id(): number | null {\n return this.current()?.id ?? null;\n }\n\n /** Resume state exactly as last saved. */\n public state<T extends object = JsonObject>(): T | null {\n return (this.current()?.state as T | null) ?? null;\n }\n\n public segment(): Record<string, string> | null {\n return this.current()?.segment ?? null;\n }\n\n /** Save resume state (max 64 KB). Send after every transition; the shell coalesces bursts. */\n public setState(state: JsonObject): Promise<AckResult> {\n this.local.state = state;\n\n return this.link.send('attempt:state', { state });\n }\n\n /** Set segment dimensions (max 20 keys, string values). */\n public setSegment(segment: Record<string, string>): Promise<AckResult> {\n this.local.segment = segment;\n\n return this.link.send('attempt:segment', { segment });\n }\n\n /** Mark the attempt completed. Idempotent. */\n public async complete(summary?: JsonObject): Promise<AckResult<{ status: AttemptStatus; completed_at: string | null }>> {\n const result = await this.link.send<{ status: AttemptStatus; completed_at: string | null }>('attempt:complete', { summary: summary ?? null });\n if (result.ok) {\n this.local.status = 'completed';\n }\n\n return result;\n }\n}\n","import type { Link } from '../core/link';\nimport type { LaunchUser } from '../core/types';\n\n/**\n * auth@1 — who the participant is and the profile attributes the Rack chose to\n * release. Attributes the manifest requested but the Rack withheld are simply\n * absent; degrade gracefully.\n */\nexport class AuthApi {\n public constructor(private readonly link: Link) {}\n\n public user(): LaunchUser | null {\n return this.link.launch()?.auth?.user ?? null;\n }\n\n /** A released profile attribute, or the fallback when withheld. */\n public attribute<T = unknown>(key: string, fallback: T | null = null): T | null {\n const user = this.user();\n if (!user || !(key in user)) {\n return fallback;\n }\n\n return user[key] as T;\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, JsonObject, LaunchBroadcast, LaunchRoom, RackEvent, RoomMember, RoomRole, RoomStatus } from '../core/types';\n\nexport const ROOM_CHANNEL = '$room';\n\ntype Listener = (payload: unknown, from: RackEvent['from']) => void;\n\nexport type RoomEventName = 'presence' | 'state' | 'role' | 'status';\n\nexport interface RoomEvents {\n presence: { members: RoomMember[] };\n state: { key: string; value: unknown; version: number };\n role: { role: RoomRole; participant_id: number };\n status: { status: RoomStatus };\n}\n\nexport class Channel {\n private readonly listeners = new Map<string, Set<Listener>>();\n\n private unsubscribe: (() => void) | null = null;\n\n public constructor(private readonly link: Link, public readonly name: string) {}\n\n /** @internal */\n public attach(): void {\n this.unsubscribe ??= this.link.onEvent((event) => {\n if (event.channel !== this.name) {\n return;\n }\n this.listeners.get(event.event)?.forEach((l) => l(event.payload, event.from));\n this.listeners.get('*')?.forEach((l) => l({ event: event.event, payload: event.payload }, event.from));\n });\n }\n\n /** Listen for an event on this channel ('*' for all). Returns an unsubscribe function. */\n public listen<T = unknown>(event: string, callback: (payload: T, from: RackEvent['from']) => void): () => void {\n const set = this.listeners.get(event) ?? new Set<Listener>();\n set.add(callback as Listener);\n this.listeners.set(event, set);\n\n return () => {\n set.delete(callback as Listener);\n };\n }\n\n /** Publish to everyone in the room. Facilitator-only events are enforced by the Rack. */\n public publish(event: string, payload: unknown = {}): Promise<AckResult> {\n return this.link.send('broadcast:publish', { channel: this.name, event, payload });\n }\n\n public async leave(): Promise<AckResult> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.listeners.clear();\n\n return this.link.send('broadcast:leave', { channel: this.name });\n }\n}\n\n/**\n * broadcast@1 — rooms, presence, facilitator control and shared state. The\n * Rack holds the WebSocket; the applet only ever sees postMessage.\n */\nexport class BroadcastApi {\n private readonly channels = new Map<string, Channel>();\n\n private readonly roomListeners = new Map<RoomEventName, Set<(payload: unknown) => void>>();\n\n private localRole: RoomRole | null = null;\n\n private localMembers: RoomMember[] | null = null;\n\n private localState: JsonObject | null = null;\n\n private detach: (() => void) | null = null;\n\n public constructor(private readonly link: Link) {}\n\n public get room(): LaunchRoom | null {\n return this.launch()?.room ?? null;\n }\n\n public get role(): RoomRole | null {\n return this.localRole ?? this.launch()?.role ?? null;\n }\n\n public get isFacilitator(): boolean {\n return this.role === 'facilitator';\n }\n\n public members(): RoomMember[] {\n return this.localMembers ?? this.launch()?.members ?? [];\n }\n\n /** Join a named channel within the room (default \"main\"). */\n public async join(channel = 'main'): Promise<Channel> {\n this.ensureRoomListener();\n let instance = this.channels.get(channel);\n if (!instance) {\n instance = new Channel(this.link, channel);\n this.channels.set(channel, instance);\n }\n instance.attach();\n await this.link.send('broadcast:join', { channel });\n\n return instance;\n }\n\n /** Who is in the room, by role. */\n public async presence(): Promise<AckResult<{ members: RoomMember[] }>> {\n const result = await this.link.send<{ members: RoomMember[] }>('broadcast:presence', {});\n if (result.ok && result.data) {\n this.localMembers = result.data.members;\n }\n\n return result;\n }\n\n public readonly state = {\n /** Server-arbitrated shared state. */\n get: async (keys?: string[]): Promise<AckResult<{ state: JsonObject }>> => {\n const result = await this.link.send<{ state: JsonObject }>('broadcast:state.get', keys ? { keys } : {});\n if (result.ok && result.data) {\n this.localState = { ...(this.localState ?? {}), ...result.data.state };\n }\n\n return result;\n },\n /** Last write wins at the key; the Rack stamps the version. */\n set: (key: string, value: unknown): Promise<AckResult<{ version: number }>> => {\n this.localState = { ...(this.localState ?? this.launch()?.state ?? {}), [key]: value };\n\n return this.link.send<{ version: number }>('broadcast:state.set', { key, value });\n },\n /** Locally known state (launch snapshot plus pushed updates). */\n snapshot: (): JsonObject => this.localState ?? this.launch()?.state ?? {},\n };\n\n /** Claim the facilitator role (opt_in rooms). */\n public claim(): Promise<AckResult<{ role: RoomRole }>> {\n return this.link.send('broadcast:claim', {});\n }\n\n /** Hand the facilitator role to another member. */\n public transfer(participantId: number): Promise<AckResult> {\n return this.link.send('broadcast:transfer', { to: participantId });\n }\n\n /** Room-level events: presence, state, role, status. */\n public on<K extends RoomEventName>(event: K, callback: (payload: RoomEvents[K]) => void): () => void {\n this.ensureRoomListener();\n const set = this.roomListeners.get(event) ?? new Set();\n set.add(callback as (payload: unknown) => void);\n this.roomListeners.set(event, set);\n\n return () => {\n set.delete(callback as (payload: unknown) => void);\n };\n }\n\n private launch(): LaunchBroadcast | null {\n return this.link.launch()?.broadcast ?? null;\n }\n\n private ensureRoomListener(): void {\n this.detach ??= this.link.onEvent((event) => {\n if (event.channel !== ROOM_CHANNEL) {\n return;\n }\n const payload = event.payload as JsonObject;\n if (event.event === 'presence' && Array.isArray(payload.members)) {\n this.localMembers = payload.members as RoomMember[];\n }\n if (event.event === 'state' && typeof payload.key === 'string') {\n this.localState = { ...(this.localState ?? this.launch()?.state ?? {}), [payload.key]: payload.value };\n }\n if (event.event === 'role' && payload.participant_id === this.link.launch()?.actor.id) {\n this.localRole = payload.role as RoomRole;\n }\n this.roomListeners.get(event.event as RoomEventName)?.forEach((l) => l(payload));\n });\n }\n}\n","import type { AckResult, JsonObject, LaunchData, RackEvent, SendOptions } from './types';\n\n/**\n * What a capability module needs from the client: send/fire, the launch data,\n * event subscription and the declared-capability check.\n */\nexport interface Link {\n send<T = JsonObject>(type: string, payload: unknown, options?: SendOptions): Promise<AckResult<T>>;\n fire(type: string, payload?: unknown): void;\n launch(): LaunchData | null;\n declares(capability: string): boolean;\n onEvent(listener: (event: RackEvent) => void): () => void;\n mode(): 'host' | 'mock' | 'pending';\n}\n\nexport function notDeclared<T = JsonObject>(capability: string): AckResult<T> {\n return { ok: false, error: 'undeclared_capability', message: `The manifest does not declare the [${capability}] capability.` };\n}\n","import { notDeclared, type Link } from '../core/link';\nimport type { AckResult, JsonObject } from '../core/types';\n\nexport type WhereOperator = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'in';\n\nexport type WhereClause = [path: string, operator: WhereOperator, value: unknown];\n\nexport interface ListQuery {\n /** Filters on paths declared in the collection's `indexed` list. */\n where?: WhereClause[];\n orderBy?: string;\n direction?: 'asc' | 'desc';\n /** Max 100. */\n limit?: number;\n cursor?: string | null;\n}\n\nexport interface RecordRow<T extends object = JsonObject> {\n id: string;\n data: T;\n owner_id: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface ListResult<T extends object = JsonObject> {\n records: RecordRow<T>[];\n nextCursor: string | null;\n}\n\nexport class Collection<T extends object = JsonObject> {\n public constructor(private readonly link: Link, public readonly name: string) {}\n\n public create(data: T): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:create', { data });\n }\n\n public get(id: string): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:get', { id });\n }\n\n /** Merge by default; pass { merge: false } to replace the whole document. */\n public update(id: string, data: Partial<T>, options: { merge?: boolean } = {}): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:update', { id, data, merge: options.merge ?? true });\n }\n\n public delete(id: string): Promise<AckResult<{ id: string }>> {\n return this.send('db:delete', { id });\n }\n\n public list(query: ListQuery = {}): Promise<AckResult<ListResult<T>>> {\n return this.send('db:list', query);\n }\n\n public count(query: Pick<ListQuery, 'where'> = {}): Promise<AckResult<{ count: number }>> {\n return this.send('db:count', query);\n }\n\n private send<R>(type: string, payload: object): Promise<AckResult<R>> {\n if (this.link.launch() && !this.link.declares('db')) {\n return Promise.resolve(notDeclared<R>('db'));\n }\n\n return this.link.send<R>(type, { collection: this.name, ...payload });\n }\n}\n\n/**\n * db@1 — CRUD records in collections the manifest declares, each with a JSON\n * Schema and a scope (attempt | user | room | applet).\n */\nexport class DbApi {\n public constructor(private readonly link: Link) {}\n\n public collection<T extends object = JsonObject>(name: string): Collection<T> {\n return new Collection<T>(this.link, name);\n }\n\n public collections(): Array<{ name: string; scope: string }> {\n return this.link.launch()?.db?.collections ?? [];\n }\n}\n","import type { Link } from '../core/link';\nimport type { MediaEmbed } from '../core/types';\n\n/**\n * Declared media. The Rack builds every player URL; the applet references\n * media by id only. Needs no capability.\n */\nexport class MediaApi {\n public constructor(private readonly link: Link) {}\n\n public get(id: string): MediaEmbed | null {\n return this.link.launch()?.media?.[id] ?? null;\n }\n\n /** Player URL for an <iframe src>. Null when the id is not declared. */\n public embedUrl(id: string): string | null {\n return this.get(id)?.embedUrl ?? null;\n }\n\n public all(): Record<string, MediaEmbed> {\n return this.link.launch()?.media ?? {};\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult } from '../core/types';\n\nexport type FileStatus = 'pending' | 'clean' | 'infected' | 'failed';\n\nexport interface StoredFile {\n id: string;\n upload: string;\n name: string;\n mime: string;\n bytes: number;\n status: FileStatus;\n created_at: string;\n}\n\n/**\n * storage@1 — participant uploads. The File travels to the shell by\n * structured clone; the Rack scans it before it becomes addressable.\n */\nexport class StorageApi {\n public constructor(private readonly link: Link) {}\n\n public uploads(): Array<{ name: string; scope: string; mime: string[]; max_bytes: number }> {\n return this.link.launch()?.storage?.uploads ?? [];\n }\n\n /** Upload into a declared upload slot. Resolves once stored (status may still be pending scan). */\n public put(upload: string, file: File | Blob, meta: Record<string, unknown> = {}): Promise<AckResult<{ file: StoredFile }>> {\n const name = file instanceof File ? file.name : 'blob';\n\n return this.link.send<{ file: StoredFile }>('storage:put', { upload, file, name, mime: file.type, bytes: file.size, meta }, { timeoutMs: 120_000 });\n }\n\n /** Short-lived URL for a clean file. Never an object key. */\n public url(id: string): Promise<AckResult<{ url: string; expires_at: string }>> {\n return this.link.send('storage:url', { id });\n }\n\n public list(upload?: string): Promise<AckResult<{ files: StoredFile[] }>> {\n return this.link.send('storage:list', upload ? { upload } : {});\n }\n\n public delete(id: string): Promise<AckResult<{ id: string }>> {\n return this.link.send('storage:delete', { id });\n }\n}\n","import { createEnvelope, isEnvelope, newRequestId, type Envelope } from './protocol';\nimport type { AckPayload, AckResult, JsonObject, LaunchData, RackEvent, SendOptions, Transport } from './types';\n\ninterface PendingRequest {\n resolve: (result: AckResult) => void;\n timer: ReturnType<typeof setTimeout>;\n timeoutMs: number;\n onPartial?: (chunk: JsonObject) => void;\n}\n\nexport interface BridgeOptions {\n ackTimeoutMs: number;\n /** Window-like object to post to. Defaults to window.parent. */\n target?: Pick<Window, 'postMessage'>;\n /** Whether a MessageEvent came from the host. Defaults to event.source === window.parent. */\n isHost?: (source: MessageEventSource | null) => boolean;\n /** Where to listen for messages. Defaults to window. */\n listenOn?: Pick<Window, 'addEventListener' | 'removeEventListener'>;\n}\n\n/**\n * postMessage transport used inside the Rack's iframe.\n *\n * Only messages whose source is the parent window are honoured; the applet\n * never inspects event.origin because its own origin is opaque by design.\n */\nexport class HostBridge implements Transport {\n public readonly kind = 'host' as const;\n\n private readonly pending = new Map<string, PendingRequest>();\n\n private readonly eventListeners = new Set<(event: RackEvent) => void>();\n\n private launchResolvers: Array<(data: LaunchData) => void> = [];\n\n private launchData: LaunchData | null = null;\n\n private readonly target: Pick<Window, 'postMessage'>;\n\n private readonly isHost: (source: MessageEventSource | null) => boolean;\n\n private readonly listenOn: Pick<Window, 'addEventListener' | 'removeEventListener'>;\n\n private readonly listener = (event: MessageEvent): void => this.onMessage(event);\n\n public constructor(private readonly options: BridgeOptions) {\n this.target = options.target ?? window.parent;\n this.isHost = options.isHost ?? ((source) => source === window.parent);\n this.listenOn = options.listenOn ?? window;\n this.listenOn.addEventListener('message', this.listener as EventListener);\n }\n\n public announceReady(): void {\n this.fire('rack:ready', {});\n }\n\n public waitForLaunch(timeoutMs: number): Promise<LaunchData | null> {\n if (this.launchData) {\n return Promise.resolve(this.launchData);\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n this.launchResolvers = this.launchResolvers.filter((r) => r !== onLaunch);\n resolve(null);\n }, timeoutMs);\n const onLaunch = (data: LaunchData): void => {\n clearTimeout(timer);\n resolve(data);\n };\n this.launchResolvers.push(onLaunch);\n });\n }\n\n public send<T = JsonObject>(type: string, payload: unknown, options: SendOptions = {}): Promise<AckResult<T>> {\n const requestId = newRequestId();\n const timeoutMs = options.timeoutMs ?? this.options.ackTimeoutMs;\n\n return new Promise((resolve) => {\n const request: PendingRequest = {\n resolve: resolve as (result: AckResult) => void,\n timer: setTimeout(() => this.expire(requestId), timeoutMs),\n timeoutMs,\n onPartial: options.onPartial,\n };\n this.pending.set(requestId, request);\n this.post(createEnvelope(type, payload, requestId));\n });\n }\n\n public fire(type: string, payload: unknown = {}): void {\n this.post(createEnvelope(type, payload));\n }\n\n public onEvent(listener: (event: RackEvent) => void): () => void {\n this.eventListeners.add(listener);\n\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n public dispose(): void {\n this.listenOn.removeEventListener('message', this.listener as EventListener);\n for (const [requestId, request] of this.pending) {\n clearTimeout(request.timer);\n request.resolve({ ok: false, error: 'disposed' });\n this.pending.delete(requestId);\n }\n }\n\n private expire(requestId: string): void {\n const request = this.pending.get(requestId);\n if (!request) {\n return;\n }\n this.pending.delete(requestId);\n request.resolve({ ok: false, error: 'timeout' });\n }\n\n private post(envelope: Envelope): void {\n this.target.postMessage(envelope, '*');\n }\n\n private onMessage(event: MessageEvent): void {\n if (!this.isHost(event.source) || !isEnvelope(event.data)) {\n return;\n }\n const envelope = event.data;\n\n if (envelope.type === 'rack:launch') {\n this.launchData = envelope.payload as LaunchData;\n const resolvers = this.launchResolvers;\n this.launchResolvers = [];\n resolvers.forEach((resolve) => resolve(this.launchData as LaunchData));\n\n return;\n }\n\n if (envelope.type === 'rack:event') {\n const payload = envelope.payload as RackEvent;\n this.eventListeners.forEach((listener) => listener(payload));\n\n return;\n }\n\n if (envelope.type === 'rack:ack') {\n this.onAck(envelope.payload as AckPayload);\n }\n }\n\n private onAck(ack: AckPayload): void {\n const request = this.pending.get(ack.requestId);\n if (!request) {\n return;\n }\n\n // A Rack that opens a stream acks the request twice: once to say the\n // stream is live, then once more when it finishes. Only the second one\n // settles the promise.\n if (!ack.done && (ack.data as { stream?: boolean } | undefined)?.stream === true) {\n clearTimeout(request.timer);\n request.timer = setTimeout(() => this.expire(ack.requestId), request.timeoutMs);\n\n return;\n }\n\n if (ack.partial && !ack.done) {\n const { requestId: _id, ok: _ok, partial: _partial, ...chunk } = ack;\n request.onPartial?.(chunk as JsonObject);\n clearTimeout(request.timer);\n request.timer = setTimeout(() => this.expire(ack.requestId), request.timeoutMs);\n\n return;\n }\n\n clearTimeout(request.timer);\n this.pending.delete(ack.requestId);\n\n const { requestId: _id, ok, data, error, message, details, partial: _partial, done: _done, ...rest } = ack;\n request.resolve({ ok, data: (data ?? (Object.keys(rest).length ? rest : undefined)) as JsonObject | undefined, error, message, details });\n }\n}\n","import { ActivityApi } from '../activity';\nimport { AiApi } from '../ai';\nimport { AttemptApi } from '../attempt';\nimport { AuthApi } from '../auth';\nimport { BroadcastApi } from '../broadcast';\nimport { DbApi } from '../db';\nimport { MediaApi } from '../media';\nimport { StorageApi } from '../storage';\nimport { HostBridge } from './bridge';\nimport { notDeclared, type Link } from './link';\nimport { MockRack, type AiMockHandler, type MockManifest } from './mock/MockRack';\nimport { MockTransport } from './mock/MockTransport';\nimport { LocalStore } from './mock/store';\nimport { capabilityOf } from './protocol';\nimport type { AckResult, InitOptions, JsonObject, LaunchData, LaunchListener, RackEvent, SendOptions, Transport } from './types';\n\nconst DEFAULT_LAUNCH_TIMEOUT_MS = 3000;\nconst DEFAULT_ACK_TIMEOUT_MS = 5000;\n\ninterface QueuedCall {\n type: string;\n payload: unknown;\n options?: SendOptions;\n resolve: (result: AckResult) => void;\n}\n\n/**\n * The SDK entry point. One instance per applet; `Rack` is the default singleton.\n *\n * Every capability is a message the Rack services. The applet asks; the Rack\n * decides, enforces and persists. Nothing here ever throws on a Rack error:\n * calls resolve to { ok: false, error }.\n */\nexport class RackClient {\n public readonly auth: AuthApi;\n\n public readonly attempt: AttemptApi;\n\n public readonly activity: ActivityApi;\n\n public readonly db: DbApi;\n\n public readonly storage: StorageApi;\n\n public readonly ai: AiApi;\n\n public readonly broadcast: BroadcastApi;\n\n public readonly media: MediaApi;\n\n /** Dev-only hooks that only take effect in mock mode. */\n public readonly mock: {\n /** Answer an ai prompt yourself instead of the schema stub. */\n ai: (promptId: string, handler: AiMockHandler) => void;\n /** Clear a completed mock attempt so the experience can be replayed. */\n resetAttempt: () => void;\n /** The MockRack when running standalone, else null. */\n rack: () => MockRack | null;\n };\n\n private transport: Transport | null = null;\n\n private initPromise: Promise<LaunchData> | null = null;\n\n private launchData: LaunchData | null = null;\n\n private readonly queue: QueuedCall[] = [];\n\n private readonly launchListeners = new Set<LaunchListener>();\n\n private readonly eventListeners = new Set<(event: RackEvent) => void>();\n\n private pendingAiMocks: Array<[string, AiMockHandler]> = [];\n\n public constructor() {\n const link: Link = {\n send: (type, payload, options) => this.send(type, payload, options),\n fire: (type, payload) => this.fire(type, payload),\n launch: () => this.launchData,\n declares: (capability) => this.declares(capability),\n onEvent: (listener) => this.on('event', listener),\n mode: () => this.mode,\n };\n\n this.auth = new AuthApi(link);\n this.attempt = new AttemptApi(link);\n this.activity = new ActivityApi(link);\n this.db = new DbApi(link);\n this.storage = new StorageApi(link);\n this.ai = new AiApi(link);\n this.broadcast = new BroadcastApi(link);\n this.media = new MediaApi(link);\n\n this.mock = {\n ai: (promptId, handler) => {\n const rack = this.mockRack();\n rack ? rack.mockAi(promptId, handler) : this.pendingAiMocks.push([promptId, handler]);\n },\n resetAttempt: () => this.mockRack()?.resetAttempt(),\n rack: () => this.mockRack(),\n };\n }\n\n /**\n * Handshake with the Rack. Resolves with launch data once the Rack answers,\n * or with mock launch data when running standalone. Safe to call repeatedly.\n */\n public init(options: InitOptions = {}): Promise<LaunchData> {\n this.initPromise ??= this.performInit(options);\n\n return this.initPromise;\n }\n\n public get launched(): boolean {\n return this.launchData !== null;\n }\n\n public get mode(): 'host' | 'mock' | 'pending' {\n return this.transport?.kind ?? 'pending';\n }\n\n public getLaunchData(): LaunchData | null {\n return this.launchData;\n }\n\n /** Whether the manifest declared a capability (any version). */\n public declares(capability: string): boolean {\n return (this.launchData?.capabilities ?? []).some((ref) => ref.split('@')[0] === capability);\n }\n\n public on(event: 'launch', listener: LaunchListener): () => void;\n\n public on(event: 'event', listener: (event: RackEvent) => void): () => void;\n\n public on(event: 'launch' | 'event', listener: LaunchListener | ((event: RackEvent) => void)): () => void {\n if (event === 'launch') {\n const l = listener as LaunchListener;\n this.launchListeners.add(l);\n if (this.launchData) {\n l(this.launchData);\n }\n\n return () => {\n this.launchListeners.delete(l);\n };\n }\n\n const l = listener as (event: RackEvent) => void;\n this.eventListeners.add(l);\n\n return () => {\n this.eventListeners.delete(l);\n };\n }\n\n /** Ask the Rack to leave the applet. Needs no capability. */\n public eject(): void {\n this.fire('rack:eject', {});\n if (this.transport?.kind === 'mock') {\n console.info('[ziprack mock] eject: the Rack would navigate away now.');\n }\n }\n\n /** Low-level: send any message and await its ack. Capability calls go through the typed APIs. */\n public send<T = JsonObject>(type: string, payload: unknown, options?: SendOptions): Promise<AckResult<T>> {\n if (this.launchData && !type.startsWith('rack:') && !this.declares(capabilityOf(type))) {\n return Promise.resolve(notDeclared<T>(capabilityOf(type)));\n }\n if (this.transport) {\n return this.transport.send<T>(type, payload, options);\n }\n\n return new Promise((resolve) => {\n this.queue.push({ type, payload, options, resolve: resolve as (result: AckResult) => void });\n });\n }\n\n public fire(type: string, payload: unknown = {}): void {\n if (this.transport) {\n this.transport.fire(type, payload);\n\n return;\n }\n void this.send(type, payload);\n }\n\n /** Tear down (tests). */\n public dispose(): void {\n this.transport?.dispose();\n this.transport = null;\n this.initPromise = null;\n this.launchData = null;\n }\n\n private async performInit(options: InitOptions): Promise<LaunchData> {\n const ackTimeoutMs = options.ackTimeoutMs ?? DEFAULT_ACK_TIMEOUT_MS;\n const launchTimeoutMs = options.launchTimeoutMs ?? DEFAULT_LAUNCH_TIMEOUT_MS;\n\n if (options.transport) {\n const launch = options.launch\n ?? (options.transport instanceof MockTransport ? options.transport.rack.launchData() : null);\n if (!launch) {\n throw new Error('init({ transport }) needs `launch` data unless the transport is a MockTransport.');\n }\n\n return this.activate(options.transport, launch);\n }\n\n const embedded = typeof window !== 'undefined' && window.parent !== window;\n\n if (!embedded) {\n return this.activateMock(options, 'not embedded in a Rack');\n }\n\n const bridge = new HostBridge({ ackTimeoutMs });\n bridge.announceReady();\n const launch = await bridge.waitForLaunch(launchTimeoutMs);\n\n if (!launch) {\n bridge.dispose();\n\n return this.activateMock(options, `no rack:launch within ${launchTimeoutMs}ms`);\n }\n\n return this.activate(bridge, launch);\n }\n\n private async activateMock(options: InitOptions, reason: string): Promise<LaunchData> {\n console.info(`[ziprack] running in mock mode (${reason})`);\n\n const manifest = await loadManifest(options.manifestUrl ?? './manifest.json', options.slug);\n const rack = new MockRack(manifest, new LocalStore(), {\n log: (type, payload) => console.info(`[ziprack mock] ${type}`, payload),\n });\n for (const [promptId, handler] of this.pendingAiMocks) {\n rack.mockAi(promptId, handler);\n }\n this.pendingAiMocks = [];\n\n return this.activate(new MockTransport(rack), rack.launchData(options.slug));\n }\n\n private activate(transport: Transport, launch: LaunchData): LaunchData {\n this.transport = transport;\n this.launchData = launch;\n transport.onEvent((event) => this.eventListeners.forEach((l) => l(event)));\n\n this.launchListeners.forEach((listener) => listener(launch));\n this.flushQueue();\n\n return launch;\n }\n\n private flushQueue(): void {\n const transport = this.transport;\n if (!transport) {\n return;\n }\n while (this.queue.length > 0) {\n const call = this.queue.shift() as QueuedCall;\n void this.send(call.type, call.payload, call.options).then(call.resolve);\n }\n }\n\n private mockRack(): MockRack | null {\n return this.transport instanceof MockTransport ? this.transport.rack : null;\n }\n}\n\nasync function loadManifest(url: string, slug?: string): Promise<MockManifest | null> {\n if (typeof fetch !== 'function') {\n return null;\n }\n try {\n const response = await fetch(url, { cache: 'no-store' });\n if (!response.ok) {\n throw new Error(String(response.status));\n }\n const manifest = (await response.json()) as MockManifest;\n if (slug && manifest.slug !== slug) {\n console.warn(`[ziprack mock] manifest slug [${manifest.slug}] does not match init({ slug: '${slug}' }).`);\n }\n\n return manifest;\n } catch (error) {\n console.warn(`[ziprack mock] could not load ${url}; mock mode will accept every capability.`, error);\n\n return null;\n }\n}\n","import { RackClient } from './core/rack';\n\nexport * from './core/types';\nexport { PROTOCOL_NAMESPACE, PROTOCOL_VERSION, FORMAT } from './core/protocol';\nexport { RackClient } from './core/rack';\nexport { HostBridge } from './core/bridge';\nexport type { AnswerOptions, StatementInput } from './activity';\nexport type { Collection, ListQuery, ListResult, RecordRow, WhereClause, WhereOperator } from './db';\nexport type { StoredFile, FileStatus } from './storage';\nexport type { Chat, ChatReply, Usage } from './ai';\nexport type { Channel, RoomEventName, RoomEvents } from './broadcast';\nexport type { MockManifest, AiMockHandler } from './core/mock/MockRack';\n\n/** The singleton every applet talks through. */\nexport const Rack = new RackClient();\n\n/** A separate client (tests, or unusual multi-frame setups). */\nexport function createRack(): RackClient {\n return new RackClient();\n}\n"],"names":["ActivityApi","link","id","a","input","activityId","response","options","stepId","context","Chat","promptId","message","onDelta","text","result","chunk","delta","AiApi","vars","AttemptApi","launched","state","segment","summary","AuthApi","key","fallback","user","ROOM_CHANNEL","Channel","name","event","l","callback","set","payload","BroadcastApi","keys","value","channel","instance","participantId","notDeclared","capability","Collection","data","query","type","DbApi","MediaApi","StorageApi","upload","file","meta","HostBridge","source","timeoutMs","resolve","timer","r","onLaunch","requestId","newRequestId","request","createEnvelope","listener","envelope","isEnvelope","resolvers","ack","_id","_ok","_partial","ok","error","details","_done","rest","DEFAULT_LAUNCH_TIMEOUT_MS","DEFAULT_ACK_TIMEOUT_MS","RackClient","handler","rack","ref","capabilityOf","ackTimeoutMs","launchTimeoutMs","launch","MockTransport","bridge","reason","manifest","loadManifest","MockRack","LocalStore","transport","call","url","slug","Rack","createRack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/activity/index.ts","../src/ai/index.ts","../src/attempt/index.ts","../src/auth/index.ts","../src/broadcast/index.ts","../src/core/link.ts","../src/db/index.ts","../src/media/index.ts","../src/storage/index.ts","../src/core/bridge.ts","../src/core/rack.ts","../src/index.ts"],"sourcesContent":["import type { Link } from '../core/link';\nimport type { AckResult, JsonObject, LaunchActivity } from '../core/types';\n\nexport interface StatementInput {\n verb: string;\n activity: { id: string; type?: string };\n result?: JsonObject;\n context?: JsonObject;\n occurred_at?: string;\n}\n\nexport interface AnswerOptions {\n type?: string;\n context?: JsonObject;\n}\n\n/**\n * activity@1 — append-only statements. Answers are statements, not state.\n */\nexport class ActivityApi {\n public constructor(private readonly link: Link) {}\n\n /** The manifest's declared activities for this version. */\n public activities(): LaunchActivity[] {\n return this.link.launch()?.activity?.activities ?? [];\n }\n\n public activity(id: string): LaunchActivity | null {\n return this.activities().find((a) => a.id === id) ?? null;\n }\n\n public statement(input: StatementInput): Promise<AckResult<{ id: string }>> {\n return this.link.send<{ id: string }>('activity:statement', {\n ...input,\n occurred_at: input.occurred_at ?? new Date().toISOString(),\n });\n }\n\n /** `answered` statement with the value in result.response — the only field reporting reads. */\n public answer(activityId: string, response: unknown, options: AnswerOptions = {}): Promise<AckResult<{ id: string }>> {\n return this.statement({\n verb: 'answered',\n activity: { id: activityId, type: options.type ?? this.activity(activityId)?.type },\n result: { response },\n context: options.context,\n });\n }\n\n /** `progressed` statement with activity.type = 'step'. */\n public progress(stepId: string, context?: JsonObject): Promise<AckResult<{ id: string }>> {\n return this.statement({ verb: 'progressed', activity: { id: stepId, type: 'step' }, context });\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, JsonObject } from '../core/types';\n\nexport interface Usage {\n input_tokens: number;\n output_tokens: number;\n}\n\nexport interface ChatReply {\n message_id: string;\n text: string;\n usage: Usage;\n}\n\nexport class Chat {\n public constructor(private readonly link: Link, public readonly promptId: string) {}\n\n /**\n * Send a participant message. onDelta receives text as it streams; the\n * resolved result carries the full text.\n */\n public async send(message: string, onDelta?: (delta: string, soFar: string) => void): Promise<AckResult<ChatReply>> {\n let text = '';\n const result = await this.link.send<Partial<ChatReply>>('ai:chat', { prompt: this.promptId, message }, {\n timeoutMs: 60_000,\n onPartial: (chunk) => {\n const delta = typeof chunk.delta === 'string' ? chunk.delta : '';\n text += delta;\n onDelta?.(delta, text);\n },\n });\n\n if (!result.ok) {\n return result as AckResult<ChatReply>;\n }\n\n return {\n ok: true,\n data: {\n message_id: String(result.data?.message_id ?? ''),\n text: result.data?.text ?? text,\n usage: result.data?.usage ?? { input_tokens: 0, output_tokens: 0 },\n },\n };\n }\n\n public reset(): Promise<AckResult> {\n return this.link.send('ai:chat.reset', { prompt: this.promptId });\n }\n}\n\n/**\n * ai@1 — declared prompt templates. The applet supplies variables, never\n * instructions; model, prompt and budget are Rack-owned.\n */\nexport class AiApi {\n public constructor(private readonly link: Link) {}\n\n public prompts(): Array<{ id: string; mode: 'analysis' | 'chat' }> {\n return this.link.launch()?.ai?.prompts ?? [];\n }\n\n /** Analysis prompt: structured JSON conforming to the declared output_schema. */\n public ask<T extends object = JsonObject>(promptId: string, vars: JsonObject = {}): Promise<AckResult<{ output: T; usage: Usage }>> {\n return this.link.send<{ output: T; usage: Usage }>('ai:ask', { prompt: promptId, vars }, { timeoutMs: 60_000 });\n }\n\n /** Chat prompt: conversation history is held by the Rack. */\n public chat(promptId: string): Chat {\n return new Chat(this.link, promptId);\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, AttemptStatus, JsonObject, LaunchAttempt } from '../core/types';\n\n/**\n * attempt@1 — lifecycle, resume state, completion. Declaring it also pins\n * every participant to the version they started on.\n */\nexport class AttemptApi {\n private local: Partial<LaunchAttempt> = {};\n\n public constructor(private readonly link: Link) {}\n\n /** The attempt as launched, with local updates applied. */\n public current(): LaunchAttempt | null {\n const launched = this.link.launch()?.attempt;\n\n return launched ? { ...launched, ...this.local } : null;\n }\n\n public get status(): AttemptStatus | null {\n return this.current()?.status ?? null;\n }\n\n public get id(): number | null {\n return this.current()?.id ?? null;\n }\n\n /** Resume state exactly as last saved. */\n public state<T extends object = JsonObject>(): T | null {\n return (this.current()?.state as T | null) ?? null;\n }\n\n public segment(): Record<string, string> | null {\n return this.current()?.segment ?? null;\n }\n\n /** Save resume state (max 64 KB). Send after every transition; the shell coalesces bursts. */\n public setState(state: JsonObject): Promise<AckResult> {\n this.local.state = state;\n\n return this.link.send('attempt:state', { state });\n }\n\n /** Set segment dimensions (max 20 keys, string values). */\n public setSegment(segment: Record<string, string>): Promise<AckResult> {\n this.local.segment = segment;\n\n return this.link.send('attempt:segment', { segment });\n }\n\n /** Mark the attempt completed. Idempotent. */\n public async complete(summary?: JsonObject): Promise<AckResult<{ status: AttemptStatus; completed_at: string | null }>> {\n const result = await this.link.send<{ status: AttemptStatus; completed_at: string | null }>('attempt:complete', { summary: summary ?? null });\n if (result.ok) {\n this.local.status = 'completed';\n }\n\n return result;\n }\n}\n","import type { Link } from '../core/link';\nimport type { LaunchUser } from '../core/types';\n\n/**\n * auth@1 — who the participant is and the profile attributes the Rack chose to\n * release. Attributes the manifest requested but the Rack withheld are simply\n * absent; degrade gracefully.\n */\nexport class AuthApi {\n public constructor(private readonly link: Link) {}\n\n public user(): LaunchUser | null {\n return this.link.launch()?.auth?.user ?? null;\n }\n\n /** A released profile attribute, or the fallback when withheld. */\n public attribute<T = unknown>(key: string, fallback: T | null = null): T | null {\n const user = this.user();\n if (!user || !(key in user)) {\n return fallback;\n }\n\n return user[key] as T;\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult, JsonObject, LaunchBroadcast, LaunchRoom, RackEvent, RoomInvite, RoomMember, RoomRole, RoomStatus } from '../core/types';\n\nexport const ROOM_CHANNEL = '$room';\n\ntype Listener = (payload: unknown, from: RackEvent['from']) => void;\n\nexport type RoomEventName = 'presence' | 'state' | 'role' | 'status';\n\nexport interface RoomEvents {\n presence: { members: RoomMember[] };\n state: { key: string; value: unknown; version: number };\n role: { role: RoomRole; participant_id: number };\n status: { status: RoomStatus };\n}\n\nexport class Channel {\n private readonly listeners = new Map<string, Set<Listener>>();\n\n private unsubscribe: (() => void) | null = null;\n\n public constructor(private readonly link: Link, public readonly name: string) {}\n\n /** @internal */\n public attach(): void {\n this.unsubscribe ??= this.link.onEvent((event) => {\n if (event.channel !== this.name) {\n return;\n }\n this.listeners.get(event.event)?.forEach((l) => l(event.payload, event.from));\n this.listeners.get('*')?.forEach((l) => l({ event: event.event, payload: event.payload }, event.from));\n });\n }\n\n /** Listen for an event on this channel ('*' for all). Returns an unsubscribe function. */\n public listen<T = unknown>(event: string, callback: (payload: T, from: RackEvent['from']) => void): () => void {\n const set = this.listeners.get(event) ?? new Set<Listener>();\n set.add(callback as Listener);\n this.listeners.set(event, set);\n\n return () => {\n set.delete(callback as Listener);\n };\n }\n\n /** Publish to everyone in the room. Facilitator-only events are enforced by the Rack. */\n public publish(event: string, payload: unknown = {}): Promise<AckResult> {\n return this.link.send('broadcast:publish', { channel: this.name, event, payload });\n }\n\n public async leave(): Promise<AckResult> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.listeners.clear();\n\n return this.link.send('broadcast:leave', { channel: this.name });\n }\n}\n\n/**\n * broadcast@1 — rooms, presence, facilitator control and shared state. The\n * Rack holds the WebSocket; the applet only ever sees postMessage.\n */\nexport class BroadcastApi {\n private readonly channels = new Map<string, Channel>();\n\n private readonly roomListeners = new Map<RoomEventName, Set<(payload: unknown) => void>>();\n\n private localRole: RoomRole | null = null;\n\n private localMembers: RoomMember[] | null = null;\n\n private localState: JsonObject | null = null;\n\n private detach: (() => void) | null = null;\n\n public constructor(private readonly link: Link) {}\n\n public get room(): LaunchRoom | null {\n return this.launch()?.room ?? null;\n }\n\n public get role(): RoomRole | null {\n return this.localRole ?? this.launch()?.role ?? null;\n }\n\n public get isFacilitator(): boolean {\n return this.role === 'facilitator';\n }\n\n public members(): RoomMember[] {\n return this.localMembers ?? this.launch()?.members ?? [];\n }\n\n /** Join a named channel within the room (default \"main\"). */\n public async join(channel = 'main'): Promise<Channel> {\n this.ensureRoomListener();\n let instance = this.channels.get(channel);\n if (!instance) {\n instance = new Channel(this.link, channel);\n this.channels.set(channel, instance);\n }\n instance.attach();\n await this.link.send('broadcast:join', { channel });\n\n return instance;\n }\n\n /** Who is in the room, by role. */\n public async presence(): Promise<AckResult<{ members: RoomMember[] }>> {\n const result = await this.link.send<{ members: RoomMember[] }>('broadcast:presence', {});\n if (result.ok && result.data) {\n this.localMembers = result.data.members;\n }\n\n return result;\n }\n\n public readonly state = {\n /** Server-arbitrated shared state. */\n get: async (keys?: string[]): Promise<AckResult<{ state: JsonObject }>> => {\n const result = await this.link.send<{ state: JsonObject }>('broadcast:state.get', keys ? { keys } : {});\n if (result.ok && result.data) {\n this.localState = { ...(this.localState ?? {}), ...result.data.state };\n }\n\n return result;\n },\n /** Last write wins at the key; the Rack stamps the version. */\n set: (key: string, value: unknown): Promise<AckResult<{ version: number }>> => {\n this.localState = { ...(this.localState ?? this.launch()?.state ?? {}), [key]: value };\n\n return this.link.send<{ version: number }>('broadcast:state.set', { key, value });\n },\n /** Locally known state (launch snapshot plus pushed updates). */\n snapshot: (): JsonObject => this.localState ?? this.launch()?.state ?? {},\n };\n\n /**\n * Where the next person scans to get in. Only the Rack knows its own host\n * and join prefix, so it hands back the code and the URL; rendering them as\n * a slide, a link or a QR is yours. Refused with `conflict` once the room is\n * locked or closed, so a stale QR can be taken down.\n */\n public invite(): Promise<AckResult<RoomInvite>> {\n return this.link.send('broadcast:invite', {});\n }\n\n /** Claim the facilitator role (opt_in rooms). */\n public claim(): Promise<AckResult<{ role: RoomRole }>> {\n return this.link.send('broadcast:claim', {});\n }\n\n /** Hand the facilitator role to another member. */\n public transfer(participantId: number): Promise<AckResult> {\n return this.link.send('broadcast:transfer', { to: participantId });\n }\n\n /** Room-level events: presence, state, role, status. */\n public on<K extends RoomEventName>(event: K, callback: (payload: RoomEvents[K]) => void): () => void {\n this.ensureRoomListener();\n const set = this.roomListeners.get(event) ?? new Set();\n set.add(callback as (payload: unknown) => void);\n this.roomListeners.set(event, set);\n\n return () => {\n set.delete(callback as (payload: unknown) => void);\n };\n }\n\n private launch(): LaunchBroadcast | null {\n return this.link.launch()?.broadcast ?? null;\n }\n\n private ensureRoomListener(): void {\n this.detach ??= this.link.onEvent((event) => {\n if (event.channel !== ROOM_CHANNEL) {\n return;\n }\n const payload = event.payload as JsonObject;\n if (event.event === 'presence' && Array.isArray(payload.members)) {\n this.localMembers = payload.members as RoomMember[];\n }\n if (event.event === 'state' && typeof payload.key === 'string') {\n this.localState = { ...(this.localState ?? this.launch()?.state ?? {}), [payload.key]: payload.value };\n }\n if (event.event === 'role' && payload.participant_id === this.link.launch()?.actor.id) {\n this.localRole = payload.role as RoomRole;\n }\n this.roomListeners.get(event.event as RoomEventName)?.forEach((l) => l(payload));\n });\n }\n}\n","import type { AckResult, JsonObject, LaunchData, RackEvent, SendOptions } from './types';\n\n/**\n * What a capability module needs from the client: send/fire, the launch data,\n * event subscription and the declared-capability check.\n */\nexport interface Link {\n send<T = JsonObject>(type: string, payload: unknown, options?: SendOptions): Promise<AckResult<T>>;\n fire(type: string, payload?: unknown): void;\n launch(): LaunchData | null;\n declares(capability: string): boolean;\n onEvent(listener: (event: RackEvent) => void): () => void;\n mode(): 'host' | 'mock' | 'pending';\n}\n\nexport function notDeclared<T = JsonObject>(capability: string): AckResult<T> {\n return { ok: false, error: 'undeclared_capability', message: `The manifest does not declare the [${capability}] capability.` };\n}\n","import { notDeclared, type Link } from '../core/link';\nimport type { AckResult, JsonObject } from '../core/types';\n\nexport type WhereOperator = '=' | '!=' | '<' | '<=' | '>' | '>=' | 'in';\n\nexport type WhereClause = [path: string, operator: WhereOperator, value: unknown];\n\nexport interface ListQuery {\n /** Filters on paths declared in the collection's `indexed` list. */\n where?: WhereClause[];\n orderBy?: string;\n direction?: 'asc' | 'desc';\n /** Max 100. */\n limit?: number;\n cursor?: string | null;\n}\n\nexport interface RecordRow<T extends object = JsonObject> {\n id: string;\n data: T;\n owner_id: number;\n created_at: string;\n updated_at: string;\n}\n\nexport interface ListResult<T extends object = JsonObject> {\n records: RecordRow<T>[];\n nextCursor: string | null;\n}\n\nexport class Collection<T extends object = JsonObject> {\n public constructor(private readonly link: Link, public readonly name: string) {}\n\n public create(data: T): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:create', { data });\n }\n\n public get(id: string): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:get', { id });\n }\n\n /** Merge by default; pass { merge: false } to replace the whole document. */\n public update(id: string, data: Partial<T>, options: { merge?: boolean } = {}): Promise<AckResult<{ record: RecordRow<T> }>> {\n return this.send('db:update', { id, data, merge: options.merge ?? true });\n }\n\n public delete(id: string): Promise<AckResult<{ id: string }>> {\n return this.send('db:delete', { id });\n }\n\n public list(query: ListQuery = {}): Promise<AckResult<ListResult<T>>> {\n return this.send('db:list', query);\n }\n\n public count(query: Pick<ListQuery, 'where'> = {}): Promise<AckResult<{ count: number }>> {\n return this.send('db:count', query);\n }\n\n private send<R>(type: string, payload: object): Promise<AckResult<R>> {\n if (this.link.launch() && !this.link.declares('db')) {\n return Promise.resolve(notDeclared<R>('db'));\n }\n\n return this.link.send<R>(type, { collection: this.name, ...payload });\n }\n}\n\n/**\n * db@1 — CRUD records in collections the manifest declares, each with a JSON\n * Schema and a scope (attempt | user | room | applet).\n */\nexport class DbApi {\n public constructor(private readonly link: Link) {}\n\n public collection<T extends object = JsonObject>(name: string): Collection<T> {\n return new Collection<T>(this.link, name);\n }\n\n public collections(): Array<{ name: string; scope: string }> {\n return this.link.launch()?.db?.collections ?? [];\n }\n}\n","import type { Link } from '../core/link';\nimport type { MediaEmbed } from '../core/types';\n\n/**\n * Declared media. The Rack builds every player URL; the applet references\n * media by id only. Needs no capability.\n */\nexport class MediaApi {\n public constructor(private readonly link: Link) {}\n\n public get(id: string): MediaEmbed | null {\n return this.link.launch()?.media?.[id] ?? null;\n }\n\n /** Player URL for an <iframe src>. Null when the id is not declared. */\n public embedUrl(id: string): string | null {\n return this.get(id)?.embedUrl ?? null;\n }\n\n public all(): Record<string, MediaEmbed> {\n return this.link.launch()?.media ?? {};\n }\n}\n","import type { Link } from '../core/link';\nimport type { AckResult } from '../core/types';\n\nexport type FileStatus = 'pending' | 'clean' | 'infected' | 'failed';\n\nexport interface StoredFile {\n id: string;\n upload: string;\n name: string;\n mime: string;\n bytes: number;\n status: FileStatus;\n created_at: string;\n}\n\n/**\n * storage@1 — participant uploads. The File travels to the shell by\n * structured clone; the Rack scans it before it becomes addressable.\n */\nexport class StorageApi {\n public constructor(private readonly link: Link) {}\n\n public uploads(): Array<{ name: string; scope: string; mime: string[]; max_bytes: number }> {\n return this.link.launch()?.storage?.uploads ?? [];\n }\n\n /** Upload into a declared upload slot. Resolves once stored (status may still be pending scan). */\n public put(upload: string, file: File | Blob, meta: Record<string, unknown> = {}): Promise<AckResult<{ file: StoredFile }>> {\n const name = file instanceof File ? file.name : 'blob';\n\n return this.link.send<{ file: StoredFile }>('storage:put', { upload, file, name, mime: file.type, bytes: file.size, meta }, { timeoutMs: 120_000 });\n }\n\n /** Short-lived URL for a clean file. Never an object key. */\n public url(id: string): Promise<AckResult<{ url: string; expires_at: string }>> {\n return this.link.send('storage:url', { id });\n }\n\n public list(upload?: string): Promise<AckResult<{ files: StoredFile[] }>> {\n return this.link.send('storage:list', upload ? { upload } : {});\n }\n\n public delete(id: string): Promise<AckResult<{ id: string }>> {\n return this.link.send('storage:delete', { id });\n }\n}\n","import { createEnvelope, isEnvelope, newRequestId, type Envelope } from './protocol';\nimport type { AckPayload, AckResult, JsonObject, LaunchData, RackEvent, SendOptions, Transport } from './types';\n\ninterface PendingRequest {\n resolve: (result: AckResult) => void;\n timer: ReturnType<typeof setTimeout>;\n timeoutMs: number;\n onPartial?: (chunk: JsonObject) => void;\n}\n\nexport interface BridgeOptions {\n ackTimeoutMs: number;\n /** Window-like object to post to. Defaults to window.parent. */\n target?: Pick<Window, 'postMessage'>;\n /** Whether a MessageEvent came from the host. Defaults to event.source === window.parent. */\n isHost?: (source: MessageEventSource | null) => boolean;\n /** Where to listen for messages. Defaults to window. */\n listenOn?: Pick<Window, 'addEventListener' | 'removeEventListener'>;\n}\n\n/**\n * postMessage transport used inside the Rack's iframe.\n *\n * Only messages whose source is the parent window are honoured; the applet\n * never inspects event.origin because its own origin is opaque by design.\n */\nexport class HostBridge implements Transport {\n public readonly kind = 'host' as const;\n\n private readonly pending = new Map<string, PendingRequest>();\n\n private readonly eventListeners = new Set<(event: RackEvent) => void>();\n\n private launchResolvers: Array<(data: LaunchData) => void> = [];\n\n private launchData: LaunchData | null = null;\n\n private readonly target: Pick<Window, 'postMessage'>;\n\n private readonly isHost: (source: MessageEventSource | null) => boolean;\n\n private readonly listenOn: Pick<Window, 'addEventListener' | 'removeEventListener'>;\n\n private readonly listener = (event: MessageEvent): void => this.onMessage(event);\n\n public constructor(private readonly options: BridgeOptions) {\n this.target = options.target ?? window.parent;\n this.isHost = options.isHost ?? ((source) => source === window.parent);\n this.listenOn = options.listenOn ?? window;\n this.listenOn.addEventListener('message', this.listener as EventListener);\n }\n\n public announceReady(): void {\n this.fire('rack:ready', {});\n }\n\n public waitForLaunch(timeoutMs: number): Promise<LaunchData | null> {\n if (this.launchData) {\n return Promise.resolve(this.launchData);\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n this.launchResolvers = this.launchResolvers.filter((r) => r !== onLaunch);\n resolve(null);\n }, timeoutMs);\n const onLaunch = (data: LaunchData): void => {\n clearTimeout(timer);\n resolve(data);\n };\n this.launchResolvers.push(onLaunch);\n });\n }\n\n public send<T = JsonObject>(type: string, payload: unknown, options: SendOptions = {}): Promise<AckResult<T>> {\n const requestId = newRequestId();\n const timeoutMs = options.timeoutMs ?? this.options.ackTimeoutMs;\n\n return new Promise((resolve) => {\n const request: PendingRequest = {\n resolve: resolve as (result: AckResult) => void,\n timer: setTimeout(() => this.expire(requestId), timeoutMs),\n timeoutMs,\n onPartial: options.onPartial,\n };\n this.pending.set(requestId, request);\n this.post(createEnvelope(type, payload, requestId));\n });\n }\n\n public fire(type: string, payload: unknown = {}): void {\n this.post(createEnvelope(type, payload));\n }\n\n public onEvent(listener: (event: RackEvent) => void): () => void {\n this.eventListeners.add(listener);\n\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n public dispose(): void {\n this.listenOn.removeEventListener('message', this.listener as EventListener);\n for (const [requestId, request] of this.pending) {\n clearTimeout(request.timer);\n request.resolve({ ok: false, error: 'disposed' });\n this.pending.delete(requestId);\n }\n }\n\n private expire(requestId: string): void {\n const request = this.pending.get(requestId);\n if (!request) {\n return;\n }\n this.pending.delete(requestId);\n request.resolve({ ok: false, error: 'timeout' });\n }\n\n private post(envelope: Envelope): void {\n this.target.postMessage(envelope, '*');\n }\n\n private onMessage(event: MessageEvent): void {\n if (!this.isHost(event.source) || !isEnvelope(event.data)) {\n return;\n }\n const envelope = event.data;\n\n if (envelope.type === 'rack:launch') {\n this.launchData = envelope.payload as LaunchData;\n const resolvers = this.launchResolvers;\n this.launchResolvers = [];\n resolvers.forEach((resolve) => resolve(this.launchData as LaunchData));\n\n return;\n }\n\n if (envelope.type === 'rack:event') {\n const payload = envelope.payload as RackEvent;\n this.eventListeners.forEach((listener) => listener(payload));\n\n return;\n }\n\n if (envelope.type === 'rack:ack') {\n this.onAck(envelope.payload as AckPayload);\n }\n }\n\n private onAck(ack: AckPayload): void {\n const request = this.pending.get(ack.requestId);\n if (!request) {\n return;\n }\n\n // A Rack that opens a stream acks the request twice: once to say the\n // stream is live, then once more when it finishes. Only the second one\n // settles the promise.\n if (!ack.done && (ack.data as { stream?: boolean } | undefined)?.stream === true) {\n clearTimeout(request.timer);\n request.timer = setTimeout(() => this.expire(ack.requestId), request.timeoutMs);\n\n return;\n }\n\n if (ack.partial && !ack.done) {\n const { requestId: _id, ok: _ok, partial: _partial, ...chunk } = ack;\n request.onPartial?.(chunk as JsonObject);\n clearTimeout(request.timer);\n request.timer = setTimeout(() => this.expire(ack.requestId), request.timeoutMs);\n\n return;\n }\n\n clearTimeout(request.timer);\n this.pending.delete(ack.requestId);\n\n const { requestId: _id, ok, data, error, message, details, partial: _partial, done: _done, ...rest } = ack;\n request.resolve({ ok, data: (data ?? (Object.keys(rest).length ? rest : undefined)) as JsonObject | undefined, error, message, details });\n }\n}\n","import { ActivityApi } from '../activity';\nimport { AiApi } from '../ai';\nimport { AttemptApi } from '../attempt';\nimport { AuthApi } from '../auth';\nimport { BroadcastApi } from '../broadcast';\nimport { DbApi } from '../db';\nimport { MediaApi } from '../media';\nimport { StorageApi } from '../storage';\nimport { HostBridge } from './bridge';\nimport { notDeclared, type Link } from './link';\nimport { MockRack, type AiMockHandler, type MockManifest } from './mock/MockRack';\nimport { MockTransport } from './mock/MockTransport';\nimport { LocalStore } from './mock/store';\nimport { capabilityOf } from './protocol';\nimport type { AckResult, InitOptions, JsonObject, LaunchData, LaunchListener, RackEvent, SendOptions, Transport } from './types';\n\nconst DEFAULT_LAUNCH_TIMEOUT_MS = 3000;\nconst DEFAULT_ACK_TIMEOUT_MS = 5000;\n\ninterface QueuedCall {\n type: string;\n payload: unknown;\n options?: SendOptions;\n resolve: (result: AckResult) => void;\n}\n\n/**\n * The SDK entry point. One instance per applet; `Rack` is the default singleton.\n *\n * Every capability is a message the Rack services. The applet asks; the Rack\n * decides, enforces and persists. Nothing here ever throws on a Rack error:\n * calls resolve to { ok: false, error }.\n */\nexport class RackClient {\n public readonly auth: AuthApi;\n\n public readonly attempt: AttemptApi;\n\n public readonly activity: ActivityApi;\n\n public readonly db: DbApi;\n\n public readonly storage: StorageApi;\n\n public readonly ai: AiApi;\n\n public readonly broadcast: BroadcastApi;\n\n public readonly media: MediaApi;\n\n /** Dev-only hooks that only take effect in mock mode. */\n public readonly mock: {\n /** Answer an ai prompt yourself instead of the schema stub. */\n ai: (promptId: string, handler: AiMockHandler) => void;\n /** Clear a completed mock attempt so the experience can be replayed. */\n resetAttempt: () => void;\n /** The MockRack when running standalone, else null. */\n rack: () => MockRack | null;\n };\n\n private transport: Transport | null = null;\n\n private initPromise: Promise<LaunchData> | null = null;\n\n private launchData: LaunchData | null = null;\n\n private readonly queue: QueuedCall[] = [];\n\n private readonly launchListeners = new Set<LaunchListener>();\n\n private readonly eventListeners = new Set<(event: RackEvent) => void>();\n\n private pendingAiMocks: Array<[string, AiMockHandler]> = [];\n\n public constructor() {\n const link: Link = {\n send: (type, payload, options) => this.send(type, payload, options),\n fire: (type, payload) => this.fire(type, payload),\n launch: () => this.launchData,\n declares: (capability) => this.declares(capability),\n onEvent: (listener) => this.on('event', listener),\n mode: () => this.mode,\n };\n\n this.auth = new AuthApi(link);\n this.attempt = new AttemptApi(link);\n this.activity = new ActivityApi(link);\n this.db = new DbApi(link);\n this.storage = new StorageApi(link);\n this.ai = new AiApi(link);\n this.broadcast = new BroadcastApi(link);\n this.media = new MediaApi(link);\n\n this.mock = {\n ai: (promptId, handler) => {\n const rack = this.mockRack();\n rack ? rack.mockAi(promptId, handler) : this.pendingAiMocks.push([promptId, handler]);\n },\n resetAttempt: () => this.mockRack()?.resetAttempt(),\n rack: () => this.mockRack(),\n };\n }\n\n /**\n * Handshake with the Rack. Resolves with launch data once the Rack answers,\n * or with mock launch data when running standalone. Safe to call repeatedly.\n */\n public init(options: InitOptions = {}): Promise<LaunchData> {\n this.initPromise ??= this.performInit(options);\n\n return this.initPromise;\n }\n\n public get launched(): boolean {\n return this.launchData !== null;\n }\n\n public get mode(): 'host' | 'mock' | 'pending' {\n return this.transport?.kind ?? 'pending';\n }\n\n public getLaunchData(): LaunchData | null {\n return this.launchData;\n }\n\n /** Whether the manifest declared a capability (any version). */\n public declares(capability: string): boolean {\n return (this.launchData?.capabilities ?? []).some((ref) => ref.split('@')[0] === capability);\n }\n\n public on(event: 'launch', listener: LaunchListener): () => void;\n\n public on(event: 'event', listener: (event: RackEvent) => void): () => void;\n\n public on(event: 'launch' | 'event', listener: LaunchListener | ((event: RackEvent) => void)): () => void {\n if (event === 'launch') {\n const l = listener as LaunchListener;\n this.launchListeners.add(l);\n if (this.launchData) {\n l(this.launchData);\n }\n\n return () => {\n this.launchListeners.delete(l);\n };\n }\n\n const l = listener as (event: RackEvent) => void;\n this.eventListeners.add(l);\n\n return () => {\n this.eventListeners.delete(l);\n };\n }\n\n /** Ask the Rack to leave the applet. Needs no capability. */\n public eject(): void {\n this.fire('rack:eject', {});\n if (this.transport?.kind === 'mock') {\n console.info('[ziprack mock] eject: the Rack would navigate away now.');\n }\n }\n\n /** Low-level: send any message and await its ack. Capability calls go through the typed APIs. */\n public send<T = JsonObject>(type: string, payload: unknown, options?: SendOptions): Promise<AckResult<T>> {\n if (this.launchData && !type.startsWith('rack:') && !this.declares(capabilityOf(type))) {\n return Promise.resolve(notDeclared<T>(capabilityOf(type)));\n }\n if (this.transport) {\n return this.transport.send<T>(type, payload, options);\n }\n\n return new Promise((resolve) => {\n this.queue.push({ type, payload, options, resolve: resolve as (result: AckResult) => void });\n });\n }\n\n public fire(type: string, payload: unknown = {}): void {\n if (this.transport) {\n this.transport.fire(type, payload);\n\n return;\n }\n void this.send(type, payload);\n }\n\n /** Tear down (tests). */\n public dispose(): void {\n this.transport?.dispose();\n this.transport = null;\n this.initPromise = null;\n this.launchData = null;\n }\n\n private async performInit(options: InitOptions): Promise<LaunchData> {\n const ackTimeoutMs = options.ackTimeoutMs ?? DEFAULT_ACK_TIMEOUT_MS;\n const launchTimeoutMs = options.launchTimeoutMs ?? DEFAULT_LAUNCH_TIMEOUT_MS;\n\n if (options.transport) {\n const launch = options.launch\n ?? (options.transport instanceof MockTransport ? options.transport.rack.launchData() : null);\n if (!launch) {\n throw new Error('init({ transport }) needs `launch` data unless the transport is a MockTransport.');\n }\n\n return this.activate(options.transport, launch);\n }\n\n const embedded = typeof window !== 'undefined' && window.parent !== window;\n\n if (!embedded) {\n return this.activateMock(options, 'not embedded in a Rack');\n }\n\n const bridge = new HostBridge({ ackTimeoutMs });\n bridge.announceReady();\n const launch = await bridge.waitForLaunch(launchTimeoutMs);\n\n if (!launch) {\n bridge.dispose();\n\n return this.activateMock(options, `no rack:launch within ${launchTimeoutMs}ms`);\n }\n\n return this.activate(bridge, launch);\n }\n\n private async activateMock(options: InitOptions, reason: string): Promise<LaunchData> {\n console.info(`[ziprack] running in mock mode (${reason})`);\n\n const manifest = await loadManifest(options.manifestUrl ?? './manifest.json', options.slug);\n const rack = new MockRack(manifest, new LocalStore(), {\n log: (type, payload) => console.info(`[ziprack mock] ${type}`, payload),\n });\n for (const [promptId, handler] of this.pendingAiMocks) {\n rack.mockAi(promptId, handler);\n }\n this.pendingAiMocks = [];\n\n return this.activate(new MockTransport(rack), rack.launchData(options.slug));\n }\n\n private activate(transport: Transport, launch: LaunchData): LaunchData {\n this.transport = transport;\n this.launchData = launch;\n transport.onEvent((event) => this.eventListeners.forEach((l) => l(event)));\n\n this.launchListeners.forEach((listener) => listener(launch));\n this.flushQueue();\n\n return launch;\n }\n\n private flushQueue(): void {\n const transport = this.transport;\n if (!transport) {\n return;\n }\n while (this.queue.length > 0) {\n const call = this.queue.shift() as QueuedCall;\n void this.send(call.type, call.payload, call.options).then(call.resolve);\n }\n }\n\n private mockRack(): MockRack | null {\n return this.transport instanceof MockTransport ? this.transport.rack : null;\n }\n}\n\nasync function loadManifest(url: string, slug?: string): Promise<MockManifest | null> {\n if (typeof fetch !== 'function') {\n return null;\n }\n try {\n const response = await fetch(url, { cache: 'no-store' });\n if (!response.ok) {\n throw new Error(String(response.status));\n }\n const manifest = (await response.json()) as MockManifest;\n if (slug && manifest.slug !== slug) {\n console.warn(`[ziprack mock] manifest slug [${manifest.slug}] does not match init({ slug: '${slug}' }).`);\n }\n\n return manifest;\n } catch (error) {\n console.warn(`[ziprack mock] could not load ${url}; mock mode will accept every capability.`, error);\n\n return null;\n }\n}\n","import { RackClient } from './core/rack';\n\nexport * from './core/types';\nexport { PROTOCOL_NAMESPACE, PROTOCOL_VERSION, FORMAT } from './core/protocol';\nexport { RackClient } from './core/rack';\nexport { HostBridge } from './core/bridge';\nexport type { AnswerOptions, StatementInput } from './activity';\nexport type { Collection, ListQuery, ListResult, RecordRow, WhereClause, WhereOperator } from './db';\nexport type { StoredFile, FileStatus } from './storage';\nexport type { Chat, ChatReply, Usage } from './ai';\nexport type { Channel, RoomEventName, RoomEvents } from './broadcast';\nexport type { MockManifest, AiMockHandler } from './core/mock/MockRack';\n\n/** The singleton every applet talks through. */\nexport const Rack = new RackClient();\n\n/** A separate client (tests, or unusual multi-frame setups). */\nexport function createRack(): RackClient {\n return new RackClient();\n}\n"],"names":["ActivityApi","link","id","a","input","activityId","response","options","stepId","context","Chat","promptId","message","onDelta","text","result","chunk","delta","AiApi","vars","AttemptApi","launched","state","segment","summary","AuthApi","key","fallback","user","ROOM_CHANNEL","Channel","name","event","l","callback","set","payload","BroadcastApi","keys","value","channel","instance","participantId","notDeclared","capability","Collection","data","query","type","DbApi","MediaApi","StorageApi","upload","file","meta","HostBridge","source","timeoutMs","resolve","timer","r","onLaunch","requestId","newRequestId","request","createEnvelope","listener","envelope","isEnvelope","resolvers","ack","_id","_ok","_partial","ok","error","details","_done","rest","DEFAULT_LAUNCH_TIMEOUT_MS","DEFAULT_ACK_TIMEOUT_MS","RackClient","handler","rack","ref","capabilityOf","ackTimeoutMs","launchTimeoutMs","launch","MockTransport","bridge","reason","manifest","loadManifest","MockRack","LocalStore","transport","call","url","slug","Rack","createRack"],"mappings":"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"}
|
|
@@ -125,6 +125,8 @@ class O {
|
|
|
125
125
|
return this.stateSet(e);
|
|
126
126
|
case "broadcast:presence":
|
|
127
127
|
return { ok: !0, data: { members: this.members() } };
|
|
128
|
+
case "broadcast:invite":
|
|
129
|
+
return this.invite();
|
|
128
130
|
case "broadcast:claim":
|
|
129
131
|
return this.claim();
|
|
130
132
|
case "broadcast:transfer":
|
|
@@ -377,6 +379,14 @@ class O {
|
|
|
377
379
|
break;
|
|
378
380
|
}
|
|
379
381
|
}
|
|
382
|
+
/**
|
|
383
|
+
* A mock room is two tabs of the dev server, so the invite is this page:
|
|
384
|
+
* scan it and the second tab joins over BroadcastChannel, exactly as the
|
|
385
|
+
* real join URL would.
|
|
386
|
+
*/
|
|
387
|
+
invite() {
|
|
388
|
+
return { ok: !0, data: { code: "MOCK01", url: typeof location > "u" ? "https://rack.test/r/MOCK01" : location.origin + location.pathname } };
|
|
389
|
+
}
|
|
380
390
|
setRole(t) {
|
|
381
391
|
this.role = t, this.send({ t: "role", from: this.member() }), this.pushEvent({ channel: "$room", event: "role", payload: { role: t, participant_id: this.participantId } });
|
|
382
392
|
}
|
|
@@ -413,7 +423,7 @@ function u(n, t) {
|
|
|
413
423
|
}
|
|
414
424
|
return e === "array" ? [u(n.items, t)] : e === "number" || e === "integer" ? typeof n.minimum == "number" ? n.minimum : 3 : e === "boolean" ? !0 : Array.isArray(n.enum) ? n.enum[0] : "mock";
|
|
415
425
|
}
|
|
416
|
-
class
|
|
426
|
+
class M {
|
|
417
427
|
constructor(t) {
|
|
418
428
|
this.rack = t, this.kind = "mock";
|
|
419
429
|
}
|
|
@@ -436,7 +446,7 @@ class I {
|
|
|
436
446
|
this.rack.dispose();
|
|
437
447
|
}
|
|
438
448
|
}
|
|
439
|
-
class
|
|
449
|
+
class I {
|
|
440
450
|
constructor() {
|
|
441
451
|
this.data = /* @__PURE__ */ new Map();
|
|
442
452
|
}
|
|
@@ -491,14 +501,14 @@ class E {
|
|
|
491
501
|
export {
|
|
492
502
|
y as F,
|
|
493
503
|
E as L,
|
|
494
|
-
|
|
504
|
+
M,
|
|
495
505
|
b as P,
|
|
496
506
|
v as a,
|
|
497
507
|
O as b,
|
|
498
508
|
w as c,
|
|
499
509
|
S as d,
|
|
500
|
-
|
|
510
|
+
I as e,
|
|
501
511
|
$ as i,
|
|
502
512
|
_ as n
|
|
503
513
|
};
|
|
504
|
-
//# sourceMappingURL=store-
|
|
514
|
+
//# sourceMappingURL=store-BXGon4iJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-BXGon4iJ.js","sources":["../src/core/protocol.ts","../src/core/mock/MockRack.ts","../src/core/mock/MockTransport.ts","../src/core/mock/store.ts"],"sourcesContent":["export const PROTOCOL_NAMESPACE = 'ziprack' as const;\nexport const PROTOCOL_VERSION = 1 as const;\nexport const FORMAT = 'ziprack/1' as const;\n\nexport interface Envelope<T = unknown> {\n ns: typeof PROTOCOL_NAMESPACE;\n v: typeof PROTOCOL_VERSION;\n type: string;\n requestId?: string;\n payload?: T;\n}\n\nlet requestCounter = 0;\n\nexport function newRequestId(): string {\n const cryptoRef = typeof globalThis.crypto !== 'undefined' ? globalThis.crypto : undefined;\n if (cryptoRef && typeof cryptoRef.randomUUID === 'function') {\n return cryptoRef.randomUUID();\n }\n requestCounter += 1;\n\n return `req-${Date.now().toString(36)}-${requestCounter.toString(36)}`;\n}\n\nexport function createEnvelope<T>(type: string, payload?: T, requestId?: string): Envelope<T> {\n const envelope: Envelope<T> = { ns: PROTOCOL_NAMESPACE, v: PROTOCOL_VERSION, type, payload };\n if (requestId !== undefined) {\n envelope.requestId = requestId;\n }\n\n return envelope;\n}\n\nexport function isEnvelope(data: unknown): data is Envelope {\n if (typeof data !== 'object' || data === null) {\n return false;\n }\n const candidate = data as Partial<Envelope>;\n\n return candidate.ns === PROTOCOL_NAMESPACE && candidate.v === PROTOCOL_VERSION && typeof candidate.type === 'string';\n}\n\n/** Capability id from a message type (\"db:create\" -> \"db\"). */\nexport function capabilityOf(type: string): string {\n const index = type.indexOf(':');\n\n return index === -1 ? type : type.slice(0, index);\n}\n","import { capabilityOf } from '../protocol';\nimport type { AckResult, JsonObject, LaunchData, RackEvent, RoomMember, RoomRole } from '../types';\nimport type { RecordRow, WhereClause } from '../../db';\nimport type { StoredFile } from '../../storage';\nimport type { Store } from './store';\n\nexport interface MockManifest {\n schema?: string;\n slug: string;\n name: string;\n version: string;\n requires?: { capabilities?: string[]; profile?: string[] };\n media?: Array<{ id: string; provider: string; key: string }>;\n activities?: Array<{ id: string; type: string; label: string; scale?: unknown; segment?: string | null; sequence?: number }>;\n collections?: Array<{ name: string; scope: string; schema?: JsonObject }>;\n uploads?: Array<{ name: string; scope: string; mime?: string[]; max_bytes?: number }>;\n prompts?: Array<{ id: string; mode: 'analysis' | 'chat'; output_schema?: JsonObject }>;\n broadcast?: { facilitator_events?: string[]; channels?: string[]; mock_mode?: 'first_in' | 'opt_in' };\n [key: string]: unknown;\n}\n\nexport type AiMockHandler = (vars: JsonObject, mode: 'analysis' | 'chat', message?: string) => unknown | Promise<unknown>;\n\nexport interface MockRackOptions {\n /** Whether undeclared capabilities are refused, as a real Rack would. Default true when a manifest is present. */\n strict?: boolean;\n log?: (type: string, payload: unknown) => void;\n participantId?: number;\n participantName?: string;\n /** Force the mock room role instead of deriving it from the assignment mode. */\n role?: RoomRole;\n}\n\nexport type MockOutcome = AckResult | { stream: AsyncIterable<JsonObject>; final: () => JsonObject };\n\n/**\n * An in-memory Rack that services every capability so an applet can be built\n * and QA'd standalone. Shared by the browser mock transport (localStorage) and\n * the testing FakeHost (memory).\n */\nexport class MockRack {\n public readonly participantId: number;\n\n public readonly participantName: string;\n\n public readonly statements: Array<JsonObject & { id: string }> = [];\n\n public readonly events: RackEvent[] = [];\n\n private readonly aiHandlers = new Map<string, AiMockHandler>();\n\n private readonly chatHistory = new Map<string, Array<{ role: string; content: string }>>();\n\n private readonly blobs = new Map<string, string>();\n\n private readonly eventListeners = new Set<(event: RackEvent) => void>();\n\n private readonly roomMembers = new Map<number, RoomMember & { lastSeen: number; joinedAt?: number }>();\n\n private roomState: Record<string, { value: unknown; version: number }> = {};\n\n private role: RoomRole = 'participant';\n\n private readonly joinedAt = Date.now() + Math.random();\n\n private channel: BroadcastChannel | null = null;\n\n private heartbeat: ReturnType<typeof setInterval> | null = null;\n\n public constructor(\n public readonly manifest: MockManifest | null,\n private readonly store: Store,\n private readonly options: MockRackOptions = {},\n ) {\n this.participantId = options.participantId ?? Math.floor(Math.random() * 1_000_000) + 1;\n this.participantName = options.participantName ?? 'Dev User';\n }\n\n public get slug(): string {\n return this.manifest?.slug ?? 'applet';\n }\n\n private key(...parts: string[]): string {\n return `ziprack-mock:${this.slug}:${parts.join(':')}`;\n }\n\n public declares(capability: string): boolean {\n if (!this.manifest) {\n return true;\n }\n\n return (this.manifest.requires?.capabilities ?? []).some((ref) => ref.split('@')[0] === capability);\n }\n\n public onEvent(listener: (event: RackEvent) => void): () => void {\n this.eventListeners.add(listener);\n\n return () => {\n this.eventListeners.delete(listener);\n };\n }\n\n public pushEvent(event: RackEvent): void {\n this.events.push(event);\n this.eventListeners.forEach((l) => l(event));\n }\n\n public launchData(nameHint?: string): LaunchData {\n const m = this.manifest;\n const launch: LaunchData = {\n schema: 'ziprack/1',\n actor: { id: this.participantId, name: this.participantName },\n applet: { slug: this.slug, name: `${m?.name ?? nameHint ?? 'Applet'} (mock)`, version: m?.version ?? 'dev' },\n capabilities: m?.requires?.capabilities ?? [],\n media: Object.fromEntries((m?.media ?? []).map((item) => [item.id, {\n provider: item.provider,\n embedUrl: item.provider === 'vimeo' ? `https://player.vimeo.com/video/${item.key}?dnt=1` : `https://www.youtube-nocookie.com/embed/${item.key}?rel=0`,\n meta: null,\n }])),\n };\n\n if (this.declares('auth')) {\n const user: LaunchData['auth'] = { user: { id: this.participantId, display_name: this.participantName } };\n for (const attribute of m?.requires?.profile ?? []) {\n user.user[attribute] = user.user[attribute] ?? `mock-${attribute}`;\n }\n launch.auth = user;\n }\n if (this.declares('attempt')) {\n launch.attempt = this.attempt();\n }\n if (this.declares('activity')) {\n launch.activity = { activities: [...(m?.activities ?? [])].sort((a, b) => (a.sequence ?? 0) - (b.sequence ?? 0)) };\n }\n if (this.declares('db')) {\n launch.db = { collections: (m?.collections ?? []).map((c) => ({ name: c.name, scope: c.scope })) };\n }\n if (this.declares('storage')) {\n launch.storage = { uploads: (m?.uploads ?? []).map((u) => ({ name: u.name, scope: u.scope, mime: u.mime ?? [], max_bytes: u.max_bytes ?? 10 * 1024 * 1024 })) };\n }\n if (this.declares('ai')) {\n launch.ai = { prompts: (m?.prompts ?? []).map((p) => ({ id: p.id, mode: p.mode })) };\n }\n if (this.declares('broadcast')) {\n this.joinRoom();\n launch.broadcast = {\n room: { id: 1, code: 'MOCK01', name: `${this.slug} room`, status: 'open', mode: m?.broadcast?.mock_mode ?? 'first_in' },\n role: this.role,\n members: this.members(),\n state: this.stateSnapshot(),\n channels: m?.broadcast?.channels ?? ['main'],\n };\n }\n\n return launch;\n }\n\n public mockAi(promptId: string, handler: AiMockHandler): void {\n this.aiHandlers.set(promptId, handler);\n }\n\n public dispose(): void {\n if (this.heartbeat) {\n clearInterval(this.heartbeat);\n }\n if (this.channel) {\n this.send({ t: 'bye', from: this.member() });\n this.channel.close();\n }\n }\n\n // ---------------------------------------------------------------- dispatch\n\n public async handle(type: string, payload: JsonObject): Promise<MockOutcome> {\n this.options.log?.(type, payload);\n\n if (type === 'rack:eject') {\n return { ok: true };\n }\n\n const capability = capabilityOf(type);\n if ((this.options.strict ?? this.manifest !== null) && !this.declares(capability)) {\n return { ok: false, error: 'undeclared_capability', message: `The manifest does not declare the [${capability}] capability.` };\n }\n\n switch (type) {\n case 'attempt:state': return this.attemptState(payload);\n case 'attempt:segment': return this.attemptSegment(payload);\n case 'attempt:complete': return this.attemptComplete(payload);\n case 'activity:statement': return this.statement(payload);\n case 'db:create': return this.dbCreate(payload);\n case 'db:get': return this.dbGet(payload);\n case 'db:update': return this.dbUpdate(payload);\n case 'db:delete': return this.dbDelete(payload);\n case 'db:list': return this.dbList(payload);\n case 'db:count': return this.dbCount(payload);\n case 'storage:put': return this.storagePut(payload);\n case 'storage:url': return this.storageUrl(payload);\n case 'storage:list': return this.storageList(payload);\n case 'storage:delete': return this.storageDelete(payload);\n case 'ai:ask': return this.aiAsk(payload);\n case 'ai:chat': return this.aiChat(payload);\n case 'ai:chat.reset': this.chatHistory.delete(String(payload.prompt)); return { ok: true };\n case 'broadcast:join': return { ok: true, data: { members: this.members(), state: this.stateSnapshot() } };\n case 'broadcast:leave': return { ok: true };\n case 'broadcast:publish': return this.publish(payload);\n case 'broadcast:state.get': return { ok: true, data: { state: this.stateSnapshot(Array.isArray(payload.keys) ? (payload.keys as string[]) : undefined) } };\n case 'broadcast:state.set': return this.stateSet(payload);\n case 'broadcast:presence': return { ok: true, data: { members: this.members() } };\n case 'broadcast:invite': return this.invite();\n case 'broadcast:claim': return this.claim();\n case 'broadcast:transfer': return this.transfer(payload);\n default:\n return { ok: false, error: 'unknown_type', message: `Unknown message type [${type}].` };\n }\n }\n\n // ---------------------------------------------------------------- attempt\n\n public attempt(): NonNullable<LaunchData['attempt']> {\n return this.store.get(this.key('attempt')) ?? { id: 1, status: 'in_progress', state: null, segment: null };\n }\n\n private saveAttempt(attempt: NonNullable<LaunchData['attempt']>): void {\n this.store.set(this.key('attempt'), attempt);\n }\n\n private attemptState(payload: JsonObject): AckResult {\n const attempt = this.attempt();\n if (attempt.status === 'completed') {\n return { ok: false, error: 'completed', message: 'This attempt is already completed.' };\n }\n const size = JSON.stringify(payload.state ?? {}).length;\n if (size > 65536) {\n return { ok: false, error: 'validation', message: `State is ${size} bytes; the limit is 65536.` };\n }\n this.saveAttempt({ ...attempt, state: (payload.state as JsonObject) ?? null });\n\n return { ok: true };\n }\n\n private attemptSegment(payload: JsonObject): AckResult {\n const attempt = this.attempt();\n if (attempt.status === 'completed') {\n return { ok: false, error: 'completed' };\n }\n this.saveAttempt({ ...attempt, segment: (payload.segment as Record<string, string>) ?? null });\n\n return { ok: true };\n }\n\n private attemptComplete(payload: JsonObject): AckResult {\n const attempt = this.attempt();\n const completedAt = new Date().toISOString();\n if (attempt.status !== 'completed') {\n this.saveAttempt({ ...attempt, status: 'completed' });\n if (this.declares('activity')) {\n this.statement({ verb: 'completed', activity: { id: 'attempt', type: 'attempt' }, result: payload.summary ?? null, occurred_at: completedAt });\n }\n }\n\n return { ok: true, data: { status: 'completed', completed_at: completedAt } };\n }\n\n /** Clear a completed mock attempt so the experience can be run again. */\n public resetAttempt(): void {\n this.store.remove(this.key('attempt'));\n }\n\n // ---------------------------------------------------------------- activity\n\n private statement(payload: JsonObject): AckResult<{ id: string }> {\n const verb = String(payload.verb ?? '');\n if (!/^[a-z][a-z0-9_.:-]*$/.test(verb) || verb.length > 100) {\n return { ok: false, error: 'validation', message: `Invalid verb [${verb}].` };\n }\n const activity = payload.activity as { id?: string } | undefined;\n if (!activity?.id) {\n return { ok: false, error: 'validation', message: 'activity.id is required.' };\n }\n const id = `mock-${Date.now().toString(36)}-${this.statements.length + 1}`;\n this.statements.push({ id, ...payload });\n\n return { ok: true, data: { id } };\n }\n\n // ---------------------------------------------------------------- db\n\n private collectionKey(name: string): string {\n return this.key('db', name);\n }\n\n public records(collection: string): RecordRow[] {\n return this.store.get<RecordRow[]>(this.collectionKey(collection)) ?? [];\n }\n\n private saveRecords(collection: string, records: RecordRow[]): void {\n this.store.set(this.collectionKey(collection), records);\n }\n\n private collectionDeclared(name: string): AckResult | null {\n if (this.manifest && !(this.manifest.collections ?? []).some((c) => c.name === name)) {\n return { ok: false, error: 'not_found', message: `Collection [${name}] is not declared in the manifest.` };\n }\n const scope = (this.manifest?.collections ?? []).find((c) => c.name === name)?.scope;\n if (scope === 'attempt' && this.attempt().status === 'completed') {\n return { ok: false, error: 'completed', message: 'Attempt-scoped records are frozen after completion.' };\n }\n\n return null;\n }\n\n private dbCreate(payload: JsonObject): AckResult {\n const name = String(payload.collection);\n const declared = this.collectionDeclared(name);\n if (declared) {\n return declared;\n }\n const now = new Date().toISOString();\n const record: RecordRow = {\n id: `rec-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`,\n data: (payload.data as JsonObject) ?? {},\n owner_id: this.participantId,\n created_at: now,\n updated_at: now,\n };\n this.saveRecords(name, [...this.records(name), record]);\n\n return { ok: true, data: { record } };\n }\n\n private dbGet(payload: JsonObject): AckResult {\n const record = this.records(String(payload.collection)).find((r) => r.id === payload.id);\n\n return record ? { ok: true, data: { record } } : { ok: false, error: 'not_found' };\n }\n\n private dbUpdate(payload: JsonObject): AckResult {\n const name = String(payload.collection);\n const frozen = this.collectionDeclared(name);\n if (frozen && frozen.error === 'completed') {\n return frozen;\n }\n const records = this.records(name);\n const index = records.findIndex((r) => r.id === payload.id);\n if (index === -1) {\n return { ok: false, error: 'not_found' };\n }\n const merge = payload.merge !== false;\n const data = (payload.data as JsonObject) ?? {};\n records[index] = { ...records[index], data: merge ? { ...records[index].data, ...data } : data, updated_at: new Date().toISOString() };\n this.saveRecords(name, records);\n\n return { ok: true, data: { record: records[index] } };\n }\n\n private dbDelete(payload: JsonObject): AckResult {\n const name = String(payload.collection);\n const records = this.records(name);\n if (!records.some((r) => r.id === payload.id)) {\n return { ok: false, error: 'not_found' };\n }\n this.saveRecords(name, records.filter((r) => r.id !== payload.id));\n\n return { ok: true, data: { id: payload.id } };\n }\n\n private filter(records: RecordRow[], where: WhereClause[] | undefined): RecordRow[] {\n if (!where) {\n return records;\n }\n\n return records.filter((record) => where.every(([path, op, value]) => {\n const actual = path.split('.').reduce<unknown>((acc, part) => (acc as JsonObject | undefined)?.[part], record.data);\n switch (op) {\n case '=': return actual === value;\n case '!=': return actual !== value;\n case '<': return (actual as number) < (value as number);\n case '<=': return (actual as number) <= (value as number);\n case '>': return (actual as number) > (value as number);\n case '>=': return (actual as number) >= (value as number);\n case 'in': return Array.isArray(value) && value.includes(actual);\n default: return false;\n }\n }));\n }\n\n private dbList(payload: JsonObject): AckResult {\n const name = String(payload.collection);\n if (this.manifest && !(this.manifest.collections ?? []).some((c) => c.name === name)) {\n return { ok: false, error: 'not_found', message: `Collection [${name}] is not declared in the manifest.` };\n }\n let records = this.filter(this.records(name), payload.where as WhereClause[] | undefined);\n if (typeof payload.orderBy === 'string') {\n const path = payload.orderBy;\n const dir = payload.direction === 'desc' ? -1 : 1;\n records = [...records].sort((a, b) => {\n const av = path.split('.').reduce<unknown>((acc, p) => (acc as JsonObject | undefined)?.[p], a.data) as number | string;\n const bv = path.split('.').reduce<unknown>((acc, p) => (acc as JsonObject | undefined)?.[p], b.data) as number | string;\n\n return av < bv ? -dir : av > bv ? dir : 0;\n });\n }\n const limit = Math.min(Number(payload.limit ?? 50), 100);\n const offset = payload.cursor ? Number(payload.cursor) : 0;\n const page = records.slice(offset, offset + limit);\n const nextCursor = offset + limit < records.length ? String(offset + limit) : null;\n\n return { ok: true, data: { records: page, nextCursor } };\n }\n\n private dbCount(payload: JsonObject): AckResult {\n return { ok: true, data: { count: this.filter(this.records(String(payload.collection)), payload.where as WhereClause[] | undefined).length } };\n }\n\n // ---------------------------------------------------------------- storage\n\n public files(): StoredFile[] {\n return this.store.get<StoredFile[]>(this.key('files')) ?? [];\n }\n\n private storagePut(payload: JsonObject): AckResult {\n const upload = String(payload.upload);\n const slot = (this.manifest?.uploads ?? []).find((u) => u.name === upload);\n if (this.manifest && !slot) {\n return { ok: false, error: 'not_found', message: `Upload [${upload}] is not declared in the manifest.` };\n }\n const mime = String(payload.mime ?? '');\n if (slot?.mime && slot.mime.length > 0 && !slot.mime.some((m) => m === mime || (m.endsWith('/*') && mime.startsWith(m.slice(0, -1))))) {\n return { ok: false, error: 'validation', message: `MIME type [${mime}] is not allowed for upload [${upload}].` };\n }\n const bytes = Number(payload.bytes ?? 0);\n if (slot?.max_bytes && bytes > slot.max_bytes) {\n return { ok: false, error: 'quota_exceeded', message: `File is ${bytes} bytes; the limit is ${slot.max_bytes}.` };\n }\n const file: StoredFile = {\n id: `file-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`,\n upload,\n name: String(payload.name ?? 'blob'),\n mime,\n bytes,\n status: 'clean',\n created_at: new Date().toISOString(),\n };\n const blob = payload.file;\n if (typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function' && blob instanceof Blob) {\n this.blobs.set(file.id, URL.createObjectURL(blob));\n }\n this.store.set(this.key('files'), [...this.files(), file]);\n\n return { ok: true, data: { file } };\n }\n\n private storageUrl(payload: JsonObject): AckResult {\n const file = this.files().find((f) => f.id === payload.id);\n if (!file) {\n return { ok: false, error: 'not_found' };\n }\n\n return { ok: true, data: { url: this.blobs.get(file.id) ?? `mock://files/${file.id}`, expires_at: new Date(Date.now() + 600_000).toISOString() } };\n }\n\n private storageList(payload: JsonObject): AckResult {\n const files = this.files().filter((f) => !payload.upload || f.upload === payload.upload);\n\n return { ok: true, data: { files } };\n }\n\n private storageDelete(payload: JsonObject): AckResult {\n this.store.set(this.key('files'), this.files().filter((f) => f.id !== payload.id));\n\n return { ok: true, data: { id: payload.id } };\n }\n\n // ---------------------------------------------------------------- ai\n\n private prompt(id: string): { id: string; mode: 'analysis' | 'chat'; output_schema?: JsonObject } | null {\n return (this.manifest?.prompts ?? []).find((p) => p.id === id) ?? (this.manifest ? null : { id, mode: 'analysis' });\n }\n\n private async aiAsk(payload: JsonObject): Promise<AckResult> {\n const prompt = this.prompt(String(payload.prompt));\n if (!prompt) {\n return { ok: false, error: 'not_found', message: `Prompt [${payload.prompt}] is not declared in the manifest.` };\n }\n const handler = this.aiHandlers.get(prompt.id);\n const vars = (payload.vars as JsonObject) ?? {};\n const output = handler ? await handler(vars, 'analysis') : stubFromSchema(prompt.output_schema, vars);\n\n return { ok: true, data: { output, usage: { input_tokens: 42, output_tokens: 17 } } };\n }\n\n private async aiChat(payload: JsonObject): Promise<MockOutcome> {\n const prompt = this.prompt(String(payload.prompt));\n if (!prompt) {\n return { ok: false, error: 'not_found', message: `Prompt [${payload.prompt}] is not declared in the manifest.` };\n }\n const message = String(payload.message ?? '');\n const history = this.chatHistory.get(prompt.id) ?? [];\n history.push({ role: 'user', content: message });\n const handler = this.aiHandlers.get(prompt.id);\n const reply = handler ? String(await handler({ history }, 'chat', message)) : `[mock ${prompt.id}] You said: ${message}`;\n history.push({ role: 'assistant', content: reply });\n this.chatHistory.set(prompt.id, history);\n\n const words = reply.split(' ');\n const messageId = `msg-${Date.now().toString(36)}`;\n\n return {\n stream: (async function* () {\n for (let i = 0; i < words.length; i++) {\n yield { delta: (i === 0 ? '' : ' ') + words[i] };\n }\n })(),\n final: () => ({ message_id: messageId, text: reply, usage: { input_tokens: message.length, output_tokens: reply.length } }),\n };\n }\n\n // ---------------------------------------------------------------- broadcast (BroadcastChannel across tabs)\n\n private member(): RoomMember & { joinedAt: number } {\n return { id: this.participantId, name: this.participantName, role: this.role, present: true, joinedAt: this.joinedAt };\n }\n\n public members(): RoomMember[] {\n const now = Date.now();\n const others = [...this.roomMembers.values()].filter((m) => now - m.lastSeen < 15_000).map(({ lastSeen: _l, joinedAt: _j, ...m }) => m);\n const { joinedAt: _joined, ...self } = this.member();\n\n return [self, ...others].sort((a, b) => a.id - b.id);\n }\n\n private stateSnapshot(keys?: string[]): JsonObject {\n const snapshot: JsonObject = {};\n for (const [key, entry] of Object.entries(this.roomState)) {\n if (!keys || keys.includes(key)) {\n snapshot[key] = entry.value;\n }\n }\n\n return snapshot;\n }\n\n private send(message: JsonObject): void {\n this.channel?.postMessage({ ...message, sender: this.participantId });\n }\n\n private joinRoom(): void {\n if (this.channel) {\n return;\n }\n const mode = this.manifest?.broadcast?.mock_mode ?? 'first_in';\n // Optimistic first_in: this tab takes the role until an earlier facilitator answers.\n this.role = this.options.role ?? (mode === 'first_in' ? 'facilitator' : 'participant');\n\n if (typeof BroadcastChannel === 'undefined') {\n return;\n }\n this.channel = new BroadcastChannel(this.key('room'));\n this.channel.onmessage = (event: MessageEvent<JsonObject>) => this.onRoomMessage(event.data);\n this.send({ t: 'hello', from: this.member() });\n this.heartbeat = setInterval(() => this.send({ t: 'here', from: this.member() }), 5000);\n }\n\n /** An earlier facilitator wins; a later optimistic one steps down. */\n private reconcileFacilitator(from: RoomMember & { joinedAt?: number }): void {\n if (from.role === 'facilitator' && this.role === 'facilitator' && (from.joinedAt ?? 0) < this.joinedAt) {\n this.role = 'participant';\n this.pushEvent({ channel: '$room', event: 'role', payload: { role: 'participant', participant_id: this.participantId } });\n }\n }\n\n private onRoomMessage(data: JsonObject): void {\n const from = data.from as (RoomMember & { joinedAt?: number }) | undefined;\n if (data.sender === this.participantId) {\n return;\n }\n switch (data.t) {\n case 'hello':\n if (from) {\n this.roomMembers.set(from.id, { ...from, lastSeen: Date.now() });\n this.reconcileFacilitator(from);\n this.send({ t: 'here', from: this.member() });\n this.send({ t: 'state-sync', state: this.roomState });\n this.pushEvent({ channel: '$room', event: 'presence', payload: { members: this.members() } });\n }\n break;\n case 'here':\n if (from) {\n const known = this.roomMembers.has(from.id);\n this.roomMembers.set(from.id, { ...from, lastSeen: Date.now() });\n this.reconcileFacilitator(from);\n if (!known) {\n this.pushEvent({ channel: '$room', event: 'presence', payload: { members: this.members() } });\n }\n }\n break;\n case 'bye':\n if (from) {\n this.roomMembers.delete(from.id);\n this.pushEvent({ channel: '$room', event: 'presence', payload: { members: this.members() } });\n }\n break;\n case 'event':\n this.pushEvent({ channel: String(data.channel), event: String(data.event), payload: data.payload, from: { participant_id: Number(data.sender), role: (from?.role ?? 'participant') as RoomRole } });\n break;\n case 'state': {\n const key = String(data.key);\n const version = Number(data.version);\n if ((this.roomState[key]?.version ?? 0) <= version) {\n this.roomState[key] = { value: data.value, version };\n this.pushEvent({ channel: '$room', event: 'state', payload: { key, value: data.value, version } });\n }\n break;\n }\n case 'state-sync':\n for (const [key, entry] of Object.entries(data.state as Record<string, { value: unknown; version: number }>)) {\n if ((this.roomState[key]?.version ?? 0) < entry.version) {\n this.roomState[key] = entry;\n }\n }\n break;\n case 'role':\n if (from) {\n this.roomMembers.set(from.id, { ...from, lastSeen: Date.now() });\n if (from.role === 'facilitator' && this.role === 'facilitator') {\n this.role = 'participant';\n this.pushEvent({ channel: '$room', event: 'role', payload: { role: 'participant', participant_id: this.participantId } });\n }\n this.pushEvent({ channel: '$room', event: 'role', payload: { role: from.role, participant_id: from.id } });\n this.pushEvent({ channel: '$room', event: 'presence', payload: { members: this.members() } });\n }\n break;\n default:\n break;\n }\n }\n\n /**\n * A mock room is two tabs of the dev server, so the invite is this page:\n * scan it and the second tab joins over BroadcastChannel, exactly as the\n * real join URL would.\n */\n private invite(): AckResult {\n const url = typeof location === 'undefined' ? 'https://rack.test/r/MOCK01' : location.origin + location.pathname;\n\n return { ok: true, data: { code: 'MOCK01', url } };\n }\n\n private setRole(role: RoomRole): void {\n this.role = role;\n this.send({ t: 'role', from: this.member() });\n this.pushEvent({ channel: '$room', event: 'role', payload: { role, participant_id: this.participantId } });\n }\n\n private publish(payload: JsonObject): AckResult {\n const event = String(payload.event);\n const facilitatorOnly = this.manifest?.broadcast?.facilitator_events ?? [];\n if (facilitatorOnly.includes(event) && this.role !== 'facilitator') {\n return { ok: false, error: 'forbidden', message: `Event [${event}] may only be sent by the facilitator.` };\n }\n const from = { participant_id: this.participantId, role: this.role };\n this.send({ t: 'event', channel: payload.channel, event, payload: payload.payload, from: this.member() });\n this.pushEvent({ channel: String(payload.channel ?? 'main'), event, payload: payload.payload, from });\n\n return { ok: true };\n }\n\n private stateSet(payload: JsonObject): AckResult {\n const key = String(payload.key);\n const version = (this.roomState[key]?.version ?? 0) + 1;\n this.roomState[key] = { value: payload.value, version };\n this.send({ t: 'state', key, value: payload.value, version });\n this.pushEvent({ channel: '$room', event: 'state', payload: { key, value: payload.value, version } });\n\n return { ok: true, data: { version } };\n }\n\n private claim(): AckResult {\n this.setRole('facilitator');\n\n return { ok: true, data: { role: 'facilitator' } };\n }\n\n private transfer(payload: JsonObject): AckResult {\n if (this.role !== 'facilitator') {\n return { ok: false, error: 'forbidden', message: 'Only the facilitator can transfer the role.' };\n }\n const target = this.roomMembers.get(Number(payload.to));\n if (!target) {\n return { ok: false, error: 'not_found' };\n }\n this.role = 'participant';\n target.role = 'facilitator';\n this.send({ t: 'role', from: { ...target } });\n this.pushEvent({ channel: '$room', event: 'role', payload: { role: 'participant', participant_id: this.participantId } });\n this.pushEvent({ channel: '$room', event: 'role', payload: { role: 'facilitator', participant_id: target.id } });\n\n return { ok: true };\n }\n}\n\n/** A plausible object for an analysis prompt's output_schema, so UIs render in mock mode. */\nexport function stubFromSchema(schema: JsonObject | undefined, vars: JsonObject): unknown {\n if (!schema) {\n return { summary: `Mock analysis of ${JSON.stringify(vars).slice(0, 60)}` };\n }\n const type = schema.type;\n if (type === 'object') {\n const out: JsonObject = {};\n for (const [key, prop] of Object.entries((schema.properties as Record<string, JsonObject>) ?? {})) {\n out[key] = stubFromSchema(prop, vars);\n }\n\n return out;\n }\n if (type === 'array') {\n return [stubFromSchema(schema.items as JsonObject, vars)];\n }\n if (type === 'number' || type === 'integer') {\n return typeof schema.minimum === 'number' ? schema.minimum : 3;\n }\n if (type === 'boolean') {\n return true;\n }\n if (Array.isArray(schema.enum)) {\n return schema.enum[0];\n }\n\n return 'mock';\n}\n","import type { AckResult, JsonObject, RackEvent, SendOptions, Transport } from '../types';\nimport type { MockRack } from './MockRack';\n\n/**\n * Transport that fulfils every message locally through a MockRack.\n */\nexport class MockTransport implements Transport {\n public readonly kind = 'mock' as const;\n\n public constructor(public readonly rack: MockRack) {}\n\n public async send<T = JsonObject>(type: string, payload: unknown, options: SendOptions = {}): Promise<AckResult<T>> {\n const outcome = await this.rack.handle(type, (payload as JsonObject) ?? {});\n\n if ('stream' in outcome) {\n for await (const chunk of outcome.stream) {\n options.onPartial?.(chunk);\n }\n\n return { ok: true, data: outcome.final() as T };\n }\n\n return outcome as AckResult<T>;\n }\n\n public fire(type: string, payload: unknown = {}): void {\n void this.rack.handle(type, (payload as JsonObject) ?? {});\n }\n\n public onEvent(listener: (event: RackEvent) => void): () => void {\n return this.rack.onEvent(listener);\n }\n\n public dispose(): void {\n this.rack.dispose();\n }\n}\n","/**\n * Key/value persistence for the mock Rack. localStorage in the browser so a\n * standalone session survives a refresh; memory in tests.\n */\nexport interface Store {\n get<T>(key: string): T | null;\n set(key: string, value: unknown): void;\n remove(key: string): void;\n keys(prefix: string): string[];\n}\n\nexport class MemoryStore implements Store {\n private readonly data = new Map<string, string>();\n\n public get<T>(key: string): T | null {\n const raw = this.data.get(key);\n\n return raw === undefined ? null : (JSON.parse(raw) as T);\n }\n\n public set(key: string, value: unknown): void {\n this.data.set(key, JSON.stringify(value));\n }\n\n public remove(key: string): void {\n this.data.delete(key);\n }\n\n public keys(prefix: string): string[] {\n return [...this.data.keys()].filter((k) => k.startsWith(prefix));\n }\n}\n\nexport class LocalStore implements Store {\n public get<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n }\n\n public set(key: string, value: unknown): void {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Storage may be unavailable; mock mode tolerates that silently.\n }\n }\n\n public remove(key: string): void {\n try {\n window.localStorage.removeItem(key);\n } catch {\n // ignore\n }\n }\n\n public keys(prefix: string): string[] {\n try {\n const keys: string[] = [];\n for (let i = 0; i < window.localStorage.length; i++) {\n const key = window.localStorage.key(i);\n if (key && key.startsWith(prefix)) {\n keys.push(key);\n }\n }\n\n return keys;\n } catch {\n return [];\n }\n }\n}\n"],"names":["PROTOCOL_NAMESPACE","PROTOCOL_VERSION","FORMAT","requestCounter","newRequestId","cryptoRef","createEnvelope","type","payload","requestId","envelope","isEnvelope","data","candidate","capabilityOf","index","MockRack","manifest","store","options","parts","capability","ref","listener","event","l","nameHint","m","launch","item","user","attribute","a","b","c","u","p","promptId","handler","attempt","size","completedAt","verb","id","name","collection","records","declared","now","record","r","frozen","merge","where","path","op","value","actual","acc","part","dir","av","bv","limit","offset","page","nextCursor","upload","slot","mime","bytes","file","blob","f","prompt","vars","stubFromSchema","message","history","reply","words","messageId","i","others","_l","_j","_joined","self","keys","snapshot","key","entry","mode","from","known","version","role","target","schema","out","prop","MockTransport","rack","outcome","chunk","MemoryStore","raw","prefix","k","LocalStore"],"mappings":"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"}
|
package/dist/testing.js
CHANGED