@semiont/sdk 0.4.22 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -30
- package/dist/index.d.ts +237 -52
- package/dist/index.js +366 -174
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/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/notify.ts","../src/session/frontend-session-signals.ts","../src/session/semiont-browser.ts","../src/session/registry.ts","../src/session/session-storage.ts","../src/view-models/lib/view-model.ts","../src/view-models/lib/search-pipeline.ts","../src/view-models/flows/beckon-vm.ts","../src/view-models/flows/shell-vm.ts","../src/view-models/flows/gather-vm.ts","../src/view-models/flows/match-vm.ts","../src/view-models/flows/yield-vm.ts","../src/view-models/flows/mark-vm.ts","../src/view-models/domain/discover-vm.ts","../src/view-models/domain/entity-tags-vm.ts","../src/view-models/domain/exchange-vm.ts","../src/view-models/domain/admin-users-vm.ts","../src/view-models/domain/admin-security-vm.ts","../src/view-models/domain/welcome-vm.ts","../src/view-models/domain/resource-loader-vm.ts","../src/view-models/domain/session-vm.ts","../src/view-models/domain/smelter-actor-vm.ts","../src/view-models/domain/job-claim-adapter.ts","../src/view-models/domain/job-queue-vm.ts","../src/view-models/pages/resource-viewer-page-vm.ts","../src/view-models/pages/compose-page-vm.ts"],"names":["map","makeAnnotationId","makeResourceId","Observable","filter","merge","takeUntil","timeout","makeEmail","makeRefreshToken","BehaviorSubject","EventBus","HttpTransport","HttpContentTransport","Subject","distinctUntilChanged","resourceId","take","firstValueFrom","decodeWithCharset","response"],"mappings":"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","file":"index.js","sourcesContent":["import { Observable, firstValueFrom, merge } from 'rxjs';\nimport { filter, map, take, timeout } from 'rxjs/operators';\nimport type { EventMap } from '@semiont/core';\n\nexport class BusRequestError extends Error {\n constructor(message: string) {\n super(message);\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) => ({ ok: false as const, error: new BusRequestError(e.message as string) })),\n ),\n ).pipe(take(1), timeout(timeoutMs));\n\n const resultPromise = firstValueFrom(result$);\n\n await bus.emit(emitChannel as keyof EventMap, fullPayload as EventMap[keyof EventMap]);\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/api-client/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 * Shape:\n * - `observe(key)`: returns an Observable<V | undefined> that triggers\n * a fetch on first subscription for a missing key, dedup-joins any\n * concurrent fetch, and emits the stored value thereafter.\n * - `invalidate(key)`: stale-while-revalidate — keeps the current\n * value visible to observers, clears the in-flight guard, starts a\n * fresh fetch. If the previous fetch was orphaned (SSE torn down,\n * response lost), this is how the cache recovers.\n * - `remove(key)`: drops the cache entry entirely. Used for entity\n * deletions (B13a). No refetch.\n * - `set(key, value)`: writes through without a fetch. Used when a\n * bus event carries the new value inline (B13b).\n * - `invalidateAll()`: per-key SWR refetch of every currently-cached\n * entry. Used by gap-detection paths.\n * - `dispose()`: completes the store so observers unsubscribe.\n *\n * What's deliberately out:\n * - No subscriber ref-counting / GC of unobserved keys. The per-key\n * observable memo grows with the set of observed keys for the cache's\n * lifetime (B11). Acceptable 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\n * (B6); the caller drives retry via invalidate.\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs';\n\nexport interface Cache<K, V> {\n /** Observable stream of the value at `key`. Triggers a fetch if not cached. */\n observe(key: K): Observable<V | undefined>;\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 const inflight = new Set<K>();\n const obsCache = new Map<K, Observable<V | undefined>>();\n\n const doFetch = async (key: K): Promise<void> => {\n // In-flight guard: concurrent first-observations deduplicate (B3).\n // `invalidate` clears the guard before calling doFetch, which is the\n // orphan-recovery mechanism documented in B7 and B9.\n if (inflight.has(key)) return;\n inflight.add(key);\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 } catch {\n // B6: fetch failure leaves the previous state intact. Observer\n // that was seeing `undefined` stays at `undefined`; observer\n // that was seeing a stale value keeps the stale value.\n } finally {\n inflight.delete(key);\n }\n };\n\n return {\n observe(key: K): Observable<V | undefined> {\n if (!store$.value.has(key) && !inflight.has(key)) {\n void doFetch(key);\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 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 doFetch(key);\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 doFetch(key);\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 { 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 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 = { limit?: number; archived?: boolean; search?: string };\n\n/** Sentinel key for the singleton entity-types cache. */\nconst ENTITY_TYPES_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/api-client/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 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 constructor(\n private readonly transport: ITransport,\n private readonly bus: EventBus,\n private readonly content: IContentTransport,\n ) {\n // TEMPORARY DIAGNOSTIC — BrowseNamespace instance counter.\n const g = globalThis as { __SEMIONT_BROWSE_INSTANCES__?: number };\n g.__SEMIONT_BROWSE_INSTANCES__ = (g.__SEMIONT_BROWSE_INSTANCES__ ?? 0) + 1;\n const browseSerial = g.__SEMIONT_BROWSE_INSTANCES__;\n (this as unknown as { __serial__: number }).__serial__ = browseSerial;\n // eslint-disable-next-line no-console\n console.debug(`[diag] BrowseNamespace #${browseSerial} constructed`);\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 { search, archived: filters.archived, limit: filters.limit ?? 100, offset: 0 },\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 serial = (this as unknown as { __serial__: number }).__serial__;\n // eslint-disable-next-line no-console\n console.debug(`[diag] BrowseNamespace#${serial} entityTypes fetchFn START`);\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 // eslint-disable-next-line no-console\n console.debug(`[diag] BrowseNamespace#${serial} entityTypes fetchFn RESOLVE`, JSON.stringify(result.entityTypes).slice(0, 200));\n return result.entityTypes;\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 // ── Live queries ────────────────────────────────────────────────────────\n\n resource(resourceId: ResourceId): Observable<ResourceDescriptor | undefined> {\n return this.resourceCache.observe(resourceId);\n }\n\n resources(filters?: ResourceListFilters): Observable<ResourceDescriptor[] | undefined> {\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 this.resourceListCache.observe(key);\n }\n\n annotations(resourceId: ResourceId): Observable<Annotation[] | undefined> {\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 obs;\n }\n\n annotation(resourceId: ResourceId, annotationId: AnnotationId): Observable<Annotation | undefined> {\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 this.annotationDetailCache.observe(annotationId);\n }\n\n entityTypes(): Observable<string[] | undefined> {\n const serial = (this as unknown as { __serial__: number }).__serial__;\n // eslint-disable-next-line no-console\n console.debug(`[diag] BrowseNamespace#${serial} entityTypes() called`);\n // Memo the instrumented observable once — calling .pipe(...) on every\n // invocation would return a fresh reference and violate B4 (per-key\n // observable stability). One-shot emission logging is attached here.\n const self = this as unknown as { __entityTypesDiag__?: Observable<string[] | undefined> };\n if (!self.__entityTypesDiag__) {\n self.__entityTypesDiag__ = this.entityTypesCache.observe(ENTITY_TYPES_KEY).pipe(map((v) => {\n // eslint-disable-next-line no-console\n console.debug(`[diag] BrowseNamespace#${serial} entityTypes$ EMIT`, v === undefined ? 'undefined' : JSON.stringify(v).slice(0, 200));\n return v;\n }));\n }\n return self.__entityTypesDiag__;\n }\n\n referencedBy(resourceId: ResourceId): Observable<ReferencedByEntry[] | undefined> {\n return this.referencedByCache.observe(resourceId);\n }\n\n events(resourceId: ResourceId): Observable<StoredEventResponse[] | undefined> {\n return this.resourceEventsCache.observe(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 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 is a KB-wide list — always refetch on any gap.\n this.invalidateEntityTypes();\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('mark:entity-type-added', () => this.invalidateEntityTypes());\n }\n}\n","import { Observable, merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\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 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(resourceId: ResourceId, input: CreateAnnotationInput): Promise<{ annotationId: string }> {\n return busRequest<{ annotationId: string }>(\n this.transport,\n 'mark:create-request',\n { resourceId, request: input as unknown as Record<string, unknown> },\n 'mark:create-ok',\n 'mark:create-failed',\n );\n }\n\n async delete(resourceId: ResourceId, annotationId: AnnotationId): Promise<void> {\n await this.transport.emit('mark:delete', { annotationId, resourceId });\n }\n\n async entityType(type: string): Promise<void> {\n await this.transport.emit('mark:add-entity-type', { tag: type });\n }\n\n async entityTypes(types: string[]): Promise<void> {\n for (const tag of types) {\n await this.transport.emit('mark:add-entity-type', { tag });\n }\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): Observable<MarkAssistEvent> {\n return new Observable((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\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 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-vm 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, string> = {\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 || !options.categories?.length) throw new Error('Tag assist requires schemaId and categories');\n } else if (motivation === 'linking') {\n if (!options.entityTypes?.length) throw new Error('Reference assist requires entityTypes');\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.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-vm subscribes via the local bus.\n this.bus.get('bind:initiate').next(input);\n }\n}\n","import { Observable, 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 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 annotationId: AnnotationId,\n resourceId: ResourceId,\n options?: { contextWindow?: number },\n ): Observable<GatherAnnotationProgress> {\n return new Observable((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 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 ): Observable<GatherAnnotationProgress> {\n throw new Error('Not implemented: gather.resource() — no backend route yet');\n }\n}\n","import { Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { ResourceId, GatheredContext, EventBus, components } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\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-vm subscribes via the local bus.\n this.bus.get('match:search-requested').next(input);\n }\n\n search(\n resourceId: ResourceId,\n referenceId: string,\n context: GatheredContext,\n options?: { limit?: number; useSemanticScoring?: boolean },\n ): Observable<MatchSearchProgress> {\n return new Observable((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 subscriber.error(error);\n });\n\n return () => {\n resultSub.unsubscribe();\n failedSub.unsubscribe();\n };\n });\n }\n}\n","import { Observable, merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport type {\n ResourceId,\n AnnotationId,\n EventBus,\n components,\n} from '@semiont/core';\n\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\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 async resource(data: CreateResourceInput): Promise<{ resourceId: string }> {\n const result = await this.content.putBinary({\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.creationMethod ? { creationMethod: data.creationMethod } : {}),\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 return { resourceId: result.resourceId as string };\n }\n\n fromAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options: GenerationOptions,\n ): Observable<YieldGenerationEvent> {\n return new Observable((subscriber) => {\n let done = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\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 language: options.language,\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 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: string }> {\n return busRequest<{ resourceId: string }>(\n this.transport,\n 'yield:clone-create',\n options as unknown as Record<string, unknown>,\n 'yield:clone-created',\n 'yield:clone-create-failed',\n );\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(annotationId: AnnotationId, resourceId: ResourceId): void {\n void this.transport.emit('beckon:focus', { annotationId, resourceId });\n }\n\n hover(annotationId: AnnotationId | null): void {\n // Local emit: beckon-vm 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","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. */\n get complete$(): Observable<EventMap['job:complete']> {\n return this.bus.get('job:complete');\n }\n\n /** Live stream of `job:fail` events. */\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 cancel(_jobId: JobId, type: string): Promise<void> {\n // Schema only carries jobType (cancels all pending jobs of that type).\n // The legacy per-job cancel was never wired on the backend.\n await this.transport.emit('job:cancel-requested', {\n jobType: (type === 'generation' ? 'generation' : 'annotation') as 'annotation' | 'generation',\n });\n }\n\n cancelRequest(jobType: 'annotation' | 'generation'): void {\n // Local emit: the batch-cancel widget fires this; a VM subscribes and\n // translates into individual cancels.\n this.bus.get('job:cancel-requested').next({ jobType });\n }\n}\n","/**\n * AuthNamespace — authentication. Pure wire, no bus.\n */\n\nimport type { ResourceId, components } from '@semiont/core';\nimport { email as makeEmail, googleCredential, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { ITransport } 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 transport: ITransport) {}\n\n async password(emailStr: string, passwordStr: string): Promise<AuthResponse> {\n return this.transport.authenticatePassword(makeEmail(emailStr), passwordStr);\n }\n\n async google(credential: string): Promise<AuthResponse> {\n return this.transport.authenticateGoogle(googleCredential(credential));\n }\n\n async refresh(token: string): Promise<TokenRefreshResponse> {\n return this.transport.refreshAccessToken(makeRefreshToken(token));\n }\n\n async logout(): Promise<void> {\n await this.transport.logout();\n }\n\n async me(): Promise<User> {\n return this.transport.getCurrentUser() as unknown as Promise<User>;\n }\n\n async acceptTerms(): Promise<void> {\n await this.transport.acceptTerms();\n }\n\n async mcpToken(): Promise<{ token: string }> {\n return this.transport.generateMcpToken();\n }\n\n async mediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.transport.getMediaToken(resourceId);\n }\n}\n","/**\n * AdminNamespace — administration. Pure wire, no bus.\n */\n\nimport type { UserDID, components, paths } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\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 transport: ITransport) {}\n\n async users(): Promise<User[]> {\n const result = await this.transport.listUsers();\n return (result as unknown as { users: User[] }).users;\n }\n\n async userStats(): Promise<AdminUserStatsResponse> {\n return this.transport.getUserStats();\n }\n\n async updateUser(userId: UserDID, data: RequestContent<paths['/api/admin/users/{id}']['patch']>): Promise<User> {\n const result = await this.transport.updateUser(userId, data as never);\n return (result as unknown as { user: User }).user;\n }\n\n async oauthConfig(): Promise<OAuthConfigResponse> {\n return this.transport.getOAuthConfig();\n }\n\n async healthCheck(): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.transport.healthCheck() as unknown as Promise<ResponseContent<paths['/api/health']['get']>>;\n }\n\n async status(): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.transport.getStatus() as unknown as Promise<ResponseContent<paths['/api/status']['get']>>;\n }\n\n async backup(): Promise<Response> {\n return this.transport.backupKnowledgeBase();\n }\n\n async restore(\n file: File,\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void,\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n return this.transport.restoreKnowledgeBase(file, onProgress);\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<Response> {\n return this.transport.exportKnowledgeBase(params);\n }\n\n async importKnowledgeBase(\n file: File,\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void,\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n return this.transport.importKnowledgeBase(file, onProgress);\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 { ResourceId, BaseUrl } from '@semiont/core';\nimport { EventBus } from '@semiont/core';\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 { JobNamespace } from './namespaces/job';\nimport { AuthNamespace } from './namespaces/auth';\nimport { AdminNamespace } from './namespaces/admin';\nimport type { ITransport, IContentTransport } from '@semiont/core';\n\n// Convenience re-exports of the HTTP adapters from @semiont/api-client so\n// consumers can `import { SemiontClient, HttpTransport } from '@semiont/sdk'`\n// without a separate api-client import. 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 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;\n public readonly admin: AdminNamespace;\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 constructor(transport: ITransport, content: IContentTransport) {\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.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 = new AuthNamespace(this.transport);\n this.admin = new AdminNamespace(this.transport);\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 subscribeToResource(resourceId: ResourceId): () => void {\n return this.transport.subscribeToResource(resourceId);\n }\n\n dispose(): void {\n this.transport.dispose();\n this.content.dispose();\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 { 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 migrateLegacyEntry(entry: any): KnowledgeBase {\n if (entry.host !== undefined) return entry as KnowledgeBase;\n // Legacy format: { id, label, backendUrl }\n try {\n const url = new URL(entry.backendUrl);\n return {\n id: entry.id,\n label: entry.label,\n host: url.hostname,\n port: parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n email: '',\n };\n } catch {\n return {\n id: entry.id,\n label: entry.label || 'Unknown',\n host: 'localhost',\n port: 4000,\n protocol: 'http',\n email: '',\n };\n }\n}\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 any[];\n return entries.map(migrateLegacyEntry);\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\nexport function kbBackendUrl(kb: KnowledgeBase): string {\n if (!isValidHostname(kb.host)) {\n throw new Error(`Invalid KB hostname: \"${kb.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 = kb.protocol + ':';\n url.hostname = kb.host;\n url.port = String(kb.port);\n return `${kb.protocol}://${url.hostname}:${kb.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\nexport type SemiontErrorCode =\n | 'session.construct-failed'\n | 'session.auth-failed'\n | 'session.refresh-exhausted'\n | 'browser.sign-in-failed';\n\nexport class SemiontError extends Error {\n readonly code: SemiontErrorCode;\n readonly kbId: string | null;\n\n constructor(code: SemiontErrorCode, message: string, kbId: string | null = null) {\n super(message);\n this.name = 'SemiontError';\n this.code = code;\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 `FrontendSessionSignals`, 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). The\n * frontend wires this to `FrontendSessionSignals.notifySessionExpired`\n * so the 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 type AccessToken,\n} from '@semiont/core';\nimport type { components, EventMap } from '@semiont/core';\nimport { SemiontClient, APIError } from '../client';\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 type StoredSession,\n} from './storage';\nimport { SemiontError } 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: SemiontError) => 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 /** 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: SemiontError) => 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\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 SemiontError(\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 SemiontError('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 * Module-scoped session-expired / permission-denied notifier.\n *\n * The active SemiontBrowser registers itself with this module-scoped slot\n * via {@link registerAuthNotifyHandlers}. Code outside the React tree\n * (notably the React Query QueryCache.onError handler in app providers)\n * calls {@link notifySessionExpired} or {@link notifyPermissionDenied} to\n * reach the active browser's session.\n *\n * When no browser has registered (e.g. before the singleton boots),\n * these calls are no-ops.\n *\n * No React imports — this is plain module state.\n */\n\ntype Notify = (message?: string) => void;\n\nlet activeOnSessionExpired: Notify | null = null;\nlet activeOnPermissionDenied: Notify | null = null;\n\nexport function notifySessionExpired(message?: string): void {\n activeOnSessionExpired?.(message);\n}\n\nexport function notifyPermissionDenied(message?: string): void {\n activeOnPermissionDenied?.(message);\n}\n\n/**\n * Install handlers for session-expired and permission-denied notifications.\n * Returns an unregister callback. The SemiontBrowser ctor calls this once;\n * `dispose()` calls the unregister.\n */\nexport function registerAuthNotifyHandlers(handlers: {\n onSessionExpired: Notify;\n onPermissionDenied: Notify;\n}): () => void {\n activeOnSessionExpired = handlers.onSessionExpired;\n activeOnPermissionDenied = handlers.onPermissionDenied;\n return () => {\n activeOnSessionExpired = null;\n activeOnPermissionDenied = null;\n };\n}\n","/**\n * FrontendSessionSignals — modal state that belongs to the UI, not\n * 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 *modals* only make sense\n * in a UI context. Keeping those observables on `SemiontSession`\n * meant workers and CLIs carried four dead BehaviorSubjects that\n * nothing would ever fire.\n *\n * `FrontendSessionSignals` owns the modal state and has no hard\n * reference to a session. `SemiontBrowser` constructs one alongside\n * every frontend session and wires:\n *\n * - `session.onAuthFailed` → `signals.notifySessionExpired` so\n * proactive-refresh failures surface as modals\n * - `notify` module handlers → the active signals' methods so\n * external callers (e.g. React Query's QueryCache.onError) can\n * trigger the modals without touching the session\n *\n * React consumers that need modal state subscribe here; consumers\n * 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 modal.\n */\n\nimport { BehaviorSubject } from 'rxjs';\n\nexport class FrontendSessionSignals {\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. Module-scoped singleton — survives every\n * React re-render, remount, and route change. `SemiontProvider` hands\n * the singleton to the React tree; `useSemiont()` returns it.\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 {\n EventBus,\n baseUrl,\n type AccessToken,\n type EventMap,\n} from '@semiont/core';\nimport { SemiontClient } from '../client';\nimport { HttpTransport } from '@semiont/api-client';\nimport { HttpContentTransport } from '@semiont/api-client';\nimport {\n ACTIVE_KEY,\n clearStoredSession,\n generateKbId,\n getStoredSession,\n isJwtExpired,\n kbBackendUrl,\n loadKnowledgeBases,\n saveKnowledgeBases,\n setStoredSession,\n} from './storage';\nimport { registerAuthNotifyHandlers } from './notify';\nimport type { KnowledgeBase, KbSessionStatus, NewKnowledgeBase } from './knowledge-base';\nimport type { OpenResource } from './open-resource';\nimport { SemiontSession, type UserInfo } from './semiont-session';\nimport { FrontendSessionSignals } from './frontend-session-signals';\nimport { SemiontError } from './errors';\nimport type { SessionStorage } from './session-storage';\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\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 [FrontendSessionSignals](./frontend-session-signals.ts).\n */\n readonly activeSignals$: BehaviorSubject<FrontendSessionSignals | 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<SemiontError>;\n readonly identityToken$: BehaviorSubject<string | null>;\n\n private readonly storage: SessionStorage;\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 unregisterNotify: (() => void) | null = null;\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n private activating: Promise<void> | null = null;\n /**\n * Per-KB in-flight refresh dedup. Simultaneous 401s for the same\n * KB converge on a single `/api/tokens/refresh` network call.\n * Was previously module-scoped in `refresh.ts`; moved here when\n * that file was deleted — SemiontBrowser is a singleton so the\n * scoping is equivalent.\n */\n private readonly inFlightRefreshes = new Map<string, Promise<string | null>>();\n\n constructor(config: SemiontBrowserConfig) {\n this.storage = config.storage;\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<FrontendSessionSignals | null>(null);\n this.sessionActivating$ = new BehaviorSubject<boolean>(false);\n this.openResources$ = new BehaviorSubject<OpenResource[]>(loadOpenResources(this.storage));\n this.error$ = new Subject<SemiontError>();\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 // Route notify-module calls (from outside-React code paths like the\n // React Query QueryCache.onError handler) into the active session's\n // modal signals.\n this.unregisterNotify = registerAuthNotifyHandlers({\n onSessionExpired: (message) => {\n this.activeSignals$.getValue()?.notifySessionExpired(message ?? null);\n },\n onPermissionDenied: (message) => {\n this.activeSignals$.getValue()?.notifyPermissionDenied(message ?? null);\n },\n });\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 (from NextAuth's useSession).\n * Called at the root layout via a single `useEffect`. No other site\n * in the codebase should call this.\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 updateKb(id: string, updates: Partial<KnowledgeBase>): 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 FrontendSessionSignals();\n\n // Build transport stack: caller (this) owns token$ and threads it\n // through transport (which reads it on every request) and session\n // (which writes refreshed values into it). The `tokenRefresher`\n // closure resolves `session` lazily — `session` is defined right\n // after, 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(kb)),\n token$,\n tokenRefresher: () => session.refresh().then((t) => t ?? null),\n });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content);\n session = new SemiontSession({\n kb,\n storage: this.storage,\n client,\n token$,\n refresh: () => this.performRefresh(kb),\n validate: (token) => this.performValidate(kb, token),\n onAuthFailed: (msg) => signals.notifySessionExpired(msg),\n onError: (err) => this.error$.next(err),\n });\n\n try {\n await session.ready;\n } catch (err) {\n this.error$.next(\n new SemiontError(\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 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 // ── Auth callbacks bound per session ──────────────────────────────────\n //\n // These closures back the `refresh` and `validate` callbacks passed\n // to `SemiontSession` in `setActiveKb`. Factored out as methods\n // (rather than inline in the activation closure) so test-doubles\n // can override them cleanly, and so the in-flight dedup map\n // survives across activations of the same KB.\n\n /**\n * Refresh the active KB's access token. Returns the new token on\n * success, null on failure. Concurrent calls for the same KB\n * dedupe through `inFlightRefreshes`, so simultaneous 401s trigger\n * only one `/api/tokens/refresh` round trip.\n *\n * Uses a throwaway `SemiontClient` with no `tokenRefresher` —\n * a refresh call returning 401 would otherwise re-enter this\n * function infinitely.\n */\n private async performRefresh(kb: KnowledgeBase): Promise<string | null> {\n const existing = this.inFlightRefreshes.get(kb.id);\n if (existing) return existing;\n\n const promise = (async () => {\n const stored = getStoredSession(this.storage, kb.id);\n if (!stored) return null;\n const throwawayTransport = new HttpTransport({ baseUrl: baseUrl(kbBackendUrl(kb)) });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(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(this.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 this.inFlightRefreshes.set(kb.id, promise);\n try {\n return await promise;\n } finally {\n this.inFlightRefreshes.delete(kb.id);\n }\n }\n\n /**\n * Validate an access token by calling `auth.me` on a throwaway\n * client. The session uses this once at startup to populate\n * `user$`; 401 triggers a refresh-then-retry inside the session.\n *\n * The throwaway transport is seeded with the specific token to\n * validate so the request actually carries it (HttpTransport\n * sources `Authorization` from its `token$`).\n */\n private async performValidate(kb: KnowledgeBase, token: AccessToken): Promise<UserInfo | null> {\n const tokenSubject = new BehaviorSubject<AccessToken | null>(token);\n const throwawayTransport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(kb)),\n token$: tokenSubject,\n });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(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 // ── Lifecycle ─────────────────────────────────────────────────────────\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n this.unregisterNotify?.();\n this.unregisterNotify = null;\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 * Module-scoped singleton for SemiontBrowser. Constructed lazily on first\n * `getBrowser()` call, survives every React re-render, remount, and route\n * change.\n *\n * The caller provides a `SessionStorage` implementation — there is no\n * default here because storage-backend selection is environment-specific\n * (browsers use `WebBrowserStorage`, CLI uses a filesystem adapter,\n * tests use `InMemorySessionStorage`). The first call to `getBrowser`\n * wins; subsequent calls return the cached instance regardless of the\n * storage passed.\n */\n\nimport { SemiontBrowser } from './semiont-browser';\nimport type { SessionStorage } from './session-storage';\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}\n\nexport function getBrowser(options: GetBrowserOptions): SemiontBrowser {\n if (!instance) {\n instance = new SemiontBrowser({ storage: options.storage });\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","import { Subscription } from 'rxjs';\n\nexport interface ViewModel {\n dispose(): void;\n}\n\nexport function createDisposer(): {\n add(vm: ViewModel | (() => 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 component instance via React's\n * `useState(() => createSearchPipeline(...))` lazy initializer, then consumed\n * via `useObservable(pipeline.state$)`. The pipeline holds no React state and\n * has no React imports — it's pure RxJS, unit-testable without a renderer.\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 via `useObservable`. */\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 `useEffect` cleanup. */\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 { ViewModel } from '../lib/view-model';\n\nexport interface BeckonVM extends ViewModel {\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 createBeckonVM(client: SemiontClient): BeckonVM {\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","/**\n * ShellVM — app-shell state: which toolbar panel is open, tab-bar\n * coordination helpers, scroll-to-annotation signals. Lives on\n * `SemiontBrowser`'s app-scoped bus (not the per-session client bus)\n * because panel toggles and shell chrome must work regardless of\n * whether a KB session is active.\n *\n * Channels: `panel:toggle`, `panel:open`, `panel:close`.\n */\n\nimport { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport type { SemiontBrowser } from '../../session/semiont-browser';\nimport type { ViewModel } from '../lib/view-model';\n\nexport type ToolbarPanelType = 'history' | 'info' | 'annotations' | 'settings' | 'collaboration' | 'user' | 'jsonld' | 'knowledge-base';\n\nexport const COMMON_PANELS: readonly ToolbarPanelType[] = ['knowledge-base', 'user', 'settings'] as const;\nexport const RESOURCE_PANELS: readonly ToolbarPanelType[] = ['history', 'info', 'annotations', 'collaboration', 'jsonld'] as const;\n\nconst MOTIVATION_TO_TAB: Record<string, string> = {\n 'linking': 'reference',\n 'commenting': 'comment',\n 'tagging': 'tag',\n 'highlighting': 'highlight',\n 'assessing': 'assessment',\n};\n\nlet tabGenerationCounter = 0;\n\nexport interface ShellVM extends ViewModel {\n activePanel$: Observable<ToolbarPanelType | null>;\n scrollToAnnotationId$: Observable<string | null>;\n panelInitialTab$: Observable<{ tab: string; generation: number } | null>;\n openPanel(panel: string): void;\n closePanel(): void;\n togglePanel(panel: string): void;\n onScrollCompleted(): void;\n}\n\nexport interface ShellVMOptions {\n initialPanel?: ToolbarPanelType | null;\n onPanelChange?: (panel: ToolbarPanelType | null) => void;\n}\n\nexport function createShellVM(browser: SemiontBrowser, options?: ShellVMOptions): ShellVM {\n const subs: Subscription[] = [];\n const activePanel$ = new BehaviorSubject<ToolbarPanelType | null>(options?.initialPanel ?? null);\n const scrollToAnnotationId$ = new BehaviorSubject<string | null>(null);\n const panelInitialTab$ = new BehaviorSubject<{ tab: string; generation: number } | null>(null);\n\n if (options?.onPanelChange) {\n const cb = options.onPanelChange;\n subs.push(activePanel$.subscribe(cb));\n }\n\n subs.push(browser.stream('panel:toggle').subscribe(({ panel }) => {\n const current = activePanel$.getValue();\n activePanel$.next(current === panel ? null : panel as ToolbarPanelType);\n }));\n\n subs.push(browser.stream('panel:open').subscribe(({ panel, scrollToAnnotationId, motivation }) => {\n if (scrollToAnnotationId) {\n scrollToAnnotationId$.next(scrollToAnnotationId);\n }\n if (motivation) {\n const tab = MOTIVATION_TO_TAB[motivation] || 'highlight';\n panelInitialTab$.next({ tab, generation: ++tabGenerationCounter });\n }\n activePanel$.next(panel as ToolbarPanelType);\n }));\n\n subs.push(browser.stream('panel:close').subscribe(() => {\n activePanel$.next(null);\n }));\n\n return {\n activePanel$: activePanel$.asObservable(),\n scrollToAnnotationId$: scrollToAnnotationId$.asObservable(),\n panelInitialTab$: panelInitialTab$.asObservable(),\n openPanel: (panel) => browser.emit('panel:open', { panel }),\n closePanel: () => browser.emit('panel:close', undefined),\n togglePanel: (panel) => browser.emit('panel:toggle', { panel }),\n onScrollCompleted: () => scrollToAnnotationId$.next(null),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n activePanel$.complete();\n scrollToAnnotationId$.complete();\n panelInitialTab$.complete();\n },\n };\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 { ViewModel } from '../lib/view-model';\n\nexport interface GatherVM extends ViewModel {\n context$: Observable<GatheredContext | null>;\n loading$: Observable<boolean>;\n error$: Observable<Error | null>;\n annotationId$: Observable<AnnotationId | null>;\n}\n\nexport function createGatherVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): GatherVM {\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 makeAnnotationId(event.annotationId),\n resourceId,\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 { resourceId as makeResourceId } from '@semiont/core';\nimport type { SemiontClient } from '../../client';\nimport type { ViewModel } from '../lib/view-model';\n\nexport interface MatchVM extends ViewModel {}\n\nexport function createMatchVM(\n client: SemiontClient,\n _resourceId: ResourceId,\n): MatchVM {\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 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 { ViewModel } from '../lib/view-model';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface GenerateDocumentOptions {\n title: string;\n storageUri: string;\n prompt?: string;\n language?: string;\n temperature?: number;\n maxTokens?: number;\n context: GatheredContext;\n}\n\nexport interface YieldVM extends ViewModel {\n isGenerating$: Observable<boolean>;\n progress$: Observable<JobProgress | null>;\n generate(referenceId: string, options: GenerateDocumentOptions): void;\n}\n\nexport function createYieldVM(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n): YieldVM {\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 { ViewModel } from '../lib/view-model';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface PendingAnnotation {\n selector: Selector | Selector[];\n motivation: Motivation;\n}\n\nexport interface MarkVM extends ViewModel {\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 createMarkVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): MarkVM {\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 VM stays pure:\n // it updates state; UI side-effects (opening panels on the browser-scoped\n // bus) live where the React tree has access to `useSemiont().emit(...)`.\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(resourceId, {\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-vm'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","import { map, type Observable } from 'rxjs';\nimport type { ResourceDescriptor } from '@semiont/core';\nimport type { ViewModel } from '../lib/view-model';\nimport { createDisposer } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport { createSearchPipeline, type SearchPipeline } from '../lib/search-pipeline';\nimport type { SemiontClient } from '../../client';\n\nconst RECENT_LIMIT = 10;\nconst SEARCH_LIMIT = 20;\n\nexport interface DiscoverVM extends ViewModel {\n browse: ShellVM;\n search: SearchPipeline<ResourceDescriptor>;\n recentResources$: Observable<ResourceDescriptor[]>;\n entityTypes$: Observable<string[]>;\n isLoadingRecent$: Observable<boolean>;\n}\n\nexport function createDiscoverVM(\n client: SemiontClient,\n browse: ShellVM,\n): DiscoverVM {\n const disposer = createDisposer();\n\n const search = createSearchPipeline<ResourceDescriptor>((q) =>\n client.browse.resources({ search: q, limit: SEARCH_LIMIT }),\n );\n disposer.add(search);\n disposer.add(browse);\n\n const recent$ = client.browse.resources({ limit: RECENT_LIMIT, archived: false });\n\n const recentResources$: Observable<ResourceDescriptor[]> = recent$.pipe(\n map((r) => r ?? []),\n );\n\n const isLoadingRecent$: Observable<boolean> = recent$.pipe(\n map((r) => r === undefined),\n );\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n return {\n browse,\n search,\n recentResources$,\n entityTypes$,\n isLoadingRecent$,\n dispose: () => disposer.dispose(),\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface EntityTagsVM extends ViewModel {\n browse: ShellVM;\n entityTypes$: Observable<string[]>;\n isLoading$: Observable<boolean>;\n newTag$: Observable<string>;\n error$: Observable<string>;\n isAdding$: Observable<boolean>;\n setNewTag(value: string): void;\n addTag(): Promise<void>;\n}\n\nexport function createEntityTagsVM(\n client: SemiontClient,\n browse: ShellVM,\n): EntityTagsVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const newTag$ = new BehaviorSubject<string>('');\n const error$ = new BehaviorSubject<string>('');\n const isAdding$ = new BehaviorSubject<boolean>(false);\n\n const raw$ = client.browse.entityTypes();\n const entityTypes$: Observable<string[]> = raw$.pipe(map((e) => e ?? []));\n const isLoading$: Observable<boolean> = raw$.pipe(map((e) => e === undefined));\n\n const addTag = async (): Promise<void> => {\n const tag = newTag$.getValue().trim();\n if (!tag) return;\n error$.next('');\n isAdding$.next(true);\n try {\n await client.mark.entityType(tag);\n newTag$.next('');\n } catch (err) {\n error$.next(err instanceof Error ? err.message : 'Failed to add entity type');\n } finally {\n isAdding$.next(false);\n }\n };\n\n return {\n browse,\n entityTypes$,\n isLoading$,\n newTag$: newTag$.asObservable(),\n error$: error$.asObservable(),\n isAdding$: isAdding$.asObservable(),\n setNewTag: (v) => newTag$.next(v),\n addTag,\n dispose: () => {\n newTag$.complete();\n error$.complete();\n isAdding$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\n\nexport interface ImportPreview {\n format: string;\n version: number;\n sourceUrl: string;\n stats: Record<string, number>;\n}\n\nexport interface ExchangeVM extends ViewModel {\n browse: ShellVM;\n selectedFile$: Observable<File | null>;\n preview$: Observable<ImportPreview | null>;\n importPhase$: Observable<string | null>;\n importMessage$: Observable<string | undefined>;\n importResult$: Observable<Record<string, unknown> | undefined>;\n isExporting$: Observable<boolean>;\n isImporting$: Observable<boolean>;\n selectFile(file: File): void;\n cancelImport(): void;\n doExport(): Promise<{ blob: Blob; filename: string }>;\n doImport(): Promise<void>;\n}\n\nexport function createExchangeVM(\n browse: ShellVM,\n exportFn: (params?: { includeArchived?: boolean }) => Promise<Response>,\n importFn: (file: File, options?: { onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void }) => Promise<{ phase: string; message?: string; result?: Record<string, unknown> }>,\n): ExchangeVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const selectedFile$ = new BehaviorSubject<File | null>(null);\n const preview$ = new BehaviorSubject<ImportPreview | null>(null);\n const importPhase$ = new BehaviorSubject<string | null>(null);\n const importMessage$ = new BehaviorSubject<string | undefined>(undefined);\n const importResult$ = new BehaviorSubject<Record<string, unknown> | undefined>(undefined);\n const isExporting$ = new BehaviorSubject<boolean>(false);\n const isImporting$ = new BehaviorSubject<boolean>(false);\n\n const selectFile = (file: File): void => {\n selectedFile$.next(file);\n importPhase$.next(null);\n importMessage$.next(undefined);\n importResult$.next(undefined);\n preview$.next({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-linked-data' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {} as Record<string, number>,\n });\n };\n\n const cancelImport = (): void => {\n selectedFile$.next(null);\n preview$.next(null);\n importPhase$.next(null);\n importMessage$.next(undefined);\n importResult$.next(undefined);\n };\n\n const doExport = async (): Promise<{ blob: Blob; filename: string }> => {\n isExporting$.next(true);\n try {\n const response = await exportFn();\n if (!response.ok) throw new Error(`Export failed: ${response.status} ${response.statusText}`);\n const blob = await response.blob();\n const contentDisposition = response.headers.get('Content-Disposition');\n const filename = contentDisposition?.match(/filename=\"(.+?)\"/)?.[1]\n ?? `semiont-export-${Date.now()}.tar.gz`;\n return { blob, filename };\n } finally {\n isExporting$.next(false);\n }\n };\n\n const doImport = async (): Promise<void> => {\n const file = selectedFile$.getValue();\n if (!file) return;\n isImporting$.next(true);\n importPhase$.next('started');\n importMessage$.next(undefined);\n importResult$.next(undefined);\n try {\n await importFn(file, {\n onProgress: (event) => {\n importPhase$.next(event.phase);\n importMessage$.next(event.message);\n if (event.result) importResult$.next(event.result);\n },\n });\n } finally {\n isImporting$.next(false);\n }\n };\n\n return {\n browse,\n selectedFile$: selectedFile$.asObservable(),\n preview$: preview$.asObservable(),\n importPhase$: importPhase$.asObservable(),\n importMessage$: importMessage$.asObservable(),\n importResult$: importResult$.asObservable(),\n isExporting$: isExporting$.asObservable(),\n isImporting$: isImporting$.asObservable(),\n selectFile,\n cancelImport,\n doExport,\n doImport,\n dispose: () => {\n selectedFile$.complete();\n preview$.complete();\n importPhase$.complete();\n importMessage$.complete();\n importResult$.complete();\n isExporting$.complete();\n isImporting$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { userDID } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface AdminUsersVM extends ViewModel {\n browse: ShellVM;\n users$: Observable<unknown[]>;\n stats$: Observable<unknown | null>;\n usersLoading$: Observable<boolean>;\n statsLoading$: Observable<boolean>;\n updateUser(id: string, data: { isAdmin?: boolean; isActive?: boolean }): Promise<void>;\n}\n\nexport function createAdminUsersVM(\n client: SemiontClient,\n browse: ShellVM,\n): AdminUsersVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const users$ = new BehaviorSubject<unknown[]>([]);\n const stats$ = new BehaviorSubject<unknown | null>(null);\n const usersLoading$ = new BehaviorSubject<boolean>(true);\n const statsLoading$ = new BehaviorSubject<boolean>(true);\n\n const fetchUsers = () => {\n usersLoading$.next(true);\n client.admin.users()\n .then((data) => {\n users$.next((data as { users?: unknown[] }).users ?? []);\n usersLoading$.next(false);\n })\n .catch(() => usersLoading$.next(false));\n };\n\n const fetchStats = () => {\n statsLoading$.next(true);\n client.admin.userStats()\n .then((data) => {\n stats$.next((data as { stats?: unknown }).stats ?? null);\n statsLoading$.next(false);\n })\n .catch(() => statsLoading$.next(false));\n };\n\n fetchUsers();\n fetchStats();\n\n const updateUser = async (id: string, data: { isAdmin?: boolean; isActive?: boolean }): Promise<void> => {\n await client.admin.updateUser(userDID(id), data);\n fetchUsers();\n fetchStats();\n };\n\n return {\n browse,\n users$: users$.asObservable(),\n stats$: stats$.asObservable(),\n usersLoading$: usersLoading$.asObservable(),\n statsLoading$: statsLoading$.asObservable(),\n updateUser,\n dispose: () => {\n users$.complete();\n stats$.complete();\n usersLoading$.complete();\n statsLoading$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface AdminSecurityVM extends ViewModel {\n browse: ShellVM;\n providers$: Observable<unknown[]>;\n allowedDomains$: Observable<string[]>;\n isLoading$: Observable<boolean>;\n}\n\nexport function createAdminSecurityVM(\n client: SemiontClient,\n browse: ShellVM,\n): AdminSecurityVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const providers$ = new BehaviorSubject<unknown[]>([]);\n const allowedDomains$ = new BehaviorSubject<string[]>([]);\n const isLoading$ = new BehaviorSubject<boolean>(true);\n\n client.admin.oauthConfig()\n .then((data) => {\n const config = data as { providers?: unknown[]; allowedDomains?: string[] };\n providers$.next(config.providers ?? []);\n allowedDomains$.next(config.allowedDomains ?? []);\n isLoading$.next(false);\n })\n .catch(() => isLoading$.next(false));\n\n return {\n browse,\n providers$: providers$.asObservable(),\n allowedDomains$: allowedDomains$.asObservable(),\n isLoading$: isLoading$.asObservable(),\n dispose: () => {\n providers$.complete();\n allowedDomains$.complete();\n isLoading$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface WelcomeVM extends ViewModel {\n userData$: Observable<{ termsAcceptedAt?: string } | null>;\n isProcessing$: Observable<boolean>;\n acceptTerms(): Promise<void>;\n}\n\nexport function createWelcomeVM(\n client: SemiontClient,\n): WelcomeVM {\n const disposer = createDisposer();\n\n const userData$ = new BehaviorSubject<{ termsAcceptedAt?: string } | null>(null);\n const isProcessing$ = new BehaviorSubject<boolean>(false);\n\n client.auth.me()\n .then((data) => userData$.next(data as { termsAcceptedAt?: string }))\n .catch(() => {});\n\n const acceptTerms = async (): Promise<void> => {\n isProcessing$.next(true);\n try {\n await client.auth.acceptTerms();\n userData$.next({ ...userData$.getValue(), termsAcceptedAt: new Date().toISOString() });\n } finally {\n isProcessing$.next(false);\n }\n };\n\n return {\n userData$: userData$.asObservable(),\n isProcessing$: isProcessing$.asObservable(),\n acceptTerms,\n dispose: () => {\n userData$.complete();\n isProcessing$.complete();\n disposer.dispose();\n },\n };\n}\n","import { type Observable, map } from 'rxjs';\nimport type { ResourceDescriptor, ResourceId } from '@semiont/core';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface ResourceLoaderVM extends ViewModel {\n resource$: Observable<ResourceDescriptor | undefined>;\n isLoading$: Observable<boolean>;\n invalidate(): void;\n}\n\nexport function createResourceLoaderVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): ResourceLoaderVM {\n const raw$ = client.browse.resource(resourceId);\n const resource$ = raw$;\n const isLoading$: Observable<boolean> = raw$.pipe(map((r) => r === undefined));\n\n return {\n resource$,\n isLoading$,\n invalidate: () => client.browse.invalidateResourceDetail(resourceId),\n dispose: () => {},\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface SessionVM extends ViewModel {\n isLoggingOut$: Observable<boolean>;\n logout(): Promise<void>;\n}\n\nexport function createSessionVM(\n client: SemiontClient,\n): SessionVM {\n const isLoggingOut$ = new BehaviorSubject<boolean>(false);\n\n const logout = async (): Promise<void> => {\n isLoggingOut$.next(true);\n try {\n await client.auth.logout();\n } catch {\n // best-effort — session may already be cleared server-side\n } finally {\n isLoggingOut$.next(false);\n }\n };\n\n return {\n isLoggingOut$: isLoggingOut$.asObservable(),\n logout,\n dispose: () => {\n isLoggingOut$.complete();\n },\n };\n}\n","import { Observable, merge } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ConnectionState } from '@semiont/core';\nimport { createActorVM, type ActorVM } from '@semiont/api-client';\n\nexport interface SmelterEvent {\n type: string;\n resourceId?: string;\n payload: Record<string, unknown>;\n}\n\nexport interface SmelterActorVMOptions {\n baseUrl: string;\n token: string;\n reconnectMs?: number;\n}\n\nconst SMELTER_CHANNELS = [\n 'yield:created',\n 'yield:updated',\n 'yield:representation-added',\n 'mark:archived',\n 'mark:added',\n 'mark:removed',\n] as const;\n\nexport interface SmelterActorVM extends ViewModel {\n events$: Observable<SmelterEvent>;\n state$: Observable<ConnectionState>;\n emit(channel: string, payload: Record<string, unknown>): Promise<void>;\n start(): void;\n stop(): void;\n}\n\nexport function createSmelterActorVM(options: SmelterActorVMOptions): SmelterActorVM {\n const actor: ActorVM = createActorVM({\n baseUrl: options.baseUrl,\n token: options.token,\n channels: [...SMELTER_CHANNELS],\n reconnectMs: options.reconnectMs,\n });\n\n const events$ = merge(\n ...SMELTER_CHANNELS.map((channel) =>\n actor.on$<Record<string, unknown>>(channel).pipe(\n map((payload) => ({\n type: channel,\n resourceId: payload.resourceId as string | undefined,\n payload,\n })),\n ),\n ),\n );\n\n return {\n events$,\n state$: actor.state$,\n emit: (channel, payload) => actor.emit(channel, payload),\n start: () => actor.start(),\n stop: () => actor.stop(),\n dispose: () => actor.dispose(),\n };\n}\n","/**\n * Job Claim Adapter — worker-side job lifecycle glue on top of a\n * shared `ActorVM`.\n *\n * Replaces the old `WorkerVM`, which owned its own actor and\n * duplicated the SSE connection that `SemiontClient` already held.\n * Workers now construct a `SemiontSession` normally (one actor, one\n * SSE connection) and use this adapter to attach job-claim behaviour\n * on top of `session.client.actor`.\n *\n * The adapter is intentionally thin: it subscribes to `job:queued`\n * on the actor, claims jobs via the existing request-response\n * protocol (`job:claim` → `job:claimed` / `job:claim-failed`), and\n * exposes observables for job orchestration. It does **not** own\n * the actor, has no HTTP concerns, and has no modal state.\n */\n\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { firstValueFrom, merge, filter, map, take, timeout } from 'rxjs';\nimport type { ActorVM } from '@semiont/api-client';\n\nexport interface JobAssignment {\n jobId: string;\n type: string;\n resourceId: string;\n}\n\nexport interface ActiveJob {\n jobId: string;\n type: string;\n resourceId: string;\n userId: string;\n params: Record<string, unknown>;\n}\n\nexport interface JobClaimAdapterOptions {\n /** Shared actor (typically `session.client.actor`). */\n actor: ActorVM;\n /**\n * Job types this worker can process. Jobs of other types that\n * arrive on `job:queued` are ignored. Empty array = accept any.\n */\n jobTypes: string[];\n}\n\nexport interface JobClaimAdapter {\n /** Currently-claimed job, or null when idle. */\n readonly activeJob$: Observable<ActiveJob | null>;\n /** True while a claim is in flight or a job is being processed. */\n readonly isProcessing$: Observable<boolean>;\n /** Monotonically-incrementing count of successfully-completed jobs. */\n readonly jobsCompleted$: Observable<number>;\n /** Stream of job failures (including claim-failed and processing errors). */\n readonly errors$: Observable<{ jobId: string; error: string }>;\n\n /**\n * Subscribe to `job:queued` events (adding the channel to the actor\n * if not already subscribed) and begin claiming matching jobs.\n * Idempotent — calling `start()` twice is a no-op.\n */\n start(): void;\n\n /** Stop claiming new jobs. Does not cancel an in-flight job. */\n stop(): void;\n\n /** Signal successful completion of `activeJob$`. */\n completeJob(): void;\n\n /** Signal failure of `activeJob$`. Emits on `errors$`. */\n failJob(jobId: string, error: string): void;\n\n /** Release observables. Does not dispose the shared actor. */\n dispose(): void;\n}\n\n/**\n * Attach job-claim behaviour to a shared `ActorVM`.\n */\nexport function createJobClaimAdapter(options: JobClaimAdapterOptions): JobClaimAdapter {\n const { actor, jobTypes } = options;\n\n const activeJob$ = new BehaviorSubject<ActiveJob | null>(null);\n const isProcessing$ = new BehaviorSubject<boolean>(false);\n const jobsCompleted$ = new BehaviorSubject<number>(0);\n const errors$ = new Subject<{ jobId: string; error: string }>();\n\n let jobSubscription: { unsubscribe(): void } | null = null;\n let started = false;\n\n const claimJob = async (assignment: JobAssignment): Promise<ActiveJob | null> => {\n try {\n const correlationId = crypto.randomUUID();\n const result$ = merge(\n actor.on$<Record<string, unknown>>('job:claimed').pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({ ok: true as const, response: e.response as Record<string, unknown> })),\n ),\n actor.on$<Record<string, unknown>>('job:claim-failed').pipe(\n filter((e) => e.correlationId === correlationId),\n map(() => ({ ok: false as const })),\n ),\n ).pipe(take(1), timeout(10_000));\n\n const resultPromise = firstValueFrom(result$);\n await actor.emit('job:claim', { correlationId, jobId: assignment.jobId });\n const result = await resultPromise;\n\n if (!result.ok) return null;\n const job = result.response as {\n params?: Record<string, unknown>;\n metadata?: { userId?: string };\n };\n return {\n jobId: assignment.jobId,\n type: assignment.type,\n resourceId: assignment.resourceId,\n userId: (job.metadata?.userId ?? '') as string,\n params: (job.params ?? {}) as Record<string, unknown>,\n };\n } catch {\n return null;\n }\n };\n\n return {\n activeJob$: activeJob$.asObservable(),\n isProcessing$: isProcessing$.asObservable(),\n jobsCompleted$: jobsCompleted$.asObservable(),\n errors$: errors$.asObservable(),\n\n start: () => {\n if (started) return;\n started = true;\n // `job:queued` is not in BUS_RESULT_CHANNELS (it's a worker-only\n // broadcast). Add it to the shared actor so this adapter sees\n // queued jobs. addChannels() is idempotent.\n actor.addChannels(['job:queued']);\n\n jobSubscription = actor\n .on$<{ jobId: string; jobType: string; resourceId: string }>('job:queued')\n .subscribe((event) => {\n const jobType = event.jobType;\n if (jobTypes.length > 0 && !jobTypes.includes(jobType)) return;\n if (isProcessing$.getValue()) return;\n\n isProcessing$.next(true);\n claimJob({ jobId: event.jobId, type: jobType, resourceId: event.resourceId })\n .then((job) => {\n if (job) {\n activeJob$.next(job);\n } else {\n isProcessing$.next(false);\n }\n })\n .catch(() => {\n isProcessing$.next(false);\n });\n });\n },\n\n stop: () => {\n jobSubscription?.unsubscribe();\n jobSubscription = null;\n started = false;\n },\n\n completeJob: () => {\n activeJob$.next(null);\n isProcessing$.next(false);\n jobsCompleted$.next(jobsCompleted$.getValue() + 1);\n },\n\n failJob: (jid: string, error: string) => {\n activeJob$.next(null);\n isProcessing$.next(false);\n errors$.next({ jobId: jid, error });\n },\n\n dispose: () => {\n jobSubscription?.unsubscribe();\n jobSubscription = null;\n started = false;\n activeJob$.complete();\n isProcessing$.complete();\n jobsCompleted$.complete();\n errors$.complete();\n },\n };\n}\n","import { BehaviorSubject, Subject, type Observable, map } from 'rxjs';\nimport type { SemiontClient } from '../../client';\nimport type { ViewModel } from '../lib/view-model';\n\nexport interface Job {\n jobId: string;\n type: string;\n status: string;\n resourceId: string;\n /** DID of the user who initiated the job (audit). */\n userId: string;\n created: string;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n progress?: Record<string, unknown>;\n result?: Record<string, unknown>;\n}\n\nexport interface JobQueueVM extends ViewModel {\n jobs$: Observable<Job[]>;\n pendingByType$: Observable<Map<string, number>>;\n runningJobs$: Observable<Job[]>;\n jobCreated$: Observable<Job>;\n jobCompleted$: Observable<Job>;\n jobFailed$: Observable<Job>;\n}\n\nexport function createJobQueueVM(client: SemiontClient): JobQueueVM {\n const jobs$ = new BehaviorSubject<Job[]>([]);\n const jobCreated$ = new Subject<Job>();\n const jobCompleted$ = new Subject<Job>();\n const jobFailed$ = new Subject<Job>();\n\n const pendingByType$: Observable<Map<string, number>> = jobs$.pipe(\n map((all) => {\n const counts = new Map<string, number>();\n for (const j of all) {\n if (j.status === 'pending') {\n counts.set(j.type, (counts.get(j.type) ?? 0) + 1);\n }\n }\n return counts;\n }),\n );\n\n const runningJobs$: Observable<Job[]> = jobs$.pipe(\n map((all) => all.filter((j) => j.status === 'running')),\n );\n\n const addOrUpdate = (job: Job) => {\n const current = jobs$.getValue();\n const idx = current.findIndex((j) => j.jobId === job.jobId);\n if (idx >= 0) {\n const next = [...current];\n next[idx] = job;\n jobs$.next(next);\n } else {\n jobs$.next([...current, job]);\n }\n };\n\n const subs = [\n client.bus.get('job:queued').subscribe((event) => {\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'pending',\n resourceId: event.resourceId,\n userId: event.userId,\n created: new Date().toISOString(),\n };\n addOrUpdate(job);\n jobCreated$.next(job);\n }),\n\n client.bus.get('job:complete').subscribe((event) => {\n if (!event._userId) {\n throw new Error('job:complete missing _userId (gateway injection)');\n }\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'complete',\n resourceId: event.resourceId,\n userId: event._userId,\n created: '',\n completedAt: new Date().toISOString(),\n result: event.result as Record<string, unknown>,\n };\n addOrUpdate(job);\n jobCompleted$.next(job);\n }),\n\n client.bus.get('job:fail').subscribe((event) => {\n if (!event._userId) {\n throw new Error('job:fail missing _userId (gateway injection)');\n }\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'failed',\n resourceId: event.resourceId,\n userId: event._userId,\n created: '',\n completedAt: new Date().toISOString(),\n error: event.error,\n };\n addOrUpdate(job);\n jobFailed$.next(job);\n }),\n ];\n\n return {\n jobs$: jobs$.asObservable(),\n pendingByType$,\n runningJobs$,\n jobCreated$: jobCreated$.asObservable(),\n jobCompleted$: jobCompleted$.asObservable(),\n jobFailed$: jobFailed$.asObservable(),\n dispose: () => {\n subs.forEach((s) => s.unsubscribe());\n jobs$.complete();\n jobCreated$.complete();\n jobCompleted$.complete();\n jobFailed$.complete();\n },\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport type { ResourceId, components } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport { createBeckonVM, type BeckonVM } from '../flows/beckon-vm';\nimport { createMarkVM, type MarkVM } from '../flows/mark-vm';\nimport { createGatherVM, type GatherVM } from '../flows/gather-vm';\nimport { createMatchVM } from '../flows/match-vm';\nimport { createYieldVM, type YieldVM } from '../flows/yield-vm';\nimport type { SemiontClient } from '../../client';\nimport { decodeWithCharset } from '@semiont/core';\nimport { isHighlight, isComment, isAssessment, isReference, isTag } from '@semiont/core';\nimport type { ReferencedByEntry } from '../../namespaces/types';\n\nimport type { Annotation } from '@semiont/core';\n\nexport interface AnnotationGroups {\n highlights: Annotation[];\n comments: Annotation[];\n assessments: Annotation[];\n references: Annotation[];\n tags: Annotation[];\n}\ntype StoredEventResponse = components['schemas']['StoredEventResponse'];\n\nexport interface WizardState {\n open: boolean;\n annotationId: string | null;\n resourceId: string | null;\n defaultTitle: string;\n entityTypes: string[];\n}\n\nconst WIZARD_CLOSED: WizardState = {\n open: false, annotationId: null, resourceId: null, defaultTitle: '', entityTypes: [],\n};\n\nexport interface ResourceViewerPageVM extends ViewModel {\n beckon: BeckonVM;\n browse: ShellVM;\n mark: MarkVM;\n gather: GatherVM;\n yield: YieldVM;\n\n annotations$: Observable<Annotation[]>;\n annotationGroups$: Observable<AnnotationGroups>;\n entityTypes$: Observable<string[]>;\n events$: Observable<StoredEventResponse[]>;\n referencedBy$: Observable<ReferencedByEntry[]>;\n content$: Observable<string>;\n contentLoading$: Observable<boolean>;\n mediaToken$: Observable<string | null>;\n wizard$: Observable<WizardState>;\n\n closeWizard(): void;\n}\n\nexport function createResourceViewerPageVM(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n browse: ShellVM,\n options?: { mediaType?: string },\n): ResourceViewerPageVM {\n const disposer = createDisposer();\n\n const beckon = createBeckonVM(client);\n const mark = createMarkVM(client, resourceId);\n const gather = createGatherVM(client, resourceId);\n const matchVM = createMatchVM(client, resourceId);\n const yieldVM = createYieldVM(client, resourceId, locale);\n\n disposer.add(beckon);\n disposer.add(browse);\n disposer.add(mark);\n disposer.add(gather);\n disposer.add(matchVM);\n disposer.add(yieldVM);\n\n const annotations$: Observable<Annotation[]> = client.browse.annotations(resourceId).pipe(\n map((a) => a ?? []),\n );\n\n const annotationGroups$: Observable<AnnotationGroups> = annotations$.pipe(\n map((anns) => {\n const groups: AnnotationGroups = { highlights: [], comments: [], assessments: [], references: [], tags: [] };\n for (const ann of anns) {\n if (isHighlight(ann)) groups.highlights.push(ann);\n else if (isComment(ann)) groups.comments.push(ann);\n else if (isAssessment(ann)) groups.assessments.push(ann);\n else if (isReference(ann)) groups.references.push(ann);\n else if (isTag(ann)) groups.tags.push(ann);\n }\n return groups;\n }),\n );\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n const events$: Observable<StoredEventResponse[]> = client.browse.events(resourceId).pipe(\n map((e) => e ?? []),\n );\n\n const referencedBy$: Observable<ReferencedByEntry[]> = client.browse.referencedBy(resourceId).pipe(\n map((r) => r ?? []),\n );\n\n const content$ = new BehaviorSubject<string>('');\n const contentLoading$ = new BehaviorSubject<boolean>(false);\n const mediaToken$ = new BehaviorSubject<string | null>(null);\n\n const mediaType = options?.mediaType || 'text/plain';\n const isBinaryType = mediaType.startsWith('image/') || mediaType === 'application/pdf';\n\n if (!isBinaryType && mediaType) {\n contentLoading$.next(true);\n client.browse.resourceRepresentation(resourceId, { accept: mediaType })\n .then(({ data }) => {\n content$.next(decodeWithCharset(data, mediaType));\n contentLoading$.next(false);\n })\n .catch(() => { contentLoading$.next(false); });\n }\n\n if (isBinaryType) {\n client.auth.mediaToken(resourceId)\n .then(({ token }) => mediaToken$.next(token))\n .catch(() => {});\n }\n\n const wizard$ = new BehaviorSubject<WizardState>(WIZARD_CLOSED);\n\n const unsubscribeResource = client.subscribeToResource(resourceId);\n disposer.add(unsubscribeResource);\n\n const bindInitiateSub = client.bus.get('bind:initiate').subscribe((event) => {\n wizard$.next({\n open: true,\n annotationId: event.annotationId,\n resourceId: event.resourceId,\n defaultTitle: event.defaultTitle,\n entityTypes: event.entityTypes,\n });\n client.bus.get('gather:requested').next({\n correlationId: crypto.randomUUID(),\n annotationId: event.annotationId,\n resourceId: event.resourceId,\n options: { contextWindow: 2000 },\n });\n });\n disposer.add(() => bindInitiateSub.unsubscribe());\n\n return {\n beckon,\n browse,\n mark,\n gather,\n yield: yieldVM,\n annotations$,\n annotationGroups$,\n entityTypes$,\n events$,\n referencedBy$,\n content$: content$.asObservable(),\n contentLoading$: contentLoading$.asObservable(),\n mediaToken$: mediaToken$.asObservable(),\n wizard$: wizard$.asObservable(),\n closeWizard: () => wizard$.next(WIZARD_CLOSED),\n dispose: () => {\n wizard$.complete();\n content$.complete();\n contentLoading$.complete();\n mediaToken$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport type { GatheredContext, AnnotationId, ContentFormat, AccessToken, ResourceDescriptor } from '@semiont/core';\nimport { resourceId as makeResourceId, annotationId as makeAnnotationId } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\nimport { getPrimaryMediaType, decodeWithCharset } from '@semiont/core';\n\nexport type ComposeMode = 'new' | 'clone' | 'reference';\n\nexport interface ComposeParams {\n mode?: string | undefined;\n token?: string | undefined;\n annotationUri?: string | undefined;\n sourceDocumentId?: string | undefined;\n name?: string | undefined;\n entityTypes?: string | undefined;\n storedContext?: string | undefined;\n}\n\nexport interface CloneData {\n sourceResource: ResourceDescriptor;\n sourceContent: string;\n}\n\nexport interface ReferenceData {\n annotationUri: string;\n sourceDocumentId: string;\n name: string;\n entityTypes: string[];\n}\n\nexport interface SaveResourceParams {\n mode: ComposeMode;\n name: string;\n storageUri: string;\n content?: string;\n file?: File;\n format?: string;\n charset?: string;\n entityTypes?: string[];\n language: string;\n archiveOriginal?: boolean;\n annotationUri?: string;\n sourceDocumentId?: string;\n}\n\nexport interface ComposePageVM extends ViewModel {\n browse: ShellVM;\n mode$: Observable<ComposeMode>;\n loading$: Observable<boolean>;\n cloneData$: Observable<CloneData | null>;\n referenceData$: Observable<ReferenceData | null>;\n gatheredContext$: Observable<GatheredContext | null>;\n entityTypes$: Observable<string[]>;\n save(params: SaveResourceParams): Promise<string>;\n}\n\nexport function createComposePageVM(\n client: SemiontClient,\n browse: ShellVM,\n params: ComposeParams,\n auth?: AccessToken,\n): ComposePageVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const isReferenceMode = Boolean(params.annotationUri && params.sourceDocumentId && params.name);\n const isCloneMode = params.mode === 'clone' && Boolean(params.token);\n const pageMode: ComposeMode = isCloneMode ? 'clone' : isReferenceMode ? 'reference' : 'new';\n\n const mode$ = new BehaviorSubject<ComposeMode>(pageMode);\n const loading$ = new BehaviorSubject<boolean>(true);\n const cloneData$ = new BehaviorSubject<CloneData | null>(null);\n const referenceData$ = new BehaviorSubject<ReferenceData | null>(null);\n const gatheredContext$ = new BehaviorSubject<GatheredContext | null>(null);\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n // Initialize based on mode\n if (isReferenceMode) {\n const entityTypes = params.entityTypes ? params.entityTypes.split(',') : [];\n referenceData$.next({\n annotationUri: params.annotationUri!,\n sourceDocumentId: params.sourceDocumentId!,\n name: params.name!,\n entityTypes,\n });\n if (params.storedContext) {\n try { gatheredContext$.next(JSON.parse(params.storedContext)); } catch { /* ignore malformed */ }\n }\n loading$.next(false);\n } else if (isCloneMode) {\n void (async () => {\n try {\n const tokenResult = await client.yield.fromToken(params.token!);\n if (tokenResult && auth) {\n const rId = makeResourceId(tokenResult['@id']);\n const mediaType = getPrimaryMediaType(tokenResult) || 'text/plain';\n const { data } = await client.browse.resourceRepresentation(rId, {\n accept: mediaType as ContentFormat,\n });\n const content = decodeWithCharset(data, mediaType);\n cloneData$.next({ sourceResource: tokenResult, sourceContent: content });\n }\n } catch {\n // Error handling is the consumer's responsibility (toast)\n }\n loading$.next(false);\n })();\n } else {\n loading$.next(false);\n }\n\n const save = async (saveParams: SaveResourceParams): Promise<string> => {\n if (saveParams.mode === 'clone') {\n const response = await client.yield.createFromToken({\n token: params.token!,\n name: saveParams.name,\n content: saveParams.content!,\n archiveOriginal: saveParams.archiveOriginal ?? true,\n });\n return response.resourceId;\n }\n\n let fileToUpload: File;\n let mimeType: string;\n\n if (saveParams.file) {\n fileToUpload = saveParams.file;\n mimeType = saveParams.format ?? 'application/octet-stream';\n } else {\n const blob = new Blob([saveParams.content || ''], { type: saveParams.format ?? 'application/octet-stream' });\n const extension = saveParams.format === 'text/plain' ? '.txt' : saveParams.format === 'text/html' ? '.html' : '.md';\n fileToUpload = new File([blob], saveParams.name + extension, { type: saveParams.format ?? 'application/octet-stream' });\n mimeType = saveParams.format ?? 'application/octet-stream';\n }\n\n const format = saveParams.charset && !saveParams.file ? `${mimeType}; charset=${saveParams.charset}` : mimeType;\n\n const response = await client.yield.resource({\n name: saveParams.name,\n file: fileToUpload,\n format,\n entityTypes: saveParams.entityTypes || [],\n language: saveParams.language,\n creationMethod: 'ui',\n storageUri: saveParams.storageUri,\n });\n\n const newResourceId = response.resourceId;\n\n if (saveParams.mode === 'reference' && saveParams.annotationUri && saveParams.sourceDocumentId) {\n await client.bind.body(\n makeResourceId(saveParams.sourceDocumentId),\n makeAnnotationId(saveParams.annotationUri) as AnnotationId,\n [{ op: 'add', item: { type: 'SpecificResource' as const, source: newResourceId, purpose: 'linking' as const } }],\n );\n }\n\n return newResourceId;\n };\n\n return {\n browse,\n mode$: mode$.asObservable(),\n loading$: loading$.asObservable(),\n cloneData$: cloneData$.asObservable(),\n referenceData$: referenceData$.asObservable(),\n gatheredContext$: gatheredContext$.asObservable(),\n entityTypes$,\n save,\n dispose: () => {\n mode$.complete();\n loading$.complete();\n cloneData$.complete();\n referenceData$.complete();\n gatheredContext$.complete();\n disposer.dispose();\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/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/notify.ts","../src/session/frontend-session-signals.ts","../src/session/semiont-browser.ts","../src/session/registry.ts","../src/session/session-storage.ts","../src/view-models/lib/view-model.ts","../src/view-models/lib/search-pipeline.ts","../src/view-models/flows/beckon-vm.ts","../src/view-models/flows/shell-vm.ts","../src/view-models/flows/gather-vm.ts","../src/view-models/flows/match-vm.ts","../src/view-models/flows/yield-vm.ts","../src/view-models/flows/mark-vm.ts","../src/view-models/domain/discover-vm.ts","../src/view-models/domain/entity-tags-vm.ts","../src/view-models/domain/exchange-vm.ts","../src/view-models/domain/admin-users-vm.ts","../src/view-models/domain/admin-security-vm.ts","../src/view-models/domain/welcome-vm.ts","../src/view-models/domain/resource-loader-vm.ts","../src/view-models/domain/session-vm.ts","../src/view-models/domain/smelter-actor-vm.ts","../src/view-models/domain/job-claim-adapter.ts","../src/view-models/domain/job-queue-vm.ts","../src/view-models/pages/resource-viewer-page-vm.ts","../src/view-models/pages/compose-page-vm.ts"],"names":["filter","firstValueFrom","map","resourceId","annotationId","makeAnnotationId","makeResourceId","toAnnotationId","merge","takeUntil","timeout","makeEmail","makeRefreshToken","userId","BehaviorSubject","SemiontError","accessToken","baseUrl","HttpTransport","HttpContentTransport","EventBus","Subject","distinctUntilChanged","take","decodeWithCharset","response"],"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 (frontend view-models) keep\n * using `.subscribe(...)` 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';\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 resolves to the **first non-undefined** value (waits past the\n * loading state). Subscribing yields the full sequence including the\n * initial `undefined`, so reactive consumers can render a loading state.\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 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 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 * 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 React-side 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>): 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 wrapperCache.set(source, wrapper);\n }\n return wrapper;\n }\n}\n\nconst wrapperCache = new WeakMap<Observable<unknown>, CacheObservable<unknown>>();\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 const resultPromise = firstValueFrom(result$);\n\n await bus.emit(emitChannel as keyof EventMap, fullPayload as EventMap[keyof EventMap]);\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 * Shape:\n * - `observe(key)`: returns an Observable<V | undefined> that triggers\n * a fetch on first subscription for a missing key, dedup-joins any\n * concurrent fetch, and emits the stored value thereafter.\n * - `invalidate(key)`: stale-while-revalidate — keeps the current\n * value visible to observers, clears the in-flight guard, starts a\n * fresh fetch. If the previous fetch was orphaned (SSE torn down,\n * response lost), this is how the cache recovers.\n * - `remove(key)`: drops the cache entry entirely. Used for entity\n * deletions (B13a). No refetch.\n * - `set(key, value)`: writes through without a fetch. Used when a\n * bus event carries the new value inline (B13b).\n * - `invalidateAll()`: per-key SWR refetch of every currently-cached\n * entry. Used by gap-detection paths.\n * - `dispose()`: completes the store so observers unsubscribe.\n *\n * What's deliberately out:\n * - No subscriber ref-counting / GC of unobserved keys. The per-key\n * observable memo grows with the set of observed keys for the cache's\n * lifetime (B11). Acceptable 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\n * (B6); the caller drives retry via invalidate.\n */\n\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs';\n\nexport interface Cache<K, V> {\n /** Observable stream of the value at `key`. Triggers a fetch if not cached. */\n observe(key: K): Observable<V | undefined>;\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 const inflight = new Set<K>();\n const obsCache = new Map<K, Observable<V | undefined>>();\n\n const doFetch = async (key: K): Promise<void> => {\n // In-flight guard: concurrent first-observations deduplicate (B3).\n // `invalidate` clears the guard before calling doFetch, which is the\n // orphan-recovery mechanism documented in B7 and B9.\n if (inflight.has(key)) return;\n inflight.add(key);\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 } catch {\n // B6: fetch failure leaves the previous state intact. Observer\n // that was seeing `undefined` stays at `undefined`; observer\n // that was seeing a stale value keeps the stale value.\n } finally {\n inflight.delete(key);\n }\n };\n\n return {\n observe(key: K): Observable<V | undefined> {\n if (!store$.value.has(key) && !inflight.has(key)) {\n void doFetch(key);\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 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 doFetch(key);\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 doFetch(key);\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 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 = { limit?: number; archived?: boolean; search?: string };\n\n/** Sentinel key for the singleton entity-types cache. */\nconst ENTITY_TYPES_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 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 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 { search, archived: filters.archived, limit: filters.limit ?? 100, offset: 0 },\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.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 // ── 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.resourceCache.observe(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));\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(obs);\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.annotationDetailCache.observe(annotationId));\n }\n\n entityTypes(): CacheObservable<string[]> {\n return CacheObservable.from(this.entityTypesCache.observe(ENTITY_TYPES_KEY));\n }\n\n referencedBy(resourceId: ResourceId): CacheObservable<ReferencedByEntry[]> {\n return CacheObservable.from(this.referencedByCache.observe(resourceId));\n }\n\n events(resourceId: ResourceId): CacheObservable<StoredEventResponse[]> {\n return CacheObservable.from(this.resourceEventsCache.observe(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 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 is a KB-wide list — always refetch on any gap.\n this.invalidateEntityTypes();\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('mark:entity-type-added', () => this.invalidateEntityTypes());\n }\n}\n","import { merge } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport {\n annotationId as toAnnotationId,\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(resourceId: ResourceId, input: CreateAnnotationInput): Promise<{ annotationId: AnnotationId }> {\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 entityType(type: string): Promise<void> {\n await this.transport.emit('mark:add-entity-type', { tag: type });\n }\n\n async entityTypes(types: string[]): Promise<void> {\n for (const tag of types) {\n await this.transport.emit('mark:add-entity-type', { tag });\n }\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 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 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-vm 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 || !options.categories?.length) throw new Error('Tag assist requires schemaId and categories');\n } else if (motivation === 'linking') {\n if (!options.entityTypes?.length) throw new Error('Reference assist requires entityTypes');\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.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-vm 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 annotationId: AnnotationId,\n resourceId: ResourceId,\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 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-vm 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 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';\n\nimport type { ITransport, IContentTransport } from '@semiont/core';\nimport { busRequest } from '../bus-request';\nimport { StreamObservable } 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 async resource(data: CreateResourceInput): Promise<{ resourceId: string }> {\n const result = await this.content.putBinary({\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.creationMethod ? { creationMethod: data.creationMethod } : {}),\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 return { resourceId: result.resourceId as string };\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 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 language: options.language,\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 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: string }> {\n return busRequest<{ resourceId: string }>(\n this.transport,\n 'yield:clone-create',\n options,\n 'yield:clone-created',\n 'yield:clone-create-failed',\n );\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(annotationId: AnnotationId, resourceId: ResourceId): void {\n void this.transport.emit('beckon:focus', { annotationId, resourceId });\n }\n\n hover(annotationId: AnnotationId | null): void {\n // Local emit: beckon-vm 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","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. */\n get complete$(): Observable<EventMap['job:complete']> {\n return this.bus.get('job:complete');\n }\n\n /** Live stream of `job:fail` events. */\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 cancel(_jobId: JobId, type: string): Promise<void> {\n // Schema only carries jobType (cancels all pending jobs of that type).\n // The legacy per-job cancel was never wired on the backend.\n await this.transport.emit('job:cancel-requested', {\n jobType: (type === 'generation' ? 'generation' : 'annotation') as 'annotation' | 'generation',\n });\n }\n\n cancelRequest(jobType: 'annotation' | 'generation'): void {\n // Local emit: the batch-cancel widget fires this; a VM subscribes and\n // translates into individual cancels.\n this.bus.get('job:cancel-requested').next({ jobType });\n }\n}\n","/**\n * AuthNamespace — authentication. Pure wire, no bus.\n */\n\nimport type { ResourceId, components } from '@semiont/core';\nimport { email as makeEmail, googleCredential, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { ITransport } 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 transport: ITransport) {}\n\n async password(emailStr: string, passwordStr: string): Promise<AuthResponse> {\n return this.transport.authenticatePassword(makeEmail(emailStr), passwordStr);\n }\n\n async google(credential: string): Promise<AuthResponse> {\n return this.transport.authenticateGoogle(googleCredential(credential));\n }\n\n async refresh(token: string): Promise<TokenRefreshResponse> {\n return this.transport.refreshAccessToken(makeRefreshToken(token));\n }\n\n async logout(): Promise<void> {\n await this.transport.logout();\n }\n\n async me(): Promise<User> {\n return this.transport.getCurrentUser() as unknown as Promise<User>;\n }\n\n async acceptTerms(): Promise<void> {\n await this.transport.acceptTerms();\n }\n\n async mcpToken(): Promise<{ token: string }> {\n return this.transport.generateMcpToken();\n }\n\n async mediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.transport.getMediaToken(resourceId);\n }\n}\n","/**\n * AdminNamespace — administration. Pure wire, no bus.\n */\n\nimport type { UserDID, components, paths } from '@semiont/core';\nimport type { ITransport } from '@semiont/core';\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 transport: ITransport) {}\n\n async users(): Promise<User[]> {\n const result = await this.transport.listUsers();\n return (result as unknown as { users: User[] }).users;\n }\n\n async userStats(): Promise<AdminUserStatsResponse> {\n return this.transport.getUserStats();\n }\n\n async updateUser(userId: UserDID, data: RequestContent<paths['/api/admin/users/{id}']['patch']>): Promise<User> {\n const result = await this.transport.updateUser(userId, data as never);\n return (result as unknown as { user: User }).user;\n }\n\n async oauthConfig(): Promise<OAuthConfigResponse> {\n return this.transport.getOAuthConfig();\n }\n\n async healthCheck(): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.transport.healthCheck() as unknown as Promise<ResponseContent<paths['/api/health']['get']>>;\n }\n\n async status(): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.transport.getStatus() as unknown as Promise<ResponseContent<paths['/api/status']['get']>>;\n }\n\n async backup(): Promise<Response> {\n return this.transport.backupKnowledgeBase();\n }\n\n async restore(\n file: File,\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void,\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n return this.transport.restoreKnowledgeBase(file, onProgress);\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<Response> {\n return this.transport.exportKnowledgeBase(params);\n }\n\n async importKnowledgeBase(\n file: File,\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void,\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n return this.transport.importKnowledgeBase(file, onProgress);\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 { ResourceId, 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 { JobNamespace } from './namespaces/job';\nimport { AuthNamespace } from './namespaces/auth';\nimport { AdminNamespace } from './namespaces/admin';\nimport type { ITransport, IContentTransport } 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 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;\n public readonly admin: AdminNamespace;\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 constructor(transport: ITransport, content: IContentTransport) {\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.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 = new AuthNamespace(this.transport);\n this.admin = new AdminNamespace(this.transport);\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 subscribeToResource(resourceId: ResourceId): () => void {\n return this.transport.subscribeToResource(resourceId);\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(...)` instead — it owns the same\n * transport/client wiring plus the proactive-refresh + storage\n * 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 return new SemiontClient(transport, content);\n }\n\n /**\n * Async factory for the credentials-first script case. Builds a\n * transient transport, calls `auth.password(email, password)` to\n * acquire an access token, and returns the wired client with the\n * 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.signIn(...)` — same credentials shape, plus the\n * session machinery for proactive refresh and persistence.\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 signIn(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);\n try {\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 { 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 migrateLegacyEntry(entry: any): KnowledgeBase {\n if (entry.host !== undefined) return entry as KnowledgeBase;\n // Legacy format: { id, label, backendUrl }\n try {\n const url = new URL(entry.backendUrl);\n return {\n id: entry.id,\n label: entry.label,\n host: url.hostname,\n port: parseInt(url.port, 10) || (url.protocol === 'https:' ? 443 : 80),\n protocol: url.protocol === 'https:' ? 'https' : 'http',\n email: '',\n };\n } catch {\n return {\n id: entry.id,\n label: entry.label || 'Unknown',\n host: 'localhost',\n port: 4000,\n protocol: 'http',\n email: '',\n };\n }\n}\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 any[];\n return entries.map(migrateLegacyEntry);\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\nexport function kbBackendUrl(kb: KnowledgeBase): string {\n if (!isValidHostname(kb.host)) {\n throw new Error(`Invalid KB hostname: \"${kb.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 = kb.protocol + ':';\n url.hostname = kb.host;\n url.port = String(kb.port);\n return `${kb.protocol}://${url.hostname}:${kb.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 `FrontendSessionSignals`, 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). The\n * frontend wires this to `FrontendSessionSignals.notifySessionExpired`\n * so the 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 { 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 /** 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\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);\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 transport stack, calls `auth.password(email, password)`\n * to acquire access + refresh tokens, persists them via the storage\n * adapter, wires a default `refresh` callback that exchanges the\n * refresh token via `auth.refresh(...)`, and returns the ready\n * 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 * Throws on auth failure with no resources leaked. On success, the\n * returned session's `ready` promise has already resolved.\n */\n static async signIn(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);\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 * Module-scoped session-expired / permission-denied notifier.\n *\n * The active SemiontBrowser registers itself with this module-scoped slot\n * via {@link registerAuthNotifyHandlers}. Code outside the React tree\n * (notably the React Query QueryCache.onError handler in app providers)\n * calls {@link notifySessionExpired} or {@link notifyPermissionDenied} to\n * reach the active browser's session.\n *\n * When no browser has registered (e.g. before the singleton boots),\n * these calls are no-ops.\n *\n * No React imports — this is plain module state.\n */\n\ntype Notify = (message?: string) => void;\n\nlet activeOnSessionExpired: Notify | null = null;\nlet activeOnPermissionDenied: Notify | null = null;\n\nexport function notifySessionExpired(message?: string): void {\n activeOnSessionExpired?.(message);\n}\n\nexport function notifyPermissionDenied(message?: string): void {\n activeOnPermissionDenied?.(message);\n}\n\n/**\n * Install handlers for session-expired and permission-denied notifications.\n * Returns an unregister callback. The SemiontBrowser ctor calls this once;\n * `dispose()` calls the unregister.\n */\nexport function registerAuthNotifyHandlers(handlers: {\n onSessionExpired: Notify;\n onPermissionDenied: Notify;\n}): () => void {\n activeOnSessionExpired = handlers.onSessionExpired;\n activeOnPermissionDenied = handlers.onPermissionDenied;\n return () => {\n activeOnSessionExpired = null;\n activeOnPermissionDenied = null;\n };\n}\n","/**\n * FrontendSessionSignals — modal state that belongs to the UI, not\n * 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 *modals* only make sense\n * in a UI context. Keeping those observables on `SemiontSession`\n * meant workers and CLIs carried four dead BehaviorSubjects that\n * nothing would ever fire.\n *\n * `FrontendSessionSignals` owns the modal state and has no hard\n * reference to a session. `SemiontBrowser` constructs one alongside\n * every frontend session and wires:\n *\n * - `session.onAuthFailed` → `signals.notifySessionExpired` so\n * proactive-refresh failures surface as modals\n * - `notify` module handlers → the active signals' methods so\n * external callers (e.g. React Query's QueryCache.onError) can\n * trigger the modals without touching the session\n *\n * React consumers that need modal state subscribe here; consumers\n * 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 modal.\n */\n\nimport { BehaviorSubject } from 'rxjs';\n\nexport class FrontendSessionSignals {\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. Module-scoped singleton — survives every\n * React re-render, remount, and route change. `SemiontProvider` hands\n * the singleton to the React tree; `useSemiont()` returns it.\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 {\n EventBus,\n baseUrl,\n type AccessToken,\n type EventMap,\n} from '@semiont/core';\nimport { SemiontClient } from '../client';\nimport { HttpTransport } from '@semiont/api-client';\nimport { HttpContentTransport } from '@semiont/api-client';\nimport {\n ACTIVE_KEY,\n clearStoredSession,\n generateKbId,\n getStoredSession,\n isJwtExpired,\n kbBackendUrl,\n loadKnowledgeBases,\n saveKnowledgeBases,\n setStoredSession,\n} from './storage';\nimport { registerAuthNotifyHandlers } from './notify';\nimport type { KnowledgeBase, KbSessionStatus, NewKnowledgeBase } from './knowledge-base';\nimport type { OpenResource } from './open-resource';\nimport { SemiontSession, type UserInfo } from './semiont-session';\nimport { FrontendSessionSignals } from './frontend-session-signals';\nimport { SemiontSessionError } from './errors';\nimport type { SessionStorage } from './session-storage';\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\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 [FrontendSessionSignals](./frontend-session-signals.ts).\n */\n readonly activeSignals$: BehaviorSubject<FrontendSessionSignals | 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 /**\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 unregisterNotify: (() => void) | null = null;\n private unsubscribeStorage: (() => void) | null = null;\n private disposed = false;\n private activating: Promise<void> | null = null;\n /**\n * Per-KB in-flight refresh dedup. Simultaneous 401s for the same\n * KB converge on a single `/api/tokens/refresh` network call.\n * Was previously module-scoped in `refresh.ts`; moved here when\n * that file was deleted — SemiontBrowser is a singleton so the\n * scoping is equivalent.\n */\n private readonly inFlightRefreshes = new Map<string, Promise<string | null>>();\n\n constructor(config: SemiontBrowserConfig) {\n this.storage = config.storage;\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<FrontendSessionSignals | 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 // Route notify-module calls (from outside-React code paths like the\n // React Query QueryCache.onError handler) into the active session's\n // modal signals.\n this.unregisterNotify = registerAuthNotifyHandlers({\n onSessionExpired: (message) => {\n this.activeSignals$.getValue()?.notifySessionExpired(message ?? null);\n },\n onPermissionDenied: (message) => {\n this.activeSignals$.getValue()?.notifyPermissionDenied(message ?? null);\n },\n });\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 (from NextAuth's useSession).\n * Called at the root layout via a single `useEffect`. No other site\n * in the codebase should call this.\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 updateKb(id: string, updates: Partial<KnowledgeBase>): 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 FrontendSessionSignals();\n\n // Build transport stack: caller (this) owns token$ and threads it\n // through transport (which reads it on every request) and session\n // (which writes refreshed values into it). The `tokenRefresher`\n // closure resolves `session` lazily — `session` is defined right\n // after, 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(kb)),\n token$,\n tokenRefresher: () => session.refresh().then((t) => t ?? null),\n });\n const content = new HttpContentTransport(transport);\n const client = new SemiontClient(transport, content);\n session = new SemiontSession({\n kb,\n storage: this.storage,\n client,\n token$,\n refresh: () => this.performRefresh(kb),\n validate: (token) => this.performValidate(kb, token),\n onAuthFailed: (msg) => signals.notifySessionExpired(msg),\n onError: (err) => this.error$.next(err),\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 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 // ── Auth callbacks bound per session ──────────────────────────────────\n //\n // These closures back the `refresh` and `validate` callbacks passed\n // to `SemiontSession` in `setActiveKb`. Factored out as methods\n // (rather than inline in the activation closure) so test-doubles\n // can override them cleanly, and so the in-flight dedup map\n // survives across activations of the same KB.\n\n /**\n * Refresh the active KB's access token. Returns the new token on\n * success, null on failure. Concurrent calls for the same KB\n * dedupe through `inFlightRefreshes`, so simultaneous 401s trigger\n * only one `/api/tokens/refresh` round trip.\n *\n * Uses a throwaway `SemiontClient` with no `tokenRefresher` —\n * a refresh call returning 401 would otherwise re-enter this\n * function infinitely.\n */\n private async performRefresh(kb: KnowledgeBase): Promise<string | null> {\n const existing = this.inFlightRefreshes.get(kb.id);\n if (existing) return existing;\n\n const promise = (async () => {\n const stored = getStoredSession(this.storage, kb.id);\n if (!stored) return null;\n const throwawayTransport = new HttpTransport({ baseUrl: baseUrl(kbBackendUrl(kb)) });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(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(this.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 this.inFlightRefreshes.set(kb.id, promise);\n try {\n return await promise;\n } finally {\n this.inFlightRefreshes.delete(kb.id);\n }\n }\n\n /**\n * Validate an access token by calling `auth.me` on a throwaway\n * client. The session uses this once at startup to populate\n * `user$`; 401 triggers a refresh-then-retry inside the session.\n *\n * The throwaway transport is seeded with the specific token to\n * validate so the request actually carries it (HttpTransport\n * sources `Authorization` from its `token$`).\n */\n private async performValidate(kb: KnowledgeBase, token: AccessToken): Promise<UserInfo | null> {\n const tokenSubject = new BehaviorSubject<AccessToken | null>(token);\n const throwawayTransport = new HttpTransport({\n baseUrl: baseUrl(kbBackendUrl(kb)),\n token$: tokenSubject,\n });\n const throwaway = new SemiontClient(throwawayTransport, new HttpContentTransport(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 // ── Lifecycle ─────────────────────────────────────────────────────────\n\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n\n this.unregisterNotify?.();\n this.unregisterNotify = null;\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 * Module-scoped singleton for SemiontBrowser. Constructed lazily on first\n * `getBrowser()` call, survives every React re-render, remount, and route\n * change.\n *\n * The caller provides a `SessionStorage` implementation — there is no\n * default here because storage-backend selection is environment-specific\n * (browsers use `WebBrowserStorage`, CLI uses a filesystem adapter,\n * tests use `InMemorySessionStorage`). The first call to `getBrowser`\n * wins; subsequent calls return the cached instance regardless of the\n * storage passed.\n */\n\nimport { SemiontBrowser } from './semiont-browser';\nimport type { SessionStorage } from './session-storage';\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}\n\nexport function getBrowser(options: GetBrowserOptions): SemiontBrowser {\n if (!instance) {\n instance = new SemiontBrowser({ storage: options.storage });\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","import { Subscription } from 'rxjs';\n\nexport interface ViewModel {\n dispose(): void;\n}\n\nexport function createDisposer(): {\n add(vm: ViewModel | (() => 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 component instance via React's\n * `useState(() => createSearchPipeline(...))` lazy initializer, then consumed\n * via `useObservable(pipeline.state$)`. The pipeline holds no React state and\n * has no React imports — it's pure RxJS, unit-testable without a renderer.\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 via `useObservable`. */\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 `useEffect` cleanup. */\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 { ViewModel } from '../lib/view-model';\n\nexport interface BeckonVM extends ViewModel {\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 createBeckonVM(client: SemiontClient): BeckonVM {\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","/**\n * ShellVM — app-shell state: which toolbar panel is open, tab-bar\n * coordination helpers, scroll-to-annotation signals. Lives on\n * `SemiontBrowser`'s app-scoped bus (not the per-session client bus)\n * because panel toggles and shell chrome must work regardless of\n * whether a KB session is active.\n *\n * Channels: `panel:toggle`, `panel:open`, `panel:close`.\n */\n\nimport { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport type { SemiontBrowser } from '../../session/semiont-browser';\nimport type { ViewModel } from '../lib/view-model';\n\nexport type ToolbarPanelType = 'history' | 'info' | 'annotations' | 'settings' | 'collaboration' | 'user' | 'jsonld' | 'knowledge-base';\n\nexport const COMMON_PANELS: readonly ToolbarPanelType[] = ['knowledge-base', 'user', 'settings'] as const;\nexport const RESOURCE_PANELS: readonly ToolbarPanelType[] = ['history', 'info', 'annotations', 'collaboration', 'jsonld'] as const;\n\nconst MOTIVATION_TO_TAB: Record<string, string> = {\n 'linking': 'reference',\n 'commenting': 'comment',\n 'tagging': 'tag',\n 'highlighting': 'highlight',\n 'assessing': 'assessment',\n};\n\nlet tabGenerationCounter = 0;\n\nexport interface ShellVM extends ViewModel {\n activePanel$: Observable<ToolbarPanelType | null>;\n scrollToAnnotationId$: Observable<string | null>;\n panelInitialTab$: Observable<{ tab: string; generation: number } | null>;\n openPanel(panel: string): void;\n closePanel(): void;\n togglePanel(panel: string): void;\n onScrollCompleted(): void;\n}\n\nexport interface ShellVMOptions {\n initialPanel?: ToolbarPanelType | null;\n onPanelChange?: (panel: ToolbarPanelType | null) => void;\n}\n\nexport function createShellVM(browser: SemiontBrowser, options?: ShellVMOptions): ShellVM {\n const subs: Subscription[] = [];\n const activePanel$ = new BehaviorSubject<ToolbarPanelType | null>(options?.initialPanel ?? null);\n const scrollToAnnotationId$ = new BehaviorSubject<string | null>(null);\n const panelInitialTab$ = new BehaviorSubject<{ tab: string; generation: number } | null>(null);\n\n if (options?.onPanelChange) {\n const cb = options.onPanelChange;\n subs.push(activePanel$.subscribe(cb));\n }\n\n subs.push(browser.stream('panel:toggle').subscribe(({ panel }) => {\n const current = activePanel$.getValue();\n activePanel$.next(current === panel ? null : panel as ToolbarPanelType);\n }));\n\n subs.push(browser.stream('panel:open').subscribe(({ panel, scrollToAnnotationId, motivation }) => {\n if (scrollToAnnotationId) {\n scrollToAnnotationId$.next(scrollToAnnotationId);\n }\n if (motivation) {\n const tab = MOTIVATION_TO_TAB[motivation] || 'highlight';\n panelInitialTab$.next({ tab, generation: ++tabGenerationCounter });\n }\n activePanel$.next(panel as ToolbarPanelType);\n }));\n\n subs.push(browser.stream('panel:close').subscribe(() => {\n activePanel$.next(null);\n }));\n\n return {\n activePanel$: activePanel$.asObservable(),\n scrollToAnnotationId$: scrollToAnnotationId$.asObservable(),\n panelInitialTab$: panelInitialTab$.asObservable(),\n openPanel: (panel) => browser.emit('panel:open', { panel }),\n closePanel: () => browser.emit('panel:close', undefined),\n togglePanel: (panel) => browser.emit('panel:toggle', { panel }),\n onScrollCompleted: () => scrollToAnnotationId$.next(null),\n dispose() {\n subs.forEach(s => s.unsubscribe());\n activePanel$.complete();\n scrollToAnnotationId$.complete();\n panelInitialTab$.complete();\n },\n };\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 { ViewModel } from '../lib/view-model';\n\nexport interface GatherVM extends ViewModel {\n context$: Observable<GatheredContext | null>;\n loading$: Observable<boolean>;\n error$: Observable<Error | null>;\n annotationId$: Observable<AnnotationId | null>;\n}\n\nexport function createGatherVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): GatherVM {\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 makeAnnotationId(event.annotationId),\n resourceId,\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 { ViewModel } from '../lib/view-model';\n\nexport interface MatchVM extends ViewModel {}\n\nexport function createMatchVM(\n client: SemiontClient,\n _resourceId: ResourceId,\n): MatchVM {\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 { ViewModel } from '../lib/view-model';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface GenerateDocumentOptions {\n title: string;\n storageUri: string;\n prompt?: string;\n language?: string;\n temperature?: number;\n maxTokens?: number;\n context: GatheredContext;\n}\n\nexport interface YieldVM extends ViewModel {\n isGenerating$: Observable<boolean>;\n progress$: Observable<JobProgress | null>;\n generate(referenceId: string, options: GenerateDocumentOptions): void;\n}\n\nexport function createYieldVM(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n): YieldVM {\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 { ViewModel } from '../lib/view-model';\n\ntype JobProgress = components['schemas']['JobProgress'];\n\nexport interface PendingAnnotation {\n selector: Selector | Selector[];\n motivation: Motivation;\n}\n\nexport interface MarkVM extends ViewModel {\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 createMarkVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): MarkVM {\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 VM stays pure:\n // it updates state; UI side-effects (opening panels on the browser-scoped\n // bus) live where the React tree has access to `useSemiont().emit(...)`.\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(resourceId, {\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-vm'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","import { map, type Observable } from 'rxjs';\nimport type { ResourceDescriptor } from '@semiont/core';\nimport type { ViewModel } from '../lib/view-model';\nimport { createDisposer } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport { createSearchPipeline, type SearchPipeline } from '../lib/search-pipeline';\nimport type { SemiontClient } from '../../client';\n\nconst RECENT_LIMIT = 10;\nconst SEARCH_LIMIT = 20;\n\nexport interface DiscoverVM extends ViewModel {\n browse: ShellVM;\n search: SearchPipeline<ResourceDescriptor>;\n recentResources$: Observable<ResourceDescriptor[]>;\n entityTypes$: Observable<string[]>;\n isLoadingRecent$: Observable<boolean>;\n}\n\nexport function createDiscoverVM(\n client: SemiontClient,\n browse: ShellVM,\n): DiscoverVM {\n const disposer = createDisposer();\n\n const search = createSearchPipeline<ResourceDescriptor>((q) =>\n client.browse.resources({ search: q, limit: SEARCH_LIMIT }),\n );\n disposer.add(search);\n disposer.add(browse);\n\n const recent$ = client.browse.resources({ limit: RECENT_LIMIT, archived: false });\n\n const recentResources$: Observable<ResourceDescriptor[]> = recent$.pipe(\n map((r) => r ?? []),\n );\n\n const isLoadingRecent$: Observable<boolean> = recent$.pipe(\n map((r) => r === undefined),\n );\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n return {\n browse,\n search,\n recentResources$,\n entityTypes$,\n isLoadingRecent$,\n dispose: () => disposer.dispose(),\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface EntityTagsVM extends ViewModel {\n browse: ShellVM;\n entityTypes$: Observable<string[]>;\n isLoading$: Observable<boolean>;\n newTag$: Observable<string>;\n error$: Observable<string>;\n isAdding$: Observable<boolean>;\n setNewTag(value: string): void;\n addTag(): Promise<void>;\n}\n\nexport function createEntityTagsVM(\n client: SemiontClient,\n browse: ShellVM,\n): EntityTagsVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const newTag$ = new BehaviorSubject<string>('');\n const error$ = new BehaviorSubject<string>('');\n const isAdding$ = new BehaviorSubject<boolean>(false);\n\n const raw$ = client.browse.entityTypes();\n const entityTypes$: Observable<string[]> = raw$.pipe(map((e) => e ?? []));\n const isLoading$: Observable<boolean> = raw$.pipe(map((e) => e === undefined));\n\n const addTag = async (): Promise<void> => {\n const tag = newTag$.getValue().trim();\n if (!tag) return;\n error$.next('');\n isAdding$.next(true);\n try {\n await client.mark.entityType(tag);\n newTag$.next('');\n } catch (err) {\n error$.next(err instanceof Error ? err.message : 'Failed to add entity type');\n } finally {\n isAdding$.next(false);\n }\n };\n\n return {\n browse,\n entityTypes$,\n isLoading$,\n newTag$: newTag$.asObservable(),\n error$: error$.asObservable(),\n isAdding$: isAdding$.asObservable(),\n setNewTag: (v) => newTag$.next(v),\n addTag,\n dispose: () => {\n newTag$.complete();\n error$.complete();\n isAdding$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\n\nexport interface ImportPreview {\n format: string;\n version: number;\n sourceUrl: string;\n stats: Record<string, number>;\n}\n\nexport interface ExchangeVM extends ViewModel {\n browse: ShellVM;\n selectedFile$: Observable<File | null>;\n preview$: Observable<ImportPreview | null>;\n importPhase$: Observable<string | null>;\n importMessage$: Observable<string | undefined>;\n importResult$: Observable<Record<string, unknown> | undefined>;\n isExporting$: Observable<boolean>;\n isImporting$: Observable<boolean>;\n selectFile(file: File): void;\n cancelImport(): void;\n doExport(): Promise<{ blob: Blob; filename: string }>;\n doImport(): Promise<void>;\n}\n\nexport function createExchangeVM(\n browse: ShellVM,\n exportFn: (params?: { includeArchived?: boolean }) => Promise<Response>,\n importFn: (file: File, options?: { onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void }) => Promise<{ phase: string; message?: string; result?: Record<string, unknown> }>,\n): ExchangeVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const selectedFile$ = new BehaviorSubject<File | null>(null);\n const preview$ = new BehaviorSubject<ImportPreview | null>(null);\n const importPhase$ = new BehaviorSubject<string | null>(null);\n const importMessage$ = new BehaviorSubject<string | undefined>(undefined);\n const importResult$ = new BehaviorSubject<Record<string, unknown> | undefined>(undefined);\n const isExporting$ = new BehaviorSubject<boolean>(false);\n const isImporting$ = new BehaviorSubject<boolean>(false);\n\n const selectFile = (file: File): void => {\n selectedFile$.next(file);\n importPhase$.next(null);\n importMessage$.next(undefined);\n importResult$.next(undefined);\n preview$.next({\n format: file.name.endsWith('.tar.gz') || file.name.endsWith('.gz') ? 'semiont-linked-data' : 'unknown',\n version: 1,\n sourceUrl: '',\n stats: {} as Record<string, number>,\n });\n };\n\n const cancelImport = (): void => {\n selectedFile$.next(null);\n preview$.next(null);\n importPhase$.next(null);\n importMessage$.next(undefined);\n importResult$.next(undefined);\n };\n\n const doExport = async (): Promise<{ blob: Blob; filename: string }> => {\n isExporting$.next(true);\n try {\n const response = await exportFn();\n if (!response.ok) throw new Error(`Export failed: ${response.status} ${response.statusText}`);\n const blob = await response.blob();\n const contentDisposition = response.headers.get('Content-Disposition');\n const filename = contentDisposition?.match(/filename=\"(.+?)\"/)?.[1]\n ?? `semiont-export-${Date.now()}.tar.gz`;\n return { blob, filename };\n } finally {\n isExporting$.next(false);\n }\n };\n\n const doImport = async (): Promise<void> => {\n const file = selectedFile$.getValue();\n if (!file) return;\n isImporting$.next(true);\n importPhase$.next('started');\n importMessage$.next(undefined);\n importResult$.next(undefined);\n try {\n await importFn(file, {\n onProgress: (event) => {\n importPhase$.next(event.phase);\n importMessage$.next(event.message);\n if (event.result) importResult$.next(event.result);\n },\n });\n } finally {\n isImporting$.next(false);\n }\n };\n\n return {\n browse,\n selectedFile$: selectedFile$.asObservable(),\n preview$: preview$.asObservable(),\n importPhase$: importPhase$.asObservable(),\n importMessage$: importMessage$.asObservable(),\n importResult$: importResult$.asObservable(),\n isExporting$: isExporting$.asObservable(),\n isImporting$: isImporting$.asObservable(),\n selectFile,\n cancelImport,\n doExport,\n doImport,\n dispose: () => {\n selectedFile$.complete();\n preview$.complete();\n importPhase$.complete();\n importMessage$.complete();\n importResult$.complete();\n isExporting$.complete();\n isImporting$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { userDID } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface AdminUsersVM extends ViewModel {\n browse: ShellVM;\n users$: Observable<unknown[]>;\n stats$: Observable<unknown | null>;\n usersLoading$: Observable<boolean>;\n statsLoading$: Observable<boolean>;\n updateUser(id: string, data: { isAdmin?: boolean; isActive?: boolean }): Promise<void>;\n}\n\nexport function createAdminUsersVM(\n client: SemiontClient,\n browse: ShellVM,\n): AdminUsersVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const users$ = new BehaviorSubject<unknown[]>([]);\n const stats$ = new BehaviorSubject<unknown | null>(null);\n const usersLoading$ = new BehaviorSubject<boolean>(true);\n const statsLoading$ = new BehaviorSubject<boolean>(true);\n\n const fetchUsers = () => {\n usersLoading$.next(true);\n client.admin.users()\n .then((data) => {\n users$.next((data as { users?: unknown[] }).users ?? []);\n usersLoading$.next(false);\n })\n .catch(() => usersLoading$.next(false));\n };\n\n const fetchStats = () => {\n statsLoading$.next(true);\n client.admin.userStats()\n .then((data) => {\n stats$.next((data as { stats?: unknown }).stats ?? null);\n statsLoading$.next(false);\n })\n .catch(() => statsLoading$.next(false));\n };\n\n fetchUsers();\n fetchStats();\n\n const updateUser = async (id: string, data: { isAdmin?: boolean; isActive?: boolean }): Promise<void> => {\n await client.admin.updateUser(userDID(id), data);\n fetchUsers();\n fetchStats();\n };\n\n return {\n browse,\n users$: users$.asObservable(),\n stats$: stats$.asObservable(),\n usersLoading$: usersLoading$.asObservable(),\n statsLoading$: statsLoading$.asObservable(),\n updateUser,\n dispose: () => {\n users$.complete();\n stats$.complete();\n usersLoading$.complete();\n statsLoading$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\n\nexport interface AdminSecurityVM extends ViewModel {\n browse: ShellVM;\n providers$: Observable<unknown[]>;\n allowedDomains$: Observable<string[]>;\n isLoading$: Observable<boolean>;\n}\n\nexport function createAdminSecurityVM(\n client: SemiontClient,\n browse: ShellVM,\n): AdminSecurityVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const providers$ = new BehaviorSubject<unknown[]>([]);\n const allowedDomains$ = new BehaviorSubject<string[]>([]);\n const isLoading$ = new BehaviorSubject<boolean>(true);\n\n client.admin.oauthConfig()\n .then((data) => {\n const config = data as { providers?: unknown[]; allowedDomains?: string[] };\n providers$.next(config.providers ?? []);\n allowedDomains$.next(config.allowedDomains ?? []);\n isLoading$.next(false);\n })\n .catch(() => isLoading$.next(false));\n\n return {\n browse,\n providers$: providers$.asObservable(),\n allowedDomains$: allowedDomains$.asObservable(),\n isLoading$: isLoading$.asObservable(),\n dispose: () => {\n providers$.complete();\n allowedDomains$.complete();\n isLoading$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface WelcomeVM extends ViewModel {\n userData$: Observable<{ termsAcceptedAt?: string } | null>;\n isProcessing$: Observable<boolean>;\n acceptTerms(): Promise<void>;\n}\n\nexport function createWelcomeVM(\n client: SemiontClient,\n): WelcomeVM {\n const disposer = createDisposer();\n\n const userData$ = new BehaviorSubject<{ termsAcceptedAt?: string } | null>(null);\n const isProcessing$ = new BehaviorSubject<boolean>(false);\n\n client.auth.me()\n .then((data) => userData$.next(data as { termsAcceptedAt?: string }))\n .catch(() => {});\n\n const acceptTerms = async (): Promise<void> => {\n isProcessing$.next(true);\n try {\n await client.auth.acceptTerms();\n userData$.next({ ...userData$.getValue(), termsAcceptedAt: new Date().toISOString() });\n } finally {\n isProcessing$.next(false);\n }\n };\n\n return {\n userData$: userData$.asObservable(),\n isProcessing$: isProcessing$.asObservable(),\n acceptTerms,\n dispose: () => {\n userData$.complete();\n isProcessing$.complete();\n disposer.dispose();\n },\n };\n}\n","import { type Observable, map } from 'rxjs';\nimport type { ResourceDescriptor, ResourceId } from '@semiont/core';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface ResourceLoaderVM extends ViewModel {\n resource$: Observable<ResourceDescriptor | undefined>;\n isLoading$: Observable<boolean>;\n invalidate(): void;\n}\n\nexport function createResourceLoaderVM(\n client: SemiontClient,\n resourceId: ResourceId,\n): ResourceLoaderVM {\n const raw$ = client.browse.resource(resourceId);\n const resource$ = raw$;\n const isLoading$: Observable<boolean> = raw$.pipe(map((r) => r === undefined));\n\n return {\n resource$,\n isLoading$,\n invalidate: () => client.browse.invalidateResourceDetail(resourceId),\n dispose: () => {},\n };\n}\n","import { BehaviorSubject, type Observable } from 'rxjs';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontClient } from '../../client';\n\nexport interface SessionVM extends ViewModel {\n isLoggingOut$: Observable<boolean>;\n logout(): Promise<void>;\n}\n\nexport function createSessionVM(\n client: SemiontClient,\n): SessionVM {\n const isLoggingOut$ = new BehaviorSubject<boolean>(false);\n\n const logout = async (): Promise<void> => {\n isLoggingOut$.next(true);\n try {\n await client.auth.logout();\n } catch {\n // best-effort — session may already be cleared server-side\n } finally {\n isLoggingOut$.next(false);\n }\n };\n\n return {\n isLoggingOut$: isLoggingOut$.asObservable(),\n logout,\n dispose: () => {\n isLoggingOut$.complete();\n },\n };\n}\n","import { Observable, merge } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ConnectionState } from '@semiont/core';\nimport { createActorVM, type ActorVM } from '@semiont/api-client';\n\nexport interface SmelterEvent {\n type: string;\n resourceId?: string;\n payload: Record<string, unknown>;\n}\n\nexport interface SmelterActorVMOptions {\n baseUrl: string;\n token: string;\n reconnectMs?: number;\n}\n\nconst SMELTER_CHANNELS = [\n 'yield:created',\n 'yield:updated',\n 'yield:representation-added',\n 'mark:archived',\n 'mark:added',\n 'mark:removed',\n] as const;\n\nexport interface SmelterActorVM extends ViewModel {\n events$: Observable<SmelterEvent>;\n state$: Observable<ConnectionState>;\n emit(channel: string, payload: Record<string, unknown>): Promise<void>;\n start(): void;\n stop(): void;\n}\n\nexport function createSmelterActorVM(options: SmelterActorVMOptions): SmelterActorVM {\n const actor: ActorVM = createActorVM({\n baseUrl: options.baseUrl,\n token: options.token,\n channels: [...SMELTER_CHANNELS],\n reconnectMs: options.reconnectMs,\n });\n\n const events$ = merge(\n ...SMELTER_CHANNELS.map((channel) =>\n actor.on$<Record<string, unknown>>(channel).pipe(\n map((payload) => ({\n type: channel,\n resourceId: payload.resourceId as string | undefined,\n payload,\n })),\n ),\n ),\n );\n\n return {\n events$,\n state$: actor.state$,\n emit: (channel, payload) => actor.emit(channel, payload),\n start: () => actor.start(),\n stop: () => actor.stop(),\n dispose: () => actor.dispose(),\n };\n}\n","/**\n * Job Claim Adapter — worker-side job lifecycle glue on top of a\n * shared `ActorVM`.\n *\n * Replaces the old `WorkerVM`, which owned its own actor and\n * duplicated the SSE connection that `SemiontClient` already held.\n * Workers now construct a `SemiontSession` normally (one actor, one\n * SSE connection) and use this adapter to attach job-claim behaviour\n * on top of `session.client.actor`.\n *\n * The adapter is intentionally thin: it subscribes to `job:queued`\n * on the actor, claims jobs via the existing request-response\n * protocol (`job:claim` → `job:claimed` / `job:claim-failed`), and\n * exposes observables for job orchestration. It does **not** own\n * the actor, has no HTTP concerns, and has no modal state.\n */\n\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { firstValueFrom, merge, filter, map, take, timeout } from 'rxjs';\nimport type { ActorVM } from '@semiont/api-client';\n\nexport interface JobAssignment {\n jobId: string;\n type: string;\n resourceId: string;\n}\n\nexport interface ActiveJob {\n jobId: string;\n type: string;\n resourceId: string;\n userId: string;\n params: Record<string, unknown>;\n}\n\nexport interface JobClaimAdapterOptions {\n /** Shared actor (typically `session.client.actor`). */\n actor: ActorVM;\n /**\n * Job types this worker can process. Jobs of other types that\n * arrive on `job:queued` are ignored. Empty array = accept any.\n */\n jobTypes: string[];\n}\n\nexport interface JobClaimAdapter {\n /** Currently-claimed job, or null when idle. */\n readonly activeJob$: Observable<ActiveJob | null>;\n /** True while a claim is in flight or a job is being processed. */\n readonly isProcessing$: Observable<boolean>;\n /** Monotonically-incrementing count of successfully-completed jobs. */\n readonly jobsCompleted$: Observable<number>;\n /** Stream of job failures (including claim-failed and processing errors). */\n readonly errors$: Observable<{ jobId: string; error: string }>;\n\n /**\n * Subscribe to `job:queued` events (adding the channel to the actor\n * if not already subscribed) and begin claiming matching jobs.\n * Idempotent — calling `start()` twice is a no-op.\n */\n start(): void;\n\n /** Stop claiming new jobs. Does not cancel an in-flight job. */\n stop(): void;\n\n /** Signal successful completion of `activeJob$`. */\n completeJob(): void;\n\n /** Signal failure of `activeJob$`. Emits on `errors$`. */\n failJob(jobId: string, error: string): void;\n\n /** Release observables. Does not dispose the shared actor. */\n dispose(): void;\n}\n\n/**\n * Attach job-claim behaviour to a shared `ActorVM`.\n */\nexport function createJobClaimAdapter(options: JobClaimAdapterOptions): JobClaimAdapter {\n const { actor, jobTypes } = options;\n\n const activeJob$ = new BehaviorSubject<ActiveJob | null>(null);\n const isProcessing$ = new BehaviorSubject<boolean>(false);\n const jobsCompleted$ = new BehaviorSubject<number>(0);\n const errors$ = new Subject<{ jobId: string; error: string }>();\n\n let jobSubscription: { unsubscribe(): void } | null = null;\n let started = false;\n\n const claimJob = async (assignment: JobAssignment): Promise<ActiveJob | null> => {\n try {\n const correlationId = crypto.randomUUID();\n const result$ = merge(\n actor.on$<Record<string, unknown>>('job:claimed').pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({ ok: true as const, response: e.response as Record<string, unknown> })),\n ),\n actor.on$<Record<string, unknown>>('job:claim-failed').pipe(\n filter((e) => e.correlationId === correlationId),\n map(() => ({ ok: false as const })),\n ),\n ).pipe(take(1), timeout(10_000));\n\n const resultPromise = firstValueFrom(result$);\n await actor.emit('job:claim', { correlationId, jobId: assignment.jobId });\n const result = await resultPromise;\n\n if (!result.ok) return null;\n const job = result.response as {\n params?: Record<string, unknown>;\n metadata?: { userId?: string };\n };\n return {\n jobId: assignment.jobId,\n type: assignment.type,\n resourceId: assignment.resourceId,\n userId: (job.metadata?.userId ?? '') as string,\n params: (job.params ?? {}) as Record<string, unknown>,\n };\n } catch {\n return null;\n }\n };\n\n return {\n activeJob$: activeJob$.asObservable(),\n isProcessing$: isProcessing$.asObservable(),\n jobsCompleted$: jobsCompleted$.asObservable(),\n errors$: errors$.asObservable(),\n\n start: () => {\n if (started) return;\n started = true;\n // `job:queued` is not in BUS_RESULT_CHANNELS (it's a worker-only\n // broadcast). Add it to the shared actor so this adapter sees\n // queued jobs. addChannels() is idempotent.\n actor.addChannels(['job:queued']);\n\n jobSubscription = actor\n .on$<{ jobId: string; jobType: string; resourceId: string }>('job:queued')\n .subscribe((event) => {\n const jobType = event.jobType;\n if (jobTypes.length > 0 && !jobTypes.includes(jobType)) return;\n if (isProcessing$.getValue()) return;\n\n isProcessing$.next(true);\n claimJob({ jobId: event.jobId, type: jobType, resourceId: event.resourceId })\n .then((job) => {\n if (job) {\n activeJob$.next(job);\n } else {\n isProcessing$.next(false);\n }\n })\n .catch(() => {\n isProcessing$.next(false);\n });\n });\n },\n\n stop: () => {\n jobSubscription?.unsubscribe();\n jobSubscription = null;\n started = false;\n },\n\n completeJob: () => {\n activeJob$.next(null);\n isProcessing$.next(false);\n jobsCompleted$.next(jobsCompleted$.getValue() + 1);\n },\n\n failJob: (jid: string, error: string) => {\n activeJob$.next(null);\n isProcessing$.next(false);\n errors$.next({ jobId: jid, error });\n },\n\n dispose: () => {\n jobSubscription?.unsubscribe();\n jobSubscription = null;\n started = false;\n activeJob$.complete();\n isProcessing$.complete();\n jobsCompleted$.complete();\n errors$.complete();\n },\n };\n}\n","import { BehaviorSubject, Subject, type Observable, map } from 'rxjs';\nimport type { SemiontClient } from '../../client';\nimport type { ViewModel } from '../lib/view-model';\n\nexport interface Job {\n jobId: string;\n type: string;\n status: string;\n resourceId: string;\n /** DID of the user who initiated the job (audit). */\n userId: string;\n created: string;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n progress?: Record<string, unknown>;\n result?: Record<string, unknown>;\n}\n\nexport interface JobQueueVM extends ViewModel {\n jobs$: Observable<Job[]>;\n pendingByType$: Observable<Map<string, number>>;\n runningJobs$: Observable<Job[]>;\n jobCreated$: Observable<Job>;\n jobCompleted$: Observable<Job>;\n jobFailed$: Observable<Job>;\n}\n\nexport function createJobQueueVM(client: SemiontClient): JobQueueVM {\n const jobs$ = new BehaviorSubject<Job[]>([]);\n const jobCreated$ = new Subject<Job>();\n const jobCompleted$ = new Subject<Job>();\n const jobFailed$ = new Subject<Job>();\n\n const pendingByType$: Observable<Map<string, number>> = jobs$.pipe(\n map((all) => {\n const counts = new Map<string, number>();\n for (const j of all) {\n if (j.status === 'pending') {\n counts.set(j.type, (counts.get(j.type) ?? 0) + 1);\n }\n }\n return counts;\n }),\n );\n\n const runningJobs$: Observable<Job[]> = jobs$.pipe(\n map((all) => all.filter((j) => j.status === 'running')),\n );\n\n const addOrUpdate = (job: Job) => {\n const current = jobs$.getValue();\n const idx = current.findIndex((j) => j.jobId === job.jobId);\n if (idx >= 0) {\n const next = [...current];\n next[idx] = job;\n jobs$.next(next);\n } else {\n jobs$.next([...current, job]);\n }\n };\n\n const subs = [\n client.bus.get('job:queued').subscribe((event) => {\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'pending',\n resourceId: event.resourceId,\n userId: event.userId,\n created: new Date().toISOString(),\n };\n addOrUpdate(job);\n jobCreated$.next(job);\n }),\n\n client.bus.get('job:complete').subscribe((event) => {\n if (!event._userId) {\n throw new Error('job:complete missing _userId (gateway injection)');\n }\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'complete',\n resourceId: event.resourceId,\n userId: event._userId,\n created: '',\n completedAt: new Date().toISOString(),\n result: event.result as Record<string, unknown>,\n };\n addOrUpdate(job);\n jobCompleted$.next(job);\n }),\n\n client.bus.get('job:fail').subscribe((event) => {\n if (!event._userId) {\n throw new Error('job:fail missing _userId (gateway injection)');\n }\n const job: Job = {\n jobId: event.jobId,\n type: event.jobType,\n status: 'failed',\n resourceId: event.resourceId,\n userId: event._userId,\n created: '',\n completedAt: new Date().toISOString(),\n error: event.error,\n };\n addOrUpdate(job);\n jobFailed$.next(job);\n }),\n ];\n\n return {\n jobs$: jobs$.asObservable(),\n pendingByType$,\n runningJobs$,\n jobCreated$: jobCreated$.asObservable(),\n jobCompleted$: jobCompleted$.asObservable(),\n jobFailed$: jobFailed$.asObservable(),\n dispose: () => {\n subs.forEach((s) => s.unsubscribe());\n jobs$.complete();\n jobCreated$.complete();\n jobCompleted$.complete();\n jobFailed$.complete();\n },\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport type { ResourceId, components } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport { createBeckonVM, type BeckonVM } from '../flows/beckon-vm';\nimport { createMarkVM, type MarkVM } from '../flows/mark-vm';\nimport { createGatherVM, type GatherVM } from '../flows/gather-vm';\nimport { createMatchVM } from '../flows/match-vm';\nimport { createYieldVM, type YieldVM } from '../flows/yield-vm';\nimport type { SemiontClient } from '../../client';\nimport { decodeWithCharset } from '@semiont/core';\nimport { isHighlight, isComment, isAssessment, isReference, isTag } from '@semiont/core';\nimport type { ReferencedByEntry } from '../../namespaces/types';\n\nimport type { Annotation } from '@semiont/core';\n\nexport interface AnnotationGroups {\n highlights: Annotation[];\n comments: Annotation[];\n assessments: Annotation[];\n references: Annotation[];\n tags: Annotation[];\n}\ntype StoredEventResponse = components['schemas']['StoredEventResponse'];\n\nexport interface WizardState {\n open: boolean;\n annotationId: string | null;\n resourceId: string | null;\n defaultTitle: string;\n entityTypes: string[];\n}\n\nconst WIZARD_CLOSED: WizardState = {\n open: false, annotationId: null, resourceId: null, defaultTitle: '', entityTypes: [],\n};\n\nexport interface ResourceViewerPageVM extends ViewModel {\n beckon: BeckonVM;\n browse: ShellVM;\n mark: MarkVM;\n gather: GatherVM;\n yield: YieldVM;\n\n annotations$: Observable<Annotation[]>;\n annotationGroups$: Observable<AnnotationGroups>;\n entityTypes$: Observable<string[]>;\n events$: Observable<StoredEventResponse[]>;\n referencedBy$: Observable<ReferencedByEntry[]>;\n content$: Observable<string>;\n contentLoading$: Observable<boolean>;\n mediaToken$: Observable<string | null>;\n wizard$: Observable<WizardState>;\n\n closeWizard(): void;\n}\n\nexport function createResourceViewerPageVM(\n client: SemiontClient,\n resourceId: ResourceId,\n locale: string,\n browse: ShellVM,\n options?: { mediaType?: string },\n): ResourceViewerPageVM {\n const disposer = createDisposer();\n\n const beckon = createBeckonVM(client);\n const mark = createMarkVM(client, resourceId);\n const gather = createGatherVM(client, resourceId);\n const matchVM = createMatchVM(client, resourceId);\n const yieldVM = createYieldVM(client, resourceId, locale);\n\n disposer.add(beckon);\n disposer.add(browse);\n disposer.add(mark);\n disposer.add(gather);\n disposer.add(matchVM);\n disposer.add(yieldVM);\n\n const annotations$: Observable<Annotation[]> = client.browse.annotations(resourceId).pipe(\n map((a) => a ?? []),\n );\n\n const annotationGroups$: Observable<AnnotationGroups> = annotations$.pipe(\n map((anns) => {\n const groups: AnnotationGroups = { highlights: [], comments: [], assessments: [], references: [], tags: [] };\n for (const ann of anns) {\n if (isHighlight(ann)) groups.highlights.push(ann);\n else if (isComment(ann)) groups.comments.push(ann);\n else if (isAssessment(ann)) groups.assessments.push(ann);\n else if (isReference(ann)) groups.references.push(ann);\n else if (isTag(ann)) groups.tags.push(ann);\n }\n return groups;\n }),\n );\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n const events$: Observable<StoredEventResponse[]> = client.browse.events(resourceId).pipe(\n map((e) => e ?? []),\n );\n\n const referencedBy$: Observable<ReferencedByEntry[]> = client.browse.referencedBy(resourceId).pipe(\n map((r) => r ?? []),\n );\n\n const content$ = new BehaviorSubject<string>('');\n const contentLoading$ = new BehaviorSubject<boolean>(false);\n const mediaToken$ = new BehaviorSubject<string | null>(null);\n\n const mediaType = options?.mediaType || 'text/plain';\n const isBinaryType = mediaType.startsWith('image/') || mediaType === 'application/pdf';\n\n if (!isBinaryType && mediaType) {\n contentLoading$.next(true);\n client.browse.resourceRepresentation(resourceId, { accept: mediaType })\n .then(({ data }) => {\n content$.next(decodeWithCharset(data, mediaType));\n contentLoading$.next(false);\n })\n .catch(() => { contentLoading$.next(false); });\n }\n\n if (isBinaryType) {\n client.auth.mediaToken(resourceId)\n .then(({ token }) => mediaToken$.next(token))\n .catch(() => {});\n }\n\n const wizard$ = new BehaviorSubject<WizardState>(WIZARD_CLOSED);\n\n const unsubscribeResource = client.subscribeToResource(resourceId);\n disposer.add(unsubscribeResource);\n\n const bindInitiateSub = client.bus.get('bind:initiate').subscribe((event) => {\n wizard$.next({\n open: true,\n annotationId: event.annotationId,\n resourceId: event.resourceId,\n defaultTitle: event.defaultTitle,\n entityTypes: event.entityTypes,\n });\n client.bus.get('gather:requested').next({\n correlationId: crypto.randomUUID(),\n annotationId: event.annotationId,\n resourceId: event.resourceId,\n options: { contextWindow: 2000 },\n });\n });\n disposer.add(() => bindInitiateSub.unsubscribe());\n\n return {\n beckon,\n browse,\n mark,\n gather,\n yield: yieldVM,\n annotations$,\n annotationGroups$,\n entityTypes$,\n events$,\n referencedBy$,\n content$: content$.asObservable(),\n contentLoading$: contentLoading$.asObservable(),\n mediaToken$: mediaToken$.asObservable(),\n wizard$: wizard$.asObservable(),\n closeWizard: () => wizard$.next(WIZARD_CLOSED),\n dispose: () => {\n wizard$.complete();\n content$.complete();\n contentLoading$.complete();\n mediaToken$.complete();\n disposer.dispose();\n },\n };\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport type { GatheredContext, AnnotationId, ContentFormat, AccessToken, ResourceDescriptor } from '@semiont/core';\nimport { resourceId as makeResourceId, annotationId as makeAnnotationId } from '@semiont/core';\nimport { createDisposer } from '../lib/view-model';\nimport type { ViewModel } from '../lib/view-model';\nimport type { ShellVM } from '../flows/shell-vm';\nimport type { SemiontClient } from '../../client';\nimport { getPrimaryMediaType, decodeWithCharset } from '@semiont/core';\n\nexport type ComposeMode = 'new' | 'clone' | 'reference';\n\nexport interface ComposeParams {\n mode?: string | undefined;\n token?: string | undefined;\n annotationUri?: string | undefined;\n sourceDocumentId?: string | undefined;\n name?: string | undefined;\n entityTypes?: string | undefined;\n storedContext?: string | undefined;\n}\n\nexport interface CloneData {\n sourceResource: ResourceDescriptor;\n sourceContent: string;\n}\n\nexport interface ReferenceData {\n annotationUri: string;\n sourceDocumentId: string;\n name: string;\n entityTypes: string[];\n}\n\nexport interface SaveResourceParams {\n mode: ComposeMode;\n name: string;\n storageUri: string;\n content?: string;\n file?: File;\n format?: string;\n charset?: string;\n entityTypes?: string[];\n language: string;\n archiveOriginal?: boolean;\n annotationUri?: string;\n sourceDocumentId?: string;\n}\n\nexport interface ComposePageVM extends ViewModel {\n browse: ShellVM;\n mode$: Observable<ComposeMode>;\n loading$: Observable<boolean>;\n cloneData$: Observable<CloneData | null>;\n referenceData$: Observable<ReferenceData | null>;\n gatheredContext$: Observable<GatheredContext | null>;\n entityTypes$: Observable<string[]>;\n save(params: SaveResourceParams): Promise<string>;\n}\n\nexport function createComposePageVM(\n client: SemiontClient,\n browse: ShellVM,\n params: ComposeParams,\n auth?: AccessToken,\n): ComposePageVM {\n const disposer = createDisposer();\n disposer.add(browse);\n\n const isReferenceMode = Boolean(params.annotationUri && params.sourceDocumentId && params.name);\n const isCloneMode = params.mode === 'clone' && Boolean(params.token);\n const pageMode: ComposeMode = isCloneMode ? 'clone' : isReferenceMode ? 'reference' : 'new';\n\n const mode$ = new BehaviorSubject<ComposeMode>(pageMode);\n const loading$ = new BehaviorSubject<boolean>(true);\n const cloneData$ = new BehaviorSubject<CloneData | null>(null);\n const referenceData$ = new BehaviorSubject<ReferenceData | null>(null);\n const gatheredContext$ = new BehaviorSubject<GatheredContext | null>(null);\n\n const entityTypes$: Observable<string[]> = client.browse.entityTypes().pipe(\n map((e) => e ?? []),\n );\n\n // Initialize based on mode\n if (isReferenceMode) {\n const entityTypes = params.entityTypes ? params.entityTypes.split(',') : [];\n referenceData$.next({\n annotationUri: params.annotationUri!,\n sourceDocumentId: params.sourceDocumentId!,\n name: params.name!,\n entityTypes,\n });\n if (params.storedContext) {\n try { gatheredContext$.next(JSON.parse(params.storedContext)); } catch { /* ignore malformed */ }\n }\n loading$.next(false);\n } else if (isCloneMode) {\n void (async () => {\n try {\n const tokenResult = await client.yield.fromToken(params.token!);\n if (tokenResult && auth) {\n const rId = makeResourceId(tokenResult['@id']);\n const mediaType = getPrimaryMediaType(tokenResult) || 'text/plain';\n const { data } = await client.browse.resourceRepresentation(rId, {\n accept: mediaType as ContentFormat,\n });\n const content = decodeWithCharset(data, mediaType);\n cloneData$.next({ sourceResource: tokenResult, sourceContent: content });\n }\n } catch {\n // Error handling is the consumer's responsibility (toast)\n }\n loading$.next(false);\n })();\n } else {\n loading$.next(false);\n }\n\n const save = async (saveParams: SaveResourceParams): Promise<string> => {\n if (saveParams.mode === 'clone') {\n const response = await client.yield.createFromToken({\n token: params.token!,\n name: saveParams.name,\n content: saveParams.content!,\n archiveOriginal: saveParams.archiveOriginal ?? true,\n });\n return response.resourceId;\n }\n\n let fileToUpload: File;\n let mimeType: string;\n\n if (saveParams.file) {\n fileToUpload = saveParams.file;\n mimeType = saveParams.format ?? 'application/octet-stream';\n } else {\n const blob = new Blob([saveParams.content || ''], { type: saveParams.format ?? 'application/octet-stream' });\n const extension = saveParams.format === 'text/plain' ? '.txt' : saveParams.format === 'text/html' ? '.html' : '.md';\n fileToUpload = new File([blob], saveParams.name + extension, { type: saveParams.format ?? 'application/octet-stream' });\n mimeType = saveParams.format ?? 'application/octet-stream';\n }\n\n const format = saveParams.charset && !saveParams.file ? `${mimeType}; charset=${saveParams.charset}` : mimeType;\n\n const response = await client.yield.resource({\n name: saveParams.name,\n file: fileToUpload,\n format,\n entityTypes: saveParams.entityTypes || [],\n language: saveParams.language,\n creationMethod: 'ui',\n storageUri: saveParams.storageUri,\n });\n\n const newResourceId = response.resourceId;\n\n if (saveParams.mode === 'reference' && saveParams.annotationUri && saveParams.sourceDocumentId) {\n await client.bind.body(\n makeResourceId(saveParams.sourceDocumentId),\n makeAnnotationId(saveParams.annotationUri) as AnnotationId,\n [{ op: 'add', item: { type: 'SpecificResource' as const, source: newResourceId, purpose: 'linking' as const } }],\n );\n }\n\n return newResourceId;\n };\n\n return {\n browse,\n mode$: mode$.asObservable(),\n loading$: loading$.asObservable(),\n cloneData$: cloneData$.asObservable(),\n referenceData$: referenceData$.asObservable(),\n gatheredContext$: gatheredContext$.asObservable(),\n entityTypes$,\n save,\n dispose: () => {\n mode$.complete();\n loading$.complete();\n cloneData$.complete();\n referenceData$.complete();\n gatheredContext$.complete();\n disposer.dispose();\n },\n };\n}\n"]}
|