@semiont/sdk 0.5.6 → 0.5.8
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/README.md +3 -3
- package/dist/index.d.ts +16 -14
- package/dist/index.js +18 -10
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/awaitable.ts","../src/bus-request.ts","../src/cache.ts","../src/namespaces/browse.ts","../src/namespaces/mark.ts","../src/namespaces/bind.ts","../src/namespaces/gather.ts","../src/namespaces/match.ts","../src/namespaces/yield.ts","../src/namespaces/beckon.ts","../src/namespaces/frame.ts","../src/namespaces/job.ts","../src/namespaces/auth.ts","../src/namespaces/admin.ts","../src/client.ts","../src/session/storage.ts","../src/session/errors.ts","../src/session/semiont-session.ts","../src/session/session-signals.ts","../src/session/semiont-browser.ts","../src/session/http-session-factory.ts","../src/session/registry.ts","../src/session/session-storage.ts","../src/session/knowledge-base.ts","../src/state/lib/state-unit.ts","../src/state/lib/search-pipeline.ts","../src/state/flows/beckon-state-unit.ts","../src/state/flows/gather-state-unit.ts","../src/state/flows/match-state-unit.ts","../src/state/flows/yield-state-unit.ts","../src/state/flows/mark-state-unit.ts"],"names":["filter","firstValueFrom","map","distinctUntilChanged","resourceId","annotationId","Observable","makeAnnotationId","makeResourceId","toResourceId","toAnnotationId","merge","takeUntil","timeout","makeEmail","makeRefreshToken","userId","BehaviorSubject","SemiontError","accessToken","baseUrl","HttpTransport","HttpContentTransport","EventBus","Subject"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Thenable Observable subclasses.\n *\n * Two thin Observable subclasses that also implement `PromiseLike<T>`. Used as\n * the public return type of namespace methods that emit streams (job\n * lifecycle, generation progress) and cache reads (Browse live queries).\n *\n * The point: scripts can `await` the call directly without `lastValueFrom` /\n * `firstValueFrom` wrappers; reactive consumers keep using `.subscribe(...)`\n * and `.pipe(...)` exactly as before.\n *\n * The asymmetric `.then()` semantics — last-value-on-completion for streams,\n * first-non-undefined-value for caches — is encoded by the subclass name. The\n * docstring on the namespace method tells the consumer which one applies.\n *\n * `.pipe(...)` returns a plain `Observable<T>` (RxJS doesn't propagate\n * subclasses through `pipe`). Once you compose, you've explicitly entered\n * RxJS land; `lastValueFrom` from `rxjs` is the right bridge there.\n */\n\nimport { Observable, firstValueFrom, lastValueFrom } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { ResourceId } from '@semiont/core';\n\n/**\n * Bounded Observable stream — emits zero-or-more progress values, then a\n * final value on completion. Used by job-lifecycle methods like\n * `mark.assist`, `gather.annotation`, `match.search`, `yield.fromAnnotation`.\n *\n * Awaiting resolves to the **last** emitted value (via `lastValueFrom`).\n * Subscribing yields every emission, ending in `complete`.\n */\nexport class StreamObservable<T> extends Observable<T> implements PromiseLike<T> {\n then<R1 = T, R2 = never>(\n onfulfilled?: ((v: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n return lastValueFrom(this).then(onfulfilled, onrejected);\n }\n\n /** Wrap an existing Observable's subscribe behavior in a StreamObservable. */\n static from<T>(source: Observable<T>): StreamObservable<T> {\n return new StreamObservable<T>((subscriber) => source.subscribe(subscriber));\n }\n}\n\n/**\n * Multicast cache observable — emits `undefined` while the underlying value\n * is loading, then the value, then re-emits when bus events invalidate the\n * cache entry. Used by Browse live-query methods (`browse.resource`,\n * `browse.annotations`, etc.).\n *\n * Awaiting (the one-shot path) fetches a **fresh** value via the optional\n * `fetchFresh` action and rejects on failure — a re-read reflects writes\n * (#847). Subscribing yields the SWR sequence: the initial `undefined`, the\n * loaded value, and re-emits on invalidation. (Without a `fetchFresh` action\n * — e.g. a non-cache wrapper — the await falls back to the first\n * non-undefined emission.)\n *\n * The class is parameterized as `CacheObservable<T>` even though the\n * stream's element type is `T | undefined` — `T` is what the consumer\n * gets from `await`, and that's the contract we want to advertise. The\n * `Observable<T | undefined>` shape leaks through `.subscribe` and\n * `.pipe` in the natural way.\n */\nexport class CacheObservable<T> extends Observable<T | undefined> implements PromiseLike<T> {\n /**\n * Optional one-shot fresh-fetch action. When present, `then()` (the await\n * path) resolves to a freshly fetched value and rejects on fetch failure —\n * so a re-read reflects writes (#847). `.subscribe(...)` never uses it: it\n * keeps the stale-while-revalidate cached view over `source`.\n */\n private fetchFresh?: () => Promise<T>;\n\n then<R1 = T, R2 = never>(\n onfulfilled?: ((v: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n if (this.fetchFresh) {\n // One-shot read: fetch fresh (rejects on failure), don't serve the memo.\n return this.fetchFresh().then(onfulfilled, onrejected);\n }\n // Non-cache wrapper: resolve to the first non-undefined emission.\n return firstValueFrom(this.pipe(filter((v): v is T => v !== undefined)))\n .then(onfulfilled, onrejected);\n }\n\n /**\n * Wrap an existing Observable's subscribe behavior in a `CacheObservable`.\n *\n * `fetchFresh`, when supplied, backs the await path: `await` resolves to a\n * freshly fetched value (rejecting on failure), so a one-shot read reflects\n * writes without a scoped subscription (#847). `.subscribe(...)` consumers\n * keep the SWR view over `source`.\n *\n * Memoizes on source identity: passing the same `source` returns the same\n * wrapper instance. The Browse cache primitive already returns a stable\n * Observable per key (its B4 contract), so this preserves that contract\n * through the awaitable wrapping. Without the memo, every public-method\n * call would produce a fresh wrapper and break referential-equality\n * guarantees that hook-style reactive consumers depend on.\n *\n * Backed by a `WeakMap`, so wrappers are GC'd when their source is.\n */\n static from<T>(source: Observable<T | undefined>, fetchFresh?: () => Promise<T>): CacheObservable<T> {\n let wrapper = wrapperCache.get(source) as CacheObservable<T> | undefined;\n if (!wrapper) {\n wrapper = new CacheObservable<T>((subscriber) => source.subscribe(subscriber));\n wrapper.fetchFresh = fetchFresh;\n wrapperCache.set(source, wrapper);\n }\n return wrapper;\n }\n}\n\nconst wrapperCache = new WeakMap<Observable<unknown>, CacheObservable<unknown>>();\n\n/**\n * Discriminated phases of an upload's lifecycle.\n *\n * - `started` — emitted immediately on `yield.resource(...)` invocation, before any bytes flow.\n * - `progress` — emitted as bytes flow over the wire. Wired by `HttpContentTransport`'s XHR path when a caller passes `onProgress` (or, transitively, when `yield.resource` is the caller — it always wires the hook so subscribers see byte counts). `bytesUploaded` and `totalBytes` carry the running counts; `totalBytes` may be 0 when the transport can't determine the total (rare, e.g. chunked encoding) — UI consumers should render an indeterminate state in that case.\n * - `finished` — emitted on backend acknowledgement, carries the assigned `resourceId`.\n *\n * Failures surface as `Observable.error(...)` (typically an `APIError` from the transport's `errors$` Subject), not as a `phase: 'failed'` event — `subscribe`'s error callback handles them. Cancellation is honored: unsubscribing before `finished` aborts the in-flight HTTP request on the XHR path.\n */\nexport type UploadProgress =\n | { phase: 'started'; totalBytes: number }\n | { phase: 'progress'; bytesUploaded: number; totalBytes: number }\n | { phase: 'finished'; resourceId: ResourceId };\n\n/**\n * Specialized `StreamObservable` for `yield.resource`. Subscribers see the\n * full `UploadProgress` event sequence (started → optional progress → finished).\n * Awaiting resolves specifically to `{ resourceId }` extracted from the\n * `'finished'` event — preserving the pre-Phase-18 awaited shape so existing\n * `await client.yield.resource(...)` callers don't need to narrow the union.\n */\nexport class UploadObservable extends Observable<UploadProgress> implements PromiseLike<{ resourceId: ResourceId }> {\n then<R1 = { resourceId: ResourceId }, R2 = never>(\n onfulfilled?: ((v: { resourceId: ResourceId }) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n return lastValueFrom(this).then((v) => {\n if (v.phase !== 'finished') {\n throw new Error(`UploadObservable resolved on a non-finished event: ${v.phase}`);\n }\n const result = { resourceId: v.resourceId };\n return onfulfilled ? onfulfilled(result) : (result as unknown as R1);\n }, onrejected);\n }\n}\n","import { Observable, firstValueFrom, merge, throwError, TimeoutError } from 'rxjs';\nimport { catchError, filter, map, take, timeout } from 'rxjs/operators';\nimport { SemiontError, type EventMap } from '@semiont/core';\n\nexport type BusRequestErrorCode =\n | 'bus.timeout'\n | 'bus.rejected'\n | 'bus.bad-payload'\n | 'bus.unauthorized'\n | 'bus.forbidden'\n | 'bus.not-found';\n\nexport class BusRequestError extends SemiontError {\n declare code: BusRequestErrorCode;\n\n constructor(message: string, code: BusRequestErrorCode, details?: Record<string, unknown>) {\n super(message, code, details);\n this.name = 'BusRequestError';\n }\n}\n\n/**\n * Subset of ITransport that `busRequest` needs: a way to send a command and\n * a way to observe channels. Generic enough that an in-process transport\n * can satisfy it without round-tripping through HTTP.\n */\nexport interface BusRequestPrimitive {\n emit<K extends keyof EventMap>(channel: K, payload: EventMap[K]): Promise<void>;\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]>;\n}\n\nexport async function busRequest<TResult>(\n bus: BusRequestPrimitive,\n emitChannel: string,\n payload: Record<string, unknown>,\n resultChannel: string,\n failureChannel: string,\n timeoutMs = 30_000,\n): Promise<TResult> {\n const correlationId = crypto.randomUUID();\n const fullPayload = { ...payload, correlationId };\n\n const result$ = merge(\n (bus.stream(resultChannel as keyof EventMap) as Observable<Record<string, unknown>>).pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({ ok: true as const, response: e.response as TResult })),\n ),\n (bus.stream(failureChannel as keyof EventMap) as Observable<Record<string, unknown>>).pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({\n ok: false as const,\n error: new BusRequestError((e.message as string) ?? 'Bus request rejected', 'bus.rejected', {\n channel: failureChannel,\n correlationId,\n payload: e,\n }),\n })),\n ),\n ).pipe(\n take(1),\n timeout(timeoutMs),\n catchError((err) => {\n if (err instanceof TimeoutError) {\n return throwError(\n () =>\n new BusRequestError(\n `Bus request timed out after ${timeoutMs}ms on ${resultChannel}`,\n 'bus.timeout',\n { channel: emitChannel, resultChannel, correlationId, timeoutMs },\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n\n // Subscribe before emitting so we don't miss an instantaneous reply\n // (which can happen with an in-process LocalTransport bus).\n const resultPromise = firstValueFrom(result$);\n\n try {\n await bus.emit(emitChannel as keyof EventMap, fullPayload as EventMap[keyof EventMap]);\n } catch (err) {\n // If emit threw, control is about to leave this function without\n // anyone awaiting `resultPromise`. Its subscription stays open\n // until the bus completes (e.g. during `semiont.dispose()`), at\n // which point firstValueFrom throws EmptyError with no consumer —\n // surfacing as an uncaught rejection in skill scripts as a\n // cosmetic stack trace after `Done.`.\n //\n // Attach a no-op handler so the eventual rejection has somewhere\n // to land. We can't actively cancel the firstValueFrom\n // subscription (its Promise type exposes no handle), but\n // suppressing its unhandled-rejection is enough; the bus's\n // natural lifecycle tears the subscription down whenever it ends.\n resultPromise.catch(() => {});\n throw err;\n }\n\n const result = await resultPromise;\n if (!result.ok) {\n throw result.error;\n }\n return result.response;\n}\n","/**\n * RxJS-native read-through cache primitive.\n *\n * Behavioral contract: packages/sdk/docs/CACHE-SEMANTICS.md (B1–B13).\n *\n * Framework-agnostic: no React, no dependency on any namespace. Used by\n * `BrowseNamespace` to back its per-key stores, but equally usable from\n * CLI, MCP, or worker code.\n *\n * Two consumption paths with different freshness semantics:\n * - `observe(key)` (the subscribe path) is a stale-while-revalidate live\n * view: it triggers a fetch on first subscription for a missing key,\n * dedup-joins any concurrent fetch, then emits the stored value and\n * re-emits on invalidation.\n * - `fetch(key)` (the one-shot await path) forces a fresh fetch, so a\n * re-read reflects writes rather than serving the memo.\n *\n * Shape:\n * - `observe(key)`: Observable<V | undefined> — subscribe path (SWR).\n * - `fetch(key)`: force a fresh fetch (bypassing the memo), update the\n * store (so subscribers see it too), and resolve with the value —\n * rejecting if the fetch fails. Concurrent calls for the same key share\n * one in-flight fetch. Backs the one-shot `await` path.\n * - `invalidate(key)`: stale-while-revalidate — keeps the current value\n * visible to observers, clears the in-flight guard, starts a fresh\n * fetch. Recovers an orphaned fetch (SSE torn down, response lost).\n * - `remove(key)`: drops the cache entry entirely (B13a). No refetch.\n * - `set(key, value)`: write-through without a fetch (B13b).\n * - `invalidateAll()`: per-key SWR refetch of every currently-cached entry.\n * - `dispose()`: completes the store so observers unsubscribe.\n *\n * What's deliberately out:\n * - No subscriber ref-counting / GC of unobserved keys (B11). Acceptable\n * given cache lifetime == client lifetime.\n * - No TTL / cacheTime. Entries are evicted only by explicit remove.\n * - No retry / backoff. A failing fetch leaves the cache unchanged for\n * *subscribers* (B6); the `fetch`/await path surfaces the rejection so\n * the caller can retry.\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs';\n\nexport interface Cache<K, V> {\n /** Observable stream of the value at `key` (SWR). Triggers a fetch if not cached. */\n observe(key: K): Observable<V | undefined>;\n\n /**\n * Force a fresh fetch for `key`, update the store (so subscribers see it),\n * and resolve with the fetched value — rejecting if the fetch fails.\n * Concurrent calls for the same key share one in-flight fetch. Backs the\n * one-shot `await` path: a re-read reflects writes rather than serving the\n * memoized value. Live-query *subscribers* (`observe`) keep B6 — a failed\n * fetch leaves their value untouched.\n */\n fetch(key: K): Promise<V>;\n\n /** Synchronous snapshot of the current value, without triggering a fetch. */\n get(key: K): V | undefined;\n\n /** Iterator of currently-cached keys. For invalidateAll and diagnostics. */\n keys(): K[];\n\n /**\n * Mark the entry stale and refetch. Keeps the previous value visible\n * to observers during the refetch (stale-while-revalidate).\n */\n invalidate(key: K): void;\n\n /** Drop the entry from the cache. No refetch. */\n remove(key: K): void;\n\n /** Write-through: set the value directly without a fetch. */\n set(key: K, value: V): void;\n\n /** Per-key SWR refetch of every currently-cached entry. */\n invalidateAll(): void;\n\n /** Release the underlying subject. Observers complete. */\n dispose(): void;\n}\n\nexport function createCache<K, V>(fetchFn: (key: K) => Promise<V>): Cache<K, V> {\n const store$ = new BehaviorSubject<Map<K, V>>(new Map());\n /** In-flight fetch promise per key — dedups concurrent fetches (B3). */\n const inflight = new Map<K, Promise<V>>();\n const obsCache = new Map<K, Observable<V | undefined>>();\n\n /**\n * Run (or join) a fetch for `key`. Resolves with the value and updates the\n * store on success; rejects on failure WITHOUT touching the store (B6 —\n * subscribers keep their prior value / loading state). Concurrent callers\n * share the same promise.\n */\n const runFetch = (key: K): Promise<V> => {\n const existing = inflight.get(key);\n if (existing) return existing;\n\n // Definite-assignment: `p` is assigned synchronously below, before the\n // async `finally` (which references it) can run.\n let p!: Promise<V>;\n p = (async () => {\n try {\n const value = await fetchFn(key);\n // Atomic update: one `.next` with a fresh Map reference so\n // downstream `distinctUntilChanged` sees the transition (B5).\n const next = new Map(store$.value);\n next.set(key, value);\n store$.next(next);\n return value;\n } finally {\n // Only clear if we're still the in-flight entry — an `invalidate`\n // may have replaced us with a newer fetch (B9 orphan recovery).\n if (inflight.get(key) === p) inflight.delete(key);\n }\n })();\n inflight.set(key, p);\n return p;\n };\n\n return {\n observe(key: K): Observable<V | undefined> {\n if (!store$.value.has(key) && !inflight.has(key)) {\n // Subscribe path: fire-and-forget, swallow failures so a subscriber\n // stays at its last value (B6). The awaiter's `fetch` surfaces them.\n void runFetch(key).catch(() => {});\n }\n // B4: return a stable Observable per key.\n let obs = obsCache.get(key);\n if (!obs) {\n obs = store$.pipe(\n map((m) => m.get(key)),\n distinctUntilChanged(),\n );\n obsCache.set(key, obs);\n }\n return obs;\n },\n\n fetch(key: K): Promise<V> {\n return runFetch(key);\n },\n\n get(key: K): V | undefined {\n return store$.value.get(key);\n },\n\n keys(): K[] {\n return [...store$.value.keys()];\n },\n\n invalidate(key: K): void {\n // B7: do NOT erase the value. Clear the guard (B9 orphan recovery)\n // and trigger a fresh fetch. Observers keep seeing the stale value\n // until the new value replaces it.\n inflight.delete(key);\n void runFetch(key).catch(() => {});\n },\n\n remove(key: K): void {\n // B13a: drop the entry. The value is gone; observers see `undefined`.\n const next = new Map(store$.value);\n next.delete(key);\n store$.next(next);\n inflight.delete(key);\n },\n\n set(key: K, value: V): void {\n // B13b: write-through. No fetch. Atomic update.\n const next = new Map(store$.value);\n next.set(key, value);\n store$.next(next);\n },\n\n invalidateAll(): void {\n // Per-key SWR refetch of every currently-cached entry. Each entry\n // keeps its stale value until its refetch resolves.\n for (const key of store$.value.keys()) {\n inflight.delete(key);\n void runFetch(key).catch(() => {});\n }\n },\n\n dispose(): void {\n store$.complete();\n obsCache.clear();\n inflight.clear();\n },\n };\n}\n","import { Observable, map } from 'rxjs';\nimport { CacheObservable } from '../awaitable';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId, searchQuery } from '@semiont/core';\nimport type {\n Annotation,\n EventBus,\n EventMap,\n ResourceDescriptor,\n ResourceId,\n AnnotationId,\n GraphConnection,\n Motivation,\n TagSchema,\n components,\n} from '@semiont/core';\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { createCache, type Cache } from '../cache';\nimport type {\n BrowseNamespace as IBrowseNamespace,\n ReferencedByEntry,\n AnnotationHistoryResponse,\n} from './types';\ntype StoredEventResponse = components['schemas']['StoredEventResponse'];\ntype EnrichedResourceEvent = components['schemas']['EnrichedResourceEvent'];\n\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\ntype AnnotationsListResponse = components['schemas']['GetAnnotationsResponse'];\n\ntype ResourceListFilters = {\n limit?: number;\n archived?: boolean;\n search?: string;\n entityType?: string;\n};\n\n/** Sentinel key for the singleton entity-types cache. */\nconst ENTITY_TYPES_KEY = '_';\n\n/** Sentinel key for the singleton tag-schemas cache. */\nconst TAG_SCHEMAS_KEY = '_';\n\nexport class BrowseNamespace implements IBrowseNamespace {\n // ── Caches, backed by the RxJS-native `Cache<K, V>` primitive ───────────\n //\n // Each cache encapsulates the BehaviorSubject store, in-flight guard,\n // and per-key observable memoization that was previously open-coded\n // here. Behavioral contract: `packages/sdk/docs/CACHE-SEMANTICS.md`.\n //\n // Public surface (`resource()`, `annotations()`, etc.) is unchanged;\n // the caches are an implementation detail of this namespace.\n\n private readonly resourceCache: Cache<ResourceId, ResourceDescriptor>;\n private readonly resourceListCache: Cache<string, ResourceDescriptor[]>;\n private readonly annotationListCache: Cache<ResourceId, AnnotationsListResponse>;\n /**\n * Annotation-detail cache keyed by `annotationId` only — the resourceId\n * is a routing hint for the backend fetch, not an identity component.\n * We track the most recent resourceId per annotationId in a side-map\n * so `mark:delete-ok` (which carries only `annotationId`) can reach\n * the right cache entry. Aligns with the pre-refactor semantics.\n */\n private readonly annotationDetailCache: Cache<AnnotationId, Annotation>;\n private readonly annotationResources = new Map<AnnotationId, ResourceId>();\n private readonly entityTypesCache: Cache<string, string[]>;\n private readonly tagSchemasCache: Cache<string, TagSchema[]>;\n private readonly referencedByCache: Cache<ResourceId, ReferencedByEntry[]>;\n private readonly resourceEventsCache: Cache<ResourceId, StoredEventResponse[]>;\n\n /** Filter-blob memory so `invalidateResourceLists` can replay per-key. */\n private readonly resourceListFilters = new Map<string, ResourceListFilters>();\n\n /**\n * Per-key memo for `annotations()` observables. The cache stores the\n * full `AnnotationsListResponse`; the public shape is just the inner\n * `Annotation[]`. Without this memo, every call to `annotations(rId)`\n * would produce a fresh `.pipe(map(...))` observable, violating B4\n * (per-key observable stability). Consumers that compare observable\n * identity — React hooks depending on the observable reference,\n * `distinctUntilChanged` at a higher level — would misbehave.\n */\n private readonly annotationListObs = new Map<ResourceId, Observable<Annotation[] | undefined>>();\n\n /**\n * Per-source memo for the scope-acquiring wrapper (#847 Phase 4), keyed by\n * the underlying (stable, per-key) cache observable so the wrapped\n * observable is itself stable per key — preserving B4/B11 referential\n * identity through to `CacheObservable.from`'s own memo.\n */\n private readonly scopedSources = new WeakMap<Observable<unknown>, Observable<unknown>>();\n\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n private readonly content: IContentTransport,\n ) {\n this.resourceCache = createCache<ResourceId, ResourceDescriptor>(async (id) => {\n const result = await busRequest<GetResourceResponse>(\n this.transport,\n 'browse:resource-requested',\n { resourceId: id },\n 'browse:resource-result',\n 'browse:resource-failed',\n );\n return result.resource as ResourceDescriptor;\n });\n\n this.resourceListCache = createCache<string, ResourceDescriptor[]>(async (key) => {\n const filters = this.resourceListFilters.get(key) ?? {};\n const search = filters.search ? searchQuery(filters.search) : undefined;\n const result = await busRequest<{ resources: ResourceDescriptor[] }>(\n this.transport,\n 'browse:resources-requested',\n {\n search,\n archived: filters.archived,\n entityType: filters.entityType,\n limit: filters.limit ?? 100,\n offset: 0,\n },\n 'browse:resources-result',\n 'browse:resources-failed',\n );\n return result.resources;\n });\n\n this.annotationListCache = createCache<ResourceId, AnnotationsListResponse>(async (resourceId) => {\n return busRequest<AnnotationsListResponse>(\n this.transport,\n 'browse:annotations-requested',\n { resourceId },\n 'browse:annotations-result',\n 'browse:annotations-failed',\n );\n });\n\n this.annotationDetailCache = createCache<AnnotationId, Annotation>(async (annotationId) => {\n const resourceId = this.annotationResources.get(annotationId);\n if (!resourceId) {\n throw new Error(`Cannot fetch annotation ${annotationId}: no resourceId known`);\n }\n const result = await busRequest<{ annotation: Annotation }>(\n this.transport,\n 'browse:annotation-requested',\n { resourceId, annotationId },\n 'browse:annotation-result',\n 'browse:annotation-failed',\n );\n return result.annotation;\n });\n\n this.entityTypesCache = createCache<string, string[]>(async () => {\n const result = await busRequest<{ entityTypes: string[] }>(\n this.transport,\n 'browse:entity-types-requested',\n {},\n 'browse:entity-types-result',\n 'browse:entity-types-failed',\n );\n return result.entityTypes;\n });\n\n this.tagSchemasCache = createCache<string, TagSchema[]>(async () => {\n const result = await busRequest<{ tagSchemas: TagSchema[] }>(\n this.transport,\n 'browse:tag-schemas-requested',\n {},\n 'browse:tag-schemas-result',\n 'browse:tag-schemas-failed',\n );\n return result.tagSchemas;\n });\n\n this.referencedByCache = createCache<ResourceId, ReferencedByEntry[]>(async (resourceId) => {\n const result = await busRequest<{ referencedBy: ReferencedByEntry[] }>(\n this.transport,\n 'browse:referenced-by-requested',\n { resourceId },\n 'browse:referenced-by-result',\n 'browse:referenced-by-failed',\n );\n return result.referencedBy;\n });\n\n this.resourceEventsCache = createCache<ResourceId, StoredEventResponse[]>(async (resourceId) => {\n const result = await busRequest<{ events: StoredEventResponse[] }>(\n this.transport,\n 'browse:events-requested',\n { resourceId },\n 'browse:events-result',\n 'browse:events-failed',\n );\n return result.events;\n });\n\n this.subscribeToEvents();\n }\n\n /**\n * Wrap a resource-scoped live query's source so that *subscribing* acquires\n * the resource's scope (via the transport's ref-counted\n * `subscribeToResource`) and the last unsubscribe releases it (#847 Phase 4).\n * Freshness follows observation: a `.subscribe()` keeps `rId`'s scoped\n * events flowing — so `mark:*` / entity-tag invalidations reach this cache —\n * with no separate `subscribeToResource` call from the consumer.\n *\n * The one-shot `await` path does NOT go through here (it resolves via the\n * cache's `fetch` — see `CacheObservable.from`'s `fetchFresh`), so a\n * one-shot read acquires no scope.\n *\n * Memoized per source so the wrapped observable is stable per key (B4/B11).\n * Each subscription calls `subscribeToResource(rId)`; the transport\n * ref-counts concurrent subscriptions for the same resource onto a single\n * SSE scope. Single-scope model unchanged — multi-scope is deferred (see\n * `.plans/MULTI-RESOURCE-SCOPE.md`).\n */\n private withScope<T>(rId: ResourceId, source: Observable<T | undefined>): Observable<T | undefined> {\n let scoped = this.scopedSources.get(source) as Observable<T | undefined> | undefined;\n if (!scoped) {\n scoped = new Observable<T | undefined>((subscriber) => {\n const release = this.transport.subscribeToResource(rId);\n const inner = source.subscribe(subscriber);\n return () => {\n inner.unsubscribe();\n release();\n };\n });\n this.scopedSources.set(source, scoped);\n }\n return scoped;\n }\n\n // ── Live queries ────────────────────────────────────────────────────────\n //\n // These return `CacheObservable<T>`: subscribers see `T | undefined`\n // (with `undefined` during initial load), and `await` resolves to the\n // first non-undefined value.\n\n resource(resourceId: ResourceId): CacheObservable<ResourceDescriptor> {\n return CacheObservable.from(this.withScope(resourceId, this.resourceCache.observe(resourceId)), () => this.resourceCache.fetch(resourceId));\n }\n\n resources(filters?: ResourceListFilters): CacheObservable<ResourceDescriptor[]> {\n const key = JSON.stringify(filters ?? {});\n // Remember the filter blob so `invalidateResourceLists` can drive\n // per-key SWR refetches without the caller re-passing filters.\n this.resourceListFilters.set(key, filters ?? {});\n return CacheObservable.from(this.resourceListCache.observe(key), () => this.resourceListCache.fetch(key));\n }\n\n annotations(resourceId: ResourceId): CacheObservable<Annotation[]> {\n let obs = this.annotationListObs.get(resourceId);\n if (!obs) {\n obs = this.annotationListCache.observe(resourceId).pipe(map((r) => r?.annotations as Annotation[] | undefined));\n this.annotationListObs.set(resourceId, obs);\n }\n return CacheObservable.from(this.withScope(resourceId, obs), () => this.annotationListCache.fetch(resourceId).then((r) => r.annotations as Annotation[]));\n }\n\n annotation(resourceId: ResourceId, annotationId: AnnotationId): CacheObservable<Annotation> {\n // Record the routing hint so the cache's fetchFn (which only sees\n // the cache key, `annotationId`) can look up the resourceId it\n // needs for the bus request.\n this.annotationResources.set(annotationId, resourceId);\n return CacheObservable.from(this.withScope(resourceId, this.annotationDetailCache.observe(annotationId)), () => this.annotationDetailCache.fetch(annotationId));\n }\n\n entityTypes(): CacheObservable<string[]> {\n return CacheObservable.from(this.entityTypesCache.observe(ENTITY_TYPES_KEY), () => this.entityTypesCache.fetch(ENTITY_TYPES_KEY));\n }\n\n tagSchemas(): CacheObservable<TagSchema[]> {\n return CacheObservable.from(this.tagSchemasCache.observe(TAG_SCHEMAS_KEY), () => this.tagSchemasCache.fetch(TAG_SCHEMAS_KEY));\n }\n\n referencedBy(resourceId: ResourceId): CacheObservable<ReferencedByEntry[]> {\n return CacheObservable.from(this.withScope(resourceId, this.referencedByCache.observe(resourceId)), () => this.referencedByCache.fetch(resourceId));\n }\n\n events(resourceId: ResourceId): CacheObservable<StoredEventResponse[]> {\n return CacheObservable.from(this.withScope(resourceId, this.resourceEventsCache.observe(resourceId)), () => this.resourceEventsCache.fetch(resourceId));\n }\n\n // ── One-shot reads ──────────────────────────────────────────────────────\n\n async resourceContent(resourceId: ResourceId): Promise<string> {\n const result = await this.content.getBinary(resourceId, { accept: 'text/plain' });\n const decoder = new TextDecoder();\n return decoder.decode(result.data);\n }\n\n async resourceRepresentation(\n resourceId: ResourceId,\n options?: { accept?: string },\n ): Promise<{ data: ArrayBuffer; contentType: string }> {\n return this.content.getBinary(resourceId, options?.accept ? { accept: options.accept } : undefined);\n }\n\n async resourceRepresentationStream(\n resourceId: ResourceId,\n options?: { accept?: string },\n ): Promise<{ stream: ReadableStream<Uint8Array>; contentType: string }> {\n return this.content.getBinaryStream(resourceId, options?.accept ? { accept: options.accept } : undefined);\n }\n\n async resourceEvents(resourceId: ResourceId): Promise<StoredEventResponse[]> {\n const result = await busRequest<{ events: StoredEventResponse[] }>(\n this.transport,\n 'browse:events-requested',\n { resourceId },\n 'browse:events-result',\n 'browse:events-failed',\n );\n return result.events;\n }\n\n async annotationHistory(resourceId: ResourceId, annotationId: AnnotationId): Promise<AnnotationHistoryResponse> {\n return busRequest<AnnotationHistoryResponse>(\n this.transport,\n 'browse:annotation-history-requested',\n { resourceId, annotationId },\n 'browse:annotation-history-result',\n 'browse:annotation-history-failed',\n );\n }\n\n async connections(_resourceId: ResourceId): Promise<GraphConnection[]> {\n throw new Error('Not implemented: connections endpoint does not exist yet');\n }\n\n async backlinks(_resourceId: ResourceId): Promise<Annotation[]> {\n throw new Error('Not implemented: backlinks endpoint does not exist yet');\n }\n\n async resourcesByName(_query: string, _limit?: number): Promise<ResourceDescriptor[]> {\n throw new Error('Not implemented: resourcesByName endpoint does not exist yet');\n }\n\n async files(\n dirPath?: string,\n sort?: 'name' | 'mtime' | 'annotationCount',\n ): Promise<components['schemas']['BrowseFilesResponse']> {\n return busRequest<components['schemas']['BrowseFilesResponse']>(\n this.transport,\n 'browse:directory-requested',\n { path: dirPath ?? '.', sort: sort ?? 'name' },\n 'browse:directory-result',\n 'browse:directory-failed',\n );\n }\n\n // ── UI signals (local bus fan-out) ────────────────────────────────────\n\n click(annotationId: AnnotationId, motivation: Motivation): void {\n this.bus.get('browse:click').next({ annotationId, motivation });\n }\n\n navigateReference(resourceId: ResourceId): void {\n this.bus.get('browse:reference-navigate').next({ resourceId });\n }\n\n // ── Cache-mutation API (used by the bus-event subscribers below and by\n // other namespaces that know about specific updates) ─────────────────\n //\n // - `invalidate*` — SWR refetch (B7). Keeps prior value visible.\n // - `removeAnnotationDetail` — drops the entry (B13a: entity gone).\n // - `updateAnnotationInPlace` — write-through (B13b: new value known).\n\n invalidateAnnotationList(resourceId: ResourceId): void {\n this.annotationListCache.invalidate(resourceId);\n }\n\n removeAnnotationDetail(annotationId: AnnotationId): void {\n this.annotationDetailCache.remove(annotationId);\n this.annotationResources.delete(annotationId);\n }\n\n invalidateResourceDetail(id: ResourceId): void {\n this.resourceCache.invalidate(id);\n }\n\n invalidateResourceLists(): void {\n this.resourceListCache.invalidateAll();\n }\n\n invalidateEntityTypes(): void {\n this.entityTypesCache.invalidate(ENTITY_TYPES_KEY);\n }\n\n invalidateTagSchemas(): void {\n this.tagSchemasCache.invalidate(TAG_SCHEMAS_KEY);\n }\n\n invalidateReferencedBy(resourceId: ResourceId): void {\n this.referencedByCache.invalidate(resourceId);\n }\n\n invalidateResourceEvents(resourceId: ResourceId): void {\n this.resourceEventsCache.invalidate(resourceId);\n }\n\n updateAnnotationInPlace(resourceId: ResourceId, annotation: Annotation): void {\n // Write-through to the per-resource list cache (splicing the\n // updated annotation into the in-memory list response).\n const currentList = this.annotationListCache.get(resourceId);\n if (currentList) {\n const idx = currentList.annotations.findIndex((a) => a.id === annotation.id);\n const nextAnnotations =\n idx >= 0\n ? currentList.annotations.map((a, i) => (i === idx ? annotation : a))\n : [...currentList.annotations, annotation];\n this.annotationListCache.set(resourceId, { ...currentList, annotations: nextAnnotations });\n }\n\n // And to the per-annotation detail cache, so observers of\n // `annotation(id)` see the new value without a refetch.\n const aId = makeAnnotationId(annotation.id);\n this.annotationResources.set(aId, resourceId);\n this.annotationDetailCache.set(aId, annotation);\n }\n\n // ── EventBus subscriptions ──────────────────────────────────────────────\n\n /**\n * Typed shorthand for `eventBus.get(channel).subscribe(handler)`.\n * Preserves per-channel payload typing so handlers read\n * `EventMap[K]` without any casts.\n */\n private on<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): void {\n (this.bus.get(channel) as { subscribe(fn: (p: EventMap[K]) => void): unknown }).subscribe(handler);\n }\n\n /**\n * Handler shared by `mark:entity-tag-added` and `mark:entity-tag-removed`.\n * Both events carry the same effect: the annotation list, the\n * resource descriptor, and the event log for that resource all may\n * now reflect different entity tagging, so invalidate all three.\n */\n private onEntityTagChanged = (stored: { resourceId?: ResourceId }): void => {\n if (!stored.resourceId) return;\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceDetail(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n };\n\n /**\n * Handler shared by `mark:archived` and `mark:unarchived`. Both\n * change a resource's archived flag, which is stored on the resource\n * descriptor and affects the resource-list filter.\n */\n private onArchiveToggled = (stored: { resourceId?: ResourceId }): void => {\n if (!stored.resourceId) return;\n this.invalidateResourceDetail(stored.resourceId);\n this.invalidateResourceLists();\n };\n\n /**\n * Handler shared by `yield:create-ok` and `yield:update-ok`. Both\n * report a resource mutation with the resourceId as a string (not\n * yet branded), so we brand and apply the same effect as\n * `onArchiveToggled`.\n */\n private onYieldResourceMutated = (event: { resourceId: string }): void => {\n const rId = makeResourceId(event.resourceId);\n this.invalidateResourceDetail(rId);\n this.invalidateResourceLists();\n };\n\n private subscribeToEvents(): void {\n // Gap-detection contract:\n //\n // The server stamps persisted events on `/bus/subscribe` with\n // `id: p-<scope>-<seq>`. The client sends the last seen id back as\n // `Last-Event-ID` on reconnect; the server replays persisted events\n // missed during the gap. No blanket invalidation is needed on the\n // `reconnecting → open` state-machine transition — the usual case\n // is a clean resume with zero missed events.\n //\n // The server emits a `bus:resume-gap` event when it can't cover the\n // gap (retention window exceeded, scope mismatch, or unparseable\n // `Last-Event-ID`). Receiving one means the client's caches for the\n // affected scope may be stale — fall back to blanket invalidation\n // for that scope (or all scopes, if the gap carries no scope).\n this.on('bus:resume-gap', (event) => {\n const gapScope = event.scope;\n if (gapScope) {\n const rId = gapScope as ResourceId;\n this.invalidateAnnotationList(rId);\n this.invalidateResourceDetail(rId);\n this.invalidateResourceEvents(rId);\n this.invalidateReferencedBy(rId);\n } else {\n this.invalidateResourceLists();\n for (const rId of this.annotationListCache.keys()) this.invalidateAnnotationList(rId);\n for (const rId of this.resourceCache.keys()) this.invalidateResourceDetail(rId);\n for (const rId of this.resourceEventsCache.keys()) this.invalidateResourceEvents(rId);\n for (const rId of this.referencedByCache.keys()) this.invalidateReferencedBy(rId);\n }\n // Entity-types and tag-schemas are KB-wide lists — always refetch on any gap.\n this.invalidateEntityTypes();\n this.invalidateTagSchemas();\n });\n\n this.on('mark:delete-ok', (event) => {\n this.removeAnnotationDetail(makeAnnotationId(event.annotationId));\n });\n\n this.on('mark:added', (stored) => {\n if (stored.resourceId) {\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n }\n });\n\n this.on('mark:removed', (stored) => {\n if (stored.resourceId) {\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n }\n this.removeAnnotationDetail(makeAnnotationId(stored.payload.annotationId));\n });\n\n this.on('mark:body-updated', (event) => {\n const enriched = event as unknown as EnrichedResourceEvent;\n if (!enriched.resourceId || !enriched.annotation) return;\n this.updateAnnotationInPlace(enriched.resourceId as ResourceId, enriched.annotation as Annotation);\n this.invalidateResourceEvents(enriched.resourceId as ResourceId);\n });\n\n this.on('mark:entity-tag-added', this.onEntityTagChanged);\n this.on('mark:entity-tag-removed', this.onEntityTagChanged);\n\n this.on('replay-window-exceeded', (event) => {\n if (event.resourceId) {\n this.invalidateAnnotationList(event.resourceId as ResourceId);\n }\n });\n\n this.on('yield:create-ok', this.onYieldResourceMutated);\n this.on('yield:update-ok', this.onYieldResourceMutated);\n\n this.on('mark:archived', this.onArchiveToggled);\n this.on('mark:unarchived', this.onArchiveToggled);\n\n this.on('frame:entity-type-added', () => this.invalidateEntityTypes());\n this.on('frame:tag-schema-added', () => this.invalidateTagSchemas());\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport {\n annotationId as toAnnotationId,\n resourceId as toResourceId,\n} from '@semiont/core';\nimport type {\n ResourceId,\n AnnotationId,\n Motivation,\n EventBus,\n components,\n} from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { StreamObservable } from '../awaitable';\nimport type {\n MarkNamespace as IMarkNamespace,\n CreateAnnotationInput,\n MarkAssistOptions,\n MarkAssistEvent,\n} from './types';\n\nexport class MarkNamespace implements IMarkNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n async annotation(input: CreateAnnotationInput): Promise<{ annotationId: AnnotationId }> {\n // The wire schema (`MarkCreateRequest`) carries `resourceId` separately\n // for routing — we derive it from `input.target.source`, which is the\n // same value semantically.\n const resourceId = toResourceId(input.target.source);\n const result = await busRequest<{ annotationId: string }>(\n this.transport,\n 'mark:create-request',\n { resourceId, request: input },\n 'mark:create-ok',\n 'mark:create-failed',\n );\n return { annotationId: toAnnotationId(result.annotationId) };\n }\n\n async delete(resourceId: ResourceId, annotationId: AnnotationId): Promise<void> {\n await this.transport.emit('mark:delete', { annotationId, resourceId });\n }\n\n async archive(resourceId: ResourceId): Promise<void> {\n await this.transport.emit('mark:archive', { resourceId });\n }\n\n async unarchive(resourceId: ResourceId): Promise<void> {\n await this.transport.emit('mark:unarchive', { resourceId });\n }\n\n assist(resourceId: ResourceId, motivation: Motivation, options: MarkAssistOptions): StreamObservable<MarkAssistEvent> {\n return new StreamObservable<MarkAssistEvent>((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n // `job:report-progress`, `job:complete`, and `job:fail` all reach us\n // on the always-on global bridge — the worker dual-emits the\n // resource-broadcast ones (`job:complete`/`job:fail`) globally as well\n // as scoped, so the dispatching caller gets them without a scoped\n // subscription. We deliberately do NOT call\n // `transport.subscribeToResource(resourceId)` here: that mutates the\n // SSE channel set, which can only change by tearing down and\n // re-opening the connection, so it forced a reconnect on every assist\n // and dropped in-flight `browse.*` results in the reconnect gap. See\n // Link 1 in .plans/SEMIONT-BUG-browse-annotations.md.\n\n const cleanup = () => {\n done = true;\n if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; }\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n };\n\n const resetPollTimer = (jobId: string) => {\n if (pollTimer) clearTimeout(pollTimer);\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n pollTimer = setTimeout(() => {\n if (done) return;\n pollInterval = setInterval(() => {\n if (done) return;\n busRequest<{ status: string; result?: unknown; error?: string; jobType?: string }>(\n this.transport, 'job:status-requested', { jobId }, 'job:status-result', 'job:status-failed',\n ).then((status) => {\n if (done) return;\n if (status.status === 'complete') {\n cleanup();\n // Synthesize a `complete` event from polled status.\n subscriber.next({\n kind: 'complete',\n data: {\n jobId,\n jobType: (status.jobType ?? 'annotation') as components['schemas']['JobType'],\n resourceId: resourceId as string,\n result: status.result as components['schemas']['JobResult'] | undefined,\n },\n });\n subscriber.complete();\n } else if (status.status === 'failed') {\n cleanup();\n subscriber.error(new Error(status.error ?? 'Job failed'));\n }\n })\n .catch(() => {});\n }, 5_000);\n }, 10_000);\n };\n\n // Subscribe to the unified job lifecycle filtered by the jobId\n // we're about to be assigned. Safe to subscribe before the job\n // exists: early events for an unknown jobId simply never arrive,\n // and the `activeJobId` guard on the filter keeps each Observable\n // isolated to its own job.\n let activeJobId: string | null = null;\n const progress$ = this.bus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.bus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.bus.get('job:fail').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n\n const progressSub = progress$\n .pipe(takeUntil(merge(complete$, fail$)))\n .subscribe((e) => {\n if (e.progress) subscriber.next({ kind: 'progress', data: e.progress });\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe((e) => {\n cleanup();\n subscriber.next({ kind: 'complete', data: e });\n subscriber.complete();\n });\n\n const failSub = fail$.subscribe((e) => {\n cleanup();\n subscriber.error(new Error(e.error));\n });\n\n this.dispatchAssist(resourceId, motivation, options)\n .then(({ jobId }) => {\n if (jobId && !done) {\n activeJobId = jobId;\n resetPollTimer(jobId);\n }\n })\n .catch((error) => {\n // If the StreamObservable has already completed (e.g. job:complete\n // arrived before dispatchAssist resolved, or the consumer disposed\n // the client mid-flight), don't propagate the error — there is no\n // live subscriber to receive it, and RxJS would host it as an\n // uncaught exception.\n if (done) return;\n cleanup();\n subscriber.error(error);\n });\n\n return () => {\n cleanup();\n progressSub.unsubscribe();\n completeSub.unsubscribe();\n failSub.unsubscribe();\n };\n });\n }\n\n request(\n selector: components['schemas']['MarkRequestedEvent']['selector'],\n motivation: Motivation,\n ): void {\n // Local emit: mark-state-unit subscribes via the local bus.\n this.bus.get('mark:requested').next({ selector, motivation });\n }\n\n requestAssist(motivation: Motivation, options: MarkAssistOptions, correlationId?: string): void {\n this.bus.get('mark:assist-request').next({\n motivation,\n options,\n ...(correlationId ? { correlationId } : {}),\n } as components['schemas']['MarkAssistRequestEvent']);\n }\n\n submit(input: components['schemas']['MarkSubmitEvent']): void {\n this.bus.get('mark:submit').next(input);\n }\n\n cancelPending(): void {\n this.bus.get('mark:cancel-pending').next(undefined);\n }\n\n dismissProgress(): void {\n this.bus.get('mark:progress-dismiss').next(undefined);\n }\n\n changeSelection(motivation: Motivation | null): void {\n this.bus.get('mark:selection-changed').next({ motivation });\n }\n\n changeClick(action: string): void {\n this.bus.get('mark:click-changed').next({ action });\n }\n\n changeShape(shape: string): void {\n this.bus.get('mark:shape-changed').next({ shape });\n }\n\n toggleMode(): void {\n this.bus.get('mark:mode-toggled').next(undefined);\n }\n\n private async dispatchAssist(\n resourceId: ResourceId,\n motivation: Motivation,\n options: MarkAssistOptions,\n ): Promise<{ jobId: string }> {\n const jobTypeMap: Record<string, components['schemas']['JobType']> = {\n tagging: 'tag-annotation',\n linking: 'reference-annotation',\n highlighting: 'highlight-annotation',\n assessing: 'assessment-annotation',\n commenting: 'comment-annotation',\n };\n const jobType = jobTypeMap[motivation];\n if (!jobType) throw new Error(`Unsupported motivation: ${motivation}`);\n\n if (motivation === 'tagging') {\n if (!options.schemaId) {\n throw new Error('mark.assist with motivation \"tagging\" requires options.schemaId');\n }\n if (!options.categories?.length) {\n throw new Error('mark.assist with motivation \"tagging\" requires a non-empty options.categories array');\n }\n } else if (motivation === 'linking') {\n if (!options.entityTypes?.length) throw new Error('mark.assist with motivation \"linking\" requires a non-empty entityTypes array');\n }\n\n const params: Record<string, unknown> = {};\n if (options.entityTypes) params.entityTypes = options.entityTypes;\n if (options.includeDescriptiveReferences !== undefined) params.includeDescriptiveReferences = options.includeDescriptiveReferences;\n if (options.instructions !== undefined) params.instructions = options.instructions;\n if (options.density !== undefined) params.density = options.density;\n if (options.tone !== undefined) params.tone = options.tone;\n if (options.language !== undefined) params.language = options.language;\n if (options.sourceLanguage !== undefined) params.sourceLanguage = options.sourceLanguage;\n if (options.schemaId !== undefined) params.schemaId = options.schemaId;\n if (options.categories !== undefined) params.categories = options.categories;\n\n return busRequest<{ jobId: string }>(\n this.transport,\n 'job:create',\n { jobType, resourceId, params },\n 'job:created',\n 'job:create-failed',\n );\n }\n}\n","import type { ResourceId, AnnotationId, BodyOperation, EventBus, EventMap } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport type { BindNamespace as IBindNamespace } from './types';\n\nexport class BindNamespace implements IBindNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n async body(resourceId: ResourceId, annotationId: AnnotationId, operations: BodyOperation[]): Promise<void> {\n await this.transport.emit('bind:update-body', {\n correlationId: crypto.randomUUID(),\n annotationId,\n resourceId,\n operations,\n });\n }\n\n initiate(input: EventMap['bind:initiate']): void {\n // Local emit: resource-viewer-page-state-unit subscribes via the local bus.\n this.bus.get('bind:initiate').next(input);\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport type { AnnotationId, ResourceId, EventBus } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { GatherNamespace as IGatherNamespace, GatherAnnotationProgress } from './types';\n\nexport class GatherNamespace implements IGatherNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n annotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options?: { contextWindow?: number },\n ): StreamObservable<GatherAnnotationProgress> {\n return new StreamObservable<GatherAnnotationProgress>((subscriber) => {\n const correlationId = crypto.randomUUID();\n\n const complete$ = this.bus.get('gather:complete').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.bus.get('gather:failed').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n\n const sub = merge(\n this.bus.get('gather:annotation-progress').pipe(\n filter((e) => (e as { annotationId?: string }).annotationId === (annotationId as string)),\n map((e) => e as GatherAnnotationProgress),\n ),\n complete$.pipe(map((e) => e as GatherAnnotationProgress)),\n )\n .pipe(takeUntil(merge(complete$, failed$)))\n .subscribe({\n next: (v) => subscriber.next(v),\n error: (e) => subscriber.error(e),\n });\n\n const completeSub = complete$.subscribe((e) => {\n subscriber.next(e as GatherAnnotationProgress);\n subscriber.complete();\n });\n\n const failedSub = failed$.subscribe((e) => {\n subscriber.error(new Error(e.message));\n });\n\n this.transport.emit('gather:requested', {\n correlationId,\n annotationId,\n resourceId,\n options: { contextWindow: options?.contextWindow ?? 2000 },\n }).catch((error) => {\n // Don't propagate if a result or failure event already closed the\n // subscriber, or if the consumer disposed mid-flight. Otherwise\n // RxJS hosts the error as an uncaught exception.\n if (subscriber.closed) return;\n subscriber.error(error);\n });\n\n return () => {\n sub.unsubscribe();\n completeSub.unsubscribe();\n failedSub.unsubscribe();\n };\n });\n }\n\n resource(\n _resourceId: ResourceId,\n _options?: { contextWindow?: number },\n ): StreamObservable<GatherAnnotationProgress> {\n throw new Error('Not implemented: gather.resource() — no backend route yet');\n }\n}\n","import { filter } from 'rxjs/operators';\nimport type { AnnotationId, ResourceId, GatheredContext, EventBus, components } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { MatchNamespace as IMatchNamespace, MatchSearchProgress } from './types';\n\nexport class MatchNamespace implements IMatchNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n requestSearch(input: components['schemas']['MatchSearchRequest']): void {\n // Local emit: match-state-unit subscribes via the local bus.\n this.bus.get('match:search-requested').next(input);\n }\n\n search(\n resourceId: ResourceId,\n referenceId: AnnotationId,\n context: GatheredContext,\n options?: { limit?: number; useSemanticScoring?: boolean },\n ): StreamObservable<MatchSearchProgress> {\n return new StreamObservable<MatchSearchProgress>((subscriber) => {\n const correlationId = crypto.randomUUID();\n\n const result$ = this.bus.get('match:search-results').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.bus.get('match:search-failed').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n\n const resultSub = result$.subscribe((e) => {\n subscriber.next(e as MatchSearchProgress);\n subscriber.complete();\n });\n\n const failedSub = failed$.subscribe((e) => {\n subscriber.error(new Error(e.error));\n });\n\n this.transport.emit('match:search-requested', {\n correlationId,\n resourceId,\n referenceId,\n context,\n limit: options?.limit ?? 10,\n useSemanticScoring: options?.useSemanticScoring ?? true,\n }).catch((error) => {\n // Don't propagate if a result or failure event already closed the\n // subscriber, or if the consumer disposed mid-flight. Otherwise\n // RxJS hosts the error as an uncaught exception.\n if (subscriber.closed) return;\n subscriber.error(error);\n });\n\n return () => {\n resultSub.unsubscribe();\n failedSub.unsubscribe();\n };\n });\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport type {\n ResourceId,\n AnnotationId,\n EventBus,\n components,\n} from '@semiont/core';\nimport { resourceId as toResourceId } from '@semiont/core';\n\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { StreamObservable, UploadObservable } from '../awaitable';\nimport type {\n YieldNamespace as IYieldNamespace,\n CreateResourceInput,\n GenerationOptions,\n CreateFromTokenOptions,\n YieldGenerationEvent,\n} from './types';\n\nimport type { ResourceDescriptor } from '@semiont/core';\ntype GetResourceByTokenResponse = components['schemas']['GetResourceByTokenResponse'];\n\nexport class YieldNamespace implements IYieldNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n private readonly content: IContentTransport,\n ) {}\n\n resource(data: CreateResourceInput): UploadObservable {\n // `Buffer` is a Node global; referencing it bare in the browser throws\n // ReferenceError. Guard with a typeof check so this code runs in both\n // environments (browser uploads File, Node workers upload Buffer).\n const totalBytes = (typeof Buffer !== 'undefined' && data.file instanceof Buffer)\n ? data.file.length\n : (data.file as File).size;\n return new UploadObservable((subscriber) => {\n // `started` fires synchronously so subscribers can render an upload-\n // in-progress indicator before any I/O begins.\n subscriber.next({ phase: 'started', totalBytes });\n let cancelled = false;\n const abortController = new AbortController();\n this.content.putBinary(\n {\n name: data.name,\n file: data.file,\n format: data.format,\n storageUri: data.storageUri,\n ...(data.entityTypes ? { entityTypes: data.entityTypes } : {}),\n ...(data.language ? { language: data.language } : {}),\n ...(data.sourceAnnotationId ? { sourceAnnotationId: data.sourceAnnotationId } : {}),\n ...(data.sourceResourceId ? { sourceResourceId: data.sourceResourceId } : {}),\n ...(data.generationPrompt ? { generationPrompt: data.generationPrompt } : {}),\n ...(data.generator ? { generator: data.generator } : {}),\n ...(data.isDraft !== undefined ? { isDraft: data.isDraft } : {}),\n },\n {\n // Byte-progress hook. Honored by `HttpContentTransport`'s XHR\n // path; ignored by ky-path uploads (no `onProgress` consumer)\n // and by `LocalContentTransport` (no wire to observe).\n onProgress: ({ bytesUploaded, totalBytes: txTotal }) => {\n if (cancelled) return;\n // Prefer the transport's reported total; fall back to the\n // pre-flight size if the transport reports 0 (chunked encoding\n // or indeterminate length).\n const total = txTotal > 0 ? txTotal : totalBytes;\n subscriber.next({ phase: 'progress', bytesUploaded, totalBytes: total });\n },\n signal: abortController.signal,\n },\n )\n .then((result) => {\n if (cancelled) return;\n subscriber.next({\n phase: 'finished',\n resourceId: toResourceId(result.resourceId as string),\n });\n subscriber.complete();\n })\n .catch((err) => {\n if (!cancelled) subscriber.error(err);\n });\n return () => {\n cancelled = true;\n // Abort the in-flight HTTP request when the subscriber unsubscribes.\n // Honored by `HttpContentTransport`'s XHR path (calls `xhr.abort()`);\n // ky-path uploads complete in the background after abort and the\n // `cancelled` flag suppresses the `then`/`catch` callbacks.\n abortController.abort();\n };\n });\n }\n\n fromAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options: GenerationOptions,\n ): StreamObservable<YieldGenerationEvent> {\n return new StreamObservable<YieldGenerationEvent>((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n // `job:report-progress`, `job:complete`, and `job:fail` reach us on the\n // always-on global bridge — the worker dual-emits the resource-broadcast\n // ones globally as well as scoped. We deliberately do NOT call\n // `transport.subscribeToResource(resourceId)`: mutating the SSE channel\n // set forces a reconnect on every generation, which dropped in-flight\n // `browse.*` results in the reconnect gap. Symmetric with `mark.assist`.\n // See Link 1 in .plans/SEMIONT-BUG-browse-annotations.md.\n\n const cleanup = () => {\n done = true;\n if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; }\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n };\n\n const resetPollTimer = (jid: string) => {\n if (pollTimer) clearTimeout(pollTimer);\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n pollTimer = setTimeout(() => {\n if (done) return;\n pollInterval = setInterval(() => {\n if (done) return;\n busRequest<{ status: string; result?: Record<string, unknown>; error?: string; jobType?: string }>(\n this.transport, 'job:status-requested', { jobId: jid }, 'job:status-result', 'job:status-failed',\n ).then((status) => {\n if (done) return;\n if (status.status === 'complete') {\n cleanup();\n // Synthesize a `complete` event from polled status.\n subscriber.next({\n kind: 'complete',\n data: {\n jobId: jid,\n jobType: (status.jobType ?? 'generation') as components['schemas']['JobType'],\n resourceId: resourceId as string,\n result: status.result as components['schemas']['JobResult'] | undefined,\n },\n });\n subscriber.complete();\n } else if (status.status === 'failed') {\n cleanup();\n subscriber.error(new Error(status.error ?? 'Generation failed'));\n }\n })\n .catch(() => {});\n }, 5_000);\n }, 10_000);\n };\n\n // Subscribe to the unified job lifecycle filtered by this job's\n // jobId (assigned by `job:create` below). Auto-bind (resolving the\n // source reference to the generated resource) is handled in\n // Stower's `yield:create` handler when `generatedFrom.annotationId`\n // is present — not here, because the generated resource id is\n // assigned by Stower, not by the worker.\n let activeJobId: string | null = null;\n const progress$ = this.bus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.bus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.bus.get('job:fail').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n\n const progressSub = progress$\n .pipe(takeUntil(merge(complete$, fail$)))\n .subscribe((e) => {\n if (e.progress) subscriber.next({ kind: 'progress', data: e.progress });\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe((e) => {\n cleanup();\n subscriber.next({ kind: 'complete', data: e });\n subscriber.complete();\n });\n\n const failSub = fail$.subscribe((e) => {\n cleanup();\n subscriber.error(new Error(e.error));\n });\n\n busRequest<{ jobId: string }>(\n this.transport,\n 'job:create',\n {\n jobType: 'generation',\n resourceId,\n params: {\n referenceId: annotationId,\n title: options.title,\n prompt: options.prompt,\n entityTypes: options.entityTypes,\n language: options.language,\n sourceLanguage: options.sourceLanguage,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n storageUri: options.storageUri,\n context: options.context as unknown as Record<string, unknown>,\n },\n },\n 'job:created',\n 'job:create-failed',\n ).then(({ jobId }) => {\n if (jobId && !done) {\n activeJobId = jobId;\n resetPollTimer(jobId);\n }\n }).catch((error) => {\n // If the StreamObservable has already completed (job:complete arrived\n // before busRequest resolved, or the consumer disposed the client\n // mid-flight), don't propagate — the subscriber is gone and RxJS\n // would host the error as an uncaught exception.\n if (done) return;\n cleanup();\n subscriber.error(error);\n });\n\n return () => {\n cleanup();\n progressSub.unsubscribe();\n completeSub.unsubscribe();\n failSub.unsubscribe();\n };\n });\n }\n\n async cloneToken(resourceId: ResourceId): Promise<{ token: string; expiresAt: string }> {\n return busRequest<{ token: string; expiresAt: string }>(\n this.transport,\n 'yield:clone-token-requested',\n { resourceId },\n 'yield:clone-token-generated',\n 'yield:clone-token-failed',\n );\n }\n\n async fromToken(token: string): Promise<ResourceDescriptor> {\n const result = await busRequest<GetResourceByTokenResponse>(\n this.transport,\n 'yield:clone-resource-requested',\n { token },\n 'yield:clone-resource-result',\n 'yield:clone-resource-failed',\n );\n return result.sourceResource as ResourceDescriptor;\n }\n\n async createFromToken(options: CreateFromTokenOptions): Promise<{ resourceId: ResourceId }> {\n const result = await busRequest<{ resourceId: string }>(\n this.transport,\n 'yield:clone-create',\n options,\n 'yield:clone-created',\n 'yield:clone-create-failed',\n );\n return { resourceId: toResourceId(result.resourceId) };\n }\n\n clone(): void {\n this.bus.get('yield:clone').next(undefined);\n }\n}\n","import type { AnnotationId, EventBus, ResourceId } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport type { BeckonNamespace as IBeckonNamespace } from './types';\n\nexport class BeckonNamespace implements IBeckonNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n attention(resourceId: ResourceId, annotationId: AnnotationId): void {\n void this.transport.emit('beckon:focus', { annotationId, resourceId });\n }\n\n hover(annotationId: AnnotationId | null): void {\n // Local emit: beckon-state-unit subscribes via the local bus.\n this.bus.get('beckon:hover').next({ annotationId });\n }\n\n sparkle(annotationId: AnnotationId): void {\n this.bus.get('beckon:sparkle').next({ annotationId });\n }\n}\n","/**\n * FrameNamespace — the eighth flow's surface.\n *\n * Frame operates on the KB's **schema layer** — the conceptual vocabulary\n * the other seven flows are expressed in. Where yield/mark/match/bind/\n * gather/browse/beckon act on content (resources, annotations, references,\n * attention), Frame acts on what *kinds* of things exist: entity types,\n * eventually tag schemas, relation/predicate types, ontology imports.\n *\n * The MVP owns a single primitive — entity-type vocabulary writes on the\n * `frame:add-entity-type` channel. See `docs/protocol/flows/FRAME.md`\n * for the per-flow contract.\n *\n * Live reads of the entity-type vocabulary stay on Browse\n * (`browse.entityTypes()` is a `CacheObservable<string[]>`). Frame owns\n * writes; Browse owns reads. The asymmetry is intentional — re-implementing\n * Browse's cache primitives on Frame for a single read would duplicate\n * machinery without benefit.\n */\n\nimport type { ITransport, TagSchema } from '@semiont/core';\nimport type { FrameNamespace as IFrameNamespace } from './types';\n\nexport class FrameNamespace implements IFrameNamespace {\n constructor(private readonly transport: ITransport) {}\n\n async addEntityType(type: string): Promise<void> {\n await this.transport.emit('frame:add-entity-type', { tag: type });\n }\n\n async addEntityTypes(types: string[]): Promise<void> {\n for (const tag of types) {\n await this.transport.emit('frame:add-entity-type', { tag });\n }\n }\n\n async addTagSchema(schema: TagSchema): Promise<void> {\n await this.transport.emit('frame:add-tag-schema', { schema });\n }\n}\n","import type { Observable } from 'rxjs';\nimport type { EventBus, EventMap, JobId, components } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport type { JobNamespace as IJobNamespace } from './types';\n\ntype JobStatusResponse = components['schemas']['JobStatusResponse'];\n\nexport class JobNamespace implements IJobNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n /**\n * Live stream of `job:queued` events. Surfaces a typed view onto the\n * underlying bus channel for consumers (CLIs, MCP handlers, widgets)\n * that orchestrate jobs and need to react to lifecycle transitions.\n */\n get queued$(): Observable<EventMap['job:queued']> {\n return this.bus.get('job:queued');\n }\n\n /** Live stream of `job:report-progress` events. */\n get progress$(): Observable<EventMap['job:report-progress']> {\n return this.bus.get('job:report-progress');\n }\n\n /** Live stream of `job:complete` events (global; filter by `jobId`). */\n get complete$(): Observable<EventMap['job:complete']> {\n return this.bus.get('job:complete');\n }\n\n /** Live stream of `job:fail` events (global; filter by `jobId`). */\n get fail$(): Observable<EventMap['job:fail']> {\n return this.bus.get('job:fail');\n }\n\n async status(jobId: JobId): Promise<JobStatusResponse> {\n return busRequest<JobStatusResponse>(\n this.transport,\n 'job:status-requested',\n { jobId },\n 'job:status-result',\n 'job:status-failed',\n );\n }\n\n async pollUntilComplete(\n jobId: JobId,\n options?: { interval?: number; timeout?: number; onProgress?: (status: JobStatusResponse) => void },\n ): Promise<JobStatusResponse> {\n const interval = options?.interval ?? 1000;\n const timeout = options?.timeout ?? 60000;\n const startTime = Date.now();\n\n while (true) {\n const status = await this.status(jobId);\n if (options?.onProgress) options.onProgress(status);\n if (status.status === 'complete' || status.status === 'failed' || status.status === 'cancelled') {\n return status;\n }\n if (Date.now() - startTime > timeout) {\n throw new Error(`Job polling timeout after ${timeout}ms`);\n }\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n }\n\n async cancelByType(jobType: 'annotation' | 'generation'): Promise<void> {\n // The backend only supports cancel-by-type (cancels all pending jobs\n // of that type). A per-job cancel was never wired.\n await this.transport.emit('job:cancel-requested', { jobType });\n }\n\n cancelRequest(jobType: 'annotation' | 'generation'): void {\n // Local emit: the batch-cancel widget fires this; a state unit subscribes and\n // translates into individual cancels.\n this.bus.get('job:cancel-requested').next({ jobType });\n }\n}\n","/**\n * AuthNamespace — authentication. Backend ops only; no bus.\n */\n\nimport type { ResourceId, components } from '@semiont/core';\nimport { email as makeEmail, googleCredential, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { IBackendOperations } from '@semiont/core';\nimport type { AuthNamespace as IAuthNamespace, User } from './types';\n\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenRefreshResponse = components['schemas']['TokenRefreshResponse'];\n\nexport class AuthNamespace implements IAuthNamespace {\n constructor(private readonly backend: IBackendOperations) {}\n\n async password(emailStr: string, passwordStr: string): Promise<AuthResponse> {\n return this.backend.authenticatePassword(makeEmail(emailStr), passwordStr);\n }\n\n async google(credential: string): Promise<AuthResponse> {\n return this.backend.authenticateGoogle(googleCredential(credential));\n }\n\n async refresh(token: string): Promise<TokenRefreshResponse> {\n return this.backend.refreshAccessToken(makeRefreshToken(token));\n }\n\n async logout(): Promise<void> {\n await this.backend.logout();\n }\n\n async me(): Promise<User> {\n return this.backend.getCurrentUser();\n }\n\n async acceptTerms(): Promise<void> {\n await this.backend.acceptTerms();\n }\n\n async mcpToken(): Promise<{ token: string }> {\n return this.backend.generateMcpToken();\n }\n\n async mediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.backend.getMediaToken(resourceId);\n }\n}\n","/**\n * AdminNamespace — administration. Backend ops only; no bus.\n */\n\nimport type { UserDID, ProgressEvent, components, paths } from '@semiont/core';\nimport type { BackendDownload, IBackendOperations } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { AdminNamespace as IAdminNamespace, User, RequestContent, ResponseContent } from './types';\n\ntype AdminUserStatsResponse = components['schemas']['AdminUserStatsResponse'];\ntype OAuthConfigResponse = components['schemas']['OAuthConfigResponse'];\n\nexport class AdminNamespace implements IAdminNamespace {\n constructor(private readonly backend: IBackendOperations) {}\n\n async users(): Promise<User[]> {\n const result = await this.backend.listUsers();\n return result.users;\n }\n\n async userStats(): Promise<AdminUserStatsResponse> {\n return this.backend.getUserStats();\n }\n\n async updateUser(userId: UserDID, data: RequestContent<paths['/api/admin/users/{id}']['patch']>): Promise<User> {\n const result = await this.backend.updateUser(userId, data);\n return result.user;\n }\n\n async oauthConfig(): Promise<OAuthConfigResponse> {\n return this.backend.getOAuthConfig();\n }\n\n async healthCheck(): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.backend.healthCheck();\n }\n\n async status(): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.backend.getStatus();\n }\n\n async backup(): Promise<BackendDownload> {\n return this.backend.backupKnowledgeBase();\n }\n\n restore(file: File): StreamObservable<ProgressEvent> {\n return wrapAsStream(this.backend.restoreKnowledgeBase(file));\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<BackendDownload> {\n return this.backend.exportKnowledgeBase(params);\n }\n\n importKnowledgeBase(file: File): StreamObservable<ProgressEvent> {\n return wrapAsStream(this.backend.importKnowledgeBase(file));\n }\n}\n\n/**\n * Wrap a plain `Observable<ProgressEvent>` from `IBackendOperations` as\n * a `StreamObservable<ProgressEvent>` for the SDK surface — same RxJS\n * semantics, plus the awaitable PromiseLike that resolves to the last\n * emitted value.\n */\nfunction wrapAsStream(\n source: import('rxjs').Observable<ProgressEvent>,\n): StreamObservable<ProgressEvent> {\n return new StreamObservable<ProgressEvent>((subscriber) => {\n const sub = source.subscribe({\n next: (v) => subscriber.next(v),\n error: (e) => subscriber.error(e),\n complete: () => subscriber.complete(),\n });\n return () => sub.unsubscribe();\n });\n}\n","/**\n * SemiontClient — the verb-oriented namespace surface.\n *\n * Thin coordinator over an injected transport pair. Owns a local\n * `EventBus` (`bus`) for UI-signal channels and bridges wire events into\n * it via `transport.bridgeInto(bus)`. Namespaces receive `(transport,\n * bus)` (and `content` for binary-I/O namespaces) and choose internally\n * whether each method goes over the wire or stays local.\n *\n * No public `emit`/`on`/`stream` shortcuts: consumers call typed\n * namespace methods. The single sanctioned channel-by-name escape hatch\n * is `SemiontSession.subscribe(channel, handler)`, which reads from\n * `client.bus`.\n */\n\nimport type { BaseUrl, AccessToken } from '@semiont/core';\nimport { EventBus, accessToken, baseUrl } from '@semiont/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BrowseNamespace } from './namespaces/browse';\nimport { MarkNamespace } from './namespaces/mark';\nimport { BindNamespace } from './namespaces/bind';\nimport { GatherNamespace } from './namespaces/gather';\nimport { MatchNamespace } from './namespaces/match';\nimport { YieldNamespace } from './namespaces/yield';\nimport { BeckonNamespace } from './namespaces/beckon';\nimport { FrameNamespace } from './namespaces/frame';\nimport { JobNamespace } from './namespaces/job';\nimport { AuthNamespace } from './namespaces/auth';\nimport { AdminNamespace } from './namespaces/admin';\nimport type { IBackendOperations, IContentTransport, ITransport } from '@semiont/core';\n\n// Local imports of the HTTP adapters from @semiont/api-client — needed\n// here so `SemiontClient.fromHttp(...)` can construct them. The same\n// names are re-exported below for consumer convenience, so\n// `import { SemiontClient, HttpTransport } from '@semiont/sdk'` Just Works\n// without a separate api-client import.\nimport {\n HttpTransport,\n HttpContentTransport,\n} from '@semiont/api-client';\n\n// Convenience re-exports of the HTTP adapters. Non-HTTP transports\n// (e.g. LocalTransport from @semiont/make-meaning) are wired directly by\n// callers; the sdk does not pre-bundle them.\nexport {\n APIError,\n type TokenRefresher,\n HttpTransport,\n type HttpTransportConfig,\n HttpContentTransport,\n} from '@semiont/api-client';\n\nexport class SemiontClient {\n /**\n * The wire-facing transport. Owns bus actor, HTTP, auth, admin, exchange,\n * system. Exposed for advanced consumers (workers, custom job adapters)\n * that need raw `transport.emit(channel, payload, scope)` access. Ordinary\n * consumers go through typed namespace methods.\n */\n readonly transport: ITransport;\n /** Binary I/O transport. */\n private readonly content: IContentTransport;\n /**\n * Per-client local EventBus. Wire events flow in via the transport\n * bridge. Read-only public so `SemiontSession.subscribe(channel, …)`\n * can wire arbitrary-channel subscriptions; everything else uses\n * typed namespace methods.\n */\n readonly bus: EventBus;\n readonly baseUrl: BaseUrl;\n\n // ── Verb-oriented namespace API ──────────────────────────────────────────\n //\n // The first nine namespaces are bus-driven and always present. `frame`\n // is the schema-layer flow's surface (eighth flow); the other eight are\n // content-layer flows plus `job`. `auth` and `admin` are backend-ops\n // namespaces — they're only constructed when the caller passes an\n // `IBackendOperations` instance to the constructor. A `SemiontClient`\n // over a transport-only setup (e.g. `LocalTransport`) has\n // `auth === undefined` / `admin === undefined`.\n public readonly frame: FrameNamespace;\n public readonly browse: BrowseNamespace;\n public readonly mark: MarkNamespace;\n public readonly bind: BindNamespace;\n public readonly gather: GatherNamespace;\n public readonly match: MatchNamespace;\n public readonly yield: YieldNamespace;\n public readonly beckon: BeckonNamespace;\n public readonly job: JobNamespace;\n public readonly auth: AuthNamespace | undefined;\n public readonly admin: AdminNamespace | undefined;\n\n /**\n * The client *owns* its bus. The constructor creates a fresh `EventBus`\n * and hands it to the transport via `transport.bridgeInto(this.bus)`.\n * The reference flows client → transport, never the other way:\n * the transport stores the reference and publishes the events it\n * receives onto that bus. `HttpTransport` does so for every channel\n * delivered on its SSE wire; in-process transports adapt their\n * internal source.\n *\n * Callers do not pass a bus in. If they need to interact with the bus\n * (e.g. for tests or to subscribe to arbitrary channels), they read it\n * back via `client.bus`.\n *\n * `backend` is optional. When provided, the `auth` and `admin`\n * namespaces are constructed against it; when omitted, they're\n * `undefined`. For HTTP setups this is conventionally the same\n * `HttpTransport` instance that's also passed as `transport` (HTTP\n * implements both `ITransport` and `IBackendOperations`).\n */\n constructor(transport: ITransport, content: IContentTransport, backend?: IBackendOperations) {\n this.transport = transport;\n this.content = content;\n this.baseUrl = transport.baseUrl;\n\n this.bus = new EventBus();\n this.transport.bridgeInto(this.bus);\n\n this.frame = new FrameNamespace(this.transport);\n this.browse = new BrowseNamespace(this.transport, this.bus, this.content);\n this.mark = new MarkNamespace(this.transport, this.bus);\n this.bind = new BindNamespace(this.transport, this.bus);\n this.gather = new GatherNamespace(this.transport, this.bus);\n this.match = new MatchNamespace(this.transport, this.bus);\n this.yield = new YieldNamespace(this.transport, this.bus, this.content);\n this.beckon = new BeckonNamespace(this.transport, this.bus);\n this.job = new JobNamespace(this.transport, this.bus);\n this.auth = backend ? new AuthNamespace(backend) : undefined;\n this.admin = backend ? new AdminNamespace(backend) : undefined;\n }\n\n /** Transport-level connection state. HTTP reflects SSE health; local is always 'connected'. */\n get state$() {\n return this.transport.state$;\n }\n\n dispose(): void {\n this.transport.dispose();\n this.content.dispose();\n }\n\n /**\n * Convenience factory for the default HTTP setup. Constructs a\n * `BehaviorSubject<AccessToken | null>` internally, plus an\n * `HttpTransport` and `HttpContentTransport`, and returns the wired\n * `SemiontClient`.\n *\n * Use this for one-shot scripts, CLI commands, or any consumer that\n * doesn't need to drive the token from outside (no manual refresh,\n * no cross-tab sync). For long-running scripts that need refresh,\n * use `SemiontSession.fromHttp(...)` (with a token already on hand)\n * or `SemiontSession.signInHttp(...)` (credentials-first) instead —\n * either owns the same transport/client wiring plus the\n * proactive-refresh + storage machinery.\n *\n * Strings are accepted for `baseUrl` and `token`; they are branded\n * via `baseUrl()` / `accessToken()` from `@semiont/core` automatically.\n * Pass the already-branded values if you have them.\n *\n * Omit `token` for unauthenticated usage (public endpoints only).\n */\n static fromHttp(opts: {\n baseUrl: BaseUrl | string;\n token?: AccessToken | string | null;\n }): SemiontClient {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const tok = opts.token == null\n ? null\n : (typeof opts.token === 'string' ? accessToken(opts.token) : opts.token);\n const token$ = new BehaviorSubject<AccessToken | null>(tok);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n // HttpTransport implements both ITransport and IBackendOperations;\n // pass it twice so `client.auth` / `client.admin` are wired.\n return new SemiontClient(transport, content, transport);\n }\n\n /**\n * Async factory for the credentials-first script case. Builds a\n * transient HTTP transport, calls `auth.password(email, password)`\n * to acquire an access token, and returns the wired client with\n * the token populated.\n *\n * This is the right entry point for skills, CLI scripts, and any\n * consumer that starts with email + password rather than a JWT\n * already on hand. For consumers that already hold a token (CLI\n * cached-token path, env-var token, embedded auth flow), use\n * `fromHttp({ baseUrl, token })` instead.\n *\n * For long-running scripts that need refresh, use\n * `SemiontSession.signInHttp(...)` — same credentials shape, plus\n * the session machinery for proactive refresh and persistence.\n *\n * Named `signInHttp` because email+password authentication is\n * inherently an HTTP-shaped operation in the current backend; an\n * in-process `LocalTransport` doesn't have a credentials login\n * path. Non-HTTP transports construct the client directly from\n * their package's transport instance.\n *\n * Throws if authentication fails. The transient client is disposed\n * before the throw, so no resources leak on failure.\n */\n static async signInHttp(opts: {\n baseUrl: BaseUrl | string;\n email: string;\n password: string;\n }): Promise<SemiontClient> {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n try {\n // HTTP-only factory: backend is guaranteed present.\n const auth = await client.auth!.password(opts.email, opts.password);\n token$.next(accessToken(auth.token));\n return client;\n } catch (err) {\n client.dispose();\n throw err;\n }\n }\n}\n","/**\n * Pure helpers and storage-adapter-driven loaders for the Semiont\n * session layer.\n *\n * Contains:\n * - Storage key shape (constants, `sessionKey(kbId)`)\n * - JWT expiry parsing and \"is expired\" check\n * - URL/protocol helpers for KB instances\n * - Loaders/savers that take a `SessionStorage` and operate over it\n * (no direct `localStorage` access)\n *\n * No React imports, no module-scoped state, no side effects beyond\n * whatever the passed-in `SessionStorage` does.\n */\n\nimport type { HttpEndpoint, KnowledgeBase } from './knowledge-base';\nimport type { SessionStorage } from './session-storage';\n\n// ---------- Storage keys ----------\n\nconst SESSION_PREFIX = 'semiont.session.';\nexport const STORAGE_KEY = 'semiont.knowledgeBases';\nexport const ACTIVE_KEY = 'semiont.activeKnowledgeBaseId';\n\n/** Refresh the access token this many milliseconds before it expires. */\nexport const REFRESH_BEFORE_EXP_MS = 5 * 60 * 1000;\n\n/** The shape persisted per KB. */\nexport interface StoredSession {\n access: string;\n refresh: string;\n}\n\nexport function sessionKey(kbId: string): string {\n return `${SESSION_PREFIX}${kbId}`;\n}\n\n// ---------- Per-KB session storage ----------\n\nexport function getStoredSession(storage: SessionStorage, kbId: string): StoredSession | null {\n const raw = storage.get(sessionKey(kbId));\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.access === 'string' && typeof parsed.refresh === 'string') {\n return { access: parsed.access, refresh: parsed.refresh };\n }\n } catch {\n // malformed entry — treat as no session\n }\n return null;\n}\n\nexport function setStoredSession(storage: SessionStorage, kbId: string, session: StoredSession): void {\n storage.set(sessionKey(kbId), JSON.stringify(session));\n}\n\nexport function clearStoredSession(storage: SessionStorage, kbId: string): void {\n storage.delete(sessionKey(kbId));\n}\n\n// ---------- JWT helpers ----------\n\nexport function parseJwtExpiry(token: string): Date | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3 || !parts[1]) return null;\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n if (!payload.exp) return null;\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\nexport function isJwtExpired(token: string): boolean {\n const expiry = parseJwtExpiry(token);\n if (!expiry) return true;\n return expiry.getTime() < Date.now();\n}\n\n// ---------- KB list storage ----------\n\nfunction isKnowledgeBase(entry: unknown): entry is KnowledgeBase {\n if (!entry || typeof entry !== 'object') return false;\n const e = entry as Record<string, unknown>;\n if (typeof e.id !== 'string' || typeof e.label !== 'string' || typeof e.email !== 'string') {\n return false;\n }\n const ep = e.endpoint as Record<string, unknown> | undefined;\n if (!ep || typeof ep !== 'object') return false;\n if (ep.kind === 'http') {\n return typeof ep.host === 'string'\n && typeof ep.port === 'number'\n && (ep.protocol === 'http' || ep.protocol === 'https');\n }\n if (ep.kind === 'local') {\n return typeof ep.kbId === 'string';\n }\n return false;\n}\n\n/**\n * Load the persisted KB list. Entries that don't conform to the current\n * `KnowledgeBase` shape are dropped silently — the storage format has no\n * back-compat layer (the project's stance on storage migrations: change\n * the shape directly, no legacy fallbacks). Stale entries vanish; the\n * user re-adds the affected KBs.\n */\nexport function loadKnowledgeBases(storage: SessionStorage): KnowledgeBase[] {\n try {\n const raw = storage.get(STORAGE_KEY);\n if (!raw) return [];\n const entries = JSON.parse(raw) as unknown[];\n return entries.filter(isKnowledgeBase);\n } catch {\n return [];\n }\n}\n\nexport function saveKnowledgeBases(storage: SessionStorage, knowledgeBases: KnowledgeBase[]): void {\n storage.set(STORAGE_KEY, JSON.stringify(knowledgeBases));\n}\n\n// ---------- Public pure helpers ----------\n\nexport function defaultProtocol(host: string): 'http' | 'https' {\n return host === 'localhost' || host === '127.0.0.1' ? 'http' : 'https';\n}\n\n/** Accepts: localhost, dotted-decimal IPv4, valid DNS labels. Rejects slashes, colons, query strings. */\nconst HOSTNAME_RE = /^(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?|localhost|\\d{1,3}(\\.\\d{1,3}){3})$/;\n\nexport function isValidHostname(host: string): boolean {\n return HOSTNAME_RE.test(host);\n}\n\n/**\n * Build the wire URL for an HTTP KB endpoint. HTTP-shaped helper —\n * lives next to the KB list machinery because the frontend Panel needs\n * it for the auth round-trip when adding a KB. Code that holds a\n * uniform `KnowledgeBase` should not call this; it should hand the KB\n * to a transport factory and let the factory inspect `endpoint.kind`.\n */\nexport function kbBackendUrl(endpoint: HttpEndpoint): string {\n if (!isValidHostname(endpoint.host)) {\n throw new Error(`Invalid KB hostname: \"${endpoint.host}\"`);\n }\n // Use URL property assignment so the parser normalises the hostname (e.g. lowercasing)\n // rather than blindly interpolating a user-supplied string.\n const url = new URL('http://x');\n url.protocol = endpoint.protocol + ':';\n url.hostname = endpoint.host;\n url.port = String(endpoint.port);\n return `${endpoint.protocol}://${url.hostname}:${endpoint.port}`;\n}\n\nexport function generateKbId(): string {\n return crypto.randomUUID();\n}\n","/**\n * Session-level error surface. Emitted on `SemiontBrowser.error$` for\n * failures that make the session itself unusable (auth failed, actor\n * couldn't start, token refresh terminally exhausted). Per-request\n * errors stay with the caller as normal Promise rejections.\n *\n * `SemiontSessionError` extends `SemiontError` (the unified Semiont base)\n * so consumers can catch with `instanceof SemiontError` for any error\n * surfaced through the SDK.\n */\n\nimport { SemiontError } from '@semiont/core';\n\nexport type SemiontSessionErrorCode =\n | 'session.construct-failed'\n | 'session.auth-failed'\n | 'session.refresh-exhausted'\n | 'browser.sign-in-failed';\n\nexport class SemiontSessionError extends SemiontError {\n declare code: SemiontSessionErrorCode;\n readonly kbId: string | null;\n\n constructor(code: SemiontSessionErrorCode, message: string, kbId: string | null = null) {\n super(message, code, { kbId });\n this.name = 'SemiontSessionError';\n this.kbId = kbId;\n }\n}\n","/**\n * SemiontSession — per-backend session lifetime object. Owns the\n * SemiontClient, the access token BehaviorSubject, and optionally\n * an authenticated user. One SemiontSession exists per active backend\n * connection; lifetime is decoupled from React mount lifetime.\n *\n * Headless by design. Runs in browsers, CLIs, workers, and tests.\n * UI-specific state (session-expired/permission-denied modals) lives\n * in `SessionSignals`, which wraps a session — the session\n * itself has no modal observables, no user-facing notifications.\n *\n * Auth is parameterized via callbacks passed at construction:\n *\n * - `refresh()` — invoked on 401 / proactive re-auth. Returns the\n * new access token, or null on failure. The frontend passes a\n * closure that runs the refresh-token flow; the worker passes\n * one that exchanges the shared secret.\n *\n * - `validate(token)` — optional. If provided, the session calls\n * it once at startup with the stored token to confirm it's\n * still good and populate `user$`. Frontend passes `getMe`;\n * worker omits this (service principals have no user record).\n *\n * - `onAuthFailed(message)` — optional. Invoked when refresh\n * terminally fails (expired token, no recovery possible). UI hosts\n * typically wire this to `SessionSignals.notifySessionExpired` so a\n * modal surfaces; headless consumers typically just log.\n *\n * Persistence goes through a `SessionStorage` adapter provided at\n * construction — the session never touches `localStorage` or `window`\n * directly.\n */\n\nimport { BehaviorSubject, type Observable } from 'rxjs';\nimport {\n accessToken,\n baseUrl,\n type AccessToken,\n type BaseUrl,\n} from '@semiont/core';\nimport type { components, EventMap } from '@semiont/core';\nimport { SemiontClient, APIError, HttpTransport, HttpContentTransport } from '../client';\nimport type { SemiontError } from '@semiont/core';\nimport type { ConnectionState } from '@semiont/core';\nimport type { KnowledgeBase } from './knowledge-base';\nimport {\n clearStoredSession,\n getStoredSession,\n isJwtExpired,\n parseJwtExpiry,\n REFRESH_BEFORE_EXP_MS,\n sessionKey,\n setStoredSession,\n type StoredSession,\n} from './storage';\nimport { SemiontSessionError } from './errors';\nimport type { SessionStorage } from './session-storage';\n\nexport type UserInfo = components['schemas']['UserResponse'];\n\nexport interface SemiontSessionConfig {\n kb: KnowledgeBase;\n /** Persistence adapter. Reads/writes tokens via this. */\n storage: SessionStorage;\n /**\n * Pre-built api client. The session does not construct it — caller\n * builds the transport stack and passes the client in. This is the\n * seam where consumers swap one `ITransport` implementation for\n * another (HTTP, in-process, etc.).\n */\n client: SemiontClient;\n /**\n * Token observable shared with the transport. Caller must pass the\n * SAME instance to both the transport (via `HttpTransport` config)\n * and the session. The session writes refreshed tokens here; the\n * transport reads from here.\n */\n token$: BehaviorSubject<AccessToken | null>;\n /**\n * Re-authenticate after expiry / 401. Returns a new access token\n * (no \"Bearer \" prefix) on success, or null if recovery is\n * impossible. Omit for transports where tokens don't apply.\n */\n refresh?: () => Promise<string | null>;\n /**\n * Validate the stored token at startup and populate `user$`. Omit\n * for service-principal sessions (worker, CLI tools) where there\n * is no user record to fetch.\n */\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n /**\n * Invoked when refresh terminally fails. Frontend consumers wire\n * this to a UI signal that surfaces the session-expired modal.\n */\n onAuthFailed?: (message: string | null) => void;\n /** Called for session-level failures (auth, refresh exhaustion). */\n onError?: (err: SemiontSessionError) => void;\n}\n\nexport class SemiontSession {\n readonly kb: KnowledgeBase;\n readonly client: SemiontClient;\n readonly token$: BehaviorSubject<AccessToken | null>;\n readonly user$: BehaviorSubject<UserInfo | null>;\n readonly streamState$: Observable<ConnectionState>;\n /**\n * Stream of `SemiontError` instances surfaced by the underlying transport\n * just before they're thrown to the caller. For `HttpTransport` this is\n * an `APIError` (status-coded); other transports emit their own subclass.\n * Surfaced here so a host layer (e.g. `SemiontBrowser`) can route by\n * `err.code` to global notifications without every call site handling\n * errors itself. Headless consumers can subscribe for logging.\n *\n * Re-published from `client.transport.errors$` per the `ITransport`\n * contract — the session is purely a passthrough.\n */\n readonly errors$: Observable<SemiontError>;\n\n /** Resolves after the initial validation round-trip completes (success or failure). */\n readonly ready: Promise<void>;\n\n private readonly storage: SessionStorage;\n private readonly doRefresh?: () => Promise<string | null>;\n private readonly doValidate?: (token: AccessToken) => Promise<UserInfo | null>;\n private readonly onAuthFailed: (message: string | null) => void;\n private readonly onError: (err: SemiontSessionError) => void;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n\n constructor(config: SemiontSessionConfig) {\n this.kb = config.kb;\n this.storage = config.storage;\n this.doRefresh = config.refresh;\n this.doValidate = config.validate;\n this.onAuthFailed = config.onAuthFailed ?? (() => {});\n this.onError = config.onError ?? (() => {});\n this.client = config.client;\n this.token$ = config.token$;\n this.user$ = new BehaviorSubject<UserInfo | null>(null);\n this.errors$ = this.client.transport.errors$;\n\n // Reconcile stored token: if there's a fresh stored access token\n // and `token$` hasn't been seeded yet, push the stored value so the\n // transport (which shares this token$) sees it on first auth.\n const stored = getStoredSession(this.storage, this.kb.id);\n if (stored && !isJwtExpired(stored.access) && this.token$.getValue() === null) {\n this.token$.next(accessToken(stored.access));\n }\n const initialToken = this.token$.getValue();\n\n this.streamState$ = this.client.state$;\n\n if (initialToken) {\n this.scheduleProactiveRefresh(initialToken);\n }\n\n this.unsubscribeStorage = this.storage.subscribe?.((key, newValue) => {\n this.handleStorageChange(key, newValue);\n }) ?? null;\n\n this.ready = this.validate(stored);\n }\n\n /**\n * Run the initial mount-time validation. If a stored access token is\n * present and unexpired, call the configured `validate` with it to\n * confirm it still works and populate `user$`. If expired, try\n * refresh first. On 401 from validate, try refresh once. Surfaces\n * auth-failed on terminal failure.\n *\n * When no `validate` callback is provided (service principals), this\n * still runs through the refresh-if-expired step so the stored\n * token is current — it just skips the user-validation round trip.\n */\n private async validate(stored: StoredSession | null): Promise<void> {\n if (!stored) return;\n\n const startToken = isJwtExpired(stored.access)\n ? (this.doRefresh ? await this.doRefresh() : null)\n : stored.access;\n if (!startToken) {\n if (isJwtExpired(stored.access)) {\n clearStoredSession(this.storage, this.kb.id);\n }\n return;\n }\n\n if (startToken !== stored.access) {\n this.token$.next(accessToken(startToken));\n this.scheduleProactiveRefresh(startToken);\n }\n\n // No validate callback => service-principal session. Token is\n // current; `user$` stays null. Done.\n if (!this.doValidate) return;\n\n const attempt = async (token: string): Promise<void> => {\n if (this.disposed) return;\n try {\n const data = await this.doValidate!(accessToken(token));\n if (this.disposed) return;\n this.user$.next(data);\n } catch (err) {\n if (this.disposed) return;\n if (err instanceof APIError && err.status === 401) {\n const refreshed = this.doRefresh ? await this.doRefresh() : null;\n if (this.disposed) return;\n if (refreshed) {\n this.token$.next(accessToken(refreshed));\n this.scheduleProactiveRefresh(refreshed);\n await attempt(refreshed);\n return;\n }\n clearStoredSession(this.storage, this.kb.id);\n this.token$.next(null);\n this.onAuthFailed('Your session has expired. Please sign in again.');\n } else {\n this.onError(\n new SemiontSessionError(\n 'session.auth-failed',\n err instanceof Error ? err.message : String(err),\n this.kb.id,\n ),\n );\n }\n }\n };\n\n await attempt(startToken);\n }\n\n /**\n * Refresh the access token via the configured `refresh` callback.\n * On success, pushes the new token into `token$` and schedules the\n * next proactive refresh. On failure, clears persisted state and\n * fires `onAuthFailed` — the frontend's wiring of that callback is\n * what surfaces the session-expired modal.\n */\n async refresh(): Promise<AccessToken | null> {\n if (this.disposed) return null;\n if (!this.doRefresh) return null;\n const newAccess = await this.doRefresh();\n if (this.disposed) return null;\n if (newAccess) {\n const tok = accessToken(newAccess);\n this.token$.next(tok);\n this.scheduleProactiveRefresh(newAccess);\n return tok;\n }\n this.token$.next(null);\n clearStoredSession(this.storage, this.kb.id);\n this.onAuthFailed('Your session has expired. Please sign in again.');\n this.onError(\n new SemiontSessionError('session.refresh-exhausted', 'Token refresh failed', this.kb.id),\n );\n return null;\n }\n\n private scheduleProactiveRefresh(token: string): void {\n this.clearRefreshTimer();\n const expiresAt = parseJwtExpiry(token);\n if (!expiresAt) return;\n const refreshAt = expiresAt.getTime() - REFRESH_BEFORE_EXP_MS;\n const delay = Math.max(0, refreshAt - Date.now());\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = null;\n if (!this.disposed) void this.refresh();\n }, delay);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Cross-context sync: another tab/process refreshed or signed out this\n * KB. Mirror the change into our in-memory state.\n */\n private handleStorageChange(key: string, newValue: string | null): void {\n if (this.disposed) return;\n if (key !== sessionKey(this.kb.id)) return;\n if (!newValue) {\n this.token$.next(null);\n this.user$.next(null);\n this.clearRefreshTimer();\n return;\n }\n try {\n const parsed = JSON.parse(newValue) as StoredSession;\n if (typeof parsed.access === 'string') {\n this.token$.next(accessToken(parsed.access));\n this.scheduleProactiveRefresh(parsed.access);\n }\n } catch {\n // Malformed payload — ignore.\n }\n }\n\n get expiresAt(): Date | null {\n const token = this.token$.getValue();\n return token ? parseJwtExpiry(token) : null;\n }\n\n /**\n * Subscribe to a session-bus channel. The single sanctioned escape hatch\n * for generic-channel subscription (the case `useEventSubscription` needs\n * — channel name is a hook parameter, not known statically). All other\n * consumers must call typed namespace methods (e.g. `session.client.mark.archive(...)`).\n *\n * @returns disposer that unsubscribes the handler.\n */\n subscribe<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n const sub = this.client.bus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n this.clearRefreshTimer();\n if (this.unsubscribeStorage) {\n this.unsubscribeStorage();\n this.unsubscribeStorage = null;\n }\n\n this.client.dispose();\n\n this.token$.complete();\n this.user$.complete();\n }\n\n /**\n * Convenience factory for the default HTTP setup. Constructs the\n * shared `BehaviorSubject<AccessToken | null>`, an `HttpTransport`,\n * an `HttpContentTransport`, and a `SemiontClient`, then wires\n * the session over them. Removes the load-bearing\n * \"same-token$-instance\" invariant from the caller's hands.\n *\n * Strings are accepted for `baseUrl` and `token`; they are branded\n * via `baseUrl()` / `accessToken()` from `@semiont/core` automatically.\n *\n * The remaining options (`refresh`, `validate`, `onAuthFailed`,\n * `onError`) match `SemiontSessionConfig` exactly.\n */\n static fromHttp(opts: {\n kb: KnowledgeBase;\n storage: SessionStorage;\n baseUrl: BaseUrl | string;\n token?: AccessToken | string | null;\n refresh?: () => Promise<string | null>;\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n onAuthFailed?: (message: string | null) => void;\n onError?: (err: SemiontSessionError) => void;\n }): SemiontSession {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const tok = opts.token == null\n ? null\n : (typeof opts.token === 'string' ? accessToken(opts.token) : opts.token);\n const token$ = new BehaviorSubject<AccessToken | null>(tok);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n const config: SemiontSessionConfig = { kb: opts.kb, storage: opts.storage, client, token$ };\n if (opts.refresh) config.refresh = opts.refresh;\n if (opts.validate) config.validate = opts.validate;\n if (opts.onAuthFailed) config.onAuthFailed = opts.onAuthFailed;\n if (opts.onError) config.onError = opts.onError;\n return new SemiontSession(config);\n }\n\n /**\n * Async factory for the credentials-first long-running script case.\n * Builds the HTTP transport stack, calls `auth.password(email,\n * password)` to acquire access + refresh tokens, persists them via\n * the storage adapter, wires a default `refresh` callback that\n * exchanges the refresh token via `auth.refresh(...)`, and returns\n * the ready session.\n *\n * The consumer-supplied `refresh` callback becomes optional — only\n * needed for non-standard refresh flows (worker-pool shared secret,\n * OAuth refresh-token grant, interactive re-prompt). The default\n * uses the refresh token returned by `auth.password`.\n *\n * `kb` is required and must be a full `KnowledgeBase`. The `id` field\n * is the storage key for this session — distinct scripts sharing the\n * same `SessionStorage` instance must use distinct ids to avoid\n * trampling each other's tokens. The factory does not synthesize a\n * default; the consumer makes the choice.\n *\n * Named `signInHttp` because email+password authentication is\n * inherently an HTTP-shaped operation in the current backend; an\n * in-process `LocalTransport` doesn't have a credentials login\n * path. Non-HTTP transports construct the session directly from\n * their package's transport instance.\n *\n * Throws on auth failure with no resources leaked. On success, the\n * returned session's `ready` promise has already resolved.\n */\n static async signInHttp(opts: {\n kb: KnowledgeBase;\n storage: SessionStorage;\n baseUrl: BaseUrl | string;\n email: string;\n password: string;\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n onAuthFailed?: (message: string | null) => void;\n onError?: (err: SemiontSessionError) => void;\n }): Promise<SemiontSession> {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n\n // Phase 1: build a transient transport with no token, authenticate,\n // and capture the full StoredSession from the response.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n\n let auth: components['schemas']['AuthResponse'];\n try {\n auth = await client.auth!.password(opts.email, opts.password);\n } catch (err) {\n client.dispose();\n throw err;\n }\n\n setStoredSession(opts.storage, opts.kb.id, { access: auth.token, refresh: auth.refreshToken });\n token$.next(accessToken(auth.token));\n\n // Phase 2: wire a default refresh callback that uses the stored\n // refresh token (read at refresh time, not capture-time, so storage\n // updates from elsewhere are honored). The session itself updates\n // storage on each successful refresh, so this stays in sync.\n const defaultRefresh = async (): Promise<string | null> => {\n const stored = getStoredSession(opts.storage, opts.kb.id);\n if (!stored) return null;\n try {\n const response = await client.auth!.refresh(stored.refresh);\n return response.access_token;\n } catch {\n return null;\n }\n };\n\n const config: SemiontSessionConfig = {\n kb: opts.kb,\n storage: opts.storage,\n client,\n token$,\n refresh: defaultRefresh,\n };\n if (opts.validate) config.validate = opts.validate;\n if (opts.onAuthFailed) config.onAuthFailed = opts.onAuthFailed;\n if (opts.onError) config.onError = opts.onError;\n\n const session = new SemiontSession(config);\n await session.ready;\n return session;\n }\n}\n","/**\n * SessionSignals — UI-facing notification state that belongs to the host\n * surface, not to the session itself.\n *\n * `SemiontSession` is a headless per-backend client + token + user\n * holder. It can run in any process: browser, worker, CLI, test. But\n * the session-expired / permission-denied *notifications* are inherently\n * a UI-host concern. Keeping those observables on `SemiontSession` meant\n * workers and CLIs carried four dead BehaviorSubjects that nothing would\n * ever fire.\n *\n * `SessionSignals` owns the notification state and has no hard reference\n * to a session. A UI host (e.g. `SemiontBrowser`) constructs one alongside\n * every active session and wires:\n *\n * - `session.onAuthFailed` → `signals.notifySessionExpired` so\n * proactive-refresh failures surface as a notification\n *\n * UI consumers that need to render modal/banner state subscribe here;\n * consumers that need bus/HTTP access continue to subscribe to the session.\n *\n * Session auth-state cleanup (clearing token, clearing storage) is\n * the session's own responsibility inside `refresh()` — by the time\n * `notifySessionExpired` runs, the session has already torn down.\n * Signals only surfaces the notification.\n */\n\nimport { BehaviorSubject } from 'rxjs';\n\nexport class SessionSignals {\n readonly sessionExpiredAt$: BehaviorSubject<number | null>;\n readonly sessionExpiredMessage$: BehaviorSubject<string | null>;\n readonly permissionDeniedAt$: BehaviorSubject<number | null>;\n readonly permissionDeniedMessage$: BehaviorSubject<string | null>;\n\n constructor() {\n this.sessionExpiredAt$ = new BehaviorSubject<number | null>(null);\n this.sessionExpiredMessage$ = new BehaviorSubject<string | null>(null);\n this.permissionDeniedAt$ = new BehaviorSubject<number | null>(null);\n this.permissionDeniedMessage$ = new BehaviorSubject<string | null>(null);\n }\n\n notifySessionExpired(message: string | null): void {\n this.sessionExpiredMessage$.next(\n message ?? 'Your session has expired. Please sign in again.',\n );\n this.sessionExpiredAt$.next(Date.now());\n }\n\n notifyPermissionDenied(message: string | null): void {\n this.permissionDeniedMessage$.next(\n message ?? 'You do not have permission to perform this action.',\n );\n this.permissionDeniedAt$.next(Date.now());\n }\n\n acknowledgeSessionExpired(): void {\n this.sessionExpiredAt$.next(null);\n this.sessionExpiredMessage$.next(null);\n }\n\n acknowledgePermissionDenied(): void {\n this.permissionDeniedAt$.next(null);\n this.permissionDeniedMessage$.next(null);\n }\n\n dispose(): void {\n this.sessionExpiredAt$.complete();\n this.sessionExpiredMessage$.complete();\n this.permissionDeniedAt$.complete();\n this.permissionDeniedMessage$.complete();\n }\n}\n","/**\n * SemiontBrowser — top-level app-facing container for non-KB state.\n *\n * Holds the list of configured KBs, the active KB selection, the active\n * SemiontSession, the identity token, the open-resources list, and a\n * session-level error stream. Held as a process-wide instance for the\n * host's lifetime — see `getBrowser()` in `registry.ts` for the canonical\n * accessor.\n *\n * Transport-agnostic: the browser orchestrates session *lifecycle* but\n * delegates session *construction* to a `SessionFactory` injected at\n * construction. HTTP-backed apps pass `createHttpSessionFactory()` from\n * `@semiont/sdk`; in-process apps pass their own factory.\n *\n * Persistence goes through a `SessionStorage` adapter provided at\n * construction — the browser never touches `localStorage` or `window`\n * directly.\n */\n\nimport { BehaviorSubject, Subject, type Observable } from 'rxjs';\nimport { EventBus, type EventMap } from '@semiont/core';\nimport {\n ACTIVE_KEY,\n clearStoredSession,\n generateKbId,\n getStoredSession,\n isJwtExpired,\n loadKnowledgeBases,\n saveKnowledgeBases,\n setStoredSession,\n} from './storage';\nimport type {\n KnowledgeBase,\n KbSessionStatus,\n NewKnowledgeBase,\n} from './knowledge-base';\nimport type { OpenResource } from './open-resource';\nimport { SemiontSession } from './semiont-session';\nimport { SessionSignals } from './session-signals';\nimport { SemiontSessionError } from './errors';\nimport type { SessionStorage } from './session-storage';\nimport type { SessionFactory } from './session-factory';\n\nconst OPEN_RESOURCES_KEY = 'openDocuments';\n\nfunction sortOpenResources(resources: OpenResource[]): OpenResource[] {\n return [...resources].sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) return a.order - b.order;\n return a.openedAt - b.openedAt;\n });\n}\n\nfunction loadOpenResources(storage: SessionStorage): OpenResource[] {\n try {\n const stored = storage.get(OPEN_RESOURCES_KEY);\n if (stored) return sortOpenResources(JSON.parse(stored) as OpenResource[]);\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\nexport interface SemiontBrowserConfig {\n /** Persistence adapter. The browser reads/writes all persisted state via this. */\n storage: SessionStorage;\n /**\n * Builds a `SemiontSession` for a KB. The browser is transport-\n * agnostic — every HTTP-vs-local construction concern lives in the\n * factory. HTTP-backed apps pass `createHttpSessionFactory()` from\n * `@semiont/sdk`; a future in-process variant from `@semiont/make-meaning`\n * would expose its own factory.\n */\n sessionFactory: SessionFactory;\n}\n\nexport class SemiontBrowser {\n readonly kbs$: BehaviorSubject<KnowledgeBase[]>;\n readonly activeKbId$: BehaviorSubject<string | null>;\n readonly activeSession$: BehaviorSubject<SemiontSession | null>;\n /**\n * Modal signals (session-expired / permission-denied) for the\n * currently-active session. Parallels `activeSession$` — always\n * non-null when `activeSession$` is non-null, always null when it\n * is. Extracted from the session itself so headless sessions\n * (workers, CLIs, tests) don't carry dead modal observables.\n * See [SessionSignals](./session-signals.ts).\n */\n readonly activeSignals$: BehaviorSubject<SessionSignals | null>;\n /**\n * True while a session is actively being constructed (setActiveKb /\n * signIn in flight, awaiting `session.ready`). Distinguishes the\n * \"session about to arrive\" intermediate state from \"session\n * intentionally null\" (after signOut, or when the active KB has no\n * stored credentials). UIs that want a loading spinner should gate\n * on this; otherwise they get stuck spinning after every signOut.\n */\n readonly sessionActivating$: BehaviorSubject<boolean>;\n readonly openResources$: BehaviorSubject<OpenResource[]>;\n readonly error$: Subject<SemiontSessionError>;\n readonly identityToken$: BehaviorSubject<string | null>;\n\n private readonly storage: SessionStorage;\n private readonly sessionFactory: SessionFactory;\n /**\n * App-scoped EventBus. Hosts UI-shell events that must work regardless\n * of whether a KB session is active: panel toggles, sidebar state,\n * tab reorders, routing, settings, etc. Disjoint from the per-session\n * bus inside `SemiontClient`, which carries KB-content events\n * (mark:*, beckon:*, gather:*, match:*, bind:*, yield:*, browse:click).\n */\n private readonly eventBus: EventBus = new EventBus();\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n private activating: Promise<void> | null = null;\n\n constructor(config: SemiontBrowserConfig) {\n this.storage = config.storage;\n this.sessionFactory = config.sessionFactory;\n\n const kbs = loadKnowledgeBases(this.storage);\n const storedActive = this.storage.get(ACTIVE_KEY);\n const initialActive =\n storedActive && kbs.some((kb) => kb.id === storedActive)\n ? storedActive\n : kbs[0]?.id ?? null;\n\n this.kbs$ = new BehaviorSubject<KnowledgeBase[]>(kbs);\n this.activeKbId$ = new BehaviorSubject<string | null>(initialActive);\n this.activeSession$ = new BehaviorSubject<SemiontSession | null>(null);\n this.activeSignals$ = new BehaviorSubject<SessionSignals | null>(null);\n this.sessionActivating$ = new BehaviorSubject<boolean>(false);\n this.openResources$ = new BehaviorSubject<OpenResource[]>(loadOpenResources(this.storage));\n this.error$ = new Subject<SemiontSessionError>();\n this.identityToken$ = new BehaviorSubject<string | null>(null);\n\n // Persist kbs$ and activeKbId$ via the storage adapter.\n this.kbs$.subscribe((next) => saveKnowledgeBases(this.storage, next));\n this.activeKbId$.subscribe((id) => {\n if (id) this.storage.set(ACTIVE_KEY, id);\n else this.storage.delete(ACTIVE_KEY);\n });\n\n // Persist openResources$ on every change.\n this.openResources$.subscribe((list) => {\n this.storage.set(OPEN_RESOURCES_KEY, JSON.stringify(list));\n });\n\n // Sync openResources$ from other contexts (cross-tab/cross-process).\n this.unsubscribeStorage = this.storage.subscribe?.((key, newValue) => {\n if (key !== OPEN_RESOURCES_KEY || !newValue) return;\n try {\n this.openResources$.next(sortOpenResources(JSON.parse(newValue) as OpenResource[]));\n } catch {\n // Ignore parse errors\n }\n }) ?? null;\n\n // Construct the initial active session, if any. Fire-and-forget.\n if (initialActive) {\n void this.setActiveKb(initialActive);\n }\n }\n\n // ── App-scoped event bus ──────────────────────────────────────────────\n\n /** Emit an event on the browser's app-scoped bus. */\n emit<K extends keyof EventMap>(channel: K, payload: EventMap[K]): void {\n if (this.disposed) return;\n this.eventBus.get(channel).next(payload);\n }\n\n /** Subscribe to an event; returns unsubscribe. */\n on<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n const sub = this.eventBus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n /** Read-only observable for an app-scoped channel. */\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.eventBus.get(channel).asObservable();\n }\n\n // ── Identity token (NextAuth bridge; D1) ──────────────────────────────\n\n /**\n * Set the app-level identity token. Sourced from whatever the host\n * environment uses for OAuth sessions (e.g. NextAuth in a browser app).\n * Should be called once from the host's startup-and-on-change site;\n * no other code should write to this slot.\n */\n setIdentityToken(token: string | null): void {\n if (this.disposed) return;\n this.identityToken$.next(token);\n }\n\n // ── KB list management ────────────────────────────────────────────────\n\n addKb(input: NewKnowledgeBase, access: string, refresh: string): KnowledgeBase {\n const kb: KnowledgeBase = { id: generateKbId(), ...input };\n setStoredSession(this.storage, kb.id, { access, refresh });\n this.kbs$.next([...this.kbs$.getValue(), kb]);\n void this.setActiveKb(kb.id);\n return kb;\n }\n\n removeKb(id: string): void {\n clearStoredSession(this.storage, id);\n const next = this.kbs$.getValue().filter((kb) => kb.id !== id);\n this.kbs$.next(next);\n if (this.activeKbId$.getValue() === id) {\n void this.setActiveKb(next[0]?.id ?? null);\n }\n }\n\n /**\n * Patch a KB in the list. Restricted to the common, endpoint-agnostic\n * fields (`label`, `email`, `gitBranch`) — the `endpoint` shape isn't\n * editable in place; remove and re-add to change the connection\n * target.\n */\n updateKb(id: string, updates: { label?: string; email?: string; gitBranch?: string }): void {\n this.kbs$.next(\n this.kbs$.getValue().map((kb) => (kb.id === id ? { ...kb, ...updates } : kb)),\n );\n }\n\n /**\n * Read the locally-stored credential status for a KB. Pure / synchronous —\n * does not subscribe to context changes. Used by KB-list UI to color status\n * dots without requiring re-renders on every tick.\n */\n getKbSessionStatus(kbId: string): KbSessionStatus {\n const stored = getStoredSession(this.storage, kbId);\n if (!stored) return 'signed-out';\n return isJwtExpired(stored.access) ? 'expired' : 'authenticated';\n }\n\n /**\n * Switch the active KB. Follows the D2 disposal contract:\n * 1. Synchronously announce the new id on `activeKbId$` and null out\n * `activeSession$` so views see a safe empty state first.\n * 2. Serialize overlapping calls — if an activation is in flight, wait\n * for it before proceeding.\n * 3. Dispose whatever session is currently live.\n * 4. Construct the next session and await `session.ready`.\n * 5. Before emitting, re-check `activeKbId$` — if a newer call superseded\n * us while we waited, dispose our session and skip the emit.\n * 6. Emit the new session.\n */\n async setActiveKb(id: string | null): Promise<void> {\n if (this.disposed) return;\n\n const prevId = this.activeKbId$.getValue();\n const prevSession = this.activeSession$.getValue();\n\n // No-op if id already matches and a live session exists.\n if (id === prevId && prevSession) return;\n\n // Synchronous intent signal. Late activations compare against this to\n // detect staleness. Session and signals null out together so React\n // consumers never see a stale signals instance paired with a null\n // session during the activation gap.\n if (prevId !== id) this.activeKbId$.next(id);\n if (prevSession) {\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n }\n\n // Wait for any in-flight activation. If we were superseded while\n // waiting, bail — a newer call is already reflecting the desired state.\n while (this.activating) {\n const current = this.activating;\n await current;\n if (this.disposed) return;\n if (this.activeKbId$.getValue() !== id) return;\n }\n\n const activation = (async () => {\n // Dispose whatever is currently live (might be null already from the\n // sync path above, or left over from a superseded activation).\n const toDispose = this.activeSession$.getValue();\n const signalsToDispose = this.activeSignals$.getValue();\n if (toDispose) {\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n await toDispose.dispose();\n signalsToDispose?.dispose();\n }\n\n if (!id) return;\n\n const kb = this.kbs$.getValue().find((k) => k.id === id);\n if (!kb) return;\n\n // Construct the modal signals up front; the session's\n // onAuthFailed callback writes into them, so they must exist\n // before the session's ctor does its startup validation.\n const signals = new SessionSignals();\n\n let session: SemiontSession;\n try {\n session = this.sessionFactory({\n kb,\n storage: this.storage,\n signals,\n onError: (err) => this.error$.next(err),\n });\n } catch (err) {\n this.error$.next(\n err instanceof SemiontSessionError\n ? err\n : new SemiontSessionError(\n 'session.construct-failed',\n err instanceof Error ? err.message : String(err),\n id,\n ),\n );\n signals.dispose();\n return;\n }\n\n // Route transport-level errors to the modal signals. The session's\n // `errors$` re-publishes `client.transport.errors$` per the\n // `ITransport` contract; the transport stamps `err.code` from the\n // `TransportErrorCode` vocabulary so this routing stays\n // transport-agnostic. `unauthorized` covers ad-hoc unauthorized\n // requests (the proactive-refresh `onAuthFailed` path doesn't);\n // `forbidden` has no recovery — surface it as permission-denied.\n // The subscription ends naturally when `errors$` completes on\n // transport dispose.\n session.errors$.subscribe((err) => {\n if (err.code === 'unauthorized') {\n signals.notifySessionExpired(err.message);\n } else if (err.code === 'forbidden') {\n signals.notifyPermissionDenied(err.message);\n }\n });\n\n try {\n await session.ready;\n } catch (err) {\n this.error$.next(\n new SemiontSessionError(\n 'session.construct-failed',\n err instanceof Error ? err.message : String(err),\n id,\n ),\n );\n await session.dispose();\n signals.dispose();\n return;\n }\n\n if (this.disposed || this.activeKbId$.getValue() !== id) {\n await session.dispose();\n signals.dispose();\n return;\n }\n\n this.activeSession$.next(session);\n this.activeSignals$.next(signals);\n })();\n\n this.activating = activation;\n this.sessionActivating$.next(true);\n try {\n await activation;\n } finally {\n // Reference-identity guard: clear only if no newer activate() superseded\n // us. Do NOT await `activation` here (it resolves to void) — awaiting would\n // make this always-false and leak the activating state. (CodeQL FP.)\n if (this.activating === activation) {\n this.activating = null;\n this.sessionActivating$.next(false);\n }\n }\n }\n\n /**\n * Sign in to an existing KB: store the tokens and (re)activate the\n * session. If the KB is already active, the current session is disposed\n * and replaced so the new tokens take effect.\n */\n async signIn(id: string, access: string, refresh: string): Promise<void> {\n if (this.disposed) return;\n setStoredSession(this.storage, id, { access, refresh });\n\n // If this KB is already active, tear down and reconstruct so the new\n // tokens are picked up from storage by the session ctor.\n if (this.activeKbId$.getValue() === id) {\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n await this.setActiveKb(id);\n return;\n }\n\n await this.setActiveKb(id);\n }\n\n /**\n * Sign out of a KB: clear stored tokens. If the KB is active, dispose\n * its session + signals and emit null for both.\n */\n async signOut(id: string): Promise<void> {\n if (this.disposed) return;\n clearStoredSession(this.storage, id);\n\n // Bump the kbs$ list so downstream status-derivations re-run.\n this.kbs$.next([...this.kbs$.getValue()]);\n\n if (this.activeKbId$.getValue() === id) {\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n }\n }\n\n // ── Open resources ────────────────────────────────────────────────────\n\n addOpenResource(\n id: string,\n name: string,\n mediaType?: string,\n storageUri?: string,\n ): void {\n const existing = this.openResources$.getValue();\n const idx = existing.findIndex((r) => r.id === id);\n if (idx >= 0) {\n // Update metadata in place; keep position and openedAt.\n const prev = existing[idx]!;\n const updated: OpenResource = {\n ...prev,\n name,\n ...(mediaType !== undefined ? { mediaType } : {}),\n ...(storageUri !== undefined ? { storageUri } : {}),\n };\n const next = [...existing];\n next[idx] = updated;\n this.openResources$.next(next);\n return;\n }\n const resource: OpenResource = {\n id,\n name,\n openedAt: Date.now(),\n order: existing.length,\n ...(mediaType !== undefined ? { mediaType } : {}),\n ...(storageUri !== undefined ? { storageUri } : {}),\n };\n this.openResources$.next([...existing, resource]);\n }\n\n removeOpenResource(id: string): void {\n this.openResources$.next(this.openResources$.getValue().filter((r) => r.id !== id));\n }\n\n updateOpenResourceName(id: string, name: string): void {\n this.openResources$.next(\n this.openResources$.getValue().map((r) => (r.id === id ? { ...r, name } : r)),\n );\n }\n\n reorderOpenResources(oldIndex: number, newIndex: number): void {\n const list = [...this.openResources$.getValue()];\n if (oldIndex < 0 || oldIndex >= list.length || newIndex < 0 || newIndex >= list.length) {\n return;\n }\n const [moved] = list.splice(oldIndex, 1);\n if (moved) list.splice(newIndex, 0, moved);\n this.openResources$.next(list);\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n if (this.unsubscribeStorage) {\n this.unsubscribeStorage();\n this.unsubscribeStorage = null;\n }\n\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n\n this.kbs$.complete();\n this.activeKbId$.complete();\n this.activeSession$.complete();\n this.activeSignals$.complete();\n this.openResources$.complete();\n this.error$.complete();\n this.identityToken$.complete();\n this.eventBus.destroy();\n }\n}\n","/**\n * createHttpSessionFactory — the default `SessionFactory` for HTTP-backed\n * KBs. Owns every HTTP-specific construction concern that used to live in\n * `SemiontBrowser`: building `HttpTransport`/`HttpContentTransport`,\n * wiring the `tokenRefresher` callback, deduplicating concurrent 401\n * refresh round trips, and invoking the auth endpoints for token refresh\n * and user-validate.\n *\n * Returned as a closure so a single `inFlightRefreshes` map is shared\n * across every session this factory builds — the dedup is meaningful\n * across concurrent session reactivations for the same KB id.\n */\n\nimport { BehaviorSubject } from 'rxjs';\nimport { HttpTransport, HttpContentTransport } from '@semiont/api-client';\nimport { baseUrl, type AccessToken } from '@semiont/core';\nimport { SemiontClient } from '../client';\nimport { SemiontSession, type UserInfo } from './semiont-session';\nimport { SemiontSessionError } from './errors';\nimport { kbBackendUrl, getStoredSession, setStoredSession } from './storage';\nimport type { SessionFactory, SessionFactoryOptions } from './session-factory';\n\nexport function createHttpSessionFactory(): SessionFactory {\n const inFlightRefreshes = new Map<string, Promise<string | null>>();\n\n return (opts: SessionFactoryOptions): SemiontSession => {\n const { kb, storage, signals, onError } = opts;\n\n if (kb.endpoint.kind !== 'http') {\n throw new SemiontSessionError(\n 'session.construct-failed',\n `HTTP session factory cannot construct a session for endpoint kind \"${kb.endpoint.kind}\"`,\n kb.id,\n );\n }\n const endpoint = kb.endpoint;\n\n /**\n * Refresh the KB's access token. Concurrent calls for the same KB\n * dedup through `inFlightRefreshes`, so simultaneous 401s trigger\n * only one `/api/tokens/refresh` round trip. Uses a throwaway\n * `SemiontClient` with no `tokenRefresher` — a refresh call\n * returning 401 would otherwise re-enter this function infinitely.\n */\n const performRefresh = async (): Promise<string | null> => {\n const existing = inFlightRefreshes.get(kb.id);\n if (existing) return existing;\n\n const promise = (async () => {\n const stored = getStoredSession(storage, kb.id);\n if (!stored) return null;\n const throwawayTransport = new HttpTransport({ baseUrl: baseUrl(kbBackendUrl(endpoint)) });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(throwawayTransport), throwawayTransport);\n try {\n const response = await throwaway.auth!.refresh(stored.refresh);\n const newAccess = response.access_token;\n if (!newAccess) return null;\n setStoredSession(storage, kb.id, { access: newAccess, refresh: stored.refresh });\n return newAccess;\n } catch {\n return null;\n } finally {\n throwaway.dispose();\n }\n })();\n\n inFlightRefreshes.set(kb.id, promise);\n try {\n return await promise;\n } finally {\n inFlightRefreshes.delete(kb.id);\n }\n };\n\n /**\n * Validate an access token by calling `auth.me` on a throwaway\n * client seeded with that specific token. The session uses this\n * once at startup to populate `user$`; 401 triggers a\n * refresh-then-retry inside the session.\n */\n const performValidate = async (token: AccessToken): Promise<UserInfo | null> => {\n const tokenSubject = new BehaviorSubject<AccessToken | null>(token);\n const throwawayTransport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(endpoint)),\n token$: tokenSubject,\n });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(throwawayTransport), throwawayTransport);\n try {\n const data = await throwaway.auth!.me();\n return data as UserInfo;\n } finally {\n throwaway.dispose();\n tokenSubject.complete();\n }\n };\n\n // Build transport stack: factory owns token$ and threads it through\n // transport (which reads it on every request) and session (which\n // writes refreshed values into it). The `tokenRefresher` closure\n // resolves `session` lazily — `session` is defined right after,\n // before any 401 could fire.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n let session!: SemiontSession;\n const transport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(endpoint)),\n token$,\n tokenRefresher: () => session.refresh().then((t) => t ?? null),\n });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n session = new SemiontSession({\n kb,\n storage,\n client,\n token$,\n refresh: performRefresh,\n validate: performValidate,\n onAuthFailed: (msg) => signals.notifySessionExpired(msg),\n onError,\n });\n return session;\n };\n}\n","/**\n * Process-wide accessor for `SemiontBrowser`. Constructed lazily on the\n * first `getBrowser()` call and held for the host's lifetime — a single\n * instance owns the KB list, identity token, and active-session state,\n * so callers throughout the host get the same view of \"which KB am I\n * talking to right now\" regardless of where they pick it up.\n *\n * The caller provides a `SessionStorage` implementation and a\n * `SessionFactory` — both are environment-specific (browsers use\n * `WebBrowserStorage` + `createHttpSessionFactory()`, CLI/embedded\n * hosts use a filesystem adapter and possibly a local-process\n * factory, tests use `InMemorySessionStorage` and stubs). The first\n * call to `getBrowser` wins; subsequent calls return the cached\n * instance regardless of the options passed.\n */\n\nimport { SemiontBrowser } from './semiont-browser';\nimport type { SessionStorage } from './session-storage';\nimport type { SessionFactory } from './session-factory';\n\nlet instance: SemiontBrowser | null = null;\n\nexport interface GetBrowserOptions {\n /** Persistence adapter used to construct the singleton on first call. */\n storage: SessionStorage;\n /** Session factory used to build a `SemiontSession` per active KB. */\n sessionFactory: SessionFactory;\n}\n\nexport function getBrowser(options: GetBrowserOptions): SemiontBrowser {\n if (!instance) {\n instance = new SemiontBrowser({\n storage: options.storage,\n sessionFactory: options.sessionFactory,\n });\n }\n return instance;\n}\n\n/**\n * Test-only reset hook. Tests import this to clear the singleton between\n * runs. Production code must not import it.\n */\nexport async function __resetForTests(): Promise<void> {\n if (instance) {\n await instance.dispose();\n instance = null;\n }\n}\n","/**\n * SessionStorage — environment-agnostic persistence adapter for the\n * Semiont session layer. Decouples `SemiontSession` / `SemiontBrowser`\n * from `localStorage` / `window` so the same classes can run in a\n * browser, a CLI process, or tests without environment guards.\n *\n * Implementations shipped here:\n * - `InMemorySessionStorage` — map-backed, for tests.\n *\n * Browser-backed (`WebBrowserStorage`) lives in `@semiont/react-ui`\n * because it touches browser-only globals.\n */\n\n/** String key/value store with optional cross-context change subscription. */\nexport interface SessionStorage {\n /** Read a string value; null if absent. */\n get(key: string): string | null;\n /** Write a string value. */\n set(key: string, value: string): void;\n /** Remove a key. No-op if absent. */\n delete(key: string): void;\n /**\n * Optional: subscribe to external changes (cross-tab, cross-process).\n * Browser implements via the `storage` event; filesystem would use\n * fs.watch; in-memory omits this method. Returns an unsubscribe\n * callback. If omitted, cross-context sync simply isn't available\n * in that environment — the session still works correctly within a\n * single process.\n */\n subscribe?(handler: (key: string, newValue: string | null) => void): () => void;\n}\n\n/**\n * Map-backed `SessionStorage`. Cross-context sync is not implemented;\n * tests that need it can drive it manually.\n */\nexport class InMemorySessionStorage implements SessionStorage {\n private readonly map = new Map<string, string>();\n\n get(key: string): string | null {\n return this.map.has(key) ? this.map.get(key)! : null;\n }\n\n set(key: string, value: string): void {\n this.map.set(key, value);\n }\n\n delete(key: string): void {\n this.map.delete(key);\n }\n}\n","/**\n * KnowledgeBase — a connection to a Semiont knowledge system.\n *\n * The KB type itself is uniform. The transport-shape variation lives in\n * the nested `endpoint` field, which is a discriminated union:\n *\n * - `endpoint.kind === 'http'` — a remote backend reached over HTTP+SSE.\n * Carries `host`/`port`/`protocol`.\n * - `endpoint.kind === 'local'` — an in-process knowledge system reached\n * via `LocalTransport` from\n * `@semiont/make-meaning`. Carries an\n * opaque `kbId` identifying the local\n * instance to the host process.\n *\n * Code that doesn't know how to make a transport (`SemiontSession`,\n * `SemiontBrowser`, the frontend KB list UI) treats `KnowledgeBase` as\n * uniform and never inspects `endpoint`. Code that *does* construct\n * transports (the transport-factory passed to `SemiontBrowser`,\n * `kbBackendUrl` for HTTP URL construction) inspects `endpoint.kind`\n * and dispatches.\n *\n * Each KB has its own session, its own credentials (where applicable),\n * and its own JWT (HTTP only). The user is \"authenticated against KB X\" —\n * never globally authenticated.\n */\n\n/** Fields shared by every KB regardless of endpoint kind. */\nexport interface KnowledgeBase {\n id: string;\n label: string;\n email: string;\n gitBranch?: string;\n endpoint: KbEndpoint;\n}\n\nexport type KbEndpoint = HttpEndpoint | LocalEndpoint;\n\nexport interface HttpEndpoint {\n kind: 'http';\n host: string;\n port: number;\n protocol: 'http' | 'https';\n}\n\nexport interface LocalEndpoint {\n kind: 'local';\n /** Opaque identifier for the in-process KB instance the host has loaded. */\n kbId: string;\n}\n\n/**\n * Input shape for adding a new KB. The id is generated by the provider.\n */\nexport type NewKnowledgeBase = Omit<KnowledgeBase, 'id'>;\n\n/**\n * Status of the locally-stored credential for a KB. Derived from the\n * presence and validity of the JWT in session storage.\n */\nexport type KbSessionStatus = 'authenticated' | 'expired' | 'signed-out' | 'unreachable';\n\n/**\n * Construct a `KnowledgeBase` for an HTTP-backed Semiont backend without\n * spelling out the nested `endpoint` literal. Convenience for tests,\n * worker bootstraps, and one-off scripts.\n *\n * ```ts\n * const kb = httpKb({\n * id: 'my-watcher',\n * label: 'My Watcher',\n * email: 'me@example.com',\n * host: 'localhost',\n * port: 4000,\n * protocol: 'http',\n * });\n * ```\n *\n * Equivalent to:\n *\n * ```ts\n * const kb: KnowledgeBase = {\n * id, label, email,\n * endpoint: { kind: 'http', host, port, protocol },\n * };\n * ```\n *\n * UI hosts that have a structured form (host / port / protocol pickers)\n * already construct the literal directly — they don't need this helper.\n * Local-endpoint KBs construct the literal directly too; the local\n * endpoint shape (`{ kind: 'local', kbId }`) is one line and doesn't\n * earn a helper.\n */\nexport function httpKb(opts: {\n id: string;\n label: string;\n email: string;\n host: string;\n port: number;\n protocol: 'http' | 'https';\n gitBranch?: string;\n}): KnowledgeBase {\n const { id, label, email, host, port, protocol, gitBranch } = opts;\n return {\n id,\n label,\n email,\n ...(gitBranch !== undefined ? { gitBranch } : {}),\n endpoint: { kind: 'http', host, port, protocol },\n };\n}\n","import { Subscription } from 'rxjs';\n\n/**\n * Marker for the state-unit pattern: a stateful, lifecycled object with an\n * RxJS-shaped public surface, constructed by a factory function\n * (`createFooStateUnit`), with internal state held in a closure.\n *\n * The structural contract is `dispose()` — the rest of the pattern\n * (closure-based identity, Observable public surface, internal Subjects\n * exposed as `.asObservable()` views, no leaked subscriptions, composition\n * by parameter rather than ownership) is convention enforced by review,\n * not the type system.\n *\n * See `packages/sdk/docs/STATE-UNITS.md` for the full axioms and rationale.\n */\nexport interface StateUnit {\n /**\n * Idempotent, total teardown. Completes every Subject the unit owns,\n * unsubscribes every internal subscription, releases timers / abort\n * controllers / network handles. Safe to call multiple times — the\n * second call is a no-op.\n */\n dispose(): void;\n}\n\n/**\n * Compose multiple disposers into a single `dispose()` call. Accepts either\n * a `StateUnit` (whose `dispose()` will be invoked) or a plain teardown\n * function. The returned object is itself disposable; call its `dispose()`\n * once to tear down everything that was added.\n */\nexport function createDisposer(): {\n add(item: StateUnit | (() => void)): void;\n dispose(): void;\n} {\n const sub = new Subscription();\n return {\n add: (item) =>\n sub.add(typeof item === 'function' ? item : () => item.dispose()),\n dispose: () => sub.unsubscribe(),\n };\n}\n","/**\n * createSearchPipeline\n *\n * A debounced-search RxJS pipeline factory. Combines an input Subject with a\n * downstream fetch function and emits typed `{ results, isSearching }` state.\n *\n * Designed to be created once per consumer instance and held for its lifetime\n * (e.g. by a view layer's lazy initializer), then observed via `state$`. The\n * pipeline is pure RxJS — unit-testable without any view-layer dependency.\n *\n * The fetch function is expected to return `Observable<T[] | undefined>`,\n * matching the cache-miss-then-data shape of `BrowseNamespace` Observables:\n * `undefined` means \"fetch in flight, no value yet\"; an array means \"data\n * available (possibly empty)\".\n */\n\nimport { Subject, of, type Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, startWith, map } from 'rxjs/operators';\n\nexport interface SearchState<T> {\n results: T[];\n isSearching: boolean;\n}\n\nexport interface SearchPipeline<T> {\n /** Latest query string. Bind to a controlled input. */\n query$: Observable<string>;\n /** Latest search state — results plus a loading flag. */\n state$: Observable<SearchState<T>>;\n /** Push a new query value. Triggers the debounced fetch. */\n setQuery(value: string): void;\n /** Tear down the input Subject. Call from the consumer's cleanup hook. */\n dispose(): void;\n}\n\nexport interface SearchPipelineOptions {\n /** Milliseconds to wait after the last keystroke before fetching. Default 250. */\n debounceMs?: number;\n /** Initial query value. Useful for modals that open with a pre-filled term. */\n initialQuery?: string;\n}\n\nexport function createSearchPipeline<T>(\n fetch: (query: string) => Observable<T[] | undefined>,\n options: SearchPipelineOptions = {},\n): SearchPipeline<T> {\n const debounceMs = options.debounceMs ?? 250;\n const initial = options.initialQuery ?? '';\n const input$ = new Subject<string>();\n\n const query$: Observable<string> = input$.pipe(startWith(initial));\n\n const state$: Observable<SearchState<T>> = input$.pipe(\n startWith(initial),\n debounceTime(debounceMs),\n distinctUntilChanged(),\n switchMap((q): Observable<SearchState<T>> => {\n const trimmed = q.trim();\n if (!trimmed) {\n return of({ results: [], isSearching: false });\n }\n return fetch(trimmed).pipe(\n map((results): SearchState<T> => ({\n results: results ?? [],\n isSearching: results === undefined,\n })),\n startWith({ results: [], isSearching: true } as SearchState<T>),\n );\n }),\n );\n\n return {\n query$,\n state$,\n setQuery: (value) => input$.next(value),\n dispose: () => input$.complete(),\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport type { AnnotationId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface BeckonStateUnit extends StateUnit {\n hoveredAnnotationId$: Observable<AnnotationId | null>;\n hover(annotationId: AnnotationId | null): void;\n focus(annotationId: AnnotationId): void;\n sparkle(annotationId: AnnotationId): void;\n}\n\nexport function createBeckonStateUnit(client: SemiontClient): BeckonStateUnit {\n const subs: Subscription[] = [];\n const hovered$ = new BehaviorSubject<AnnotationId | null>(null);\n\n subs.push(client.bus.get('beckon:hover').subscribe(({ annotationId }) => {\n hovered$.next(annotationId as AnnotationId | null);\n if (annotationId) {\n client.bus.get('beckon:sparkle').next({ annotationId });\n }\n }));\n\n subs.push(client.bus.get('browse:click').subscribe(({ annotationId }) => {\n client.bus.get('beckon:focus').next({ annotationId });\n }));\n\n return {\n hoveredAnnotationId$: hovered$.asObservable(),\n hover: (annotationId) => client.bus.get('beckon:hover').next({ annotationId }),\n focus: (annotationId) => client.bus.get('beckon:focus').next({ annotationId }),\n sparkle: (annotationId) => client.bus.get('beckon:sparkle').next({ annotationId }),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n hovered$.complete();\n },\n };\n}\n\n/** Default milliseconds the mouse must dwell before beckon:hover is emitted. */\nexport const HOVER_DELAY_MS = 150;\n\ntype EmitHover = (annotationId: AnnotationId | null) => void;\n\nexport interface HoverHandlers {\n handleMouseEnter: (annotationId: AnnotationId) => void;\n handleMouseLeave: () => void;\n cleanup: () => void;\n}\n\nexport function createHoverHandlers(emit: EmitHover, delayMs: number): HoverHandlers {\n let currentHover: AnnotationId | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cancelTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const handleMouseEnter = (annotationId: AnnotationId) => {\n if (currentHover === annotationId) return;\n cancelTimer();\n timer = setTimeout(() => {\n timer = null;\n currentHover = annotationId;\n emit(annotationId);\n }, delayMs);\n };\n\n const handleMouseLeave = () => {\n cancelTimer();\n if (currentHover !== null) {\n currentHover = null;\n emit(null);\n }\n };\n\n return { handleMouseEnter, handleMouseLeave, cleanup: cancelTimer };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { GatheredContext, ResourceId, AnnotationId } from '@semiont/core';\nimport { annotationId as makeAnnotationId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface GatherStateUnit extends StateUnit {\n context$: Observable<GatheredContext | null>;\n loading$: Observable<boolean>;\n error$: Observable<Error | null>;\n annotationId$: Observable<AnnotationId | null>;\n}\n\nexport function createGatherStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n): GatherStateUnit {\n const subs: Subscription[] = [];\n const context$ = new BehaviorSubject<GatheredContext | null>(null);\n const loading$ = new BehaviorSubject<boolean>(false);\n const error$ = new BehaviorSubject<Error | null>(null);\n const annotationId$ = new BehaviorSubject<AnnotationId | null>(null);\n\n subs.push(client.bus.get('gather:requested').subscribe((event) => {\n loading$.next(true);\n error$.next(null);\n context$.next(null);\n annotationId$.next(makeAnnotationId(event.annotationId));\n\n const gatherSub = client.gather.annotation(\n resourceId,\n makeAnnotationId(event.annotationId),\n { contextWindow: event.options?.contextWindow ?? 2000 },\n ).pipe(\n timeout(60_000),\n ).subscribe({\n next: (progress) => {\n if ('response' in progress && progress.response) {\n context$.next(\n (progress as { response: { context: GatheredContext } }).response.context ?? null,\n );\n loading$.next(false);\n }\n },\n error: (err) => {\n error$.next(err instanceof Error ? err : new Error(String(err)));\n loading$.next(false);\n },\n complete: () => {\n loading$.next(false);\n },\n });\n subs.push(gatherSub);\n }));\n\n return {\n context$: context$.asObservable(),\n loading$: loading$.asObservable(),\n error$: error$.asObservable(),\n annotationId$: annotationId$.asObservable(),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n context$.complete();\n loading$.complete();\n error$.complete();\n annotationId$.complete();\n },\n };\n}\n","import type { Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, GatheredContext } from '@semiont/core';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface MatchStateUnit extends StateUnit {}\n\nexport function createMatchStateUnit(\n client: SemiontClient,\n _resourceId: ResourceId,\n): MatchStateUnit {\n const subs: Subscription[] = [];\n\n subs.push(client.bus.get('match:search-requested').subscribe((event) => {\n const searchSub = client.match.search(\n makeResourceId(event.resourceId),\n makeAnnotationId(event.referenceId),\n event.context as GatheredContext,\n { limit: event.limit, useSemanticScoring: event.useSemanticScoring },\n ).pipe(\n timeout(60_000),\n ).subscribe({\n next: (result) => client.bus.get('match:search-results').next(result),\n error: (err) => client.bus.get('match:search-failed').next({\n correlationId: event.correlationId,\n referenceId: event.referenceId,\n error: err instanceof Error ? err.message : String(err),\n }),\n });\n subs.push(searchSub);\n }));\n\n return {\n dispose() {\n subs.forEach(s => s.unsubscribe());\n },\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, GatheredContext, components } from '@semiont/core';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface GenerateDocumentOptions {\n title: string;\n storageUri: string;\n prompt?: string;\n /** Body locale — language the generated resource is written in. Falls back to the state unit's UI locale when unset. */\n language?: string;\n /** Source-resource locale — language of the resource the annotation lives on. Forwarded to the prompt for context-snippet awareness. BCP-47. */\n sourceLanguage?: string;\n temperature?: number;\n maxTokens?: number;\n context: GatheredContext;\n}\n\nexport interface YieldStateUnit extends StateUnit {\n isGenerating$: Observable<boolean>;\n progress$: Observable<JobProgress | null>;\n generate(referenceId: string, options: GenerateDocumentOptions): void;\n}\n\nexport function createYieldStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n): YieldStateUnit {\n const subs: Subscription[] = [];\n const isGenerating$ = new BehaviorSubject<boolean>(false);\n const progress$ = new BehaviorSubject<JobProgress | null>(null);\n let clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation progress/complete/fail is driven entirely by the\n // Observable returned from `client.yield.fromAnnotation` — that\n // Observable is filtered to this specific job's jobId internally.\n // No direct bus subscription needed here.\n const generate = (referenceId: string, options: GenerateDocumentOptions): void => {\n const genSub = client.yield.fromAnnotation(\n makeResourceId(resourceId as string),\n makeAnnotationId(referenceId),\n { ...options, language: options.language || locale },\n ).pipe(\n timeout({ each: 300_000 }),\n ).subscribe({\n next: (e) => {\n // Surface live progress to the UI; `complete` events carry the\n // final job result for awaiting callers but produce no extra\n // panel signal here (the `complete` callback fires next).\n if (e.kind === 'progress') {\n progress$.next(e.data);\n isGenerating$.next(true);\n }\n },\n complete: () => {\n isGenerating$.next(false);\n if (clearTimer) clearTimeout(clearTimer);\n clearTimer = setTimeout(() => { progress$.next(null); clearTimer = null; }, 2000);\n },\n error: () => {\n progress$.next(null);\n isGenerating$.next(false);\n },\n });\n subs.push(genSub);\n };\n\n return {\n isGenerating$: isGenerating$.asObservable(),\n progress$: progress$.asObservable(),\n generate,\n dispose() {\n subs.forEach(s => s.unsubscribe());\n if (clearTimer) clearTimeout(clearTimer);\n isGenerating$.complete();\n progress$.complete();\n },\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, Motivation, Selector, EventMap, components } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface PendingAnnotation {\n selector: Selector | Selector[];\n motivation: Motivation;\n}\n\nexport interface MarkStateUnit extends StateUnit {\n pendingAnnotation$: Observable<PendingAnnotation | null>;\n assistingMotivation$: Observable<Motivation | null>;\n progress$: Observable<JobProgress | null>;\n}\n\ntype SelectionData = EventMap['mark:select-comment'];\n\nfunction selectionToSelector(selection: SelectionData): Selector | Selector[] {\n if (selection.svgSelector) return { type: 'SvgSelector', value: selection.svgSelector };\n if (selection.fragmentSelector) {\n const selectors: Selector[] = [{ type: 'FragmentSelector', value: selection.fragmentSelector, ...(selection.conformsTo && { conformsTo: selection.conformsTo }) }];\n if (selection.exact) selectors.push({ type: 'TextQuoteSelector', exact: selection.exact, ...(selection.prefix && { prefix: selection.prefix }), ...(selection.suffix && { suffix: selection.suffix }) });\n return selectors;\n }\n return { type: 'TextQuoteSelector', exact: selection.exact, ...(selection.prefix && { prefix: selection.prefix }), ...(selection.suffix && { suffix: selection.suffix }) };\n}\n\nexport function createMarkStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n): MarkStateUnit {\n const subs: Subscription[] = [];\n const pendingAnnotation$ = new BehaviorSubject<PendingAnnotation | null>(null);\n const assistingMotivation$ = new BehaviorSubject<Motivation | null>(null);\n const progress$ = new BehaviorSubject<JobProgress | null>(null);\n let progressDismissTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearProgressTimer = () => {\n if (progressDismissTimer) { clearTimeout(progressDismissTimer); progressDismissTimer = null; }\n };\n\n // The view layer is responsible for opening the annotations panel in\n // response to `pendingAnnotation$` becoming non-null. The state unit stays pure:\n // it updates state; UI side-effects (opening panels on the app-scoped\n // bus) belong in the view layer, where the host's bus emit is accessible.\n const handleAnnotationRequested = (pending: PendingAnnotation) => {\n pendingAnnotation$.next(pending);\n };\n\n // Selection events → pending annotation\n subs.push(client.bus.get('mark:requested').subscribe(handleAnnotationRequested));\n subs.push(client.bus.get('mark:select-comment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'commenting' })));\n subs.push(client.bus.get('mark:select-tag').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'tagging' })));\n subs.push(client.bus.get('mark:select-assessment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'assessing' })));\n subs.push(client.bus.get('mark:select-reference').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'linking' })));\n\n subs.push(client.bus.get('mark:cancel-pending').subscribe(() => pendingAnnotation$.next(null)));\n subs.push(client.bus.get('mark:create-ok').subscribe(() => pendingAnnotation$.next(null)));\n\n // CRUD bridging\n subs.push(client.bus.get('mark:submit').subscribe(async (event) => {\n try {\n const result = await client.mark.annotation({\n motivation: event.motivation,\n target: { source: resourceId, selector: event.selector as Selector },\n body: event.body,\n });\n client.bus.get('mark:create-ok').next({ annotationId: result.annotationId });\n } catch (error) {\n client.bus.get('mark:create-failed').next({ message: error instanceof Error ? error.message : String(error) });\n }\n }));\n\n subs.push(client.bus.get('mark:delete').subscribe(async (event) => {\n try {\n await client.mark.delete(resourceId, event.annotationId as Parameters<typeof client.mark.delete>[1]);\n client.bus.get('mark:delete-ok').next({ annotationId: event.annotationId });\n } catch (error) {\n client.bus.get('mark:delete-failed').next({ message: error instanceof Error ? error.message : String(error) });\n }\n }));\n\n // AI assist. The assist() Observable encapsulates the full job\n // lifecycle — it subscribes to job:report-progress/complete/fail\n // filtered by its own jobId, emits JobProgress on `next`, completes\n // on `job:complete`, errors on `job:fail`. mark-state-unit's only job is to\n // drive the three UI observables from that stream.\n subs.push(client.bus.get('mark:assist-request').subscribe((event) => {\n clearProgressTimer();\n assistingMotivation$.next(event.motivation);\n progress$.next(null);\n\n const assistSub = client.mark.assist(resourceId, event.motivation, event.options).pipe(\n timeout({ each: 180_000 }),\n ).subscribe({\n next: (e) => {\n // Surface only the live progress events to the UI; the final\n // `complete` event carries `result` for callers awaiting the\n // Observable, but the panel just dismisses on `complete`.\n if (e.kind === 'progress') progress$.next(e.data);\n },\n complete: () => {\n assistingMotivation$.next(null);\n clearProgressTimer();\n progressDismissTimer = setTimeout(() => {\n progress$.next(null);\n progressDismissTimer = null;\n }, 5000);\n },\n error: () => {\n clearProgressTimer();\n assistingMotivation$.next(null);\n progress$.next(null);\n },\n });\n subs.push(assistSub);\n }));\n\n subs.push(client.bus.get('mark:progress-dismiss').subscribe(() => {\n clearProgressTimer();\n progress$.next(null);\n }));\n\n return {\n pendingAnnotation$: pendingAnnotation$.asObservable(),\n assistingMotivation$: assistingMotivation$.asObservable(),\n progress$: progress$.asObservable(),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n clearProgressTimer();\n pendingAnnotation$.complete();\n assistingMotivation$.complete();\n progress$.complete();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/awaitable.ts","../src/bus-request.ts","../src/cache.ts","../src/namespaces/browse.ts","../src/namespaces/mark.ts","../src/namespaces/bind.ts","../src/namespaces/gather.ts","../src/namespaces/match.ts","../src/namespaces/yield.ts","../src/namespaces/beckon.ts","../src/namespaces/frame.ts","../src/namespaces/job.ts","../src/namespaces/auth.ts","../src/namespaces/admin.ts","../src/client.ts","../src/session/storage.ts","../src/session/errors.ts","../src/session/semiont-session.ts","../src/session/session-signals.ts","../src/session/semiont-browser.ts","../src/session/http-session-factory.ts","../src/session/registry.ts","../src/session/session-storage.ts","../src/session/knowledge-base.ts","../src/state/lib/state-unit.ts","../src/state/lib/search-pipeline.ts","../src/state/flows/beckon-state-unit.ts","../src/state/flows/gather-state-unit.ts","../src/state/flows/match-state-unit.ts","../src/state/flows/yield-state-unit.ts","../src/state/flows/mark-state-unit.ts"],"names":["filter","firstValueFrom","map","distinctUntilChanged","resourceId","annotationId","Observable","makeAnnotationId","makeResourceId","toResourceId","toAnnotationId","merge","takeUntil","timeout","makeEmail","makeRefreshToken","userId","BehaviorSubject","SemiontError","accessToken","baseUrl","HttpTransport","HttpContentTransport","EventBus","Subject"],"mappings":";;;;;;;;;AAgCO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAA4B,UAAA,CAAwC;AAAA,EAC/E,IAAA,CACE,aACA,UAAA,EACsB;AACtB,IAAA,OAAO,aAAA,CAAc,IAAI,CAAA,CAAE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,OAAO,KAAQ,MAAA,EAA4C;AACzD,IAAA,OAAO,IAAI,iBAAA,CAAoB,CAAC,eAAe,MAAA,CAAO,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,EAC7E;AACF;AAqBO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAA2B,UAAA,CAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlF,UAAA;AAAA,EAER,IAAA,CACE,aACA,UAAA,EACsB;AACtB,IAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,MAAA,OAAO,IAAA,CAAK,UAAA,EAAW,CAAE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAc,CAAA,KAAM,MAAS,CAAC,CAAC,CAAA,CACpE,IAAA,CAAK,aAAa,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,OAAO,IAAA,CAAQ,MAAA,EAAmC,UAAA,EAAmD;AACnG,IAAA,IAAI,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,GAAU,IAAI,gBAAA,CAAmB,CAAC,eAAe,MAAA,CAAO,SAAA,CAAU,UAAU,CAAC,CAAA;AAC7E,MAAA,OAAA,CAAQ,UAAA,GAAa,UAAA;AACrB,MAAA,YAAA,CAAa,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,IAAM,YAAA,uBAAmB,OAAA,EAAuD;AAuBzE,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAA8E;AAAA,EAClH,IAAA,CACE,aACA,UAAA,EACsB;AACtB,IAAA,OAAO,aAAA,CAAc,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AACrC,MAAA,IAAI,CAAA,CAAE,UAAU,UAAA,EAAY;AAC1B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mDAAA,EAAsD,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAAA,MACjF;AACA,MAAA,MAAM,MAAA,GAAS,EAAE,UAAA,EAAY,CAAA,CAAE,UAAA,EAAW;AAC1C,MAAA,OAAO,WAAA,GAAc,WAAA,CAAY,MAAM,CAAA,GAAK,MAAA;AAAA,IAC9C,GAAG,UAAU,CAAA;AAAA,EACf;AACF;AC3IO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAGhD,WAAA,CAAY,OAAA,EAAiB,IAAA,EAA2B,OAAA,EAAmC;AACzF,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAYA,eAAsB,WACpB,GAAA,EACA,WAAA,EACA,SACA,aAAA,EACA,cAAA,EACA,YAAY,GAAA,EACM;AAClB,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AACxC,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,OAAA,EAAS,aAAA,EAAc;AAEhD,EAAA,MAAM,OAAA,GAAU,KAAA;AAAA,IACb,GAAA,CAAI,MAAA,CAAO,aAA+B,CAAA,CAA0C,IAAA;AAAA,MACnFA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa,CAAA;AAAA,MAC/C,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAI,IAAA,EAAe,QAAA,EAAU,CAAA,CAAE,QAAA,EAAoB,CAAE;AAAA,KACrE;AAAA,IACC,GAAA,CAAI,MAAA,CAAO,cAAgC,CAAA,CAA0C,IAAA;AAAA,MACpFA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa,CAAA;AAAA,MAC/C,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACV,EAAA,EAAI,KAAA;AAAA,QACJ,OAAO,IAAI,eAAA,CAAiB,CAAA,CAAE,OAAA,IAAsB,wBAAwB,cAAA,EAAgB;AAAA,UAC1F,OAAA,EAAS,cAAA;AAAA,UACT,aAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV;AAAA,OACH,CAAE;AAAA;AACJ,GACF,CAAE,IAAA;AAAA,IACA,KAAK,CAAC,CAAA;AAAA,IACN,QAAQ,SAAS,CAAA;AAAA,IACjB,UAAA,CAAW,CAAC,GAAA,KAAQ;AAClB,MAAA,IAAI,eAAe,YAAA,EAAc;AAC/B,QAAA,OAAO,UAAA;AAAA,UACL,MACE,IAAI,eAAA;AAAA,YACF,CAAA,4BAAA,EAA+B,SAAS,CAAA,MAAA,EAAS,aAAa,CAAA,CAAA;AAAA,YAC9D,aAAA;AAAA,YACA,EAAE,OAAA,EAAS,WAAA,EAAa,aAAA,EAAe,eAAe,SAAA;AAAU;AAClE,SACJ;AAAA,MACF;AACA,MAAA,OAAO,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,IAC7B,CAAC;AAAA,GACH;AAIA,EAAA,MAAM,aAAA,GAAgBC,eAAe,OAAO,CAAA;AAE5C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,CAAI,IAAA,CAAK,WAAA,EAA+B,WAAuC,CAAA;AAAA,EACvF,SAAS,GAAA,EAAK;AAaZ,IAAA,aAAA,CAAc,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAC5B,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,MAAM,SAAS,MAAM,aAAA;AACrB,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,MAAA,CAAO,KAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA,CAAO,QAAA;AAChB;ACvBO,SAAS,YAAkB,OAAA,EAA8C;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,iBAA2B,IAAI,KAAK,CAAA;AAEvD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAmB;AACxC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAkC;AAQvD,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAuB;AACvC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,UAAU,OAAO,QAAA;AAIrB,IAAA,IAAI,CAAA;AACJ,IAAA,CAAA,GAAA,CAAK,YAAY;AACf,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAG,CAAA;AAG/B,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACjC,QAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,QAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,SAAE;AAGA,QAAA,IAAI,SAAS,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,GAAG;AACH,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,GAAA,EAAmC;AACzC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,GAAG,KAAK,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AAGhD,QAAA,KAAK,QAAA,CAAS,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnC;AAEA,MAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC1B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,GAAA,GAAM,MAAA,CAAO,IAAA;AAAA,UACXC,MAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,UACrBC,sBAAA;AAAqB,SACvB;AACA,QAAA,QAAA,CAAS,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACvB;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,GAAA,EAAoB;AACxB,MAAA,OAAO,SAAS,GAAG,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,IAAI,GAAA,EAAuB;AACzB,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,IAAA,GAAY;AACV,MAAA,OAAO,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,WAAW,GAAA,EAAc;AAIvB,MAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AACnB,MAAA,KAAK,QAAA,CAAS,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,OAAO,GAAA,EAAc;AAEnB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACjC,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,MAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,GAAA,CAAI,KAAQ,KAAA,EAAgB;AAE1B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AACjC,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA;AAAA,IAEA,aAAA,GAAsB;AAGpB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK,EAAG;AACrC,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AACnB,QAAA,KAAK,QAAA,CAAS,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,IAEA,OAAA,GAAgB;AACd,MAAA,MAAA,CAAO,QAAA,EAAS;AAChB,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,QAAA,CAAS,KAAA,EAAM;AAAA,IACjB;AAAA,GACF;AACF;;;ACvJA,IAAM,gBAAA,GAAmB,GAAA;AAGzB,IAAM,eAAA,GAAkB,GAAA;AAEjB,IAAM,kBAAN,MAAkD;AAAA,EAiDvD,WAAA,CACmB,SAAA,EACA,GAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAA,CAA4C,OAAO,EAAA,KAAO;AAC7E,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,2BAAA;AAAA,QACA,EAAE,YAAY,EAAA,EAAG;AAAA,QACjB,wBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAA,CAA0C,OAAO,GAAA,KAAQ;AAChF,MAAA,MAAM,UAAU,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAG,KAAK,EAAC;AACtD,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,GAAS,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA,GAAI,KAAA,CAAA;AAC9D,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,4BAAA;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,YAAY,OAAA,CAAQ,UAAA;AAAA,UACpB,KAAA,EAAO,QAAQ,KAAA,IAAS,GAAA;AAAA,UACxB,MAAA,EAAQ;AAAA,SACV;AAAA,QACA,yBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,mBAAA,GAAsB,WAAA,CAAiD,OAAOC,WAAAA,KAAe;AAChG,MAAA,OAAO,UAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,QACL,8BAAA;AAAA,QACA,EAAE,YAAAA,WAAAA,EAAW;AAAA,QACb,2BAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,qBAAA,GAAwB,WAAA,CAAsC,OAAOC,aAAAA,KAAiB;AACzF,MAAA,MAAMD,WAAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAIC,aAAY,CAAA;AAC5D,MAAA,IAAI,CAACD,WAAAA,EAAY;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2BC,aAAY,CAAA,qBAAA,CAAuB,CAAA;AAAA,MAChF;AACA,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,6BAAA;AAAA,QACA,EAAE,UAAA,EAAAD,WAAAA,EAAY,YAAA,EAAAC,aAAAA,EAAa;AAAA,QAC3B,0BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,gBAAA,GAAmB,YAA8B,YAAY;AAChE,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,+BAAA;AAAA,QACA,EAAC;AAAA,QACD,4BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,eAAA,GAAkB,YAAiC,YAAY;AAClE,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,8BAAA;AAAA,QACA,EAAC;AAAA,QACD,2BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,UAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAA,CAA6C,OAAOD,WAAAA,KAAe;AAC1F,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,gCAAA;AAAA,QACA,EAAE,YAAAA,WAAAA,EAAW;AAAA,QACb,6BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,YAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,mBAAA,GAAsB,WAAA,CAA+C,OAAOA,WAAAA,KAAe;AAC9F,MAAA,MAAM,SAAS,MAAM,UAAA;AAAA,QACnB,IAAA,CAAK,SAAA;AAAA,QACL,yBAAA;AAAA,QACA,EAAE,YAAAA,WAAAA,EAAW;AAAA,QACb,sBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA,EAxGmB,SAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA1CF,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAA;AAAA,EACA,mBAAA,uBAA0B,GAAA,EAA8B;AAAA,EACxD,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAGA,mBAAA,uBAA0B,GAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW3D,iBAAA,uBAAwB,GAAA,EAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9E,aAAA,uBAAoB,OAAA,EAAkD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+H/E,SAAA,CAAa,KAAiB,MAAA,EAA8D;AAClG,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,IAAIE,UAAAA,CAA0B,CAAC,UAAA,KAAe;AACrD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,GAAG,CAAA;AACtD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AACzC,QAAA,OAAO,MAAM;AACX,UAAA,KAAA,CAAM,WAAA,EAAY;AAClB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA;AAAA,MACF,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAASF,WAAAA,EAA6D;AACpE,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,WAAAA,EAAY,KAAK,aAAA,CAAc,OAAA,CAAQA,WAAU,CAAC,GAAG,MAAM,IAAA,CAAK,aAAA,CAAc,KAAA,CAAMA,WAAU,CAAC,CAAA;AAAA,EAC5I;AAAA,EAEA,UAAU,OAAA,EAAsE;AAC9E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AAGxC,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAK,OAAA,IAAW,EAAE,CAAA;AAC/C,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC1G;AAAA,EAEA,YAAYA,WAAAA,EAAuD;AACjE,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAIA,WAAU,CAAA;AAC/C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAQA,WAAU,CAAA,CAAE,IAAA,CAAKF,KAAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,WAAuC,CAAC,CAAA;AAC9G,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAIE,WAAAA,EAAY,GAAG,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA,CAAK,UAAUA,WAAAA,EAAY,GAAG,GAAG,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAMA,WAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAA2B,CAAC,CAAA;AAAA,EAC1J;AAAA,EAEA,UAAA,CAAWA,aAAwBC,aAAAA,EAAyD;AAI1F,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAIA,aAAAA,EAAcD,WAAU,CAAA;AACrD,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,WAAAA,EAAY,KAAK,qBAAA,CAAsB,OAAA,CAAQC,aAAY,CAAC,GAAG,MAAM,IAAA,CAAK,qBAAA,CAAsB,KAAA,CAAMA,aAAY,CAAC,CAAA;AAAA,EAChK;AAAA,EAEA,WAAA,GAAyC;AACvC,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,gBAAgB,CAAA,EAAG,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,EAClI;AAAA,EAEA,UAAA,GAA2C;AACzC,IAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,eAAe,CAAA,EAAG,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,EAC9H;AAAA,EAEA,aAAaD,WAAAA,EAA8D;AACzE,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,WAAAA,EAAY,KAAK,iBAAA,CAAkB,OAAA,CAAQA,WAAU,CAAC,GAAG,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAMA,WAAU,CAAC,CAAA;AAAA,EACpJ;AAAA,EAEA,OAAOA,WAAAA,EAAgE;AACrE,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,WAAAA,EAAY,KAAK,mBAAA,CAAoB,OAAA,CAAQA,WAAU,CAAC,GAAG,MAAM,IAAA,CAAK,mBAAA,CAAoB,KAAA,CAAMA,WAAU,CAAC,CAAA;AAAA,EACxJ;AAAA;AAAA,EAIA,MAAM,gBAAgBA,WAAAA,EAAyC;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAUA,WAAU,CAAA;AAEtD,IAAA,OAAO,iBAAA,CAAkB,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,WAAW,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAcA,WAAAA,EAAsD;AACxE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiBA,WAAU,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,uBACJA,WAAAA,EACqD;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAUA,WAAU,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,6BACJA,WAAAA,EACsE;AACtE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgBA,WAAU,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,eAAeA,WAAAA,EAAwD;AAC3E,IAAA,MAAM,SAAS,MAAM,UAAA;AAAA,MACnB,IAAA,CAAK,SAAA;AAAA,MACL,yBAAA;AAAA,MACA,EAAE,YAAAA,WAAAA,EAAW;AAAA,MACb,sBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAA,CAAkBA,WAAAA,EAAwBC,aAAAA,EAAgE;AAC9G,IAAA,OAAO,UAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,qCAAA;AAAA,MACA,EAAE,UAAA,EAAAD,WAAAA,EAAY,YAAA,EAAAC,aAAAA,EAAa;AAAA,MAC3B,kCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,WAAA,EAAqD;AACrE,IAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,UAAU,WAAA,EAAgD;AAC9D,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,eAAA,CAAgB,MAAA,EAAgB,MAAA,EAAgD;AACpF,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,KAAA,CACJ,OAAA,EACA,IAAA,EACuD;AACvD,IAAA,OAAO,UAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,4BAAA;AAAA,MACA,EAAE,IAAA,EAAM,OAAA,IAAW,GAAA,EAAK,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,MAC7C,yBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIA,KAAA,CAAMA,eAA4B,UAAA,EAA8B;AAC9D,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,cAAc,CAAA,CAAE,KAAK,EAAE,YAAA,EAAAA,aAAAA,EAAc,UAAA,EAAY,CAAA;AAAA,EAChE;AAAA,EAEA,kBAAkBD,WAAAA,EAA8B;AAC9C,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,2BAA2B,CAAA,CAAE,KAAK,EAAE,UAAA,EAAAA,aAAY,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,yBAAyBA,WAAAA,EAA8B;AACrD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAWA,WAAU,CAAA;AAAA,EAChD;AAAA,EAEA,uBAAuBC,aAAAA,EAAkC;AACvD,IAAA,IAAA,CAAK,qBAAA,CAAsB,OAAOA,aAAY,CAAA;AAC9C,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAOA,aAAY,CAAA;AAAA,EAC9C;AAAA,EAEA,yBAAyB,EAAA,EAAsB;AAC7C,IAAA,IAAA,CAAK,aAAA,CAAc,WAAW,EAAE,CAAA;AAAA,EAClC;AAAA,EAEA,uBAAA,GAAgC;AAC9B,IAAA,IAAA,CAAK,kBAAkB,aAAA,EAAc;AAAA,EACvC;AAAA,EAEA,qBAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,gBAAgB,CAAA;AAAA,EACnD;AAAA,EAEA,oBAAA,GAA6B;AAC3B,IAAA,IAAA,CAAK,eAAA,CAAgB,WAAW,eAAe,CAAA;AAAA,EACjD;AAAA,EAEA,uBAAuBD,WAAAA,EAA8B;AACnD,IAAA,IAAA,CAAK,iBAAA,CAAkB,WAAWA,WAAU,CAAA;AAAA,EAC9C;AAAA,EAEA,yBAAyBA,WAAAA,EAA8B;AACrD,IAAA,IAAA,CAAK,mBAAA,CAAoB,WAAWA,WAAU,CAAA;AAAA,EAChD;AAAA,EAEA,uBAAA,CAAwBA,aAAwB,UAAA,EAA8B;AAG5E,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAIA,WAAU,CAAA;AAC3D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAA,GAAM,YAAY,WAAA,CAAY,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,UAAA,CAAW,EAAE,CAAA;AAC3E,MAAA,MAAM,kBACJ,GAAA,IAAO,CAAA,GACH,YAAY,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,GAAA,GAAM,aAAa,CAAE,CAAA,GAClE,CAAC,GAAG,WAAA,CAAY,aAAa,UAAU,CAAA;AAC7C,MAAA,IAAA,CAAK,mBAAA,CAAoB,IAAIA,WAAAA,EAAY,EAAE,GAAG,WAAA,EAAa,WAAA,EAAa,iBAAiB,CAAA;AAAA,IAC3F;AAIA,IAAA,MAAM,GAAA,GAAMG,YAAA,CAAiB,UAAA,CAAW,EAAE,CAAA;AAC1C,IAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,EAAKH,WAAU,CAAA;AAC5C,IAAA,IAAA,CAAK,qBAAA,CAAsB,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,EAAA,CACN,SACA,OAAA,EACM;AACN,IAAC,KAAK,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,CAA2D,UAAU,OAAO,CAAA;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,kBAAA,GAAqB,CAAC,MAAA,KAA8C;AAC1E,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,IAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAC/C,IAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAC/C,IAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAAA,EACjD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAA,GAAmB,CAAC,MAAA,KAA8C;AACxE,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,IAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAC/C,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,EAC/B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,sBAAA,GAAyB,CAAC,KAAA,KAAwC;AACxE,IAAA,MAAM,GAAA,GAAMI,UAAA,CAAe,KAAA,CAAM,UAAU,CAAA;AAC3C,IAAA,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACjC,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,EAC/B,CAAA;AAAA,EAEQ,iBAAA,GAA0B;AAehC,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,EAAkB,CAAC,KAAA,KAAU;AACnC,MAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,GAAA,GAAM,QAAA;AACZ,QAAA,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACjC,QAAA,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACjC,QAAA,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACjC,QAAA,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,QAAA,KAAA,MAAW,OAAO,IAAA,CAAK,mBAAA,CAAoB,MAAK,EAAG,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACpF,QAAA,KAAA,MAAW,OAAO,IAAA,CAAK,aAAA,CAAc,MAAK,EAAG,IAAA,CAAK,yBAAyB,GAAG,CAAA;AAC9E,QAAA,KAAA,MAAW,OAAO,IAAA,CAAK,mBAAA,CAAoB,MAAK,EAAG,IAAA,CAAK,yBAAyB,GAAG,CAAA;AACpF,QAAA,KAAA,MAAW,OAAO,IAAA,CAAK,iBAAA,CAAkB,MAAK,EAAG,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAAA,MAClF;AAEA,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,EAAkB,CAAC,KAAA,KAAU;AACnC,MAAA,IAAA,CAAK,sBAAA,CAAuBD,YAAA,CAAiB,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,IAClE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,YAAA,EAAc,CAAC,MAAA,KAAW;AAChC,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAC/C,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAAA,MACjD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,cAAA,EAAgB,CAAC,MAAA,KAAW;AAClC,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAC/C,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,UAAU,CAAA;AAAA,MACjD;AACA,MAAA,IAAA,CAAK,sBAAA,CAAuBA,YAAA,CAAiB,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,mBAAA,EAAqB,CAAC,KAAA,KAAU;AACtC,MAAA,MAAM,QAAA,GAAW,KAAA;AACjB,MAAA,IAAI,CAAC,QAAA,CAAS,UAAA,IAAc,CAAC,SAAS,UAAA,EAAY;AAClD,MAAA,IAAA,CAAK,uBAAA,CAAwB,QAAA,CAAS,UAAA,EAA0B,QAAA,CAAS,UAAwB,CAAA;AACjG,MAAA,IAAA,CAAK,wBAAA,CAAyB,SAAS,UAAwB,CAAA;AAAA,IACjE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,uBAAA,EAAyB,IAAA,CAAK,kBAAkB,CAAA;AACxD,IAAA,IAAA,CAAK,EAAA,CAAG,yBAAA,EAA2B,IAAA,CAAK,kBAAkB,CAAA;AAE1D,IAAA,IAAA,CAAK,EAAA,CAAG,wBAAA,EAA0B,CAAC,KAAA,KAAU;AAC3C,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,wBAAA,CAAyB,MAAM,UAAwB,CAAA;AAAA,MAC9D;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,iBAAA,EAAmB,IAAA,CAAK,sBAAsB,CAAA;AACtD,IAAA,IAAA,CAAK,EAAA,CAAG,iBAAA,EAAmB,IAAA,CAAK,sBAAsB,CAAA;AAEtD,IAAA,IAAA,CAAK,EAAA,CAAG,eAAA,EAAiB,IAAA,CAAK,gBAAgB,CAAA;AAC9C,IAAA,IAAA,CAAK,EAAA,CAAG,iBAAA,EAAmB,IAAA,CAAK,gBAAgB,CAAA;AAEhD,IAAA,IAAA,CAAK,EAAA,CAAG,yBAAA,EAA2B,MAAM,IAAA,CAAK,uBAAuB,CAAA;AACrE,IAAA,IAAA,CAAK,EAAA,CAAG,wBAAA,EAA0B,MAAM,IAAA,CAAK,sBAAsB,CAAA;AAAA,EACrE;AACF;ACvhBO,IAAM,gBAAN,MAA8C;AAAA,EACnD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAGnB,MAAM,WAAW,KAAA,EAAuE;AAItF,IAAA,MAAMH,WAAAA,GAAaK,UAAA,CAAa,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACnD,IAAA,MAAM,SAAS,MAAM,UAAA;AAAA,MACnB,IAAA,CAAK,SAAA;AAAA,MACL,qBAAA;AAAA,MACA,EAAE,UAAA,EAAAL,WAAAA,EAAY,OAAA,EAAS,KAAA,EAAM;AAAA,MAC7B,gBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,YAAA,EAAcM,YAAA,CAAe,MAAA,CAAO,YAAY,CAAA,EAAE;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAA,CAAON,WAAAA,EAAwBC,aAAAA,EAA2C;AAC9E,IAAA,MAAM,IAAA,CAAK,UAAU,IAAA,CAAK,aAAA,EAAe,EAAE,YAAA,EAAAA,aAAAA,EAAc,UAAA,EAAAD,WAAAA,EAAY,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,QAAQA,WAAAA,EAAuC;AACnD,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,gBAAgB,EAAE,UAAA,EAAAA,aAAY,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAUA,WAAAA,EAAuC;AACrD,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,kBAAkB,EAAE,UAAA,EAAAA,aAAY,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAA,CAAOA,WAAAA,EAAwB,UAAA,EAAwB,OAAA,EAA+D;AACpH,IAAA,OAAO,IAAI,gBAAA,CAAkC,CAAC,UAAA,KAAe;AAC3D,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,IAAI,SAAA,GAAkD,IAAA;AACtD,MAAA,IAAI,YAAA,GAAsD,IAAA;AAa1D,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,IAAI,SAAA,EAAW;AAAE,UAAA,YAAA,CAAa,SAAS,CAAA;AAAG,UAAA,SAAA,GAAY,IAAA;AAAA,QAAM;AAC5D,QAAA,IAAI,YAAA,EAAc;AAAE,UAAA,aAAA,CAAc,YAAY,CAAA;AAAG,UAAA,YAAA,GAAe,IAAA;AAAA,QAAM;AAAA,MACxE,CAAA;AAEA,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,QAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,QAAA,IAAI,YAAA,EAAc;AAAE,UAAA,aAAA,CAAc,YAAY,CAAA;AAAG,UAAA,YAAA,GAAe,IAAA;AAAA,QAAM;AACtE,QAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,UAAA,IAAI,IAAA,EAAM;AACV,UAAA,YAAA,GAAe,YAAY,MAAM;AAC/B,YAAA,IAAI,IAAA,EAAM;AACV,YAAA,UAAA;AAAA,cACE,IAAA,CAAK,SAAA;AAAA,cAAW,sBAAA;AAAA,cAAwB,EAAE,KAAA,EAAM;AAAA,cAAG,mBAAA;AAAA,cAAqB;AAAA,aAC1E,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACf,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,gBAAA,OAAA,EAAQ;AAER,gBAAA,UAAA,CAAW,IAAA,CAAK;AAAA,kBACd,IAAA,EAAM,UAAA;AAAA,kBACN,IAAA,EAAM;AAAA,oBACJ,KAAA;AAAA,oBACA,OAAA,EAAU,OAAO,OAAA,IAAW,YAAA;AAAA,oBAC5B,UAAA,EAAYA,WAAAA;AAAA,oBACZ,QAAQ,MAAA,CAAO;AAAA;AACjB,iBACD,CAAA;AACD,gBAAA,UAAA,CAAW,QAAA,EAAS;AAAA,cACtB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,gBAAA,OAAA,EAAQ;AACR,gBAAA,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,YAAY,CAAC,CAAA;AAAA,cAC1D;AAAA,YACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACnB,GAAG,GAAK,CAAA;AAAA,QACV,GAAG,GAAM,CAAA;AAAA,MACX,CAAA;AAOA,MAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,IAAA;AAAA,QACpDJ,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA;AAAA,QAC7CA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA;AAAA,QACrCA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AAEA,MAAA,MAAM,WAAA,GAAc,SAAA,CACjB,IAAA,CAAK,SAAA,CAAUW,KAAAA,CAAM,SAAA,EAAW,KAAK,CAAC,CAAC,CAAA,CACvC,SAAA,CAAU,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,CAAA;AACtE,QAAA,IAAI,WAAA,iBAA4B,WAAW,CAAA;AAAA,MAC7C,CAAC,CAAA;AAEH,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM;AAC7C,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM;AACrC,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,cAAA,CAAeP,aAAY,UAAA,EAAY,OAAO,EAChD,IAAA,CAAK,CAAC,EAAE,KAAA,EAAM,KAAM;AACnB,QAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM;AAClB,UAAA,WAAA,GAAc,KAAA;AACd,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAMhB,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAEH,MAAA,OAAO,MAAM;AACX,QAAA,OAAA,EAAQ;AACR,QAAA,WAAA,CAAY,WAAA,EAAY;AACxB,QAAA,WAAA,CAAY,WAAA,EAAY;AACxB,QAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,MACtB,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,CACE,UACA,UAAA,EACM;AAEN,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,gBAAgB,CAAA,CAAE,KAAK,EAAE,QAAA,EAAU,YAAY,CAAA;AAAA,EAC9D;AAAA,EAEA,aAAA,CAAc,UAAA,EAAwB,OAAA,EAA4B,aAAA,EAA8B;AAC9F,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,IAAA,CAAK;AAAA,MACvC,UAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAI,aAAA,GAAgB,EAAE,aAAA,KAAkB;AAAC,KACS,CAAA;AAAA,EACtD;AAAA,EAEA,OAAO,KAAA,EAAuD;AAC5D,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,KAAK,MAAS,CAAA;AAAA,EACpD;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,uBAAuB,CAAA,CAAE,KAAK,MAAS,CAAA;AAAA,EACtD;AAAA,EAEA,gBAAgB,UAAA,EAAqC;AACnD,IAAA,IAAA,CAAK,IAAI,GAAA,CAAI,wBAAwB,EAAE,IAAA,CAAK,EAAE,YAAY,CAAA;AAAA,EAC5D;AAAA,EAEA,YAAY,MAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,IAAI,GAAA,CAAI,oBAAoB,EAAE,IAAA,CAAK,EAAE,QAAQ,CAAA;AAAA,EACpD;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,IAAI,GAAA,CAAI,oBAAoB,EAAE,IAAA,CAAK,EAAE,OAAO,CAAA;AAAA,EACnD;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,mBAAmB,CAAA,CAAE,KAAK,MAAS,CAAA;AAAA,EAClD;AAAA,EAEA,MAAc,cAAA,CACZA,WAAAA,EACA,UAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,UAAA,GAA+D;AAAA,MACnE,OAAA,EAAS,gBAAA;AAAA,MACT,OAAA,EAAS,sBAAA;AAAA,MACT,YAAA,EAAc,sBAAA;AAAA,MACd,SAAA,EAAW,uBAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AACA,IAAA,MAAM,OAAA,GAAU,WAAW,UAAU,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,UAAU,CAAA,CAAE,CAAA;AAErE,IAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,QAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,EAAY,MAAA,EAAQ;AAC/B,QAAA,MAAM,IAAI,MAAM,qFAAqF,CAAA;AAAA,MACvG;AAAA,IACF,CAAA,MAAA,IAAW,eAAe,SAAA,EAAW;AACnC,MAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,QAAQ,MAAM,IAAI,MAAM,8EAA8E,CAAA;AAAA,IAClI;AAEA,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,MAAA,CAAO,WAAA,GAAc,OAAA,CAAQ,WAAA;AACtD,IAAA,IAAI,OAAA,CAAQ,4BAAA,KAAiC,MAAA,EAAW,MAAA,CAAO,+BAA+B,OAAA,CAAQ,4BAAA;AACtG,IAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,MAAA,EAAW,MAAA,CAAO,eAAe,OAAA,CAAQ,YAAA;AACtE,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,MAAA,CAAO,UAAU,OAAA,CAAQ,OAAA;AAC5D,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,IAAA;AACtD,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,cAAA,KAAmB,MAAA,EAAW,MAAA,CAAO,iBAAiB,OAAA,CAAQ,cAAA;AAC1E,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAElE,IAAA,OAAO,UAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,YAAA;AAAA,MACA,EAAE,OAAA,EAAS,UAAA,EAAAA,WAAAA,EAAY,MAAA,EAAO;AAAA,MAC9B,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACnQO,IAAM,gBAAN,MAA8C;AAAA,EACnD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAGnB,MAAM,IAAA,CAAKA,WAAAA,EAAwBC,aAAAA,EAA4B,UAAA,EAA4C;AACzG,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,kBAAA,EAAoB;AAAA,MAC5C,aAAA,EAAe,OAAO,UAAA,EAAW;AAAA,MACjC,YAAA,EAAAA,aAAAA;AAAA,MACA,UAAA,EAAAD,WAAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,SAAS,KAAA,EAAwC;AAE/C,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,EAC1C;AACF;AChBO,IAAM,kBAAN,MAAkD;AAAA,EACvD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAGnB,UAAA,CACEA,WAAAA,EACAC,aAAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,OAAO,IAAI,gBAAA,CAA2C,CAAC,UAAA,KAAe;AACpE,MAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,iBAAiB,CAAA,CAAE,IAAA;AAAA,QAChDL,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa;AAAA,OACjD;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,CAAA,CAAE,IAAA;AAAA,QAC5CA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa;AAAA,OACjD;AAEA,MAAA,MAAM,GAAA,GAAMW,KAAAA;AAAA,QACV,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,4BAA4B,CAAA,CAAE,IAAA;AAAA,UACzCX,MAAAA,CAAO,CAAC,CAAA,KAAO,CAAA,CAAgC,iBAAkBK,aAAuB,CAAA;AAAA,UACxFH,GAAAA,CAAI,CAAC,CAAA,KAAM,CAA6B;AAAA,SAC1C;AAAA,QACA,UAAU,IAAA,CAAKA,GAAAA,CAAI,CAAC,CAAA,KAAM,CAA6B,CAAC;AAAA,OAC1D,CACG,KAAKU,SAAAA,CAAUD,KAAAA,CAAM,WAAW,OAAO,CAAC,CAAC,CAAA,CACzC,SAAA,CAAU;AAAA,QACT,IAAA,EAAM,CAAC,CAAA,KAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,QAC9B,KAAA,EAAO,CAAC,CAAA,KAAM,UAAA,CAAW,MAAM,CAAC;AAAA,OACjC,CAAA;AAEH,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM;AAC7C,QAAA,UAAA,CAAW,KAAK,CAA6B,CAAA;AAC7C,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM;AACzC,QAAA,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA;AAAA,MACvC,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,kBAAA,EAAoB;AAAA,QACtC,aAAA;AAAA,QACA,YAAA,EAAAN,aAAAA;AAAA,QACA,UAAA,EAAAD,WAAAA;AAAA,QACA,OAAA,EAAS,EAAE,aAAA,EAAe,OAAA,EAAS,iBAAiB,GAAA;AAAK,OAC1D,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAIlB,QAAA,IAAI,WAAW,MAAA,EAAQ;AACvB,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAA,EAAY;AAChB,QAAA,WAAA,CAAY,WAAA,EAAY;AACxB,QAAA,SAAA,CAAU,WAAA,EAAY;AAAA,MACxB,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,QAAA,CACE,aACA,QAAA,EAC4C;AAC5C,IAAA,MAAM,IAAI,MAAM,gEAA2D,CAAA;AAAA,EAC7E;AACF;ACvEO,IAAM,iBAAN,MAAgD;AAAA,EACrD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAGnB,cAAc,KAAA,EAA0D;AAEtE,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,EACnD;AAAA,EAEA,MAAA,CACEA,WAAAA,EACA,WAAA,EACA,OAAA,EACA,OAAA,EACuC;AACvC,IAAA,OAAO,IAAI,gBAAA,CAAsC,CAAC,UAAA,KAAe;AAC/D,MAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AAExC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,sBAAsB,CAAA,CAAE,IAAA;AAAA,QACnDJ,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa;AAAA,OACjD;AACA,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,IAAA;AAAA,QAClDA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,kBAAkB,aAAa;AAAA,OACjD;AAEA,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM;AACzC,QAAA,UAAA,CAAW,KAAK,CAAwB,CAAA;AACxC,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM;AACzC,QAAA,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,wBAAA,EAA0B;AAAA,QAC5C,aAAA;AAAA,QACA,UAAA,EAAAI,WAAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA,EAAO,SAAS,KAAA,IAAS,EAAA;AAAA,QACzB,kBAAA,EAAoB,SAAS,kBAAA,IAAsB;AAAA,OACpD,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAIlB,QAAA,IAAI,WAAW,MAAA,EAAQ;AACvB,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,CAAU,WAAA,EAAY;AACtB,QAAA,SAAA,CAAU,WAAA,EAAY;AAAA,MACxB,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;ACvCO,IAAM,iBAAN,MAAgD;AAAA,EACrD,WAAA,CACmB,SAAA,EACA,GAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAHgB,SAAA;AAAA,EACA,GAAA;AAAA,EACA,OAAA;AAAA,EAGnB,SAAS,IAAA,EAA6C;AAIpD,IAAA,MAAM,UAAA,GAAc,OAAO,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,IAAA,YAAgB,MAAA,GACtE,IAAA,CAAK,IAAA,CAAK,MAAA,GACT,IAAA,CAAK,IAAA,CAAc,IAAA;AACxB,IAAA,OAAO,IAAI,gBAAA,CAAiB,CAAC,UAAA,KAAe;AAG1C,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,YAAY,CAAA;AAChD,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAA;AAAA,QACX;AAAA,UACE,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,GAAI,KAAK,WAAA,GAAc,EAAE,aAAa,IAAA,CAAK,WAAA,KAAgB,EAAC;AAAA,UAC5D,GAAI,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAAA,UACnD,GAAI,KAAK,kBAAA,GAAqB,EAAE,oBAAoB,IAAA,CAAK,kBAAA,KAAuB,EAAC;AAAA,UACjF,GAAI,KAAK,gBAAA,GAAmB,EAAE,kBAAkB,IAAA,CAAK,gBAAA,KAAqB,EAAC;AAAA,UAC3E,GAAI,KAAK,gBAAA,GAAmB,EAAE,kBAAkB,IAAA,CAAK,gBAAA,KAAqB,EAAC;AAAA,UAC3E,GAAI,KAAK,SAAA,GAAY,EAAE,WAAW,IAAA,CAAK,SAAA,KAAc,EAAC;AAAA,UACtD,GAAI,KAAK,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,GAAI;AAAC,SAChE;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,UAIE,YAAY,CAAC,EAAE,aAAA,EAAe,UAAA,EAAY,SAAQ,KAAM;AACtD,YAAA,IAAI,SAAA,EAAW;AAIf,YAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,CAAA,GAAI,OAAA,GAAU,UAAA;AACtC,YAAA,UAAA,CAAW,KAAK,EAAE,KAAA,EAAO,YAAY,aAAA,EAAe,UAAA,EAAY,OAAO,CAAA;AAAA,UACzE,CAAA;AAAA,UACA,QAAQ,eAAA,CAAgB;AAAA;AAC1B,OACF,CACG,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,KAAA,EAAO,UAAA;AAAA,UACP,UAAA,EAAYK,UAAAA,CAAa,MAAA,CAAO,UAAoB;AAAA,SACrD,CAAA;AACD,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MACtB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAAA,MACtC,CAAC,CAAA;AACH,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AAKZ,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,cAAA,CACEL,WAAAA,EACAC,aAAAA,EACA,OAAA,EACwC;AACxC,IAAA,OAAO,IAAI,gBAAA,CAAuC,CAAC,UAAA,KAAe;AAChE,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,IAAI,SAAA,GAAkD,IAAA;AACtD,MAAA,IAAI,YAAA,GAAsD,IAAA;AAU1D,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,IAAI,SAAA,EAAW;AAAE,UAAA,YAAA,CAAa,SAAS,CAAA;AAAG,UAAA,SAAA,GAAY,IAAA;AAAA,QAAM;AAC5D,QAAA,IAAI,YAAA,EAAc;AAAE,UAAA,aAAA,CAAc,YAAY,CAAA;AAAG,UAAA,YAAA,GAAe,IAAA;AAAA,QAAM;AAAA,MACxE,CAAA;AAEA,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAA,KAAgB;AACtC,QAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,QAAA,IAAI,YAAA,EAAc;AAAE,UAAA,aAAA,CAAc,YAAY,CAAA;AAAG,UAAA,YAAA,GAAe,IAAA;AAAA,QAAM;AACtE,QAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,UAAA,IAAI,IAAA,EAAM;AACV,UAAA,YAAA,GAAe,YAAY,MAAM;AAC/B,YAAA,IAAI,IAAA,EAAM;AACV,YAAA,UAAA;AAAA,cACE,IAAA,CAAK,SAAA;AAAA,cAAW,sBAAA;AAAA,cAAwB,EAAE,OAAO,GAAA,EAAI;AAAA,cAAG,mBAAA;AAAA,cAAqB;AAAA,aAC/E,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACf,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,IAAI,MAAA,CAAO,WAAW,UAAA,EAAY;AAChC,gBAAA,OAAA,EAAQ;AAER,gBAAA,UAAA,CAAW,IAAA,CAAK;AAAA,kBACd,IAAA,EAAM,UAAA;AAAA,kBACN,IAAA,EAAM;AAAA,oBACJ,KAAA,EAAO,GAAA;AAAA,oBACP,OAAA,EAAU,OAAO,OAAA,IAAW,YAAA;AAAA,oBAC5B,UAAA,EAAYD,WAAAA;AAAA,oBACZ,QAAQ,MAAA,CAAO;AAAA;AACjB,iBACD,CAAA;AACD,gBAAA,UAAA,CAAW,QAAA,EAAS;AAAA,cACtB,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,gBAAA,OAAA,EAAQ;AACR,gBAAA,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,mBAAmB,CAAC,CAAA;AAAA,cACjE;AAAA,YACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACnB,GAAG,GAAK,CAAA;AAAA,QACV,GAAG,GAAM,CAAA;AAAA,MACX,CAAA;AAQA,MAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,IAAA;AAAA,QACpDJ,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AACA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA;AAAA,QAC7CA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA;AAAA,QACrCA,MAAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,WAAW;AAAA,OACvC;AAEA,MAAA,MAAM,WAAA,GAAc,SAAA,CACjB,IAAA,CAAKY,SAAAA,CAAUD,KAAAA,CAAM,SAAA,EAAW,KAAK,CAAC,CAAC,CAAA,CACvC,SAAA,CAAU,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,CAAA,CAAE,QAAA,EAAU,CAAA;AACtE,QAAA,IAAI,WAAA,iBAA4B,WAAW,CAAA;AAAA,MAC7C,CAAC,CAAA;AAEH,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,SAAA,CAAU,CAAC,CAAA,KAAM;AAC7C,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,UAAA,CAAW,QAAA,EAAS;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM;AACrC,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MACrC,CAAC,CAAA;AAED,MAAA,UAAA;AAAA,QACE,IAAA,CAAK,SAAA;AAAA,QACL,YAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,YAAA;AAAA,UACT,UAAA,EAAAP,WAAAA;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,WAAA,EAAaC,aAAAA;AAAA,YACb,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,YACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,YACxB,aAAa,OAAA,CAAQ,WAAA;AAAA,YACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,SAAS,OAAA,CAAQ;AAAA;AACnB,SACF;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF,CAAE,IAAA,CAAK,CAAC,EAAE,OAAM,KAAM;AACpB,QAAA,IAAI,KAAA,IAAS,CAAC,IAAA,EAAM;AAClB,UAAA,WAAA,GAAc,KAAA;AACd,UAAA,cAAA,CAAe,KAAK,CAAA;AAAA,QACtB;AAAA,MACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAKlB,QAAA,IAAI,IAAA,EAAM;AACV,QAAA,OAAA,EAAQ;AACR,QAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,OAAA,EAAQ;AACR,QAAA,WAAA,CAAY,WAAA,EAAY;AACxB,QAAA,WAAA,CAAY,WAAA,EAAY;AACxB,QAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,MACtB,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAWD,WAAAA,EAAuE;AACtF,IAAA,OAAO,UAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,6BAAA;AAAA,MACA,EAAE,YAAAA,WAAAA,EAAW;AAAA,MACb,6BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAA,EAA4C;AAC1D,IAAA,MAAM,SAAS,MAAM,UAAA;AAAA,MACnB,IAAA,CAAK,SAAA;AAAA,MACL,gCAAA;AAAA,MACA,EAAE,KAAA,EAAM;AAAA,MACR,6BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAO,cAAA;AAAA,EAChB;AAAA,EAEA,MAAM,gBAAgB,OAAA,EAAsE;AAC1F,IAAA,MAAM,SAAS,MAAM,UAAA;AAAA,MACnB,IAAA,CAAK,SAAA;AAAA,MACL,oBAAA;AAAA,MACA,OAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAE,UAAA,EAAYK,UAAAA,CAAa,MAAA,CAAO,UAAU,CAAA,EAAE;AAAA,EACvD;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,CAAE,KAAK,MAAS,CAAA;AAAA,EAC5C;AACF;;;ACxQO,IAAM,kBAAN,MAAkD;AAAA,EACvD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA,EAGnB,SAAA,CAAUL,aAAwBC,aAAAA,EAAkC;AAClE,IAAA,KAAK,IAAA,CAAK,UAAU,IAAA,CAAK,cAAA,EAAgB,EAAE,YAAA,EAAAA,aAAAA,EAAc,UAAA,EAAAD,WAAAA,EAAY,CAAA;AAAA,EACvE;AAAA,EAEA,MAAMC,aAAAA,EAAyC;AAE7C,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,cAAc,CAAA,CAAE,KAAK,EAAE,YAAA,EAAAA,eAAc,CAAA;AAAA,EACpD;AAAA,EAEA,QAAQA,aAAAA,EAAkC;AACxC,IAAA,IAAA,CAAK,GAAA,CAAI,IAAI,gBAAgB,CAAA,CAAE,KAAK,EAAE,YAAA,EAAAA,eAAc,CAAA;AAAA,EACtD;AACF;;;ACCO,IAAM,iBAAN,MAAgD;AAAA,EACrD,YAA6B,SAAA,EAAuB;AAAvB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAAwB;AAAA,EAAxB,SAAA;AAAA,EAE7B,MAAM,cAAc,IAAA,EAA6B;AAC/C,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,yBAAyB,EAAE,GAAA,EAAK,MAAM,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,eAAe,KAAA,EAAgC;AACnD,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,MAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,uBAAA,EAAyB,EAAE,KAAK,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAAkC;AACnD,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,sBAAA,EAAwB,EAAE,QAAQ,CAAA;AAAA,EAC9D;AACF;;;AC/BO,IAAM,eAAN,MAA4C;AAAA,EACjD,WAAA,CACmB,WACA,GAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,SAAA;AAAA,EACA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,IAAI,OAAA,GAA8C;AAChD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,SAAA,GAAyD;AAC3D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA;AAAA,EAC3C;AAAA;AAAA,EAGA,IAAI,SAAA,GAAkD;AACpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAO,KAAA,EAA0C;AACrD,IAAA,OAAO,UAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,sBAAA;AAAA,MACA,EAAE,KAAA,EAAM;AAAA,MACR,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,KAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,GAAA;AACtC,IAAA,MAAMQ,QAAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACtC,MAAA,IAAI,OAAA,EAAS,UAAA,EAAY,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAClD,MAAA,IAAI,MAAA,CAAO,WAAW,UAAA,IAAc,MAAA,CAAO,WAAW,QAAA,IAAY,MAAA,CAAO,WAAW,WAAA,EAAa;AAC/F,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAYA,QAAAA,EAAS;AACpC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6BA,QAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC1D;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,OAAA,EAAqD;AAGtE,IAAA,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,sBAAA,EAAwB,EAAE,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEA,cAAc,OAAA,EAA4C;AAGxD,IAAA,IAAA,CAAK,IAAI,GAAA,CAAI,sBAAsB,EAAE,IAAA,CAAK,EAAE,SAAS,CAAA;AAAA,EACvD;AACF;ACpEO,IAAM,gBAAN,MAA8C;AAAA,EACnD,YAA6B,OAAA,EAA6B;AAA7B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA8B;AAAA,EAA9B,OAAA;AAAA,EAE7B,MAAM,QAAA,CAAS,QAAA,EAAkB,WAAA,EAA4C;AAC3E,IAAA,OAAO,KAAK,OAAA,CAAQ,oBAAA,CAAqBC,KAAA,CAAU,QAAQ,GAAG,WAAW,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,OAAO,UAAA,EAA2C;AACtD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,gBAAA,CAAiB,UAAU,CAAC,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA8C;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmBC,YAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,EAAA,GAAoB;AACxB,IAAA,OAAO,IAAA,CAAK,QAAQ,cAAA,EAAe;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,EACjC;AAAA,EAEA,MAAM,QAAA,GAAuC;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACvC;AAAA,EAEA,MAAM,WAAWX,WAAAA,EAAoD;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAcA,WAAU,CAAA;AAAA,EAC9C;AACF;;;AClCO,IAAM,iBAAN,MAAgD;AAAA,EACrD,YAA6B,OAAA,EAA6B;AAA7B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA8B;AAAA,EAA9B,OAAA;AAAA,EAE7B,MAAM,KAAA,GAAyB;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAU;AAC5C,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,SAAA,GAA6C;AACjD,IAAA,OAAO,IAAA,CAAK,QAAQ,YAAA,EAAa;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,CAAWY,OAAAA,EAAiB,IAAA,EAA8E;AAC9G,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAWA,SAAQ,IAAI,CAAA;AACzD,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,WAAA,GAA4C;AAChD,IAAA,OAAO,IAAA,CAAK,QAAQ,cAAA,EAAe;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,GAAqE;AACzE,IAAA,OAAO,IAAA,CAAK,QAAQ,WAAA,EAAY;AAAA,EAClC;AAAA,EAEA,MAAM,MAAA,GAAgE;AACpE,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAA,EAAU;AAAA,EAChC;AAAA,EAEA,MAAM,MAAA,GAAmC;AACvC,IAAA,OAAO,IAAA,CAAK,QAAQ,mBAAA,EAAoB;AAAA,EAC1C;AAAA,EAEA,QAAQ,IAAA,EAA6C;AACnD,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,oBAAoB,MAAA,EAAkE;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,MAAM,CAAA;AAAA,EAChD;AAAA,EAEA,oBAAoB,IAAA,EAA6C;AAC/D,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAC5D;AACF;AAQA,SAAS,aACP,MAAA,EACiC;AACjC,EAAA,OAAO,IAAI,gBAAA,CAAgC,CAAC,UAAA,KAAe;AACzD,IAAA,MAAM,GAAA,GAAM,OAAO,SAAA,CAAU;AAAA,MAC3B,IAAA,EAAM,CAAC,CAAA,KAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MAC9B,KAAA,EAAO,CAAC,CAAA,KAAM,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,MAChC,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAS,KACrC,CAAA;AACD,IAAA,OAAO,MAAM,IAAI,WAAA,EAAY;AAAA,EAC/B,CAAC,CAAA;AACH;ACvBO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhB,SAAA;AAAA;AAAA,EAEQ,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOR,GAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBhB,WAAA,CAAY,SAAA,EAAuB,OAAA,EAA4B,OAAA,EAA8B;AAC3F,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,UAAU,SAAA,CAAU,OAAA;AAEzB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,QAAA,EAAS;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAElC,IAAA,IAAA,CAAK,KAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,EAAK,KAAK,OAAO,CAAA;AACxE,IAAA,IAAA,CAAK,OAAS,IAAI,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AACxD,IAAA,IAAA,CAAK,OAAS,IAAI,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AACxD,IAAA,IAAA,CAAK,SAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAS,IAAI,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AACzD,IAAA,IAAA,CAAK,KAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,EAAK,KAAK,OAAO,CAAA;AACvE,IAAA,IAAA,CAAK,SAAS,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AAC1D,IAAA,IAAA,CAAK,MAAS,IAAI,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,KAAK,GAAG,CAAA;AACvD,IAAA,IAAA,CAAK,IAAA,GAAS,OAAA,GAAU,IAAI,aAAA,CAAc,OAAO,CAAA,GAAK,MAAA;AACtD,IAAA,IAAA,CAAK,KAAA,GAAS,OAAA,GAAU,IAAI,cAAA,CAAe,OAAO,CAAA,GAAI,MAAA;AAAA,EACxD;AAAA;AAAA,EAGA,IAAI,MAAA,GAAS;AACX,IAAA,OAAO,KAAK,SAAA,CAAU,MAAA;AAAA,EACxB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AACvB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,SAAS,IAAA,EAGE;AAChB,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,KAAY,WAAW,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,IAAS,IAAA,GACtB,IAAA,GACC,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,KAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAIC,eAAAA,CAAoC,GAAG,CAAA;AAC1D,IAAA,MAAM,YAAY,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,SAAS,CAAA;AAGlD,IAAA,OAAO,IAAI,cAAA,CAAc,SAAA,EAAW,OAAA,EAAS,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,aAAa,WAAW,IAAA,EAIG;AACzB,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,KAAY,WAAW,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAIA,eAAAA,CAAoC,IAAI,CAAA;AAC3D,IAAA,MAAM,YAAY,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,SAAS,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAc,SAAA,EAAW,SAAS,SAAS,CAAA;AAC9D,IAAA,IAAI;AAEF,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAM,SAAS,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ,CAAA;AAClE,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AACF;;;AC3MA,IAAM,cAAA,GAAiB,kBAAA;AAChB,IAAM,WAAA,GAAc,wBAAA;AACpB,IAAM,UAAA,GAAa,+BAAA;AAGnB,IAAM,qBAAA,GAAwB,IAAI,EAAA,GAAK,GAAA;AAQvC,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,OAAO,CAAA,EAAG,cAAc,CAAA,EAAG,IAAI,CAAA,CAAA;AACjC;AAIO,SAAS,gBAAA,CAAiB,SAAyB,IAAA,EAAoC;AAC5F,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,CAAA;AACxC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,MAAA,KAAW,YAAY,OAAO,MAAA,CAAO,YAAY,QAAA,EAAU;AACrF,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA,EAAQ;AAAA,IAC1D;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,OAAA,EAAyB,IAAA,EAAc,OAAA,EAA8B;AACpG,EAAA,OAAA,CAAQ,IAAI,UAAA,CAAW,IAAI,GAAG,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AACvD;AAEO,SAAS,kBAAA,CAAmB,SAAyB,IAAA,EAAoB;AAC9E,EAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA;AACjC;AAIO,SAAS,eAAe,KAAA,EAA4B;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,CAAM,CAAC,GAAG,OAAO,IAAA;AAC5C,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,EAAK,OAAO,IAAA;AACzB,IAAA,OAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,GAAM,GAAI,CAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,OAAO,MAAA,CAAO,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI;AACrC;AAIA,SAAS,gBAAgB,KAAA,EAAwC;AAC/D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU;AAC1F,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAK,CAAA,CAAE,QAAA;AACb,EAAA,IAAI,CAAC,EAAA,IAAM,OAAO,EAAA,KAAO,UAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,IAAA,OAAO,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,IACrB,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,KAClB,EAAA,CAAG,QAAA,KAAa,MAAA,IAAU,EAAA,CAAG,QAAA,KAAa,OAAA,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,IAAA,OAAO,OAAO,GAAG,IAAA,KAAS,QAAA;AAAA,EAC5B;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,mBAAmB,OAAA,EAA0C;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,OAAO,OAAA,CAAQ,OAAO,eAAe,CAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,SAAS,kBAAA,CAAmB,SAAyB,cAAA,EAAuC;AACjG,EAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AACzD;AAIO,SAAS,gBAAgB,IAAA,EAAgC;AAC9D,EAAA,OAAO,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,WAAA,GAAc,MAAA,GAAS,OAAA;AACjE;AAGA,IAAM,WAAA,GAAc,iIAAA;AAEb,SAAS,gBAAgB,IAAA,EAAuB;AACrD,EAAA,OAAO,WAAA,CAAY,KAAK,IAAI,CAAA;AAC9B;AASO,SAAS,aAAa,QAAA,EAAgC;AAC3D,EAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAA,CAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAGA,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,UAAU,CAAA;AAC9B,EAAA,GAAA,CAAI,QAAA,GAAW,SAAS,QAAA,GAAW,GAAA;AACnC,EAAA,GAAA,CAAI,WAAW,QAAA,CAAS,IAAA;AACxB,EAAA,GAAA,CAAI,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAC/B,EAAA,OAAO,CAAA,EAAG,SAAS,QAAQ,CAAA,GAAA,EAAM,IAAI,QAAQ,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,CAAA;AAChE;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,OAAO,UAAA,EAAW;AAC3B;AC5IO,IAAM,mBAAA,GAAN,cAAkCC,YAAAA,CAAa;AAAA,EAE3C,IAAA;AAAA,EAET,WAAA,CAAY,IAAA,EAA+B,OAAA,EAAiB,IAAA,GAAsB,IAAA,EAAM;AACtF,IAAA,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;;;ACuEO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EACjB,EAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAA;AAAA;AAAA,EAGA,KAAA;AAAA,EAEQ,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACT,YAAA,GAAqD,IAAA;AAAA,EACrD,kBAAA,GAA0C,IAAA;AAAA,EAC1C,QAAA,GAAW,KAAA;AAAA,EAEnB,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,OAAA;AACxB,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,QAAA;AACzB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA,CAAO,YAAA,KAAiB,MAAM;AAAA,IAAC,CAAA,CAAA;AACnD,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,KAAY,MAAM;AAAA,IAAC,CAAA,CAAA;AACzC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAID,eAAAA,CAAiC,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,OAAA;AAKrC,IAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,GAAG,EAAE,CAAA;AACxD,IAAA,IAAI,MAAA,IAAU,CAAC,YAAA,CAAa,MAAA,CAAO,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS,KAAM,IAAA,EAAM;AAC7E,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKE,WAAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAC7C;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AAE1C,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,MAAA,CAAO,MAAA;AAEhC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,yBAAyB,YAAY,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,CAAC,KAAK,QAAA,KAAa;AACpE,MAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAAA,IACxC,CAAC,CAAA,IAAK,IAAA;AAEN,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAc,SAAS,MAAA,EAA6C;AAClE,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,GACxC,IAAA,CAAK,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,EAAU,GAAI,IAAA,GAC3C,MAAA,CAAO,MAAA;AACX,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,EAAG;AAC/B,QAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAAA,MAC7C;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,KAAe,OAAO,MAAA,EAAQ;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,WAAAA,CAAY,UAAU,CAAC,CAAA;AACxC,MAAA,IAAA,CAAK,yBAAyB,UAAU,CAAA;AAAA,IAC1C;AAIA,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAEtB,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,KAAiC;AACtD,MAAA,IAAI,KAAK,QAAA,EAAU;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAA,CAAYA,WAAAA,CAAY,KAAK,CAAC,CAAA;AACtD,QAAA,IAAI,KAAK,QAAA,EAAU;AACnB,QAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACtB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,KAAK,QAAA,EAAU;AACnB,QAAA,IAAI,GAAA,YAAe,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK;AACjD,UAAA,MAAM,YAAY,IAAA,CAAK,SAAA,GAAY,MAAM,IAAA,CAAK,WAAU,GAAI,IAAA;AAC5D,UAAA,IAAI,KAAK,QAAA,EAAU;AACnB,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,WAAAA,CAAY,SAAS,CAAC,CAAA;AACvC,YAAA,IAAA,CAAK,yBAAyB,SAAS,CAAA;AACvC,YAAA,MAAM,QAAQ,SAAS,CAAA;AACvB,YAAA;AAAA,UACF;AACA,UAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3C,UAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,UAAA,IAAA,CAAK,aAAa,iDAAiD,CAAA;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,OAAA;AAAA,YACH,IAAI,mBAAA;AAAA,cACF,qBAAA;AAAA,cACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,cAC/C,KAAK,EAAA,CAAG;AAAA;AACV,WACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,UAAU,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAuC;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAU,OAAO,IAAA;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,EAAU;AACvC,IAAA,IAAI,IAAA,CAAK,UAAU,OAAO,IAAA;AAC1B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,GAAA,GAAMA,YAAY,SAAS,CAAA;AACjC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,CAAA;AACpB,MAAA,IAAA,CAAK,yBAAyB,SAAS,CAAA;AACvC,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,IAAA,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC3C,IAAA,IAAA,CAAK,aAAa,iDAAiD,CAAA;AACnE,IAAA,IAAA,CAAK,OAAA;AAAA,MACH,IAAI,mBAAA,CAAoB,2BAAA,EAA6B,sBAAA,EAAwB,IAAA,CAAK,GAAG,EAAE;AAAA,KACzF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,yBAAyB,KAAA,EAAqB;AACpD,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,EAAQ,GAAI,qBAAA;AACxC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,SAAA,GAAY,IAAA,CAAK,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,KAAK,KAAK,OAAA,EAAQ;AAAA,IACxC,GAAG,KAAK,CAAA;AAAA,EACV;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,CAAoB,KAAa,QAAA,EAA+B;AACtE,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAI,GAAA,KAAQ,UAAA,CAAW,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAClC,MAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACrC,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAKA,WAAAA,CAAY,MAAA,CAAO,MAAM,CAAC,CAAA;AAC3C,QAAA,IAAA,CAAK,wBAAA,CAAyB,OAAO,MAAM,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,IAAI,SAAA,GAAyB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACnC,IAAA,OAAO,KAAA,GAAQ,cAAA,CAAe,KAAK,CAAA,GAAI,IAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAA,CACE,SACA,OAAA,EACY;AACZ,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,OAAO,CAAA,CAAE,UAAU,OAAO,CAAA;AAC1D,IAAA,OAAO,MAAM,IAAI,WAAA,EAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,OAAO,OAAA,EAAQ;AAEpB,IAAA,IAAA,CAAK,OAAO,QAAA,EAAS;AACrB,IAAA,IAAA,CAAK,MAAM,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,OAAO,SAAS,IAAA,EASG;AACjB,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,KAAY,WAAWC,OAAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,IAAS,IAAA,GACtB,IAAA,GACC,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAWD,WAAAA,CAAY,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,KAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAIF,eAAAA,CAAoC,GAAG,CAAA;AAC1D,IAAA,MAAM,YAAY,IAAII,aAAAA,CAAc,EAAE,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAIC,oBAAAA,CAAqB,SAAS,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,SAAA,EAAW,SAAS,SAAS,CAAA;AAC9D,IAAA,MAAM,MAAA,GAA+B,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAO;AAC1F,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,OAAA;AACxC,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,IAAA,CAAK,YAAA;AAClD,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,OAAA;AACxC,IAAA,OAAO,IAAI,gBAAe,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,aAAa,WAAW,IAAA,EASI;AAC1B,IAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,KAAY,WAAWF,OAAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAI5E,IAAA,MAAM,MAAA,GAAS,IAAIH,eAAAA,CAAoC,IAAI,CAAA;AAC3D,IAAA,MAAM,YAAY,IAAII,aAAAA,CAAc,EAAE,OAAA,EAAS,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAIC,oBAAAA,CAAqB,SAAS,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,SAAA,EAAW,SAAS,SAAS,CAAA;AAE9D,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAM,SAAS,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ,CAAA;AAAA,IAC9D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,EAAA,EAAI,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,CAAA;AAC7F,IAAA,MAAA,CAAO,IAAA,CAAKH,WAAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA;AAMnC,IAAA,MAAM,iBAAiB,YAAoC;AACzD,MAAA,MAAM,SAAS,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,GAAG,EAAE,CAAA;AACxD,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,MAAA,CAAO,IAAA,CAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC1D,QAAA,OAAO,QAAA,CAAS,YAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,IAAA,CAAK,YAAA;AAClD,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,OAAA;AAExC,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAe,MAAM,CAAA;AACzC,IAAA,MAAM,OAAA,CAAQ,KAAA;AACd,IAAA,OAAO,OAAA;AAAA,EACT;AACF;ACrbO,IAAM,iBAAN,MAAqB;AAAA,EACjB,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EAET,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAIF,eAAAA,CAA+B,IAAI,CAAA;AAChE,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAIA,eAAAA,CAA+B,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAIA,eAAAA,CAA+B,IAAI,CAAA;AAClE,IAAA,IAAA,CAAK,wBAAA,GAA2B,IAAIA,eAAAA,CAA+B,IAAI,CAAA;AAAA,EACzE;AAAA,EAEA,qBAAqB,OAAA,EAA8B;AACjD,IAAA,IAAA,CAAK,sBAAA,CAAuB,IAAA;AAAA,MAC1B,OAAA,IAAW;AAAA,KACb;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EACxC;AAAA,EAEA,uBAAuB,OAAA,EAA8B;AACnD,IAAA,IAAA,CAAK,wBAAA,CAAyB,IAAA;AAAA,MAC5B,OAAA,IAAW;AAAA,KACb;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,yBAAA,GAAkC;AAChC,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,IAAI,CAAA;AAAA,EACvC;AAAA,EAEA,2BAAA,GAAoC;AAClC,IAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAClC,IAAA,IAAA,CAAK,wBAAA,CAAyB,KAAK,IAAI,CAAA;AAAA,EACzC;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,kBAAkB,QAAA,EAAS;AAChC,IAAA,IAAA,CAAK,uBAAuB,QAAA,EAAS;AACrC,IAAA,IAAA,CAAK,oBAAoB,QAAA,EAAS;AAClC,IAAA,IAAA,CAAK,yBAAyB,QAAA,EAAS;AAAA,EACzC;AACF;;;AC7BA,IAAM,kBAAA,GAAqB,eAAA;AAE3B,SAAS,kBAAkB,SAAA,EAA2C;AACpE,EAAA,OAAO,CAAC,GAAG,SAAS,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACnC,IAAA,IAAI,CAAA,CAAE,UAAU,MAAA,IAAa,CAAA,CAAE,UAAU,MAAA,EAAW,OAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AACvE,IAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAAyC;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAC7C,IAAA,IAAI,QAAQ,OAAO,iBAAA,CAAkB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAmB,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAeO,IAAM,iBAAN,MAAqB;AAAA,EACjB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EAEQ,OAAA;AAAA,EACA,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,GAAqB,IAAIM,QAAAA,EAAS;AAAA,EAC3C,kBAAA,GAA0C,IAAA;AAAA,EAC1C,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAmC,IAAA;AAAA,EAE3C,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAE7B,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAChD,IAAA,MAAM,aAAA,GACJ,YAAA,IAAgB,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,EAAA,KAAO,YAAY,CAAA,GACnD,YAAA,GACA,GAAA,CAAI,CAAC,GAAG,EAAA,IAAM,IAAA;AAEpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAIN,eAAAA,CAAiC,GAAG,CAAA;AACpD,IAAA,IAAA,CAAK,WAAA,GAAc,IAAIA,eAAAA,CAA+B,aAAa,CAAA;AACnE,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAIA,eAAAA,CAAuC,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAIA,eAAAA,CAAuC,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAIA,eAAAA,CAAyB,KAAK,CAAA;AAC5D,IAAA,IAAA,CAAK,iBAAiB,IAAIA,eAAAA,CAAgC,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAC,CAAA;AACzF,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,OAAA,EAA6B;AAC/C,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAIA,eAAAA,CAA+B,IAAI,CAAA;AAG7D,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,CAAC,IAAA,KAAS,mBAAmB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAC,CAAA;AACpE,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,CAAC,EAAA,KAAO;AACjC,MAAA,IAAI,EAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,YAAY,EAAE,CAAA;AAAA,WAClC,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAAA,IACrC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,CAAC,IAAA,KAAS;AACtC,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,kBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC3D,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,CAAC,KAAK,QAAA,KAAa;AACpE,MAAA,IAAI,GAAA,KAAQ,kBAAA,IAAsB,CAAC,QAAA,EAAU;AAC7C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,eAAe,IAAA,CAAK,iBAAA,CAAkB,KAAK,KAAA,CAAM,QAAQ,CAAmB,CAAC,CAAA;AAAA,MACpF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA,IAAK,IAAA;AAGN,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAK,IAAA,CAAK,YAAY,aAAa,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,IAAA,CAA+B,SAAY,OAAA,EAA4B;AACrE,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,EAAA,CACE,SACA,OAAA,EACY;AACZ,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA,CAAE,UAAU,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,IAAI,WAAA,EAAY;AAAA,EAC/B;AAAA;AAAA,EAGA,OAAiC,OAAA,EAAqC;AACpE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,EAAE,YAAA,EAAa;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,KAAA,EAA4B;AAC3C,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA,EAIA,KAAA,CAAM,KAAA,EAAyB,MAAA,EAAgB,OAAA,EAAgC;AAC7E,IAAA,MAAM,KAAoB,EAAE,EAAA,EAAI,YAAA,EAAa,EAAG,GAAG,KAAA,EAAM;AACzD,IAAA,gBAAA,CAAiB,KAAK,OAAA,EAAS,EAAA,CAAG,IAAI,EAAE,MAAA,EAAQ,SAAS,CAAA;AACzD,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,GAAG,KAAK,IAAA,CAAK,QAAA,EAAS,EAAG,EAAE,CAAC,CAAA;AAC5C,IAAA,KAAK,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,EAAE,CAAA;AAC3B,IAAA,OAAO,EAAA;AAAA,EACT;AAAA,EAEA,SAAS,EAAA,EAAkB;AACzB,IAAA,kBAAA,CAAmB,IAAA,CAAK,SAAS,EAAE,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,CAAE,OAAO,CAAC,EAAA,KAAO,EAAA,CAAG,EAAA,KAAO,EAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,IAAI,CAAA;AACnB,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS,KAAM,EAAA,EAAI;AACtC,MAAA,KAAK,KAAK,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,CAAS,IAAY,OAAA,EAAuE;AAC1F,IAAA,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MACR,KAAK,IAAA,CAAK,QAAA,EAAS,CAAE,GAAA,CAAI,CAAC,EAAA,KAAQ,EAAA,CAAG,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,GAAG,OAAA,KAAY,EAAG;AAAA,KAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,IAAA,EAA+B;AAChD,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAClD,IAAA,IAAI,CAAC,QAAQ,OAAO,YAAA;AACpB,IAAA,OAAO,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,GAAI,SAAA,GAAY,eAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,YAAY,EAAA,EAAkC;AAClD,IAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS;AACzC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAGjD,IAAA,IAAI,EAAA,KAAO,UAAU,WAAA,EAAa;AAMlC,IAAA,IAAI,MAAA,KAAW,EAAA,EAAI,IAAA,CAAK,WAAA,CAAY,KAAK,EAAE,CAAA;AAC3C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,IAC/B;AAIA,IAAA,OAAO,KAAK,UAAA,EAAY;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,UAAA;AACrB,MAAA,MAAM,OAAA;AACN,MAAA,IAAI,KAAK,QAAA,EAAU;AACnB,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS,KAAM,EAAA,EAAI;AAAA,IAC1C;AAEA,IAAA,MAAM,cAAc,YAAY;AAG9B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAC/C,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACtD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,QAAA,MAAM,UAAU,OAAA,EAAQ;AACxB,QAAA,gBAAA,EAAkB,OAAA,EAAQ;AAAA,MAC5B;AAEA,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAS,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AACvD,MAAA,IAAI,CAAC,EAAA,EAAI;AAKT,MAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AAEnC,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,KAAK,cAAA,CAAe;AAAA,UAC5B,EAAA;AAAA,UACA,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA;AAAA,UACA,SAAS,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG;AAAA,SACvC,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,GAAA,YAAe,mBAAA,GACX,GAAA,GACA,IAAI,mBAAA;AAAA,YACF,0BAAA;AAAA,YACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,YAC/C;AAAA;AACF,SACN;AACA,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,QAAA;AAAA,MACF;AAWA,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,CAAC,GAAA,KAAQ;AACjC,QAAA,IAAI,GAAA,CAAI,SAAS,cAAA,EAAgB;AAC/B,UAAA,OAAA,CAAQ,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAAA,QAC1C,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AACnC,UAAA,OAAA,CAAQ,sBAAA,CAAuB,IAAI,OAAO,CAAA;AAAA,QAC5C;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,CAAQ,KAAA;AAAA,MAChB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,IAAI,mBAAA;AAAA,YACF,0BAAA;AAAA,YACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,YAC/C;AAAA;AACF,SACF;AACA,QAAA,MAAM,QAAQ,OAAA,EAAQ;AACtB,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,QAAA,IAAY,IAAA,CAAK,WAAA,CAAY,QAAA,OAAe,EAAA,EAAI;AACvD,QAAA,MAAM,QAAQ,OAAA,EAAQ;AACtB,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,IAClC,CAAA,GAAG;AAEH,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,IAAI,CAAA;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA;AAAA,IACR,CAAA,SAAE;AAIA,MAAA,IAAI,IAAA,CAAK,eAAe,UAAA,EAAY;AAClC,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,KAAK,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,EAAA,EAAY,MAAA,EAAgB,OAAA,EAAgC;AACvE,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,gBAAA,CAAiB,KAAK,OAAA,EAAS,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAS,CAAA;AAItD,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS,KAAM,EAAA,EAAI;AACtC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA,IAAI,WAAA,EAAa,MAAM,WAAA,CAAY,OAAA,EAAQ;AAC3C,MAAA,WAAA,EAAa,OAAA,EAAQ;AACrB,MAAA,MAAM,IAAA,CAAK,YAAY,EAAE,CAAA;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,EAAA,EAA2B;AACvC,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,kBAAA,CAAmB,IAAA,CAAK,SAAS,EAAE,CAAA;AAGnC,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,GAAG,KAAK,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAExC,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,QAAA,EAAS,KAAM,EAAA,EAAI;AACtC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA,IAAI,WAAA,EAAa,MAAM,WAAA,CAAY,OAAA,EAAQ;AAC3C,MAAA,WAAA,EAAa,OAAA,EAAQ;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAIA,eAAA,CACE,EAAA,EACA,IAAA,EACA,SAAA,EACA,UAAA,EACM;AACN,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AAC9C,IAAA,MAAM,MAAM,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACjD,IAAA,IAAI,OAAO,CAAA,EAAG;AAEZ,MAAA,MAAM,IAAA,GAAO,SAAS,GAAG,CAAA;AACzB,MAAA,MAAM,OAAA,GAAwB;AAAA,QAC5B,GAAG,IAAA;AAAA,QACH,IAAA;AAAA,QACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QAC/C,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC,OACnD;AACA,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,QAAQ,CAAA;AACzB,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI,OAAA;AACZ,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAC/C,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC,KACnD;AACA,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,CAAC,GAAG,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,mBAAmB,EAAA,EAAkB;AACnC,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACpF;AAAA,EAEA,sBAAA,CAAuB,IAAY,IAAA,EAAoB;AACrD,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA;AAAA,MAClB,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS,CAAE,IAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,GAAG,CAAA,EAAG,IAAA,KAAS,CAAE;AAAA,KAC9E;AAAA,EACF;AAAA,EAEA,oBAAA,CAAqB,UAAkB,QAAA,EAAwB;AAC7D,IAAA,MAAM,OAAO,CAAC,GAAG,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA;AAC/C,IAAA,IAAI,QAAA,GAAW,KAAK,QAAA,IAAY,IAAA,CAAK,UAAU,QAAA,GAAW,CAAA,IAAK,QAAA,IAAY,IAAA,CAAK,MAAA,EAAQ;AACtF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,UAAU,CAAC,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,GAAG,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA,EAIA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAEhB,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,QAAA,EAAS;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,IAAI,CAAA;AAC7B,IAAA,IAAI,WAAA,EAAa,MAAM,WAAA,CAAY,OAAA,EAAQ;AAC3C,IAAA,WAAA,EAAa,OAAA,EAAQ;AAErB,IAAA,IAAA,CAAK,KAAK,QAAA,EAAS;AACnB,IAAA,IAAA,CAAK,YAAY,QAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,OAAO,QAAA,EAAS;AACrB,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,EACxB;AACF;ACveO,SAAS,wBAAA,GAA2C;AACzD,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoC;AAElE,EAAA,OAAO,CAAC,IAAA,KAAgD;AACtD,IAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,OAAA,EAAS,SAAQ,GAAI,IAAA;AAE1C,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,MAAM,IAAI,mBAAA;AAAA,QACR,0BAAA;AAAA,QACA,CAAA,mEAAA,EAAsE,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,CAAA,CAAA;AAAA,QACtF,EAAA,CAAG;AAAA,OACL;AAAA,IACF;AACA,IAAA,MAAM,WAAW,EAAA,CAAG,QAAA;AASpB,IAAA,MAAM,iBAAiB,YAAoC;AACzD,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC5C,MAAA,IAAI,UAAU,OAAO,QAAA;AAErB,MAAA,MAAM,WAAW,YAAY;AAC3B,QAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,OAAA,EAAS,EAAA,CAAG,EAAE,CAAA;AAC9C,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,QAAA,MAAM,kBAAA,GAAqB,IAAII,aAAAA,CAAc,EAAE,OAAA,EAASD,QAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA,EAAG,CAAA;AACzF,QAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAAc,kBAAA,EAAoB,IAAIE,oBAAAA,CAAqB,kBAAkB,GAAG,kBAAkB,CAAA;AACxH,QAAA,IAAI;AACF,UAAA,MAAM,WAAW,MAAM,SAAA,CAAU,IAAA,CAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAC7D,UAAA,MAAM,YAAY,QAAA,CAAS,YAAA;AAC3B,UAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,UAAA,gBAAA,CAAiB,OAAA,EAAS,GAAG,EAAA,EAAI,EAAE,QAAQ,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AAC/E,UAAA,OAAO,SAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,SAAE;AACA,UAAA,SAAA,CAAU,OAAA,EAAQ;AAAA,QACpB;AAAA,MACF,CAAA,GAAG;AAEH,MAAA,iBAAA,CAAkB,GAAA,CAAI,EAAA,CAAG,EAAA,EAAI,OAAO,CAAA;AACpC,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,OAAA;AAAA,MACf,CAAA,SAAE;AACA,QAAA,iBAAA,CAAkB,MAAA,CAAO,GAAG,EAAE,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAQA,IAAA,MAAM,eAAA,GAAkB,OAAO,KAAA,KAAiD;AAC9E,MAAA,MAAM,YAAA,GAAe,IAAIL,eAAAA,CAAoC,KAAK,CAAA;AAClE,MAAA,MAAM,kBAAA,GAAqB,IAAII,aAAAA,CAAc;AAAA,QAC3C,OAAA,EAASD,OAAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,QACvC,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,MAAM,SAAA,GAAY,IAAI,aAAA,CAAc,kBAAA,EAAoB,IAAIE,oBAAAA,CAAqB,kBAAkB,GAAG,kBAAkB,CAAA;AACxH,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,IAAA,CAAM,EAAA,EAAG;AACtC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,OAAA,EAAQ;AAClB,QAAA,YAAA,CAAa,QAAA,EAAS;AAAA,MACxB;AAAA,IACF,CAAA;AAOA,IAAA,MAAM,MAAA,GAAS,IAAIL,eAAAA,CAAoC,IAAI,CAAA;AAC3D,IAAA,IAAI,OAAA;AACJ,IAAA,MAAM,SAAA,GAAY,IAAII,aAAAA,CAAc;AAAA,MAClC,OAAA,EAASD,OAAAA,CAAQ,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,MACvC,MAAA;AAAA,MACA,cAAA,EAAgB,MAAM,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,IAAK,IAAI;AAAA,KAC9D,CAAA;AACD,IAAA,MAAM,OAAA,GAAU,IAAIE,oBAAAA,CAAqB,SAAS,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,SAAA,EAAW,SAAS,SAAS,CAAA;AAC9D,IAAA,OAAA,GAAU,IAAI,cAAA,CAAe;AAAA,MAC3B,EAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,eAAA;AAAA,MACV,YAAA,EAAc,CAAC,GAAA,KAAQ,OAAA,CAAQ,qBAAqB,GAAG,CAAA;AAAA,MACvD;AAAA,KACD,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AACF;;;ACtGA,IAAI,QAAA,GAAkC,IAAA;AAS/B,SAAS,WAAW,OAAA,EAA4C;AACrE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,MAC5B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,QAAA;AACT;;;ACDO,IAAM,yBAAN,MAAuD;AAAA,EAC3C,GAAA,uBAAU,GAAA,EAAoB;AAAA,EAE/C,IAAI,GAAA,EAA4B;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAI,GAAA,CAAI,GAAG,IAAI,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,GAAK,IAAA;AAAA,EAClD;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACzB;AAAA,EAEA,OAAO,GAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACrB;AACF;;;AC0CO,SAAS,OAAO,IAAA,EAQL;AAChB,EAAA,MAAM,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAU,WAAU,GAAI,IAAA;AAC9D,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IAC/C,UAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,MAAM,QAAA;AAAS,GACjD;AACF;AC9EO,SAAS,cAAA,GAGd;AACA,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAa;AAC7B,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,IAAA,KACJ,GAAA,CAAI,GAAA,CAAI,OAAO,IAAA,KAAS,UAAA,GAAa,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IAClE,OAAA,EAAS,MAAM,GAAA,CAAI,WAAA;AAAY,GACjC;AACF;ACCO,SAAS,oBAAA,CACd,KAAA,EACA,OAAA,GAAiC,EAAC,EACf;AACnB,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AACzC,EAAA,MAAM,OAAA,GAAU,QAAQ,YAAA,IAAgB,EAAA;AACxC,EAAA,MAAM,MAAA,GAAS,IAAIE,OAAAA,EAAgB;AAEnC,EAAA,MAAM,MAAA,GAA6B,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAqC,MAAA,CAAO,IAAA;AAAA,IAChD,UAAU,OAAO,CAAA;AAAA,IACjB,aAAa,UAAU,CAAA;AAAA,IACvBrB,oBAAAA,EAAqB;AAAA,IACrB,SAAA,CAAU,CAAC,CAAA,KAAkC;AAC3C,MAAA,MAAM,OAAA,GAAU,EAAE,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,GAAG,EAAE,OAAA,EAAS,EAAC,EAAG,WAAA,EAAa,OAAO,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,QACpBD,GAAAA,CAAI,CAAC,OAAA,MAA6B;AAAA,UAChC,OAAA,EAAS,WAAW,EAAC;AAAA,UACrB,aAAa,OAAA,KAAY;AAAA,SAC3B,CAAE,CAAA;AAAA,QACF,UAAU,EAAE,OAAA,EAAS,EAAC,EAAG,WAAA,EAAa,MAAwB;AAAA,OAChE;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACtC,OAAA,EAAS,MAAM,MAAA,CAAO,QAAA;AAAS,GACjC;AACF;ACjEO,SAAS,sBAAsB,MAAA,EAAwC;AAC5E,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAIe,eAAAA,CAAqC,IAAI,CAAA;AAE9D,EAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,SAAA,CAAU,CAAC,EAAE,YAAA,EAAAZ,aAAAA,EAAa,KAAM;AACvE,IAAA,QAAA,CAAS,KAAKA,aAAmC,CAAA;AACjD,IAAA,IAAIA,aAAAA,EAAc;AAChB,MAAA,MAAA,CAAO,GAAA,CAAI,IAAI,gBAAgB,CAAA,CAAE,KAAK,EAAE,YAAA,EAAAA,eAAc,CAAA;AAAA,IACxD;AAAA,EACF,CAAC,CAAC,CAAA;AAEF,EAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,SAAA,CAAU,CAAC,EAAE,YAAA,EAAAA,aAAAA,EAAa,KAAM;AACvE,IAAA,MAAA,CAAO,GAAA,CAAI,IAAI,cAAc,CAAA,CAAE,KAAK,EAAE,YAAA,EAAAA,eAAc,CAAA;AAAA,EACtD,CAAC,CAAC,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,SAAS,YAAA,EAAa;AAAA,IAC5C,KAAA,EAAO,CAACA,aAAAA,KAAiB,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAAA,aAAAA,EAAc,CAAA;AAAA,IAC7E,KAAA,EAAO,CAACA,aAAAA,KAAiB,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAAA,aAAAA,EAAc,CAAA;AAAA,IAC7E,OAAA,EAAS,CAACA,aAAAA,KAAiB,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK,EAAE,YAAA,EAAAA,aAAAA,EAAc,CAAA;AAAA,IACjF,OAAA,GAAU;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AACjC,MAAA,QAAA,CAAS,QAAA,EAAS;AAAA,IACpB;AAAA,GACF;AACF;AAGO,IAAM,cAAA,GAAiB;AAUvB,SAAS,mBAAA,CAAoB,MAAiB,OAAA,EAAgC;AACnF,EAAA,IAAI,YAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,KAAA,GAA8C,IAAA;AAElD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAACA,aAAAA,KAA+B;AACvD,IAAA,IAAI,iBAAiBA,aAAAA,EAAc;AACnC,IAAA,WAAA,EAAY;AACZ,IAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,YAAA,GAAeA,aAAAA;AACf,MAAA,IAAA,CAAKA,aAAY,CAAA;AAAA,IACnB,GAAG,OAAO,CAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,IACX;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,gBAAA,EAAkB,gBAAA,EAAkB,OAAA,EAAS,WAAA,EAAY;AACpE;AClEO,SAAS,qBAAA,CACd,QACAD,WAAAA,EACiB;AACjB,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAIa,eAAAA,CAAwC,IAAI,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,IAAIA,eAAAA,CAAyB,KAAK,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,IAAIA,eAAAA,CAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,aAAA,GAAgB,IAAIA,eAAAA,CAAqC,IAAI,CAAA;AAEnE,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,kBAAkB,CAAA,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU;AAChE,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,IAAA,CAAKV,YAAAA,CAAiB,KAAA,CAAM,YAAY,CAAC,CAAA;AAEvD,IAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,UAAA;AAAA,MAC9BH,WAAAA;AAAA,MACAG,YAAAA,CAAiB,MAAM,YAAY,CAAA;AAAA,MACnC,EAAE,aAAA,EAAe,KAAA,CAAM,OAAA,EAAS,iBAAiB,GAAA;AAAK,KACxD,CAAE,IAAA;AAAA,MACAM,QAAQ,GAAM;AAAA,MACd,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,CAAC,QAAA,KAAa;AAClB,QAAA,IAAI,UAAA,IAAc,QAAA,IAAY,QAAA,CAAS,QAAA,EAAU;AAC/C,UAAA,QAAA,CAAS,IAAA;AAAA,YACN,QAAA,CAAwD,SAAS,OAAA,IAAW;AAAA,WAC/E;AACA,UAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,QACrB;AAAA,MACF,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,QAAA,MAAA,CAAO,IAAA,CAAK,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC/D,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MACrB;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB,CAAC,CAAC,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,SAAS,YAAA,EAAa;AAAA,IAChC,QAAA,EAAU,SAAS,YAAA,EAAa;AAAA,IAChC,MAAA,EAAQ,OAAO,YAAA,EAAa;AAAA,IAC5B,aAAA,EAAe,cAAc,YAAA,EAAa;AAAA,IAC1C,OAAA,GAAU;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AACjC,MAAA,QAAA,CAAS,QAAA,EAAS;AAClB,MAAA,QAAA,CAAS,QAAA,EAAS;AAClB,MAAA,MAAA,CAAO,QAAA,EAAS;AAChB,MAAA,aAAA,CAAc,QAAA,EAAS;AAAA,IACzB;AAAA,GACF;AACF;AC5DO,SAAS,oBAAA,CACd,QACA,WAAA,EACgB;AAChB,EAAA,MAAM,OAAuB,EAAC;AAE9B,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,wBAAwB,CAAA,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU;AACtE,IAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,MAAA;AAAA,MAC7BL,UAAAA,CAAe,MAAM,UAAU,CAAA;AAAA,MAC/BD,YAAAA,CAAiB,MAAM,WAAW,CAAA;AAAA,MAClC,KAAA,CAAM,OAAA;AAAA,MACN,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,kBAAA,EAAoB,MAAM,kBAAA;AAAmB,KACrE,CAAE,IAAA;AAAA,MACAM,QAAQ,GAAM;AAAA,MACd,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,CAAC,MAAA,KAAW,MAAA,CAAO,IAAI,GAAA,CAAI,sBAAsB,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,MACpE,KAAA,EAAO,CAAC,GAAA,KAAQ,MAAA,CAAO,IAAI,GAAA,CAAI,qBAAqB,EAAE,IAAA,CAAK;AAAA,QACzD,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,OACvD;AAAA,KACF,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB,CAAC,CAAC,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,OAAA,GAAU;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,IACnC;AAAA,GACF;AACF;ACXO,SAAS,oBAAA,CACd,MAAA,EACAT,WAAAA,EACA,MAAA,EACgB;AAChB,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,MAAM,aAAA,GAAgB,IAAIa,eAAAA,CAAyB,KAAK,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,IAAIA,eAAAA,CAAoC,IAAI,CAAA;AAC9D,EAAA,IAAI,UAAA,GAAmD,IAAA;AAMvD,EAAA,MAAM,QAAA,GAAW,CAAC,WAAA,EAAqB,OAAA,KAA2C;AAChF,IAAA,MAAM,MAAA,GAAS,OAAO,KAAA,CAAM,cAAA;AAAA,MAC1BT,WAAeJ,WAAoB,CAAA;AAAA,MACnCG,aAAiB,WAAW,CAAA;AAAA,MAC5B,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,YAAY,MAAA;AAAO,KACrD,CAAE,IAAA;AAAA,MACAM,OAAAA,CAAQ,EAAE,IAAA,EAAM,GAAA,EAAS;AAAA,MACzB,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,CAAC,CAAA,KAAM;AAIX,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAI,CAAA;AACrB,UAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,QACzB;AAAA,MACF,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AACxB,QAAA,IAAI,UAAA,eAAyB,UAAU,CAAA;AACvC,QAAA,UAAA,GAAa,WAAW,MAAM;AAAE,UAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAG,UAAA,UAAA,GAAa,IAAA;AAAA,QAAM,GAAG,GAAI,CAAA;AAAA,MAClF,CAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AACnB,QAAA,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,MAC1B;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,cAAc,YAAA,EAAa;AAAA,IAC1C,SAAA,EAAW,UAAU,YAAA,EAAa;AAAA,IAClC,QAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AACjC,MAAA,IAAI,UAAA,eAAyB,UAAU,CAAA;AACvC,MAAA,aAAA,CAAc,QAAA,EAAS;AACvB,MAAA,SAAA,CAAU,QAAA,EAAS;AAAA,IACrB;AAAA,GACF;AACF;AC9DA,SAAS,oBAAoB,SAAA,EAAiD;AAC5E,EAAA,IAAI,SAAA,CAAU,aAAa,OAAO,EAAE,MAAM,aAAA,EAAe,KAAA,EAAO,UAAU,WAAA,EAAY;AACtF,EAAA,IAAI,UAAU,gBAAA,EAAkB;AAC9B,IAAA,MAAM,YAAwB,CAAC,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAO,SAAA,CAAU,gBAAA,EAAkB,GAAI,SAAA,CAAU,cAAc,EAAE,UAAA,EAAY,SAAA,CAAU,UAAA,IAAe,CAAA;AACjK,IAAA,IAAI,SAAA,CAAU,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,GAAI,SAAA,CAAU,MAAA,IAAU,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAO,EAAI,GAAI,SAAA,CAAU,MAAA,IAAU,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAO,EAAI,CAAA;AACvM,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,MAAM,mBAAA,EAAqB,KAAA,EAAO,UAAU,KAAA,EAAO,GAAI,UAAU,MAAA,IAAU,EAAE,QAAQ,SAAA,CAAU,MAAA,IAAW,GAAI,SAAA,CAAU,UAAU,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAO,EAAG;AAC3K;AAEO,SAAS,mBAAA,CACd,QACAT,WAAAA,EACe;AACf,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,MAAM,kBAAA,GAAqB,IAAIa,eAAAA,CAA0C,IAAI,CAAA;AAC7E,EAAA,MAAM,oBAAA,GAAuB,IAAIA,eAAAA,CAAmC,IAAI,CAAA;AACxE,EAAA,MAAM,SAAA,GAAY,IAAIA,eAAAA,CAAoC,IAAI,CAAA;AAC9D,EAAA,IAAI,oBAAA,GAA6D,IAAA;AAEjE,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,IAAI,oBAAA,EAAsB;AAAE,MAAA,YAAA,CAAa,oBAAoB,CAAA;AAAG,MAAA,oBAAA,GAAuB,IAAA;AAAA,IAAM;AAAA,EAC/F,CAAA;AAMA,EAAA,MAAM,yBAAA,GAA4B,CAAC,OAAA,KAA+B;AAChE,IAAA,kBAAA,CAAmB,KAAK,OAAO,CAAA;AAAA,EACjC,CAAA;AAGA,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,gBAAgB,CAAA,CAAE,SAAA,CAAU,yBAAyB,CAAC,CAAA;AAC/E,EAAA,IAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,qBAAqB,CAAA,CAAE,UAAU,CAAC,CAAA,KACzD,0BAA0B,EAAE,QAAA,EAAU,oBAAoB,CAAC,CAAA,EAAG,YAAY,YAAA,EAAc,CAAC,CAAC,CAAA;AAC5F,EAAA,IAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,iBAAiB,CAAA,CAAE,UAAU,CAAC,CAAA,KACrD,0BAA0B,EAAE,QAAA,EAAU,oBAAoB,CAAC,CAAA,EAAG,YAAY,SAAA,EAAW,CAAC,CAAC,CAAA;AACzF,EAAA,IAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,wBAAwB,CAAA,CAAE,UAAU,CAAC,CAAA,KAC5D,0BAA0B,EAAE,QAAA,EAAU,oBAAoB,CAAC,CAAA,EAAG,YAAY,WAAA,EAAa,CAAC,CAAC,CAAA;AAC3F,EAAA,IAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,uBAAuB,CAAA,CAAE,UAAU,CAAC,CAAA,KAC3D,0BAA0B,EAAE,QAAA,EAAU,oBAAoB,CAAC,CAAA,EAAG,YAAY,SAAA,EAAW,CAAC,CAAC,CAAA;AAEzF,EAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,SAAA,CAAU,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAC9F,EAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,gBAAgB,CAAA,CAAE,SAAA,CAAU,MAAM,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAGzF,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,CAAE,SAAA,CAAU,OAAO,KAAA,KAAU;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW;AAAA,QAC1C,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,QAAQ,EAAE,MAAA,EAAQb,WAAAA,EAAY,QAAA,EAAU,MAAM,QAAA,EAAqB;AAAA,QACnE,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AACD,MAAA,MAAA,CAAO,GAAA,CAAI,IAAI,gBAAgB,CAAA,CAAE,KAAK,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,CAAA;AAAA,IAC7E,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,oBAAoB,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IAC/G;AAAA,EACF,CAAC,CAAC,CAAA;AAEF,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,aAAa,CAAA,CAAE,SAAA,CAAU,OAAO,KAAA,KAAU;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,MAAA,CAAOA,WAAAA,EAAY,MAAM,YAAwD,CAAA;AACnG,MAAA,MAAA,CAAO,GAAA,CAAI,IAAI,gBAAgB,CAAA,CAAE,KAAK,EAAE,YAAA,EAAc,KAAA,CAAM,YAAA,EAAc,CAAA;AAAA,IAC5E,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,oBAAoB,CAAA,CAAE,KAAK,EAAE,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IAC/G;AAAA,EACF,CAAC,CAAC,CAAA;AAOF,EAAA,IAAA,CAAK,IAAA,CAAK,OAAO,GAAA,CAAI,GAAA,CAAI,qBAAqB,CAAA,CAAE,SAAA,CAAU,CAAC,KAAA,KAAU;AACnE,IAAA,kBAAA,EAAmB;AACnB,IAAA,oBAAA,CAAqB,IAAA,CAAK,MAAM,UAAU,CAAA;AAC1C,IAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAEnB,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,MAAA,CAAOA,aAAY,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA;AAAA,MAChFS,OAAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,EAAS;AAAA,MACzB,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,CAAC,CAAA,KAAM;AAIX,QAAA,IAAI,EAAE,IAAA,KAAS,UAAA,EAAY,SAAA,CAAU,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,oBAAA,CAAqB,KAAK,IAAI,CAAA;AAC9B,QAAA,kBAAA,EAAmB;AACnB,QAAA,oBAAA,GAAuB,WAAW,MAAM;AACtC,UAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AACnB,UAAA,oBAAA,GAAuB,IAAA;AAAA,QACzB,GAAG,GAAI,CAAA;AAAA,MACT,CAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,kBAAA,EAAmB;AACnB,QAAA,oBAAA,CAAqB,KAAK,IAAI,CAAA;AAC9B,QAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,MACrB;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB,CAAC,CAAC,CAAA;AAEF,EAAA,IAAA,CAAK,KAAK,MAAA,CAAO,GAAA,CAAI,IAAI,uBAAuB,CAAA,CAAE,UAAU,MAAM;AAChE,IAAA,kBAAA,EAAmB;AACnB,IAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,EACrB,CAAC,CAAC,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,mBAAmB,YAAA,EAAa;AAAA,IACpD,oBAAA,EAAsB,qBAAqB,YAAA,EAAa;AAAA,IACxD,SAAA,EAAW,UAAU,YAAA,EAAa;AAAA,IAClC,OAAA,GAAU;AACR,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA;AACjC,MAAA,kBAAA,EAAmB;AACnB,MAAA,kBAAA,CAAmB,QAAA,EAAS;AAC5B,MAAA,oBAAA,CAAqB,QAAA,EAAS;AAC9B,MAAA,SAAA,CAAU,QAAA,EAAS;AAAA,IACrB;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\n * Thenable Observable subclasses.\n *\n * Two thin Observable subclasses that also implement `PromiseLike<T>`. Used as\n * the public return type of namespace methods that emit streams (job\n * lifecycle, generation progress) and cache reads (Browse live queries).\n *\n * The point: scripts can `await` the call directly without `lastValueFrom` /\n * `firstValueFrom` wrappers; reactive consumers keep using `.subscribe(...)`\n * and `.pipe(...)` exactly as before.\n *\n * The asymmetric `.then()` semantics — last-value-on-completion for streams,\n * first-non-undefined-value for caches — is encoded by the subclass name. The\n * docstring on the namespace method tells the consumer which one applies.\n *\n * `.pipe(...)` returns a plain `Observable<T>` (RxJS doesn't propagate\n * subclasses through `pipe`). Once you compose, you've explicitly entered\n * RxJS land; `lastValueFrom` from `rxjs` is the right bridge there.\n */\n\nimport { Observable, firstValueFrom, lastValueFrom } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { ResourceId } from '@semiont/core';\n\n/**\n * Bounded Observable stream — emits zero-or-more progress values, then a\n * final value on completion. Used by job-lifecycle methods like\n * `mark.assist`, `gather.annotation`, `match.search`, `yield.fromAnnotation`.\n *\n * Awaiting resolves to the **last** emitted value (via `lastValueFrom`).\n * Subscribing yields every emission, ending in `complete`.\n */\nexport class StreamObservable<T> extends Observable<T> implements PromiseLike<T> {\n then<R1 = T, R2 = never>(\n onfulfilled?: ((v: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n return lastValueFrom(this).then(onfulfilled, onrejected);\n }\n\n /** Wrap an existing Observable's subscribe behavior in a StreamObservable. */\n static from<T>(source: Observable<T>): StreamObservable<T> {\n return new StreamObservable<T>((subscriber) => source.subscribe(subscriber));\n }\n}\n\n/**\n * Multicast cache observable — emits `undefined` while the underlying value\n * is loading, then the value, then re-emits when bus events invalidate the\n * cache entry. Used by Browse live-query methods (`browse.resource`,\n * `browse.annotations`, etc.).\n *\n * Awaiting (the one-shot path) fetches a **fresh** value via the optional\n * `fetchFresh` action and rejects on failure — a re-read reflects writes\n * (#847). Subscribing yields the SWR sequence: the initial `undefined`, the\n * loaded value, and re-emits on invalidation. (Without a `fetchFresh` action\n * — e.g. a non-cache wrapper — the await falls back to the first\n * non-undefined emission.)\n *\n * The class is parameterized as `CacheObservable<T>` even though the\n * stream's element type is `T | undefined` — `T` is what the consumer\n * gets from `await`, and that's the contract we want to advertise. The\n * `Observable<T | undefined>` shape leaks through `.subscribe` and\n * `.pipe` in the natural way.\n */\nexport class CacheObservable<T> extends Observable<T | undefined> implements PromiseLike<T> {\n /**\n * Optional one-shot fresh-fetch action. When present, `then()` (the await\n * path) resolves to a freshly fetched value and rejects on fetch failure —\n * so a re-read reflects writes (#847). `.subscribe(...)` never uses it: it\n * keeps the stale-while-revalidate cached view over `source`.\n */\n private fetchFresh?: () => Promise<T>;\n\n then<R1 = T, R2 = never>(\n onfulfilled?: ((v: T) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n if (this.fetchFresh) {\n // One-shot read: fetch fresh (rejects on failure), don't serve the memo.\n return this.fetchFresh().then(onfulfilled, onrejected);\n }\n // Non-cache wrapper: resolve to the first non-undefined emission.\n return firstValueFrom(this.pipe(filter((v): v is T => v !== undefined)))\n .then(onfulfilled, onrejected);\n }\n\n /**\n * Wrap an existing Observable's subscribe behavior in a `CacheObservable`.\n *\n * `fetchFresh`, when supplied, backs the await path: `await` resolves to a\n * freshly fetched value (rejecting on failure), so a one-shot read reflects\n * writes without a scoped subscription (#847). `.subscribe(...)` consumers\n * keep the SWR view over `source`.\n *\n * Memoizes on source identity: passing the same `source` returns the same\n * wrapper instance. The Browse cache primitive already returns a stable\n * Observable per key (its B4 contract), so this preserves that contract\n * through the awaitable wrapping. Without the memo, every public-method\n * call would produce a fresh wrapper and break referential-equality\n * guarantees that hook-style reactive consumers depend on.\n *\n * Backed by a `WeakMap`, so wrappers are GC'd when their source is.\n */\n static from<T>(source: Observable<T | undefined>, fetchFresh?: () => Promise<T>): CacheObservable<T> {\n let wrapper = wrapperCache.get(source) as CacheObservable<T> | undefined;\n if (!wrapper) {\n wrapper = new CacheObservable<T>((subscriber) => source.subscribe(subscriber));\n wrapper.fetchFresh = fetchFresh;\n wrapperCache.set(source, wrapper);\n }\n return wrapper;\n }\n}\n\nconst wrapperCache = new WeakMap<Observable<unknown>, CacheObservable<unknown>>();\n\n/**\n * Discriminated phases of an upload's lifecycle.\n *\n * - `started` — emitted immediately on `yield.resource(...)` invocation, before any bytes flow.\n * - `progress` — emitted as bytes flow over the wire. Wired by `HttpContentTransport`'s XHR path when a caller passes `onProgress` (or, transitively, when `yield.resource` is the caller — it always wires the hook so subscribers see byte counts). `bytesUploaded` and `totalBytes` carry the running counts; `totalBytes` may be 0 when the transport can't determine the total (rare, e.g. chunked encoding) — UI consumers should render an indeterminate state in that case.\n * - `finished` — emitted on backend acknowledgement, carries the assigned `resourceId`.\n *\n * Failures surface as `Observable.error(...)` (typically an `APIError` from the transport's `errors$` Subject), not as a `phase: 'failed'` event — `subscribe`'s error callback handles them. Cancellation is honored: unsubscribing before `finished` aborts the in-flight HTTP request on the XHR path.\n */\nexport type UploadProgress =\n | { phase: 'started'; totalBytes: number }\n | { phase: 'progress'; bytesUploaded: number; totalBytes: number }\n | { phase: 'finished'; resourceId: ResourceId };\n\n/**\n * Specialized `StreamObservable` for `yield.resource`. Subscribers see the\n * full `UploadProgress` event sequence (started → optional progress → finished).\n * Awaiting resolves specifically to `{ resourceId }` extracted from the\n * `'finished'` event — preserving the pre-Phase-18 awaited shape so existing\n * `await client.yield.resource(...)` callers don't need to narrow the union.\n */\nexport class UploadObservable extends Observable<UploadProgress> implements PromiseLike<{ resourceId: ResourceId }> {\n then<R1 = { resourceId: ResourceId }, R2 = never>(\n onfulfilled?: ((v: { resourceId: ResourceId }) => R1 | PromiseLike<R1>) | null,\n onrejected?: ((e: unknown) => R2 | PromiseLike<R2>) | null,\n ): PromiseLike<R1 | R2> {\n return lastValueFrom(this).then((v) => {\n if (v.phase !== 'finished') {\n throw new Error(`UploadObservable resolved on a non-finished event: ${v.phase}`);\n }\n const result = { resourceId: v.resourceId };\n return onfulfilled ? onfulfilled(result) : (result as unknown as R1);\n }, onrejected);\n }\n}\n","import { Observable, firstValueFrom, merge, throwError, TimeoutError } from 'rxjs';\nimport { catchError, filter, map, take, timeout } from 'rxjs/operators';\nimport { SemiontError, type EventMap } from '@semiont/core';\n\nexport type BusRequestErrorCode =\n | 'bus.timeout'\n | 'bus.rejected'\n | 'bus.bad-payload'\n | 'bus.unauthorized'\n | 'bus.forbidden'\n | 'bus.not-found';\n\nexport class BusRequestError extends SemiontError {\n declare code: BusRequestErrorCode;\n\n constructor(message: string, code: BusRequestErrorCode, details?: Record<string, unknown>) {\n super(message, code, details);\n this.name = 'BusRequestError';\n }\n}\n\n/**\n * Subset of ITransport that `busRequest` needs: a way to send a command and\n * a way to observe channels. Generic enough that an in-process transport\n * can satisfy it without round-tripping through HTTP.\n */\nexport interface BusRequestPrimitive {\n emit<K extends keyof EventMap>(channel: K, payload: EventMap[K]): Promise<void>;\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]>;\n}\n\nexport async function busRequest<TResult>(\n bus: BusRequestPrimitive,\n emitChannel: string,\n payload: Record<string, unknown>,\n resultChannel: string,\n failureChannel: string,\n timeoutMs = 30_000,\n): Promise<TResult> {\n const correlationId = crypto.randomUUID();\n const fullPayload = { ...payload, correlationId };\n\n const result$ = merge(\n (bus.stream(resultChannel as keyof EventMap) as Observable<Record<string, unknown>>).pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({ ok: true as const, response: e.response as TResult })),\n ),\n (bus.stream(failureChannel as keyof EventMap) as Observable<Record<string, unknown>>).pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({\n ok: false as const,\n error: new BusRequestError((e.message as string) ?? 'Bus request rejected', 'bus.rejected', {\n channel: failureChannel,\n correlationId,\n payload: e,\n }),\n })),\n ),\n ).pipe(\n take(1),\n timeout(timeoutMs),\n catchError((err) => {\n if (err instanceof TimeoutError) {\n return throwError(\n () =>\n new BusRequestError(\n `Bus request timed out after ${timeoutMs}ms on ${resultChannel}`,\n 'bus.timeout',\n { channel: emitChannel, resultChannel, correlationId, timeoutMs },\n ),\n );\n }\n return throwError(() => err);\n }),\n );\n\n // Subscribe before emitting so we don't miss an instantaneous reply\n // (which can happen with an in-process LocalTransport bus).\n const resultPromise = firstValueFrom(result$);\n\n try {\n await bus.emit(emitChannel as keyof EventMap, fullPayload as EventMap[keyof EventMap]);\n } catch (err) {\n // If emit threw, control is about to leave this function without\n // anyone awaiting `resultPromise`. Its subscription stays open\n // until the bus completes (e.g. during `semiont.dispose()`), at\n // which point firstValueFrom throws EmptyError with no consumer —\n // surfacing as an uncaught rejection in skill scripts as a\n // cosmetic stack trace after `Done.`.\n //\n // Attach a no-op handler so the eventual rejection has somewhere\n // to land. We can't actively cancel the firstValueFrom\n // subscription (its Promise type exposes no handle), but\n // suppressing its unhandled-rejection is enough; the bus's\n // natural lifecycle tears the subscription down whenever it ends.\n resultPromise.catch(() => {});\n throw err;\n }\n\n const result = await resultPromise;\n if (!result.ok) {\n throw result.error;\n }\n return result.response;\n}\n","/**\n * RxJS-native read-through cache primitive.\n *\n * Behavioral contract: packages/sdk/docs/CACHE-SEMANTICS.md (B1–B13).\n *\n * Framework-agnostic: no React, no dependency on any namespace. Used by\n * `BrowseNamespace` to back its per-key stores, but equally usable from\n * CLI, MCP, or worker code.\n *\n * Two consumption paths with different freshness semantics:\n * - `observe(key)` (the subscribe path) is a stale-while-revalidate live\n * view: it triggers a fetch on first subscription for a missing key,\n * dedup-joins any concurrent fetch, then emits the stored value and\n * re-emits on invalidation.\n * - `fetch(key)` (the one-shot await path) forces a fresh fetch, so a\n * re-read reflects writes rather than serving the memo.\n *\n * Shape:\n * - `observe(key)`: Observable<V | undefined> — subscribe path (SWR).\n * - `fetch(key)`: force a fresh fetch (bypassing the memo), update the\n * store (so subscribers see it too), and resolve with the value —\n * rejecting if the fetch fails. Concurrent calls for the same key share\n * one in-flight fetch. Backs the one-shot `await` path.\n * - `invalidate(key)`: stale-while-revalidate — keeps the current value\n * visible to observers, clears the in-flight guard, starts a fresh\n * fetch. Recovers an orphaned fetch (SSE torn down, response lost).\n * - `remove(key)`: drops the cache entry entirely (B13a). No refetch.\n * - `set(key, value)`: write-through without a fetch (B13b).\n * - `invalidateAll()`: per-key SWR refetch of every currently-cached entry.\n * - `dispose()`: completes the store so observers unsubscribe.\n *\n * What's deliberately out:\n * - No subscriber ref-counting / GC of unobserved keys (B11). Acceptable\n * given cache lifetime == client lifetime.\n * - No TTL / cacheTime. Entries are evicted only by explicit remove.\n * - No retry / backoff. A failing fetch leaves the cache unchanged for\n * *subscribers* (B6); the `fetch`/await path surfaces the rejection so\n * the caller can retry.\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs';\n\nexport interface Cache<K, V> {\n /** Observable stream of the value at `key` (SWR). Triggers a fetch if not cached. */\n observe(key: K): Observable<V | undefined>;\n\n /**\n * Force a fresh fetch for `key`, update the store (so subscribers see it),\n * and resolve with the fetched value — rejecting if the fetch fails.\n * Concurrent calls for the same key share one in-flight fetch. Backs the\n * one-shot `await` path: a re-read reflects writes rather than serving the\n * memoized value. Live-query *subscribers* (`observe`) keep B6 — a failed\n * fetch leaves their value untouched.\n */\n fetch(key: K): Promise<V>;\n\n /** Synchronous snapshot of the current value, without triggering a fetch. */\n get(key: K): V | undefined;\n\n /** Iterator of currently-cached keys. For invalidateAll and diagnostics. */\n keys(): K[];\n\n /**\n * Mark the entry stale and refetch. Keeps the previous value visible\n * to observers during the refetch (stale-while-revalidate).\n */\n invalidate(key: K): void;\n\n /** Drop the entry from the cache. No refetch. */\n remove(key: K): void;\n\n /** Write-through: set the value directly without a fetch. */\n set(key: K, value: V): void;\n\n /** Per-key SWR refetch of every currently-cached entry. */\n invalidateAll(): void;\n\n /** Release the underlying subject. Observers complete. */\n dispose(): void;\n}\n\nexport function createCache<K, V>(fetchFn: (key: K) => Promise<V>): Cache<K, V> {\n const store$ = new BehaviorSubject<Map<K, V>>(new Map());\n /** In-flight fetch promise per key — dedups concurrent fetches (B3). */\n const inflight = new Map<K, Promise<V>>();\n const obsCache = new Map<K, Observable<V | undefined>>();\n\n /**\n * Run (or join) a fetch for `key`. Resolves with the value and updates the\n * store on success; rejects on failure WITHOUT touching the store (B6 —\n * subscribers keep their prior value / loading state). Concurrent callers\n * share the same promise.\n */\n const runFetch = (key: K): Promise<V> => {\n const existing = inflight.get(key);\n if (existing) return existing;\n\n // Definite-assignment: `p` is assigned synchronously below, before the\n // async `finally` (which references it) can run.\n let p!: Promise<V>;\n p = (async () => {\n try {\n const value = await fetchFn(key);\n // Atomic update: one `.next` with a fresh Map reference so\n // downstream `distinctUntilChanged` sees the transition (B5).\n const next = new Map(store$.value);\n next.set(key, value);\n store$.next(next);\n return value;\n } finally {\n // Only clear if we're still the in-flight entry — an `invalidate`\n // may have replaced us with a newer fetch (B9 orphan recovery).\n if (inflight.get(key) === p) inflight.delete(key);\n }\n })();\n inflight.set(key, p);\n return p;\n };\n\n return {\n observe(key: K): Observable<V | undefined> {\n if (!store$.value.has(key) && !inflight.has(key)) {\n // Subscribe path: fire-and-forget, swallow failures so a subscriber\n // stays at its last value (B6). The awaiter's `fetch` surfaces them.\n void runFetch(key).catch(() => {});\n }\n // B4: return a stable Observable per key.\n let obs = obsCache.get(key);\n if (!obs) {\n obs = store$.pipe(\n map((m) => m.get(key)),\n distinctUntilChanged(),\n );\n obsCache.set(key, obs);\n }\n return obs;\n },\n\n fetch(key: K): Promise<V> {\n return runFetch(key);\n },\n\n get(key: K): V | undefined {\n return store$.value.get(key);\n },\n\n keys(): K[] {\n return [...store$.value.keys()];\n },\n\n invalidate(key: K): void {\n // B7: do NOT erase the value. Clear the guard (B9 orphan recovery)\n // and trigger a fresh fetch. Observers keep seeing the stale value\n // until the new value replaces it.\n inflight.delete(key);\n void runFetch(key).catch(() => {});\n },\n\n remove(key: K): void {\n // B13a: drop the entry. The value is gone; observers see `undefined`.\n const next = new Map(store$.value);\n next.delete(key);\n store$.next(next);\n inflight.delete(key);\n },\n\n set(key: K, value: V): void {\n // B13b: write-through. No fetch. Atomic update.\n const next = new Map(store$.value);\n next.set(key, value);\n store$.next(next);\n },\n\n invalidateAll(): void {\n // Per-key SWR refetch of every currently-cached entry. Each entry\n // keeps its stale value until its refetch resolves.\n for (const key of store$.value.keys()) {\n inflight.delete(key);\n void runFetch(key).catch(() => {});\n }\n },\n\n dispose(): void {\n store$.complete();\n obsCache.clear();\n inflight.clear();\n },\n };\n}\n","import { Observable, map } from 'rxjs';\nimport { CacheObservable } from '../awaitable';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId, searchQuery, decodeWithCharset } from '@semiont/core';\nimport type {\n Annotation,\n EventBus,\n EventMap,\n ResourceDescriptor,\n ResourceId,\n AnnotationId,\n GraphConnection,\n Motivation,\n TagSchema,\n components,\n} from '@semiont/core';\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { createCache, type Cache } from '../cache';\nimport type {\n BrowseNamespace as IBrowseNamespace,\n ReferencedByEntry,\n AnnotationHistoryResponse,\n} from './types';\ntype StoredEventResponse = components['schemas']['StoredEventResponse'];\ntype EnrichedResourceEvent = components['schemas']['EnrichedResourceEvent'];\n\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\ntype AnnotationsListResponse = components['schemas']['GetAnnotationsResponse'];\n\ntype ResourceListFilters = {\n limit?: number;\n archived?: boolean;\n search?: string;\n entityType?: string;\n};\n\n/** Sentinel key for the singleton entity-types cache. */\nconst ENTITY_TYPES_KEY = '_';\n\n/** Sentinel key for the singleton tag-schemas cache. */\nconst TAG_SCHEMAS_KEY = '_';\n\nexport class BrowseNamespace implements IBrowseNamespace {\n // ── Caches, backed by the RxJS-native `Cache<K, V>` primitive ───────────\n //\n // Each cache encapsulates the BehaviorSubject store, in-flight guard,\n // and per-key observable memoization that was previously open-coded\n // here. Behavioral contract: `packages/sdk/docs/CACHE-SEMANTICS.md`.\n //\n // Public surface (`resource()`, `annotations()`, etc.) is unchanged;\n // the caches are an implementation detail of this namespace.\n\n private readonly resourceCache: Cache<ResourceId, ResourceDescriptor>;\n private readonly resourceListCache: Cache<string, ResourceDescriptor[]>;\n private readonly annotationListCache: Cache<ResourceId, AnnotationsListResponse>;\n /**\n * Annotation-detail cache keyed by `annotationId` only — the resourceId\n * is a routing hint for the backend fetch, not an identity component.\n * We track the most recent resourceId per annotationId in a side-map\n * so `mark:delete-ok` (which carries only `annotationId`) can reach\n * the right cache entry. Aligns with the pre-refactor semantics.\n */\n private readonly annotationDetailCache: Cache<AnnotationId, Annotation>;\n private readonly annotationResources = new Map<AnnotationId, ResourceId>();\n private readonly entityTypesCache: Cache<string, string[]>;\n private readonly tagSchemasCache: Cache<string, TagSchema[]>;\n private readonly referencedByCache: Cache<ResourceId, ReferencedByEntry[]>;\n private readonly resourceEventsCache: Cache<ResourceId, StoredEventResponse[]>;\n\n /** Filter-blob memory so `invalidateResourceLists` can replay per-key. */\n private readonly resourceListFilters = new Map<string, ResourceListFilters>();\n\n /**\n * Per-key memo for `annotations()` observables. The cache stores the\n * full `AnnotationsListResponse`; the public shape is just the inner\n * `Annotation[]`. Without this memo, every call to `annotations(rId)`\n * would produce a fresh `.pipe(map(...))` observable, violating B4\n * (per-key observable stability). Consumers that compare observable\n * identity — React hooks depending on the observable reference,\n * `distinctUntilChanged` at a higher level — would misbehave.\n */\n private readonly annotationListObs = new Map<ResourceId, Observable<Annotation[] | undefined>>();\n\n /**\n * Per-source memo for the scope-acquiring wrapper (#847 Phase 4), keyed by\n * the underlying (stable, per-key) cache observable so the wrapped\n * observable is itself stable per key — preserving B4/B11 referential\n * identity through to `CacheObservable.from`'s own memo.\n */\n private readonly scopedSources = new WeakMap<Observable<unknown>, Observable<unknown>>();\n\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n private readonly content: IContentTransport,\n ) {\n this.resourceCache = createCache<ResourceId, ResourceDescriptor>(async (id) => {\n const result = await busRequest<GetResourceResponse>(\n this.transport,\n 'browse:resource-requested',\n { resourceId: id },\n 'browse:resource-result',\n 'browse:resource-failed',\n );\n return result.resource as ResourceDescriptor;\n });\n\n this.resourceListCache = createCache<string, ResourceDescriptor[]>(async (key) => {\n const filters = this.resourceListFilters.get(key) ?? {};\n const search = filters.search ? searchQuery(filters.search) : undefined;\n const result = await busRequest<{ resources: ResourceDescriptor[] }>(\n this.transport,\n 'browse:resources-requested',\n {\n search,\n archived: filters.archived,\n entityType: filters.entityType,\n limit: filters.limit ?? 100,\n offset: 0,\n },\n 'browse:resources-result',\n 'browse:resources-failed',\n );\n return result.resources;\n });\n\n this.annotationListCache = createCache<ResourceId, AnnotationsListResponse>(async (resourceId) => {\n return busRequest<AnnotationsListResponse>(\n this.transport,\n 'browse:annotations-requested',\n { resourceId },\n 'browse:annotations-result',\n 'browse:annotations-failed',\n );\n });\n\n this.annotationDetailCache = createCache<AnnotationId, Annotation>(async (annotationId) => {\n const resourceId = this.annotationResources.get(annotationId);\n if (!resourceId) {\n throw new Error(`Cannot fetch annotation ${annotationId}: no resourceId known`);\n }\n const result = await busRequest<{ annotation: Annotation }>(\n this.transport,\n 'browse:annotation-requested',\n { resourceId, annotationId },\n 'browse:annotation-result',\n 'browse:annotation-failed',\n );\n return result.annotation;\n });\n\n this.entityTypesCache = createCache<string, string[]>(async () => {\n const result = await busRequest<{ entityTypes: string[] }>(\n this.transport,\n 'browse:entity-types-requested',\n {},\n 'browse:entity-types-result',\n 'browse:entity-types-failed',\n );\n return result.entityTypes;\n });\n\n this.tagSchemasCache = createCache<string, TagSchema[]>(async () => {\n const result = await busRequest<{ tagSchemas: TagSchema[] }>(\n this.transport,\n 'browse:tag-schemas-requested',\n {},\n 'browse:tag-schemas-result',\n 'browse:tag-schemas-failed',\n );\n return result.tagSchemas;\n });\n\n this.referencedByCache = createCache<ResourceId, ReferencedByEntry[]>(async (resourceId) => {\n const result = await busRequest<{ referencedBy: ReferencedByEntry[] }>(\n this.transport,\n 'browse:referenced-by-requested',\n { resourceId },\n 'browse:referenced-by-result',\n 'browse:referenced-by-failed',\n );\n return result.referencedBy;\n });\n\n this.resourceEventsCache = createCache<ResourceId, StoredEventResponse[]>(async (resourceId) => {\n const result = await busRequest<{ events: StoredEventResponse[] }>(\n this.transport,\n 'browse:events-requested',\n { resourceId },\n 'browse:events-result',\n 'browse:events-failed',\n );\n return result.events;\n });\n\n this.subscribeToEvents();\n }\n\n /**\n * Wrap a resource-scoped live query's source so that *subscribing* acquires\n * the resource's scope (via the transport's ref-counted\n * `subscribeToResource`) and the last unsubscribe releases it (#847 Phase 4).\n * Freshness follows observation: a `.subscribe()` keeps `rId`'s scoped\n * events flowing — so `mark:*` / entity-tag invalidations reach this cache —\n * with no separate `subscribeToResource` call from the consumer.\n *\n * The one-shot `await` path does NOT go through here (it resolves via the\n * cache's `fetch` — see `CacheObservable.from`'s `fetchFresh`), so a\n * one-shot read acquires no scope.\n *\n * Memoized per source so the wrapped observable is stable per key (B4/B11).\n * Each subscription calls `subscribeToResource(rId)`; the transport\n * ref-counts concurrent subscriptions for the same resource onto a single\n * SSE scope. Single-scope model unchanged — multi-scope is deferred (see\n * `.plans/MULTI-RESOURCE-SCOPE.md`).\n */\n private withScope<T>(rId: ResourceId, source: Observable<T | undefined>): Observable<T | undefined> {\n let scoped = this.scopedSources.get(source) as Observable<T | undefined> | undefined;\n if (!scoped) {\n scoped = new Observable<T | undefined>((subscriber) => {\n const release = this.transport.subscribeToResource(rId);\n const inner = source.subscribe(subscriber);\n return () => {\n inner.unsubscribe();\n release();\n };\n });\n this.scopedSources.set(source, scoped);\n }\n return scoped;\n }\n\n // ── Live queries ────────────────────────────────────────────────────────\n //\n // These return `CacheObservable<T>`: subscribers see `T | undefined`\n // (with `undefined` during initial load), and `await` resolves to the\n // first non-undefined value.\n\n resource(resourceId: ResourceId): CacheObservable<ResourceDescriptor> {\n return CacheObservable.from(this.withScope(resourceId, this.resourceCache.observe(resourceId)), () => this.resourceCache.fetch(resourceId));\n }\n\n resources(filters?: ResourceListFilters): CacheObservable<ResourceDescriptor[]> {\n const key = JSON.stringify(filters ?? {});\n // Remember the filter blob so `invalidateResourceLists` can drive\n // per-key SWR refetches without the caller re-passing filters.\n this.resourceListFilters.set(key, filters ?? {});\n return CacheObservable.from(this.resourceListCache.observe(key), () => this.resourceListCache.fetch(key));\n }\n\n annotations(resourceId: ResourceId): CacheObservable<Annotation[]> {\n let obs = this.annotationListObs.get(resourceId);\n if (!obs) {\n obs = this.annotationListCache.observe(resourceId).pipe(map((r) => r?.annotations as Annotation[] | undefined));\n this.annotationListObs.set(resourceId, obs);\n }\n return CacheObservable.from(this.withScope(resourceId, obs), () => this.annotationListCache.fetch(resourceId).then((r) => r.annotations as Annotation[]));\n }\n\n annotation(resourceId: ResourceId, annotationId: AnnotationId): CacheObservable<Annotation> {\n // Record the routing hint so the cache's fetchFn (which only sees\n // the cache key, `annotationId`) can look up the resourceId it\n // needs for the bus request.\n this.annotationResources.set(annotationId, resourceId);\n return CacheObservable.from(this.withScope(resourceId, this.annotationDetailCache.observe(annotationId)), () => this.annotationDetailCache.fetch(annotationId));\n }\n\n entityTypes(): CacheObservable<string[]> {\n return CacheObservable.from(this.entityTypesCache.observe(ENTITY_TYPES_KEY), () => this.entityTypesCache.fetch(ENTITY_TYPES_KEY));\n }\n\n tagSchemas(): CacheObservable<TagSchema[]> {\n return CacheObservable.from(this.tagSchemasCache.observe(TAG_SCHEMAS_KEY), () => this.tagSchemasCache.fetch(TAG_SCHEMAS_KEY));\n }\n\n referencedBy(resourceId: ResourceId): CacheObservable<ReferencedByEntry[]> {\n return CacheObservable.from(this.withScope(resourceId, this.referencedByCache.observe(resourceId)), () => this.referencedByCache.fetch(resourceId));\n }\n\n events(resourceId: ResourceId): CacheObservable<StoredEventResponse[]> {\n return CacheObservable.from(this.withScope(resourceId, this.resourceEventsCache.observe(resourceId)), () => this.resourceEventsCache.fetch(resourceId));\n }\n\n // ── One-shot reads ──────────────────────────────────────────────────────\n\n async resourceContent(resourceId: ResourceId): Promise<string> {\n const result = await this.content.getBinary(resourceId);\n // Decode with the charset the response advertises — no blind UTF-8.\n return decodeWithCharset(result.data, result.contentType);\n }\n\n /**\n * Fetch the resource's JSON-LD metadata graph (descriptor + annotations +\n * inbound entity references). One-shot, uncached, dereferenced via the\n * transport's HTTP `/jsonld` face (bus-free) — the LD view an external\n * linked-data client gets. See `.plans/SIMPLER-JSON-LD.md` §5.\n */\n async resourceGraph(resourceId: ResourceId): Promise<GetResourceResponse> {\n return this.content.getResourceGraph(resourceId);\n }\n\n async resourceRepresentation(\n resourceId: ResourceId,\n ): Promise<{ data: ArrayBuffer; contentType: string }> {\n return this.content.getBinary(resourceId);\n }\n\n async resourceRepresentationStream(\n resourceId: ResourceId,\n ): Promise<{ stream: ReadableStream<Uint8Array>; contentType: string }> {\n return this.content.getBinaryStream(resourceId);\n }\n\n async resourceEvents(resourceId: ResourceId): Promise<StoredEventResponse[]> {\n const result = await busRequest<{ events: StoredEventResponse[] }>(\n this.transport,\n 'browse:events-requested',\n { resourceId },\n 'browse:events-result',\n 'browse:events-failed',\n );\n return result.events;\n }\n\n async annotationHistory(resourceId: ResourceId, annotationId: AnnotationId): Promise<AnnotationHistoryResponse> {\n return busRequest<AnnotationHistoryResponse>(\n this.transport,\n 'browse:annotation-history-requested',\n { resourceId, annotationId },\n 'browse:annotation-history-result',\n 'browse:annotation-history-failed',\n );\n }\n\n async connections(_resourceId: ResourceId): Promise<GraphConnection[]> {\n throw new Error('Not implemented: connections endpoint does not exist yet');\n }\n\n async backlinks(_resourceId: ResourceId): Promise<Annotation[]> {\n throw new Error('Not implemented: backlinks endpoint does not exist yet');\n }\n\n async resourcesByName(_query: string, _limit?: number): Promise<ResourceDescriptor[]> {\n throw new Error('Not implemented: resourcesByName endpoint does not exist yet');\n }\n\n async files(\n dirPath?: string,\n sort?: 'name' | 'mtime' | 'annotationCount',\n ): Promise<components['schemas']['BrowseFilesResponse']> {\n return busRequest<components['schemas']['BrowseFilesResponse']>(\n this.transport,\n 'browse:directory-requested',\n { path: dirPath ?? '.', sort: sort ?? 'name' },\n 'browse:directory-result',\n 'browse:directory-failed',\n );\n }\n\n // ── UI signals (local bus fan-out) ────────────────────────────────────\n\n click(annotationId: AnnotationId, motivation: Motivation): void {\n this.bus.get('browse:click').next({ annotationId, motivation });\n }\n\n navigateReference(resourceId: ResourceId): void {\n this.bus.get('browse:reference-navigate').next({ resourceId });\n }\n\n // ── Cache-mutation API (used by the bus-event subscribers below and by\n // other namespaces that know about specific updates) ─────────────────\n //\n // - `invalidate*` — SWR refetch (B7). Keeps prior value visible.\n // - `removeAnnotationDetail` — drops the entry (B13a: entity gone).\n // - `updateAnnotationInPlace` — write-through (B13b: new value known).\n\n invalidateAnnotationList(resourceId: ResourceId): void {\n this.annotationListCache.invalidate(resourceId);\n }\n\n removeAnnotationDetail(annotationId: AnnotationId): void {\n this.annotationDetailCache.remove(annotationId);\n this.annotationResources.delete(annotationId);\n }\n\n invalidateResourceDetail(id: ResourceId): void {\n this.resourceCache.invalidate(id);\n }\n\n invalidateResourceLists(): void {\n this.resourceListCache.invalidateAll();\n }\n\n invalidateEntityTypes(): void {\n this.entityTypesCache.invalidate(ENTITY_TYPES_KEY);\n }\n\n invalidateTagSchemas(): void {\n this.tagSchemasCache.invalidate(TAG_SCHEMAS_KEY);\n }\n\n invalidateReferencedBy(resourceId: ResourceId): void {\n this.referencedByCache.invalidate(resourceId);\n }\n\n invalidateResourceEvents(resourceId: ResourceId): void {\n this.resourceEventsCache.invalidate(resourceId);\n }\n\n updateAnnotationInPlace(resourceId: ResourceId, annotation: Annotation): void {\n // Write-through to the per-resource list cache (splicing the\n // updated annotation into the in-memory list response).\n const currentList = this.annotationListCache.get(resourceId);\n if (currentList) {\n const idx = currentList.annotations.findIndex((a) => a.id === annotation.id);\n const nextAnnotations =\n idx >= 0\n ? currentList.annotations.map((a, i) => (i === idx ? annotation : a))\n : [...currentList.annotations, annotation];\n this.annotationListCache.set(resourceId, { ...currentList, annotations: nextAnnotations });\n }\n\n // And to the per-annotation detail cache, so observers of\n // `annotation(id)` see the new value without a refetch.\n const aId = makeAnnotationId(annotation.id);\n this.annotationResources.set(aId, resourceId);\n this.annotationDetailCache.set(aId, annotation);\n }\n\n // ── EventBus subscriptions ──────────────────────────────────────────────\n\n /**\n * Typed shorthand for `eventBus.get(channel).subscribe(handler)`.\n * Preserves per-channel payload typing so handlers read\n * `EventMap[K]` without any casts.\n */\n private on<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): void {\n (this.bus.get(channel) as { subscribe(fn: (p: EventMap[K]) => void): unknown }).subscribe(handler);\n }\n\n /**\n * Handler shared by `mark:entity-tag-added` and `mark:entity-tag-removed`.\n * Both events carry the same effect: the annotation list, the\n * resource descriptor, and the event log for that resource all may\n * now reflect different entity tagging, so invalidate all three.\n */\n private onEntityTagChanged = (stored: { resourceId?: ResourceId }): void => {\n if (!stored.resourceId) return;\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceDetail(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n };\n\n /**\n * Handler shared by `mark:archived` and `mark:unarchived`. Both\n * change a resource's archived flag, which is stored on the resource\n * descriptor and affects the resource-list filter.\n */\n private onArchiveToggled = (stored: { resourceId?: ResourceId }): void => {\n if (!stored.resourceId) return;\n this.invalidateResourceDetail(stored.resourceId);\n this.invalidateResourceLists();\n };\n\n /**\n * Handler shared by `yield:create-ok` and `yield:update-ok`. Both\n * report a resource mutation with the resourceId as a string (not\n * yet branded), so we brand and apply the same effect as\n * `onArchiveToggled`.\n */\n private onYieldResourceMutated = (event: { resourceId: string }): void => {\n const rId = makeResourceId(event.resourceId);\n this.invalidateResourceDetail(rId);\n this.invalidateResourceLists();\n };\n\n private subscribeToEvents(): void {\n // Gap-detection contract:\n //\n // The server stamps persisted events on `/bus/subscribe` with\n // `id: p-<scope>-<seq>`. The client sends the last seen id back as\n // `Last-Event-ID` on reconnect; the server replays persisted events\n // missed during the gap. No blanket invalidation is needed on the\n // `reconnecting → open` state-machine transition — the usual case\n // is a clean resume with zero missed events.\n //\n // The server emits a `bus:resume-gap` event when it can't cover the\n // gap (retention window exceeded, scope mismatch, or unparseable\n // `Last-Event-ID`). Receiving one means the client's caches for the\n // affected scope may be stale — fall back to blanket invalidation\n // for that scope (or all scopes, if the gap carries no scope).\n this.on('bus:resume-gap', (event) => {\n const gapScope = event.scope;\n if (gapScope) {\n const rId = gapScope as ResourceId;\n this.invalidateAnnotationList(rId);\n this.invalidateResourceDetail(rId);\n this.invalidateResourceEvents(rId);\n this.invalidateReferencedBy(rId);\n } else {\n this.invalidateResourceLists();\n for (const rId of this.annotationListCache.keys()) this.invalidateAnnotationList(rId);\n for (const rId of this.resourceCache.keys()) this.invalidateResourceDetail(rId);\n for (const rId of this.resourceEventsCache.keys()) this.invalidateResourceEvents(rId);\n for (const rId of this.referencedByCache.keys()) this.invalidateReferencedBy(rId);\n }\n // Entity-types and tag-schemas are KB-wide lists — always refetch on any gap.\n this.invalidateEntityTypes();\n this.invalidateTagSchemas();\n });\n\n this.on('mark:delete-ok', (event) => {\n this.removeAnnotationDetail(makeAnnotationId(event.annotationId));\n });\n\n this.on('mark:added', (stored) => {\n if (stored.resourceId) {\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n }\n });\n\n this.on('mark:removed', (stored) => {\n if (stored.resourceId) {\n this.invalidateAnnotationList(stored.resourceId);\n this.invalidateResourceEvents(stored.resourceId);\n }\n this.removeAnnotationDetail(makeAnnotationId(stored.payload.annotationId));\n });\n\n this.on('mark:body-updated', (event) => {\n const enriched = event as unknown as EnrichedResourceEvent;\n if (!enriched.resourceId || !enriched.annotation) return;\n this.updateAnnotationInPlace(enriched.resourceId as ResourceId, enriched.annotation as Annotation);\n this.invalidateResourceEvents(enriched.resourceId as ResourceId);\n });\n\n this.on('mark:entity-tag-added', this.onEntityTagChanged);\n this.on('mark:entity-tag-removed', this.onEntityTagChanged);\n\n this.on('replay-window-exceeded', (event) => {\n if (event.resourceId) {\n this.invalidateAnnotationList(event.resourceId as ResourceId);\n }\n });\n\n this.on('yield:create-ok', this.onYieldResourceMutated);\n this.on('yield:update-ok', this.onYieldResourceMutated);\n\n this.on('mark:archived', this.onArchiveToggled);\n this.on('mark:unarchived', this.onArchiveToggled);\n\n this.on('frame:entity-type-added', () => this.invalidateEntityTypes());\n this.on('frame:tag-schema-added', () => this.invalidateTagSchemas());\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport {\n annotationId as toAnnotationId,\n resourceId as toResourceId,\n} from '@semiont/core';\nimport type {\n ResourceId,\n AnnotationId,\n Motivation,\n EventBus,\n components,\n} from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { StreamObservable } from '../awaitable';\nimport type {\n MarkNamespace as IMarkNamespace,\n CreateAnnotationInput,\n MarkAssistOptions,\n MarkAssistEvent,\n} from './types';\n\nexport class MarkNamespace implements IMarkNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n async annotation(input: CreateAnnotationInput): Promise<{ annotationId: AnnotationId }> {\n // The wire schema (`MarkCreateRequest`) carries `resourceId` separately\n // for routing — we derive it from `input.target.source`, which is the\n // same value semantically.\n const resourceId = toResourceId(input.target.source);\n const result = await busRequest<{ annotationId: string }>(\n this.transport,\n 'mark:create-request',\n { resourceId, request: input },\n 'mark:create-ok',\n 'mark:create-failed',\n );\n return { annotationId: toAnnotationId(result.annotationId) };\n }\n\n async delete(resourceId: ResourceId, annotationId: AnnotationId): Promise<void> {\n await this.transport.emit('mark:delete', { annotationId, resourceId });\n }\n\n async archive(resourceId: ResourceId): Promise<void> {\n await this.transport.emit('mark:archive', { resourceId });\n }\n\n async unarchive(resourceId: ResourceId): Promise<void> {\n await this.transport.emit('mark:unarchive', { resourceId });\n }\n\n assist(resourceId: ResourceId, motivation: Motivation, options: MarkAssistOptions): StreamObservable<MarkAssistEvent> {\n return new StreamObservable<MarkAssistEvent>((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n // `job:report-progress`, `job:complete`, and `job:fail` all reach us\n // on the always-on global bridge — the worker dual-emits the\n // resource-broadcast ones (`job:complete`/`job:fail`) globally as well\n // as scoped, so the dispatching caller gets them without a scoped\n // subscription. We deliberately do NOT call\n // `transport.subscribeToResource(resourceId)` here: that mutates the\n // SSE channel set, which can only change by tearing down and\n // re-opening the connection, so it forced a reconnect on every assist\n // and dropped in-flight `browse.*` results in the reconnect gap. See\n // Link 1 in .plans/SEMIONT-BUG-browse-annotations.md.\n\n const cleanup = () => {\n done = true;\n if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; }\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n };\n\n const resetPollTimer = (jobId: string) => {\n if (pollTimer) clearTimeout(pollTimer);\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n pollTimer = setTimeout(() => {\n if (done) return;\n pollInterval = setInterval(() => {\n if (done) return;\n busRequest<{ status: string; result?: unknown; error?: string; jobType?: string }>(\n this.transport, 'job:status-requested', { jobId }, 'job:status-result', 'job:status-failed',\n ).then((status) => {\n if (done) return;\n if (status.status === 'complete') {\n cleanup();\n // Synthesize a `complete` event from polled status.\n subscriber.next({\n kind: 'complete',\n data: {\n jobId,\n jobType: (status.jobType ?? 'annotation') as components['schemas']['JobType'],\n resourceId: resourceId as string,\n result: status.result as components['schemas']['JobResult'] | undefined,\n },\n });\n subscriber.complete();\n } else if (status.status === 'failed') {\n cleanup();\n subscriber.error(new Error(status.error ?? 'Job failed'));\n }\n })\n .catch(() => {});\n }, 5_000);\n }, 10_000);\n };\n\n // Subscribe to the unified job lifecycle filtered by the jobId\n // we're about to be assigned. Safe to subscribe before the job\n // exists: early events for an unknown jobId simply never arrive,\n // and the `activeJobId` guard on the filter keeps each Observable\n // isolated to its own job.\n let activeJobId: string | null = null;\n const progress$ = this.bus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.bus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.bus.get('job:fail').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n\n const progressSub = progress$\n .pipe(takeUntil(merge(complete$, fail$)))\n .subscribe((e) => {\n if (e.progress) subscriber.next({ kind: 'progress', data: e.progress });\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe((e) => {\n cleanup();\n subscriber.next({ kind: 'complete', data: e });\n subscriber.complete();\n });\n\n const failSub = fail$.subscribe((e) => {\n cleanup();\n subscriber.error(new Error(e.error));\n });\n\n this.dispatchAssist(resourceId, motivation, options)\n .then(({ jobId }) => {\n if (jobId && !done) {\n activeJobId = jobId;\n resetPollTimer(jobId);\n }\n })\n .catch((error) => {\n // If the StreamObservable has already completed (e.g. job:complete\n // arrived before dispatchAssist resolved, or the consumer disposed\n // the client mid-flight), don't propagate the error — there is no\n // live subscriber to receive it, and RxJS would host it as an\n // uncaught exception.\n if (done) return;\n cleanup();\n subscriber.error(error);\n });\n\n return () => {\n cleanup();\n progressSub.unsubscribe();\n completeSub.unsubscribe();\n failSub.unsubscribe();\n };\n });\n }\n\n request(\n selector: components['schemas']['MarkRequestedEvent']['selector'],\n motivation: Motivation,\n ): void {\n // Local emit: mark-state-unit subscribes via the local bus.\n this.bus.get('mark:requested').next({ selector, motivation });\n }\n\n requestAssist(motivation: Motivation, options: MarkAssistOptions, correlationId?: string): void {\n this.bus.get('mark:assist-request').next({\n motivation,\n options,\n ...(correlationId ? { correlationId } : {}),\n } as components['schemas']['MarkAssistRequestEvent']);\n }\n\n submit(input: components['schemas']['MarkSubmitEvent']): void {\n this.bus.get('mark:submit').next(input);\n }\n\n cancelPending(): void {\n this.bus.get('mark:cancel-pending').next(undefined);\n }\n\n dismissProgress(): void {\n this.bus.get('mark:progress-dismiss').next(undefined);\n }\n\n changeSelection(motivation: Motivation | null): void {\n this.bus.get('mark:selection-changed').next({ motivation });\n }\n\n changeClick(action: string): void {\n this.bus.get('mark:click-changed').next({ action });\n }\n\n changeShape(shape: string): void {\n this.bus.get('mark:shape-changed').next({ shape });\n }\n\n toggleMode(): void {\n this.bus.get('mark:mode-toggled').next(undefined);\n }\n\n private async dispatchAssist(\n resourceId: ResourceId,\n motivation: Motivation,\n options: MarkAssistOptions,\n ): Promise<{ jobId: string }> {\n const jobTypeMap: Record<string, components['schemas']['JobType']> = {\n tagging: 'tag-annotation',\n linking: 'reference-annotation',\n highlighting: 'highlight-annotation',\n assessing: 'assessment-annotation',\n commenting: 'comment-annotation',\n };\n const jobType = jobTypeMap[motivation];\n if (!jobType) throw new Error(`Unsupported motivation: ${motivation}`);\n\n if (motivation === 'tagging') {\n if (!options.schemaId) {\n throw new Error('mark.assist with motivation \"tagging\" requires options.schemaId');\n }\n if (!options.categories?.length) {\n throw new Error('mark.assist with motivation \"tagging\" requires a non-empty options.categories array');\n }\n } else if (motivation === 'linking') {\n if (!options.entityTypes?.length) throw new Error('mark.assist with motivation \"linking\" requires a non-empty entityTypes array');\n }\n\n const params: Record<string, unknown> = {};\n if (options.entityTypes) params.entityTypes = options.entityTypes;\n if (options.includeDescriptiveReferences !== undefined) params.includeDescriptiveReferences = options.includeDescriptiveReferences;\n if (options.instructions !== undefined) params.instructions = options.instructions;\n if (options.density !== undefined) params.density = options.density;\n if (options.tone !== undefined) params.tone = options.tone;\n if (options.language !== undefined) params.language = options.language;\n if (options.sourceLanguage !== undefined) params.sourceLanguage = options.sourceLanguage;\n if (options.schemaId !== undefined) params.schemaId = options.schemaId;\n if (options.categories !== undefined) params.categories = options.categories;\n\n return busRequest<{ jobId: string }>(\n this.transport,\n 'job:create',\n { jobType, resourceId, params },\n 'job:created',\n 'job:create-failed',\n );\n }\n}\n","import type { ResourceId, AnnotationId, BodyOperation, EventBus, EventMap } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport type { BindNamespace as IBindNamespace } from './types';\n\nexport class BindNamespace implements IBindNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n async body(resourceId: ResourceId, annotationId: AnnotationId, operations: BodyOperation[]): Promise<void> {\n await this.transport.emit('bind:update-body', {\n correlationId: crypto.randomUUID(),\n annotationId,\n resourceId,\n operations,\n });\n }\n\n initiate(input: EventMap['bind:initiate']): void {\n // Local emit: resource-viewer-page-state-unit subscribes via the local bus.\n this.bus.get('bind:initiate').next(input);\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport type { AnnotationId, ResourceId, EventBus } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { GatherNamespace as IGatherNamespace, GatherAnnotationProgress } from './types';\n\nexport class GatherNamespace implements IGatherNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n annotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options?: { contextWindow?: number },\n ): StreamObservable<GatherAnnotationProgress> {\n return new StreamObservable<GatherAnnotationProgress>((subscriber) => {\n const correlationId = crypto.randomUUID();\n\n const complete$ = this.bus.get('gather:complete').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.bus.get('gather:failed').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n\n const sub = merge(\n this.bus.get('gather:annotation-progress').pipe(\n filter((e) => (e as { annotationId?: string }).annotationId === (annotationId as string)),\n map((e) => e as GatherAnnotationProgress),\n ),\n complete$.pipe(map((e) => e as GatherAnnotationProgress)),\n )\n .pipe(takeUntil(merge(complete$, failed$)))\n .subscribe({\n next: (v) => subscriber.next(v),\n error: (e) => subscriber.error(e),\n });\n\n const completeSub = complete$.subscribe((e) => {\n subscriber.next(e as GatherAnnotationProgress);\n subscriber.complete();\n });\n\n const failedSub = failed$.subscribe((e) => {\n subscriber.error(new Error(e.message));\n });\n\n this.transport.emit('gather:requested', {\n correlationId,\n annotationId,\n resourceId,\n options: { contextWindow: options?.contextWindow ?? 2000 },\n }).catch((error) => {\n // Don't propagate if a result or failure event already closed the\n // subscriber, or if the consumer disposed mid-flight. Otherwise\n // RxJS hosts the error as an uncaught exception.\n if (subscriber.closed) return;\n subscriber.error(error);\n });\n\n return () => {\n sub.unsubscribe();\n completeSub.unsubscribe();\n failedSub.unsubscribe();\n };\n });\n }\n\n resource(\n _resourceId: ResourceId,\n _options?: { contextWindow?: number },\n ): StreamObservable<GatherAnnotationProgress> {\n throw new Error('Not implemented: gather.resource() — no backend route yet');\n }\n}\n","import { filter } from 'rxjs/operators';\nimport type { AnnotationId, ResourceId, GatheredContext, EventBus, components } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { MatchNamespace as IMatchNamespace, MatchSearchProgress } from './types';\n\nexport class MatchNamespace implements IMatchNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n requestSearch(input: components['schemas']['MatchSearchRequest']): void {\n // Local emit: match-state-unit subscribes via the local bus.\n this.bus.get('match:search-requested').next(input);\n }\n\n search(\n resourceId: ResourceId,\n referenceId: AnnotationId,\n context: GatheredContext,\n options?: { limit?: number; useSemanticScoring?: boolean },\n ): StreamObservable<MatchSearchProgress> {\n return new StreamObservable<MatchSearchProgress>((subscriber) => {\n const correlationId = crypto.randomUUID();\n\n const result$ = this.bus.get('match:search-results').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.bus.get('match:search-failed').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n\n const resultSub = result$.subscribe((e) => {\n subscriber.next(e as MatchSearchProgress);\n subscriber.complete();\n });\n\n const failedSub = failed$.subscribe((e) => {\n subscriber.error(new Error(e.error));\n });\n\n this.transport.emit('match:search-requested', {\n correlationId,\n resourceId,\n referenceId,\n context,\n limit: options?.limit ?? 10,\n useSemanticScoring: options?.useSemanticScoring ?? true,\n }).catch((error) => {\n // Don't propagate if a result or failure event already closed the\n // subscriber, or if the consumer disposed mid-flight. Otherwise\n // RxJS hosts the error as an uncaught exception.\n if (subscriber.closed) return;\n subscriber.error(error);\n });\n\n return () => {\n resultSub.unsubscribe();\n failedSub.unsubscribe();\n };\n });\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport type {\n ResourceId,\n AnnotationId,\n EventBus,\n components,\n} from '@semiont/core';\nimport { resourceId as toResourceId } from '@semiont/core';\n\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { StreamObservable, UploadObservable } from '../awaitable';\nimport type {\n YieldNamespace as IYieldNamespace,\n CreateResourceInput,\n GenerationOptions,\n CreateFromTokenOptions,\n YieldGenerationEvent,\n} from './types';\n\nimport type { ResourceDescriptor } from '@semiont/core';\ntype GetResourceByTokenResponse = components['schemas']['GetResourceByTokenResponse'];\n\nexport class YieldNamespace implements IYieldNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n private readonly content: IContentTransport,\n ) {}\n\n resource(data: CreateResourceInput): UploadObservable {\n // `Buffer` is a Node global; referencing it bare in the browser throws\n // ReferenceError. Guard with a typeof check so this code runs in both\n // environments (browser uploads File, Node workers upload Buffer).\n const totalBytes = (typeof Buffer !== 'undefined' && data.file instanceof Buffer)\n ? data.file.length\n : (data.file as File).size;\n return new UploadObservable((subscriber) => {\n // `started` fires synchronously so subscribers can render an upload-\n // in-progress indicator before any I/O begins.\n subscriber.next({ phase: 'started', totalBytes });\n let cancelled = false;\n const abortController = new AbortController();\n this.content.putBinary(\n {\n name: data.name,\n file: data.file,\n format: data.format,\n storageUri: data.storageUri,\n ...(data.entityTypes ? { entityTypes: data.entityTypes } : {}),\n ...(data.language ? { language: data.language } : {}),\n ...(data.sourceAnnotationId ? { sourceAnnotationId: data.sourceAnnotationId } : {}),\n ...(data.sourceResourceId ? { sourceResourceId: data.sourceResourceId } : {}),\n ...(data.generationPrompt ? { generationPrompt: data.generationPrompt } : {}),\n ...(data.generator ? { generator: data.generator } : {}),\n ...(data.isDraft !== undefined ? { isDraft: data.isDraft } : {}),\n },\n {\n // Byte-progress hook. Honored by `HttpContentTransport`'s XHR\n // path; ignored by ky-path uploads (no `onProgress` consumer)\n // and by `LocalContentTransport` (no wire to observe).\n onProgress: ({ bytesUploaded, totalBytes: txTotal }) => {\n if (cancelled) return;\n // Prefer the transport's reported total; fall back to the\n // pre-flight size if the transport reports 0 (chunked encoding\n // or indeterminate length).\n const total = txTotal > 0 ? txTotal : totalBytes;\n subscriber.next({ phase: 'progress', bytesUploaded, totalBytes: total });\n },\n signal: abortController.signal,\n },\n )\n .then((result) => {\n if (cancelled) return;\n subscriber.next({\n phase: 'finished',\n resourceId: toResourceId(result.resourceId as string),\n });\n subscriber.complete();\n })\n .catch((err) => {\n if (!cancelled) subscriber.error(err);\n });\n return () => {\n cancelled = true;\n // Abort the in-flight HTTP request when the subscriber unsubscribes.\n // Honored by `HttpContentTransport`'s XHR path (calls `xhr.abort()`);\n // ky-path uploads complete in the background after abort and the\n // `cancelled` flag suppresses the `then`/`catch` callbacks.\n abortController.abort();\n };\n });\n }\n\n fromAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options: GenerationOptions,\n ): StreamObservable<YieldGenerationEvent> {\n return new StreamObservable<YieldGenerationEvent>((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n // `job:report-progress`, `job:complete`, and `job:fail` reach us on the\n // always-on global bridge — the worker dual-emits the resource-broadcast\n // ones globally as well as scoped. We deliberately do NOT call\n // `transport.subscribeToResource(resourceId)`: mutating the SSE channel\n // set forces a reconnect on every generation, which dropped in-flight\n // `browse.*` results in the reconnect gap. Symmetric with `mark.assist`.\n // See Link 1 in .plans/SEMIONT-BUG-browse-annotations.md.\n\n const cleanup = () => {\n done = true;\n if (pollTimer) { clearTimeout(pollTimer); pollTimer = null; }\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n };\n\n const resetPollTimer = (jid: string) => {\n if (pollTimer) clearTimeout(pollTimer);\n if (pollInterval) { clearInterval(pollInterval); pollInterval = null; }\n pollTimer = setTimeout(() => {\n if (done) return;\n pollInterval = setInterval(() => {\n if (done) return;\n busRequest<{ status: string; result?: Record<string, unknown>; error?: string; jobType?: string }>(\n this.transport, 'job:status-requested', { jobId: jid }, 'job:status-result', 'job:status-failed',\n ).then((status) => {\n if (done) return;\n if (status.status === 'complete') {\n cleanup();\n // Synthesize a `complete` event from polled status.\n subscriber.next({\n kind: 'complete',\n data: {\n jobId: jid,\n jobType: (status.jobType ?? 'generation') as components['schemas']['JobType'],\n resourceId: resourceId as string,\n result: status.result as components['schemas']['JobResult'] | undefined,\n },\n });\n subscriber.complete();\n } else if (status.status === 'failed') {\n cleanup();\n subscriber.error(new Error(status.error ?? 'Generation failed'));\n }\n })\n .catch(() => {});\n }, 5_000);\n }, 10_000);\n };\n\n // Subscribe to the unified job lifecycle filtered by this job's\n // jobId (assigned by `job:create` below). Auto-bind (resolving the\n // source reference to the generated resource) is handled in\n // Stower's `yield:create` handler when `generatedFrom.annotationId`\n // is present — not here, because the generated resource id is\n // assigned by Stower, not by the worker.\n let activeJobId: string | null = null;\n const progress$ = this.bus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.bus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.bus.get('job:fail').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n\n const progressSub = progress$\n .pipe(takeUntil(merge(complete$, fail$)))\n .subscribe((e) => {\n if (e.progress) subscriber.next({ kind: 'progress', data: e.progress });\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe((e) => {\n cleanup();\n subscriber.next({ kind: 'complete', data: e });\n subscriber.complete();\n });\n\n const failSub = fail$.subscribe((e) => {\n cleanup();\n subscriber.error(new Error(e.error));\n });\n\n busRequest<{ jobId: string }>(\n this.transport,\n 'job:create',\n {\n jobType: 'generation',\n resourceId,\n params: {\n referenceId: annotationId,\n title: options.title,\n prompt: options.prompt,\n entityTypes: options.entityTypes,\n language: options.language,\n sourceLanguage: options.sourceLanguage,\n temperature: options.temperature,\n maxTokens: options.maxTokens,\n storageUri: options.storageUri,\n context: options.context as unknown as Record<string, unknown>,\n },\n },\n 'job:created',\n 'job:create-failed',\n ).then(({ jobId }) => {\n if (jobId && !done) {\n activeJobId = jobId;\n resetPollTimer(jobId);\n }\n }).catch((error) => {\n // If the StreamObservable has already completed (job:complete arrived\n // before busRequest resolved, or the consumer disposed the client\n // mid-flight), don't propagate — the subscriber is gone and RxJS\n // would host the error as an uncaught exception.\n if (done) return;\n cleanup();\n subscriber.error(error);\n });\n\n return () => {\n cleanup();\n progressSub.unsubscribe();\n completeSub.unsubscribe();\n failSub.unsubscribe();\n };\n });\n }\n\n async cloneToken(resourceId: ResourceId): Promise<{ token: string; expiresAt: string }> {\n return busRequest<{ token: string; expiresAt: string }>(\n this.transport,\n 'yield:clone-token-requested',\n { resourceId },\n 'yield:clone-token-generated',\n 'yield:clone-token-failed',\n );\n }\n\n async fromToken(token: string): Promise<ResourceDescriptor> {\n const result = await busRequest<GetResourceByTokenResponse>(\n this.transport,\n 'yield:clone-resource-requested',\n { token },\n 'yield:clone-resource-result',\n 'yield:clone-resource-failed',\n );\n return result.sourceResource as ResourceDescriptor;\n }\n\n async createFromToken(options: CreateFromTokenOptions): Promise<{ resourceId: ResourceId }> {\n const result = await busRequest<{ resourceId: string }>(\n this.transport,\n 'yield:clone-create',\n options,\n 'yield:clone-created',\n 'yield:clone-create-failed',\n );\n return { resourceId: toResourceId(result.resourceId) };\n }\n\n clone(): void {\n this.bus.get('yield:clone').next(undefined);\n }\n}\n","import type { AnnotationId, EventBus, ResourceId } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport type { BeckonNamespace as IBeckonNamespace } from './types';\n\nexport class BeckonNamespace implements IBeckonNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n attention(resourceId: ResourceId, annotationId: AnnotationId): void {\n void this.transport.emit('beckon:focus', { annotationId, resourceId });\n }\n\n hover(annotationId: AnnotationId | null): void {\n // Local emit: beckon-state-unit subscribes via the local bus.\n this.bus.get('beckon:hover').next({ annotationId });\n }\n\n sparkle(annotationId: AnnotationId): void {\n this.bus.get('beckon:sparkle').next({ annotationId });\n }\n}\n","/**\n * FrameNamespace — the eighth flow's surface.\n *\n * Frame operates on the KB's **schema layer** — the conceptual vocabulary\n * the other seven flows are expressed in. Where yield/mark/match/bind/\n * gather/browse/beckon act on content (resources, annotations, references,\n * attention), Frame acts on what *kinds* of things exist: entity types,\n * eventually tag schemas, relation/predicate types, ontology imports.\n *\n * The MVP owns a single primitive — entity-type vocabulary writes on the\n * `frame:add-entity-type` channel. See `docs/protocol/flows/FRAME.md`\n * for the per-flow contract.\n *\n * Live reads of the entity-type vocabulary stay on Browse\n * (`browse.entityTypes()` is a `CacheObservable<string[]>`). Frame owns\n * writes; Browse owns reads. The asymmetry is intentional — re-implementing\n * Browse's cache primitives on Frame for a single read would duplicate\n * machinery without benefit.\n */\n\nimport type { ITransport, TagSchema } from '@semiont/core';\nimport type { FrameNamespace as IFrameNamespace } from './types';\n\nexport class FrameNamespace implements IFrameNamespace {\n constructor(private readonly transport: ITransport) {}\n\n async addEntityType(type: string): Promise<void> {\n await this.transport.emit('frame:add-entity-type', { tag: type });\n }\n\n async addEntityTypes(types: string[]): Promise<void> {\n for (const tag of types) {\n await this.transport.emit('frame:add-entity-type', { tag });\n }\n }\n\n async addTagSchema(schema: TagSchema): Promise<void> {\n await this.transport.emit('frame:add-tag-schema', { schema });\n }\n}\n","import type { Observable } from 'rxjs';\nimport type { EventBus, EventMap, JobId, components } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport type { JobNamespace as IJobNamespace } from './types';\n\ntype JobStatusResponse = components['schemas']['JobStatusResponse'];\n\nexport class JobNamespace implements IJobNamespace {\n constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n ) {}\n\n /**\n * Live stream of `job:queued` events. Surfaces a typed view onto the\n * underlying bus channel for consumers (CLIs, MCP handlers, widgets)\n * that orchestrate jobs and need to react to lifecycle transitions.\n */\n get queued$(): Observable<EventMap['job:queued']> {\n return this.bus.get('job:queued');\n }\n\n /** Live stream of `job:report-progress` events. */\n get progress$(): Observable<EventMap['job:report-progress']> {\n return this.bus.get('job:report-progress');\n }\n\n /** Live stream of `job:complete` events (global; filter by `jobId`). */\n get complete$(): Observable<EventMap['job:complete']> {\n return this.bus.get('job:complete');\n }\n\n /** Live stream of `job:fail` events (global; filter by `jobId`). */\n get fail$(): Observable<EventMap['job:fail']> {\n return this.bus.get('job:fail');\n }\n\n async status(jobId: JobId): Promise<JobStatusResponse> {\n return busRequest<JobStatusResponse>(\n this.transport,\n 'job:status-requested',\n { jobId },\n 'job:status-result',\n 'job:status-failed',\n );\n }\n\n async pollUntilComplete(\n jobId: JobId,\n options?: { interval?: number; timeout?: number; onProgress?: (status: JobStatusResponse) => void },\n ): Promise<JobStatusResponse> {\n const interval = options?.interval ?? 1000;\n const timeout = options?.timeout ?? 60000;\n const startTime = Date.now();\n\n while (true) {\n const status = await this.status(jobId);\n if (options?.onProgress) options.onProgress(status);\n if (status.status === 'complete' || status.status === 'failed' || status.status === 'cancelled') {\n return status;\n }\n if (Date.now() - startTime > timeout) {\n throw new Error(`Job polling timeout after ${timeout}ms`);\n }\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n }\n\n async cancelByType(jobType: 'annotation' | 'generation'): Promise<void> {\n // The backend only supports cancel-by-type (cancels all pending jobs\n // of that type). A per-job cancel was never wired.\n await this.transport.emit('job:cancel-requested', { jobType });\n }\n\n cancelRequest(jobType: 'annotation' | 'generation'): void {\n // Local emit: the batch-cancel widget fires this; a state unit subscribes and\n // translates into individual cancels.\n this.bus.get('job:cancel-requested').next({ jobType });\n }\n}\n","/**\n * AuthNamespace — authentication. Backend ops only; no bus.\n */\n\nimport type { ResourceId, components } from '@semiont/core';\nimport { email as makeEmail, googleCredential, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { IBackendOperations } from '@semiont/core';\nimport type { AuthNamespace as IAuthNamespace, User } from './types';\n\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenRefreshResponse = components['schemas']['TokenRefreshResponse'];\n\nexport class AuthNamespace implements IAuthNamespace {\n constructor(private readonly backend: IBackendOperations) {}\n\n async password(emailStr: string, passwordStr: string): Promise<AuthResponse> {\n return this.backend.authenticatePassword(makeEmail(emailStr), passwordStr);\n }\n\n async google(credential: string): Promise<AuthResponse> {\n return this.backend.authenticateGoogle(googleCredential(credential));\n }\n\n async refresh(token: string): Promise<TokenRefreshResponse> {\n return this.backend.refreshAccessToken(makeRefreshToken(token));\n }\n\n async logout(): Promise<void> {\n await this.backend.logout();\n }\n\n async me(): Promise<User> {\n return this.backend.getCurrentUser();\n }\n\n async acceptTerms(): Promise<void> {\n await this.backend.acceptTerms();\n }\n\n async mcpToken(): Promise<{ token: string }> {\n return this.backend.generateMcpToken();\n }\n\n async mediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.backend.getMediaToken(resourceId);\n }\n}\n","/**\n * AdminNamespace — administration. Backend ops only; no bus.\n */\n\nimport type { UserDID, ProgressEvent, components, paths } from '@semiont/core';\nimport type { BackendDownload, IBackendOperations } from '@semiont/core';\nimport { StreamObservable } from '../awaitable';\nimport type { AdminNamespace as IAdminNamespace, User, RequestContent, ResponseContent } from './types';\n\ntype AdminUserStatsResponse = components['schemas']['AdminUserStatsResponse'];\ntype OAuthConfigResponse = components['schemas']['OAuthConfigResponse'];\n\nexport class AdminNamespace implements IAdminNamespace {\n constructor(private readonly backend: IBackendOperations) {}\n\n async users(): Promise<User[]> {\n const result = await this.backend.listUsers();\n return result.users;\n }\n\n async userStats(): Promise<AdminUserStatsResponse> {\n return this.backend.getUserStats();\n }\n\n async updateUser(userId: UserDID, data: RequestContent<paths['/api/admin/users/{id}']['patch']>): Promise<User> {\n const result = await this.backend.updateUser(userId, data);\n return result.user;\n }\n\n async oauthConfig(): Promise<OAuthConfigResponse> {\n return this.backend.getOAuthConfig();\n }\n\n async healthCheck(): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.backend.healthCheck();\n }\n\n async status(): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.backend.getStatus();\n }\n\n async backup(): Promise<BackendDownload> {\n return this.backend.backupKnowledgeBase();\n }\n\n restore(file: File): StreamObservable<ProgressEvent> {\n return wrapAsStream(this.backend.restoreKnowledgeBase(file));\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<BackendDownload> {\n return this.backend.exportKnowledgeBase(params);\n }\n\n importKnowledgeBase(file: File): StreamObservable<ProgressEvent> {\n return wrapAsStream(this.backend.importKnowledgeBase(file));\n }\n}\n\n/**\n * Wrap a plain `Observable<ProgressEvent>` from `IBackendOperations` as\n * a `StreamObservable<ProgressEvent>` for the SDK surface — same RxJS\n * semantics, plus the awaitable PromiseLike that resolves to the last\n * emitted value.\n */\nfunction wrapAsStream(\n source: import('rxjs').Observable<ProgressEvent>,\n): StreamObservable<ProgressEvent> {\n return new StreamObservable<ProgressEvent>((subscriber) => {\n const sub = source.subscribe({\n next: (v) => subscriber.next(v),\n error: (e) => subscriber.error(e),\n complete: () => subscriber.complete(),\n });\n return () => sub.unsubscribe();\n });\n}\n","/**\n * SemiontClient — the verb-oriented namespace surface.\n *\n * Thin coordinator over an injected transport pair. Owns a local\n * `EventBus` (`bus`) for UI-signal channels and bridges wire events into\n * it via `transport.bridgeInto(bus)`. Namespaces receive `(transport,\n * bus)` (and `content` for binary-I/O namespaces) and choose internally\n * whether each method goes over the wire or stays local.\n *\n * No public `emit`/`on`/`stream` shortcuts: consumers call typed\n * namespace methods. The single sanctioned channel-by-name escape hatch\n * is `SemiontSession.subscribe(channel, handler)`, which reads from\n * `client.bus`.\n */\n\nimport type { BaseUrl, AccessToken } from '@semiont/core';\nimport { EventBus, accessToken, baseUrl } from '@semiont/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { BrowseNamespace } from './namespaces/browse';\nimport { MarkNamespace } from './namespaces/mark';\nimport { BindNamespace } from './namespaces/bind';\nimport { GatherNamespace } from './namespaces/gather';\nimport { MatchNamespace } from './namespaces/match';\nimport { YieldNamespace } from './namespaces/yield';\nimport { BeckonNamespace } from './namespaces/beckon';\nimport { FrameNamespace } from './namespaces/frame';\nimport { JobNamespace } from './namespaces/job';\nimport { AuthNamespace } from './namespaces/auth';\nimport { AdminNamespace } from './namespaces/admin';\nimport type { IBackendOperations, IContentTransport, ITransport } from '@semiont/core';\n\n// Local imports of the HTTP adapters from @semiont/http-transport — needed\n// here so `SemiontClient.fromHttp(...)` can construct them. The same\n// names are re-exported below for consumer convenience, so\n// `import { SemiontClient, HttpTransport } from '@semiont/sdk'` Just Works\n// without a separate http-transport import.\nimport {\n HttpTransport,\n HttpContentTransport,\n} from '@semiont/http-transport';\n\n// Convenience re-exports of the HTTP adapters. Non-HTTP transports\n// (e.g. LocalTransport from @semiont/make-meaning) are wired directly by\n// callers; the sdk does not pre-bundle them.\nexport {\n APIError,\n type TokenRefresher,\n HttpTransport,\n type HttpTransportConfig,\n HttpContentTransport,\n} from '@semiont/http-transport';\n\nexport class SemiontClient {\n /**\n * The wire-facing transport. Owns bus actor, HTTP, auth, admin, exchange,\n * system. Exposed for advanced consumers (workers, custom job adapters)\n * that need raw `transport.emit(channel, payload, scope)` access. Ordinary\n * consumers go through typed namespace methods.\n */\n readonly transport: ITransport;\n /** Binary I/O transport. */\n private readonly content: IContentTransport;\n /**\n * Per-client local EventBus. Wire events flow in via the transport\n * bridge. Read-only public so `SemiontSession.subscribe(channel, …)`\n * can wire arbitrary-channel subscriptions; everything else uses\n * typed namespace methods.\n */\n readonly bus: EventBus;\n readonly baseUrl: BaseUrl;\n\n // ── Verb-oriented namespace API ──────────────────────────────────────────\n //\n // The first nine namespaces are bus-driven and always present. `frame`\n // is the schema-layer flow's surface (eighth flow); the other eight are\n // content-layer flows plus `job`. `auth` and `admin` are backend-ops\n // namespaces — they're only constructed when the caller passes an\n // `IBackendOperations` instance to the constructor. A `SemiontClient`\n // over a transport-only setup (e.g. `LocalTransport`) has\n // `auth === undefined` / `admin === undefined`.\n public readonly frame: FrameNamespace;\n public readonly browse: BrowseNamespace;\n public readonly mark: MarkNamespace;\n public readonly bind: BindNamespace;\n public readonly gather: GatherNamespace;\n public readonly match: MatchNamespace;\n public readonly yield: YieldNamespace;\n public readonly beckon: BeckonNamespace;\n public readonly job: JobNamespace;\n public readonly auth: AuthNamespace | undefined;\n public readonly admin: AdminNamespace | undefined;\n\n /**\n * The client *owns* its bus. The constructor creates a fresh `EventBus`\n * and hands it to the transport via `transport.bridgeInto(this.bus)`.\n * The reference flows client → transport, never the other way:\n * the transport stores the reference and publishes the events it\n * receives onto that bus. `HttpTransport` does so for every channel\n * delivered on its SSE wire; in-process transports adapt their\n * internal source.\n *\n * Callers do not pass a bus in. If they need to interact with the bus\n * (e.g. for tests or to subscribe to arbitrary channels), they read it\n * back via `client.bus`.\n *\n * `backend` is optional. When provided, the `auth` and `admin`\n * namespaces are constructed against it; when omitted, they're\n * `undefined`. For HTTP setups this is conventionally the same\n * `HttpTransport` instance that's also passed as `transport` (HTTP\n * implements both `ITransport` and `IBackendOperations`).\n */\n constructor(transport: ITransport, content: IContentTransport, backend?: IBackendOperations) {\n this.transport = transport;\n this.content = content;\n this.baseUrl = transport.baseUrl;\n\n this.bus = new EventBus();\n this.transport.bridgeInto(this.bus);\n\n this.frame = new FrameNamespace(this.transport);\n this.browse = new BrowseNamespace(this.transport, this.bus, this.content);\n this.mark = new MarkNamespace(this.transport, this.bus);\n this.bind = new BindNamespace(this.transport, this.bus);\n this.gather = new GatherNamespace(this.transport, this.bus);\n this.match = new MatchNamespace(this.transport, this.bus);\n this.yield = new YieldNamespace(this.transport, this.bus, this.content);\n this.beckon = new BeckonNamespace(this.transport, this.bus);\n this.job = new JobNamespace(this.transport, this.bus);\n this.auth = backend ? new AuthNamespace(backend) : undefined;\n this.admin = backend ? new AdminNamespace(backend) : undefined;\n }\n\n /** Transport-level connection state. HTTP reflects SSE health; local is always 'connected'. */\n get state$() {\n return this.transport.state$;\n }\n\n dispose(): void {\n this.transport.dispose();\n this.content.dispose();\n }\n\n /**\n * Convenience factory for the default HTTP setup. Constructs a\n * `BehaviorSubject<AccessToken | null>` internally, plus an\n * `HttpTransport` and `HttpContentTransport`, and returns the wired\n * `SemiontClient`.\n *\n * Use this for one-shot scripts, CLI commands, or any consumer that\n * doesn't need to drive the token from outside (no manual refresh,\n * no cross-tab sync). For long-running scripts that need refresh,\n * use `SemiontSession.fromHttp(...)` (with a token already on hand)\n * or `SemiontSession.signInHttp(...)` (credentials-first) instead —\n * either owns the same transport/client wiring plus the\n * proactive-refresh + storage machinery.\n *\n * Strings are accepted for `baseUrl` and `token`; they are branded\n * via `baseUrl()` / `accessToken()` from `@semiont/core` automatically.\n * Pass the already-branded values if you have them.\n *\n * Omit `token` for unauthenticated usage (public endpoints only).\n */\n static fromHttp(opts: {\n baseUrl: BaseUrl | string;\n token?: AccessToken | string | null;\n }): SemiontClient {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const tok = opts.token == null\n ? null\n : (typeof opts.token === 'string' ? accessToken(opts.token) : opts.token);\n const token$ = new BehaviorSubject<AccessToken | null>(tok);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n // HttpTransport implements both ITransport and IBackendOperations;\n // pass it twice so `client.auth` / `client.admin` are wired.\n return new SemiontClient(transport, content, transport);\n }\n\n /**\n * Async factory for the credentials-first script case. Builds a\n * transient HTTP transport, calls `auth.password(email, password)`\n * to acquire an access token, and returns the wired client with\n * the token populated.\n *\n * This is the right entry point for skills, CLI scripts, and any\n * consumer that starts with email + password rather than a JWT\n * already on hand. For consumers that already hold a token (CLI\n * cached-token path, env-var token, embedded auth flow), use\n * `fromHttp({ baseUrl, token })` instead.\n *\n * For long-running scripts that need refresh, use\n * `SemiontSession.signInHttp(...)` — same credentials shape, plus\n * the session machinery for proactive refresh and persistence.\n *\n * Named `signInHttp` because email+password authentication is\n * inherently an HTTP-shaped operation in the current backend; an\n * in-process `LocalTransport` doesn't have a credentials login\n * path. Non-HTTP transports construct the client directly from\n * their package's transport instance.\n *\n * Throws if authentication fails. The transient client is disposed\n * before the throw, so no resources leak on failure.\n */\n static async signInHttp(opts: {\n baseUrl: BaseUrl | string;\n email: string;\n password: string;\n }): Promise<SemiontClient> {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n try {\n // HTTP-only factory: backend is guaranteed present.\n const auth = await client.auth!.password(opts.email, opts.password);\n token$.next(accessToken(auth.token));\n return client;\n } catch (err) {\n client.dispose();\n throw err;\n }\n }\n}\n","/**\n * Pure helpers and storage-adapter-driven loaders for the Semiont\n * session layer.\n *\n * Contains:\n * - Storage key shape (constants, `sessionKey(kbId)`)\n * - JWT expiry parsing and \"is expired\" check\n * - URL/protocol helpers for KB instances\n * - Loaders/savers that take a `SessionStorage` and operate over it\n * (no direct `localStorage` access)\n *\n * No React imports, no module-scoped state, no side effects beyond\n * whatever the passed-in `SessionStorage` does.\n */\n\nimport type { HttpEndpoint, KnowledgeBase } from './knowledge-base';\nimport type { SessionStorage } from './session-storage';\n\n// ---------- Storage keys ----------\n\nconst SESSION_PREFIX = 'semiont.session.';\nexport const STORAGE_KEY = 'semiont.knowledgeBases';\nexport const ACTIVE_KEY = 'semiont.activeKnowledgeBaseId';\n\n/** Refresh the access token this many milliseconds before it expires. */\nexport const REFRESH_BEFORE_EXP_MS = 5 * 60 * 1000;\n\n/** The shape persisted per KB. */\nexport interface StoredSession {\n access: string;\n refresh: string;\n}\n\nexport function sessionKey(kbId: string): string {\n return `${SESSION_PREFIX}${kbId}`;\n}\n\n// ---------- Per-KB session storage ----------\n\nexport function getStoredSession(storage: SessionStorage, kbId: string): StoredSession | null {\n const raw = storage.get(sessionKey(kbId));\n if (!raw) return null;\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed.access === 'string' && typeof parsed.refresh === 'string') {\n return { access: parsed.access, refresh: parsed.refresh };\n }\n } catch {\n // malformed entry — treat as no session\n }\n return null;\n}\n\nexport function setStoredSession(storage: SessionStorage, kbId: string, session: StoredSession): void {\n storage.set(sessionKey(kbId), JSON.stringify(session));\n}\n\nexport function clearStoredSession(storage: SessionStorage, kbId: string): void {\n storage.delete(sessionKey(kbId));\n}\n\n// ---------- JWT helpers ----------\n\nexport function parseJwtExpiry(token: string): Date | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3 || !parts[1]) return null;\n const payload = JSON.parse(atob(parts[1])) as { exp?: number };\n if (!payload.exp) return null;\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\nexport function isJwtExpired(token: string): boolean {\n const expiry = parseJwtExpiry(token);\n if (!expiry) return true;\n return expiry.getTime() < Date.now();\n}\n\n// ---------- KB list storage ----------\n\nfunction isKnowledgeBase(entry: unknown): entry is KnowledgeBase {\n if (!entry || typeof entry !== 'object') return false;\n const e = entry as Record<string, unknown>;\n if (typeof e.id !== 'string' || typeof e.label !== 'string' || typeof e.email !== 'string') {\n return false;\n }\n const ep = e.endpoint as Record<string, unknown> | undefined;\n if (!ep || typeof ep !== 'object') return false;\n if (ep.kind === 'http') {\n return typeof ep.host === 'string'\n && typeof ep.port === 'number'\n && (ep.protocol === 'http' || ep.protocol === 'https');\n }\n if (ep.kind === 'local') {\n return typeof ep.kbId === 'string';\n }\n return false;\n}\n\n/**\n * Load the persisted KB list. Entries that don't conform to the current\n * `KnowledgeBase` shape are dropped silently — the storage format has no\n * back-compat layer (the project's stance on storage migrations: change\n * the shape directly, no legacy fallbacks). Stale entries vanish; the\n * user re-adds the affected KBs.\n */\nexport function loadKnowledgeBases(storage: SessionStorage): KnowledgeBase[] {\n try {\n const raw = storage.get(STORAGE_KEY);\n if (!raw) return [];\n const entries = JSON.parse(raw) as unknown[];\n return entries.filter(isKnowledgeBase);\n } catch {\n return [];\n }\n}\n\nexport function saveKnowledgeBases(storage: SessionStorage, knowledgeBases: KnowledgeBase[]): void {\n storage.set(STORAGE_KEY, JSON.stringify(knowledgeBases));\n}\n\n// ---------- Public pure helpers ----------\n\nexport function defaultProtocol(host: string): 'http' | 'https' {\n return host === 'localhost' || host === '127.0.0.1' ? 'http' : 'https';\n}\n\n/** Accepts: localhost, dotted-decimal IPv4, valid DNS labels. Rejects slashes, colons, query strings. */\nconst HOSTNAME_RE = /^(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?|localhost|\\d{1,3}(\\.\\d{1,3}){3})$/;\n\nexport function isValidHostname(host: string): boolean {\n return HOSTNAME_RE.test(host);\n}\n\n/**\n * Build the wire URL for an HTTP KB endpoint. HTTP-shaped helper —\n * lives next to the KB list machinery because the frontend Panel needs\n * it for the auth round-trip when adding a KB. Code that holds a\n * uniform `KnowledgeBase` should not call this; it should hand the KB\n * to a transport factory and let the factory inspect `endpoint.kind`.\n */\nexport function kbBackendUrl(endpoint: HttpEndpoint): string {\n if (!isValidHostname(endpoint.host)) {\n throw new Error(`Invalid KB hostname: \"${endpoint.host}\"`);\n }\n // Use URL property assignment so the parser normalises the hostname (e.g. lowercasing)\n // rather than blindly interpolating a user-supplied string.\n const url = new URL('http://x');\n url.protocol = endpoint.protocol + ':';\n url.hostname = endpoint.host;\n url.port = String(endpoint.port);\n return `${endpoint.protocol}://${url.hostname}:${endpoint.port}`;\n}\n\nexport function generateKbId(): string {\n return crypto.randomUUID();\n}\n","/**\n * Session-level error surface. Emitted on `SemiontBrowser.error$` for\n * failures that make the session itself unusable (auth failed, actor\n * couldn't start, token refresh terminally exhausted). Per-request\n * errors stay with the caller as normal Promise rejections.\n *\n * `SemiontSessionError` extends `SemiontError` (the unified Semiont base)\n * so consumers can catch with `instanceof SemiontError` for any error\n * surfaced through the SDK.\n */\n\nimport { SemiontError } from '@semiont/core';\n\nexport type SemiontSessionErrorCode =\n | 'session.construct-failed'\n | 'session.auth-failed'\n | 'session.refresh-exhausted'\n | 'browser.sign-in-failed';\n\nexport class SemiontSessionError extends SemiontError {\n declare code: SemiontSessionErrorCode;\n readonly kbId: string | null;\n\n constructor(code: SemiontSessionErrorCode, message: string, kbId: string | null = null) {\n super(message, code, { kbId });\n this.name = 'SemiontSessionError';\n this.kbId = kbId;\n }\n}\n","/**\n * SemiontSession — per-backend session lifetime object. Owns the\n * SemiontClient, the access token BehaviorSubject, and optionally\n * an authenticated user. One SemiontSession exists per active backend\n * connection; lifetime is decoupled from React mount lifetime.\n *\n * Headless by design. Runs in browsers, CLIs, workers, and tests.\n * UI-specific state (session-expired/permission-denied modals) lives\n * in `SessionSignals`, which wraps a session — the session\n * itself has no modal observables, no user-facing notifications.\n *\n * Auth is parameterized via callbacks passed at construction:\n *\n * - `refresh()` — invoked on 401 / proactive re-auth. Returns the\n * new access token, or null on failure. The frontend passes a\n * closure that runs the refresh-token flow; the worker passes\n * one that exchanges the shared secret.\n *\n * - `validate(token)` — optional. If provided, the session calls\n * it once at startup with the stored token to confirm it's\n * still good and populate `user$`. Frontend passes `getMe`;\n * worker omits this (service principals have no user record).\n *\n * - `onAuthFailed(message)` — optional. Invoked when refresh\n * terminally fails (expired token, no recovery possible). UI hosts\n * typically wire this to `SessionSignals.notifySessionExpired` so a\n * modal surfaces; headless consumers typically just log.\n *\n * Persistence goes through a `SessionStorage` adapter provided at\n * construction — the session never touches `localStorage` or `window`\n * directly.\n */\n\nimport { BehaviorSubject, type Observable } from 'rxjs';\nimport {\n accessToken,\n baseUrl,\n type AccessToken,\n type BaseUrl,\n} from '@semiont/core';\nimport type { components, EventMap } from '@semiont/core';\nimport { SemiontClient, APIError, HttpTransport, HttpContentTransport } from '../client';\nimport type { SemiontError } from '@semiont/core';\nimport type { ConnectionState } from '@semiont/core';\nimport type { KnowledgeBase } from './knowledge-base';\nimport {\n clearStoredSession,\n getStoredSession,\n isJwtExpired,\n parseJwtExpiry,\n REFRESH_BEFORE_EXP_MS,\n sessionKey,\n setStoredSession,\n type StoredSession,\n} from './storage';\nimport { SemiontSessionError } from './errors';\nimport type { SessionStorage } from './session-storage';\n\nexport type UserInfo = components['schemas']['UserResponse'];\n\nexport interface SemiontSessionConfig {\n kb: KnowledgeBase;\n /** Persistence adapter. Reads/writes tokens via this. */\n storage: SessionStorage;\n /**\n * Pre-built api client. The session does not construct it — caller\n * builds the transport stack and passes the client in. This is the\n * seam where consumers swap one `ITransport` implementation for\n * another (HTTP, in-process, etc.).\n */\n client: SemiontClient;\n /**\n * Token observable shared with the transport. Caller must pass the\n * SAME instance to both the transport (via `HttpTransport` config)\n * and the session. The session writes refreshed tokens here; the\n * transport reads from here.\n */\n token$: BehaviorSubject<AccessToken | null>;\n /**\n * Re-authenticate after expiry / 401. Returns a new access token\n * (no \"Bearer \" prefix) on success, or null if recovery is\n * impossible. Omit for transports where tokens don't apply.\n */\n refresh?: () => Promise<string | null>;\n /**\n * Validate the stored token at startup and populate `user$`. Omit\n * for service-principal sessions (worker, CLI tools) where there\n * is no user record to fetch.\n */\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n /**\n * Invoked when refresh terminally fails. Frontend consumers wire\n * this to a UI signal that surfaces the session-expired modal.\n */\n onAuthFailed?: (message: string | null) => void;\n /** Called for session-level failures (auth, refresh exhaustion). */\n onError?: (err: SemiontSessionError) => void;\n}\n\nexport class SemiontSession {\n readonly kb: KnowledgeBase;\n readonly client: SemiontClient;\n readonly token$: BehaviorSubject<AccessToken | null>;\n readonly user$: BehaviorSubject<UserInfo | null>;\n readonly streamState$: Observable<ConnectionState>;\n /**\n * Stream of `SemiontError` instances surfaced by the underlying transport\n * just before they're thrown to the caller. For `HttpTransport` this is\n * an `APIError` (status-coded); other transports emit their own subclass.\n * Surfaced here so a host layer (e.g. `SemiontBrowser`) can route by\n * `err.code` to global notifications without every call site handling\n * errors itself. Headless consumers can subscribe for logging.\n *\n * Re-published from `client.transport.errors$` per the `ITransport`\n * contract — the session is purely a passthrough.\n */\n readonly errors$: Observable<SemiontError>;\n\n /** Resolves after the initial validation round-trip completes (success or failure). */\n readonly ready: Promise<void>;\n\n private readonly storage: SessionStorage;\n private readonly doRefresh?: () => Promise<string | null>;\n private readonly doValidate?: (token: AccessToken) => Promise<UserInfo | null>;\n private readonly onAuthFailed: (message: string | null) => void;\n private readonly onError: (err: SemiontSessionError) => void;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n\n constructor(config: SemiontSessionConfig) {\n this.kb = config.kb;\n this.storage = config.storage;\n this.doRefresh = config.refresh;\n this.doValidate = config.validate;\n this.onAuthFailed = config.onAuthFailed ?? (() => {});\n this.onError = config.onError ?? (() => {});\n this.client = config.client;\n this.token$ = config.token$;\n this.user$ = new BehaviorSubject<UserInfo | null>(null);\n this.errors$ = this.client.transport.errors$;\n\n // Reconcile stored token: if there's a fresh stored access token\n // and `token$` hasn't been seeded yet, push the stored value so the\n // transport (which shares this token$) sees it on first auth.\n const stored = getStoredSession(this.storage, this.kb.id);\n if (stored && !isJwtExpired(stored.access) && this.token$.getValue() === null) {\n this.token$.next(accessToken(stored.access));\n }\n const initialToken = this.token$.getValue();\n\n this.streamState$ = this.client.state$;\n\n if (initialToken) {\n this.scheduleProactiveRefresh(initialToken);\n }\n\n this.unsubscribeStorage = this.storage.subscribe?.((key, newValue) => {\n this.handleStorageChange(key, newValue);\n }) ?? null;\n\n this.ready = this.validate(stored);\n }\n\n /**\n * Run the initial mount-time validation. If a stored access token is\n * present and unexpired, call the configured `validate` with it to\n * confirm it still works and populate `user$`. If expired, try\n * refresh first. On 401 from validate, try refresh once. Surfaces\n * auth-failed on terminal failure.\n *\n * When no `validate` callback is provided (service principals), this\n * still runs through the refresh-if-expired step so the stored\n * token is current — it just skips the user-validation round trip.\n */\n private async validate(stored: StoredSession | null): Promise<void> {\n if (!stored) return;\n\n const startToken = isJwtExpired(stored.access)\n ? (this.doRefresh ? await this.doRefresh() : null)\n : stored.access;\n if (!startToken) {\n if (isJwtExpired(stored.access)) {\n clearStoredSession(this.storage, this.kb.id);\n }\n return;\n }\n\n if (startToken !== stored.access) {\n this.token$.next(accessToken(startToken));\n this.scheduleProactiveRefresh(startToken);\n }\n\n // No validate callback => service-principal session. Token is\n // current; `user$` stays null. Done.\n if (!this.doValidate) return;\n\n const attempt = async (token: string): Promise<void> => {\n if (this.disposed) return;\n try {\n const data = await this.doValidate!(accessToken(token));\n if (this.disposed) return;\n this.user$.next(data);\n } catch (err) {\n if (this.disposed) return;\n if (err instanceof APIError && err.status === 401) {\n const refreshed = this.doRefresh ? await this.doRefresh() : null;\n if (this.disposed) return;\n if (refreshed) {\n this.token$.next(accessToken(refreshed));\n this.scheduleProactiveRefresh(refreshed);\n await attempt(refreshed);\n return;\n }\n clearStoredSession(this.storage, this.kb.id);\n this.token$.next(null);\n this.onAuthFailed('Your session has expired. Please sign in again.');\n } else {\n this.onError(\n new SemiontSessionError(\n 'session.auth-failed',\n err instanceof Error ? err.message : String(err),\n this.kb.id,\n ),\n );\n }\n }\n };\n\n await attempt(startToken);\n }\n\n /**\n * Refresh the access token via the configured `refresh` callback.\n * On success, pushes the new token into `token$` and schedules the\n * next proactive refresh. On failure, clears persisted state and\n * fires `onAuthFailed` — the frontend's wiring of that callback is\n * what surfaces the session-expired modal.\n */\n async refresh(): Promise<AccessToken | null> {\n if (this.disposed) return null;\n if (!this.doRefresh) return null;\n const newAccess = await this.doRefresh();\n if (this.disposed) return null;\n if (newAccess) {\n const tok = accessToken(newAccess);\n this.token$.next(tok);\n this.scheduleProactiveRefresh(newAccess);\n return tok;\n }\n this.token$.next(null);\n clearStoredSession(this.storage, this.kb.id);\n this.onAuthFailed('Your session has expired. Please sign in again.');\n this.onError(\n new SemiontSessionError('session.refresh-exhausted', 'Token refresh failed', this.kb.id),\n );\n return null;\n }\n\n private scheduleProactiveRefresh(token: string): void {\n this.clearRefreshTimer();\n const expiresAt = parseJwtExpiry(token);\n if (!expiresAt) return;\n const refreshAt = expiresAt.getTime() - REFRESH_BEFORE_EXP_MS;\n const delay = Math.max(0, refreshAt - Date.now());\n this.refreshTimer = setTimeout(() => {\n this.refreshTimer = null;\n if (!this.disposed) void this.refresh();\n }, delay);\n }\n\n private clearRefreshTimer(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * Cross-context sync: another tab/process refreshed or signed out this\n * KB. Mirror the change into our in-memory state.\n */\n private handleStorageChange(key: string, newValue: string | null): void {\n if (this.disposed) return;\n if (key !== sessionKey(this.kb.id)) return;\n if (!newValue) {\n this.token$.next(null);\n this.user$.next(null);\n this.clearRefreshTimer();\n return;\n }\n try {\n const parsed = JSON.parse(newValue) as StoredSession;\n if (typeof parsed.access === 'string') {\n this.token$.next(accessToken(parsed.access));\n this.scheduleProactiveRefresh(parsed.access);\n }\n } catch {\n // Malformed payload — ignore.\n }\n }\n\n get expiresAt(): Date | null {\n const token = this.token$.getValue();\n return token ? parseJwtExpiry(token) : null;\n }\n\n /**\n * Subscribe to a session-bus channel. The single sanctioned escape hatch\n * for generic-channel subscription (the case `useEventSubscription` needs\n * — channel name is a hook parameter, not known statically). All other\n * consumers must call typed namespace methods (e.g. `session.client.mark.archive(...)`).\n *\n * @returns disposer that unsubscribes the handler.\n */\n subscribe<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n const sub = this.client.bus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n this.clearRefreshTimer();\n if (this.unsubscribeStorage) {\n this.unsubscribeStorage();\n this.unsubscribeStorage = null;\n }\n\n this.client.dispose();\n\n this.token$.complete();\n this.user$.complete();\n }\n\n /**\n * Convenience factory for the default HTTP setup. Constructs the\n * shared `BehaviorSubject<AccessToken | null>`, an `HttpTransport`,\n * an `HttpContentTransport`, and a `SemiontClient`, then wires\n * the session over them. Removes the load-bearing\n * \"same-token$-instance\" invariant from the caller's hands.\n *\n * Strings are accepted for `baseUrl` and `token`; they are branded\n * via `baseUrl()` / `accessToken()` from `@semiont/core` automatically.\n *\n * The remaining options (`refresh`, `validate`, `onAuthFailed`,\n * `onError`) match `SemiontSessionConfig` exactly.\n */\n static fromHttp(opts: {\n kb: KnowledgeBase;\n storage: SessionStorage;\n baseUrl: BaseUrl | string;\n token?: AccessToken | string | null;\n refresh?: () => Promise<string | null>;\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n onAuthFailed?: (message: string | null) => void;\n onError?: (err: SemiontSessionError) => void;\n }): SemiontSession {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n const tok = opts.token == null\n ? null\n : (typeof opts.token === 'string' ? accessToken(opts.token) : opts.token);\n const token$ = new BehaviorSubject<AccessToken | null>(tok);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n const config: SemiontSessionConfig = { kb: opts.kb, storage: opts.storage, client, token$ };\n if (opts.refresh) config.refresh = opts.refresh;\n if (opts.validate) config.validate = opts.validate;\n if (opts.onAuthFailed) config.onAuthFailed = opts.onAuthFailed;\n if (opts.onError) config.onError = opts.onError;\n return new SemiontSession(config);\n }\n\n /**\n * Async factory for the credentials-first long-running script case.\n * Builds the HTTP transport stack, calls `auth.password(email,\n * password)` to acquire access + refresh tokens, persists them via\n * the storage adapter, wires a default `refresh` callback that\n * exchanges the refresh token via `auth.refresh(...)`, and returns\n * the ready session.\n *\n * The consumer-supplied `refresh` callback becomes optional — only\n * needed for non-standard refresh flows (worker-pool shared secret,\n * OAuth refresh-token grant, interactive re-prompt). The default\n * uses the refresh token returned by `auth.password`.\n *\n * `kb` is required and must be a full `KnowledgeBase`. The `id` field\n * is the storage key for this session — distinct scripts sharing the\n * same `SessionStorage` instance must use distinct ids to avoid\n * trampling each other's tokens. The factory does not synthesize a\n * default; the consumer makes the choice.\n *\n * Named `signInHttp` because email+password authentication is\n * inherently an HTTP-shaped operation in the current backend; an\n * in-process `LocalTransport` doesn't have a credentials login\n * path. Non-HTTP transports construct the session directly from\n * their package's transport instance.\n *\n * Throws on auth failure with no resources leaked. On success, the\n * returned session's `ready` promise has already resolved.\n */\n static async signInHttp(opts: {\n kb: KnowledgeBase;\n storage: SessionStorage;\n baseUrl: BaseUrl | string;\n email: string;\n password: string;\n validate?: (token: AccessToken) => Promise<UserInfo | null>;\n onAuthFailed?: (message: string | null) => void;\n onError?: (err: SemiontSessionError) => void;\n }): Promise<SemiontSession> {\n const url = typeof opts.baseUrl === 'string' ? baseUrl(opts.baseUrl) : opts.baseUrl;\n\n // Phase 1: build a transient transport with no token, authenticate,\n // and capture the full StoredSession from the response.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n const transport = new HttpTransport({ baseUrl: url, token$ });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n\n let auth: components['schemas']['AuthResponse'];\n try {\n auth = await client.auth!.password(opts.email, opts.password);\n } catch (err) {\n client.dispose();\n throw err;\n }\n\n setStoredSession(opts.storage, opts.kb.id, { access: auth.token, refresh: auth.refreshToken });\n token$.next(accessToken(auth.token));\n\n // Phase 2: wire a default refresh callback that uses the stored\n // refresh token (read at refresh time, not capture-time, so storage\n // updates from elsewhere are honored). The session itself updates\n // storage on each successful refresh, so this stays in sync.\n const defaultRefresh = async (): Promise<string | null> => {\n const stored = getStoredSession(opts.storage, opts.kb.id);\n if (!stored) return null;\n try {\n const response = await client.auth!.refresh(stored.refresh);\n return response.access_token;\n } catch {\n return null;\n }\n };\n\n const config: SemiontSessionConfig = {\n kb: opts.kb,\n storage: opts.storage,\n client,\n token$,\n refresh: defaultRefresh,\n };\n if (opts.validate) config.validate = opts.validate;\n if (opts.onAuthFailed) config.onAuthFailed = opts.onAuthFailed;\n if (opts.onError) config.onError = opts.onError;\n\n const session = new SemiontSession(config);\n await session.ready;\n return session;\n }\n}\n","/**\n * SessionSignals — UI-facing notification state that belongs to the host\n * surface, not to the session itself.\n *\n * `SemiontSession` is a headless per-backend client + token + user\n * holder. It can run in any process: browser, worker, CLI, test. But\n * the session-expired / permission-denied *notifications* are inherently\n * a UI-host concern. Keeping those observables on `SemiontSession` meant\n * workers and CLIs carried four dead BehaviorSubjects that nothing would\n * ever fire.\n *\n * `SessionSignals` owns the notification state and has no hard reference\n * to a session. A UI host (e.g. `SemiontBrowser`) constructs one alongside\n * every active session and wires:\n *\n * - `session.onAuthFailed` → `signals.notifySessionExpired` so\n * proactive-refresh failures surface as a notification\n *\n * UI consumers that need to render modal/banner state subscribe here;\n * consumers that need bus/HTTP access continue to subscribe to the session.\n *\n * Session auth-state cleanup (clearing token, clearing storage) is\n * the session's own responsibility inside `refresh()` — by the time\n * `notifySessionExpired` runs, the session has already torn down.\n * Signals only surfaces the notification.\n */\n\nimport { BehaviorSubject } from 'rxjs';\n\nexport class SessionSignals {\n readonly sessionExpiredAt$: BehaviorSubject<number | null>;\n readonly sessionExpiredMessage$: BehaviorSubject<string | null>;\n readonly permissionDeniedAt$: BehaviorSubject<number | null>;\n readonly permissionDeniedMessage$: BehaviorSubject<string | null>;\n\n constructor() {\n this.sessionExpiredAt$ = new BehaviorSubject<number | null>(null);\n this.sessionExpiredMessage$ = new BehaviorSubject<string | null>(null);\n this.permissionDeniedAt$ = new BehaviorSubject<number | null>(null);\n this.permissionDeniedMessage$ = new BehaviorSubject<string | null>(null);\n }\n\n notifySessionExpired(message: string | null): void {\n this.sessionExpiredMessage$.next(\n message ?? 'Your session has expired. Please sign in again.',\n );\n this.sessionExpiredAt$.next(Date.now());\n }\n\n notifyPermissionDenied(message: string | null): void {\n this.permissionDeniedMessage$.next(\n message ?? 'You do not have permission to perform this action.',\n );\n this.permissionDeniedAt$.next(Date.now());\n }\n\n acknowledgeSessionExpired(): void {\n this.sessionExpiredAt$.next(null);\n this.sessionExpiredMessage$.next(null);\n }\n\n acknowledgePermissionDenied(): void {\n this.permissionDeniedAt$.next(null);\n this.permissionDeniedMessage$.next(null);\n }\n\n dispose(): void {\n this.sessionExpiredAt$.complete();\n this.sessionExpiredMessage$.complete();\n this.permissionDeniedAt$.complete();\n this.permissionDeniedMessage$.complete();\n }\n}\n","/**\n * SemiontBrowser — top-level app-facing container for non-KB state.\n *\n * Holds the list of configured KBs, the active KB selection, the active\n * SemiontSession, the identity token, the open-resources list, and a\n * session-level error stream. Held as a process-wide instance for the\n * host's lifetime — see `getBrowser()` in `registry.ts` for the canonical\n * accessor.\n *\n * Transport-agnostic: the browser orchestrates session *lifecycle* but\n * delegates session *construction* to a `SessionFactory` injected at\n * construction. HTTP-backed apps pass `createHttpSessionFactory()` from\n * `@semiont/sdk`; in-process apps pass their own factory.\n *\n * Persistence goes through a `SessionStorage` adapter provided at\n * construction — the browser never touches `localStorage` or `window`\n * directly.\n */\n\nimport { BehaviorSubject, Subject, type Observable } from 'rxjs';\nimport { EventBus, type EventMap } from '@semiont/core';\nimport {\n ACTIVE_KEY,\n clearStoredSession,\n generateKbId,\n getStoredSession,\n isJwtExpired,\n loadKnowledgeBases,\n saveKnowledgeBases,\n setStoredSession,\n} from './storage';\nimport type {\n KnowledgeBase,\n KbSessionStatus,\n NewKnowledgeBase,\n} from './knowledge-base';\nimport type { OpenResource } from './open-resource';\nimport { SemiontSession } from './semiont-session';\nimport { SessionSignals } from './session-signals';\nimport { SemiontSessionError } from './errors';\nimport type { SessionStorage } from './session-storage';\nimport type { SessionFactory } from './session-factory';\n\nconst OPEN_RESOURCES_KEY = 'openDocuments';\n\nfunction sortOpenResources(resources: OpenResource[]): OpenResource[] {\n return [...resources].sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) return a.order - b.order;\n return a.openedAt - b.openedAt;\n });\n}\n\nfunction loadOpenResources(storage: SessionStorage): OpenResource[] {\n try {\n const stored = storage.get(OPEN_RESOURCES_KEY);\n if (stored) return sortOpenResources(JSON.parse(stored) as OpenResource[]);\n } catch {\n // Ignore parse errors\n }\n return [];\n}\n\nexport interface SemiontBrowserConfig {\n /** Persistence adapter. The browser reads/writes all persisted state via this. */\n storage: SessionStorage;\n /**\n * Builds a `SemiontSession` for a KB. The browser is transport-\n * agnostic — every HTTP-vs-local construction concern lives in the\n * factory. HTTP-backed apps pass `createHttpSessionFactory()` from\n * `@semiont/sdk`; a future in-process variant from `@semiont/make-meaning`\n * would expose its own factory.\n */\n sessionFactory: SessionFactory;\n}\n\nexport class SemiontBrowser {\n readonly kbs$: BehaviorSubject<KnowledgeBase[]>;\n readonly activeKbId$: BehaviorSubject<string | null>;\n readonly activeSession$: BehaviorSubject<SemiontSession | null>;\n /**\n * Modal signals (session-expired / permission-denied) for the\n * currently-active session. Parallels `activeSession$` — always\n * non-null when `activeSession$` is non-null, always null when it\n * is. Extracted from the session itself so headless sessions\n * (workers, CLIs, tests) don't carry dead modal observables.\n * See [SessionSignals](./session-signals.ts).\n */\n readonly activeSignals$: BehaviorSubject<SessionSignals | null>;\n /**\n * True while a session is actively being constructed (setActiveKb /\n * signIn in flight, awaiting `session.ready`). Distinguishes the\n * \"session about to arrive\" intermediate state from \"session\n * intentionally null\" (after signOut, or when the active KB has no\n * stored credentials). UIs that want a loading spinner should gate\n * on this; otherwise they get stuck spinning after every signOut.\n */\n readonly sessionActivating$: BehaviorSubject<boolean>;\n readonly openResources$: BehaviorSubject<OpenResource[]>;\n readonly error$: Subject<SemiontSessionError>;\n readonly identityToken$: BehaviorSubject<string | null>;\n\n private readonly storage: SessionStorage;\n private readonly sessionFactory: SessionFactory;\n /**\n * App-scoped EventBus. Hosts UI-shell events that must work regardless\n * of whether a KB session is active: panel toggles, sidebar state,\n * tab reorders, routing, settings, etc. Disjoint from the per-session\n * bus inside `SemiontClient`, which carries KB-content events\n * (mark:*, beckon:*, gather:*, match:*, bind:*, yield:*, browse:click).\n */\n private readonly eventBus: EventBus = new EventBus();\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n private activating: Promise<void> | null = null;\n\n constructor(config: SemiontBrowserConfig) {\n this.storage = config.storage;\n this.sessionFactory = config.sessionFactory;\n\n const kbs = loadKnowledgeBases(this.storage);\n const storedActive = this.storage.get(ACTIVE_KEY);\n const initialActive =\n storedActive && kbs.some((kb) => kb.id === storedActive)\n ? storedActive\n : kbs[0]?.id ?? null;\n\n this.kbs$ = new BehaviorSubject<KnowledgeBase[]>(kbs);\n this.activeKbId$ = new BehaviorSubject<string | null>(initialActive);\n this.activeSession$ = new BehaviorSubject<SemiontSession | null>(null);\n this.activeSignals$ = new BehaviorSubject<SessionSignals | null>(null);\n this.sessionActivating$ = new BehaviorSubject<boolean>(false);\n this.openResources$ = new BehaviorSubject<OpenResource[]>(loadOpenResources(this.storage));\n this.error$ = new Subject<SemiontSessionError>();\n this.identityToken$ = new BehaviorSubject<string | null>(null);\n\n // Persist kbs$ and activeKbId$ via the storage adapter.\n this.kbs$.subscribe((next) => saveKnowledgeBases(this.storage, next));\n this.activeKbId$.subscribe((id) => {\n if (id) this.storage.set(ACTIVE_KEY, id);\n else this.storage.delete(ACTIVE_KEY);\n });\n\n // Persist openResources$ on every change.\n this.openResources$.subscribe((list) => {\n this.storage.set(OPEN_RESOURCES_KEY, JSON.stringify(list));\n });\n\n // Sync openResources$ from other contexts (cross-tab/cross-process).\n this.unsubscribeStorage = this.storage.subscribe?.((key, newValue) => {\n if (key !== OPEN_RESOURCES_KEY || !newValue) return;\n try {\n this.openResources$.next(sortOpenResources(JSON.parse(newValue) as OpenResource[]));\n } catch {\n // Ignore parse errors\n }\n }) ?? null;\n\n // Construct the initial active session, if any. Fire-and-forget.\n if (initialActive) {\n void this.setActiveKb(initialActive);\n }\n }\n\n // ── App-scoped event bus ──────────────────────────────────────────────\n\n /** Emit an event on the browser's app-scoped bus. */\n emit<K extends keyof EventMap>(channel: K, payload: EventMap[K]): void {\n if (this.disposed) return;\n this.eventBus.get(channel).next(payload);\n }\n\n /** Subscribe to an event; returns unsubscribe. */\n on<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n const sub = this.eventBus.get(channel).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n /** Read-only observable for an app-scoped channel. */\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.eventBus.get(channel).asObservable();\n }\n\n // ── Identity token (NextAuth bridge; D1) ──────────────────────────────\n\n /**\n * Set the app-level identity token. Sourced from whatever the host\n * environment uses for OAuth sessions (e.g. NextAuth in a browser app).\n * Should be called once from the host's startup-and-on-change site;\n * no other code should write to this slot.\n */\n setIdentityToken(token: string | null): void {\n if (this.disposed) return;\n this.identityToken$.next(token);\n }\n\n // ── KB list management ────────────────────────────────────────────────\n\n addKb(input: NewKnowledgeBase, access: string, refresh: string): KnowledgeBase {\n const kb: KnowledgeBase = { id: generateKbId(), ...input };\n setStoredSession(this.storage, kb.id, { access, refresh });\n this.kbs$.next([...this.kbs$.getValue(), kb]);\n void this.setActiveKb(kb.id);\n return kb;\n }\n\n removeKb(id: string): void {\n clearStoredSession(this.storage, id);\n const next = this.kbs$.getValue().filter((kb) => kb.id !== id);\n this.kbs$.next(next);\n if (this.activeKbId$.getValue() === id) {\n void this.setActiveKb(next[0]?.id ?? null);\n }\n }\n\n /**\n * Patch a KB in the list. Restricted to the common, endpoint-agnostic\n * fields (`label`, `email`, `gitBranch`) — the `endpoint` shape isn't\n * editable in place; remove and re-add to change the connection\n * target.\n */\n updateKb(id: string, updates: { label?: string; email?: string; gitBranch?: string }): void {\n this.kbs$.next(\n this.kbs$.getValue().map((kb) => (kb.id === id ? { ...kb, ...updates } : kb)),\n );\n }\n\n /**\n * Read the locally-stored credential status for a KB. Pure / synchronous —\n * does not subscribe to context changes. Used by KB-list UI to color status\n * dots without requiring re-renders on every tick.\n */\n getKbSessionStatus(kbId: string): KbSessionStatus {\n const stored = getStoredSession(this.storage, kbId);\n if (!stored) return 'signed-out';\n return isJwtExpired(stored.access) ? 'expired' : 'authenticated';\n }\n\n /**\n * Switch the active KB. Follows the D2 disposal contract:\n * 1. Synchronously announce the new id on `activeKbId$` and null out\n * `activeSession$` so views see a safe empty state first.\n * 2. Serialize overlapping calls — if an activation is in flight, wait\n * for it before proceeding.\n * 3. Dispose whatever session is currently live.\n * 4. Construct the next session and await `session.ready`.\n * 5. Before emitting, re-check `activeKbId$` — if a newer call superseded\n * us while we waited, dispose our session and skip the emit.\n * 6. Emit the new session.\n */\n async setActiveKb(id: string | null): Promise<void> {\n if (this.disposed) return;\n\n const prevId = this.activeKbId$.getValue();\n const prevSession = this.activeSession$.getValue();\n\n // No-op if id already matches and a live session exists.\n if (id === prevId && prevSession) return;\n\n // Synchronous intent signal. Late activations compare against this to\n // detect staleness. Session and signals null out together so React\n // consumers never see a stale signals instance paired with a null\n // session during the activation gap.\n if (prevId !== id) this.activeKbId$.next(id);\n if (prevSession) {\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n }\n\n // Wait for any in-flight activation. If we were superseded while\n // waiting, bail — a newer call is already reflecting the desired state.\n while (this.activating) {\n const current = this.activating;\n await current;\n if (this.disposed) return;\n if (this.activeKbId$.getValue() !== id) return;\n }\n\n const activation = (async () => {\n // Dispose whatever is currently live (might be null already from the\n // sync path above, or left over from a superseded activation).\n const toDispose = this.activeSession$.getValue();\n const signalsToDispose = this.activeSignals$.getValue();\n if (toDispose) {\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n await toDispose.dispose();\n signalsToDispose?.dispose();\n }\n\n if (!id) return;\n\n const kb = this.kbs$.getValue().find((k) => k.id === id);\n if (!kb) return;\n\n // Construct the modal signals up front; the session's\n // onAuthFailed callback writes into them, so they must exist\n // before the session's ctor does its startup validation.\n const signals = new SessionSignals();\n\n let session: SemiontSession;\n try {\n session = this.sessionFactory({\n kb,\n storage: this.storage,\n signals,\n onError: (err) => this.error$.next(err),\n });\n } catch (err) {\n this.error$.next(\n err instanceof SemiontSessionError\n ? err\n : new SemiontSessionError(\n 'session.construct-failed',\n err instanceof Error ? err.message : String(err),\n id,\n ),\n );\n signals.dispose();\n return;\n }\n\n // Route transport-level errors to the modal signals. The session's\n // `errors$` re-publishes `client.transport.errors$` per the\n // `ITransport` contract; the transport stamps `err.code` from the\n // `TransportErrorCode` vocabulary so this routing stays\n // transport-agnostic. `unauthorized` covers ad-hoc unauthorized\n // requests (the proactive-refresh `onAuthFailed` path doesn't);\n // `forbidden` has no recovery — surface it as permission-denied.\n // The subscription ends naturally when `errors$` completes on\n // transport dispose.\n session.errors$.subscribe((err) => {\n if (err.code === 'unauthorized') {\n signals.notifySessionExpired(err.message);\n } else if (err.code === 'forbidden') {\n signals.notifyPermissionDenied(err.message);\n }\n });\n\n try {\n await session.ready;\n } catch (err) {\n this.error$.next(\n new SemiontSessionError(\n 'session.construct-failed',\n err instanceof Error ? err.message : String(err),\n id,\n ),\n );\n await session.dispose();\n signals.dispose();\n return;\n }\n\n if (this.disposed || this.activeKbId$.getValue() !== id) {\n await session.dispose();\n signals.dispose();\n return;\n }\n\n this.activeSession$.next(session);\n this.activeSignals$.next(signals);\n })();\n\n this.activating = activation;\n this.sessionActivating$.next(true);\n try {\n await activation;\n } finally {\n // Reference-identity guard: clear only if no newer activate() superseded\n // us. Do NOT await `activation` here (it resolves to void) — awaiting would\n // make this always-false and leak the activating state. (CodeQL FP.)\n if (this.activating === activation) {\n this.activating = null;\n this.sessionActivating$.next(false);\n }\n }\n }\n\n /**\n * Sign in to an existing KB: store the tokens and (re)activate the\n * session. If the KB is already active, the current session is disposed\n * and replaced so the new tokens take effect.\n */\n async signIn(id: string, access: string, refresh: string): Promise<void> {\n if (this.disposed) return;\n setStoredSession(this.storage, id, { access, refresh });\n\n // If this KB is already active, tear down and reconstruct so the new\n // tokens are picked up from storage by the session ctor.\n if (this.activeKbId$.getValue() === id) {\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n await this.setActiveKb(id);\n return;\n }\n\n await this.setActiveKb(id);\n }\n\n /**\n * Sign out of a KB: clear stored tokens. If the KB is active, dispose\n * its session + signals and emit null for both.\n */\n async signOut(id: string): Promise<void> {\n if (this.disposed) return;\n clearStoredSession(this.storage, id);\n\n // Bump the kbs$ list so downstream status-derivations re-run.\n this.kbs$.next([...this.kbs$.getValue()]);\n\n if (this.activeKbId$.getValue() === id) {\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n }\n }\n\n // ── Open resources ────────────────────────────────────────────────────\n\n addOpenResource(\n id: string,\n name: string,\n mediaType?: string,\n storageUri?: string,\n ): void {\n const existing = this.openResources$.getValue();\n const idx = existing.findIndex((r) => r.id === id);\n if (idx >= 0) {\n // Update metadata in place; keep position and openedAt.\n const prev = existing[idx]!;\n const updated: OpenResource = {\n ...prev,\n name,\n ...(mediaType !== undefined ? { mediaType } : {}),\n ...(storageUri !== undefined ? { storageUri } : {}),\n };\n const next = [...existing];\n next[idx] = updated;\n this.openResources$.next(next);\n return;\n }\n const resource: OpenResource = {\n id,\n name,\n openedAt: Date.now(),\n order: existing.length,\n ...(mediaType !== undefined ? { mediaType } : {}),\n ...(storageUri !== undefined ? { storageUri } : {}),\n };\n this.openResources$.next([...existing, resource]);\n }\n\n removeOpenResource(id: string): void {\n this.openResources$.next(this.openResources$.getValue().filter((r) => r.id !== id));\n }\n\n updateOpenResourceName(id: string, name: string): void {\n this.openResources$.next(\n this.openResources$.getValue().map((r) => (r.id === id ? { ...r, name } : r)),\n );\n }\n\n reorderOpenResources(oldIndex: number, newIndex: number): void {\n const list = [...this.openResources$.getValue()];\n if (oldIndex < 0 || oldIndex >= list.length || newIndex < 0 || newIndex >= list.length) {\n return;\n }\n const [moved] = list.splice(oldIndex, 1);\n if (moved) list.splice(newIndex, 0, moved);\n this.openResources$.next(list);\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────────────\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n if (this.unsubscribeStorage) {\n this.unsubscribeStorage();\n this.unsubscribeStorage = null;\n }\n\n const prevSession = this.activeSession$.getValue();\n const prevSignals = this.activeSignals$.getValue();\n this.activeSession$.next(null);\n this.activeSignals$.next(null);\n if (prevSession) await prevSession.dispose();\n prevSignals?.dispose();\n\n this.kbs$.complete();\n this.activeKbId$.complete();\n this.activeSession$.complete();\n this.activeSignals$.complete();\n this.openResources$.complete();\n this.error$.complete();\n this.identityToken$.complete();\n this.eventBus.destroy();\n }\n}\n","/**\n * createHttpSessionFactory — the default `SessionFactory` for HTTP-backed\n * KBs. Owns every HTTP-specific construction concern that used to live in\n * `SemiontBrowser`: building `HttpTransport`/`HttpContentTransport`,\n * wiring the `tokenRefresher` callback, deduplicating concurrent 401\n * refresh round trips, and invoking the auth endpoints for token refresh\n * and user-validate.\n *\n * Returned as a closure so a single `inFlightRefreshes` map is shared\n * across every session this factory builds — the dedup is meaningful\n * across concurrent session reactivations for the same KB id.\n */\n\nimport { BehaviorSubject } from 'rxjs';\nimport { HttpTransport, HttpContentTransport } from '@semiont/http-transport';\nimport { baseUrl, type AccessToken } from '@semiont/core';\nimport { SemiontClient } from '../client';\nimport { SemiontSession, type UserInfo } from './semiont-session';\nimport { SemiontSessionError } from './errors';\nimport { kbBackendUrl, getStoredSession, setStoredSession } from './storage';\nimport type { SessionFactory, SessionFactoryOptions } from './session-factory';\n\nexport function createHttpSessionFactory(): SessionFactory {\n const inFlightRefreshes = new Map<string, Promise<string | null>>();\n\n return (opts: SessionFactoryOptions): SemiontSession => {\n const { kb, storage, signals, onError } = opts;\n\n if (kb.endpoint.kind !== 'http') {\n throw new SemiontSessionError(\n 'session.construct-failed',\n `HTTP session factory cannot construct a session for endpoint kind \"${kb.endpoint.kind}\"`,\n kb.id,\n );\n }\n const endpoint = kb.endpoint;\n\n /**\n * Refresh the KB's access token. Concurrent calls for the same KB\n * dedup through `inFlightRefreshes`, so simultaneous 401s trigger\n * only one `/api/tokens/refresh` round trip. Uses a throwaway\n * `SemiontClient` with no `tokenRefresher` — a refresh call\n * returning 401 would otherwise re-enter this function infinitely.\n */\n const performRefresh = async (): Promise<string | null> => {\n const existing = inFlightRefreshes.get(kb.id);\n if (existing) return existing;\n\n const promise = (async () => {\n const stored = getStoredSession(storage, kb.id);\n if (!stored) return null;\n const throwawayTransport = new HttpTransport({ baseUrl: baseUrl(kbBackendUrl(endpoint)) });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(throwawayTransport), throwawayTransport);\n try {\n const response = await throwaway.auth!.refresh(stored.refresh);\n const newAccess = response.access_token;\n if (!newAccess) return null;\n setStoredSession(storage, kb.id, { access: newAccess, refresh: stored.refresh });\n return newAccess;\n } catch {\n return null;\n } finally {\n throwaway.dispose();\n }\n })();\n\n inFlightRefreshes.set(kb.id, promise);\n try {\n return await promise;\n } finally {\n inFlightRefreshes.delete(kb.id);\n }\n };\n\n /**\n * Validate an access token by calling `auth.me` on a throwaway\n * client seeded with that specific token. The session uses this\n * once at startup to populate `user$`; 401 triggers a\n * refresh-then-retry inside the session.\n */\n const performValidate = async (token: AccessToken): Promise<UserInfo | null> => {\n const tokenSubject = new BehaviorSubject<AccessToken | null>(token);\n const throwawayTransport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(endpoint)),\n token$: tokenSubject,\n });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(throwawayTransport), throwawayTransport);\n try {\n const data = await throwaway.auth!.me();\n return data as UserInfo;\n } finally {\n throwaway.dispose();\n tokenSubject.complete();\n }\n };\n\n // Build transport stack: factory owns token$ and threads it through\n // transport (which reads it on every request) and session (which\n // writes refreshed values into it). The `tokenRefresher` closure\n // resolves `session` lazily — `session` is defined right after,\n // before any 401 could fire.\n const token$ = new BehaviorSubject<AccessToken | null>(null);\n let session!: SemiontSession;\n const transport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(endpoint)),\n token$,\n tokenRefresher: () => session.refresh().then((t) => t ?? null),\n });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content, transport);\n session = new SemiontSession({\n kb,\n storage,\n client,\n token$,\n refresh: performRefresh,\n validate: performValidate,\n onAuthFailed: (msg) => signals.notifySessionExpired(msg),\n onError,\n });\n return session;\n };\n}\n","/**\n * Process-wide accessor for `SemiontBrowser`. Constructed lazily on the\n * first `getBrowser()` call and held for the host's lifetime — a single\n * instance owns the KB list, identity token, and active-session state,\n * so callers throughout the host get the same view of \"which KB am I\n * talking to right now\" regardless of where they pick it up.\n *\n * The caller provides a `SessionStorage` implementation and a\n * `SessionFactory` — both are environment-specific (browsers use\n * `WebBrowserStorage` + `createHttpSessionFactory()`, CLI/embedded\n * hosts use a filesystem adapter and possibly a local-process\n * factory, tests use `InMemorySessionStorage` and stubs). The first\n * call to `getBrowser` wins; subsequent calls return the cached\n * instance regardless of the options passed.\n */\n\nimport { SemiontBrowser } from './semiont-browser';\nimport type { SessionStorage } from './session-storage';\nimport type { SessionFactory } from './session-factory';\n\nlet instance: SemiontBrowser | null = null;\n\nexport interface GetBrowserOptions {\n /** Persistence adapter used to construct the singleton on first call. */\n storage: SessionStorage;\n /** Session factory used to build a `SemiontSession` per active KB. */\n sessionFactory: SessionFactory;\n}\n\nexport function getBrowser(options: GetBrowserOptions): SemiontBrowser {\n if (!instance) {\n instance = new SemiontBrowser({\n storage: options.storage,\n sessionFactory: options.sessionFactory,\n });\n }\n return instance;\n}\n\n/**\n * Test-only reset hook. Tests import this to clear the singleton between\n * runs. Production code must not import it.\n */\nexport async function __resetForTests(): Promise<void> {\n if (instance) {\n await instance.dispose();\n instance = null;\n }\n}\n","/**\n * SessionStorage — environment-agnostic persistence adapter for the\n * Semiont session layer. Decouples `SemiontSession` / `SemiontBrowser`\n * from `localStorage` / `window` so the same classes can run in a\n * browser, a CLI process, or tests without environment guards.\n *\n * Implementations shipped here:\n * - `InMemorySessionStorage` — map-backed, for tests.\n *\n * Browser-backed (`WebBrowserStorage`) lives in `@semiont/react-ui`\n * because it touches browser-only globals.\n */\n\n/** String key/value store with optional cross-context change subscription. */\nexport interface SessionStorage {\n /** Read a string value; null if absent. */\n get(key: string): string | null;\n /** Write a string value. */\n set(key: string, value: string): void;\n /** Remove a key. No-op if absent. */\n delete(key: string): void;\n /**\n * Optional: subscribe to external changes (cross-tab, cross-process).\n * Browser implements via the `storage` event; filesystem would use\n * fs.watch; in-memory omits this method. Returns an unsubscribe\n * callback. If omitted, cross-context sync simply isn't available\n * in that environment — the session still works correctly within a\n * single process.\n */\n subscribe?(handler: (key: string, newValue: string | null) => void): () => void;\n}\n\n/**\n * Map-backed `SessionStorage`. Cross-context sync is not implemented;\n * tests that need it can drive it manually.\n */\nexport class InMemorySessionStorage implements SessionStorage {\n private readonly map = new Map<string, string>();\n\n get(key: string): string | null {\n return this.map.has(key) ? this.map.get(key)! : null;\n }\n\n set(key: string, value: string): void {\n this.map.set(key, value);\n }\n\n delete(key: string): void {\n this.map.delete(key);\n }\n}\n","/**\n * KnowledgeBase — a connection to a Semiont knowledge system.\n *\n * The KB type itself is uniform. The transport-shape variation lives in\n * the nested `endpoint` field, which is a discriminated union:\n *\n * - `endpoint.kind === 'http'` — a remote backend reached over HTTP+SSE.\n * Carries `host`/`port`/`protocol`.\n * - `endpoint.kind === 'local'` — an in-process knowledge system reached\n * via `LocalTransport` from\n * `@semiont/make-meaning`. Carries an\n * opaque `kbId` identifying the local\n * instance to the host process.\n *\n * Code that doesn't know how to make a transport (`SemiontSession`,\n * `SemiontBrowser`, the frontend KB list UI) treats `KnowledgeBase` as\n * uniform and never inspects `endpoint`. Code that *does* construct\n * transports (the transport-factory passed to `SemiontBrowser`,\n * `kbBackendUrl` for HTTP URL construction) inspects `endpoint.kind`\n * and dispatches.\n *\n * Each KB has its own session, its own credentials (where applicable),\n * and its own JWT (HTTP only). The user is \"authenticated against KB X\" —\n * never globally authenticated.\n */\n\n/** Fields shared by every KB regardless of endpoint kind. */\nexport interface KnowledgeBase {\n id: string;\n label: string;\n email: string;\n gitBranch?: string;\n endpoint: KbEndpoint;\n}\n\nexport type KbEndpoint = HttpEndpoint | LocalEndpoint;\n\nexport interface HttpEndpoint {\n kind: 'http';\n host: string;\n port: number;\n protocol: 'http' | 'https';\n}\n\nexport interface LocalEndpoint {\n kind: 'local';\n /** Opaque identifier for the in-process KB instance the host has loaded. */\n kbId: string;\n}\n\n/**\n * Input shape for adding a new KB. The id is generated by the provider.\n */\nexport type NewKnowledgeBase = Omit<KnowledgeBase, 'id'>;\n\n/**\n * Status of the locally-stored credential for a KB. Derived from the\n * presence and validity of the JWT in session storage.\n */\nexport type KbSessionStatus = 'authenticated' | 'expired' | 'signed-out' | 'unreachable';\n\n/**\n * Construct a `KnowledgeBase` for an HTTP-backed Semiont backend without\n * spelling out the nested `endpoint` literal. Convenience for tests,\n * worker bootstraps, and one-off scripts.\n *\n * ```ts\n * const kb = httpKb({\n * id: 'my-watcher',\n * label: 'My Watcher',\n * email: 'me@example.com',\n * host: 'localhost',\n * port: 4000,\n * protocol: 'http',\n * });\n * ```\n *\n * Equivalent to:\n *\n * ```ts\n * const kb: KnowledgeBase = {\n * id, label, email,\n * endpoint: { kind: 'http', host, port, protocol },\n * };\n * ```\n *\n * UI hosts that have a structured form (host / port / protocol pickers)\n * already construct the literal directly — they don't need this helper.\n * Local-endpoint KBs construct the literal directly too; the local\n * endpoint shape (`{ kind: 'local', kbId }`) is one line and doesn't\n * earn a helper.\n */\nexport function httpKb(opts: {\n id: string;\n label: string;\n email: string;\n host: string;\n port: number;\n protocol: 'http' | 'https';\n gitBranch?: string;\n}): KnowledgeBase {\n const { id, label, email, host, port, protocol, gitBranch } = opts;\n return {\n id,\n label,\n email,\n ...(gitBranch !== undefined ? { gitBranch } : {}),\n endpoint: { kind: 'http', host, port, protocol },\n };\n}\n","import { Subscription } from 'rxjs';\n\n/**\n * Marker for the state-unit pattern: a stateful, lifecycled object with an\n * RxJS-shaped public surface, constructed by a factory function\n * (`createFooStateUnit`), with internal state held in a closure.\n *\n * The structural contract is `dispose()` — the rest of the pattern\n * (closure-based identity, Observable public surface, internal Subjects\n * exposed as `.asObservable()` views, no leaked subscriptions, composition\n * by parameter rather than ownership) is convention enforced by review,\n * not the type system.\n *\n * See `packages/sdk/docs/STATE-UNITS.md` for the full axioms and rationale.\n */\nexport interface StateUnit {\n /**\n * Idempotent, total teardown. Completes every Subject the unit owns,\n * unsubscribes every internal subscription, releases timers / abort\n * controllers / network handles. Safe to call multiple times — the\n * second call is a no-op.\n */\n dispose(): void;\n}\n\n/**\n * Compose multiple disposers into a single `dispose()` call. Accepts either\n * a `StateUnit` (whose `dispose()` will be invoked) or a plain teardown\n * function. The returned object is itself disposable; call its `dispose()`\n * once to tear down everything that was added.\n */\nexport function createDisposer(): {\n add(item: StateUnit | (() => void)): void;\n dispose(): void;\n} {\n const sub = new Subscription();\n return {\n add: (item) =>\n sub.add(typeof item === 'function' ? item : () => item.dispose()),\n dispose: () => sub.unsubscribe(),\n };\n}\n","/**\n * createSearchPipeline\n *\n * A debounced-search RxJS pipeline factory. Combines an input Subject with a\n * downstream fetch function and emits typed `{ results, isSearching }` state.\n *\n * Designed to be created once per consumer instance and held for its lifetime\n * (e.g. by a view layer's lazy initializer), then observed via `state$`. The\n * pipeline is pure RxJS — unit-testable without any view-layer dependency.\n *\n * The fetch function is expected to return `Observable<T[] | undefined>`,\n * matching the cache-miss-then-data shape of `BrowseNamespace` Observables:\n * `undefined` means \"fetch in flight, no value yet\"; an array means \"data\n * available (possibly empty)\".\n */\n\nimport { Subject, of, type Observable } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, startWith, map } from 'rxjs/operators';\n\nexport interface SearchState<T> {\n results: T[];\n isSearching: boolean;\n}\n\nexport interface SearchPipeline<T> {\n /** Latest query string. Bind to a controlled input. */\n query$: Observable<string>;\n /** Latest search state — results plus a loading flag. */\n state$: Observable<SearchState<T>>;\n /** Push a new query value. Triggers the debounced fetch. */\n setQuery(value: string): void;\n /** Tear down the input Subject. Call from the consumer's cleanup hook. */\n dispose(): void;\n}\n\nexport interface SearchPipelineOptions {\n /** Milliseconds to wait after the last keystroke before fetching. Default 250. */\n debounceMs?: number;\n /** Initial query value. Useful for modals that open with a pre-filled term. */\n initialQuery?: string;\n}\n\nexport function createSearchPipeline<T>(\n fetch: (query: string) => Observable<T[] | undefined>,\n options: SearchPipelineOptions = {},\n): SearchPipeline<T> {\n const debounceMs = options.debounceMs ?? 250;\n const initial = options.initialQuery ?? '';\n const input$ = new Subject<string>();\n\n const query$: Observable<string> = input$.pipe(startWith(initial));\n\n const state$: Observable<SearchState<T>> = input$.pipe(\n startWith(initial),\n debounceTime(debounceMs),\n distinctUntilChanged(),\n switchMap((q): Observable<SearchState<T>> => {\n const trimmed = q.trim();\n if (!trimmed) {\n return of({ results: [], isSearching: false });\n }\n return fetch(trimmed).pipe(\n map((results): SearchState<T> => ({\n results: results ?? [],\n isSearching: results === undefined,\n })),\n startWith({ results: [], isSearching: true } as SearchState<T>),\n );\n }),\n );\n\n return {\n query$,\n state$,\n setQuery: (value) => input$.next(value),\n dispose: () => input$.complete(),\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport type { AnnotationId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface BeckonStateUnit extends StateUnit {\n hoveredAnnotationId$: Observable<AnnotationId | null>;\n hover(annotationId: AnnotationId | null): void;\n focus(annotationId: AnnotationId): void;\n sparkle(annotationId: AnnotationId): void;\n}\n\nexport function createBeckonStateUnit(client: SemiontClient): BeckonStateUnit {\n const subs: Subscription[] = [];\n const hovered$ = new BehaviorSubject<AnnotationId | null>(null);\n\n subs.push(client.bus.get('beckon:hover').subscribe(({ annotationId }) => {\n hovered$.next(annotationId as AnnotationId | null);\n if (annotationId) {\n client.bus.get('beckon:sparkle').next({ annotationId });\n }\n }));\n\n subs.push(client.bus.get('browse:click').subscribe(({ annotationId }) => {\n client.bus.get('beckon:focus').next({ annotationId });\n }));\n\n return {\n hoveredAnnotationId$: hovered$.asObservable(),\n hover: (annotationId) => client.bus.get('beckon:hover').next({ annotationId }),\n focus: (annotationId) => client.bus.get('beckon:focus').next({ annotationId }),\n sparkle: (annotationId) => client.bus.get('beckon:sparkle').next({ annotationId }),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n hovered$.complete();\n },\n };\n}\n\n/** Default milliseconds the mouse must dwell before beckon:hover is emitted. */\nexport const HOVER_DELAY_MS = 150;\n\ntype EmitHover = (annotationId: AnnotationId | null) => void;\n\nexport interface HoverHandlers {\n handleMouseEnter: (annotationId: AnnotationId) => void;\n handleMouseLeave: () => void;\n cleanup: () => void;\n}\n\nexport function createHoverHandlers(emit: EmitHover, delayMs: number): HoverHandlers {\n let currentHover: AnnotationId | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cancelTimer = () => {\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n };\n\n const handleMouseEnter = (annotationId: AnnotationId) => {\n if (currentHover === annotationId) return;\n cancelTimer();\n timer = setTimeout(() => {\n timer = null;\n currentHover = annotationId;\n emit(annotationId);\n }, delayMs);\n };\n\n const handleMouseLeave = () => {\n cancelTimer();\n if (currentHover !== null) {\n currentHover = null;\n emit(null);\n }\n };\n\n return { handleMouseEnter, handleMouseLeave, cleanup: cancelTimer };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { GatheredContext, ResourceId, AnnotationId } from '@semiont/core';\nimport { annotationId as makeAnnotationId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface GatherStateUnit extends StateUnit {\n context$: Observable<GatheredContext | null>;\n loading$: Observable<boolean>;\n error$: Observable<Error | null>;\n annotationId$: Observable<AnnotationId | null>;\n}\n\nexport function createGatherStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n): GatherStateUnit {\n const subs: Subscription[] = [];\n const context$ = new BehaviorSubject<GatheredContext | null>(null);\n const loading$ = new BehaviorSubject<boolean>(false);\n const error$ = new BehaviorSubject<Error | null>(null);\n const annotationId$ = new BehaviorSubject<AnnotationId | null>(null);\n\n subs.push(client.bus.get('gather:requested').subscribe((event) => {\n loading$.next(true);\n error$.next(null);\n context$.next(null);\n annotationId$.next(makeAnnotationId(event.annotationId));\n\n const gatherSub = client.gather.annotation(\n resourceId,\n makeAnnotationId(event.annotationId),\n { contextWindow: event.options?.contextWindow ?? 2000 },\n ).pipe(\n timeout(60_000),\n ).subscribe({\n next: (progress) => {\n if ('response' in progress && progress.response) {\n context$.next(\n (progress as { response: { context: GatheredContext } }).response.context ?? null,\n );\n loading$.next(false);\n }\n },\n error: (err) => {\n error$.next(err instanceof Error ? err : new Error(String(err)));\n loading$.next(false);\n },\n complete: () => {\n loading$.next(false);\n },\n });\n subs.push(gatherSub);\n }));\n\n return {\n context$: context$.asObservable(),\n loading$: loading$.asObservable(),\n error$: error$.asObservable(),\n annotationId$: annotationId$.asObservable(),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n context$.complete();\n loading$.complete();\n error$.complete();\n annotationId$.complete();\n },\n };\n}\n","import type { Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, GatheredContext } from '@semiont/core';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\nexport interface MatchStateUnit extends StateUnit {}\n\nexport function createMatchStateUnit(\n client: SemiontClient,\n _resourceId: ResourceId,\n): MatchStateUnit {\n const subs: Subscription[] = [];\n\n subs.push(client.bus.get('match:search-requested').subscribe((event) => {\n const searchSub = client.match.search(\n makeResourceId(event.resourceId),\n makeAnnotationId(event.referenceId),\n event.context as GatheredContext,\n { limit: event.limit, useSemanticScoring: event.useSemanticScoring },\n ).pipe(\n timeout(60_000),\n ).subscribe({\n next: (result) => client.bus.get('match:search-results').next(result),\n error: (err) => client.bus.get('match:search-failed').next({\n correlationId: event.correlationId,\n referenceId: event.referenceId,\n error: err instanceof Error ? err.message : String(err),\n }),\n });\n subs.push(searchSub);\n }));\n\n return {\n dispose() {\n subs.forEach(s => s.unsubscribe());\n },\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, GatheredContext, components } from '@semiont/core';\nimport { annotationId as makeAnnotationId, resourceId as makeResourceId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface GenerateDocumentOptions {\n title: string;\n storageUri: string;\n prompt?: string;\n /** Body locale — language the generated resource is written in. Falls back to the state unit's UI locale when unset. */\n language?: string;\n /** Source-resource locale — language of the resource the annotation lives on. Forwarded to the prompt for context-snippet awareness. BCP-47. */\n sourceLanguage?: string;\n temperature?: number;\n maxTokens?: number;\n context: GatheredContext;\n}\n\nexport interface YieldStateUnit extends StateUnit {\n isGenerating$: Observable<boolean>;\n progress$: Observable<JobProgress | null>;\n generate(referenceId: string, options: GenerateDocumentOptions): void;\n}\n\nexport function createYieldStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n): YieldStateUnit {\n const subs: Subscription[] = [];\n const isGenerating$ = new BehaviorSubject<boolean>(false);\n const progress$ = new BehaviorSubject<JobProgress | null>(null);\n let clearTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Generation progress/complete/fail is driven entirely by the\n // Observable returned from `client.yield.fromAnnotation` — that\n // Observable is filtered to this specific job's jobId internally.\n // No direct bus subscription needed here.\n const generate = (referenceId: string, options: GenerateDocumentOptions): void => {\n const genSub = client.yield.fromAnnotation(\n makeResourceId(resourceId as string),\n makeAnnotationId(referenceId),\n { ...options, language: options.language || locale },\n ).pipe(\n timeout({ each: 300_000 }),\n ).subscribe({\n next: (e) => {\n // Surface live progress to the UI; `complete` events carry the\n // final job result for awaiting callers but produce no extra\n // panel signal here (the `complete` callback fires next).\n if (e.kind === 'progress') {\n progress$.next(e.data);\n isGenerating$.next(true);\n }\n },\n complete: () => {\n isGenerating$.next(false);\n if (clearTimer) clearTimeout(clearTimer);\n clearTimer = setTimeout(() => { progress$.next(null); clearTimer = null; }, 2000);\n },\n error: () => {\n progress$.next(null);\n isGenerating$.next(false);\n },\n });\n subs.push(genSub);\n };\n\n return {\n isGenerating$: isGenerating$.asObservable(),\n progress$: progress$.asObservable(),\n generate,\n dispose() {\n subs.forEach(s => s.unsubscribe());\n if (clearTimer) clearTimeout(clearTimer);\n isGenerating$.complete();\n progress$.complete();\n },\n };\n}\n","import { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport type { ResourceId, Motivation, Selector, EventMap, components } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { StateUnit } from '../lib/state-unit';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface PendingAnnotation {\n selector: Selector | Selector[];\n motivation: Motivation;\n}\n\nexport interface MarkStateUnit extends StateUnit {\n pendingAnnotation$: Observable<PendingAnnotation | null>;\n assistingMotivation$: Observable<Motivation | null>;\n progress$: Observable<JobProgress | null>;\n}\n\ntype SelectionData = EventMap['mark:select-comment'];\n\nfunction selectionToSelector(selection: SelectionData): Selector | Selector[] {\n if (selection.svgSelector) return { type: 'SvgSelector', value: selection.svgSelector };\n if (selection.fragmentSelector) {\n const selectors: Selector[] = [{ type: 'FragmentSelector', value: selection.fragmentSelector, ...(selection.conformsTo && { conformsTo: selection.conformsTo }) }];\n if (selection.exact) selectors.push({ type: 'TextQuoteSelector', exact: selection.exact, ...(selection.prefix && { prefix: selection.prefix }), ...(selection.suffix && { suffix: selection.suffix }) });\n return selectors;\n }\n return { type: 'TextQuoteSelector', exact: selection.exact, ...(selection.prefix && { prefix: selection.prefix }), ...(selection.suffix && { suffix: selection.suffix }) };\n}\n\nexport function createMarkStateUnit(\n client: SemiontClient,\n resourceId: ResourceId,\n): MarkStateUnit {\n const subs: Subscription[] = [];\n const pendingAnnotation$ = new BehaviorSubject<PendingAnnotation | null>(null);\n const assistingMotivation$ = new BehaviorSubject<Motivation | null>(null);\n const progress$ = new BehaviorSubject<JobProgress | null>(null);\n let progressDismissTimer: ReturnType<typeof setTimeout> | null = null;\n\n const clearProgressTimer = () => {\n if (progressDismissTimer) { clearTimeout(progressDismissTimer); progressDismissTimer = null; }\n };\n\n // The view layer is responsible for opening the annotations panel in\n // response to `pendingAnnotation$` becoming non-null. The state unit stays pure:\n // it updates state; UI side-effects (opening panels on the app-scoped\n // bus) belong in the view layer, where the host's bus emit is accessible.\n const handleAnnotationRequested = (pending: PendingAnnotation) => {\n pendingAnnotation$.next(pending);\n };\n\n // Selection events → pending annotation\n subs.push(client.bus.get('mark:requested').subscribe(handleAnnotationRequested));\n subs.push(client.bus.get('mark:select-comment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'commenting' })));\n subs.push(client.bus.get('mark:select-tag').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'tagging' })));\n subs.push(client.bus.get('mark:select-assessment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'assessing' })));\n subs.push(client.bus.get('mark:select-reference').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'linking' })));\n\n subs.push(client.bus.get('mark:cancel-pending').subscribe(() => pendingAnnotation$.next(null)));\n subs.push(client.bus.get('mark:create-ok').subscribe(() => pendingAnnotation$.next(null)));\n\n // CRUD bridging\n subs.push(client.bus.get('mark:submit').subscribe(async (event) => {\n try {\n const result = await client.mark.annotation({\n motivation: event.motivation,\n target: { source: resourceId, selector: event.selector as Selector },\n body: event.body,\n });\n client.bus.get('mark:create-ok').next({ annotationId: result.annotationId });\n } catch (error) {\n client.bus.get('mark:create-failed').next({ message: error instanceof Error ? error.message : String(error) });\n }\n }));\n\n subs.push(client.bus.get('mark:delete').subscribe(async (event) => {\n try {\n await client.mark.delete(resourceId, event.annotationId as Parameters<typeof client.mark.delete>[1]);\n client.bus.get('mark:delete-ok').next({ annotationId: event.annotationId });\n } catch (error) {\n client.bus.get('mark:delete-failed').next({ message: error instanceof Error ? error.message : String(error) });\n }\n }));\n\n // AI assist. The assist() Observable encapsulates the full job\n // lifecycle — it subscribes to job:report-progress/complete/fail\n // filtered by its own jobId, emits JobProgress on `next`, completes\n // on `job:complete`, errors on `job:fail`. mark-state-unit's only job is to\n // drive the three UI observables from that stream.\n subs.push(client.bus.get('mark:assist-request').subscribe((event) => {\n clearProgressTimer();\n assistingMotivation$.next(event.motivation);\n progress$.next(null);\n\n const assistSub = client.mark.assist(resourceId, event.motivation, event.options).pipe(\n timeout({ each: 180_000 }),\n ).subscribe({\n next: (e) => {\n // Surface only the live progress events to the UI; the final\n // `complete` event carries `result` for callers awaiting the\n // Observable, but the panel just dismisses on `complete`.\n if (e.kind === 'progress') progress$.next(e.data);\n },\n complete: () => {\n assistingMotivation$.next(null);\n clearProgressTimer();\n progressDismissTimer = setTimeout(() => {\n progress$.next(null);\n progressDismissTimer = null;\n }, 5000);\n },\n error: () => {\n clearProgressTimer();\n assistingMotivation$.next(null);\n progress$.next(null);\n },\n });\n subs.push(assistSub);\n }));\n\n subs.push(client.bus.get('mark:progress-dismiss').subscribe(() => {\n clearProgressTimer();\n progress$.next(null);\n }));\n\n return {\n pendingAnnotation$: pendingAnnotation$.asObservable(),\n assistingMotivation$: assistingMotivation$.asObservable(),\n progress$: progress$.asObservable(),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n clearProgressTimer();\n pendingAnnotation$.complete();\n assistingMotivation$.complete();\n progress$.complete();\n },\n };\n}\n"]}
|