@semiont/api-client 0.4.21 → 0.4.22
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 +49 -91
- package/dist/index.d.ts +87 -1965
- package/dist/index.js +479 -4275
- package/dist/index.js.map +1 -1
- package/package.json +3 -7
- package/dist/utils/index.d.ts +0 -584
- package/dist/utils/index.js +0 -646
- package/dist/utils/index.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/view-models/domain/actor-vm.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/utils/text-encoding.ts","../src/utils/annotations.ts","../src/view-models/pages/resource-viewer-page-vm.ts","../src/utils/fuzzy-anchor.ts","../src/utils/locales.ts","../src/utils/resources.ts","../src/utils/svg-utils.ts","../src/utils/text-context.ts","../src/utils/validation.ts","../src/view-models/pages/compose-page-vm.ts","../src/mime-utils.ts"],"names":["baseUrl","filter","map","BehaviorSubject","makeAnnotationId","makeResourceId","Observable","merge","takeUntil","timeout","makeEmail","makeRefreshToken","EventBus","Subject","fetch","distinctUntilChanged","resourceId","take","firstValueFrom","pos","context","response"],"mappings":"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","file":"index.js","sourcesContent":["import { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { filter, map, share } from 'rxjs/operators';\nimport type { ViewModel } from '../lib/view-model';\n\n/**\n * Runtime-toggleable cross-wire bus logging. Off by default — zero\n * cost on the hot path when `window.__SEMIONT_BUS_LOG__` is falsy.\n *\n * Turn on from DevTools:\n * window.__SEMIONT_BUS_LOG__ = true\n * Or from a Playwright test:\n * page.addInitScript(() => { window.__SEMIONT_BUS_LOG__ = true; });\n *\n * Output format (grep-friendly):\n * [bus EMIT] <channel> [scope=X] [cid=<first 8>] <payload>\n * [bus RECV] <channel> [scope=X] [cid=<first 8>] <payload>\n *\n * This covers only events that cross the browser↔backend boundary —\n * local-only eventBus emissions stay invisible here (by design:\n * they don't go through ActorVM). For full local-bus observation,\n * hook `@semiont/core`'s EventBus separately.\n */\nfunction busLog(\n direction: 'EMIT' | 'RECV',\n channel: string,\n payload: Record<string, unknown>,\n scope?: string,\n): void {\n if (typeof globalThis === 'undefined') return;\n const g = globalThis as { __SEMIONT_BUS_LOG__?: boolean };\n if (!g.__SEMIONT_BUS_LOG__) return;\n const cid = (payload as { correlationId?: string } | undefined)?.correlationId;\n const tag = `[bus ${direction}] ${channel}` +\n (scope ? ` scope=${scope}` : '') +\n (cid ? ` cid=${String(cid).slice(0, 8)}` : '');\n // eslint-disable-next-line no-console\n console.debug(tag, payload);\n}\n\nexport interface BusEvent {\n channel: string;\n payload: Record<string, unknown>;\n scope?: string;\n}\n\nexport interface ActorVMOptions {\n baseUrl: string;\n token: string | (() => string);\n channels: string[];\n scope?: string;\n reconnectMs?: number;\n}\n\n/**\n * Connection state exposed by the SSE bus actor.\n *\n * initial ─ before start() has been called\n * connecting ─ fetch() in flight, no bytes yet\n * open ─ SSE stream live, first byte seen\n * reconnecting ─ open → dropped, retrying; may be transient\n * degraded ─ has been reconnecting for > DEGRADED_THRESHOLD_MS;\n * UI banner threshold; distinguishes brief mount-\n * churn cycles from sustained disconnection\n * closed ─ stop()/dispose() called; terminal\n *\n * Transition rules are enforced by a helper that throws on invalid\n * transitions — catches bugs in the reconnect loop that would\n * otherwise strand the observable in a lying value.\n */\nexport type ConnectionState =\n | 'initial'\n | 'connecting'\n | 'open'\n | 'reconnecting'\n | 'degraded'\n | 'closed';\n\n/** Time in the `reconnecting` state before transitioning to `degraded`. */\nexport const DEGRADED_THRESHOLD_MS = 3_000;\n\nexport interface ActorVM extends ViewModel {\n on$<T = Record<string, unknown>>(channel: string): Observable<T>;\n emit(channel: string, payload: Record<string, unknown>, emitScope?: string): Promise<void>;\n state$: Observable<ConnectionState>;\n addChannels(channels: string[], scope?: string): void;\n removeChannels(channels: string[]): void;\n start(): void;\n stop(): void;\n}\n\n/** Allowed transitions in the connection state machine. */\nconst ALLOWED_TRANSITIONS: Record<ConnectionState, ReadonlyArray<ConnectionState>> = {\n initial: ['connecting', 'closed'],\n connecting: ['open', 'reconnecting', 'closed'],\n open: ['reconnecting', 'closed'],\n reconnecting: ['connecting', 'degraded', 'closed'],\n degraded: ['connecting', 'closed'],\n closed: [],\n};\n\nexport function createActorVM(options: ActorVMOptions): ActorVM {\n const { baseUrl, token: tokenOrGetter, channels: initialChannels, scope: initialScope, reconnectMs = 5_000 } = options;\n const getToken = typeof tokenOrGetter === 'function' ? tokenOrGetter : () => tokenOrGetter;\n\n // TEMPORARY DIAGNOSTIC — actor instance counter.\n const g = globalThis as { __SEMIONT_ACTOR_INSTANCES__?: number };\n g.__SEMIONT_ACTOR_INSTANCES__ = (g.__SEMIONT_ACTOR_INSTANCES__ ?? 0) + 1;\n const actorSerial = g.__SEMIONT_ACTOR_INSTANCES__;\n // eslint-disable-next-line no-console\n console.debug(`[diag] ActorVM #${actorSerial} constructed (baseUrl=${baseUrl})`);\n\n const globalChannels = new Set(initialChannels);\n const scopedChannels = new Set<string>();\n let activeScope = initialScope;\n\n const events$ = new Subject<BusEvent>();\n const state$ = new BehaviorSubject<ConnectionState>('initial');\n let currentState: ConnectionState = 'initial';\n let degradedTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Move the state machine to `next`. Throws on invalid transitions.\n * The throw is deliberate — a bad transition means a bug in the\n * reconnect loop; silent correction would hide it. The reconnect\n * timer logic is responsible for ensuring we only transition\n * between valid states.\n *\n * Side effect: manages the `degraded` timer. Enters on\n * `reconnecting`, cleared on exit.\n */\n const transition = (next: ConnectionState): void => {\n if (currentState === next) return;\n const allowed = ALLOWED_TRANSITIONS[currentState];\n if (!allowed.includes(next)) {\n throw new Error(`Invalid connection state transition: ${currentState} → ${next}`);\n }\n const prev = currentState;\n currentState = next;\n\n if (next === 'reconnecting' && prev !== 'reconnecting') {\n // Starting a reconnect cycle — arm the degraded-threshold timer.\n if (degradedTimer) clearTimeout(degradedTimer);\n degradedTimer = setTimeout(() => {\n if (currentState === 'reconnecting') transition('degraded');\n }, DEGRADED_THRESHOLD_MS);\n }\n if (prev === 'reconnecting' && next !== 'reconnecting') {\n // Leaving reconnecting (to connecting, degraded, or closed) —\n // the timer is either no longer relevant or has just fired.\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n }\n\n state$.next(next);\n };\n\n let running = false;\n /**\n * All in-flight SSE fetch controllers. Tracked as a Set because\n * connect() may race with itself under mount-churn or rapid channel-\n * set changes — whenever a new connect() starts we abort ALL previous\n * in-flight fetches rather than only the last-tracked one. A previous\n * single-slot implementation leaked orphaned streams (diagnosed by\n * observing 3 concurrent SSE subscribes in the /bus/subscribe network\n * log, each delivering duplicate RECV frames). Using a Set guarantees\n * at most one live stream post-reconnect regardless of race order.\n */\n const inflightControllers = new Set<AbortController>();\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * `Last-Event-ID` of the most recently delivered SSE event from the\n * server. Sent as a request header on each connect so the server can\n * replay persisted events missed during the disconnect (see\n * `apps/backend/src/routes/bus.ts` subscribe handler). Initialised\n * `null` — fresh connections send no header.\n *\n * We track both persisted (`p-*`) and ephemeral (`e-*`) ids. The server\n * treats ephemeral ids as \"no resumption context\" and responds live-\n * only; persisted ids drive replay.\n */\n let lastEventId: string | null = null;\n\n const shared$ = events$.pipe(share());\n\n const disconnect = () => {\n for (const c of inflightControllers) {\n try { c.abort(); } catch { /* noop */ }\n }\n inflightControllers.clear();\n if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }\n };\n\n const connect = async () => {\n // Transition to `connecting` from whichever reconnect-ish state\n // we're currently in (`initial`, `reconnecting`, `degraded`).\n transition('connecting');\n\n // Abort every previous in-flight fetch before starting a new one.\n // This closes the orphan-stream leak described above.\n for (const c of inflightControllers) {\n try { c.abort(); } catch { /* noop */ }\n }\n inflightControllers.clear();\n\n const params = new URLSearchParams();\n for (const ch of globalChannels) {\n params.append('channel', ch);\n }\n if (activeScope && scopedChannels.size > 0) {\n params.append('scope', activeScope);\n for (const ch of scopedChannels) {\n params.append('scoped', ch);\n }\n }\n const url = `${baseUrl}/bus/subscribe?${params.toString()}`;\n\n const controller = new AbortController();\n inflightControllers.add(controller);\n\n try {\n const headers: Record<string, string> = { Authorization: `Bearer ${getToken()}` };\n if (lastEventId) headers['Last-Event-ID'] = lastEventId;\n const response = await fetch(url, { headers, signal: controller.signal });\n\n if (!response.ok || !response.body) {\n throw new Error(`SSE connect failed: ${response.status}`);\n }\n\n transition('open');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // SSE parse state is declared OUTSIDE the read loop: a single\n // event can span many `reader.read()` chunks when the payload is\n // large (a full resource-result with annotations can easily exceed\n // one TCP segment). Resetting these on every read would silently\n // drop any event whose `event:`/`id:` headers land in one chunk\n // and whose terminating blank line lands in the next.\n let currentEvent = '';\n let currentData = '';\n let currentId: string | undefined;\n\n while (running && inflightControllers.has(controller)) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line.startsWith('id: ')) {\n currentId = line.slice(4);\n } else if (line === '') {\n if (currentEvent === 'bus-event' && currentData) {\n if (currentId !== undefined) lastEventId = currentId;\n const parsed = JSON.parse(currentData) as BusEvent;\n busLog('RECV', parsed.channel, parsed.payload, parsed.scope);\n events$.next(parsed);\n }\n currentEvent = '';\n currentData = '';\n currentId = undefined;\n }\n }\n }\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n // Any non-abort error falls through to the reconnect-retry block.\n } finally {\n inflightControllers.delete(controller);\n }\n\n // If we reached here without an AbortError, the connection dropped\n // or the fetch failed. Transition to reconnecting and schedule a\n // retry after `reconnectMs`.\n if (running) {\n transition('reconnecting');\n reconnectTimer = setTimeout(() => {\n if (running) connect();\n }, reconnectMs);\n }\n };\n\n const reconnect = () => {\n if (!running) return;\n // Transition to `reconnecting` BEFORE aborting the current\n // connection. This matches the pre-state-machine contract where\n // gap-detection relied on seeing a \"dropped\" signal before a\n // subsequent \"connected\" signal; with the state machine, the\n // transition sequence `open → reconnecting → connecting → open`\n // is what BrowseNamespace's gap-detection (pre-BUS-RESUMPTION\n // code path) watches for.\n if (currentState === 'open' || currentState === 'connecting' || currentState === 'degraded') {\n transition('reconnecting');\n }\n disconnect();\n connect();\n };\n\n // Debounce channel-set-change reconnects. React StrictMode in dev\n // produces mount → cleanup → mount synchronously, which previously\n // translated into three back-to-back reconnects — enough to tear down\n // in-flight responses, fire gap detection, refetch, tear that down\n // again, and leave the page stuck in \"Loading...\" while caches\n // thrashed. With a short debounce the whole sequence collapses into\n // one reconnect after the final channel-set is stable.\n let reconnectTimer2: ReturnType<typeof setTimeout> | null = null;\n const RECONNECT_DEBOUNCE_MS = 100;\n const scheduleReconnect = () => {\n if (reconnectTimer2) clearTimeout(reconnectTimer2);\n reconnectTimer2 = setTimeout(() => {\n reconnectTimer2 = null;\n reconnect();\n }, RECONNECT_DEBOUNCE_MS);\n };\n\n return {\n on$<T = Record<string, unknown>>(channel: string): Observable<T> {\n return shared$.pipe(\n filter((e) => e.channel === channel),\n map((e) => e.payload as T),\n );\n },\n\n emit: async (channel: string, payload: Record<string, unknown>, emitScope?: string): Promise<void> => {\n busLog('EMIT', channel, payload, emitScope);\n const body: Record<string, unknown> = { channel, payload };\n if (emitScope) body.scope = emitScope;\n await fetch(`${baseUrl}/bus/emit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${getToken()}`,\n },\n body: JSON.stringify(body),\n });\n },\n\n state$: state$.asObservable(),\n\n addChannels: (channels: string[], scope?: string) => {\n let changed = false;\n if (scope !== undefined) {\n for (const ch of channels) {\n if (!scopedChannels.has(ch)) { scopedChannels.add(ch); changed = true; }\n }\n if (scope !== activeScope) { activeScope = scope; changed = true; }\n } else {\n for (const ch of channels) {\n if (!globalChannels.has(ch)) { globalChannels.add(ch); changed = true; }\n }\n }\n if (changed) scheduleReconnect();\n },\n\n removeChannels: (channels: string[]) => {\n let changed = false;\n for (const ch of channels) {\n if (scopedChannels.delete(ch)) changed = true;\n if (globalChannels.delete(ch)) changed = true;\n }\n if (scopedChannels.size === 0) activeScope = undefined;\n if (changed) scheduleReconnect();\n },\n\n start: () => {\n if (running) return;\n running = true;\n connect();\n },\n\n stop: () => {\n running = false;\n if (currentState !== 'closed') transition('closed');\n if (reconnectTimer2) { clearTimeout(reconnectTimer2); reconnectTimer2 = null; }\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n disconnect();\n },\n\n dispose: () => {\n running = false;\n if (currentState !== 'closed') transition('closed');\n if (reconnectTimer2) { clearTimeout(reconnectTimer2); reconnectTimer2 = null; }\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n disconnect();\n events$.complete();\n state$.complete();\n },\n };\n}\n","import { firstValueFrom, merge } from 'rxjs';\nimport { filter, map, take, timeout } from 'rxjs/operators';\nimport type { ActorVM } from './view-models/domain/actor-vm';\n\nexport class BusRequestError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'BusRequestError';\n }\n}\n\nexport async function busRequest<TResult>(\n actor: ActorVM,\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 actor.on$<Record<string, unknown>>(resultChannel).pipe(\n filter((e) => e.correlationId === correlationId),\n map((e) => ({ ok: true as const, response: e.response as TResult })),\n ),\n actor.on$<Record<string, unknown>>(failureChannel).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 actor.emit(emitChannel, fullPayload);\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 EventBus,\n EventMap,\n ResourceId,\n AnnotationId,\n AccessToken,\n GraphConnection,\n components,\n} from '@semiont/core';\nimport type { SemiontApiClient } from '../client';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport { busRequest } from '../bus-request';\nimport { createCache, type Cache } from '../cache';\nimport type {\n BrowseNamespace as IBrowseNamespace,\n ReferencedByEntry,\n AnnotationHistoryResponse,\n} from './types';\n\ntype Annotation = components['schemas']['Annotation'];\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\ntype StoredEventResponse = components['schemas']['StoredEventResponse'];\ntype EnrichedResourceEvent = components['schemas']['EnrichedResourceEvent'];\n\ntype GetResourceResponse = components['schemas']['GetResourceResponse'];\ntype AnnotationsListResponse = components['schemas']['GetAnnotationsResponse'];\n\ntype TokenGetter = () => AccessToken | undefined;\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 private readonly getToken: TokenGetter;\n private readonly actor: ActorVM;\n\n constructor(\n private readonly http: SemiontApiClient,\n private readonly eventBus: EventBus,\n getToken: TokenGetter,\n actor: ActorVM,\n ) {\n this.getToken = getToken;\n this.actor = actor;\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.actor,\n 'browse:resource-requested',\n { resourceId: id },\n 'browse:resource-result',\n 'browse:resource-failed',\n );\n return result.resource;\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.actor,\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.actor,\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.actor,\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.actor,\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.actor,\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.actor,\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));\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.http.getResourceRepresentation(resourceId, {\n accept: 'text/plain' as components['schemas']['ContentFormat'],\n auth: this.getToken(),\n });\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.http.getResourceRepresentation(resourceId, {\n accept: options?.accept as components['schemas']['ContentFormat'],\n auth: this.getToken(),\n });\n }\n\n async resourceRepresentationStream(\n resourceId: ResourceId,\n options?: { accept?: string },\n ): Promise<{ stream: ReadableStream<Uint8Array>; contentType: string }> {\n return this.http.getResourceRepresentationStream(resourceId, {\n accept: options?.accept as components['schemas']['ContentFormat'],\n auth: this.getToken(),\n });\n }\n\n async resourceEvents(resourceId: ResourceId): Promise<StoredEventResponse[]> {\n const result = await busRequest<{ events: StoredEventResponse[] }>(\n this.actor,\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.actor,\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.actor,\n 'browse:directory-requested',\n { path: dirPath ?? '.', sort: sort ?? 'name' },\n 'browse:directory-result',\n 'browse:directory-failed',\n );\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.eventBus.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);\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 AccessToken,\n EventBus,\n} from '@semiont/core';\nimport type { SemiontApiClient } from '../client';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport { busRequest } from '../bus-request';\nimport type {\n MarkNamespace as IMarkNamespace,\n CreateAnnotationInput,\n MarkAssistOptions,\n MarkAssistProgress,\n} from './types';\nimport type { UpdateResourceInput } from '@semiont/core';\n\ntype TokenGetter = () => AccessToken | undefined;\n\nexport class MarkNamespace implements IMarkNamespace {\n constructor(\n private readonly http: SemiontApiClient,\n private readonly eventBus: EventBus,\n private readonly getToken: TokenGetter,\n private readonly actor: ActorVM,\n ) {}\n\n async annotation(resourceId: ResourceId, input: CreateAnnotationInput): Promise<{ annotationId: string }> {\n return busRequest<{ annotationId: string }>(\n this.actor,\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.actor.emit('mark:delete', { annotationId, resourceId });\n }\n\n async entityType(type: string): Promise<void> {\n await this.actor.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.actor.emit('mark:add-entity-type', { tag });\n }\n }\n\n async updateResource(resourceId: ResourceId, data: UpdateResourceInput): Promise<void> {\n return this.http.updateResource(resourceId, data, { auth: this.getToken() });\n }\n\n async archive(resourceId: ResourceId): Promise<void> {\n await this.actor.emit('mark:archive', { resourceId });\n }\n\n async unarchive(resourceId: ResourceId): Promise<void> {\n await this.actor.emit('mark:unarchive', { resourceId });\n }\n\n assist(resourceId: ResourceId, motivation: Motivation, options: MarkAssistOptions): Observable<MarkAssistProgress> {\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 }>(\n this.actor, '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 subscriber.next({ motivation, resourceId: resourceId as string, progress: status.result } as unknown as MarkAssistProgress);\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.eventBus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.eventBus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.eventBus.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 // e.progress is the JobProgress payload. Consumers expect\n // progress-shaped events; we forward that directly.\n subscriber.next(e.progress as MarkAssistProgress);\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe(() => {\n cleanup();\n subscriber.complete();\n });\n\n const failSub = fail$.subscribe((e) => {\n cleanup();\n subscriber.error(new Error(e.error));\n });\n\n const auth = this.getToken();\n this.dispatchAssist(resourceId, motivation, options, auth)\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 private async dispatchAssist(\n resourceId: ResourceId,\n motivation: Motivation,\n options: MarkAssistOptions,\n _auth: AccessToken | undefined,\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.actor,\n 'job:create',\n { jobType, resourceId, params },\n 'job:created',\n 'job:create-failed',\n );\n }\n}\n","import type { ResourceId, AnnotationId, BodyOperation } from '@semiont/core';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport type { BindNamespace as IBindNamespace } from './types';\n\nexport class BindNamespace implements IBindNamespace {\n constructor(\n private readonly actor: ActorVM,\n ) {}\n\n async body(resourceId: ResourceId, annotationId: AnnotationId, operations: BodyOperation[]): Promise<void> {\n await this.actor.emit('bind:update-body', {\n correlationId: crypto.randomUUID(),\n annotationId,\n resourceId,\n operations,\n });\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 { ActorVM } from '../view-models/domain/actor-vm';\nimport type { GatherNamespace as IGatherNamespace, GatherAnnotationProgress } from './types';\n\nexport class GatherNamespace implements IGatherNamespace {\n constructor(\n private readonly eventBus: EventBus,\n private readonly actor: ActorVM,\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.eventBus.get('gather:complete').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.eventBus.get('gather:failed').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n\n const sub = merge(\n this.eventBus.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.actor.emit('gather:requested', {\n correlationId,\n annotationId,\n resourceId,\n 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 } from '@semiont/core';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport type { MatchNamespace as IMatchNamespace, MatchSearchProgress } from './types';\n\nexport class MatchNamespace implements IMatchNamespace {\n constructor(\n private readonly eventBus: EventBus,\n private readonly actor: ActorVM,\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.eventBus.get('match:search-results').pipe(\n filter((e) => e.correlationId === correlationId),\n );\n const failed$ = this.eventBus.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.actor.emit('match:search-requested', {\n correlationId,\n resourceId,\n referenceId,\n context: context as unknown as Record<string, unknown>,\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 AccessToken,\n EventBus,\n components,\n} from '@semiont/core';\n\n// YieldProgress is the per-yield view of a job's JobProgress payload;\n// we don't need a separate schema type now that job:* carries both.\ntype YieldProgress = components['schemas']['JobProgress'];\nimport type { SemiontApiClient } from '../client';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport { busRequest } from '../bus-request';\nimport type {\n YieldNamespace as IYieldNamespace,\n CreateResourceInput,\n GenerationOptions,\n CreateFromTokenOptions,\n} from './types';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\ntype GetResourceByTokenResponse = components['schemas']['GetResourceByTokenResponse'];\ntype TokenGetter = () => AccessToken | undefined;\n\nexport class YieldNamespace implements IYieldNamespace {\n constructor(\n private readonly http: SemiontApiClient,\n private readonly eventBus: EventBus,\n private readonly getToken: TokenGetter,\n private readonly actor: ActorVM,\n ) {}\n\n async resource(data: CreateResourceInput): Promise<{ resourceId: string }> {\n return this.http.yieldResource(data, { auth: this.getToken() });\n }\n\n fromAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n options: GenerationOptions,\n ): Observable<YieldProgress> {\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 }>(\n this.actor, '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 subscriber.next({ stage: 'complete', percentage: 100, message: 'Generation complete' });\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.eventBus.get('job:report-progress').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const complete$ = this.eventBus.get('job:complete').pipe(\n filter((e) => e.jobId === activeJobId),\n );\n const fail$ = this.eventBus.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 subscriber.next(e.progress as YieldProgress);\n if (activeJobId) resetPollTimer(activeJobId);\n });\n\n const completeSub = complete$.subscribe(() => {\n cleanup();\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.actor,\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.actor,\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.actor,\n 'yield:clone-resource-requested',\n { token },\n 'yield:clone-resource-result',\n 'yield:clone-resource-failed',\n );\n return result.sourceResource;\n }\n\n async createFromToken(options: CreateFromTokenOptions): Promise<{ resourceId: string }> {\n return busRequest<{ resourceId: string }>(\n this.actor,\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","import type { AnnotationId, ResourceId } from '@semiont/core';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\nimport type { BeckonNamespace as IBeckonNamespace } from './types';\n\nexport class BeckonNamespace implements IBeckonNamespace {\n constructor(\n private readonly actor: ActorVM,\n ) {}\n\n attention(annotationId: AnnotationId, resourceId: ResourceId): void {\n this.actor.emit('beckon:focus', { annotationId, resourceId }).catch(() => {});\n }\n}\n","import type { JobId, components } from '@semiont/core';\nimport type { ActorVM } from '../view-models/domain/actor-vm';\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 actor: ActorVM,\n ) {}\n\n async status(jobId: JobId): Promise<JobStatusResponse> {\n return busRequest<JobStatusResponse>(\n this.actor,\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 await this.actor.emit('job:cancel-requested', { jobId, type });\n }\n}\n","/**\n * AuthNamespace — authentication\n */\n\nimport type { ResourceId, AccessToken, components } from '@semiont/core';\nimport { email as makeEmail, googleCredential, refreshToken as makeRefreshToken } from '@semiont/core';\nimport type { SemiontApiClient } from '../client';\nimport type { AuthNamespace as IAuthNamespace, User } from './types';\n\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenGetter = () => AccessToken | undefined;\n\nexport class AuthNamespace implements IAuthNamespace {\n constructor(\n private readonly http: SemiontApiClient,\n private readonly getToken: TokenGetter,\n ) {}\n\n async password(emailStr: string, passwordStr: string): Promise<AuthResponse> {\n return this.http.authenticatePassword(makeEmail(emailStr), passwordStr) as unknown as Promise<AuthResponse>;\n }\n\n async google(credential: string): Promise<AuthResponse> {\n return this.http.authenticateGoogle(googleCredential(credential)) as unknown as Promise<AuthResponse>;\n }\n\n async refresh(token: string): Promise<AuthResponse> {\n return this.http.refreshToken(makeRefreshToken(token)) as unknown as Promise<AuthResponse>;\n }\n\n async logout(): Promise<void> {\n await this.http.logout({ auth: this.getToken() });\n }\n\n async me(): Promise<User> {\n // getMe returns UserResponse (flat user object), which we return directly\n return this.http.getMe({ auth: this.getToken() }) as unknown as Promise<User>;\n }\n\n async acceptTerms(): Promise<void> {\n await this.http.acceptTerms({ auth: this.getToken() });\n }\n\n async mcpToken(): Promise<{ token: string }> {\n return this.http.generateMCPToken({ auth: this.getToken() }) as unknown as Promise<{ token: string }>;\n }\n\n async mediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.http.getMediaToken(resourceId, { auth: this.getToken() });\n }\n}\n","/**\n * AdminNamespace — administration\n */\n\nimport type { AccessToken, UserDID, components, paths } from '@semiont/core';\nimport type { SemiontApiClient } from '../client';\nimport type { AdminNamespace as IAdminNamespace, User, RequestContent, ResponseContent } from './types';\n\ntype AdminUserStatsResponse = components['schemas']['AdminUserStatsResponse'];\ntype OAuthConfigResponse = components['schemas']['OAuthConfigResponse'];\ntype TokenGetter = () => AccessToken | undefined;\n\nexport class AdminNamespace implements IAdminNamespace {\n constructor(\n private readonly http: SemiontApiClient,\n private readonly getToken: TokenGetter,\n ) {}\n\n async users(): Promise<User[]> {\n const result = await this.http.listUsers({ auth: this.getToken() });\n return (result as unknown as { users: User[] }).users;\n }\n\n async userStats(): Promise<AdminUserStatsResponse> {\n return this.http.getUserStats({ auth: this.getToken() });\n }\n\n async updateUser(userId: UserDID, data: RequestContent<paths['/api/admin/users/{id}']['patch']>): Promise<User> {\n const result = await this.http.updateUser(userId, data, { auth: this.getToken() });\n return (result as unknown as { user: User }).user;\n }\n\n async oauthConfig(): Promise<OAuthConfigResponse> {\n return this.http.getOAuthConfig({ auth: this.getToken() });\n }\n\n async healthCheck(): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.http.healthCheck({ auth: this.getToken() });\n }\n\n async status(): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.http.getStatus({ auth: this.getToken() });\n }\n\n async backup(): Promise<Response> {\n return this.http.backupKnowledgeBase({ auth: this.getToken() });\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.http.restoreKnowledgeBase(file, { auth: this.getToken(), onProgress });\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<Response> {\n return this.http.exportKnowledgeBase(params, { auth: this.getToken() });\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.http.importKnowledgeBase(file, { auth: this.getToken(), onProgress });\n }\n}\n","/**\n * Common API client for Semiont backend\n *\n * This client can be used by:\n * - MCP server (Node.js)\n * - Demo scripts (Node.js)\n * - Frontend (Next.js/React - can wrap with hooks)\n *\n * Uses ky for HTTP requests with built-in retry, timeout, and error handling.\n */\n\nimport ky, { HTTPError, type KyInstance } from 'ky';\nimport type { paths, components } from '@semiont/core';\nimport type {\n ResourceId,\n AnnotationId,\n AccessToken,\n BaseUrl,\n BodyOperation,\n CloneToken,\n ContentFormat,\n Email,\n EntityType,\n GoogleCredential,\n JobId,\n Motivation,\n RefreshToken,\n SearchQuery,\n UserDID\n} from '@semiont/core';\nimport { EventBus, type EventMap } from '@semiont/core';\nimport { createActorVM, type ActorVM } from './view-models/domain/actor-vm';\nimport { busRequest } from './bus-request';\nimport { BehaviorSubject, type Observable } 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 { Logger } from '@semiont/core';\nimport { PERSISTED_EVENT_TYPES, RESOURCE_BROADCAST_TYPES } from '@semiont/core';\nimport type { Subscription } from 'rxjs';\n\nconst RESOURCE_SCOPED_CHANNELS = [\n ...PERSISTED_EVENT_TYPES.filter(t => t !== 'mark:entity-type-added'),\n ...RESOURCE_BROADCAST_TYPES,\n];\n\nconst BUS_RESULT_CHANNELS = [\n 'browse:resources-result', 'browse:resources-failed',\n 'browse:resource-result', 'browse:resource-failed',\n 'browse:annotations-result', 'browse:annotations-failed',\n 'browse:annotation-result', 'browse:annotation-failed',\n 'browse:annotation-history-result', 'browse:annotation-history-failed',\n 'browse:events-result', 'browse:events-failed',\n 'browse:referenced-by-result', 'browse:referenced-by-failed',\n 'browse:entity-types-result', 'browse:entity-types-failed',\n 'browse:directory-result', 'browse:directory-failed',\n 'browse:annotation-context-result', 'browse:annotation-context-failed',\n 'mark:delete-ok', 'mark:delete-failed',\n 'mark:create-ok', 'mark:create-failed',\n 'match:search-results', 'match:search-failed',\n 'gather:complete', 'gather:failed',\n 'gather:annotation-progress', 'gather:annotation-finished',\n 'gather:summary-result', 'gather:summary-failed',\n 'bind:body-updated', 'bind:body-update-failed',\n 'job:report-progress', 'job:complete', 'job:fail',\n 'job:status-result', 'job:status-failed',\n 'job:created', 'job:create-failed',\n 'job:claimed', 'job:claim-failed',\n 'yield:clone-token-generated', 'yield:clone-token-failed',\n 'yield:clone-resource-result', 'yield:clone-resource-failed',\n 'yield:clone-created', 'yield:clone-create-failed',\n 'mark:entity-type-added',\n 'beckon:focus', 'beckon:sparkle',\n 'bus:resume-gap',\n] as const;\n\n// Every global-SSE-delivered channel is bridged from the bus actor\n// into the local EventBus so namespace Observables, flow VMs, and UI\n// components subscribing via `eventBus.get(channel)` receive events\n// without needing to know about the actor or SSE wire format.\n//\n// In practice this is all `BUS_RESULT_CHANNELS` plus cross-participant\n// UI signals — the set is identical, since every channel the frontend\n// subscribes to globally is one we want on the local bus. Scoped\n// channels are bridged separately inside `subscribeToResource`.\nconst ACTOR_TO_LOCAL_BRIDGES = BUS_RESULT_CHANNELS;\n\n// Type helpers to extract request/response types from OpenAPI paths\ntype ResponseContent<T> = T extends { responses: { 200: { content: { 'application/json': infer R } } } }\n ? R\n : T extends { responses: { 201: { content: { 'application/json': infer R } } } }\n ? R\n : T extends { responses: { 202: { content: { 'application/json': infer R } } } }\n ? R\n : never;\n\ntype RequestContent<T> = T extends { requestBody?: { content: { 'application/json': infer R } } } ? R : never;\n\n// API Error class\nexport class APIError extends Error {\n constructor(\n message: string,\n public status: number,\n public statusText: string,\n public details?: unknown\n ) {\n super(message);\n this.name = 'APIError';\n }\n}\n\n/**\n * Optional callback invoked when a request fails with HTTP 401. If it\n * resolves to a non-null token, the failed request is retried once with\n * the new Bearer token. If it resolves to null (or throws), the original\n * 401 propagates as an APIError.\n *\n * Implementations must dedupe concurrent calls so that simultaneous 401s\n * don't fire multiple parallel refresh requests. `SemiontSession.refresh()`\n * satisfies this via an in-flight Promise map keyed by KB id.\n */\nexport type TokenRefresher = () => Promise<string | null>;\n\nexport interface SemiontApiClientConfig {\n baseUrl: BaseUrl;\n /**\n * Observable access token. All auth (HTTP + bus) reads the current value.\n * Update by calling `.next(newToken)` on the BehaviorSubject. The bus actor\n * auto-starts when the value transitions from null to a real token.\n * If omitted, the client operates unauthenticated (public endpoints only).\n */\n token$?: BehaviorSubject<AccessToken | null>;\n timeout?: number;\n retry?: number;\n logger?: Logger;\n /** Optional 401-recovery hook. See {@link TokenRefresher}. */\n tokenRefresher?: TokenRefresher;\n}\n\n/**\n * Options for individual API requests\n */\nexport interface RequestOptions {\n /** Access token for this request */\n auth?: AccessToken;\n}\n\n/**\n * Semiont API Client\n *\n * Provides type-safe methods for all Semiont backend API endpoints.\n * This client is fully stateless - authentication must be provided per request.\n */\nexport class SemiontApiClient {\n private http: KyInstance;\n readonly baseUrl: BaseUrl;\n /**\n * Workspace-scoped EventBus — owned by the client, constructed\n * internally, never accepted from config. Private: all bus access\n * goes through `client.emit` / `client.on` / `client.stream`.\n */\n private readonly eventBus: EventBus;\n private logger?: Logger;\n\n /**\n * Observable token source. All auth reads from this.\n */\n private readonly token$: BehaviorSubject<AccessToken | null>;\n\n private _actor: ActorVM | null = null;\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 constructor(config: SemiontApiClientConfig) {\n const { baseUrl, timeout = 30000, retry = 2, logger, tokenRefresher } = config;\n\n this.eventBus = new EventBus();\n\n // Store logger and baseUrl for constructing full URLs\n this.logger = logger;\n\n // Remove trailing slash for consistent URL construction\n this.baseUrl = (baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl) as BaseUrl;\n\n // When a tokenRefresher is configured, expand ky's retry policy to retry\n // 401 exactly once on any method. The limit of 1 means: at most one auth\n // retry per failed request. If the refreshed token also 401s, the request\n // fails and the modal surfaces — the api-client does not chain refreshes.\n //\n // Tradeoff vs the default `retry: 2`: transient 5xx errors are also\n // retried only once instead of twice. Acceptable: a single retry handles\n // ephemeral upstream blips, and chaining more retries on 5xx delays the\n // user-visible failure without meaningfully improving outcomes.\n const retryConfig = tokenRefresher\n ? {\n limit: 1,\n methods: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'],\n statusCodes: [401, 408, 413, 429, 500, 502, 503, 504],\n }\n : retry;\n\n // Don't use prefixUrl - we'll construct full URLs or use provided full URIs\n this.http = ky.create({\n timeout,\n retry: retryConfig,\n credentials: 'include',\n hooks: {\n beforeRequest: [\n (request) => {\n // Log HTTP request\n if (this.logger) {\n this.logger.debug('HTTP Request', {\n type: 'http_request',\n url: request.url,\n method: request.method,\n timestamp: Date.now(),\n hasAuth: request.headers.has('Authorization'),\n });\n }\n },\n ],\n beforeRetry: tokenRefresher\n ? [\n async ({ request, error }) => {\n // Only intercept 401s — let ky retry the rest with default behavior\n if (!(error instanceof HTTPError) || error.response.status !== 401) {\n return undefined;\n }\n try {\n const newToken = await tokenRefresher();\n if (!newToken) return ky.stop;\n request.headers.set('Authorization', `Bearer ${newToken}`);\n return undefined;\n } catch {\n return ky.stop;\n }\n },\n ]\n : [],\n afterResponse: [\n (request, _options, response) => {\n // Log HTTP response\n if (this.logger) {\n this.logger.debug('HTTP Response', {\n type: 'http_response',\n url: request.url,\n method: request.method,\n status: response.status,\n statusText: response.statusText\n });\n }\n return response;\n }\n ],\n beforeError: [\n async (error) => {\n const { response, request } = error;\n if (response) {\n const body = await response.json().catch(() => ({})) as { message?: string };\n\n // Log HTTP error\n if (this.logger) {\n this.logger.error('HTTP Request Failed', {\n type: 'http_error',\n url: request.url,\n method: request.method,\n status: response.status,\n statusText: response.statusText,\n error: body.message || `HTTP ${response.status}: ${response.statusText}`\n });\n }\n\n throw new APIError(\n body.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n response.statusText,\n body\n );\n }\n return error;\n },\n ],\n },\n });\n\n // Observable token source. Namespaces read the current value synchronously\n // via token$.getValue(). The bus actor's token getter does the same.\n this.token$ = config.token$ ?? new BehaviorSubject<AccessToken | null>(null);\n const getToken = () => this.token$.getValue() ?? undefined;\n\n // Verb-oriented namespace API\n this.browse = new BrowseNamespace(this, this.eventBus, getToken, this.actor);\n this.mark = new MarkNamespace(this, this.eventBus, getToken, this.actor);\n this.bind = new BindNamespace(this.actor);\n this.gather = new GatherNamespace(this.eventBus, this.actor);\n this.match = new MatchNamespace(this.eventBus, this.actor);\n this.yield = new YieldNamespace(this, this.eventBus, getToken, this.actor);\n this.beckon = new BeckonNamespace(this.actor);\n this.job = new JobNamespace(this.actor);\n this.auth = new AuthNamespace(this, getToken);\n this.admin = new AdminNamespace(this, getToken);\n\n // Auto-start the bus actor when the token transitions from null to a\n // real value. This avoids unauthenticated connect attempts during\n // bootstrap and lets refresh-after-expiry resume cleanly.\n this.token$.subscribe((token) => {\n if (token && !this._actorStarted) {\n this._actorStarted = true;\n this.actor.start();\n }\n });\n }\n\n private _actorStarted = false;\n\n get actor(): ActorVM {\n if (!this._actor) {\n this._actor = createActorVM({\n baseUrl: this.baseUrl,\n token: () => this.token$.getValue() ?? '',\n channels: [...BUS_RESULT_CHANNELS],\n });\n for (const channel of ACTOR_TO_LOCAL_BRIDGES) {\n this._actor.on$<Record<string, unknown>>(channel).subscribe((payload) => {\n (this.eventBus.get(channel as keyof import('@semiont/core').EventMap) as { next(v: unknown): void }).next(payload);\n });\n }\n }\n return this._actor;\n }\n\n private activeResource: {\n resourceId: ResourceId;\n refCount: number;\n bridgeSubs: Subscription[];\n } | null = null;\n\n /**\n * Subscribe the bus actor to the resource-scoped SSE stream for a single\n * resource and bridge incoming scoped events into the workspace event bus.\n *\n * **One distinct scope at a time**: the client supports subscriptions\n * to a single resource scope concurrently. Multiple calls with the\n * **same** resourceId are ref-counted — each returns an independent\n * unsubscribe; the underlying SSE scope is torn down only when the\n * last unsubscribe fires. Calling with a **different** resourceId\n * while a subscription is live throws. Widening this to multiple\n * concurrent scopes is deferred until a product requirement (e.g.\n * split-pane viewer, headless fleet-watcher) forces the design.\n *\n * @returns a disposer that decrements the ref count (and tears down\n * the SSE scope + bridges when it reaches zero).\n */\n subscribeToResource(resourceId: ResourceId): () => void {\n if (this.activeResource) {\n if (this.activeResource.resourceId !== resourceId) {\n throw new Error(\n `SemiontApiClient already subscribed to resource ${this.activeResource.resourceId}; ` +\n `call the unsubscribe returned from the previous subscribeToResource before subscribing to ${resourceId}.`,\n );\n }\n this.activeResource.refCount++;\n return this.makeUnsubscriber();\n }\n\n this.actor.addChannels([...RESOURCE_SCOPED_CHANNELS], resourceId as string);\n\n const bridgeSubs: Subscription[] = [];\n for (const channel of RESOURCE_SCOPED_CHANNELS) {\n bridgeSubs.push(\n this.actor.on$<Record<string, unknown>>(channel).subscribe((payload) => {\n (this.eventBus.get(channel as keyof import('@semiont/core').EventMap) as { next(v: unknown): void }).next(payload);\n })\n );\n }\n\n this.activeResource = { resourceId, refCount: 1, bridgeSubs };\n return this.makeUnsubscriber();\n }\n\n private makeUnsubscriber(): () => void {\n let called = false;\n return () => {\n if (called) return;\n called = true;\n if (!this.activeResource) return;\n this.activeResource.refCount--;\n if (this.activeResource.refCount > 0) return;\n for (const sub of this.activeResource.bridgeSubs) sub.unsubscribe();\n this.actor.removeChannels([...RESOURCE_SCOPED_CHANNELS]);\n this.activeResource = null;\n };\n }\n\n dispose(): void {\n if (this.activeResource) {\n for (const sub of this.activeResource.bridgeSubs) sub.unsubscribe();\n this.activeResource = null;\n }\n if (this._actor) {\n this._actor.dispose();\n this._actor = null;\n }\n }\n\n // ── Event bus surface ─────────────────────────────────────────\n // The ONE public path to the workspace bus. VMs, session, and\n // components route through these methods; `this.eventBus` remains\n // the internal owner and will be privatized once all callers\n // have migrated.\n\n /** Emit an event on the internal bus. */\n emit<K extends keyof EventMap>(channel: K, payload: EventMap[K]): void {\n this.eventBus.get(channel).next(payload);\n }\n\n /** Subscribe to an event on the internal bus; 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 a bus channel. Consumers `.pipe(...)` over this. */\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.eventBus.get(channel).asObservable();\n }\n\n /**\n * Build the `Authorization: Bearer <token>` header. If the caller passed\n * an explicit `{ auth }` it wins (used by session-internal throwaway\n * clients that need to run a validation request with a specific token).\n * Otherwise the current value of `this.token$` is used, so external\n * callers never have to plumb the token themselves.\n */\n private authHeaders(options?: { auth?: AccessToken }): Record<string, string> {\n const token = options?.auth ?? this.token$.getValue() ?? undefined;\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n // ============================================================================\n // AUTHENTICATION\n // ============================================================================\n\n async authenticatePassword(email: Email, password: string, options?: RequestOptions): Promise<ResponseContent<paths['/api/tokens/password']['post']>> {\n return this.http.post(`${this.baseUrl}/api/tokens/password`, {\n json: { email, password },\n headers: this.authHeaders(options),\n }).json();\n }\n\n async refreshToken(token: RefreshToken, options?: RequestOptions): Promise<ResponseContent<paths['/api/tokens/refresh']['post']>> {\n return this.http.post(`${this.baseUrl}/api/tokens/refresh`, {\n json: { refreshToken: token },\n headers: this.authHeaders(options),\n }).json();\n }\n\n async authenticateGoogle(credential: GoogleCredential, options?: RequestOptions): Promise<ResponseContent<paths['/api/tokens/google']['post']>> {\n return this.http.post(`${this.baseUrl}/api/tokens/google`, {\n json: { credential },\n headers: this.authHeaders(options),\n }).json();\n }\n\n async generateMCPToken(options?: RequestOptions): Promise<ResponseContent<paths['/api/tokens/mcp-generate']['post']>> {\n return this.http.post(`${this.baseUrl}/api/tokens/mcp-generate`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async getMediaToken(resourceId: ResourceId, options?: RequestOptions): Promise<{ token: string }> {\n return this.http.post(`${this.baseUrl}/api/tokens/media`, {\n json: { resourceId },\n headers: this.authHeaders(options),\n }).json();\n }\n\n // ============================================================================\n // USERS\n // ============================================================================\n\n async getMe(options?: RequestOptions): Promise<ResponseContent<paths['/api/users/me']['get']>> {\n return this.http.get(`${this.baseUrl}/api/users/me`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async acceptTerms(options?: RequestOptions): Promise<ResponseContent<paths['/api/users/accept-terms']['post']>> {\n return this.http.post(`${this.baseUrl}/api/users/accept-terms`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async logout(options?: RequestOptions): Promise<ResponseContent<paths['/api/users/logout']['post']>> {\n return this.http.post(`${this.baseUrl}/api/users/logout`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n // ============================================================================\n // RESOURCES\n // ============================================================================\n\n /**\n * Create a new resource with binary content support\n *\n * @param data - Resource creation data\n * @param data.name - Resource name\n * @param data.file - File object or Buffer with binary content\n * @param data.format - MIME type (e.g., 'text/markdown', 'image/png')\n * @param data.entityTypes - Optional array of entity types\n * @param data.language - Optional ISO 639-1 language code\n * @param data.creationMethod - Optional creation method\n * @param data.sourceAnnotationId - Optional source annotation ID\n * @param data.sourceResourceId - Optional source resource ID\n * @param data.generationPrompt - Optional prompt that drove AI generation\n * @param data.generator - Optional Agent(s) that generated the content\n * @param options - Request options including auth\n */\n async yieldResource(data: {\n name: string;\n file: File | Buffer;\n format: string;\n entityTypes?: string[];\n language?: string;\n creationMethod?: string;\n sourceAnnotationId?: string;\n sourceResourceId?: string;\n storageUri: string;\n generationPrompt?: string;\n generator?: components['schemas']['Agent'] | components['schemas']['Agent'][];\n isDraft?: boolean;\n // Return type is spec-derived: if the POST /resources response schema\n // drifts (e.g. field rename), this line breaks at compile time.\n }, options?: RequestOptions): Promise<ResponseContent<paths['/resources']['post']>> {\n // Build FormData\n const formData = new FormData();\n formData.append('name', data.name);\n formData.append('format', data.format);\n formData.append('storageUri', data.storageUri);\n\n // Handle File or Buffer\n if (data.file instanceof File) {\n formData.append('file', data.file);\n } else if (Buffer.isBuffer(data.file)) {\n // Node.js environment: convert Buffer to Blob via Uint8Array to satisfy BlobPart's ArrayBuffer constraint\n const blob = new Blob([new Uint8Array(data.file)], { type: data.format });\n formData.append('file', blob, data.name);\n } else {\n throw new Error('file must be a File or Buffer');\n }\n\n // Optional fields\n if (data.entityTypes && data.entityTypes.length > 0) {\n formData.append('entityTypes', JSON.stringify(data.entityTypes));\n }\n if (data.language) {\n formData.append('language', data.language);\n }\n if (data.creationMethod) {\n formData.append('creationMethod', data.creationMethod);\n }\n if (data.sourceAnnotationId) {\n formData.append('sourceAnnotationId', data.sourceAnnotationId);\n }\n if (data.sourceResourceId) {\n formData.append('sourceResourceId', data.sourceResourceId);\n }\n if (data.generationPrompt) {\n formData.append('generationPrompt', data.generationPrompt);\n }\n if (data.generator) {\n formData.append('generator', JSON.stringify(data.generator));\n }\n if (data.isDraft !== undefined) {\n formData.append('isDraft', String(data.isDraft));\n }\n\n // POST with multipart/form-data (ky automatically sets Content-Type)\n return this.http.post(`${this.baseUrl}/resources`, {\n body: formData,\n headers: this.authHeaders(options),\n }).json();\n }\n\n async browseResource(id: ResourceId, _options?: RequestOptions): Promise<components['schemas']['GetResourceResponse']> {\n return busRequest(this.actor, 'browse:resource-requested', { resourceId: id }, 'browse:resource-result', 'browse:resource-failed');\n }\n\n /**\n * Get resource representation using W3C content negotiation\n * Returns raw binary content (images, PDFs, text, etc.) with content type\n *\n * @param resourceUri - Full resource URI\n * @param options - Options including Accept header for content negotiation and auth\n * @returns Object with data (ArrayBuffer) and contentType (string)\n *\n * @example\n * ```typescript\n * // Get markdown representation\n * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'text/markdown', auth: token });\n * const markdown = new TextDecoder().decode(data);\n *\n * // Get image representation\n * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'image/png', auth: token });\n * const blob = new Blob([data], { type: contentType });\n *\n * // Get PDF representation\n * const { data, contentType } = await client.getResourceRepresentation(rUri, { accept: 'application/pdf', auth: token });\n * ```\n */\n async getResourceRepresentation(\n id: ResourceId,\n options?: { accept?: ContentFormat; auth?: AccessToken }\n ): Promise<{ data: ArrayBuffer; contentType: string }> {\n const response = await this.http.get(`${this.baseUrl}/resources/${id}`, {\n headers: {\n Accept: options?.accept || 'text/plain',\n ...this.authHeaders(options),\n },\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const data = await response.arrayBuffer();\n\n return { data, contentType };\n }\n\n /**\n * Get resource representation as a stream using W3C content negotiation\n * Returns streaming binary content (for large files: videos, large PDFs, etc.)\n *\n * Use this for large files to avoid loading entire content into memory.\n * The stream is consumed incrementally and the backend connection stays open\n * until the stream is fully consumed or closed.\n *\n * @param resourceUri - Full resource URI\n * @param options - Options including Accept header for content negotiation and auth\n * @returns Object with stream (ReadableStream) and contentType (string)\n *\n * @example\n * ```typescript\n * // Stream large file\n * const { stream, contentType } = await client.getResourceRepresentationStream(rUri, {\n * accept: 'video/mp4',\n * auth: token\n * });\n *\n * // Consume stream chunk by chunk (never loads entire file into memory)\n * for await (const chunk of stream) {\n * // Process chunk\n * console.log(`Received ${chunk.length} bytes`);\n * }\n *\n * // Or pipe to a file in Node.js\n * const fileStream = fs.createWriteStream('output.mp4');\n * const reader = stream.getReader();\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n * fileStream.write(value);\n * }\n * ```\n */\n async getResourceRepresentationStream(\n id: ResourceId,\n options?: { accept?: ContentFormat; auth?: AccessToken }\n ): Promise<{ stream: ReadableStream<Uint8Array>; contentType: string }> {\n const response = await this.http.get(`${this.baseUrl}/resources/${id}`, {\n headers: {\n Accept: options?.accept || 'text/plain',\n ...this.authHeaders(options),\n },\n });\n\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n\n if (!response.body) {\n throw new Error('Response body is null - cannot create stream');\n }\n\n return { stream: response.body, contentType };\n }\n\n async browseResources(\n limit?: number,\n archived?: boolean,\n query?: SearchQuery,\n _options?: RequestOptions\n ): Promise<components['schemas']['ListResourcesResponse']> {\n return busRequest(this.actor, 'browse:resources-requested',\n { search: query, archived, limit: limit ?? 100, offset: 0 },\n 'browse:resources-result', 'browse:resources-failed');\n }\n\n async updateResource(\n id: ResourceId,\n data: { archived?: boolean; entityTypes?: string[] },\n options?: RequestOptions\n ): Promise<void> {\n // PATCH /resources/:id stays as HTTP — it delegates to ResourceOperations\n // with complex conditional logic (archive/unarchive/entity-types)\n await this.http.patch(`${this.baseUrl}/resources/${id}`, {\n json: data,\n headers: this.authHeaders(options),\n }).text();\n }\n\n async getResourceEvents(id: ResourceId, _options?: RequestOptions): Promise<components['schemas']['GetEventsResponse']> {\n return busRequest(this.actor, 'browse:events-requested', { resourceId: id }, 'browse:events-result', 'browse:events-failed');\n }\n\n async browseReferences(id: ResourceId, _options?: RequestOptions): Promise<components['schemas']['GetReferencedByResponse']> {\n return busRequest(this.actor, 'browse:referenced-by-requested', { resourceId: id }, 'browse:referenced-by-result', 'browse:referenced-by-failed');\n }\n\n async generateCloneToken(id: ResourceId, _options?: RequestOptions): Promise<components['schemas']['CloneResourceWithTokenResponse']> {\n return busRequest(this.actor, 'yield:clone-token-requested', { resourceId: id }, 'yield:clone-token-generated', 'yield:clone-token-failed');\n }\n\n async getResourceByToken(token: CloneToken, _options?: RequestOptions): Promise<components['schemas']['GetResourceByTokenResponse']> {\n return busRequest(this.actor, 'yield:clone-resource-requested', { token }, 'yield:clone-resource-result', 'yield:clone-resource-failed');\n }\n\n async createResourceFromToken(\n data: { token: string; name: string; content: string; archiveOriginal?: boolean },\n _options?: RequestOptions\n ): Promise<{ resourceId: string }> {\n return busRequest(this.actor, 'yield:clone-create', data as unknown as Record<string, unknown>, 'yield:clone-created', 'yield:clone-create-failed');\n }\n\n // ============================================================================\n // ANNOTATIONS\n // ============================================================================\n\n async markAnnotation(\n id: ResourceId,\n data: components['schemas']['CreateAnnotationRequest'],\n _options?: RequestOptions\n ): Promise<{ annotationId: string }> {\n return busRequest<{ annotationId: string }>(this.actor, 'mark:create-request',\n { resourceId: id, request: data }, 'mark:create-ok', 'mark:create-failed');\n }\n\n async getAnnotation(id: AnnotationId, _options?: RequestOptions): Promise<components['schemas']['GetAnnotationResponse']> {\n return busRequest(this.actor, 'browse:annotation-requested', { annotationId: id }, 'browse:annotation-result', 'browse:annotation-failed');\n }\n\n async browseAnnotation(resourceId: ResourceId, annotationId: AnnotationId, _options?: RequestOptions): Promise<components['schemas']['GetAnnotationResponse']> {\n return busRequest(this.actor, 'browse:annotation-requested', { resourceId, annotationId }, 'browse:annotation-result', 'browse:annotation-failed');\n }\n\n async browseAnnotations(\n id: ResourceId,\n _motivation?: Motivation,\n _options?: RequestOptions\n ): Promise<components['schemas']['GetAnnotationsResponse']> {\n return busRequest(this.actor, 'browse:annotations-requested', { resourceId: id }, 'browse:annotations-result', 'browse:annotations-failed');\n }\n\n async deleteAnnotation(resourceId: ResourceId, annotationId: AnnotationId, _options?: RequestOptions): Promise<void> {\n await this.actor.emit('mark:delete', { annotationId, resourceId });\n }\n\n async bindAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n data: { operations: BodyOperation[] },\n _options?: RequestOptions\n ): Promise<{ correlationId: string }> {\n const correlationId = crypto.randomUUID();\n await this.actor.emit('bind:update-body', { correlationId, annotationId, resourceId, operations: data.operations });\n return { correlationId };\n }\n\n async getAnnotationHistory(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n _options?: RequestOptions\n ): Promise<components['schemas']['GetAnnotationHistoryResponse']> {\n return busRequest(this.actor, 'browse:annotation-history-requested', { resourceId, annotationId }, 'browse:annotation-history-result', 'browse:annotation-history-failed');\n }\n\n async annotateReferences(\n resourceId: ResourceId,\n data: { entityTypes: string[]; includeDescriptiveReferences?: boolean },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'reference-annotation', resourceId, params: data }, 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async annotateHighlights(\n resourceId: ResourceId,\n data: { instructions?: string; density?: number },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'highlight-annotation', resourceId, params: data }, 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async annotateAssessments(\n resourceId: ResourceId,\n data: { instructions?: string; tone?: string; density?: number; language?: string },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'assessment-annotation', resourceId, params: data }, 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async annotateComments(\n resourceId: ResourceId,\n data: { instructions?: string; tone?: string; density?: number; language?: string },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'comment-annotation', resourceId, params: data }, 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async annotateTags(\n resourceId: ResourceId,\n data: { schemaId: string; categories: string[] },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'tag-annotation', resourceId, params: data }, 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async yieldResourceFromAnnotation(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n data: { title: string; storageUri: string; context: unknown; prompt?: string; language?: string; temperature?: number; maxTokens?: number },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string; jobId: string }> {\n const { jobId } = await busRequest<{ jobId: string }>(this.actor, 'job:create',\n { jobType: 'generation', resourceId, params: { referenceId: annotationId, ...data } },\n 'job:created', 'job:create-failed');\n return { correlationId: crypto.randomUUID(), jobId };\n }\n\n async gatherAnnotationContext(\n resourceId: ResourceId,\n annotationId: AnnotationId,\n data: { correlationId: string; contextWindow?: number },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string }> {\n await this.actor.emit('gather:requested', {\n correlationId: data.correlationId,\n annotationId,\n resourceId,\n contextWindow: data.contextWindow ?? 2000,\n });\n return { correlationId: data.correlationId };\n }\n\n async matchSearch(\n resourceId: ResourceId,\n data: { correlationId: string; referenceId: string; context: unknown; limit?: number; useSemanticScoring?: boolean },\n _options?: RequestOptions,\n ): Promise<{ correlationId: string }> {\n await this.actor.emit('match:search-requested', {\n correlationId: data.correlationId,\n resourceId,\n referenceId: data.referenceId,\n context: data.context as Record<string, unknown>,\n limit: data.limit ?? 10,\n useSemanticScoring: data.useSemanticScoring ?? true,\n });\n return { correlationId: data.correlationId };\n }\n\n // ============================================================================\n // ENTITY TYPES\n // ============================================================================\n\n async addEntityType(type: EntityType, _options?: RequestOptions): Promise<void> {\n await this.actor.emit('mark:add-entity-type', { tag: type });\n }\n\n async addEntityTypesBulk(types: EntityType[], _options?: RequestOptions): Promise<void> {\n for (const tag of types) {\n await this.actor.emit('mark:add-entity-type', { tag });\n }\n }\n\n async listEntityTypes(_options?: RequestOptions): Promise<components['schemas']['GetEntityTypesResponse']> {\n return busRequest(this.actor, 'browse:entity-types-requested', {}, 'browse:entity-types-result', 'browse:entity-types-failed');\n }\n\n // ============================================================================\n // PARTICIPANTS\n // ============================================================================\n\n async beckonAttention(\n _participantId: string,\n data: { annotationId?: string; resourceId: string; message?: string },\n _options?: RequestOptions\n ): Promise<components['schemas']['BeckonResponse']> {\n await this.actor.emit('beckon:focus', data as unknown as Record<string, unknown>);\n return {} as components['schemas']['BeckonResponse'];\n }\n\n // ============================================================================\n // ADMIN\n // ============================================================================\n\n async listUsers(options?: RequestOptions): Promise<ResponseContent<paths['/api/admin/users']['get']>> {\n return this.http.get(`${this.baseUrl}/api/admin/users`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async getUserStats(options?: RequestOptions): Promise<ResponseContent<paths['/api/admin/users/stats']['get']>> {\n return this.http.get(`${this.baseUrl}/api/admin/users/stats`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n /**\n * Update a user by ID\n * Note: Users use DID identifiers (did:web:domain:users:id), not HTTP URIs.\n */\n async updateUser(\n id: UserDID,\n data: RequestContent<paths['/api/admin/users/{id}']['patch']>,\n options?: RequestOptions\n ): Promise<ResponseContent<paths['/api/admin/users/{id}']['patch']>> {\n return this.http.patch(`${this.baseUrl}/api/admin/users/${id}`, {\n json: data,\n headers: this.authHeaders(options),\n }).json();\n }\n\n async getOAuthConfig(options?: RequestOptions): Promise<ResponseContent<paths['/api/admin/oauth/config']['get']>> {\n return this.http.get(`${this.baseUrl}/api/admin/oauth/config`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n // ============================================================================\n // ADMIN — EXCHANGE (Backup/Restore)\n // ============================================================================\n\n /**\n * Create a backup of the knowledge base. Returns raw Response for streaming download.\n * Caller should use response.blob() to trigger a file download.\n */\n async backupKnowledgeBase(\n options?: RequestOptions,\n ): Promise<Response> {\n return this.http.post(`${this.baseUrl}/api/admin/exchange/backup`, {\n headers: this.authHeaders(options),\n });\n }\n\n /**\n * Restore knowledge base from a backup file. Parses SSE progress events and calls onProgress.\n * Returns the final SSE event (phase: 'complete' or 'error').\n */\n async restoreKnowledgeBase(\n file: File,\n options?: RequestOptions & {\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void;\n },\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await this.http.post(`${this.baseUrl}/api/admin/exchange/restore`, {\n body: formData,\n headers: this.authHeaders(options),\n });\n\n return this.parseSSEStream(response, options?.onProgress);\n }\n\n // ============================================================================\n // ADMIN — EXCHANGE (Linked Data Export/Import)\n // ============================================================================\n\n /**\n * Export the knowledge base as a JSON-LD Linked Data archive. Returns raw Response for streaming download.\n * Caller should use response.blob() to trigger a file download.\n */\n async exportKnowledgeBase(\n params?: { includeArchived?: boolean },\n options?: RequestOptions,\n ): Promise<Response> {\n const searchParams = params?.includeArchived ? new URLSearchParams({ includeArchived: 'true' }) : undefined;\n return this.http.post(`${this.baseUrl}/api/moderate/exchange/export`, {\n headers: this.authHeaders(options),\n ...(searchParams ? { searchParams } : {}),\n });\n }\n\n /**\n * Import a JSON-LD Linked Data archive into the knowledge base. Parses SSE progress events and calls onProgress.\n * Returns the final SSE event (phase: 'complete' or 'error').\n */\n async importKnowledgeBase(\n file: File,\n options?: RequestOptions & {\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void;\n },\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n const formData = new FormData();\n formData.append('file', file);\n\n const response = await this.http.post(`${this.baseUrl}/api/moderate/exchange/import`, {\n body: formData,\n headers: this.authHeaders(options),\n });\n\n return this.parseSSEStream(response, options?.onProgress);\n }\n\n private async parseSSEStream(\n response: Response,\n onProgress?: (event: { phase: string; message?: string; result?: Record<string, unknown> }) => void,\n ): Promise<{ phase: string; message?: string; result?: Record<string, unknown> }> {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let finalResult: { phase: string; message?: string; result?: Record<string, unknown> } = { phase: 'unknown' };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop()!;\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const event = JSON.parse(line.slice(6));\n onProgress?.(event);\n finalResult = event;\n }\n }\n }\n\n return finalResult;\n }\n\n // ============================================================================\n // JOB STATUS\n // ============================================================================\n\n async getJobStatus(id: JobId, _options?: RequestOptions): Promise<components['schemas']['JobStatusResponse']> {\n return busRequest(this.actor, 'job:status-requested', { jobId: id }, 'job:status-result', 'job:status-failed');\n }\n\n /**\n * Poll a job until it completes or fails\n * @param id - The job ID to poll\n * @param options - Polling options\n * @returns The final job status\n */\n async pollJobUntilComplete(\n id: JobId,\n options?: {\n interval?: number; // Milliseconds between polls (default: 1000)\n timeout?: number; // Total timeout in milliseconds (default: 60000)\n onProgress?: (status: components['schemas']['JobStatusResponse']) => void;\n auth?: AccessToken;\n }\n ): Promise<components['schemas']['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.getJobStatus(id, { auth: options?.auth });\n\n // Call progress callback if provided\n if (options?.onProgress) {\n options.onProgress(status);\n }\n\n // Check if job is in a terminal state\n if (status.status === 'complete' || status.status === 'failed' || status.status === 'cancelled') {\n return status;\n }\n\n // Check timeout\n if (Date.now() - startTime > timeout) {\n throw new Error(`Job polling timeout after ${timeout}ms`);\n }\n\n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, interval));\n }\n }\n\n // ============================================================================\n // SYSTEM STATUS\n // ============================================================================\n\n async healthCheck(options?: RequestOptions): Promise<ResponseContent<paths['/api/health']['get']>> {\n return this.http.get(`${this.baseUrl}/api/health`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async getStatus(options?: RequestOptions): Promise<ResponseContent<paths['/api/status']['get']>> {\n return this.http.get(`${this.baseUrl}/api/status`, {\n headers: this.authHeaders(options),\n }).json();\n }\n\n async browseFiles(\n dirPath?: string,\n sort?: 'name' | 'mtime' | 'annotationCount',\n _options?: RequestOptions,\n ): Promise<components['schemas']['BrowseFilesResponse']> {\n return busRequest(this.actor, 'browse:directory-requested',\n { path: dirPath ?? '.', sort: sort ?? 'name' },\n 'browse:directory-result', 'browse:directory-failed');\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 * SemiontApiClient, 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} from '@semiont/core';\nimport type { components } from '@semiont/core';\nimport { SemiontApiClient, APIError } from '../client';\nimport type { ConnectionState } from '../view-models/domain/actor-vm';\nimport type { KnowledgeBase } from './knowledge-base';\nimport {\n clearStoredSession,\n getStoredSession,\n isJwtExpired,\n kbBackendUrl,\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 * Re-authenticate after expiry / 401. Returns a new access token\n * (no \"Bearer \" prefix) on success, or null if recovery is\n * impossible (user needs to sign in again, or the service secret\n * is missing). Callers must dedupe concurrent invocations if the\n * underlying auth call isn't itself idempotent.\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: SemiontApiClient;\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\n const stored = getStoredSession(this.storage, this.kb.id);\n const initialToken =\n stored && !isJwtExpired(stored.access) ? accessToken(stored.access) : null;\n\n this.token$ = new BehaviorSubject<AccessToken | null>(initialToken);\n this.user$ = new BehaviorSubject<UserInfo | null>(null);\n\n this.client = new SemiontApiClient({\n baseUrl: baseUrl(kbBackendUrl(this.kb)),\n token$: this.token$,\n tokenRefresher: () => this.refresh().then((t) => t ?? null),\n });\n\n this.streamState$ = this.client.actor.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 ? await this.doRefresh()\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 = await this.doRefresh();\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 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 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 refreshToken as makeRefreshToken,\n type AccessToken,\n type EventMap,\n} from '@semiont/core';\nimport { SemiontApiClient } from '../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 `SemiontApiClient`, 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 const session = new SemiontSession({\n kb,\n storage: this.storage,\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 `SemiontApiClient` 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 throwaway = new SemiontApiClient({\n baseUrl: baseUrl(kbBackendUrl(kb)),\n });\n try {\n const response = await throwaway.refreshToken(makeRefreshToken(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 `getMe` 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 private async performValidate(kb: KnowledgeBase, token: AccessToken): Promise<UserInfo | null> {\n const throwaway = new SemiontApiClient({\n baseUrl: baseUrl(kbBackendUrl(kb)),\n });\n try {\n const data = await throwaway.getMe({ auth: token });\n return data as UserInfo;\n } finally {\n throwaway.dispose();\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 { SemiontApiClient } from '../../client';\nimport type { ViewModel } from '../lib/view-model';\n\nexport interface BeckonVM extends ViewModel {\n hoveredAnnotationId$: Observable<string | null>;\n hover(annotationId: string | null): void;\n focus(annotationId: string): void;\n sparkle(annotationId: string): void;\n}\n\nexport function createBeckonVM(client: SemiontApiClient): BeckonVM {\n const subs: Subscription[] = [];\n const hovered$ = new BehaviorSubject<string | null>(null);\n\n subs.push(client.stream('beckon:hover').subscribe(({ annotationId }) => {\n hovered$.next(annotationId);\n if (annotationId) {\n client.emit('beckon:sparkle', { annotationId });\n }\n }));\n\n subs.push(client.stream('browse:click').subscribe(({ annotationId }) => {\n client.emit('beckon:focus', { annotationId });\n }));\n\n return {\n hoveredAnnotationId$: hovered$.asObservable(),\n hover: (annotationId) => client.emit('beckon:hover', { annotationId }),\n focus: (annotationId) => client.emit('beckon:focus', { annotationId }),\n sparkle: (annotationId) => client.emit('beckon:sparkle', { 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: string | null) => void;\n\nexport interface HoverHandlers {\n handleMouseEnter: (annotationId: string) => void;\n handleMouseLeave: () => void;\n cleanup: () => void;\n}\n\nexport function createHoverHandlers(emit: EmitHover, delayMs: number): HoverHandlers {\n let currentHover: string | 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: string) => {\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 { SemiontApiClient } 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: SemiontApiClient,\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.stream('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 { SemiontApiClient } from '../../client';\nimport type { ViewModel } from '../lib/view-model';\n\nexport interface MatchVM extends ViewModel {}\n\nexport function createMatchVM(\n client: SemiontApiClient,\n _resourceId: ResourceId,\n): MatchVM {\n const subs: Subscription[] = [];\n\n subs.push(client.stream('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.emit('match:search-results', result),\n error: (err) => client.emit('match:search-failed', {\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 { SemiontApiClient } 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: SemiontApiClient,\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: (chunk) => {\n progress$.next(chunk);\n isGenerating$.next(true);\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 { SemiontApiClient } 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: SemiontApiClient,\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.stream('mark:requested').subscribe(handleAnnotationRequested));\n subs.push(client.stream('mark:select-comment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'commenting' })));\n subs.push(client.stream('mark:select-tag').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'tagging' })));\n subs.push(client.stream('mark:select-assessment').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'assessing' })));\n subs.push(client.stream('mark:select-reference').subscribe((s) =>\n handleAnnotationRequested({ selector: selectionToSelector(s), motivation: 'linking' })));\n\n subs.push(client.stream('mark:cancel-pending').subscribe(() => pendingAnnotation$.next(null)));\n subs.push(client.stream('mark:create-ok').subscribe(() => pendingAnnotation$.next(null)));\n\n // CRUD bridging\n subs.push(client.stream('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.emit('mark:create-ok', { annotationId: result.annotationId });\n } catch (error) {\n client.emit('mark:create-failed', { message: error instanceof Error ? error.message : String(error) });\n }\n }));\n\n subs.push(client.stream('mark:delete').subscribe(async (event) => {\n try {\n await client.mark.delete(resourceId, event.annotationId as Parameters<typeof client.mark.delete>[1]);\n client.emit('mark:delete-ok', { annotationId: event.annotationId });\n } catch (error) {\n client.emit('mark:delete-failed', { 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.stream('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: (p) => progress$.next(p),\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.stream('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 { components } 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 { SemiontApiClient } from '../../client';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\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: SemiontApiClient,\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 { SemiontApiClient } 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: SemiontApiClient,\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 { SemiontApiClient } 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: SemiontApiClient,\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.listUsers()\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.getUserStats()\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.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 { SemiontApiClient } 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: SemiontApiClient,\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.getOAuthConfig()\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 { SemiontApiClient } 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: SemiontApiClient,\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.getMe()\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.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 { ResourceId, components } from '@semiont/core';\nimport type { ViewModel } from '../lib/view-model';\nimport type { SemiontApiClient } from '../../client';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\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: SemiontApiClient,\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 { SemiontApiClient } from '../../client';\n\nexport interface SessionVM extends ViewModel {\n isLoggingOut$: Observable<boolean>;\n logout(): Promise<void>;\n}\n\nexport function createSessionVM(\n client: SemiontApiClient,\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.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 { createActorVM, type ActorVM, type ConnectionState } from './actor-vm';\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 `SemiontApiClient` 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 './actor-vm';\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 { SemiontApiClient } 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 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: SemiontApiClient): 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.stream('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: '',\n created: new Date().toISOString(),\n };\n addOrUpdate(job);\n jobCreated$.next(job);\n }),\n\n client.stream('job:complete').subscribe((event) => {\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.stream('job:fail').subscribe((event) => {\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 ?? 'Unknown 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","/**\n * Text encoding utilities for consistent charset handling\n *\n * Ensures frontend decoding matches backend decoding by respecting\n * charset parameters in mediaType (e.g., \"text/plain; charset=iso-8859-1\")\n */\n\n/**\n * Extract charset from mediaType parameter\n *\n * @param mediaType - Media type with optional charset (e.g., \"text/plain; charset=utf-8\")\n * @returns Charset name in lowercase (defaults to \"utf-8\")\n *\n * @example\n * extractCharset(\"text/plain; charset=iso-8859-1\") // \"iso-8859-1\"\n * extractCharset(\"text/plain\") // \"utf-8\"\n */\nexport function extractCharset(mediaType: string): string {\n const charsetMatch = mediaType.match(/charset=([^\\s;]+)/i);\n return (charsetMatch?.[1] || 'utf-8').toLowerCase();\n}\n\n/**\n * Decode ArrayBuffer to string using charset from mediaType\n *\n * Uses TextDecoder with the charset extracted from mediaType parameter.\n * This ensures the same character space is used for both annotation creation\n * (backend) and rendering (frontend).\n *\n * @param buffer - Binary data to decode\n * @param mediaType - Media type with optional charset parameter\n * @returns Decoded string in the original character space\n *\n * @example\n * const buffer = new Uint8Array([...]);\n * const text = decodeWithCharset(buffer, \"text/plain; charset=iso-8859-1\");\n */\nexport function decodeWithCharset(buffer: ArrayBuffer, mediaType: string): string {\n const charset = extractCharset(mediaType);\n\n // TextDecoder supports standard charset names\n // Common mappings that work in browsers:\n // - utf-8, utf-16, utf-16le, utf-16be\n // - iso-8859-1 through iso-8859-15\n // - windows-1252, windows-1251, etc.\n const decoder = new TextDecoder(charset);\n return decoder.decode(buffer);\n}\n","/**\n * Annotation and Selector Utilities\n *\n * Pure TypeScript utilities for working with W3C Web Annotations.\n * No React dependencies - safe to use in any JavaScript environment.\n *\n * Body is either empty array (stub) or single SpecificResource (resolved)\n * Body can be array of TextualBody (tagging) + SpecificResource (linking)\n * Target can be simple string IRI or object with source and optional selector\n */\n\nimport type { components, Selector } from '@semiont/core';\n\n// Re-export selector utilities from core (canonical location)\nexport {\n getTextPositionSelector,\n getSvgSelector,\n getFragmentSelector,\n validateSvgMarkup,\n} from '@semiont/core';\n\ntype Annotation = components['schemas']['Annotation'];\ntype HighlightAnnotation = Annotation;\ntype ReferenceAnnotation = Annotation;\ntype TextPositionSelector = components['schemas']['TextPositionSelector'];\ntype TextQuoteSelector = components['schemas']['TextQuoteSelector'];\ntype SvgSelector = components['schemas']['SvgSelector'];\ntype FragmentSelector = components['schemas']['FragmentSelector'];\n\n// Re-export selector types for convenience\nexport type { TextPositionSelector, TextQuoteSelector, SvgSelector, FragmentSelector, Selector };\n\n/**\n * Get the source from an annotation body (null if stub)\n * Search for SpecificResource in body array\n */\nexport function getBodySource(body: Annotation['body']): string | null {\n if (Array.isArray(body)) {\n // Search for SpecificResource with source\n for (const item of body) {\n if (\n typeof item === 'object' &&\n item !== null &&\n 'type' in item &&\n 'source' in item\n ) {\n const itemType = (item as { type: unknown }).type;\n const itemSource = (item as { source: unknown }).source;\n\n if (itemType === 'SpecificResource' && typeof itemSource === 'string') {\n return itemSource;\n }\n }\n }\n return null; // No SpecificResource found = stub\n }\n\n // Single body object (SpecificResource)\n if (\n typeof body === 'object' &&\n body !== null &&\n 'type' in body &&\n 'source' in body\n ) {\n const bodyType = (body as { type: unknown }).type;\n const bodySource = (body as { source: unknown }).source;\n\n if (bodyType === 'SpecificResource' && typeof bodySource === 'string') {\n return bodySource;\n }\n }\n\n return null;\n}\n\n/**\n * Get the type from an annotation body (returns first body type in array)\n */\nexport function getBodyType(body: Annotation['body']): 'TextualBody' | 'SpecificResource' | null {\n if (Array.isArray(body)) {\n if (body.length === 0) {\n return null;\n }\n // Return type of first body item\n if (typeof body[0] === 'object' && body[0] !== null && 'type' in body[0]) {\n const firstType = (body[0] as { type: unknown }).type;\n if (firstType === 'TextualBody' || firstType === 'SpecificResource') {\n return firstType;\n }\n }\n return null;\n }\n\n // Single body object\n if (typeof body === 'object' && body !== null && 'type' in body) {\n const bodyType = (body as { type: unknown }).type;\n if (bodyType === 'TextualBody' || bodyType === 'SpecificResource') {\n return bodyType;\n }\n }\n\n return null;\n}\n\n/**\n * Check if body is resolved (has a source)\n * Check for SpecificResource in body array\n */\nexport function isBodyResolved(body: Annotation['body']): boolean {\n return getBodySource(body) !== null;\n}\n\n/**\n * Get the source IRI from target (handles both string and object forms)\n */\nexport function getTargetSource(target: Annotation['target']): string {\n if (typeof target === 'string') {\n return target;\n }\n return target.source;\n}\n\n/**\n * Get the selector from target (undefined if string or no selector)\n */\nexport function getTargetSelector(target: Annotation['target']) {\n if (typeof target === 'string') {\n return undefined;\n }\n return target.selector;\n}\n\n/**\n * Check if target has a selector\n */\nexport function hasTargetSelector(target: Annotation['target']): boolean {\n return typeof target !== 'string' && target.selector !== undefined;\n}\n\n/**\n * Type guard to check if an annotation is a highlight\n */\nexport function isHighlight(annotation: Annotation): annotation is HighlightAnnotation {\n return annotation.motivation === 'highlighting';\n}\n\n/**\n * Type guard to check if an annotation is a reference (linking)\n */\nexport function isReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return annotation.motivation === 'linking';\n}\n\n/**\n * Type guard to check if an annotation is an assessment\n */\nexport function isAssessment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'assessing';\n}\n\n/**\n * Type guard to check if an annotation is a comment\n */\nexport function isComment(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'commenting';\n}\n\n/**\n * Type guard to check if an annotation is a tag\n */\nexport function isTag(annotation: Annotation): annotation is Annotation {\n return annotation.motivation === 'tagging';\n}\n\n/**\n * Extract comment text from a comment annotation's body\n * @param annotation - The annotation to extract comment text from\n * @returns The comment text, or undefined if not a comment or no text found\n */\nexport function getCommentText(annotation: Annotation): string | undefined {\n if (!isComment(annotation)) return undefined;\n const body = Array.isArray(annotation.body) ? annotation.body[0] : annotation.body;\n if (body && 'value' in body) {\n return body.value;\n }\n return undefined;\n}\n\n/**\n * Type guard to check if a reference annotation is a stub (unresolved)\n * Stub if no SpecificResource in body array\n */\nexport function isStubReference(annotation: Annotation): boolean {\n return isReference(annotation) && !isBodyResolved(annotation.body);\n}\n\n/**\n * Type guard to check if a reference annotation is resolved\n * Resolved if SpecificResource exists in body array\n */\nexport function isResolvedReference(annotation: Annotation): annotation is ReferenceAnnotation {\n return isReference(annotation) && isBodyResolved(annotation.body);\n}\n\n// =============================================================================\n// SELECTOR UTILITIES\n// =============================================================================\n\n/**\n * Get the exact text from a selector (single or array)\n *\n * When selector is an array, tries to find a TextQuoteSelector (which has exact text).\n * TextPositionSelector does not have exact text, only character offsets.\n * Handles undefined selector (when target is a string IRI with no selector)\n */\nexport function getExactText(selector: Selector | Selector[] | undefined): string {\n if (!selector) {\n return ''; // No selector means entire resource\n }\n const selectors = Array.isArray(selector) ? selector : [selector];\n\n // Try to find TextQuoteSelector (has exact text)\n const quoteSelector = selectors.find(s => s.type === 'TextQuoteSelector') as TextQuoteSelector | undefined;\n if (quoteSelector) {\n return quoteSelector.exact;\n }\n\n // No TextQuoteSelector found\n return '';\n}\n\n/**\n * Get the exact text from an annotation's target selector\n * Uses getTargetSelector helper to safely get selector\n */\nexport function getAnnotationExactText(annotation: Annotation): string {\n const selector = getTargetSelector(annotation.target);\n return getExactText(selector as Selector | Selector[] | undefined);\n}\n\n/**\n * Get the primary selector from a selector (single or array)\n *\n * When selector is an array, returns the first selector.\n * When selector is a single object, returns it as-is.\n */\nexport function getPrimarySelector(selector: Selector | Selector[]): Selector {\n if (Array.isArray(selector)) {\n if (selector.length === 0) {\n throw new Error('Empty selector array');\n }\n const first = selector[0];\n if (!first) {\n throw new Error('Invalid selector array');\n }\n return first;\n }\n return selector;\n}\n\n/**\n * Get TextQuoteSelector from a selector (single or array)\n *\n * Returns the first TextQuoteSelector found, or null if none exists.\n */\nexport function getTextQuoteSelector(selector: Selector | Selector[]): TextQuoteSelector | null {\n const selectors = Array.isArray(selector) ? selector : [selector];\n const found = selectors.find(s => s.type === 'TextQuoteSelector');\n if (!found) return null;\n return found.type === 'TextQuoteSelector' ? found : null;\n}\n\n/**\n * Extract bounding box from SVG markup\n *\n * Attempts to extract x, y, width, height from the SVG viewBox or root element.\n * Returns null if bounding box cannot be determined.\n */\nexport function extractBoundingBox(svg: string): { x: number; y: number; width: number; height: number } | null {\n // Try to extract viewBox attribute from SVG element\n const viewBoxMatch = svg.match(/<svg[^>]*viewBox=\"([^\"]+)\"/);\n if (viewBoxMatch) {\n const values = viewBoxMatch[1].split(/\\s+/).map(parseFloat);\n if (values.length === 4 && values.every(v => !isNaN(v))) {\n return {\n x: values[0],\n y: values[1],\n width: values[2],\n height: values[3]\n };\n }\n }\n\n // Try to extract width/height attributes from SVG element (assume x=0, y=0)\n const svgTagMatch = svg.match(/<svg[^>]*>/);\n if (svgTagMatch) {\n const svgTag = svgTagMatch[0];\n const widthMatch = svgTag.match(/width=\"([^\"]+)\"/);\n const heightMatch = svgTag.match(/height=\"([^\"]+)\"/);\n\n if (widthMatch && heightMatch) {\n const width = parseFloat(widthMatch[1]);\n const height = parseFloat(heightMatch[1]);\n\n if (!isNaN(width) && !isNaN(height)) {\n return { x: 0, y: 0, width, height };\n }\n }\n }\n\n return null;\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 { SemiontApiClient } from '../../client';\nimport { decodeWithCharset } from '../../utils/text-encoding';\nimport { isHighlight, isComment, isAssessment, isReference, isTag } from '../../utils/annotations';\nimport type { ReferencedByEntry } from '../../namespaces/types';\n\ntype Annotation = components['schemas']['Annotation'];\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: SemiontApiClient,\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.stream('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.emit('gather:requested', {\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","/**\n * Fuzzy Anchoring for W3C Web Annotation TextQuoteSelector\n *\n * Uses prefix/suffix context to disambiguate when the same text appears multiple times.\n * Implements fuzzy matching as specified in the W3C Web Annotation Data Model.\n *\n * @see https://www.w3.org/TR/annotation-model/#text-quote-selector\n */\n\nexport interface TextPosition {\n start: number;\n end: number;\n}\n\nexport type MatchQuality = 'exact' | 'normalized' | 'case-insensitive' | 'fuzzy';\n\n/**\n * Normalize text for comparison - handles common document editing changes\n *\n * Collapses whitespace, converts curly quotes to straight quotes,\n * and normalizes common punctuation variations.\n */\nexport function normalizeText(text: string): string {\n return text\n .replace(/\\s+/g, ' ') // collapse whitespace\n .replace(/[\\u2018\\u2019]/g, \"'\") // curly single quotes → straight\n .replace(/[\\u201C\\u201D]/g, '\"') // curly double quotes → straight\n .replace(/\\u2014/g, '--') // em-dash → double hyphen\n .replace(/\\u2013/g, '-') // en-dash → hyphen\n .trim();\n}\n\n/**\n * Calculate Levenshtein distance between two strings\n * Used for fuzzy matching when exact text doesn't match\n */\nfunction levenshteinDistance(str1: string, str2: string): number {\n const len1 = str1.length;\n const len2 = str2.length;\n const matrix: number[][] = [];\n\n // Initialize matrix\n for (let i = 0; i <= len1; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= len2; j++) {\n matrix[0]![j] = j;\n }\n\n // Fill matrix\n for (let i = 1; i <= len1; i++) {\n for (let j = 1; j <= len2; j++) {\n const cost = str1[i - 1] === str2[j - 1] ? 0 : 1;\n const deletion = matrix[i - 1]![j]! + 1;\n const insertion = matrix[i]![j - 1]! + 1;\n const substitution = matrix[i - 1]![j - 1]! + cost;\n matrix[i]![j] = Math.min(deletion, insertion, substitution);\n }\n }\n\n return matrix[len1]![len2]!;\n}\n\n/**\n * Pre-computed content strings for batch fuzzy matching.\n * Avoids recomputing normalizeText(content) and content.toLowerCase()\n * for every annotation when processing many annotations against the same content.\n */\nexport interface ContentCache {\n normalizedContent: string;\n lowerContent: string;\n}\n\n/**\n * Build a ContentCache for a given content string.\n * Call once per content, pass to findBestTextMatch/findTextWithContext for all annotations.\n */\nexport function buildContentCache(content: string): ContentCache {\n return {\n normalizedContent: normalizeText(content),\n lowerContent: content.toLowerCase()\n };\n}\n\n/**\n * Find best match for text in content using multi-strategy search\n *\n * Shared core logic used by both findTextWithContext and validateAndCorrectOffsets.\n *\n * @param content - Full text content to search within\n * @param searchText - The text to find\n * @param positionHint - Hint for where to search (TextPositionSelector.start)\n * @param cache - Pre-computed normalized/lowered content (from buildContentCache)\n * @returns Match with position and quality, or null if not found\n */\nexport function findBestTextMatch(\n content: string,\n searchText: string,\n positionHint: number | undefined,\n cache: ContentCache\n): { start: number; end: number; matchQuality: MatchQuality } | null {\n const maxFuzzyDistance = Math.max(5, Math.floor(searchText.length * 0.05)); // 5% tolerance or min 5 chars\n\n // Strategy 1: Exact match (case-sensitive, exact whitespace)\n const exactIndex = content.indexOf(searchText);\n if (exactIndex !== -1) {\n return {\n start: exactIndex,\n end: exactIndex + searchText.length,\n matchQuality: 'exact'\n };\n }\n\n // Strategy 2: Normalized match (handles whitespace/quote variations)\n const normalizedSearch = normalizeText(searchText);\n const normalizedIndex = cache.normalizedContent.indexOf(normalizedSearch);\n if (normalizedIndex !== -1) {\n // Find actual position in original content by counting characters\n let actualPos = 0;\n let normalizedPos = 0;\n while (normalizedPos < normalizedIndex && actualPos < content.length) {\n const char = content[actualPos]!;\n const normalizedChar = normalizeText(char);\n if (normalizedChar) {\n normalizedPos += normalizedChar.length;\n }\n actualPos++;\n }\n return {\n start: actualPos,\n end: actualPos + searchText.length,\n matchQuality: 'normalized'\n };\n }\n\n // Strategy 3: Case-insensitive match\n const lowerSearch = searchText.toLowerCase();\n const caseInsensitiveIndex = cache.lowerContent.indexOf(lowerSearch);\n if (caseInsensitiveIndex !== -1) {\n return {\n start: caseInsensitiveIndex,\n end: caseInsensitiveIndex + searchText.length,\n matchQuality: 'case-insensitive'\n };\n }\n\n // Strategy 4: Fuzzy match using Levenshtein distance with sliding window\n // Search near position hint if provided, otherwise search full content\n const windowSize = searchText.length;\n const searchRadius = Math.min(500, content.length);\n const searchStart = positionHint !== undefined\n ? Math.max(0, positionHint - searchRadius)\n : 0;\n const searchEnd = positionHint !== undefined\n ? Math.min(content.length, positionHint + searchRadius)\n : content.length;\n\n let bestMatch: { start: number; distance: number } | null = null;\n\n // Scan through content with sliding window\n for (let i = searchStart; i <= searchEnd - windowSize; i++) {\n const candidate = content.substring(i, i + windowSize);\n const distance = levenshteinDistance(searchText, candidate);\n\n if (distance <= maxFuzzyDistance) {\n if (!bestMatch || distance < bestMatch.distance) {\n bestMatch = { start: i, distance };\n }\n }\n }\n\n if (bestMatch) {\n return {\n start: bestMatch.start,\n end: bestMatch.start + windowSize,\n matchQuality: 'fuzzy'\n };\n }\n\n return null;\n}\n\n/**\n * Find text using exact match with optional prefix/suffix context\n *\n * When the exact text appears multiple times in the content, prefix and suffix\n * are used to disambiguate and find the correct occurrence.\n *\n * If exact text is not found, uses multi-strategy fuzzy matching (normalization,\n * case-insensitive, Levenshtein distance) to locate changed text.\n *\n * @param content - Full text content to search within\n * @param exact - The exact text to find\n * @param prefix - Optional text that should appear immediately before the match\n * @param suffix - Optional text that should appear immediately after the match\n * @param positionHint - Optional position hint (from TextPositionSelector) for fuzzy search\n * @returns Position of the matched text, or null if not found\n *\n * @example\n * ```typescript\n * const content = \"The cat sat. The cat ran.\";\n * // Find second \"The cat\" occurrence\n * const pos = findTextWithContext(content, \"The cat\", \"sat. \", \" ran\");\n * // Returns { start: 13, end: 20 }\n * ```\n */\nexport function findTextWithContext(\n content: string,\n exact: string,\n prefix: string | undefined,\n suffix: string | undefined,\n positionHint: number | undefined,\n cache: ContentCache\n): TextPosition | null {\n if (!exact) return null;\n\n // Fast path: if positionHint points directly at the exact text, return immediately\n if (positionHint !== undefined && positionHint >= 0 && positionHint + exact.length <= content.length) {\n if (content.substring(positionHint, positionHint + exact.length) === exact) {\n return { start: positionHint, end: positionHint + exact.length };\n }\n }\n\n // Find all occurrences of exact text\n const occurrences: number[] = [];\n let index = content.indexOf(exact);\n while (index !== -1) {\n occurrences.push(index);\n index = content.indexOf(exact, index + 1);\n }\n\n // No exact matches found - try fuzzy matching\n if (occurrences.length === 0) {\n const fuzzyMatch = findBestTextMatch(content, exact, positionHint, cache);\n\n if (fuzzyMatch) {\n return { start: fuzzyMatch.start, end: fuzzyMatch.end };\n }\n\n return null;\n }\n\n // Only one match - no need for prefix/suffix disambiguation\n if (occurrences.length === 1) {\n const pos = occurrences[0]!; // Safe: length === 1 means first element exists\n return { start: pos, end: pos + exact.length };\n }\n\n // Multiple matches - use prefix/suffix to disambiguate\n if (prefix || suffix) {\n for (const pos of occurrences) {\n // Extract actual prefix from content\n const actualPrefixStart = Math.max(0, pos - (prefix?.length || 0));\n const actualPrefix = content.substring(actualPrefixStart, pos);\n\n // Extract actual suffix from content\n const actualSuffixEnd = Math.min(content.length, pos + exact.length + (suffix?.length || 0));\n const actualSuffix = content.substring(pos + exact.length, actualSuffixEnd);\n\n // Check if prefix matches\n const prefixMatch = !prefix || actualPrefix.endsWith(prefix);\n\n // Check if suffix matches\n const suffixMatch = !suffix || actualSuffix.startsWith(suffix);\n\n if (prefixMatch && suffixMatch) {\n return { start: pos, end: pos + exact.length };\n }\n }\n\n // No match with exact prefix/suffix - try partial prefix/suffix match\n for (const pos of occurrences) {\n const actualPrefix = content.substring(Math.max(0, pos - (prefix?.length || 0)), pos);\n const actualSuffix = content.substring(pos + exact.length, pos + exact.length + (suffix?.length || 0));\n\n // Fuzzy match: check if prefix/suffix are substrings (handles whitespace variations)\n const fuzzyPrefixMatch = !prefix || actualPrefix.includes(prefix.trim());\n const fuzzySuffixMatch = !suffix || actualSuffix.includes(suffix.trim());\n\n if (fuzzyPrefixMatch && fuzzySuffixMatch) {\n return { start: pos, end: pos + exact.length };\n }\n }\n }\n\n // Fallback: return first occurrence if no prefix/suffix or no match\n const pos = occurrences[0]!; // Safe: we checked length > 0 earlier\n return { start: pos, end: pos + exact.length };\n}\n\n/**\n * Verify that a position correctly points to the exact text\n * Useful for debugging and validation\n */\nexport function verifyPosition(\n content: string,\n position: TextPosition,\n expectedExact: string\n): boolean {\n const actualText = content.substring(position.start, position.end);\n return actualText === expectedExact;\n}\n","/**\n * Locale information\n * Copied from SDK for frontend use\n */\n\nexport interface LocaleInfo {\n code: string;\n nativeName: string;\n englishName: string;\n}\n\nexport const LOCALES: readonly LocaleInfo[] = [\n { code: 'ar', nativeName: 'العربية', englishName: 'Arabic' },\n { code: 'bn', nativeName: 'বাংলা', englishName: 'Bengali' },\n { code: 'cs', nativeName: 'Čeština', englishName: 'Czech' },\n { code: 'da', nativeName: 'Dansk', englishName: 'Danish' },\n { code: 'de', nativeName: 'Deutsch', englishName: 'German' },\n { code: 'el', nativeName: 'Ελληνικά', englishName: 'Greek' },\n { code: 'en', nativeName: 'English', englishName: 'English' },\n { code: 'es', nativeName: 'Español', englishName: 'Spanish' },\n { code: 'fa', nativeName: 'فارسی', englishName: 'Persian' },\n { code: 'fi', nativeName: 'Suomi', englishName: 'Finnish' },\n { code: 'fr', nativeName: 'Français', englishName: 'French' },\n { code: 'he', nativeName: 'עברית', englishName: 'Hebrew' },\n { code: 'hi', nativeName: 'हिन्दी', englishName: 'Hindi' },\n { code: 'id', nativeName: 'Bahasa Indonesia', englishName: 'Indonesian' },\n { code: 'it', nativeName: 'Italiano', englishName: 'Italian' },\n { code: 'ja', nativeName: '日本語', englishName: 'Japanese' },\n { code: 'ko', nativeName: '한국어', englishName: 'Korean' },\n { code: 'ms', nativeName: 'Bahasa Melayu', englishName: 'Malay' },\n { code: 'nl', nativeName: 'Nederlands', englishName: 'Dutch' },\n { code: 'no', nativeName: 'Norsk', englishName: 'Norwegian' },\n { code: 'pl', nativeName: 'Polski', englishName: 'Polish' },\n { code: 'pt', nativeName: 'Português', englishName: 'Portuguese' },\n { code: 'ro', nativeName: 'Română', englishName: 'Romanian' },\n { code: 'sv', nativeName: 'Svenska', englishName: 'Swedish' },\n { code: 'th', nativeName: 'ไทย', englishName: 'Thai' },\n { code: 'tr', nativeName: 'Türkçe', englishName: 'Turkish' },\n { code: 'uk', nativeName: 'Українська', englishName: 'Ukrainian' },\n { code: 'vi', nativeName: 'Tiếng Việt', englishName: 'Vietnamese' },\n { code: 'zh', nativeName: '中文', englishName: 'Chinese' },\n] as const;\n\n// Create lookup map for efficient access\nconst localeByCode = new Map<string, LocaleInfo>(\n LOCALES.map(locale => [locale.code.toLowerCase(), locale])\n);\n\n/**\n * Get locale information by code\n */\nexport function getLocaleInfo(code: string | undefined): LocaleInfo | undefined {\n if (!code) return undefined;\n return localeByCode.get(code.toLowerCase());\n}\n\n/**\n * Get the native name of a language by its locale code\n */\nexport function getLocaleNativeName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.nativeName;\n}\n\n/**\n * Get the English name of a language by its locale code\n */\nexport function getLocaleEnglishName(code: string | undefined): string | undefined {\n return getLocaleInfo(code)?.englishName;\n}\n\n/**\n * Format locale code for display as \"Native Name (code)\"\n */\nexport function formatLocaleDisplay(code: string | undefined): string | undefined {\n if (!code) return undefined;\n\n const info = getLocaleInfo(code);\n if (!info) return code;\n\n return `${info.nativeName} (${code.toLowerCase()})`;\n}\n\n/**\n * Get all supported locale codes\n */\nexport function getAllLocaleCodes(): readonly string[] {\n return LOCALES.map(l => l.code);\n}\n","/**\n * Helper functions for working with W3C ResourceDescriptor\n */\n\nimport type { components } from '@semiont/core';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\ntype Representation = components['schemas']['Representation'];\n\n/**\n * Get the resource ID from @id property\n *\n * @id is always a bare ID (UUID), never a full URI.\n */\nexport function getResourceId(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource) return undefined;\n return resource['@id'] || undefined;\n}\n\n/**\n * Get the primary representation (first or only representation)\n */\nexport function getPrimaryRepresentation(resource: ResourceDescriptor | undefined): Representation | undefined {\n if (!resource?.representations) return undefined;\n const reps = Array.isArray(resource.representations)\n ? resource.representations\n : [resource.representations];\n return reps[0];\n}\n\n/**\n * Get the media type from the primary representation\n */\nexport function getPrimaryMediaType(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.mediaType;\n}\n\n/**\n * Get the checksum from the primary representation\n */\nexport function getChecksum(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.checksum;\n}\n\n/**\n * Get the language from the primary representation\n */\nexport function getLanguage(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.language;\n}\n\n/**\n * Get storage URI from primary representation\n *\n * @param resource - ResourceDescriptor\n * @returns Storage URI or undefined\n */\nexport function getStorageUri(resource: ResourceDescriptor | undefined): string | undefined {\n return getPrimaryRepresentation(resource)?.storageUri;\n}\n\n/**\n * Get creator agent from wasAttributedTo\n * Handles both single agent and array of agents\n *\n * @param resource - ResourceDescriptor\n * @returns First agent or undefined\n */\nexport function getCreator(resource: ResourceDescriptor | undefined): components['schemas']['Agent'] | undefined {\n if (!resource?.wasAttributedTo) return undefined;\n\n return Array.isArray(resource.wasAttributedTo)\n ? resource.wasAttributedTo[0]\n : resource.wasAttributedTo;\n}\n\n/**\n * Get derived-from URI\n * Handles both single URI and array of URIs\n *\n * @param resource - ResourceDescriptor\n * @returns First derivation URI or undefined\n */\nexport function getDerivedFrom(resource: ResourceDescriptor | undefined): string | undefined {\n if (!resource?.wasDerivedFrom) return undefined;\n\n return Array.isArray(resource.wasDerivedFrom)\n ? resource.wasDerivedFrom[0]\n : resource.wasDerivedFrom;\n}\n\n/**\n * Check if resource is archived (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if archived, false otherwise\n */\nexport function isArchived(resource: ResourceDescriptor | undefined): boolean {\n return resource?.archived === true;\n}\n\n/**\n * Get entity types from resource (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns Array of entity types, empty if not set\n */\nexport function getResourceEntityTypes(resource: ResourceDescriptor | undefined): string[] {\n return resource?.entityTypes || [];\n}\n\n/**\n * Check if resource is a draft (application-specific field)\n *\n * @param resource - ResourceDescriptor\n * @returns True if draft, false otherwise\n */\nexport function isDraft(resource: ResourceDescriptor | undefined): boolean {\n return resource?.isDraft === true;\n}\n\n/**\n * Map charset names to Node.js Buffer encoding names\n * Node.js Buffer.toString() supports: 'utf8', 'utf16le', 'latin1', 'base64', 'hex', 'ascii', 'binary', 'ucs2'\n *\n * @param charset - Charset name (e.g., \"UTF-8\", \"ISO-8859-1\", \"Windows-1252\")\n * @returns Node.js BufferEncoding\n */\nexport function getNodeEncoding(charset: string): BufferEncoding {\n const normalized = charset.toLowerCase().replace(/[-_]/g, '');\n\n // Map common charset names to Node.js encodings\n const charsetMap: Record<string, BufferEncoding> = {\n 'utf8': 'utf8',\n 'iso88591': 'latin1',\n 'latin1': 'latin1',\n 'ascii': 'ascii',\n 'usascii': 'ascii',\n 'utf16le': 'utf16le',\n 'ucs2': 'ucs2',\n 'binary': 'binary',\n 'windows1252': 'latin1', // Windows-1252 is a superset of Latin-1\n 'cp1252': 'latin1',\n };\n\n return charsetMap[normalized] || 'utf8';\n}\n\n/**\n * Decode a representation buffer to string using the correct charset\n * Extracts charset from media type and uses appropriate encoding\n *\n * @param buffer - The raw representation data\n * @param mediaType - Media type with optional charset (e.g., \"text/plain; charset=iso-8859-1\")\n * @returns Decoded string\n *\n * @example\n * ```typescript\n * const content = decodeRepresentation(buffer, \"text/plain; charset=utf-8\");\n * const legacy = decodeRepresentation(buffer, \"text/plain; charset=windows-1252\");\n * ```\n */\nexport function decodeRepresentation(buffer: Buffer, mediaType: string): string {\n // Extract charset from mediaType (e.g., \"text/plain; charset=iso-8859-1\")\n const charsetMatch = mediaType.match(/charset=([^\\s;]+)/i);\n const charset = (charsetMatch?.[1] || 'utf-8').toLowerCase();\n\n // Map to Node.js encoding\n const encoding = getNodeEncoding(charset);\n\n return buffer.toString(encoding);\n}\n","/**\n * SVG Utility Functions\n *\n * Utilities for creating, parsing, and manipulating W3C-compliant SVG selectors\n * for image annotation.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface BoundingBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Create W3C-compliant SVG rectangle selector\n */\nexport function createRectangleSvg(start: Point, end: Point): string {\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n const width = Math.abs(end.x - start.x);\n const height = Math.abs(end.y - start.y);\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"${x}\" y=\"${y}\" width=\"${width}\" height=\"${height}\"/></svg>`;\n}\n\n/**\n * Create W3C-compliant SVG polygon selector\n */\nexport function createPolygonSvg(points: Point[]): string {\n if (points.length < 3) {\n throw new Error('Polygon requires at least 3 points');\n }\n\n const pointsStr = points.map(p => `${p.x},${p.y}`).join(' ');\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><polygon points=\"${pointsStr}\"/></svg>`;\n}\n\n/**\n * Create W3C-compliant SVG circle selector\n */\nexport function createCircleSvg(center: Point, radius: number): string {\n if (radius <= 0) {\n throw new Error('Circle radius must be positive');\n }\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"${center.x}\" cy=\"${center.y}\" r=\"${radius}\"/></svg>`;\n}\n\n/**\n * Parse SVG selector to extract shape type and data\n */\nexport function parseSvgSelector(svg: string): {\n type: 'rect' | 'polygon' | 'circle' | 'path';\n data: any;\n} | null {\n // Extract rectangle\n const rectMatch = svg.match(/<rect\\s+([^>]+)\\/>/);\n if (rectMatch && rectMatch[1]) {\n const attrs = rectMatch[1];\n const x = parseFloat(attrs.match(/x=\"([^\"]+)\"/)?.[1] || '0');\n const y = parseFloat(attrs.match(/y=\"([^\"]+)\"/)?.[1] || '0');\n const width = parseFloat(attrs.match(/width=\"([^\"]+)\"/)?.[1] || '0');\n const height = parseFloat(attrs.match(/height=\"([^\"]+)\"/)?.[1] || '0');\n\n return {\n type: 'rect',\n data: { x, y, width, height }\n };\n }\n\n // Extract polygon\n const polygonMatch = svg.match(/<polygon\\s+points=\"([^\"]+)\"/);\n if (polygonMatch && polygonMatch[1]) {\n const pointsStr = polygonMatch[1];\n const points = pointsStr.split(/\\s+/).map(pair => {\n const [x, y] = pair.split(',').map(parseFloat);\n return { x, y };\n });\n\n return {\n type: 'polygon',\n data: { points }\n };\n }\n\n // Extract circle\n const circleMatch = svg.match(/<circle\\s+([^>]+)\\/>/);\n if (circleMatch && circleMatch[1]) {\n const attrs = circleMatch[1];\n const cx = parseFloat(attrs.match(/cx=\"([^\"]+)\"/)?.[1] || '0');\n const cy = parseFloat(attrs.match(/cy=\"([^\"]+)\"/)?.[1] || '0');\n const r = parseFloat(attrs.match(/r=\"([^\"]+)\"/)?.[1] || '0');\n\n return {\n type: 'circle',\n data: { cx, cy, r }\n };\n }\n\n return null;\n}\n\n/**\n * Normalize coordinates from display space to image native resolution\n */\nexport function normalizeCoordinates(\n point: Point,\n displayWidth: number,\n displayHeight: number,\n imageWidth: number,\n imageHeight: number\n): Point {\n return {\n x: (point.x / displayWidth) * imageWidth,\n y: (point.y / displayHeight) * imageHeight\n };\n}\n\n/**\n * Scale entire SVG selector from display space to image native resolution\n */\nexport function scaleSvgToNative(\n svg: string,\n displayWidth: number,\n displayHeight: number,\n imageWidth: number,\n imageHeight: number\n): string {\n const parsed = parseSvgSelector(svg);\n if (!parsed) return svg;\n\n const scaleX = imageWidth / displayWidth;\n const scaleY = imageHeight / displayHeight;\n\n switch (parsed.type) {\n case 'rect': {\n const { x, y, width, height } = parsed.data;\n return createRectangleSvg(\n { x: x * scaleX, y: y * scaleY },\n { x: (x + width) * scaleX, y: (y + height) * scaleY }\n );\n }\n\n case 'circle': {\n const { cx, cy, r } = parsed.data;\n return createCircleSvg(\n { x: cx * scaleX, y: cy * scaleY },\n r * Math.min(scaleX, scaleY)\n );\n }\n\n case 'polygon': {\n const points = parsed.data.points.map((p: Point) => ({\n x: p.x * scaleX,\n y: p.y * scaleY\n }));\n return createPolygonSvg(points);\n }\n }\n\n return svg;\n}\n","/**\n * Text context extraction utilities for W3C Web Annotation TextQuoteSelector\n *\n * Provides robust prefix/suffix context extraction with word boundary detection\n * to ensure fuzzy anchoring works correctly when the same text appears multiple times.\n *\n * Also provides AI offset validation and correction for handling AI-generated annotations\n * where the model may return slightly incorrect character offsets.\n *\n * @see https://www.w3.org/TR/annotation-model/#text-quote-selector\n */\n\nimport { findBestTextMatch, buildContentCache, type MatchQuality } from './fuzzy-anchor';\n\n/**\n * Extract prefix and suffix context for TextQuoteSelector\n *\n * Extracts up to 64 characters before and after the selected text,\n * extending to word boundaries to avoid cutting words in half.\n * This ensures prefix/suffix are meaningful context for fuzzy anchoring.\n *\n * @param content - Full text content\n * @param start - Start offset of selection\n * @param end - End offset of selection\n * @returns Object with prefix and suffix (undefined if at boundaries)\n *\n * @example\n * ```typescript\n * const content = \"The United States Congress...\";\n * const context = extractContext(content, 4, 17); // \"United States\"\n * // Returns: { prefix: \"The \", suffix: \" Congress...\" }\n * // NOT: { prefix: \"nited \", suffix: \"gress...\" }\n * ```\n */\nexport function extractContext(\n content: string,\n start: number,\n end: number\n): { prefix?: string; suffix?: string } {\n const CONTEXT_LENGTH = 64;\n const MAX_EXTENSION = 32; // Maximum additional chars to extend for word boundary\n\n // Extract prefix (up to CONTEXT_LENGTH chars before start, extended to word boundary)\n let prefix: string | undefined;\n if (start > 0) {\n let prefixStart = Math.max(0, start - CONTEXT_LENGTH);\n\n // Extend backward to word boundary (whitespace or punctuation)\n // Stop if we hit start of content or exceed MAX_EXTENSION\n let extensionCount = 0;\n while (prefixStart > 0 && extensionCount < MAX_EXTENSION) {\n const char = content[prefixStart - 1];\n // Break on whitespace, punctuation, or common delimiters\n if (!char || /[\\s.,;:!?'\"()\\[\\]{}<>\\/\\\\]/.test(char)) {\n break;\n }\n prefixStart--;\n extensionCount++;\n }\n\n prefix = content.substring(prefixStart, start);\n }\n\n // Extract suffix (up to CONTEXT_LENGTH chars after end, extended to word boundary)\n let suffix: string | undefined;\n if (end < content.length) {\n let suffixEnd = Math.min(content.length, end + CONTEXT_LENGTH);\n\n // Extend forward to word boundary (whitespace or punctuation)\n // Stop if we hit end of content or exceed MAX_EXTENSION\n let extensionCount = 0;\n while (suffixEnd < content.length && extensionCount < MAX_EXTENSION) {\n const char = content[suffixEnd];\n // Break on whitespace, punctuation, or common delimiters\n if (!char || /[\\s.,;:!?'\"()\\[\\]{}<>\\/\\\\]/.test(char)) {\n break;\n }\n suffixEnd++;\n extensionCount++;\n }\n\n suffix = content.substring(end, suffixEnd);\n }\n\n return { prefix, suffix };\n}\n\n/**\n * Result of validating and correcting AI-provided annotation offsets\n */\nexport interface ValidatedAnnotation {\n start: number;\n end: number;\n exact: string;\n prefix?: string;\n suffix?: string;\n corrected: boolean; // True if offsets were adjusted from AI's original values\n fuzzyMatched?: boolean; // True if we had to use fuzzy matching (minor text differences)\n matchQuality?: MatchQuality; // How we found the match\n}\n\n\n/**\n * Validate and correct AI-provided annotation offsets with fuzzy matching tolerance\n *\n * AI models sometimes return offsets that don't match the actual text position,\n * or provide text with minor variations (case differences, whitespace, typos).\n *\n * This function uses a multi-strategy approach:\n * 1. Check if AI's offsets are exactly correct\n * 2. Try exact case-sensitive search\n * 3. Try case-insensitive search\n * 4. Try fuzzy matching with Levenshtein distance (5% tolerance)\n *\n * This ensures we're maximally tolerant of AI errors while still maintaining\n * annotation quality and logging what corrections were made.\n *\n * @param content - Full text content\n * @param aiStart - Start offset from AI\n * @param aiEnd - End offset from AI\n * @param exact - The exact text that should be at this position (from AI)\n * @returns Validated annotation with corrected offsets and context\n * @throws Error if no acceptable match can be found\n *\n * @example\n * ```typescript\n * // AI said start=1143, but actual text is at 1161\n * const result = validateAndCorrectOffsets(\n * content,\n * 1143,\n * 1289,\n * \"the question \\\"whether...\"\n * );\n * // Returns: { start: 1161, end: 1303, exact: \"...\", corrected: true, matchQuality: 'exact', ... }\n * ```\n */\nexport function validateAndCorrectOffsets(\n content: string,\n aiStart: number,\n aiEnd: number,\n exact: string\n): ValidatedAnnotation {\n // First, check if AI's offsets are correct\n const textAtOffset = content.substring(aiStart, aiEnd);\n\n if (textAtOffset === exact) {\n // AI got it right! Just add proper context\n const context = extractContext(content, aiStart, aiEnd);\n return {\n start: aiStart,\n end: aiEnd,\n exact,\n prefix: context.prefix,\n suffix: context.suffix,\n corrected: false,\n matchQuality: 'exact'\n };\n }\n\n // AI's offsets are wrong - try to find the text using multiple strategies\n const cache = buildContentCache(content);\n const match = findBestTextMatch(content, exact, aiStart, cache);\n\n if (!match) {\n throw new Error(\n 'Cannot find acceptable match for text in content. ' +\n 'All search strategies failed. Text may be hallucinated.'\n );\n }\n\n // Found a match! Extract the actual text from content\n const actualText = content.substring(match.start, match.end);\n\n // Extract context using corrected offsets\n const context = extractContext(content, match.start, match.end);\n\n return {\n start: match.start,\n end: match.end,\n exact: actualText, // Use actual text from document, not AI's version\n prefix: context.prefix,\n suffix: context.suffix,\n corrected: true,\n fuzzyMatched: match.matchQuality !== 'exact',\n matchQuality: match.matchQuality\n };\n}\n","/**\n * Generic validation utilities for @semiont/api-client\n *\n * Pure TypeScript validation with no external dependencies.\n * Safe to use in any JavaScript environment (Node.js, browser, Deno, etc.)\n */\n\n/**\n * Validation result types\n */\nexport type ValidationSuccess<T> = { success: true; data: T };\nexport type ValidationFailure = { success: false; error: string; details?: string[] };\nexport type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;\n\n/**\n * JWT Token validation\n *\n * Validates JWT token format (header.payload.signature).\n * Does not verify signature - use for format validation only.\n */\nexport const JWTTokenSchema = {\n parse(token: unknown): string {\n if (typeof token !== 'string') {\n throw new Error('Token must be a string');\n }\n if (!token || token.length === 0) {\n throw new Error('Token is required');\n }\n // JWT format: header.payload.signature\n const jwtRegex = /^[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]*$/;\n if (!jwtRegex.test(token)) {\n throw new Error('Invalid JWT token format');\n }\n return token;\n },\n\n safeParse(token: unknown): ValidationResult<string> {\n try {\n const validated = this.parse(token);\n return { success: true, data: validated };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Invalid JWT token',\n };\n }\n },\n};\n\n/**\n * Generic validation helper with error formatting\n *\n * Wraps any schema's parse method with try/catch and returns ValidationResult.\n *\n * @example\n * ```typescript\n * const result = validateData(JWTTokenSchema, 'eyJ...');\n * if (result.success) {\n * console.log('Valid token:', result.data);\n * } else {\n * console.error('Invalid:', result.error);\n * }\n * ```\n */\nexport function validateData<T>(\n schema: { parse(data: unknown): T },\n data: unknown\n): ValidationResult<T> {\n try {\n const validated = schema.parse(data);\n return { success: true, data: validated };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Validation failed',\n };\n }\n}\n\n/**\n * Email validation helper\n *\n * Validates email format using RFC 5322 simplified regex.\n *\n * @param email - Email address to validate\n * @returns true if valid email format\n */\nexport function isValidEmail(email: string): boolean {\n if (email.length < 1 || email.length > 255) {\n return false;\n }\n // RFC 5322 simplified email regex\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n","import { BehaviorSubject, type Observable, map } from 'rxjs';\nimport type { GatheredContext, AnnotationId, ContentFormat, AccessToken } from '@semiont/core';\nimport { resourceId as makeResourceId, annotationId as makeAnnotationId } from '@semiont/core';\nimport type { 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 type { SemiontApiClient } from '../../client';\nimport { getPrimaryMediaType, decodeWithCharset } from '../../utils';\n\ntype ResourceDescriptor = components['schemas']['ResourceDescriptor'];\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: SemiontApiClient,\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.getResourceRepresentation(rId, {\n accept: mediaType as ContentFormat,\n auth,\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","/**\n * MIME type utilities for Semiont\n *\n * Initial support for:\n * - text/plain\n * - text/markdown\n * - image/png\n * - image/jpeg\n * - application/pdf\n */\n\n/**\n * Map MIME type to file extension\n */\nexport function getExtensionForMimeType(mimeType: string): string {\n const map: Record<string, string> = {\n 'text/plain': 'txt',\n 'text/markdown': 'md',\n 'image/png': 'png',\n 'image/jpeg': 'jpg',\n 'application/pdf': 'pdf',\n };\n\n return map[mimeType] || 'dat'; // fallback to .dat for unknown types\n}\n\n/**\n * Detect if MIME type is an image (png or jpeg only for now)\n */\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType === 'image/png' || mimeType === 'image/jpeg';\n}\n\n/**\n * Detect if MIME type is text-based (plain or markdown only for now)\n */\nexport function isTextMimeType(mimeType: string): boolean {\n return mimeType === 'text/plain' || mimeType === 'text/markdown';\n}\n\n/**\n * Detect if MIME type is PDF\n */\nexport function isPdfMimeType(mimeType: string): boolean {\n return mimeType === 'application/pdf';\n}\n\n/**\n * Get category for MIME type (for routing to appropriate viewer)\n *\n * Categories represent annotation models, not file formats:\n * - 'text': Text-based annotations (TextPositionSelector, TextQuoteSelector)\n * - 'image': Spatial coordinate annotations (SvgSelector, FragmentSelector)\n *\n * PDFs use spatial coordinates for annotations, so they belong to 'image' category.\n */\nexport type MimeCategory = 'text' | 'image' | 'unsupported';\n\nexport function getMimeCategory(mimeType: string): MimeCategory {\n if (isTextMimeType(mimeType)) {\n return 'text';\n }\n if (isImageMimeType(mimeType) || isPdfMimeType(mimeType)) {\n return 'image';\n }\n return 'unsupported';\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/transport/actor-vm.ts","../src/transport/http-transport.ts","../src/transport/http-content-transport.ts"],"names":["BehaviorSubject","busLog","withSpan","SpanKind","getActiveTraceparent"],"mappings":"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","file":"index.js","sourcesContent":["import { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { filter, map, share } from 'rxjs/operators';\nimport { busLog, type ConnectionState } from '@semiont/core';\nimport {\n SpanKind,\n extractTraceparent,\n getActiveTraceparent,\n withSpan,\n withTraceparent,\n} from '@semiont/observability';\n\n/** Minimal ViewModel surface — anything with a `dispose()` method. */\ninterface ViewModel {\n dispose(): void;\n}\n\nexport type { ConnectionState };\n\nexport interface BusEvent {\n channel: string;\n payload: Record<string, unknown>;\n scope?: string;\n}\n\nexport interface ActorVMOptions {\n baseUrl: string;\n token: string | (() => string);\n channels: string[];\n scope?: string;\n reconnectMs?: number;\n}\n\n/** Time in the `reconnecting` state before transitioning to `degraded`. */\nexport const DEGRADED_THRESHOLD_MS = 3_000;\n\nexport interface ActorVM extends ViewModel {\n on$<T = Record<string, unknown>>(channel: string): Observable<T>;\n emit(channel: string, payload: Record<string, unknown>, emitScope?: string): Promise<void>;\n state$: Observable<ConnectionState>;\n addChannels(channels: string[], scope?: string): void;\n removeChannels(channels: string[]): void;\n start(): void;\n stop(): void;\n}\n\n/** Allowed transitions in the connection state machine. */\nconst ALLOWED_TRANSITIONS: Record<ConnectionState, ReadonlyArray<ConnectionState>> = {\n initial: ['connecting', 'closed'],\n connecting: ['open', 'reconnecting', 'closed'],\n open: ['reconnecting', 'closed'],\n reconnecting: ['connecting', 'degraded', 'closed'],\n degraded: ['connecting', 'closed'],\n closed: [],\n};\n\nexport function createActorVM(options: ActorVMOptions): ActorVM {\n const { baseUrl, token: tokenOrGetter, channels: initialChannels, scope: initialScope, reconnectMs = 5_000 } = options;\n const getToken = typeof tokenOrGetter === 'function' ? tokenOrGetter : () => tokenOrGetter;\n\n // TEMPORARY DIAGNOSTIC — actor instance counter.\n const g = globalThis as { __SEMIONT_ACTOR_INSTANCES__?: number };\n g.__SEMIONT_ACTOR_INSTANCES__ = (g.__SEMIONT_ACTOR_INSTANCES__ ?? 0) + 1;\n const actorSerial = g.__SEMIONT_ACTOR_INSTANCES__;\n // eslint-disable-next-line no-console\n console.debug(`[diag] ActorVM #${actorSerial} constructed (baseUrl=${baseUrl})`);\n\n const globalChannels = new Set(initialChannels);\n const scopedChannels = new Set<string>();\n let activeScope = initialScope;\n\n const events$ = new Subject<BusEvent>();\n const state$ = new BehaviorSubject<ConnectionState>('initial');\n let currentState: ConnectionState = 'initial';\n let degradedTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * Move the state machine to `next`. Throws on invalid transitions.\n * The throw is deliberate — a bad transition means a bug in the\n * reconnect loop; silent correction would hide it. The reconnect\n * timer logic is responsible for ensuring we only transition\n * between valid states.\n *\n * Side effect: manages the `degraded` timer. Enters on\n * `reconnecting`, cleared on exit.\n */\n const transition = (next: ConnectionState): void => {\n if (currentState === next) return;\n const allowed = ALLOWED_TRANSITIONS[currentState];\n if (!allowed.includes(next)) {\n throw new Error(`Invalid connection state transition: ${currentState} → ${next}`);\n }\n const prev = currentState;\n currentState = next;\n\n if (next === 'reconnecting' && prev !== 'reconnecting') {\n // Starting a reconnect cycle — arm the degraded-threshold timer.\n if (degradedTimer) clearTimeout(degradedTimer);\n degradedTimer = setTimeout(() => {\n if (currentState === 'reconnecting') transition('degraded');\n }, DEGRADED_THRESHOLD_MS);\n }\n if (prev === 'reconnecting' && next !== 'reconnecting') {\n // Leaving reconnecting (to connecting, degraded, or closed) —\n // the timer is either no longer relevant or has just fired.\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n }\n\n state$.next(next);\n };\n\n let running = false;\n /**\n * All in-flight SSE fetch controllers. Tracked as a Set because\n * connect() may race with itself under mount-churn or rapid channel-\n * set changes — whenever a new connect() starts we abort ALL previous\n * in-flight fetches rather than only the last-tracked one. A previous\n * single-slot implementation leaked orphaned streams (diagnosed by\n * observing 3 concurrent SSE subscribes in the /bus/subscribe network\n * log, each delivering duplicate RECV frames). Using a Set guarantees\n * at most one live stream post-reconnect regardless of race order.\n */\n const inflightControllers = new Set<AbortController>();\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * `Last-Event-ID` of the most recently delivered SSE event from the\n * server. Sent as a request header on each connect so the server can\n * replay persisted events missed during the disconnect (see\n * `apps/backend/src/routes/bus.ts` subscribe handler). Initialised\n * `null` — fresh connections send no header.\n *\n * We track both persisted (`p-*`) and ephemeral (`e-*`) ids. The server\n * treats ephemeral ids as \"no resumption context\" and responds live-\n * only; persisted ids drive replay.\n */\n let lastEventId: string | null = null;\n\n const shared$ = events$.pipe(share());\n\n const disconnect = () => {\n for (const c of inflightControllers) {\n try { c.abort(); } catch { /* noop */ }\n }\n inflightControllers.clear();\n if (reconnectTimer) { clearTimeout(reconnectTimer); reconnectTimer = null; }\n };\n\n const connect = async () => {\n // Transition to `connecting` from whichever reconnect-ish state\n // we're currently in (`initial`, `reconnecting`, `degraded`).\n transition('connecting');\n\n // Abort every previous in-flight fetch before starting a new one.\n // This closes the orphan-stream leak described above.\n for (const c of inflightControllers) {\n try { c.abort(); } catch { /* noop */ }\n }\n inflightControllers.clear();\n\n const params = new URLSearchParams();\n for (const ch of globalChannels) {\n params.append('channel', ch);\n }\n if (activeScope && scopedChannels.size > 0) {\n params.append('scope', activeScope);\n for (const ch of scopedChannels) {\n params.append('scoped', ch);\n }\n }\n const url = `${baseUrl}/bus/subscribe?${params.toString()}`;\n\n const controller = new AbortController();\n inflightControllers.add(controller);\n\n try {\n const headers: Record<string, string> = { Authorization: `Bearer ${getToken()}` };\n if (lastEventId) headers['Last-Event-ID'] = lastEventId;\n const response = await fetch(url, { headers, signal: controller.signal });\n\n if (!response.ok || !response.body) {\n throw new Error(`SSE connect failed: ${response.status}`);\n }\n\n transition('open');\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n // SSE parse state is declared OUTSIDE the read loop: a single\n // event can span many `reader.read()` chunks when the payload is\n // large (a full resource-result with annotations can easily exceed\n // one TCP segment). Resetting these on every read would silently\n // drop any event whose `event:`/`id:` headers land in one chunk\n // and whose terminating blank line lands in the next.\n let currentEvent = '';\n let currentData = '';\n let currentId: string | undefined;\n\n while (running && inflightControllers.has(controller)) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7);\n } else if (line.startsWith('data: ')) {\n currentData = line.slice(6);\n } else if (line.startsWith('id: ')) {\n currentId = line.slice(4);\n } else if (line === '') {\n if (currentEvent === 'bus-event' && currentData) {\n if (currentId !== undefined) lastEventId = currentId;\n const parsed = JSON.parse(currentData) as BusEvent;\n busLog('RECV', parsed.channel, parsed.payload, parsed.scope);\n // Tier 2: lift trace context off the SSE payload (the\n // backend's writeBusEvent puts it there). The synchronous\n // fan-out to subscribers happens inside the bus.recv span,\n // so handlers see the parent trace.\n const carrier = extractTraceparent(\n parsed.payload as Record<string, unknown>,\n );\n await withTraceparent(carrier, () =>\n withSpan(\n `bus.recv:${parsed.channel}`,\n () => { events$.next(parsed); },\n {\n kind: SpanKind.CONSUMER,\n attrs: {\n 'bus.channel': parsed.channel,\n ...(parsed.scope ? { 'bus.scope': parsed.scope } : {}),\n },\n },\n ),\n );\n }\n currentEvent = '';\n currentData = '';\n currentId = undefined;\n }\n }\n }\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n // Any non-abort error falls through to the reconnect-retry block.\n } finally {\n inflightControllers.delete(controller);\n }\n\n // If we reached here without an AbortError, the connection dropped\n // or the fetch failed. Transition to reconnecting and schedule a\n // retry after `reconnectMs`.\n if (running) {\n transition('reconnecting');\n reconnectTimer = setTimeout(() => {\n if (running) connect();\n }, reconnectMs);\n }\n };\n\n const reconnect = () => {\n if (!running) return;\n // Transition to `reconnecting` BEFORE aborting the current\n // connection. This matches the pre-state-machine contract where\n // gap-detection relied on seeing a \"dropped\" signal before a\n // subsequent \"connected\" signal; with the state machine, the\n // transition sequence `open → reconnecting → connecting → open`\n // is what BrowseNamespace's gap-detection (pre-BUS-RESUMPTION\n // code path) watches for.\n if (currentState === 'open' || currentState === 'connecting' || currentState === 'degraded') {\n transition('reconnecting');\n }\n disconnect();\n connect();\n };\n\n // Debounce channel-set-change reconnects. React StrictMode in dev\n // produces mount → cleanup → mount synchronously, which previously\n // translated into three back-to-back reconnects — enough to tear down\n // in-flight responses, fire gap detection, refetch, tear that down\n // again, and leave the page stuck in \"Loading...\" while caches\n // thrashed. With a short debounce the whole sequence collapses into\n // one reconnect after the final channel-set is stable.\n let reconnectTimer2: ReturnType<typeof setTimeout> | null = null;\n const RECONNECT_DEBOUNCE_MS = 100;\n const scheduleReconnect = () => {\n if (reconnectTimer2) clearTimeout(reconnectTimer2);\n reconnectTimer2 = setTimeout(() => {\n reconnectTimer2 = null;\n reconnect();\n }, RECONNECT_DEBOUNCE_MS);\n };\n\n return {\n on$<T = Record<string, unknown>>(channel: string): Observable<T> {\n return shared$.pipe(\n filter((e) => e.channel === channel),\n map((e) => e.payload as T),\n );\n },\n\n emit: async (channel: string, payload: Record<string, unknown>, emitScope?: string): Promise<void> => {\n // EMIT logging + bus.emit span live at the transport contract layer\n // (`HttpTransport.emit`). ActorVM is plumbing. We do propagate the\n // active span's W3C traceparent on the outbound POST so the backend\n // can stitch the bus.dispatch server span as a child.\n const body: Record<string, unknown> = { channel, payload };\n if (emitScope) body.scope = emitScope;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${getToken()}`,\n };\n const trace = getActiveTraceparent();\n if (trace) {\n headers['traceparent'] = trace.traceparent;\n if (trace.tracestate) headers['tracestate'] = trace.tracestate;\n }\n await fetch(`${baseUrl}/bus/emit`, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n });\n },\n\n state$: state$.asObservable(),\n\n addChannels: (channels: string[], scope?: string) => {\n let changed = false;\n if (scope !== undefined) {\n for (const ch of channels) {\n if (!scopedChannels.has(ch)) { scopedChannels.add(ch); changed = true; }\n }\n if (scope !== activeScope) { activeScope = scope; changed = true; }\n } else {\n for (const ch of channels) {\n if (!globalChannels.has(ch)) { globalChannels.add(ch); changed = true; }\n }\n }\n if (changed) scheduleReconnect();\n },\n\n removeChannels: (channels: string[]) => {\n let changed = false;\n for (const ch of channels) {\n if (scopedChannels.delete(ch)) changed = true;\n if (globalChannels.delete(ch)) changed = true;\n }\n if (scopedChannels.size === 0) activeScope = undefined;\n if (changed) scheduleReconnect();\n },\n\n start: () => {\n if (running) return;\n running = true;\n connect();\n },\n\n stop: () => {\n running = false;\n if (currentState !== 'closed') transition('closed');\n if (reconnectTimer2) { clearTimeout(reconnectTimer2); reconnectTimer2 = null; }\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n disconnect();\n },\n\n dispose: () => {\n running = false;\n if (currentState !== 'closed') transition('closed');\n if (reconnectTimer2) { clearTimeout(reconnectTimer2); reconnectTimer2 = null; }\n if (degradedTimer) { clearTimeout(degradedTimer); degradedTimer = null; }\n disconnect();\n events$.complete();\n state$.complete();\n },\n };\n}\n","/**\n * HttpTransport — the HTTP/SSE implementation of ITransport.\n *\n * Phase 1 of TRANSPORT-ABSTRACTION. Owns everything that crosses the wire\n * in remote mode: the bus actor (SSE + POST /bus/emit), auth/admin/exchange/\n * system HTTP endpoints, and connection-state plumbing.\n *\n * Does NOT own the local coordination bus — that lives on `SemiontClient`.\n * `bridgeInto(bus)` wires SSE-received events into the caller-supplied bus\n * once at construction.\n */\n\nimport ky, { HTTPError, type KyInstance } from 'ky';\nimport { BehaviorSubject, type Observable, type Subscription } from 'rxjs';\nimport type {\n AccessToken,\n BaseUrl,\n Email,\n EventBus,\n EventMap,\n GoogleCredential,\n Logger,\n RefreshToken,\n ResourceId,\n UserDID,\n components,\n} from '@semiont/core';\nimport {\n PERSISTED_EVENT_TYPES,\n RESOURCE_BROADCAST_TYPES,\n busLog,\n} from '@semiont/core';\nimport { SpanKind, recordBusEmit, withSpan } from '@semiont/observability';\nimport { createActorVM, type ActorVM } from './actor-vm';\nimport type {\n ConnectionState,\n ITransport,\n HealthCheckResponse,\n StatusResponse,\n UserResponse,\n UpdateUserRequest,\n UpdateUserResponse,\n ListUsersResponse,\n ProgressCallback,\n ProgressEvent,\n} from '@semiont/core';\nimport { BRIDGED_CHANNELS } from '@semiont/core';\n\ntype AuthResponse = components['schemas']['AuthResponse'];\ntype TokenRefreshResponse = components['schemas']['TokenRefreshResponse'];\ntype AdminUserStatsResponse = components['schemas']['AdminUserStatsResponse'];\ntype OAuthConfigResponse = components['schemas']['OAuthConfigResponse'];\n\n// ── Channel constants (mirror client.ts) ────────────────────────────────\n\nconst RESOURCE_SCOPED_CHANNELS = [\n ...PERSISTED_EVENT_TYPES.filter((t) => t !== 'mark:entity-type-added'),\n ...RESOURCE_BROADCAST_TYPES,\n];\n\nexport class APIError extends Error {\n constructor(\n message: string,\n public status: number,\n public statusText: string,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'APIError';\n }\n}\n\nexport type TokenRefresher = () => Promise<string | null>;\n\nexport interface HttpTransportConfig {\n baseUrl: BaseUrl;\n /** Observable token source; headers read the current value. */\n token$?: BehaviorSubject<AccessToken | null>;\n timeout?: number;\n retry?: number;\n logger?: Logger;\n /** Optional 401-recovery hook. See {@link TokenRefresher}. */\n tokenRefresher?: TokenRefresher;\n}\n\nexport class HttpTransport implements ITransport {\n readonly baseUrl: BaseUrl;\n private readonly http: KyInstance;\n private readonly token$: BehaviorSubject<AccessToken | null>;\n private readonly logger?: Logger;\n\n private _actor: ActorVM | null = null;\n private _actorStarted = false;\n private disposed = false;\n\n private activeResource: {\n resourceId: ResourceId;\n refCount: number;\n bridgeSubs: Subscription[];\n } | null = null;\n\n /** Buses we've been asked to bridge wire events into. */\n private readonly bridges: EventBus[] = [];\n\n constructor(config: HttpTransportConfig) {\n const { baseUrl, timeout = 30000, retry = 2, logger, tokenRefresher } = config;\n\n this.baseUrl = (baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl) as BaseUrl;\n this.token$ = config.token$ ?? new BehaviorSubject<AccessToken | null>(null);\n this.logger = logger;\n\n // Retry policy: when a refresher is configured, expand retry to also\n // cover 401 (one attempt). Otherwise use the plain `retry` number.\n const retryConfig = tokenRefresher\n ? {\n limit: 1,\n methods: ['get', 'post', 'put', 'patch', 'delete', 'head', 'options'],\n statusCodes: [401, 408, 413, 429, 500, 502, 503, 504],\n }\n : retry;\n\n this.http = ky.create({\n timeout,\n retry: retryConfig,\n credentials: 'include',\n hooks: {\n beforeRequest: [\n (request) => {\n if (this.logger) {\n this.logger.debug('HTTP Request', {\n type: 'http_request',\n url: request.url,\n method: request.method,\n timestamp: Date.now(),\n hasAuth: request.headers.has('Authorization'),\n });\n }\n },\n ],\n beforeRetry: tokenRefresher\n ? [\n async ({ request, error }) => {\n if (!(error instanceof HTTPError) || error.response.status !== 401) {\n return undefined;\n }\n try {\n const newToken = await tokenRefresher();\n if (!newToken) return ky.stop;\n request.headers.set('Authorization', `Bearer ${newToken}`);\n return undefined;\n } catch {\n return ky.stop;\n }\n },\n ]\n : [],\n afterResponse: [\n (request, _options, response) => {\n if (this.logger) {\n this.logger.debug('HTTP Response', {\n type: 'http_response',\n url: request.url,\n method: request.method,\n status: response.status,\n statusText: response.statusText,\n });\n }\n return response;\n },\n ],\n beforeError: [\n async (error) => {\n const { response, request } = error;\n if (response) {\n const body = await response.json().catch(() => ({})) as { message?: string };\n if (this.logger) {\n this.logger.error('HTTP Request Failed', {\n type: 'http_error',\n url: request.url,\n method: request.method,\n status: response.status,\n statusText: response.statusText,\n error: body.message || `HTTP ${response.status}: ${response.statusText}`,\n });\n }\n throw new APIError(\n body.message || `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n response.statusText,\n body,\n );\n }\n return error;\n },\n ],\n },\n });\n\n // Auto-start the bus actor once a token arrives.\n this.token$.subscribe((token) => {\n if (token && !this._actorStarted && !this.disposed) {\n this._actorStarted = true;\n this.actor.start();\n }\n });\n }\n\n // ── Lazy actor construction + per-channel fan-in to bridges ───────────\n //\n // `actor` is exposed so the legacy `SemiontClient` can keep `.actor`\n // pointing at the same ActorVM during the transport-abstraction\n // migration. Once SemiontClient is removed, this should be made\n // private again — external callers should use emit/on/stream/state$.\n\n get actor(): ActorVM {\n if (!this._actor) {\n this._actor = createActorVM({\n baseUrl: this.baseUrl,\n token: () => this.token$.getValue() ?? '',\n channels: [...BRIDGED_CHANNELS],\n });\n for (const channel of BRIDGED_CHANNELS) {\n this._actor.on$<Record<string, unknown>>(channel).subscribe((payload) => {\n for (const bus of this.bridges) {\n (bus.get(channel as keyof EventMap) as { next(v: unknown): void }).next(payload);\n }\n });\n }\n }\n return this._actor;\n }\n\n // ── ITransport — bus primitives ───────────────────────────────────────\n\n async emit<K extends keyof EventMap>(\n channel: K,\n payload: EventMap[K],\n resourceScope?: ResourceId,\n ): Promise<void> {\n busLog('EMIT', channel as string, payload, resourceScope as string | undefined);\n recordBusEmit(channel as string, resourceScope as string | undefined);\n await withSpan(\n `bus.emit:${channel as string}`,\n async () => {\n if (resourceScope !== undefined) {\n await this.actor.emit(\n channel as string,\n payload as unknown as Record<string, unknown>,\n resourceScope as string,\n );\n } else {\n await this.actor.emit(\n channel as string,\n payload as unknown as Record<string, unknown>,\n );\n }\n },\n {\n kind: SpanKind.PRODUCER,\n attrs: {\n 'bus.channel': channel as string,\n ...(resourceScope ? { 'bus.scope': resourceScope as string } : {}),\n },\n },\n );\n }\n\n on<K extends keyof EventMap>(\n channel: K,\n handler: (payload: EventMap[K]) => void,\n ): () => void {\n const sub = this.actor.on$<EventMap[K]>(channel as string).subscribe(handler);\n return () => sub.unsubscribe();\n }\n\n stream<K extends keyof EventMap>(channel: K): Observable<EventMap[K]> {\n return this.actor.on$<EventMap[K]>(channel as string);\n }\n\n /**\n * Wire this transport's SSE fan-in into the given bus. Every channel\n * in `BRIDGED_CHANNELS` (and subsequently per-resource scoped channels\n * opened by `subscribeToResource`) is published on the bus. Safe to\n * call multiple times — each bus is added to the fan-out list.\n */\n bridgeInto(bus: EventBus): void {\n this.bridges.push(bus);\n }\n\n subscribeToResource(resourceId: ResourceId): () => void {\n if (this.activeResource) {\n if (this.activeResource.resourceId !== resourceId) {\n throw new Error(\n `HttpTransport already subscribed to resource ${this.activeResource.resourceId}; ` +\n `call the unsubscribe returned from the previous subscribeToResource before subscribing to ${resourceId}.`,\n );\n }\n this.activeResource.refCount++;\n return this.makeUnsubscriber();\n }\n\n this.actor.addChannels([...RESOURCE_SCOPED_CHANNELS], resourceId as string);\n\n const bridgeSubs: Subscription[] = [];\n for (const channel of RESOURCE_SCOPED_CHANNELS) {\n bridgeSubs.push(\n this.actor.on$<Record<string, unknown>>(channel).subscribe((payload) => {\n for (const bus of this.bridges) {\n (bus.get(channel as keyof EventMap) as { next(v: unknown): void }).next(payload);\n }\n }),\n );\n }\n\n this.activeResource = { resourceId, refCount: 1, bridgeSubs };\n return this.makeUnsubscriber();\n }\n\n private makeUnsubscriber(): () => void {\n let called = false;\n return () => {\n if (called) return;\n called = true;\n if (!this.activeResource) return;\n this.activeResource.refCount--;\n if (this.activeResource.refCount > 0) return;\n for (const sub of this.activeResource.bridgeSubs) sub.unsubscribe();\n this.actor.removeChannels([...RESOURCE_SCOPED_CHANNELS]);\n this.activeResource = null;\n };\n }\n\n get state$(): Observable<ConnectionState> {\n return this.actor.state$;\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n if (this.activeResource) {\n for (const sub of this.activeResource.bridgeSubs) sub.unsubscribe();\n this.activeResource = null;\n }\n if (this._actor) {\n this._actor.dispose();\n this._actor = null;\n }\n }\n\n // ── Auth ──────────────────────────────────────────────────────────────\n\n private authHeaders(): Record<string, string> {\n const token = this.token$.getValue() ?? undefined;\n return token ? { Authorization: `Bearer ${token}` } : {};\n }\n\n async authenticatePassword(email: Email, password: string): Promise<AuthResponse> {\n return this.http.post(`${this.baseUrl}/api/tokens/password`, {\n json: { email, password },\n headers: this.authHeaders(),\n }).json();\n }\n\n async authenticateGoogle(credential: GoogleCredential): Promise<AuthResponse> {\n return this.http.post(`${this.baseUrl}/api/tokens/google`, {\n json: { credential },\n headers: this.authHeaders(),\n }).json();\n }\n\n async refreshAccessToken(token: RefreshToken): Promise<TokenRefreshResponse> {\n return this.http.post(`${this.baseUrl}/api/tokens/refresh`, {\n json: { refreshToken: token },\n headers: this.authHeaders(),\n }).json();\n }\n\n async logout(): Promise<void> {\n await this.http.post(`${this.baseUrl}/api/users/logout`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async acceptTerms(): Promise<void> {\n await this.http.post(`${this.baseUrl}/api/users/accept-terms`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async getCurrentUser(): Promise<UserResponse> {\n return this.http.get(`${this.baseUrl}/api/users/me`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async generateMcpToken(): Promise<{ token: string }> {\n return this.http.post(`${this.baseUrl}/api/tokens/mcp-generate`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async getMediaToken(resourceId: ResourceId): Promise<{ token: string }> {\n return this.http.post(`${this.baseUrl}/api/tokens/media`, {\n json: { resourceId },\n headers: this.authHeaders(),\n }).json();\n }\n\n // ── Admin ─────────────────────────────────────────────────────────────\n\n async listUsers(): Promise<ListUsersResponse> {\n return this.http.get(`${this.baseUrl}/api/admin/users`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async getUserStats(): Promise<AdminUserStatsResponse> {\n return this.http.get(`${this.baseUrl}/api/admin/users/stats`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async updateUser(id: UserDID, data: UpdateUserRequest): Promise<UpdateUserResponse> {\n return this.http.patch(`${this.baseUrl}/api/admin/users/${id}`, {\n json: data,\n headers: this.authHeaders(),\n }).json();\n }\n\n async getOAuthConfig(): Promise<OAuthConfigResponse> {\n return this.http.get(`${this.baseUrl}/api/admin/oauth/config`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n // ── Exchange (backup/restore/export/import) ───────────────────────────\n\n async backupKnowledgeBase(): Promise<Response> {\n return this.http.post(`${this.baseUrl}/api/admin/exchange/backup`, {\n headers: this.authHeaders(),\n });\n }\n\n async restoreKnowledgeBase(\n file: File,\n onProgress?: ProgressCallback,\n ): Promise<ProgressEvent> {\n const formData = new FormData();\n formData.append('file', file);\n const response = await this.http.post(`${this.baseUrl}/api/admin/exchange/restore`, {\n body: formData,\n headers: this.authHeaders(),\n });\n return this.parseSSEStream(response, onProgress);\n }\n\n async exportKnowledgeBase(params?: { includeArchived?: boolean }): Promise<Response> {\n const searchParams = params?.includeArchived ? new URLSearchParams({ includeArchived: 'true' }) : undefined;\n return this.http.post(`${this.baseUrl}/api/moderate/exchange/export`, {\n headers: this.authHeaders(),\n ...(searchParams ? { searchParams } : {}),\n });\n }\n\n async importKnowledgeBase(\n file: File,\n onProgress?: ProgressCallback,\n ): Promise<ProgressEvent> {\n const formData = new FormData();\n formData.append('file', file);\n const response = await this.http.post(`${this.baseUrl}/api/moderate/exchange/import`, {\n body: formData,\n headers: this.authHeaders(),\n });\n return this.parseSSEStream(response, onProgress);\n }\n\n private async parseSSEStream(\n response: Response,\n onProgress?: ProgressCallback,\n ): Promise<ProgressEvent> {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let finalResult: ProgressEvent = { phase: 'unknown' };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop()!;\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const event = JSON.parse(line.slice(6));\n onProgress?.(event);\n if (event.phase === 'complete' || event.phase === 'error' || event.phase === 'failed') {\n finalResult = event;\n }\n }\n }\n }\n\n return finalResult;\n }\n\n // ── System status ─────────────────────────────────────────────────────\n\n async healthCheck(): Promise<HealthCheckResponse> {\n return this.http.get(`${this.baseUrl}/api/health`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n async getStatus(): Promise<StatusResponse> {\n return this.http.get(`${this.baseUrl}/api/status`, {\n headers: this.authHeaders(),\n }).json();\n }\n\n // ── Internal: ky accessor for legacy passthroughs (temporary) ─────────\n\n /**\n * Temporary escape hatch for the ongoing transport migration: namespaces\n * that still need to issue ad-hoc HTTP calls (e.g. legacy browse/mark\n * HTTP fallbacks) can borrow the configured `ky` instance here. Will be\n * deleted once all namespaces route through bus channels or through\n * typed methods on this transport.\n */\n get rawHttp(): KyInstance {\n return this.http;\n }\n\n /**\n * Current access token (synchronously read from the BehaviorSubject).\n * Used by content-transport and legacy namespace HTTP fallbacks that\n * need to pass `auth: token` through some code paths.\n */\n getToken(): AccessToken | undefined {\n return this.token$.getValue() ?? undefined;\n }\n}\n\n// Re-export for convenience\nexport type { ConnectionState } from '@semiont/core';\n","/**\n * HttpContentTransport — binary I/O over HTTP.\n *\n * Phase 1 of TRANSPORT-ABSTRACTION. Narrow by design because binary has\n * different backpressure and streaming characteristics than typed command\n * payloads. Uses the HttpTransport's underlying ky instance + token, so\n * retries, logging, and auth behave identically to the rest of the wire.\n */\n\nimport type { AccessToken, ContentFormat, ResourceId } from '@semiont/core';\nimport { busLog } from '@semiont/core';\nimport { SpanKind, getActiveTraceparent, withSpan } from '@semiont/observability';\nimport type { HttpTransport } from './http-transport';\nimport type { IContentTransport, PutBinaryRequest } from '@semiont/core';\n\nexport class HttpContentTransport implements IContentTransport {\n constructor(private readonly transport: HttpTransport) {}\n\n async putBinary(\n request: PutBinaryRequest,\n options?: { auth?: AccessToken },\n ): Promise<{ resourceId: ResourceId }> {\n const sizeBytes = request.file instanceof File ? request.file.size : request.file.length;\n busLog('PUT', 'content', {\n name: request.name,\n format: request.format,\n storageUri: request.storageUri,\n sizeBytes,\n });\n return withSpan(\n 'content.put',\n async () => {\n const formData = new FormData();\n formData.append('name', request.name);\n formData.append('format', request.format);\n formData.append('storageUri', request.storageUri);\n\n if (request.file instanceof File) {\n formData.append('file', request.file);\n } else if (Buffer.isBuffer(request.file)) {\n const blob = new Blob([new Uint8Array(request.file)], { type: request.format });\n formData.append('file', blob, request.name);\n } else {\n throw new Error('file must be a File or Buffer');\n }\n\n if (request.entityTypes && request.entityTypes.length > 0) {\n formData.append('entityTypes', JSON.stringify(request.entityTypes));\n }\n if (request.language) formData.append('language', request.language);\n if (request.creationMethod) formData.append('creationMethod', String(request.creationMethod));\n if (request.sourceAnnotationId) formData.append('sourceAnnotationId', String(request.sourceAnnotationId));\n if (request.sourceResourceId) formData.append('sourceResourceId', String(request.sourceResourceId));\n if (request.generationPrompt) formData.append('generationPrompt', request.generationPrompt);\n if (request.generator) formData.append('generator', JSON.stringify(request.generator));\n if (request.isDraft !== undefined) formData.append('isDraft', String(request.isDraft));\n\n const result = await this.transport.rawHttp\n .post(`${this.transport.baseUrl}/resources`, {\n body: formData,\n headers: this.requestHeaders(options?.auth),\n })\n .json<{ resourceId: string }>();\n\n return { resourceId: result.resourceId as ResourceId };\n },\n {\n kind: SpanKind.CLIENT,\n attrs: {\n 'content.format': request.format,\n 'content.size_bytes': sizeBytes,\n },\n },\n );\n }\n\n async getBinary(\n resourceId: ResourceId,\n options?: { accept?: ContentFormat | string; auth?: AccessToken },\n ): Promise<{ data: ArrayBuffer; contentType: string }> {\n busLog('GET', 'content', { resourceId, accept: options?.accept });\n return withSpan(\n 'content.get',\n async () => {\n const response = await this.transport.rawHttp.get(`${this.transport.baseUrl}/resources/${resourceId}`, {\n headers: {\n Accept: options?.accept ?? 'text/plain',\n ...this.requestHeaders(options?.auth),\n },\n });\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n const data = await response.arrayBuffer();\n return { data, contentType };\n },\n { kind: SpanKind.CLIENT, attrs: { 'resource.id': resourceId as unknown as string } },\n );\n }\n\n async getBinaryStream(\n resourceId: ResourceId,\n options?: { accept?: ContentFormat | string; auth?: AccessToken },\n ): Promise<{ stream: ReadableStream<Uint8Array>; contentType: string }> {\n busLog('GET', 'content', { resourceId, accept: options?.accept, stream: true });\n return withSpan(\n 'content.get',\n async () => {\n const response = await this.transport.rawHttp.get(`${this.transport.baseUrl}/resources/${resourceId}`, {\n headers: {\n Accept: options?.accept ?? 'text/plain',\n ...this.requestHeaders(options?.auth),\n },\n });\n const contentType = response.headers.get('content-type') || 'application/octet-stream';\n if (!response.body) {\n throw new Error('Response body is null - cannot create stream');\n }\n return { stream: response.body, contentType };\n },\n {\n kind: SpanKind.CLIENT,\n attrs: { 'resource.id': resourceId as unknown as string, 'content.stream': true },\n },\n );\n }\n\n dispose(): void {\n // HttpContentTransport has no resources of its own; HttpTransport owns\n // the ky instance and token subject. No-op is correct here.\n }\n\n /** Auth header + W3C trace propagation for the active span. */\n private requestHeaders(override?: AccessToken): Record<string, string> {\n const token = override ?? this.transport.getToken();\n const headers: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n const trace = getActiveTraceparent();\n if (trace) {\n headers['traceparent'] = trace.traceparent;\n if (trace.tracestate) headers['tracestate'] = trace.tracestate;\n }\n return headers;\n }\n}\n"]}
|