@agimon-ai/doompi-author 0.0.1-alpha.21 → 0.0.1-alpha.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","names":["routes","channelAuthorWebmcp","dockAuthoring","fileLinksAuthorDocument","leaderAuthorToggle","modeAuthor","slotPreviewAction","slotPreviewProvider","lifecycleStart","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../src/types/webAuthor.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorRuntime.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorBrowserBridge.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorGrid.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorWorkspaceStore.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/authorStore.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/author-webmcp.web.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorGridOverlay.tsx","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorCapture.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorRegionDrafts.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorRequestLog.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorToolPalette.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/authoring.web.tsx","../../src/types/authorPreview.ts","../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/types/authorApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorFiles.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorGridTools.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorProfiles.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorMedia.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorRegions.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorVideoControls.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorMediaView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorStructuredView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorTextView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorDocumentPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/file-links/author-document.web.ts","../../src/extensions/workspaces/sessions/(frontend)/leader/author-toggle.web.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorAnnotationPersistence.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/authorRequestLifecycle.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/authorBrowserLifecycle.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.web.ts","../../src/extensions/workspaces/sessions/(frontend)/mode/author/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/preview-action.web.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/preview-provider.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/describeAuthorToolsToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/DescribeAuthorToolsToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/describe-author-tools.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/OpenAuthoringFileToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/open-authoring-file.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/useAuthorToolsToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/UseAuthorToolsToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/use-author-tools.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { AuthorViewportCapabilityDescriptor } from './author';\n\nexport const authorChannelType = 'author_webmcp';\n\nexport interface AuthorRegisterMessage {\n kind: 'register';\n generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n kind: 'release';\n generation: number;\n}\nexport interface AuthorCatalogMessage {\n kind: 'catalog';\n generation: number;\n ownerToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n kind: 'result';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n kind: 'cancelled';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport type AuthorBrowserMessage =\n | AuthorRegisterMessage\n | AuthorReleaseMessage\n | AuthorCatalogMessage\n | AuthorResultMessage\n | AuthorCancelledMessage;\n\nexport interface AuthorAcceptedMessage {\n kind: 'accepted';\n generation: number;\n ownerToken: string;\n catalogToken?: string;\n leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n kind: 'request';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorCancelMessage {\n kind: 'cancel';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n kind: 'rejected';\n reason: string;\n}\n\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\n}\n","import type {\n ModelContext,\n ModelContextAbortSignal,\n ModelContextToolDescriptor,\n WebPluginRuntime,\n} from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorTrustedProfile, AuthorTrustedTool } from './authorViewportTypes';\n\nexport const AUTHOR_RUNTIME_BINDING_IDS = {\n text: 'author.viewport.text',\n media: 'author.viewport.media',\n} as const;\n\ninterface ActiveCatalog {\n generation: number;\n controller: AbortController;\n profiles: ReadonlyMap<string, AuthorTrustedProfile>;\n}\n\nfunction assertProfile(profile: AuthorTrustedProfile): void {\n if (profile.id.trim() === '') throw new Error('Author profile id must not be empty');\n if (profile.tools.length > 15) throw new Error('Author profiles may expose at most 15 tools');\n const names = new Set<string>();\n for (const tool of profile.tools) {\n if (!/^[a-z][a-z0-9_]{0,29}$/.test(tool.name)) throw new Error(`Invalid Author tool name: ${tool.name}`);\n if (names.has(tool.name)) throw new Error(`Duplicate Author tool name: ${tool.name}`);\n names.add(tool.name);\n }\n}\n\nfunction descriptorMatches(actual: ModelContextToolDescriptor, expected: AuthorTrustedTool): boolean {\n return (\n actual.name === expected.name &&\n actual.description === expected.description &&\n JSON.stringify(actual.inputSchema) === JSON.stringify(expected.inputSchema)\n );\n}\n\nfunction staleError(): Error {\n return new Error('Author viewport catalog is stale');\n}\n\nfunction invocationSignal(\n catalogSignal: AbortSignal,\n requestSignal: ModelContextAbortSignal,\n): { signal: AbortSignal; release: () => void } {\n const controller = new AbortController();\n const abortCatalog = (): void => controller.abort(catalogSignal.reason);\n const abortRequest = (): void => controller.abort(requestSignal.reason);\n if (catalogSignal.aborted) abortCatalog();\n else if (requestSignal.aborted) abortRequest();\n else {\n catalogSignal.addEventListener('abort', abortCatalog, { once: true });\n requestSignal.addEventListener('abort', abortRequest, { once: true });\n }\n return {\n signal: controller.signal,\n release: () => {\n catalogSignal.removeEventListener('abort', abortCatalog);\n requestSignal.removeEventListener('abort', abortRequest);\n },\n };\n}\n\n/** Owns page-lifetime WebMCP registrations. Profiles are replaced as one abortable catalog. */\nexport class AuthorRuntime {\n readonly #runtime: WebPluginRuntime;\n #context: ModelContext | undefined;\n #active: ActiveCatalog | undefined;\n #pending: ActiveCatalog | undefined;\n #generation = 0;\n #disposed = false;\n\n constructor(runtime: WebPluginRuntime) {\n this.#runtime = runtime;\n }\n\n async replaceProfiles(profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {\n if (this.#disposed) throw new Error('Author runtime is disposed');\n for (const profile of profiles) assertProfile(profile);\n const profileMap = new Map(profiles.map((profile) => [profile.id, profile]));\n const tools = profiles.flatMap((profile) => profile.tools);\n if (new Set(tools.map((tool) => tool.name)).size !== tools.length) {\n throw new Error('Author tool names must be unique across trusted profiles');\n }\n\n const context = this.#context ?? (await this.#runtime.acquireModelContext?.())?.modelContext;\n if (context === undefined) throw new Error('Model Context is unavailable');\n this.#context = context;\n const generation = ++this.#generation;\n const controller = new AbortController();\n const candidate: ActiveCatalog = { generation, controller, profiles: profileMap };\n const inactive = staleError();\n this.#pending?.controller.abort(inactive);\n this.#active?.controller.abort(inactive);\n this.#pending = candidate;\n this.#active = undefined;\n const assertCurrent = (): void => {\n if (controller.signal.aborted || this.#disposed || this.#active?.generation !== generation) throw staleError();\n };\n\n try {\n await Promise.all(\n tools.map(async (tool) =>\n context.registerTool(\n {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (input, options) => {\n assertCurrent();\n const parsed: unknown = JSON.parse(input);\n assertCurrent();\n const invocation = invocationSignal(controller.signal, options.signal);\n try {\n const result = await tool.execute(parsed, invocation.signal);\n assertCurrent();\n return result;\n } finally {\n invocation.release();\n }\n },\n },\n { signal: controller.signal },\n ),\n ),\n );\n const registered = await context.getTools();\n if (!tools.every((tool) => registered.some((descriptor) => descriptorMatches(descriptor, tool)))) {\n throw new Error('Model Context did not confirm the Author catalog');\n }\n if (this.#disposed || generation !== this.#generation || this.#pending !== candidate) throw staleError();\n this.#pending = undefined;\n this.#active = candidate;\n } catch (error) {\n controller.abort(error);\n if (this.#pending === candidate) this.#pending = undefined;\n throw error;\n }\n\n return () => {\n if (this.#active?.generation !== generation) return;\n controller.abort(staleError());\n this.#active = undefined;\n this.#generation += 1;\n };\n }\n\n async execute(name: string, input: unknown, signal: AbortSignal): Promise<unknown> {\n const context = this.#context;\n if (context === undefined || this.#active === undefined) throw new Error('Author catalog is not registered');\n return context.executeTool(name, JSON.stringify(input), { signal });\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#generation += 1;\n this.#pending?.controller.abort(new Error('Author runtime disposed'));\n this.#active?.controller.abort(new Error('Author runtime disposed'));\n this.#pending = undefined;\n this.#active = undefined;\n }\n}\n","import type { WebPluginRuntime } from '@agimon-ai/doompi-core/web';\nimport { Store } from '@tanstack/store';\n\nimport type { AuthorBrowserMessage, AuthorHubMessage } from '../../../../../types/webAuthor';\nimport { AuthorRuntime } from './authorRuntime';\nimport type { AuthorTrustedProfile } from './authorViewportTypes';\n\ninterface ActiveViewport {\n sessionId: string;\n generation: number;\n profiles: readonly AuthorTrustedProfile[];\n release: () => void;\n ownerToken?: string;\n catalogToken?: string;\n}\n\nclass AuthorBrowserBridge {\n readonly #host: WebPluginRuntime;\n readonly #runtime: AuthorRuntime;\n readonly #pending = new Map<string, AbortController>();\n #active: ActiveViewport | undefined;\n #generation = 0;\n #disposed = false;\n readonly #releaseConnected: () => void;\n #leaseTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(host: WebPluginRuntime) {\n this.#host = host;\n this.#runtime = new AuthorRuntime(host);\n this.#releaseConnected = host.onHubConnected(() => {\n if (this.#active !== undefined) {\n this.#active.ownerToken = undefined;\n this.#active.catalogToken = undefined;\n }\n this.#register();\n });\n }\n\n async focus(sessionId: string, profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {\n if (this.#disposed) throw new Error('Author browser bridge is disposed');\n const generation = ++this.#generation;\n const release = await this.#runtime.replaceProfiles(profiles);\n if (this.#disposed || generation !== this.#generation) {\n release();\n return () => undefined;\n }\n this.#clearActive();\n this.#active = { sessionId, generation, profiles, release };\n this.#register();\n return () => {\n if (this.#active?.generation !== generation) return;\n this.#clearActive();\n this.#generation += 1;\n };\n }\n\n drop(sessionId: string): void {\n if (this.#active?.sessionId !== sessionId) return;\n this.#clearActive();\n this.#generation += 1;\n }\n\n apply(sessionId: string, message: AuthorHubMessage): void {\n const active = this.#active;\n if (active === undefined || active.sessionId !== sessionId || message.kind === 'rejected') return;\n if (\n message.generation !== active.generation ||\n (message.ownerToken !== active.ownerToken && active.ownerToken !== undefined)\n )\n return;\n if (message.kind === 'accepted') {\n active.ownerToken = message.ownerToken;\n clearTimeout(this.#leaseTimer);\n this.#leaseTimer = setTimeout(() => this.#register(), Math.max(1000, Math.floor(message.leaseMs / 2)));\n if (message.catalogToken === undefined) this.#sendCatalog(active);\n else active.catalogToken = message.catalogToken;\n return;\n }\n if (message.catalogToken !== active.catalogToken) return;\n if (message.kind === 'cancel') {\n this.#pending.get(message.requestId)?.abort(new Error('Author tool request cancelled'));\n return;\n }\n if (message.kind !== 'request' || this.#pending.has(message.requestId)) return;\n const controller = new AbortController();\n this.#pending.set(message.requestId, controller);\n void this.#runtime\n .execute(message.name, message.arguments, controller.signal)\n .then((result) => {\n if (!this.#current(active, message.requestId, controller)) return;\n if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);\n else\n this.#send(active.sessionId, {\n kind: 'result',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId: message.requestId,\n result,\n });\n })\n .catch((error: unknown) => {\n if (!this.#current(active, message.requestId, controller)) return;\n if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);\n else {\n const messageText = error instanceof Error ? error.message : String(error);\n const code = /^([A-Z][A-Z_]+):/u.exec(messageText)?.[1] ?? 'AUTHOR_TOOL_ERROR';\n this.#send(active.sessionId, {\n kind: 'result',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId: message.requestId,\n result: { error: { code, message: messageText } },\n });\n }\n })\n .finally(() => {\n if (this.#pending.get(message.requestId) === controller) this.#pending.delete(message.requestId);\n });\n }\n\n activeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n const active = this.#active;\n return active?.sessionId === sessionId && active.catalogToken !== undefined\n ? {\n activation: 'active',\n capabilityCount: active.profiles.reduce((count, profile) => count + profile.tools.length, 0),\n }\n : { activation: 'inactive', capabilityCount: 0 };\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n clearTimeout(this.#leaseTimer);\n this.#releaseConnected();\n this.#clearActive();\n this.#runtime.dispose();\n }\n\n #register(): void {\n const active = this.#active;\n if (active !== undefined) this.#send(active.sessionId, { kind: 'register', generation: active.generation });\n }\n\n #sendCatalog(active: ActiveViewport): void {\n this.#send(active.sessionId, {\n kind: 'catalog',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n tools: active.profiles.flatMap((profile) =>\n profile.tools.map((tool) => ({\n name: tool.name,\n label: tool.label ?? tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n })),\n ),\n });\n }\n\n #sendCancelled(active: ActiveViewport, requestId: string): void {\n this.#send(active.sessionId, {\n kind: 'cancelled',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId,\n });\n }\n\n #send(sessionId: string, payload: AuthorBrowserMessage): void {\n const workspaceId = this.#host.mount?.scope === 'session' ? this.#host.mount.workspaceId : undefined;\n const mount = workspaceId ? { scope: 'workspace' as const, workspaceId } : { scope: 'global' as const };\n void this.#host\n .invokeServerMethod({ mount, service: 'author.bridge', method: 'send', input: { sessionId, message: payload } })\n .catch(() => undefined);\n }\n\n #current(active: ActiveViewport, requestId: string, controller: AbortController): boolean {\n return this.#active === active && this.#pending.get(requestId) === controller;\n }\n\n #clearActive(): void {\n clearTimeout(this.#leaseTimer);\n this.#leaseTimer = undefined;\n const active = this.#active;\n if (active !== undefined) {\n this.#send(active.sessionId, { kind: 'release', generation: active.generation });\n active.release();\n }\n this.#active = undefined;\n for (const controller of this.#pending.values()) controller.abort(new Error('Author viewport changed'));\n this.#pending.clear();\n }\n}\n\nconst authorBridgeRuntime = new Store<AuthorBrowserBridge | undefined>(undefined);\n\nexport function startAuthorBrowserBridge(runtime: WebPluginRuntime): () => void {\n authorBridgeRuntime.state?.dispose();\n const next = new AuthorBrowserBridge(runtime);\n authorBridgeRuntime.setState(() => next);\n return () => {\n if (authorBridgeRuntime.state !== next) return;\n next.dispose();\n authorBridgeRuntime.setState(() => undefined);\n };\n}\n\nexport async function focusAuthorViewport(\n sessionId: string,\n profiles: readonly AuthorTrustedProfile[],\n): Promise<() => void> {\n return (await authorBridgeRuntime.state?.focus(sessionId, profiles)) ?? (() => undefined);\n}\n\nexport function applyAuthorHubMessage(sessionId: string, message: AuthorHubMessage): void {\n authorBridgeRuntime.state?.apply(sessionId, message);\n}\n\nexport function dropAuthorViewportSession(sessionId: string): void {\n authorBridgeRuntime.state?.drop(sessionId);\n}\n\nexport function authorBridgeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n return authorBridgeRuntime.state?.activeView(sessionId) ?? { activation: 'inactive', capabilityCount: 0 };\n}\n","import { defineGlobalStore } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorNativeAnchor, AuthorVoiceGridEvidence, AuthorViewportSnapshot } from './authorViewportTypes';\n\nexport const AUTHOR_GRID_COLUMNS = 'ABCDEFGH' as const;\nexport const AUTHOR_GRID_SIZE = 8;\n\nexport interface AuthorGridGeometry {\n documentPath: string;\n revision: number;\n sourceSha256?: string;\n geometryToken: string;\n snapshotId: string;\n viewport: AuthorViewportSnapshot;\n updatedAt: number;\n}\n\ninterface AuthorGridState {\n sessions: Readonly<Record<string, AuthorGridGeometry>>;\n}\n\nexport interface AuthorGridCellResolution {\n cell: string;\n column: number;\n row: number;\n rect: { x: number; y: number; width: number; height: number };\n center: { x: number; y: number };\n evidence: AuthorVoiceGridEvidence;\n}\n\nexport interface AuthorGridNativeResolution {\n anchor: AuthorNativeAnchor;\n quote?: string;\n}\n\ntype AuthorGridNativeResolver = (\n cell: AuthorGridCellResolution,\n geometry: AuthorGridGeometry,\n) => AuthorGridNativeResolution | undefined;\n\nconst nativeResolvers = new Map<string, AuthorGridNativeResolver>();\n\nexport const authorGrid = defineGlobalStore<AuthorGridState>({ sessions: {} });\n\nexport function parseAuthorGridCell(cell: string): { cell: string; column: number; row: number } {\n const normalized = cell.trim().toUpperCase();\n if (!/^[A-H][1-8]$/u.test(normalized)) throw new Error(`Invalid Author grid cell '${cell}'. Expected A1 through H8.`);\n return {\n cell: normalized,\n column: AUTHOR_GRID_COLUMNS.indexOf(normalized[0] as (typeof AUTHOR_GRID_COLUMNS)[number]),\n row: Number(normalized[1]) - 1,\n };\n}\n\nexport function updateAuthorGridGeometry(\n sessionId: string,\n input: Omit<AuthorGridGeometry, 'geometryToken' | 'snapshotId' | 'updatedAt'>,\n): AuthorGridGeometry {\n const previous = authorGrid.store.state.sessions[sessionId];\n const geometry: AuthorGridGeometry = {\n ...input,\n geometryToken: crypto.randomUUID(),\n snapshotId:\n previous?.documentPath === input.documentPath &&\n previous.revision === input.revision &&\n previous.sourceSha256 === input.sourceSha256\n ? previous.snapshotId\n : crypto.randomUUID(),\n updatedAt: Date.now(),\n };\n authorGrid.update((state) => ({ ...state, sessions: { ...state.sessions, [sessionId]: geometry } }));\n return geometry;\n}\n\nexport function authorGridGeometry(sessionId: string): AuthorGridGeometry | undefined {\n return authorGrid.store.state.sessions[sessionId];\n}\n\nexport function clearAuthorGridGeometry(sessionId: string): void {\n authorGrid.update((state) => {\n if (state.sessions[sessionId] === undefined) return state;\n const sessions = { ...state.sessions };\n delete sessions[sessionId];\n return { ...state, sessions };\n });\n}\n\nexport function registerAuthorGridResolver(sessionId: string, resolver: AuthorGridNativeResolver): () => void {\n nativeResolvers.set(sessionId, resolver);\n return () => {\n if (nativeResolvers.get(sessionId) === resolver) nativeResolvers.delete(sessionId);\n };\n}\n\nexport function resolveAuthorGridNativeAnchor(\n sessionId: string,\n cell: AuthorGridCellResolution,\n): AuthorGridNativeResolution {\n const geometry = authorGridGeometry(sessionId);\n const resolved = geometry === undefined ? undefined : nativeResolvers.get(sessionId)?.(cell, geometry);\n if (resolved === undefined)\n throw new Error('AMBIGUOUS_GRID: The grid cell does not resolve to one visible native document target.');\n return resolved;\n}\n\nexport function resolveAuthorGridCell(\n sessionId: string,\n cell: string,\n expectedGeometryToken: string,\n): AuthorGridCellResolution {\n const geometry = authorGridGeometry(sessionId);\n if (geometry === undefined || geometry.geometryToken !== expectedGeometryToken) {\n throw new Error('STALE_GRID: The Author grid geometry changed. Describe the grid again.');\n }\n const parsed = parseAuthorGridCell(cell);\n const width = 1 / AUTHOR_GRID_SIZE;\n const height = 1 / AUTHOR_GRID_SIZE;\n const rect = { x: parsed.column * width, y: parsed.row * height, width, height };\n return {\n ...parsed,\n rect,\n center: { x: rect.x + width / 2, y: rect.y + height / 2 },\n evidence: { cell: parsed.cell, geometryToken: geometry.geometryToken, snapshotId: geometry.snapshotId },\n };\n}\n","import { defineGlobalStore } from '@agimon-ai/doompi-core/web';\n\nimport type {\n AuthorAnnotation,\n AuthorAnnotationCandidate,\n AuthorAnnotationDraft,\n AuthorCrop,\n AuthorDocumentInput,\n AuthorDraftRevision,\n AuthorFocusedDocument,\n AuthorRegionCandidate,\n AuthorRegionDraft,\n AuthorRequestRecord,\n AuthorRequestStatus,\n AuthorToolMode,\n} from './authorViewportTypes';\n\nexport const AUTHOR_REGION_LIMIT = 16;\nexport const AUTHOR_HISTORY_RECORD_LIMIT = 100;\nexport const AUTHOR_HISTORY_BYTE_LIMIT = 512 * 1024;\nconst TERMINAL_REQUEST_STATUSES: ReadonlySet<AuthorRequestStatus> = new Set(['COMPLETE', 'FAILED', 'CANCELLED']);\n\nexport interface AuthorWorkspaceDocument extends AuthorDocumentInput {\n path: string;\n annotations: readonly AuthorAnnotation[];\n revisions: readonly AuthorDraftRevision[];\n crop?: AuthorCrop;\n saveRequest: number;\n version: number;\n savedVersion: number;\n savingVersion?: number;\n}\n\nexport interface AuthorDocumentAnnotationCollection {\n revision: number;\n sourceSha256?: string;\n stale: boolean;\n candidate?: AuthorAnnotationCandidate;\n candidateText: string;\n annotations: readonly AuthorAnnotationDraft[];\n updatedAt: number;\n}\n\nexport interface AuthorSessionWorkspace {\n generation: number;\n focusedDocument?: AuthorFocusedDocument;\n activeTool: AuthorToolMode;\n annotationsByDocument: Readonly<Record<string, AuthorDocumentAnnotationCollection>>;\n /** Mixed annotations for the focused document. */\n annotations: readonly AuthorAnnotationDraft[];\n candidate?: AuthorRegionCandidate;\n candidateText: string;\n videoSeekRequest?: { path: string; generation: number; timeSeconds: number; sequence: number };\n /** Compatibility alias for annotations while region-only consumers migrate. */\n regions: readonly AuthorRegionDraft[];\n requests: readonly AuthorRequestRecord[];\n}\n\nexport interface AuthorWorkspaceState {\n documents: Readonly<Record<string, AuthorWorkspaceDocument>>;\n sessions: Readonly<Record<string, AuthorSessionWorkspace>>;\n}\n\nconst EMPTY_SESSION: AuthorSessionWorkspace = {\n generation: 0,\n activeTool: 'select',\n annotationsByDocument: {},\n annotations: [],\n candidateText: '',\n regions: [],\n requests: [],\n};\n\nexport function normalizeAuthorPath(path: string): string {\n const parts: string[] = [];\n for (const part of path.trim().replaceAll('\\\\', '/').split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function authorDocumentKey(sessionId: string, path: string): string {\n return `${sessionId}\\n${normalizeAuthorPath(path)}`;\n}\n\nexport const authorWorkspace = defineGlobalStore<AuthorWorkspaceState>({ documents: {}, sessions: {} });\n\nexport function authorDocument(sessionId: string | null, path: string): AuthorWorkspaceDocument | undefined {\n if (sessionId === null) return undefined;\n return authorWorkspace.store.state.documents[authorDocumentKey(sessionId, path)];\n}\n\nexport function authorSessionWorkspace(sessionId: string | null): AuthorSessionWorkspace {\n if (sessionId === null) return EMPTY_SESSION;\n return authorWorkspace.store.state.sessions[sessionId] ?? EMPTY_SESSION;\n}\n\nexport function authorDocumentAnnotations(\n sessionId: string | null,\n path: string,\n): AuthorDocumentAnnotationCollection | undefined {\n return sessionId === null\n ? undefined\n : authorWorkspace.store.state.sessions[sessionId]?.annotationsByDocument[normalizeAuthorPath(path)];\n}\n\nexport interface AuthorAnnotationHydrationRecord {\n sessionId: string;\n documentPath: string;\n collection: AuthorDocumentAnnotationCollection;\n}\n\nexport function hydrateAuthorAnnotationCollections(records: readonly AuthorAnnotationHydrationRecord[]): void {\n authorWorkspace.update((state) => {\n let sessions = state.sessions;\n for (const record of records) {\n const path = normalizeAuthorPath(record.documentPath);\n if (path === '') continue;\n const session = sessions[record.sessionId] ?? EMPTY_SESSION;\n const previous = session.annotationsByDocument[path];\n if (previous !== undefined && previous.updatedAt >= record.collection.updatedAt) continue;\n const document = state.documents[authorDocumentKey(record.sessionId, path)];\n const stale =\n record.collection.stale ||\n (document !== undefined &&\n (document.version !== record.collection.revision ||\n document.sourceSha256 !== record.collection.sourceSha256));\n const collection = restoreCollectionEvidence({ ...record.collection, stale });\n const focused = session.focusedDocument;\n const visible = focused?.path === path && !stale;\n const annotations = visible ? collection.annotations : session.annotations;\n sessions = {\n ...sessions,\n [record.sessionId]: {\n ...session,\n annotationsByDocument: { ...session.annotationsByDocument, [path]: collection },\n ...(visible\n ? {\n annotations,\n regions: annotations,\n candidate: collection.candidate,\n candidateText: collection.candidateText,\n }\n : {}),\n },\n };\n }\n return sessions === state.sessions ? state : { ...state, sessions };\n });\n}\n\nexport function putAuthorDocument(sessionId: string, input: AuthorDocumentInput): AuthorWorkspaceDocument {\n const path = normalizeAuthorPath(input.path);\n if (path === '') throw new Error('Author document path must not be empty');\n const key = authorDocumentKey(sessionId, path);\n const staleThumbnails: string[] = [];\n let result!: AuthorWorkspaceDocument;\n authorWorkspace.update((state) => {\n const previous = state.documents[key];\n const sourceChanged =\n previous?.sourceSha256 !== undefined &&\n input.sourceSha256 !== undefined &&\n previous.sourceSha256 !== input.sourceSha256;\n const baselineVersion = sourceChanged ? previous.version + 1 : (previous?.version ?? 0);\n result = {\n ...input,\n path,\n annotations: sourceChanged ? [] : (previous?.annotations ?? []),\n revisions: sourceChanged ? [] : (previous?.revisions ?? []),\n saveRequest: previous?.saveRequest ?? 0,\n version: baselineVersion,\n savedVersion: sourceChanged ? baselineVersion : (previous?.savedVersion ?? 0),\n ...(sourceChanged || previous?.crop === undefined ? {} : { crop: previous.crop }),\n };\n const session = state.sessions[sessionId];\n let sessions = state.sessions;\n if (sourceChanged && session?.focusedDocument?.path === path) {\n staleThumbnails.push(\n ...(session.candidate?.thumbnailUrl === undefined ? [] : [session.candidate.thumbnailUrl]),\n ...session.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n const now = Date.now();\n const generation = session.generation + 1;\n const staleCollection = staleAuthorCollection(session.annotationsByDocument[path], now);\n sessions = {\n ...sessions,\n [sessionId]: {\n ...session,\n generation,\n focusedDocument: {\n path,\n generation,\n revision: baselineVersion,\n sourceSha256: input.sourceSha256,\n focusedAt: now,\n },\n annotationsByDocument: {\n ...session.annotationsByDocument,\n ...(staleCollection && { [path]: staleCollection }),\n },\n annotations: [],\n regions: [],\n candidate: undefined,\n candidateText: '',\n requests: session.requests.map((request) =>\n input.kind !== 'story-preview' &&\n request.documentPath === path &&\n (request.status === 'REQUESTED' || request.status === 'CHANGING' || request.status === 'CHANGED')\n ? {\n ...request,\n status: 'FAILED',\n currentOperation: undefined,\n error: 'The document source changed before the request completed.',\n updatedAt: now,\n }\n : request,\n ),\n },\n };\n } else if (sourceChanged && session?.annotationsByDocument[path] !== undefined) {\n const collection = session.annotationsByDocument[path];\n if (collection.candidate?.thumbnailUrl !== undefined) staleThumbnails.push(collection.candidate.thumbnailUrl);\n staleThumbnails.push(\n ...collection.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n sessions = {\n ...sessions,\n [sessionId]: {\n ...session,\n annotationsByDocument: {\n ...session.annotationsByDocument,\n [path]: staleAuthorCollection(collection, Date.now())!,\n },\n },\n };\n }\n return { documents: { ...state.documents, [key]: result }, sessions };\n });\n staleThumbnails.forEach(revokeThumbnail);\n return result;\n}\n\n/** Claims focus and returns a generation token that makes cleanup race-safe. */\nexport function focusAuthorDocument(sessionId: string, path: string, revision: number, sourceSha256?: string): number {\n const normalized = normalizeAuthorPath(path);\n let generation = 0;\n authorWorkspace.update((state) => {\n const session = state.sessions[sessionId] ?? EMPTY_SESSION;\n generation = session.generation + 1;\n const stored = session.annotationsByDocument[normalized];\n const current =\n stored !== undefined && stored.revision === revision && stored.sourceSha256 === sourceSha256 && !stored.stale\n ? stored\n : undefined;\n const annotations = current?.annotations ?? [];\n return {\n ...state,\n sessions: {\n ...state.sessions,\n [sessionId]: {\n ...session,\n generation,\n focusedDocument: {\n path: normalized,\n generation,\n revision,\n sourceSha256,\n focusedAt: Date.now(),\n },\n annotations,\n regions: annotations,\n candidate: current?.candidate,\n candidateText: current?.candidateText ?? '',\n },\n },\n };\n });\n return generation;\n}\n\nexport function syncAuthorDocumentFocus(\n sessionId: string,\n generation: number,\n revision: number,\n sourceSha256?: string,\n): void {\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.generation !== generation) return session;\n if (focused.revision === revision && focused.sourceSha256 === sourceSha256) return session;\n return { ...session, focusedDocument: { ...focused, revision, sourceSha256 } };\n });\n}\n\nexport function releaseAuthorDocumentFocus(sessionId: string, generation: number): void {\n updateSession(sessionId, (session) => {\n if (session.focusedDocument?.generation !== generation) return session;\n return {\n ...session,\n focusedDocument: undefined,\n candidate: undefined,\n candidateText: '',\n annotations: [],\n regions: [],\n };\n });\n}\n\nexport function seekAuthorVideo(sessionId: string, timeSeconds: number): boolean {\n const workspace = authorSessionWorkspace(sessionId);\n const focused = workspace.focusedDocument;\n if (\n !focused ||\n workspace.candidate ||\n !Number.isFinite(timeSeconds) ||\n timeSeconds < 0 ||\n authorDocument(sessionId, focused.path)?.kind !== 'video'\n )\n return false;\n updateSession(sessionId, (session) => ({\n ...session,\n activeTool: 'select',\n videoSeekRequest: {\n path: focused.path,\n generation: focused.generation,\n timeSeconds,\n sequence: (session.videoSeekRequest?.sequence ?? 0) + 1,\n },\n }));\n return true;\n}\n\nexport function setAuthorToolMode(sessionId: string, activeTool: AuthorToolMode): void {\n updateSession(sessionId, (session) => (session.activeTool === activeTool ? session : { ...session, activeTool }));\n}\n\nexport function setAuthorRegionCandidate(sessionId: string, candidate: AuthorRegionCandidate | undefined): void {\n let staleThumbnail: string | undefined;\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (candidate !== undefined) {\n if (focused === undefined || focused.path !== normalizeAuthorPath(candidate.documentPath)) {\n throw new Error('The Author selection does not belong to the focused document.');\n }\n if (focused.revision !== candidate.revision || focused.sourceSha256 !== candidate.sourceSha256) {\n throw new Error('The Author selection is stale for the focused document.');\n }\n }\n if (focused === undefined) return session;\n staleThumbnail = session.candidate?.thumbnailUrl;\n const copied = candidate === undefined ? undefined : copyCandidate(candidate);\n return withFocusedCollection({ ...session, candidate: copied }, focused.path, { candidate: copied });\n });\n if (staleThumbnail !== undefined && staleThumbnail !== candidate?.thumbnailUrl) revokeThumbnail(staleThumbnail);\n}\n\nexport const setAuthorAnnotationCandidate = setAuthorRegionCandidate;\n\nexport function setAuthorCandidateText(sessionId: string, candidateText: string): void {\n if (new TextEncoder().encode(candidateText).byteLength > 2 * 1024)\n throw new Error('Author candidate text must not exceed 2 KiB.');\n updateSession(sessionId, (session) => {\n const path = session.focusedDocument?.path;\n return path === undefined ? session : withFocusedCollection({ ...session, candidateText }, path, { candidateText });\n });\n}\n\nexport function commitAuthorRegion(sessionId: string, comment: string): string {\n const id = crypto.randomUUID();\n const session = authorSessionWorkspace(sessionId);\n if (session.candidate === undefined) throw new Error('Select a document annotation before adding a comment.');\n addAuthorRegion(sessionId, { ...session.candidate, id, comment, version: 1 });\n updateSession(sessionId, (current) => {\n const path = current.focusedDocument?.path;\n return path === undefined\n ? current\n : withFocusedCollection({ ...current, candidate: undefined, candidateText: '' }, path, {\n candidate: undefined,\n candidateText: '',\n });\n });\n return id;\n}\n\nexport const commitAuthorAnnotation = commitAuthorRegion;\n\nexport function addAuthorRegion(sessionId: string, region: AuthorRegionDraft): void {\n if (region.comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.path !== normalizeAuthorPath(region.documentPath)) {\n throw new Error('The Author annotation does not belong to the focused document.');\n }\n if (focused.revision !== region.revision || focused.sourceSha256 !== region.sourceSha256) {\n throw new Error('The Author annotation is stale for the focused document.');\n }\n if (session.annotations.length >= AUTHOR_REGION_LIMIT)\n throw new Error(`Author requests support at most ${AUTHOR_REGION_LIMIT} annotations.`);\n if (session.annotations.some((candidate) => candidate.id === region.id))\n throw new Error(`Author annotation '${region.id}' already exists.`);\n const annotations = [...session.annotations, copyRegion({ ...region, version: region.version ?? 1 })];\n return withFocusedCollection({ ...session, annotations, regions: annotations }, focused.path, { annotations });\n });\n}\n\nexport const addAuthorAnnotationDraft = addAuthorRegion;\n\nexport function removeAuthorRegion(\n sessionId: string,\n regionId: string,\n expectedVersion?: number,\n documentPath?: string,\n): void {\n let thumbnail: string | undefined;\n updateSession(sessionId, (session) => {\n const path = documentPath === undefined ? session.focusedDocument?.path : normalizeAuthorPath(documentPath);\n if (path === undefined) return session;\n const focused = session.focusedDocument?.path === path;\n const collection = session.annotationsByDocument[path];\n const current = focused ? session.annotations : collection?.annotations;\n if (current === undefined) return session;\n const annotation = current.find((candidate) => candidate.id === regionId);\n if (annotation === undefined || (expectedVersion !== undefined && (annotation.version ?? 1) !== expectedVersion)) {\n return session;\n }\n thumbnail = annotation.thumbnailUrl;\n const annotations = current.filter((candidate) => candidate.id !== regionId);\n if (focused) return withFocusedCollection({ ...session, annotations, regions: annotations }, path, { annotations });\n return {\n ...session,\n annotationsByDocument: {\n ...session.annotationsByDocument,\n [path]: { ...collection, annotations, updatedAt: Date.now() },\n },\n };\n });\n if (thumbnail !== undefined) revokeThumbnail(thumbnail);\n}\n\nexport const removeAuthorAnnotation = removeAuthorRegion;\n\nexport function updateAuthorRegionComment(sessionId: string, regionId: string, comment: string): void {\n if (comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n updateSession(sessionId, (session) => {\n const path = session.focusedDocument?.path;\n if (path === undefined) return session;\n const annotations = session.annotations.map((annotation) =>\n annotation.id === regionId ? { ...annotation, comment, version: (annotation.version ?? 1) + 1 } : annotation,\n );\n return withFocusedCollection({ ...session, annotations, regions: annotations }, path, { annotations });\n });\n}\n\nexport const updateAuthorAnnotationComment = updateAuthorRegionComment;\n\nexport function putAuthorRequest(sessionId: string, record: AuthorRequestRecord): void {\n if (record.requestText.trim() === '') throw new Error('An Author request requires verbatim request text.');\n if (record.regions.length === 0 || record.regions.some((region) => region.comment.trim() === '')) {\n throw new Error('An Author request requires at least one commented region.');\n }\n updateSession(sessionId, (session) => {\n if (session.requests.some((request) => request.id === record.id))\n throw new Error(`Author request '${record.id}' already exists.`);\n return { ...session, requests: boundHistory([...session.requests, copyRequest(record)]) };\n });\n}\n\nexport function updateAuthorRequest(\n sessionId: string,\n requestId: string,\n update: (record: AuthorRequestRecord) => AuthorRequestRecord,\n): void {\n updateSession(sessionId, (session) => ({\n ...session,\n requests: boundHistory(\n session.requests.map((request) => (request.id === requestId ? copyRequest(update(request)) : request)),\n ),\n }));\n}\n\nexport function reviseAuthorDocument(sessionId: string, path: string, content: string): void {\n updateDocument(sessionId, path, (document) => {\n if (document.content === content) return document;\n const version = document.version + 1;\n return {\n ...document,\n content,\n version,\n revisions: [...document.revisions, { revision: version, content }],\n };\n });\n}\n\nexport function reviseAuthorFragment(sessionId: string, path: string, fragmentId: string, text: string): void {\n updateDocument(sessionId, path, (document) => {\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.text === text) return document;\n const version = document.version + 1;\n return {\n ...document,\n fragments: document.fragments?.map((fragment) => (fragment.id === fragmentId ? { ...fragment, text } : fragment)),\n version,\n revisions: [...document.revisions, { revision: version, content: text }],\n };\n });\n}\n\nexport function addAuthorAnnotation(sessionId: string, path: string, annotation: AuthorAnnotation): void {\n updateDocument(sessionId, path, (document) => ({ ...document, annotations: [...document.annotations, annotation] }));\n}\n\nexport function setAuthorCrop(sessionId: string, path: string, crop: AuthorCrop | undefined): void {\n updateDocument(sessionId, path, (document) => {\n const version = document.version + 1;\n return {\n ...document,\n ...(crop === undefined ? { crop: undefined } : { crop }),\n version,\n revisions: [...document.revisions, { revision: version, content: JSON.stringify(crop ?? null) }],\n };\n });\n}\n\nexport function requestAuthorSave(sessionId: string, path: string): void {\n updateDocument(sessionId, path, (document) => ({\n ...document,\n saveRequest: document.saveRequest + 1,\n savingVersion: document.version,\n }));\n}\n\nexport function failAuthorSave(sessionId: string, path: string, savingVersion: number): void {\n updateDocument(sessionId, path, (document) =>\n document.savingVersion === savingVersion ? { ...document, savingVersion: undefined } : document,\n );\n}\n\nexport function completeAuthorSave(\n sessionId: string,\n path: string,\n sourceSha256: string,\n savedVersion: number,\n savedFragments: AuthorDocumentInput['fragments'],\n): void {\n updateDocument(sessionId, path, (document) => {\n if (savedVersion < document.savedVersion) return document;\n return {\n ...document,\n sourceSha256,\n savedVersion,\n savingVersion: document.savingVersion === savedVersion ? undefined : document.savingVersion,\n originalFragments: savedFragments?.map((fragment) => ({ ...fragment })),\n ...(document.version === savedVersion ? { crop: undefined } : {}),\n revisions: document.revisions.filter((revision) => revision.revision > savedVersion),\n };\n });\n const now = Date.now();\n updateSession(sessionId, (session) => ({\n ...session,\n requests: boundHistory(\n session.requests.map((request) =>\n request.documentPath === normalizeAuthorPath(path) &&\n request.status === 'CHANGED' &&\n request.revision <= savedVersion\n ? { ...request, status: 'COMPLETE', currentOperation: undefined, updatedAt: now }\n : request,\n ),\n ),\n }));\n}\n\nexport function dropAuthorSession(sessionId: string): void {\n const prefix = `${sessionId}\\n`;\n const session = authorWorkspace.store.state.sessions[sessionId];\n for (const collection of Object.values(session?.annotationsByDocument ?? {})) {\n if (collection.candidate?.thumbnailUrl !== undefined) revokeThumbnail(collection.candidate.thumbnailUrl);\n collection.annotations.forEach((annotation) => {\n if (annotation.thumbnailUrl !== undefined) revokeThumbnail(annotation.thumbnailUrl);\n });\n }\n authorWorkspace.update((state) => {\n const sessions = { ...state.sessions };\n delete sessions[sessionId];\n return {\n documents: Object.fromEntries(Object.entries(state.documents).filter(([key]) => !key.startsWith(prefix))),\n sessions,\n };\n });\n}\n\nexport function setAuthorStoryPreview(\n sessionId: string,\n path: string,\n storyPreview: NonNullable<AuthorWorkspaceDocument['storyPreview']>,\n): void {\n updateDocument(sessionId, path, (document) => ({ ...document, storyPreview: structuredClone(storyPreview) }));\n}\n\nfunction updateDocument(\n sessionId: string,\n path: string,\n update: (document: AuthorWorkspaceDocument) => AuthorWorkspaceDocument,\n): void {\n const key = authorDocumentKey(sessionId, path);\n const staleThumbnails: string[] = [];\n authorWorkspace.update((state) => {\n const document = state.documents[key];\n if (document === undefined) return state;\n const next = update(document);\n const session = state.sessions[sessionId];\n const focused = session?.focusedDocument;\n const identityChanged =\n focused?.path === document.path &&\n (focused.revision !== next.version || focused.sourceSha256 !== next.sourceSha256);\n if (identityChanged) {\n staleThumbnails.push(\n ...(session.candidate?.thumbnailUrl === undefined ? [] : [session.candidate.thumbnailUrl]),\n ...session.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n }\n const staleCollection = identityChanged\n ? staleAuthorCollection(session.annotationsByDocument[document.path], Date.now())\n : undefined;\n const sessions = identityChanged\n ? {\n ...state.sessions,\n [sessionId]: {\n ...session,\n focusedDocument: { ...focused, revision: next.version, sourceSha256: next.sourceSha256 },\n annotationsByDocument: {\n ...session.annotationsByDocument,\n ...(staleCollection && { [document.path]: staleCollection }),\n },\n candidate: undefined,\n candidateText: '',\n annotations: [],\n regions: [],\n },\n }\n : state.sessions;\n return { documents: { ...state.documents, [key]: next }, sessions };\n });\n staleThumbnails.forEach(revokeThumbnail);\n}\n\nfunction updateSession(sessionId: string, update: (session: AuthorSessionWorkspace) => AuthorSessionWorkspace): void {\n authorWorkspace.update((state) => {\n const session = state.sessions[sessionId] ?? EMPTY_SESSION;\n const next = update(session);\n return next === session ? state : { ...state, sessions: { ...state.sessions, [sessionId]: next } };\n });\n}\n\nfunction copyCandidate<T extends AuthorAnnotationCandidate>(candidate: T): T {\n const anchor =\n 'rect' in candidate.anchor\n ? { ...candidate.anchor, rect: { ...candidate.anchor.rect } }\n : 'point' in candidate.anchor\n ? { ...candidate.anchor, point: { ...candidate.anchor.point } }\n : { ...candidate.anchor };\n return {\n ...candidate,\n anchor,\n viewport: { ...candidate.viewport },\n voiceGrid: candidate.voiceGrid && { ...candidate.voiceGrid },\n };\n}\n\nfunction copyRegion(region: AuthorRegionDraft): AuthorRegionDraft {\n return copyCandidate(region);\n}\n\nfunction staleAuthorCollection(\n collection: AuthorDocumentAnnotationCollection | undefined,\n updatedAt: number,\n): AuthorDocumentAnnotationCollection | undefined {\n if (collection === undefined) return undefined;\n return {\n ...collection,\n stale: true,\n candidate: collection.candidate && { ...copyCandidate(collection.candidate), thumbnailUrl: undefined },\n annotations: collection.annotations.map((annotation) => ({ ...copyRegion(annotation), thumbnailUrl: undefined })),\n updatedAt,\n };\n}\n\nfunction withFocusedCollection(\n session: AuthorSessionWorkspace,\n path: string,\n update: Partial<Pick<AuthorDocumentAnnotationCollection, 'annotations' | 'candidate' | 'candidateText'>>,\n): AuthorSessionWorkspace {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.path !== path) return session;\n const previous = session.annotationsByDocument[path];\n const collection: AuthorDocumentAnnotationCollection = {\n ...previous,\n revision: focused.revision,\n sourceSha256: focused.sourceSha256,\n stale: false,\n candidate: session.candidate,\n candidateText: session.candidateText,\n annotations: session.annotations,\n updatedAt: Date.now(),\n ...update,\n };\n return { ...session, annotationsByDocument: { ...session.annotationsByDocument, [path]: collection } };\n}\n\nfunction boundedHistoryText(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const encoder = new TextEncoder();\n if (encoder.encode(value).byteLength <= 16 * 1024) return value;\n let end = value.length;\n while (end > 0 && encoder.encode(value.slice(0, end)).byteLength > 16 * 1024) end -= 256;\n return value.slice(0, end);\n}\n\nfunction copyRequest(record: AuthorRequestRecord): AuthorRequestRecord {\n return {\n ...record,\n before: boundedHistoryText(record.before),\n after: boundedHistoryText(record.after),\n regions: record.regions.map(copyRegion),\n pendingRegions: record.pendingRegions?.map(copyRegion),\n };\n}\n\nfunction boundHistory(records: readonly AuthorRequestRecord[]): readonly AuthorRequestRecord[] {\n const next = [...records];\n const bytes = (): number => new TextEncoder().encode(JSON.stringify(next)).byteLength;\n while (next.length > AUTHOR_HISTORY_RECORD_LIMIT || bytes() > AUTHOR_HISTORY_BYTE_LIMIT) {\n const terminal = next.findIndex((record) => TERMINAL_REQUEST_STATUSES.has(record.status));\n if (terminal < 0) throw new Error('Author request history is full while active requests are still running.');\n next.splice(terminal, 1);\n }\n return next;\n}\n\nfunction restoreCollectionEvidence(collection: AuthorDocumentAnnotationCollection): AuthorDocumentAnnotationCollection {\n const restore = <T extends AuthorAnnotationCandidate>(item: T): T => {\n const copied = copyCandidate(item);\n const existingVersion: unknown = Reflect.get(copied, 'version');\n const versioned =\n 'id' in copied\n ? ({ ...copied, version: typeof existingVersion === 'number' ? existingVersion : 1 } as T)\n : copied;\n if (versioned.thumbnailUrl !== undefined || versioned.evidence === undefined) return versioned;\n try {\n return { ...versioned, thumbnailUrl: URL.createObjectURL(versioned.evidence) };\n } catch {\n return versioned;\n }\n };\n return {\n ...collection,\n candidate: collection.candidate && restore(collection.candidate),\n annotations: collection.annotations.map(restore),\n };\n}\n\nfunction revokeThumbnail(url: string): void {\n if (!url.startsWith('blob:')) return;\n try {\n URL.revokeObjectURL(url);\n } catch {\n // Thumbnail cleanup must not make session teardown fail.\n }\n}\n","import { defineSessionStore, type SessionChannelContribution } from '@agimon-ai/doompi-core/web';\n\nimport { authorChannelType, type AuthorHubMessage, type AuthorWebView } from '../../../../../../types/webAuthor';\nimport { applyAuthorHubMessage, authorBridgeView, dropAuthorViewportSession } from '../../_lib/authorBrowserBridge';\nimport { clearAuthorGridGeometry } from '../../_lib/authorGrid';\nimport { dropAuthorSession } from '../../_lib/authorWorkspaceStore';\n\nexport const author = defineSessionStore<AuthorWebView>({ activation: 'inactive', capabilityCount: 0 });\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseAuthorHubMessage(input: unknown): AuthorHubMessage | AuthorWebView | null {\n if (!isRecord(input)) return null;\n if (\n (input.activation === 'active' || input.activation === 'inactive') &&\n Number.isSafeInteger(input.capabilityCount) &&\n (input.capabilityCount as number) >= 0\n ) {\n return input as unknown as AuthorWebView;\n }\n if (typeof input.kind !== 'string') return null;\n if (input.kind === 'rejected')\n return typeof input.reason === 'string' ? (input as unknown as AuthorHubMessage) : null;\n if (!Number.isSafeInteger(input.generation) || typeof input.ownerToken !== 'string') return null;\n if (input.kind === 'accepted') {\n return typeof input.leaseMs === 'number' &&\n (input.catalogToken === undefined || typeof input.catalogToken === 'string')\n ? (input as unknown as AuthorHubMessage)\n : null;\n }\n if (\n (input.kind === 'request' || input.kind === 'cancel') &&\n typeof input.catalogToken === 'string' &&\n typeof input.requestId === 'string'\n ) {\n if (input.kind === 'cancel') return input as unknown as AuthorHubMessage;\n return typeof input.name === 'string' && isRecord(input.arguments) ? (input as unknown as AuthorHubMessage) : null;\n }\n return null;\n}\n\nexport const authorChannel: SessionChannelContribution<AuthorHubMessage | AuthorWebView> = {\n channel: authorChannelType,\n parse: parseAuthorHubMessage,\n apply(sessionId, message) {\n if ('activation' in message) {\n author.update(sessionId, () => message);\n return;\n }\n applyAuthorHubMessage(sessionId, message);\n author.update(sessionId, () => authorBridgeView(sessionId));\n },\n drop(sessionId) {\n clearAuthorGridGeometry(sessionId);\n dropAuthorViewportSession(sessionId);\n dropAuthorSession(sessionId);\n author.drop(sessionId);\n },\n};\n","import { defineChannelFile } from '@agimon-ai/doompi-core/web';\n\nimport { authorChannel } from './_lib/authorStore';\n\nexport default defineChannelFile({ ...authorChannel });\n","import { useEffect, useRef } from 'react';\n\nimport {\n AUTHOR_GRID_COLUMNS,\n AUTHOR_GRID_SIZE,\n clearAuthorGridGeometry,\n updateAuthorGridGeometry,\n} from '../_lib/authorGrid';\nimport type { AuthorWorkspaceDocument } from '../_lib/authorWorkspaceStore';\n\nexport function autonomousVoiceGridVisible(statuses: Readonly<Record<string, string>>): boolean {\n return statuses['doom-voice']?.trimStart().startsWith('voice auto:') === true;\n}\n\nexport function AuthorGridOverlay({\n sessionId,\n document,\n visible,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n visible: boolean;\n}) {\n const host = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const element = host.current?.parentElement;\n if (!visible || element === null || element === undefined) {\n clearAuthorGridGeometry(sessionId);\n return;\n }\n const publish = () => {\n const bounds = element.getBoundingClientRect();\n updateAuthorGridGeometry(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n viewport: {\n width: bounds.width,\n height: bounds.height,\n originX: bounds.left,\n originY: bounds.top,\n scrollX: element.scrollLeft,\n scrollY: element.scrollTop,\n zoom: window.devicePixelRatio,\n },\n });\n };\n publish();\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n element.addEventListener('scroll', publish, { passive: true, capture: true });\n window.addEventListener('focus', publish);\n return () => {\n observer.disconnect();\n element.removeEventListener('scroll', publish, true);\n window.removeEventListener('focus', publish);\n clearAuthorGridGeometry(sessionId);\n };\n }, [document.path, document.sourceSha256, document.version, sessionId, visible]);\n if (!visible) return null;\n return (\n <div\n ref={host}\n data-testid=\"author-grid\"\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-20 grid grid-cols-8 grid-rows-8\"\n >\n {Array.from({ length: AUTHOR_GRID_SIZE * AUTHOR_GRID_SIZE }, (_, index) => {\n const column = index % AUTHOR_GRID_SIZE;\n const row = Math.floor(index / AUTHOR_GRID_SIZE);\n return (\n <div key={index} className=\"relative border border-doom-red/25\">\n <span className=\"absolute left-1 top-0.5 rounded bg-doom-deep/80 px-1 text-2xs font-bold text-doom-red\">\n {AUTHOR_GRID_COLUMNS[column]}\n {row + 1}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ComposerCapture, WebPluginContextItem } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorCrop, AuthorNativeAnchor, AuthorRegionDraft } from './authorViewportTypes';\nimport type { AuthorWorkspaceDocument } from './authorWorkspaceStore';\n\nexport const AUTHOR_CAPTURE_MAX_DIMENSION = 1600;\nexport const AUTHOR_CAPTURE_MAX_BYTES = 2 * 1024 * 1024;\nexport const AUTHOR_PACKET_MAX_BYTES = 64 * 1024;\nexport const AUTHOR_COMMENT_MAX_BYTES = 2 * 1024;\nexport const AUTHOR_QUOTE_MAX_BYTES = 4 * 1024;\nexport const AUTHOR_REGION_COLORS = [\n '#ff5f57',\n '#00c2ff',\n '#ffd166',\n '#b388ff',\n '#4ade80',\n '#ff8c42',\n '#f472b6',\n '#2dd4bf',\n '#a3e635',\n '#60a5fa',\n '#e879f9',\n '#facc15',\n '#34d399',\n '#fb7185',\n '#818cf8',\n '#22d3ee',\n] as const;\n\nfunction annotationForeground(color: string): '#101216' | '#ffffff' {\n const red = Number.parseInt(color.slice(1, 3), 16);\n const green = Number.parseInt(color.slice(3, 5), 16);\n const blue = Number.parseInt(color.slice(5, 7), 16);\n return red * 299 + green * 587 + blue * 114 >= 150_000 ? '#101216' : '#ffffff';\n}\n\nexport interface AuthorCapturePacketRegion {\n id: string;\n ordinal: number;\n comment: string;\n version: number;\n mode: 'region' | 'point';\n quote?: string;\n anchor: AuthorNativeAnchor;\n viewport: AuthorRegionDraft['viewport'];\n voiceGrid?: AuthorRegionDraft['voiceGrid'];\n}\n\nexport interface AuthorCapturePacket {\n version: 1;\n captureId: string;\n capturedAt: number;\n document: {\n path: string;\n kind: AuthorWorkspaceDocument['kind'];\n revision: number;\n sourceSha256?: string;\n storyPreview?: AuthorWorkspaceDocument['storyPreview'];\n };\n regions: AuthorCapturePacketRegion[];\n}\n\nexport interface AuthorCaptureProvider {\n capture(signal?: AbortSignal): Promise<{ data: string; mimeType: 'image/png' | 'image/jpeg' }>;\n}\n\nconst bytes = (value: string): number => new TextEncoder().encode(value).byteLength;\n\nfunction utf8Prefix(value: string, limit: number): string {\n if (bytes(value) <= limit) return value;\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (bytes(value.slice(0, middle)) <= limit) low = middle;\n else high = middle - 1;\n }\n return value.slice(0, low);\n}\n\nexport function createAuthorCapturePacket(\n captureId: string,\n capturedAt: number,\n document: AuthorWorkspaceDocument,\n regions: readonly AuthorRegionDraft[],\n): AuthorCapturePacket {\n if (regions.length === 0 || regions.length > 16) throw new Error('Capture requires between 1 and 16 regions.');\n if (document.kind === 'story-preview' && document.storyPreview === undefined) {\n throw new Error('Story preview capture requires source provenance.');\n }\n const packet: AuthorCapturePacket = {\n version: 1,\n captureId,\n capturedAt,\n document: {\n path: document.path,\n kind: document.kind,\n revision: document.version,\n ...(document.sourceSha256 === undefined ? {} : { sourceSha256: document.sourceSha256 }),\n ...(document.storyPreview === undefined ? {} : { storyPreview: structuredClone(document.storyPreview) }),\n },\n regions: regions.map((region, index) => {\n if (\n region.documentPath !== document.path ||\n region.revision !== document.version ||\n region.sourceSha256 !== document.sourceSha256\n ) {\n throw new Error(`Region ${String(index + 1)} is stale for the focused document.`);\n }\n if (region.comment.trim() === '') throw new Error(`Region ${String(index + 1)} requires a comment.`);\n if (bytes(region.comment) > AUTHOR_COMMENT_MAX_BYTES) {\n throw new Error(`Region ${String(index + 1)} comment exceeds 2 KiB.`);\n }\n return {\n id: region.id,\n ordinal: index + 1,\n comment: region.comment,\n version: region.version ?? 1,\n mode: region.mode ?? ('point' in region.anchor ? 'point' : 'region'),\n ...(region.quote === undefined ? {} : { quote: utf8Prefix(region.quote, AUTHOR_QUOTE_MAX_BYTES) }),\n anchor: structuredClone(region.anchor),\n viewport: { ...region.viewport },\n ...(region.voiceGrid === undefined ? {} : { voiceGrid: { ...region.voiceGrid } }),\n };\n }),\n };\n if (bytes(JSON.stringify(packet)) > AUTHOR_PACKET_MAX_BYTES) throw new Error('Author capture packet exceeds 64 KiB.');\n return packet;\n}\n\nfunction percent(value: number): string {\n return `${String(Math.round(value * 1_000) / 10)}%`;\n}\n\nfunction rectLocation(rect: AuthorCrop): string {\n return `x ${percent(rect.x)}, y ${percent(rect.y)}, w ${percent(rect.width)}, h ${percent(rect.height)}`;\n}\n\nfunction anchorLocation(anchor: AuthorNativeAnchor): string {\n switch (anchor.kind) {\n case 'text-range':\n return anchor.startLine === anchor.endLine\n ? `line ${String(anchor.startLine)}`\n : `lines ${String(anchor.startLine)}-${String(anchor.endLine)}`;\n case 'cell':\n return `${anchor.sheet === undefined ? '' : `${anchor.sheet}!`}${anchor.location}`;\n case 'slide-element':\n return `slide ${String(anchor.slide)}: ${anchor.location}`;\n case 'image-rect':\n return `image ${rectLocation(anchor.rect)}`;\n case 'pdf-page-rect':\n return `page ${String(anchor.page)}, ${rectLocation(anchor.rect)}`;\n case 'video-time-rect':\n return `time ${anchor.timeSeconds.toFixed(3)}s${anchor.frame === undefined ? '' : `, frame ${String(anchor.frame)}`}, ${rectLocation(anchor.rect)}`;\n case 'story-preview-rect':\n return `story preview ${rectLocation(anchor.rect)}`;\n case 'image-point':\n return `image point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'pdf-page-point':\n return `page ${String(anchor.page)}, point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'video-time-point':\n return `time ${anchor.timeSeconds.toFixed(3)}s, point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'story-preview-point':\n return `story preview point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n }\n}\n\nfunction storyPreviewProvenance(packet: AuthorCapturePacket): string | undefined {\n const preview = packet.document.storyPreview;\n if (preview === undefined) return undefined;\n const sources = preview.sources.map((source) => `- ${source.path} (sha256 ${source.sha256})`).join('\\n');\n return [\n 'Story preview source (edit these sources, never the generated preview artifact):',\n `Project: ${preview.projectPath}`,\n `Story: ${preview.storyPath}#${preview.storyExport}`,\n `Build revision: ${preview.buildRevision}`,\n `Viewport: ${String(preview.viewport.width)}x${String(preview.viewport.height)}`,\n 'Sources:',\n sources,\n 'After editing the underlying story or component source, rebuild the preview before treating it as visually verified.',\n ].join('\\n');\n}\n\nexport function authorCaptureContext(packet: AuthorCapturePacket): WebPluginContextItem {\n const metadata = JSON.stringify(packet);\n if (bytes(metadata) > AUTHOR_PACKET_MAX_BYTES) throw new Error('Author capture packet exceeds 64 KiB.');\n const annotations = packet.regions\n .map(\n (region) =>\n `(${String(region.ordinal)}) ${region.comment} [${anchorLocation(region.anchor)}]${region.quote ? `\\nQuoted text: ${region.quote}` : ''}`,\n )\n .join('\\n\\n');\n const provenance = storyPreviewProvenance(packet);\n const content = provenance === undefined ? annotations : `${provenance}\\n\\nAnnotations:\\n${annotations}`;\n return {\n kind: 'author-capture',\n source: 'author',\n id: packet.captureId,\n label: `${packet.regions.length} annotation${packet.regions.length === 1 ? '' : 's'} · ${packet.document.path}`,\n content,\n metadata,\n };\n}\n\nfunction canvasBlob(canvas: HTMLCanvasElement, type: 'image/png' | 'image/jpeg', quality?: number): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob === null ? reject(new Error('Unable to capture viewport')) : resolve(blob)),\n type,\n quality,\n );\n });\n}\n\nasync function base64(blob: Blob): Promise<string> {\n const bytes = new Uint8Array(await blob.arrayBuffer());\n let binary = '';\n for (let offset = 0; offset < bytes.length; offset += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n }\n return btoa(binary);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted === true) throw signal.reason;\n}\n\nasync function boundedCanvasCapture(\n canvas: HTMLCanvasElement,\n): Promise<{ data: string; mimeType: 'image/png' | 'image/jpeg' }> {\n let mimeType: 'image/png' | 'image/jpeg' = 'image/png';\n let blob = await canvasBlob(canvas, mimeType);\n for (const quality of [0.9, 0.75, 0.6, 0.45, 0.3]) {\n if (blob.size <= AUTHOR_CAPTURE_MAX_BYTES) break;\n mimeType = 'image/jpeg';\n blob = await canvasBlob(canvas, mimeType, quality);\n }\n if (blob.size > AUTHOR_CAPTURE_MAX_BYTES) throw new Error('Viewport capture exceeds 2 MiB');\n return { data: await base64(blob), mimeType };\n}\n\nexport function imageCaptureProvider(image: HTMLImageElement, crop?: AuthorCrop): AuthorCaptureProvider {\n return {\n async capture(signal) {\n throwIfAborted(signal);\n const normalized = crop ?? { x: 0, y: 0, width: 1, height: 1 };\n const source = {\n x: normalized.x * image.naturalWidth,\n y: normalized.y * image.naturalHeight,\n width: normalized.width * image.naturalWidth,\n height: normalized.height * image.naturalHeight,\n };\n if (source.width <= 0 || source.height <= 0) throw new Error('Image is not ready to capture');\n const scale = Math.min(1, AUTHOR_CAPTURE_MAX_DIMENSION / Math.max(source.width, source.height));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(source.width * scale));\n canvas.height = Math.max(1, Math.round(source.height * scale));\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable');\n context.drawImage(image, source.x, source.y, source.width, source.height, 0, 0, canvas.width, canvas.height);\n const capture = await boundedCanvasCapture(canvas);\n throwIfAborted(signal);\n return capture;\n },\n };\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('Unable to load a region capture.'));\n image.src = url;\n });\n}\n\nexport function multiRegionCaptureProvider(regions: readonly AuthorRegionDraft[]): AuthorCaptureProvider {\n return {\n async capture(signal) {\n throwIfAborted(signal);\n if (regions.length === 0 || regions.length > 16) throw new Error('Capture requires between 1 and 16 regions.');\n const tiles = [];\n for (const region of regions) {\n const image = region.thumbnailUrl === undefined ? undefined : await loadImage(region.thumbnailUrl);\n throwIfAborted(signal);\n const width = image?.naturalWidth ?? region.viewport.width;\n const height = image?.naturalHeight ?? region.viewport.height;\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new Error('Image is not ready to capture');\n }\n tiles.push({ region, image, width, height });\n }\n const width = Math.min(AUTHOR_CAPTURE_MAX_DIMENSION, Math.max(...tiles.map((tile) => tile.width)));\n const naturalHeight = tiles.reduce((height, tile) => height + (tile.height * width) / tile.width, 0);\n const scale = Math.min(1, AUTHOR_CAPTURE_MAX_DIMENSION / Math.max(width, naturalHeight));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width * scale));\n canvas.height = Math.max(1, Math.round(naturalHeight * scale));\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable');\n context.scale(scale, scale);\n context.fillStyle = '#101216';\n context.fillRect(0, 0, width, naturalHeight);\n let y = 0;\n for (const [index, { region, image, width: sourceWidth, height: sourceHeight }] of tiles.entries()) {\n const annotationColor = AUTHOR_REGION_COLORS[index % AUTHOR_REGION_COLORS.length]!;\n throwIfAborted(signal);\n const tileHeight = (sourceHeight * width) / sourceWidth;\n const drawWidth = width;\n const drawHeight = tileHeight;\n const drawX = 0;\n const drawY = y;\n let labelX = drawX;\n let labelY = drawY;\n if (image !== undefined) {\n context.drawImage(image, drawX, drawY, drawWidth, drawHeight);\n if ('rect' in region.anchor) {\n const rect = region.anchor.rect;\n const rx = drawX + rect.x * drawWidth;\n const ry = drawY + rect.y * drawHeight;\n const rw = rect.width * drawWidth;\n const rh = rect.height * drawHeight;\n context.fillStyle = 'rgba(8,10,13,0.62)';\n context.fillRect(drawX, drawY, drawWidth, Math.max(0, ry - drawY));\n context.fillRect(drawX, ry + rh, drawWidth, Math.max(0, drawY + drawHeight - ry - rh));\n context.fillRect(drawX, ry, Math.max(0, rx - drawX), rh);\n context.fillRect(rx + rw, ry, Math.max(0, drawX + drawWidth - rx - rw), rh);\n context.strokeStyle = annotationColor;\n context.lineWidth = 3;\n context.strokeRect(rx, ry, rw, rh);\n labelX = rx;\n labelY = ry;\n } else if ('point' in region.anchor) {\n const px = drawX + region.anchor.point.x * drawWidth;\n const py = drawY + region.anchor.point.y * drawHeight;\n const radius = Math.max(6, Math.min(14, Math.min(drawWidth, drawHeight) / 12));\n context.beginPath();\n context.arc(px, py, radius, 0, Math.PI * 2);\n context.fillStyle = annotationColor;\n context.fill();\n context.strokeStyle = annotationForeground(annotationColor);\n context.lineWidth = 2;\n context.stroke();\n labelX = px + radius;\n labelY = py - radius;\n }\n }\n // Keep ordinals readable after downscaling, but never larger than their image.\n const ordinal = String(index + 1);\n let badgeScale = Math.min(1 / scale, drawHeight / 36);\n context.font = `bold ${String(24 * badgeScale)}px monospace`;\n const measuredWidth = context.measureText(ordinal).width + 12 * badgeScale;\n if (measuredWidth > drawWidth) badgeScale *= drawWidth / measuredWidth;\n context.font = `bold ${String(24 * badgeScale)}px monospace`;\n context.textBaseline = 'top';\n const padding = 6 * badgeScale;\n const labelWidth = Math.min(drawWidth, context.measureText(ordinal).width + padding * 2);\n const labelHeight = 36 * badgeScale;\n labelX = Math.max(drawX, Math.min(labelX, drawX + drawWidth - labelWidth));\n labelY = Math.max(drawY, Math.min(labelY, drawY + drawHeight - labelHeight));\n context.fillStyle = annotationColor;\n context.fillRect(labelX, labelY, labelWidth, labelHeight);\n context.fillStyle = annotationForeground(annotationColor);\n context.fillText(ordinal, labelX + padding, labelY + padding);\n y += tileHeight;\n }\n throwIfAborted(signal);\n return boundedCanvasCapture(canvas);\n },\n };\n}\n\nexport async function attachAuthorCapture(\n provider: AuthorCaptureProvider,\n context: WebPluginContextItem,\n attach: (capture: ComposerCapture) => void,\n signal?: AbortSignal,\n): Promise<void> {\n const capture = await provider.capture(signal);\n throwIfAborted(signal);\n attach({ ...capture, context });\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nimport type { AuthorSessionWorkspace } from '../../_lib/authorWorkspaceStore';\nimport {\n commitAuthorRegion,\n removeAuthorRegion,\n seekAuthorVideo,\n setAuthorCandidateText,\n setAuthorRegionCandidate,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string; workspace: AuthorSessionWorkspace }) {\n const [error, setError] = useState<string>();\n const add = () => {\n try {\n commitAuthorRegion(sessionId, workspace.candidateText);\n setError(undefined);\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n };\n if (!workspace.candidate && workspace.annotations.length === 0) return null;\n const candidateKind = workspace.candidate?.mode === 'point' ? 'point' : 'region';\n return (\n <section className=\"space-y-2\" data-testid=\"author-region-drafts\">\n {workspace.candidate ? (\n <>\n <h3 className=\"text-base font-semibold text-doom-text\">Current {candidateKind}</h3>\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Add feedback to keep this {candidateKind} as an unsent annotation.\n </p>\n {workspace.candidate.anchor.kind === 'video-time-rect' ||\n workspace.candidate.anchor.kind === 'video-time-point' ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Frame at {workspace.candidate.anchor.timeSeconds.toFixed(3)}s\n </p>\n ) : null}\n <textarea\n aria-label=\"Annotation comment\"\n value={workspace.candidateText}\n onChange={(event) => setAuthorCandidateText(sessionId, event.target.value)}\n placeholder=\"What should change here?\"\n rows={3}\n className=\"min-h-11 w-full resize-y rounded border border-doom-border bg-doom-deep p-2 text-lg leading-normal text-doom-text focus:border-doom-red focus:outline-none sm:text-sm\"\n />\n <Button\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"outline\"\n onClick={add}\n disabled={!workspace.candidate || !workspace.candidateText.trim() || workspace.annotations.length >= 16}\n >\n add annotation\n </Button>\n <Button\n variant=\"ghost\"\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n onClick={() => {\n setAuthorRegionCandidate(sessionId, undefined);\n setAuthorCandidateText(sessionId, '');\n setError(undefined);\n }}\n >\n Discard annotation\n </Button>\n </>\n ) : null}\n {error ? <output className=\"block text-base text-doom-red\">{error}</output> : null}\n {workspace.annotations.length > 0 ? (\n <h3 className=\"text-base font-semibold text-doom-text\">Unsent annotations ({workspace.annotations.length})</h3>\n ) : null}\n <ol className=\"space-y-2\">\n {workspace.annotations.map((region, index) => (\n <li\n key={region.id}\n className=\"rounded border border-doom-border bg-doom-panel p-2 text-base leading-normal text-doom-text sm:text-sm\"\n >\n <span>\n ({index + 1}) {region.mode === 'point' ? 'Point' : 'Region'}: {region.comment}\n </span>\n {region.anchor.kind === 'video-time-rect' || region.anchor.kind === 'video-time-point' ? (\n <Button\n variant=\"outline\"\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n disabled={workspace.candidate !== undefined}\n onClick={() => {\n if (region.anchor.kind === 'video-time-rect' || region.anchor.kind === 'video-time-point') {\n seekAuthorVideo(sessionId, region.anchor.timeSeconds);\n }\n }}\n >\n Go to {region.anchor.timeSeconds.toFixed(3)}s\n </Button>\n ) : null}\n <Button\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"ghost\"\n aria-label={`Remove annotation ${index + 1}`}\n onClick={() => removeAuthorRegion(sessionId, region.id)}\n >\n remove\n </Button>\n </li>\n ))}\n </ol>\n </section>\n );\n}\n","import type { AuthorNativeAnchor, AuthorRequestRecord } from '../../_lib/authorViewportTypes';\n\nconst STATUS_LABELS: Record<AuthorRequestRecord['status'], string> = {\n REQUESTED: 'Request queued',\n CHANGING: 'Agent working',\n CHANGED: 'Change ready',\n COMPLETE: 'Request completed',\n FAILED: 'Request failed',\n CANCELLED: 'Request cancelled',\n};\n\nconst STATUS_STYLES: Record<AuthorRequestRecord['status'], string> = {\n REQUESTED: 'border-doom-yellow/35 bg-doom-yellow/5 text-doom-yellow',\n CHANGING: 'border-doom-magenta/45 bg-doom-magenta/10 text-doom-yellow',\n CHANGED: 'border-doom-cyan/40 bg-doom-cyan/5 text-doom-cyan',\n COMPLETE: 'border-doom-green/40 bg-doom-green/5 text-doom-green',\n FAILED: 'border-doom-red/45 bg-doom-red/10 text-doom-red',\n CANCELLED: 'border-doom-border bg-doom-panel text-doom-dim',\n};\n\nfunction requestInstruction(requestText: string): string {\n const referencedContext = requestText.search(/(?:^|\\s+)Referenced context \"/u);\n return requestText\n .slice(0, referencedContext < 0 ? undefined : referencedContext)\n .replace(/^Please address the attached feedback\\.\\s*Request ID: \\S+\\s*/u, '')\n .trim();\n}\n\nfunction documentName(path: string): string {\n return path.replaceAll('\\\\', '/').split('/').at(-1) || path;\n}\n\nfunction anchorLabel(anchor: AuthorNativeAnchor): string {\n switch (anchor.kind) {\n case 'text-range':\n return anchor.startLine === anchor.endLine\n ? `Line ${anchor.startLine}`\n : `Lines ${anchor.startLine}–${anchor.endLine}`;\n case 'cell':\n return [anchor.sheet, anchor.location].filter(Boolean).join(' · ');\n case 'slide-element':\n return `Slide ${anchor.slide} · ${anchor.location}`;\n case 'image-rect':\n return 'Image region';\n case 'pdf-page-rect':\n return `Page ${anchor.page}`;\n case 'video-time-rect': {\n const minutes = Math.floor(anchor.timeSeconds / 60);\n const seconds = Math.floor(anchor.timeSeconds % 60)\n .toString()\n .padStart(2, '0');\n return `Video ${minutes}:${seconds}`;\n }\n case 'story-preview-rect':\n return `${anchor.preview.storyPath}#${anchor.preview.storyExport}`;\n case 'image-point':\n return 'Image point';\n case 'pdf-page-point':\n return `Page ${anchor.page} point`;\n case 'video-time-point': {\n const minutes = Math.floor(anchor.timeSeconds / 60);\n const seconds = Math.floor(anchor.timeSeconds % 60)\n .toString()\n .padStart(2, '0');\n return `Video ${minutes}:${seconds} point`;\n }\n case 'story-preview-point':\n return `${anchor.preview.storyPath}#${anchor.preview.storyExport} point`;\n }\n}\n\nfunction progressLabel(request: AuthorRequestRecord): string {\n const total = request.regions.length;\n const pending = request.pendingRegions?.length;\n if (request.status === 'CHANGING' && request.currentOperation === 'Agent is working on this request')\n return 'Processing request';\n if (request.status === 'CHANGING' && pending !== undefined)\n return `${total - pending} of ${total} annotations applied`;\n if (request.status === 'CHANGED') return 'Changes applied · awaiting save';\n if (request.status === 'COMPLETE') return 'Agent finished processing this request';\n if (request.status === 'FAILED') return 'Stopped with an error';\n if (request.status === 'CANCELLED') return 'Stopped before completion';\n return `${total} annotation${total === 1 ? '' : 's'} queued`;\n}\n\nfunction RequestRecord({ request, prominent = false }: { request: AuthorRequestRecord; prominent?: boolean }) {\n const instruction = requestInstruction(request.requestText);\n return (\n <article data-testid={prominent ? 'author-active-request' : undefined} className=\"space-y-3\">\n <header className=\"border-b border-doom-border-soft pb-3\">\n <p className=\"text-2xs font-bold tracking-widest text-doom-faint\">DOCUMENT CONTEXT</p>\n <p className=\"mt-2 flex items-center gap-2 truncate text-base font-bold text-doom-hi\">\n <span aria-hidden className=\"text-doom-magenta\">\n ↗\n </span>\n {documentName(request.documentPath)}\n </p>\n </header>\n\n <section aria-label=\"Request locations\" className=\"rounded border border-doom-border bg-doom-panel p-3\">\n <ol className=\"space-y-3\">\n {request.regions.map((region, index) => (\n <li key={region.id} className=\"space-y-2\">\n <p className=\"font-mono text-2xs font-bold uppercase tracking-wider text-doom-yellow\">\n WHERE · {request.regions.length > 1 ? `${index + 1} · ` : ''}\n {documentName(request.documentPath)} / {anchorLabel(region.anchor)} · rev {request.revision}\n </p>\n {region.quote ? (\n <blockquote className=\"line-clamp-3 text-sm italic leading-relaxed text-doom-text\">\n “{region.quote}”\n </blockquote>\n ) : null}\n <p className=\"text-xs leading-relaxed text-doom-dim\">{region.comment}</p>\n </li>\n ))}\n </ol>\n </section>\n\n <section\n data-testid={prominent ? 'author-operation-card' : undefined}\n className={`rounded border p-3 ${STATUS_STYLES[request.status]}`}\n >\n <p className=\"font-mono text-xs font-bold tracking-wider\">\n ●{' '}\n {request.status === 'CHANGING'\n ? 'WORKING'\n : request.status === 'COMPLETE'\n ? 'COMPLETED'\n : request.status === 'FAILED'\n ? 'ERROR'\n : request.status}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-doom-hi\">\n {request.currentOperation || STATUS_LABELS[request.status]}\n </p>\n {request.error ? <p className=\"mt-2 text-xs leading-relaxed text-doom-red\">{request.error}</p> : null}\n {request.before !== undefined || request.after !== undefined ? (\n <details className=\"mt-2 border-t border-current/20 pt-2 text-xs text-doom-dim\">\n <summary className=\"cursor-pointer select-none\">change preview</summary>\n {request.before !== undefined ? (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n before: {request.before}\n </pre>\n ) : null}\n {request.after !== undefined ? (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n after: {request.after}\n </pre>\n ) : null}\n </details>\n ) : null}\n </section>\n\n <section className=\"space-y-2\">\n <p className=\"text-2xs font-bold tracking-widest text-doom-faint\">REQUEST · HOW TO CHANGE</p>\n <div className=\"rounded border border-doom-border bg-doom-deep p-3\">\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed text-doom-text\">\n {instruction || 'No additional instruction.'}\n </p>\n </div>\n </section>\n\n <footer className=\"font-mono text-2xs text-doom-dim\">{progressLabel(request)}</footer>\n </article>\n );\n}\n\nexport function AuthorRequestLog({ requests }: { requests: readonly AuthorRequestRecord[] }) {\n const latest = requests.at(-1);\n const earlier = requests.slice(0, -1).reverse();\n return (\n <section data-testid=\"author-request-history\" className=\"space-y-3\">\n <h3 className=\"text-2xs font-bold tracking-widest text-doom-faint\">AUTHORING</h3>\n {latest === undefined ? (\n <p className=\"text-sm leading-relaxed text-doom-dim\">No requests or changes yet.</p>\n ) : (\n <RequestRecord request={latest} prominent />\n )}\n {earlier.length > 0 ? (\n <details className=\"border-t border-doom-border-soft pt-3\" data-testid=\"author-earlier-requests\">\n <summary className=\"cursor-pointer select-none text-2xs font-bold tracking-wider text-doom-faint\">\n EARLIER REQUESTS ({earlier.length})\n </summary>\n <ol className=\"mt-3 space-y-5\">\n {earlier.map((request) => (\n <li key={request.id}>\n <RequestRecord request={request} />\n </li>\n ))}\n </ol>\n </details>\n ) : null}\n </section>\n );\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nimport type { AuthorDocumentKind, AuthorToolMode } from '../../_lib/authorViewportTypes';\nimport {\n authorDocument,\n authorSessionWorkspace,\n reviseAuthorDocument,\n setAuthorRegionCandidate,\n setAuthorToolMode,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorToolPalette({\n sessionId,\n kind,\n activeTool,\n}: {\n sessionId: string;\n kind: AuthorDocumentKind;\n activeTool: AuthorToolMode;\n}) {\n const [error, setError] = useState<string>();\n const format = (style: 'Bold' | 'Heading' | 'Link' | 'List') => {\n const session = authorSessionWorkspace(sessionId);\n const selected = session.candidate;\n const document = selected && authorDocument(sessionId, selected.documentPath);\n if (\n !selected ||\n !document ||\n selected.anchor.kind !== 'text-range' ||\n selected.revision !== document.version ||\n selected.sourceSha256 !== document.sourceSha256\n ) {\n setError('Select text in the document first.');\n return;\n }\n const { startOffset, endOffset } = selected.anchor;\n const content = document.content ?? '';\n const text = content.slice(startOffset, endOffset);\n const replacement =\n style === 'Bold'\n ? `**${text}**`\n : style === 'Link'\n ? `[${text}](https://)`\n : text\n .split('\\n')\n .map((line) => `${style === 'Heading' ? '## ' : '- '}${line}`)\n .join('\\n');\n reviseAuthorDocument(\n sessionId,\n document.path,\n content.slice(0, startOffset) + replacement + content.slice(endOffset),\n );\n setAuthorRegionCandidate(sessionId, undefined);\n setError(undefined);\n };\n const tools = [\n {\n label: 'Region',\n glyph: '⌗',\n action: () => setAuthorToolMode(sessionId, activeTool === 'mark' ? 'select' : 'mark'),\n active: activeTool === 'mark',\n },\n ...(kind === 'markdown'\n ? [\n { label: 'Bold', glyph: 'B', action: () => format('Bold') },\n { label: 'Heading', glyph: 'H', action: () => format('Heading') },\n { label: 'Link', glyph: '↗', action: () => format('Link') },\n { label: 'List', glyph: '≡', action: () => format('List') },\n ]\n : []),\n {\n label: 'Comment',\n glyph: '●',\n action: () => setAuthorToolMode(sessionId, activeTool === 'comment' ? 'select' : 'comment'),\n active: activeTool === 'comment',\n },\n ];\n return (\n <section data-testid=\"author-tool-palette\" className=\"space-y-2 border-b border-doom-border-soft pb-3\">\n <div className=\"flex justify-between text-sm text-doom-dim\">\n <h3 className=\"font-bold tracking-widest\">TOOLS</h3>\n <span>focused tab</span>\n </div>\n <div className=\"grid grid-cols-3 gap-1.5\">\n {tools.map((tool) => (\n <Button\n key={tool.label}\n size=\"md\"\n variant=\"outline\"\n aria-label={tool.label === 'Region' ? 'mark region' : tool.label}\n aria-pressed={tool.active}\n onClick={tool.action}\n className={`min-h-11 min-w-11 gap-1.5 rounded border text-base [@media(pointer:fine)]:min-h-8 sm:text-sm ${tool.active ? 'border-doom-red bg-doom-red/10 text-doom-red hover:bg-doom-red/15' : 'border-doom-border bg-doom-panel text-doom-dim'}`}\n >\n <span aria-hidden=\"true\">{tool.glyph}</span>\n {tool.label}\n </Button>\n ))}\n </div>\n <p className=\"text-base leading-normal text-doom-dim sm:text-sm\">\n {activeTool === 'mark'\n ? 'Drag over the document to mark a region.'\n : activeTool === 'comment'\n ? 'Click the document to place a comment pin.'\n : 'Choose Region to drag an area, or Comment to place a point.'}\n </p>\n {error ? <output className=\"block text-base text-doom-red\">{error}</output> : null}\n </section>\n );\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useState } from 'react';\n\nimport { autonomousVoiceGridVisible } from '../../_components/AuthorGridOverlay';\nimport { authorCaptureContext, createAuthorCapturePacket, multiRegionCaptureProvider } from '../../_lib/authorCapture';\nimport { authorGrid } from '../../_lib/authorGrid';\nimport { authorWorkspace } from '../../_lib/authorWorkspaceStore';\nimport { AuthorRegionDrafts } from './AuthorRegionDrafts';\nimport { AuthorRequestLog } from './AuthorRequestLog';\nimport { AuthorToolPalette } from './AuthorToolPalette';\n\nexport function AuthorPanel({\n sessionId,\n activeMinorModes,\n submitCapture,\n statuses,\n renderSlot,\n renderSessionActivity,\n}: WebPluginSlotProps) {\n const [captureStatus, setCaptureStatus] = useState<string>();\n const [capturing, setCapturing] = useState(false);\n const documents = useStore(authorWorkspace.store, (state) => {\n if (sessionId === null) return [];\n const prefix = `${sessionId}\\n`;\n return Object.entries(state.documents)\n .filter(([key]) => key.startsWith(prefix))\n .map(([, document]) => document);\n });\n const workspace = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.sessions[sessionId],\n );\n const grid = useStore(authorGrid.store, (state) => (sessionId === null ? undefined : state.sessions[sessionId]));\n const focused = documents.find((document) => document.path === workspace?.focusedDocument?.path);\n const activity = sessionId === null ? null : (renderSessionActivity?.() ?? null);\n if (!activeMinorModes?.includes('author')) return null;\n return (\n <section data-testid=\"author-panel\" className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3\">\n <div className=\"flex flex-col gap-2\">\n <div data-testid=\"author-preview-providers\">{renderSlot('author.preview-provider')}</div>\n {sessionId !== null && workspace !== undefined && focused !== undefined ? (\n <>\n <h2 className=\"text-base font-semibold text-doom-text\">Annotations</h2>\n <p className=\"text-base leading-normal text-doom-dim sm:text-sm\">\n Drag a region or place a point, add feedback, then submit here. Requests queue while the agent is\n working.\n </p>\n {focused.kind === 'video' ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Annotations reference video frames. They do not save changes to the source video.\n </p>\n ) : null}\n <AuthorToolPalette sessionId={sessionId} kind={focused.kind} activeTool={workspace.activeTool} />\n {autonomousVoiceGridVisible(statuses) && grid !== undefined ? (\n <div\n data-testid=\"author-grid-snapshot\"\n className=\"rounded border border-doom-red/40 bg-doom-red/5 p-2 text-base text-doom-dim\"\n >\n <strong className=\"text-doom-red\">VOICE GRID A1–H8</strong>\n <p className=\"mt-1 truncate\">token {grid.geometryToken}</p>\n </div>\n ) : null}\n <AuthorRegionDrafts key={focused.path} sessionId={sessionId} workspace={workspace} />\n {workspace.annotations.length > 0 ? (\n <div className=\"space-y-1.5 border-b border-doom-border-soft pb-3\">\n <Button\n className=\"min-h-11 min-w-11 w-full text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"outline\"\n data-testid=\"author-attach-capture\"\n disabled={capturing || workspace.candidate !== undefined || submitCapture === undefined}\n onClick={async () => {\n if (capturing || workspace.candidate || submitCapture === undefined) return;\n setCapturing(true);\n setCaptureStatus('Submitting annotations…');\n try {\n const packet = createAuthorCapturePacket(\n crypto.randomUUID(),\n Date.now(),\n focused,\n workspace.annotations,\n );\n const image = await multiRegionCaptureProvider(workspace.annotations).capture();\n await submitCapture({ ...image, context: authorCaptureContext(packet) });\n setCaptureStatus('Request submitted. You can keep annotating here.');\n } catch (reason) {\n setCaptureStatus(reason instanceof Error ? reason.message : String(reason));\n } finally {\n setCapturing(false);\n }\n }}\n >\n {capturing\n ? 'Submitting…'\n : `Submit ${workspace.annotations.length} annotation${workspace.annotations.length === 1 ? '' : 's'}`}\n </Button>\n {workspace.candidate ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Add or discard the current annotation before submitting.\n </p>\n ) : null}\n </div>\n ) : null}\n {submitCapture === undefined ? (\n <output className=\"text-sm text-doom-red\">Submission unavailable. Reload to update the app.</output>\n ) : null}\n {captureStatus ? <output className=\"block text-sm text-doom-dim\">{captureStatus}</output> : null}\n </>\n ) : null}\n <AuthorRequestLog requests={workspace?.requests ?? []} />\n </div>\n </div>\n {activity === null ? null : (\n <footer data-testid=\"author-session-activity\" className=\"shrink-0 border-t border-doom-border bg-doom-rail p-3\">\n {activity}\n </footer>\n )}\n </section>\n );\n}\n","import { defineDockFace } from '@agimon-ai/doompi-core/web';\n\nimport { AuthorPanel } from './_components/AuthorPanel';\n\nexport default defineDockFace({\n id: 'authoring',\n label: 'authoring',\n order: 30,\n autoSelect: true,\n panel: AuthorPanel,\n requiredMinorMode: 'author',\n visibility: {\n subscribe() {\n return () => undefined;\n },\n isVisible(sessionId: string | null) {\n return sessionId !== null;\n },\n },\n});\n","import type { SlotDeclaration, TransientTab, WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport type { ComponentType } from 'react';\n\nexport interface AuthorPreviewActionSource {\n path: string;\n hasUnsavedChanges: boolean;\n kind?: string;\n revision?: number;\n sourceSha256?: string;\n}\n\nexport interface AuthorPreviewAnnotationLocation {\n mode: 'region' | 'point';\n point: { x: number; y: number };\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nexport interface AuthorPreviewDisplayedAnnotation extends AuthorPreviewAnnotationLocation {\n ordinal: number;\n}\n\nexport interface AuthorPreviewAnnotationCandidate extends AuthorPreviewAnnotationLocation {\n preview: AuthorStoryPreviewIdentity;\n evidence: Blob;\n thumbnailUrl: string;\n}\n\nexport interface AuthorPreviewPanelProps extends WebPluginSlotProps {\n source: AuthorPreviewActionSource;\n activeTool?: 'select' | 'mark' | 'comment';\n displayedAnnotations?: readonly AuthorPreviewDisplayedAnnotation[];\n pendingCandidate?: boolean;\n onAnnotationCandidate?: (candidate: AuthorPreviewAnnotationCandidate) => void;\n}\n\nexport interface AuthorPreviewAction {\n version: 1;\n label: string;\n detail?: string;\n createTab(input: { source?: AuthorPreviewActionSource }): TransientTab;\n supportsSource?: (source: AuthorPreviewActionSource) => boolean;\n embeddedPanel?: ComponentType<AuthorPreviewPanelProps>;\n}\n\nexport function parseAuthorPreviewAction(input: unknown): AuthorPreviewAction | null {\n if (typeof input !== 'object' || input === null) return null;\n const candidate = input as Record<string, unknown>;\n if (candidate.version !== 1 || typeof candidate.label !== 'string' || candidate.label.trim() === '') return null;\n if (candidate.detail !== undefined && typeof candidate.detail !== 'string') return null;\n if (typeof candidate.createTab !== 'function') return null;\n if (candidate.supportsSource !== undefined && typeof candidate.supportsSource !== 'function') return null;\n if (candidate.embeddedPanel !== undefined && typeof candidate.embeddedPanel !== 'function') return null;\n return candidate as unknown as AuthorPreviewAction;\n}\n\nexport const authorPreviewActionSlot: SlotDeclaration<AuthorPreviewAction> = {\n slot: 'author.preview-action',\n parse: parseAuthorPreviewAction,\n};\n\nexport interface AuthorStoryPreviewSource {\n path: string;\n sha256: string;\n}\n\n/** Browser-safe identity retained with an immutable story-preview capture. */\nexport interface AuthorStoryPreviewIdentity {\n version: 1;\n provider: string;\n projectPath: string;\n storyPath: string;\n storyExport: string;\n buildRevision: string;\n viewport: { width: number; height: number };\n sources: readonly AuthorStoryPreviewSource[];\n}\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorSessionView } from './authorApi';\nimport type { DocumentPreflightReport, ParsedStructuredDocument } from './structuredDocuments';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/author/`, so the mount is\n * stated once, by the folder that creates it. The browser used to restate it:\n * `authorStateUrl` built one URL from `API_BASE_PATH` and the document helper\n * two files away spelled `author` out again as a literal, so the two could\n * disagree and nothing would say so.\n *\n * The order below is the order the three Hono apps register in: `/state` in\n * `authorApi`, the eight bridge routes in `authorBridgeApi`, the three document\n * routes in `authorDocumentApi`. A reviewer can read the two side by side.\n *\n * Response types are named only where a caller reads the body. The bridge\n * routes are called by the hub's author channel over `requestSessionApi`, which\n * has its own message vocabulary and never sees this client.\n */\nexport default defineApiRoutes({\n state: {\n method: 'GET',\n path: '/state',\n response: apiResponse<AuthorSessionView>(),\n },\n bridgeRegister: {\n method: 'POST',\n path: '/bridge/register',\n },\n bridgeCatalog: {\n method: 'POST',\n path: '/bridge/catalog',\n },\n /** Long-polls for the next capability request, so it settles when one arrives. */\n bridgeNext: {\n method: 'POST',\n path: '/bridge/next',\n },\n bridgeResult: {\n method: 'POST',\n path: '/bridge/result',\n },\n bridgeCancelled: {\n method: 'POST',\n path: '/bridge/cancelled',\n },\n bridgeDisconnect: {\n method: 'POST',\n path: '/bridge/disconnect',\n },\n bridgeDescribe: {\n method: 'GET',\n path: '/bridge/describe',\n },\n bridgeInvoke: {\n method: 'POST',\n path: '/bridge/invoke',\n },\n /**\n * Parses one structured document.\n *\n * Answers a byte-length summary instead when the request names no format,\n * which is the agent-side tool path; the page always names one.\n */\n documentsOpen: {\n method: 'POST',\n path: '/documents/open',\n query: ['session'],\n response: apiResponse<ParsedStructuredDocument>(),\n },\n documentsPreflight: {\n method: 'POST',\n path: '/documents/preflight',\n query: ['session'],\n response: apiResponse<DocumentPreflightReport>(),\n },\n documentsSerialize: {\n method: 'POST',\n path: '/documents/serialize',\n query: ['session'],\n response: apiResponse<{ bytes: string; encoding: string }>(),\n },\n /**\n * The host's own bytes route, not this package's.\n *\n * `host: true` hangs it off the session root rather than under `/plugins`,\n * which is how the cockpit already serves it. Author reads a document's\n * bytes and its digest through it, and writes the edited bytes back to the\n * same path, so both stay raw transfers rather than calls: the body is the\n * file and the digest travels in a header.\n */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n host: true,\n },\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'author' at. */\nexport const apiScopes = ['session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'author',\n transport: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\n});\n","import type { AuthorModeActivation } from './author';\n\n/**\n * The wire vocabulary this package's API shares with whatever calls it.\n *\n * Paths live in `./apiRoutes`, which the Hono apps register from and the\n * generated client addresses, so neither half can move alone. What stays here\n * is the mount segment the server registers under and the shape the state\n * route answers with.\n */\n\n/** Where a host mounts this package's API; the segment after /api/plugins/. */\nexport const API_BASE_PATH = 'author';\n\n/** Query parameter naming the session a document request belongs to. */\nexport const SESSION_QUERY_PARAM = 'session';\n\nexport interface AuthorSessionView {\n sessionId: string | null;\n activation: AuthorModeActivation;\n capabilityCount: number;\n}\n","import type { ApiMethod } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\nimport { api } from '../../../../../../generated/client';\nimport { SESSION_QUERY_PARAM } from '../../../../../types/authorApi';\nimport type {\n CsvDialect,\n DocumentFragment,\n DocumentOperation,\n StructuredDocumentFormat,\n} from '../../../../../types/structuredDocuments';\nimport type { AuthorDocumentInput, AuthorDocumentKind } from './authorViewportTypes';\n\nconst IMAGE_EXTENSIONS = new Set(['avif', 'bmp', 'gif', 'jpeg', 'jpg', 'png', 'svg', 'webp']);\nconst VIDEO_EXTENSIONS = new Set(['m4v', 'mov', 'mp4', 'webm']);\n\nfunction structuredFormat(path: string): StructuredDocumentFormat | undefined {\n const lower = path.toLowerCase();\n if (lower.endsWith('.slides.md')) return 'markdown-slides';\n if (lower.endsWith('.csv')) return 'csv';\n if (lower.endsWith('.pptx')) return 'pptx';\n if (lower.endsWith('.xlsx')) return 'xlsx';\n return undefined;\n}\n\nexport function authorKindForPath(path: string): AuthorDocumentKind {\n const lower = path.toLowerCase();\n if (/\\.stories\\.(?:js|jsx|ts|tsx)$/u.test(lower)) return 'story-preview';\n const format = structuredFormat(path);\n if (format === 'markdown-slides') return 'slides';\n if (format !== undefined) return format;\n const extension = lower.split('.').at(-1) ?? '';\n if (extension === 'md') return 'markdown';\n if (IMAGE_EXTENSIONS.has(extension)) return 'image';\n if (VIDEO_EXTENSIONS.has(extension)) return 'video';\n if (extension === 'pdf') return 'pdf';\n if (['txt', 'json', 'yaml', 'yml', 'xml', 'html', 'css', 'js', 'ts', 'tsx', 'jsx'].includes(extension)) return 'text';\n return 'opaque';\n}\n\n/**\n * Where a document's bytes are read from and written back to.\n *\n * This is the host's route, not this package's, which is why the route table\n * marks it `host: true` and it lands beside the session rather than under\n * `/plugins`. It stays a raw transfer rather than a call: the body is the file\n * itself, and the digest travels in a header on both legs.\n */\nexport function authorSessionFileUrl(sessionId: string, path: string): string {\n return api.session(sessionId).file.url({ query: { path } });\n}\n\n/** One document route, with the refusal the reader is shown: the route's own words, or its status. */\nasync function documentRequest<T>(\n method: ApiMethod<T>,\n sessionId: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<T> {\n const result = await method({\n body,\n query: { [SESSION_QUERY_PARAM]: sessionId },\n ...(signal === undefined ? {} : { signal }),\n });\n if (!result.ok) throw new Error(result.error === '' ? `Author document API failed (${result.status})` : result.error);\n return result.data;\n}\n\nexport async function loadAuthorDocument(\n sessionId: string,\n path: string,\n signal?: AbortSignal,\n): Promise<AuthorDocumentInput> {\n const kind = authorKindForPath(path);\n const url = authorSessionFileUrl(sessionId, path);\n const response = await sealedTransport.fetch(url, { signal });\n if (!response.ok) throw new Error(`Author could not open ${path} (${response.status})`);\n const sourceSha256 = response.headers.get('X-File-SHA256') ?? undefined;\n const format = structuredFormat(path);\n if (format !== undefined) {\n const parsed = await documentRequest(api.session(sessionId).documentsOpen, sessionId, { path, format }, signal);\n const parsedDigest = parsed.manifest?.sourceDigest;\n if (sourceSha256 !== undefined && parsedDigest !== undefined && sourceSha256 !== parsedDigest) {\n throw new Error('Document source changed while opening. Reopen the document.');\n }\n const csvDialect = format === 'csv' ? csvDialectFromMetadata(parsed.manifest?.metadata) : undefined;\n return {\n path,\n kind,\n title: path.split('/').at(-1) ?? path,\n structuredFormat: format,\n fragments: parsed.fragments,\n ...(csvDialect === undefined ? {} : { csvDialect }),\n originalFragments: parsed.fragments.map((fragment) => ({ ...fragment })),\n ...(sourceSha256 === undefined ? {} : { sourceSha256 }),\n };\n }\n const mediaUrl = kind === 'image' || kind === 'video' || kind === 'pdf' || kind === 'opaque' ? url : undefined;\n const content =\n kind === 'text' || kind === 'markdown' || kind === 'story-preview' ? await response.text() : undefined;\n return {\n path,\n kind,\n title: path.split('/').at(-1) ?? path,\n ...(content === undefined ? {} : { content }),\n ...(mediaUrl === undefined ? {} : { mediaUrl }),\n ...(sourceSha256 === undefined ? {} : { sourceSha256 }),\n };\n}\n\nfunction operationsFor(document: AuthorDocumentInput): DocumentOperation[] {\n const originals = new Map((document.originalFragments ?? []).map((fragment) => [fragment.id, fragment.text]));\n return (document.fragments ?? [])\n .filter((fragment) => !fragment.readOnly && originals.get(fragment.id) !== fragment.text)\n .map((fragment) => ({ fragmentId: fragment.id, replacement: fragment.text }));\n}\n\nfunction decodeBase64(value: string): Uint8Array {\n if (!/^(?:[A-Za-z\\d+/]{4})*(?:[A-Za-z\\d+/]{2}==|[A-Za-z\\d+/]{3}=)?$/.test(value))\n throw new Error('Invalid serialized document bytes.');\n const binary = atob(value);\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\nfunction imageMimeType(path: string): 'image/png' | 'image/jpeg' | 'image/webp' | undefined {\n const extension = path.split('.').at(-1)?.toLowerCase();\n if (extension === 'png') return 'image/png';\n if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg';\n if (extension === 'webp') return 'image/webp';\n return undefined;\n}\n\nasync function croppedImageBytes(documentInput: AuthorDocumentInput, signal?: AbortSignal): Promise<Blob> {\n const { crop, mediaUrl } = documentInput;\n if (crop === undefined || mediaUrl === undefined) throw new Error('This Author image has no crop source.');\n const mimeType = imageMimeType(documentInput.path);\n if (mimeType === undefined) throw new Error('This image format cannot preserve its encoding after crop.');\n const response = await sealedTransport.fetch(mediaUrl, { signal, cache: 'no-store' });\n if (!response.ok) throw new Error(`Author could not read the image before saving (${response.status})`);\n const bitmap = await createImageBitmap(await response.blob());\n try {\n const sourceX = Math.round(crop.x * bitmap.width);\n const sourceY = Math.round(crop.y * bitmap.height);\n const sourceWidth = Math.max(1, Math.round(crop.width * bitmap.width));\n const sourceHeight = Math.max(1, Math.round(crop.height * bitmap.height));\n const canvas = window.document.createElement('canvas');\n canvas.width = sourceWidth;\n canvas.height = sourceHeight;\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable for image crop.');\n context.drawImage(bitmap, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, sourceWidth, sourceHeight);\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, mimeType));\n if (blob === null || blob.type !== mimeType)\n throw new Error('The browser cannot encode this cropped image format.');\n return blob;\n } finally {\n bitmap.close();\n }\n}\n\nasync function bytesToSave(sessionId: string, document: AuthorDocumentInput, signal?: AbortSignal): Promise<BodyInit> {\n if (document.kind === 'text' || document.kind === 'markdown' || document.kind === 'story-preview')\n return document.content ?? '';\n if (document.kind === 'image' && document.crop !== undefined) return await croppedImageBytes(document, signal);\n if (document.structuredFormat === undefined) throw new Error('This Author view cannot be saved.');\n const operations = operationsFor(document);\n const request = {\n path: document.path,\n format: document.structuredFormat,\n operations,\n ...(document.csvDialect === undefined ? {} : { csvDialect: document.csvDialect }),\n };\n const preflight = await documentRequest(api.session(sessionId).documentsPreflight, sessionId, request, signal);\n if (preflight.sourceDigest !== undefined && preflight.sourceDigest !== document.sourceSha256) {\n throw new Error('Document source changed before saving. Reopen the document.');\n }\n if (!preflight.accepted)\n throw new Error(preflight.issues.map((issue) => issue.message).join('\\n') || 'Author preflight rejected the edit.');\n const serialized = await documentRequest(\n api.session(sessionId).documentsSerialize,\n sessionId,\n { ...request, preflightDigest: preflight.digest },\n signal,\n );\n if (serialized.encoding !== 'base64') throw new Error('Author serialize returned an unsupported encoding.');\n const bytes = decodeBase64(serialized.bytes);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nexport async function saveAuthorDocument(\n sessionId: string,\n document: AuthorDocumentInput,\n signal?: AbortSignal,\n): Promise<string> {\n if (document.sourceSha256 === undefined) throw new Error('This Author view has no source digest.');\n const response = await sealedTransport.fetch(authorSessionFileUrl(sessionId, document.path), {\n method: 'PUT',\n headers: { 'Content-Type': 'application/octet-stream', 'X-Expected-SHA256': document.sourceSha256 },\n body: await bytesToSave(sessionId, document, signal),\n signal,\n });\n if (!response.ok) throw new Error(`Author save failed (${response.status})`);\n const sha256 = response.headers.get('X-File-SHA256');\n if (sha256 === null || !/^[a-f0-9]{64}$/.test(sha256)) throw new Error('Author save returned an invalid digest.');\n return sha256;\n}\n\nfunction csvDialectFromMetadata(\n metadata: Record<string, string | number | boolean> | undefined,\n): CsvDialect | undefined {\n if (metadata === undefined) return undefined;\n const { delimiter, quote, recordDelimiter } = metadata;\n if (\n (delimiter !== ',' && delimiter !== ';' && delimiter !== '\\t' && delimiter !== '|') ||\n (quote !== '\"' && quote !== \"'\") ||\n (recordDelimiter !== '\\n' && recordDelimiter !== '\\r\\n')\n ) {\n throw new Error('Author document API returned an invalid CSV dialect.');\n }\n return { delimiter, quote, recordDelimiter };\n}\n\nexport function editableStructuredFragments(document: AuthorDocumentInput): readonly DocumentFragment[] {\n return document.fragments ?? [];\n}\n","import type { AuthorJsonSchema } from '../../../../../types/author';\nimport { authorGridGeometry, resolveAuthorGridCell, resolveAuthorGridNativeAnchor } from './authorGrid';\nimport type {\n AuthorDocumentKind,\n AuthorNativeAnchor,\n AuthorRegionDraft,\n AuthorTrustedTool,\n} from './authorViewportTypes';\nimport {\n addAuthorRegion,\n authorDocument,\n authorSessionWorkspace,\n putAuthorRequest,\n reviseAuthorDocument,\n reviseAuthorFragment,\n setAuthorCrop,\n updateAuthorRequest,\n} from './authorWorkspaceStore';\n\nconst stringProperty = { type: 'string', minLength: 1 } as const;\n\nfunction inputRecord(input: unknown): Record<string, unknown> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) throw new Error('Expected an object.');\n return input as Record<string, unknown>;\n}\n\nfunction requiredString(value: Record<string, unknown>, name: string): string {\n if (typeof value[name] !== 'string' || value[name] === '') throw new Error(`${name} must be a non-empty string.`);\n return value[name];\n}\n\nfunction resolvedAnchor(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n cell: ReturnType<typeof resolveAuthorGridCell>,\n): { anchor: AuthorNativeAnchor; quote?: string } {\n const document = authorDocument(sessionId, path);\n if (document === undefined) throw new Error('STALE_DOCUMENT: The focused Author document is no longer open.');\n if (kind === 'pdf' || kind === 'video' || kind === 'opaque') {\n throw new Error(\n 'UNSUPPORTED_GRID: PDF and video coordinates are capture-only and require a visible native selection.',\n );\n }\n return resolveAuthorGridNativeAnchor(sessionId, cell);\n}\n\nfunction checkedRegion(sessionId: string, path: string, value: Record<string, unknown>) {\n const document = authorDocument(sessionId, path);\n if (document === undefined) throw new Error('STALE_DOCUMENT: The Author document is no longer open.');\n if (document.savingVersion !== undefined)\n throw new Error('SAVE_IN_PROGRESS: Wait for the current Author save to finish.');\n const expectedRevision = value.expectedRevision;\n const expectedSourceSha256 = requiredString(value, 'expectedSourceSha256');\n if (expectedRevision !== document.version || expectedSourceSha256 !== document.sourceSha256) {\n throw new Error('STALE_DOCUMENT: The Author revision or source digest changed.');\n }\n const regionId = requiredString(value, 'regionId');\n const workspace = authorSessionWorkspace(sessionId);\n const region =\n workspace.regions.find((candidate) => candidate.id === regionId) ??\n workspace.requests\n .filter((request) => request.status === 'REQUESTED' || request.status === 'CHANGING')\n .flatMap((request) => request.pendingRegions ?? request.regions)\n .find((candidate) => candidate.id === regionId);\n if (region === undefined || region.documentPath !== path)\n throw new Error('STALE_REGION: The resolved Author region is unavailable.');\n if (region.revision !== document.version || region.sourceSha256 !== document.sourceSha256) {\n throw new Error('STALE_REGION: The resolved Author region no longer matches the document.');\n }\n return { document, region };\n}\n\nfunction gridTools(sessionId: string, path: string, kind: AuthorDocumentKind): AuthorTrustedTool[] {\n const describeSchema: AuthorJsonSchema = { type: 'object', additionalProperties: false, properties: {} };\n return [\n {\n name: 'author_describe_grid',\n label: 'Describe grid',\n description: 'Describe the current A1 through H8 grid and return its geometry token.',\n inputSchema: describeSchema,\n execute: async () => {\n const geometry = authorGridGeometry(sessionId);\n const document = authorDocument(sessionId, path);\n if (\n geometry === undefined ||\n document === undefined ||\n geometry.documentPath !== path ||\n geometry.revision !== document.version\n ) {\n throw new Error('STALE_GRID: The visible Author grid is unavailable.');\n }\n return { columns: 'A-H', rows: '1-8', ...geometry };\n },\n },\n {\n name: 'author_resolve_grid_cell',\n label: 'Resolve grid cell',\n description: 'Resolve one current grid cell to a native document anchor before mutation.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['cell', 'geometryToken', 'instruction'],\n properties: { cell: stringProperty, geometryToken: stringProperty, instruction: stringProperty },\n },\n execute: async (input) => {\n const value = inputRecord(input);\n const instruction = requiredString(value, 'instruction');\n const cell = resolveAuthorGridCell(\n sessionId,\n requiredString(value, 'cell'),\n requiredString(value, 'geometryToken'),\n );\n const geometry = authorGridGeometry(sessionId)!;\n const resolved = resolvedAnchor(sessionId, path, kind, cell);\n const regionId = crypto.randomUUID();\n const createdAt = Date.now();\n const region = {\n id: regionId,\n documentPath: path,\n revision: geometry.revision,\n sourceSha256: geometry.sourceSha256,\n comment: instruction,\n ...resolved,\n viewport: { ...geometry.viewport },\n voiceGrid: cell.evidence,\n createdAt,\n };\n addAuthorRegion(sessionId, region);\n putAuthorRequest(sessionId, {\n id: `voice:${regionId}`,\n documentPath: path,\n requestText: instruction,\n regions: [region],\n pendingRegions: [region],\n status: 'REQUESTED',\n createdAt,\n updatedAt: createdAt,\n revision: geometry.revision,\n sourceSha256: geometry.sourceSha256,\n });\n return { regionId, anchor: resolved.anchor, quote: resolved.quote, evidence: cell.evidence };\n },\n },\n ];\n}\n\ninterface MutationResult {\n changed: true;\n before?: string;\n after?: string;\n crop?: unknown;\n revision: number;\n}\n\nfunction assertRebasable(pending: readonly AuthorRegionDraft[], changed: AuthorRegionDraft): void {\n const remaining = pending.filter((region) => region.id !== changed.id);\n if (changed.anchor.kind === 'image-rect' && remaining.length > 0)\n throw new Error('UNSUPPORTED_REGION: A multi-region image request cannot apply more than one crop.');\n if (changed.anchor.kind !== 'text-range') return;\n for (const region of remaining) {\n if (region.anchor.kind !== 'text-range') continue;\n const separate =\n region.anchor.endOffset <= changed.anchor.startOffset || region.anchor.startOffset >= changed.anchor.endOffset;\n if (!separate) throw new Error('AMBIGUOUS_REGION: Submitted text regions overlap and cannot be safely rebased.');\n }\n}\n\nfunction lineAtOffset(content: string, offset: number): number {\n return content.slice(0, Math.max(0, offset)).split('\\n').length;\n}\n\nfunction rebasePendingRegions(\n pending: readonly AuthorRegionDraft[],\n changed: AuthorRegionDraft,\n result: MutationResult,\n nextContent: string | undefined,\n): readonly AuthorRegionDraft[] {\n return pending\n .filter((region) => region.id !== changed.id)\n .map((region) => {\n if (changed.anchor.kind !== 'text-range' || region.anchor.kind !== 'text-range' || nextContent === undefined)\n return { ...region, revision: result.revision };\n const delta = (result.after?.length ?? 0) - (result.before?.length ?? 0);\n const shift = region.anchor.startOffset >= changed.anchor.endOffset ? delta : 0;\n const startOffset = region.anchor.startOffset + shift;\n const endOffset = region.anchor.endOffset + shift;\n return {\n ...region,\n revision: result.revision,\n anchor: {\n ...region.anchor,\n startOffset,\n endOffset,\n startLine: lineAtOffset(nextContent, startOffset),\n endLine: lineAtOffset(nextContent, endOffset),\n },\n };\n });\n}\nfunction mutationTool(sessionId: string, path: string, kind: AuthorDocumentKind): AuthorTrustedTool | undefined {\n if (kind === 'pdf' || kind === 'video' || kind === 'opaque') return undefined;\n const needsReplacement = kind !== 'image';\n return {\n name: 'author_apply_region',\n label: 'Apply region change',\n description: 'Apply a fenced mutation through a previously resolved native Author region.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['regionId', 'expectedRevision', 'expectedSourceSha256', ...(needsReplacement ? ['replacement'] : [])],\n properties: {\n regionId: stringProperty,\n expectedRevision: { type: 'integer', minimum: 0 },\n expectedSourceSha256: stringProperty,\n ...(needsReplacement ? { replacement: { type: 'string' } } : {}),\n },\n },\n execute: async (input, signal) => {\n const value = inputRecord(input);\n const regionId = requiredString(value, 'regionId');\n const request = authorSessionWorkspace(sessionId).requests.find(\n (candidate) =>\n (candidate.pendingRegions ?? candidate.regions).some((item) => item.id === regionId) &&\n candidate.status === 'REQUESTED',\n );\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: 'CHANGING',\n currentOperation: 'validating native anchor',\n updatedAt: Date.now(),\n }));\n }\n try {\n if (signal.aborted)\n throw signal.reason instanceof Error ? signal.reason : new Error('Author mutation cancelled.');\n const { document, region } = checkedRegion(sessionId, path, value);\n const pending = request?.pendingRegions ?? request?.regions ?? [region];\n assertRebasable(pending, region);\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n currentOperation: `mutating ${region.anchor.kind}`,\n updatedAt: Date.now(),\n }));\n }\n let result: MutationResult;\n let nextContent: string | undefined;\n if (region.anchor.kind === 'text-range') {\n const replacement = typeof value.replacement === 'string' ? value.replacement : '';\n const { startOffset, endOffset } = region.anchor;\n const content = document.content ?? '';\n const before = content.slice(startOffset, endOffset);\n nextContent = content.slice(0, startOffset) + replacement + content.slice(endOffset);\n reviseAuthorDocument(sessionId, path, nextContent);\n result = { changed: true, before, after: replacement, revision: document.version + 1 };\n } else if (region.anchor.kind === 'cell' || region.anchor.kind === 'slide-element') {\n const fragmentId = region.anchor.fragmentId;\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.readOnly === true)\n throw new Error('UNSUPPORTED_REGION: The native fragment is not editable.');\n const replacement = typeof value.replacement === 'string' ? value.replacement : '';\n reviseAuthorFragment(sessionId, path, fragment.id, replacement);\n result = { changed: true, before: fragment.text, after: replacement, revision: document.version + 1 };\n } else if (region.anchor.kind === 'image-rect') {\n setAuthorCrop(sessionId, path, region.anchor.rect);\n result = { changed: true, crop: region.anchor.rect, revision: document.version + 1 };\n } else {\n throw new Error('UNSUPPORTED_REGION: PDF and video regions are capture-only.');\n }\n if (request !== undefined) {\n const pendingRegions = rebasePendingRegions(pending, region, result, nextContent);\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: pendingRegions.length === 0 ? 'CHANGED' : 'REQUESTED',\n currentOperation: undefined,\n before: [current.before, result.before].filter((item) => item !== undefined).join('\\n') || undefined,\n after:\n [current.after, result.after ?? (result.crop === undefined ? undefined : JSON.stringify(result.crop))]\n .filter((item) => item !== undefined)\n .join('\\n') || undefined,\n pendingRegions,\n revision: result.revision,\n updatedAt: Date.now(),\n }));\n }\n return result;\n } catch (error) {\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: signal.aborted ? 'CANCELLED' : 'FAILED',\n currentOperation: undefined,\n error: signal.aborted\n ? 'Author mutation cancelled.'\n : error instanceof Error\n ? error.message\n : String(error),\n updatedAt: Date.now(),\n }));\n }\n throw error;\n }\n },\n };\n}\n\nexport function authorGridTools(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n): readonly AuthorTrustedTool[] {\n const mutation = mutationTool(sessionId, path, kind);\n return [...gridTools(sessionId, path, kind), ...(mutation === undefined ? [] : [mutation])];\n}\n","import type { AuthorJsonSchema } from '../../../../../types/author';\nimport { authorGridTools } from './authorGridTools';\nimport { AUTHOR_RUNTIME_BINDING_IDS } from './authorRuntime';\nimport type { AuthorDocumentKind, AuthorTrustedProfile } from './authorViewportTypes';\nimport { addAuthorAnnotation } from './authorWorkspaceStore';\n\nfunction record(input: unknown): Record<string, unknown> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) throw new Error('Expected an object');\n return input as Record<string, unknown>;\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string`);\n return value;\n}\n\nfunction target(input: unknown): { sessionId: string; path: string; value: Record<string, unknown> } {\n const value = record(input);\n return { sessionId: text(value.sessionId, 'sessionId'), path: text(value.path, 'path'), value };\n}\n\nconst TARGET_PROPERTIES = {\n sessionId: { type: 'string', minLength: 1 },\n path: { type: 'string', minLength: 1 },\n} as const;\n\nexport const AUTHOR_TEXT_PROFILE: AuthorTrustedProfile = {\n id: AUTHOR_RUNTIME_BINDING_IDS.text,\n tools: [\n {\n name: 'author_add_comment',\n label: 'Add comment',\n description: 'Add a local review comment to one open Author document.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['sessionId', 'path', 'body'],\n properties: { ...TARGET_PROPERTIES, body: { type: 'string' }, quote: { type: 'string' } },\n },\n execute: async (input) => {\n const { sessionId, path, value } = target(input);\n const body = text(value.body, 'body');\n addAuthorAnnotation(sessionId, path, {\n id: `${Date.now()}:${body.length}`,\n kind: 'comment',\n body,\n ...(typeof value.quote === 'string' ? { quote: value.quote } : {}),\n });\n return { added: true };\n },\n },\n {\n name: 'author_add_highlight',\n label: 'Add highlight',\n description: 'Highlight a line range in one open Author text document.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['sessionId', 'path', 'startLine', 'endLine'],\n properties: {\n ...TARGET_PROPERTIES,\n startLine: { type: 'integer', minimum: 1 },\n endLine: { type: 'integer', minimum: 1 },\n },\n },\n execute: async (input) => {\n const { sessionId, path, value } = target(input);\n if (!Number.isSafeInteger(value.startLine) || !Number.isSafeInteger(value.endLine)) {\n throw new Error('Highlight lines must be integers');\n }\n const startLine = value.startLine as number;\n const endLine = value.endLine as number;\n if (startLine < 1 || endLine < startLine) throw new Error('Invalid highlight range');\n addAuthorAnnotation(sessionId, path, {\n id: `${Date.now()}:${startLine}:${endLine}`,\n kind: 'highlight',\n body: '',\n startLine,\n endLine,\n });\n return { added: true };\n },\n },\n ],\n};\n\nexport const AUTHOR_MEDIA_PROFILE: AuthorTrustedProfile = {\n id: AUTHOR_RUNTIME_BINDING_IDS.media,\n tools: [],\n};\n\nexport const AUTHOR_TRUSTED_PROFILES = [AUTHOR_TEXT_PROFILE, AUTHOR_MEDIA_PROFILE] as const;\n\nfunction bindProfile(profile: AuthorTrustedProfile, sessionId: string, path: string): AuthorTrustedProfile {\n return {\n id: profile.id,\n tools: profile.tools.map((tool) => {\n const schema = tool.inputSchema as Record<string, unknown>;\n const properties = record(schema.properties);\n const { sessionId: _sessionId, path: _path, ...boundProperties } = properties;\n const required = Array.isArray(schema.required)\n ? schema.required.filter((entry) => entry !== 'sessionId' && entry !== 'path')\n : [];\n return {\n ...tool,\n inputSchema: { ...schema, properties: boundProperties, required } as AuthorJsonSchema,\n execute: async (input: unknown, signal: AbortSignal) =>\n await tool.execute({ ...record(input), sessionId, path }, signal),\n };\n }),\n };\n}\n\nexport function authorProfilesForDocument(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n): readonly AuthorTrustedProfile[] {\n const profiles =\n kind === 'image'\n ? [bindProfile(AUTHOR_MEDIA_PROFILE, sessionId, path)]\n : kind === 'text' || kind === 'markdown'\n ? [bindProfile(AUTHOR_TEXT_PROFILE, sessionId, path)]\n : [];\n const tools = authorGridTools(sessionId, path, kind);\n if (tools.length === 0) return profiles;\n return profiles.length === 0\n ? [{ id: AUTHOR_RUNTIME_BINDING_IDS.media, tools }]\n : [{ ...profiles[0]!, tools: [...profiles[0]!.tools, ...tools] }];\n}\n","import { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\n/**\n * Native media elements cannot perform the remote session's encrypted HTTP exchange.\n *\n * `source` addresses the host's own session file route, which the route table\n * declares as `file` with `host: true`; this package serves no bytes of its\n * own. The transport stays raw because what comes back is a blob, and a call\n * through the generated client reads the body as JSON to report a refusal.\n */\nexport async function loadAuthorMedia(source: string, signal: AbortSignal): Promise<{ url: string; dispose(): void }> {\n const response = await sealedTransport.fetch(source, { signal, cache: 'no-store' });\n if (!response.ok) throw new Error(`Author media could not be loaded (${response.status}).`);\n const blob = await response.blob();\n signal.throwIfAborted();\n const url = URL.createObjectURL(blob);\n let disposed = false;\n return {\n url,\n dispose() {\n if (disposed) return;\n disposed = true;\n URL.revokeObjectURL(url);\n },\n };\n}\n","import type { AuthorNormalizedRect } from './authorViewportTypes';\n\nexport interface AuthorClientRect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Clamp a drag to the source element, including drags made in reverse. */\nexport function normalizedAuthorRectangle(\n bounds: AuthorClientRect,\n drag: AuthorClientRect,\n): AuthorNormalizedRect | null {\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n if (![...Object.values(bounds), ...Object.values(drag)].every(Number.isFinite) || width <= 0 || height <= 0)\n return null;\n const left = Math.max(bounds.left, Math.min(drag.left, drag.right));\n const right = Math.min(bounds.right, Math.max(drag.left, drag.right));\n const top = Math.max(bounds.top, Math.min(drag.top, drag.bottom));\n const bottom = Math.min(bounds.bottom, Math.max(drag.top, drag.bottom));\n if (right <= left || bottom <= top) return null;\n return {\n x: (left - bounds.left) / width,\n y: (top - bounds.top) / height,\n width: (right - left) / width,\n height: (bottom - top) / height,\n };\n}\n","import { Button, type MediaPlaybackState } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nexport function videoTimeLabel(seconds: number): string {\n const milliseconds = Math.max(0, Math.round((Number.isFinite(seconds) ? seconds : 0) * 1000));\n return `${String(Math.floor(milliseconds / 60000)).padStart(2, '0')}:${String(Math.floor(milliseconds / 1000) % 60).padStart(2, '0')}.${String(milliseconds % 1000).padStart(3, '0')}`;\n}\n\nexport function AuthorVideoControls({\n playback,\n ready,\n locked,\n marking,\n onSeek,\n onToggle,\n onAnnotate,\n}: {\n playback: MediaPlaybackState;\n ready: boolean;\n locked: boolean;\n marking: boolean;\n onSeek: (seconds: number) => void;\n onToggle: () => void;\n onAnnotate: () => void;\n}) {\n const [seconds, setSeconds] = useState('');\n const duration = playback.duration;\n const invalid =\n seconds.trim() === '' || !Number.isFinite(Number(seconds)) || Number(seconds) < 0 || Number(seconds) > duration;\n const buttonClass = 'min-h-11 px-3 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm';\n return (\n <section\n aria-label=\"Video annotation controls\"\n className=\"mt-2 space-y-2 rounded border border-doom-border bg-doom-panel p-2.5 text-base text-doom-text sm:text-sm\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <output aria-label=\"Playback position\" className=\"font-mono text-base tabular-nums\">\n {videoTimeLabel(playback.currentTime)} / {videoTimeLabel(duration)}\n </output>\n <span className=\"text-doom-dim\">\n {locked\n ? 'Annotation draft: add or discard it before seeking.'\n : marking\n ? 'Frame paused. Drag a region on the video.'\n : 'Seek to a moment, then choose Annotate this frame.'}\n </span>\n </div>\n <input\n aria-label=\"Video timeline\"\n type=\"range\"\n min={0}\n max={duration || 0}\n step={0.001}\n value={Math.min(playback.currentTime, duration)}\n disabled={locked || duration <= 0}\n onChange={(event) => onSeek(Number(event.target.value))}\n className=\"h-11 w-full cursor-pointer accent-doom-blue [@media(pointer:fine)]:h-6\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button className={buttonClass} disabled={locked || duration <= 0} onClick={onToggle}>\n {playback.playing ? 'Pause' : 'Play'}\n </Button>\n <Button\n className={buttonClass}\n disabled={locked || duration <= 0}\n onClick={() => onSeek(Math.max(0, playback.currentTime - 0.1))}\n aria-label=\"Seek back 0.1 seconds\"\n >\n −0.1s\n </Button>\n <Button\n className={buttonClass}\n disabled={locked || duration <= 0}\n onClick={() => onSeek(Math.min(duration, playback.currentTime + 0.1))}\n aria-label=\"Seek forward 0.1 seconds\"\n >\n +0.1s\n </Button>\n <Button variant=\"primary\" className={buttonClass} disabled={locked || !ready} onClick={onAnnotate}>\n Annotate this frame\n </Button>\n <form\n className=\"flex flex-wrap items-center gap-2 sm:ml-auto\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!invalid && !locked) onSeek(Number(seconds));\n }}\n >\n <label htmlFor=\"author-video-seconds\" className=\"text-doom-dim\">\n Go to seconds\n </label>\n <input\n id=\"author-video-seconds\"\n type=\"number\"\n min={0}\n max={duration}\n step={0.001}\n value={seconds}\n onChange={(event) => setSeconds(event.target.value)}\n disabled={locked || duration <= 0}\n placeholder=\"1.250\"\n className=\"h-11 w-24 rounded border border-doom-border bg-doom-deep px-2 text-lg [@media(pointer:fine)]:h-8 sm:text-sm\"\n />\n <Button type=\"submit\" className={buttonClass} disabled={locked || duration <= 0 || invalid}>\n Go\n </Button>\n </form>\n </div>\n </section>\n );\n}\n","import {\n MediaPreview,\n type MediaPlaybackState,\n type MediaPreviewController,\n type PdfPreviewController,\n} from '@agimon-ai/doompi-web-components';\nimport { useEffect, useRef, useState, type PointerEvent } from 'react';\n\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport { loadAuthorMedia } from '../_lib/authorMedia';\nimport { normalizedAuthorRectangle } from '../_lib/authorRegions';\nimport type { AuthorDisplayedRegion, AuthorNativeAnchor, AuthorToolMode } from '../_lib/authorViewportTypes';\nimport {\n authorSessionWorkspace,\n setAuthorRegionCandidate,\n setAuthorToolMode,\n type AuthorSessionWorkspace,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\nimport { AuthorVideoControls } from './AuthorVideoControls';\n\n/** Marks source media. Native playback and page controls remain usable in select mode. */\nexport function AuthorMediaView({\n sessionId,\n document: source,\n activeTool,\n displayedRegions,\n pendingCandidate = false,\n seekRequest,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n activeTool: AuthorToolMode;\n displayedRegions: readonly AuthorDisplayedRegion[];\n pendingCandidate?: boolean;\n seekRequest?: AuthorSessionWorkspace['videoSeekRequest'];\n}) {\n const host = useRef<HTMLDivElement>(null);\n const image = useRef<HTMLImageElement>(null);\n const video = useRef<MediaPreviewController>(null);\n const pdf = useRef<PdfPreviewController>(null);\n const start = useRef<\n | {\n x: number;\n y: number;\n mode: 'mark' | 'comment';\n element: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n }\n | undefined\n >(undefined);\n const [playback, setPlayback] = useState<MediaPlaybackState>({ playing: false, currentTime: 0, duration: 0 });\n const [frameReady, setFrameReady] = useState(false);\n const [selection, setSelection] = useState<{\n path: string;\n rect?: NonNullable<ReturnType<typeof normalizedAuthorRectangle>>;\n point?: { x: number; y: number };\n }>();\n const [error, setError] = useState<string>();\n const [media, setMedia] = useState<{ source: string; url: string }>();\n const mediaUrl = media?.source === source.mediaUrl ? media?.url : undefined;\n useEffect(() => {\n if (source.mediaUrl === undefined) return;\n const input = source.mediaUrl;\n const controller = new AbortController();\n let dispose: (() => void) | undefined;\n setError(undefined);\n void loadAuthorMedia(input, controller.signal)\n .then((asset) => {\n if (controller.signal.aborted) {\n asset.dispose();\n return;\n }\n dispose = () => asset.dispose();\n setMedia({ source: input, url: asset.url });\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n dispose?.();\n };\n }, [source.mediaUrl]);\n const seek = (seconds: number) => {\n if (authorSessionWorkspace(sessionId).candidate || !Number.isFinite(seconds)) return;\n const player = video.current;\n if (!player) return;\n player.pause();\n setAuthorToolMode(sessionId, 'select');\n setSelection(undefined);\n if (player.getState().currentTime === seconds) return;\n setFrameReady(false);\n player.seek(seconds);\n };\n useEffect(() => {\n if (\n seekRequest?.path === source.path &&\n seekRequest.generation === authorSessionWorkspace(sessionId).focusedDocument?.generation\n ) {\n seek(seekRequest.timeSeconds);\n }\n }, [seekRequest]);\n useEffect(() => {\n if (!pendingCandidate && start.current === undefined) setSelection(undefined);\n }, [pendingCandidate]);\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n const target = image.current;\n if (source.kind !== 'image' || target === null || target.naturalWidth === 0 || target.naturalHeight === 0)\n return undefined;\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const cellBounds = {\n left: originX + cell.rect.x * width,\n top: originY + cell.rect.y * height,\n right: originX + (cell.rect.x + cell.rect.width) * width,\n bottom: originY + (cell.rect.y + cell.rect.height) * height,\n };\n const bounds = target.getBoundingClientRect();\n const left = Math.max(bounds.left, cellBounds.left);\n const top = Math.max(bounds.top, cellBounds.top);\n const right = Math.min(bounds.right, cellBounds.right);\n const bottom = Math.min(bounds.bottom, cellBounds.bottom);\n if (right <= left || bottom <= top || bounds.width <= 0 || bounds.height <= 0) return undefined;\n return {\n anchor: {\n kind: 'image-rect',\n rect: {\n x: (left - bounds.left) / bounds.width,\n y: (top - bounds.top) / bounds.height,\n width: (right - left) / bounds.width,\n height: (bottom - top) / bounds.height,\n },\n naturalWidth: target.naturalWidth,\n naturalHeight: target.naturalHeight,\n },\n };\n }),\n [sessionId, source.kind, source.path, source.version],\n );\n const mark = async (event: PointerEvent<HTMLDivElement>) => {\n const drag = start.current;\n start.current = undefined;\n if (!drag) return;\n const bounds = drag.element.getBoundingClientRect();\n if (bounds.width <= 0 || bounds.height <= 0) return;\n const point = {\n x: Math.min(1, Math.max(0, (event.clientX - bounds.left) / bounds.width)),\n y: Math.min(1, Math.max(0, (event.clientY - bounds.top) / bounds.height)),\n };\n const rect =\n drag.mode === 'mark'\n ? normalizedAuthorRectangle(bounds, {\n left: drag.x,\n top: drag.y,\n right: event.clientX,\n bottom: event.clientY,\n })\n : undefined;\n if (drag.mode === 'mark' && !rect) return;\n setSelection(drag.mode === 'mark' ? { path: source.path, rect: rect! } : { path: source.path, point });\n const focused = authorSessionWorkspace(sessionId).focusedDocument;\n if (!focused || focused.path !== source.path) return;\n let anchor: AuthorNativeAnchor;\n let blob: Blob | null = null;\n let thumbnailUrl: string | undefined;\n try {\n if (drag.element instanceof HTMLImageElement) {\n const image = drag.element;\n if (!image.naturalWidth || !image.naturalHeight) throw new Error('Image is not ready.');\n anchor =\n drag.mode === 'mark'\n ? { kind: 'image-rect', rect: rect!, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight }\n : { kind: 'image-point', point, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight };\n const canvas = document.createElement('canvas');\n const scale = Math.min(1, 1600 / Math.max(image.naturalWidth, image.naturalHeight));\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Canvas is unavailable.');\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n } else if (source.kind === 'pdf') {\n const page = pdf.current?.getState();\n if (!page?.sourceWidth) throw new Error('PDF page is not ready.');\n anchor =\n drag.mode === 'mark'\n ? { kind: 'pdf-page-rect', page: page.page, rect: rect! }\n : { kind: 'pdf-page-point', page: page.page, point };\n blob = await pdf.current!.capturePage();\n } else {\n const frame = await video.current?.captureFrame();\n if (!frame) throw new Error('Video frame is not ready.');\n anchor =\n drag.mode === 'mark'\n ? {\n kind: 'video-time-rect',\n rect: rect!,\n timeSeconds: frame.timeSeconds,\n intrinsicWidth: frame.width,\n intrinsicHeight: frame.height,\n }\n : {\n kind: 'video-time-point',\n point,\n timeSeconds: frame.timeSeconds,\n intrinsicWidth: frame.width,\n intrinsicHeight: frame.height,\n };\n blob = frame.blob;\n }\n if (!blob) throw new Error('Unable to capture selected media.');\n if (authorSessionWorkspace(sessionId).focusedDocument?.generation !== focused.generation) return;\n thumbnailUrl = URL.createObjectURL(blob);\n setAuthorRegionCandidate(sessionId, {\n documentPath: source.path,\n revision: source.version,\n sourceSha256: source.sourceSha256,\n mode: drag.mode === 'mark' ? 'region' : 'point',\n anchor,\n viewport: { width: bounds.width, height: bounds.height },\n thumbnailUrl,\n evidence: blob,\n createdAt: Date.now(),\n });\n setError(undefined);\n } catch (reason) {\n if (thumbnailUrl) URL.revokeObjectURL(thumbnailUrl);\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n };\n const selected = selection?.path === source.path ? selection.rect : undefined;\n const selectedPoint = selection?.path === source.path ? selection.point : undefined;\n const selectionOverlay =\n selected === undefined ? null : (\n <div\n data-testid=\"author-media-selection\"\n className=\"pointer-events-none absolute border-2 border-doom-red bg-doom-red/10\"\n style={{\n left: `${selected.x * 100}%`,\n top: `${selected.y * 100}%`,\n width: `${selected.width * 100}%`,\n height: `${selected.height * 100}%`,\n }}\n />\n );\n const pointPin = (ordinal: number | undefined, point: { x: number; y: number }, key: string) => (\n <span\n key={key}\n data-author-point={ordinal}\n data-testid={ordinal === undefined ? 'author-media-point-selection' : undefined}\n className={`pointer-events-none absolute z-10 flex h-5 min-w-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border-2 px-1 text-2xs font-bold ${ordinal === undefined ? 'border-white bg-doom-red text-white' : 'border-doom-deep bg-doom-yellow text-doom-deep'}`}\n style={{ left: `${String(point.x * 100)}%`, top: `${String(point.y * 100)}%` }}\n >\n {ordinal ?? '•'}\n </span>\n );\n const pointSelectionOverlay = selectedPoint === undefined ? null : pointPin(undefined, selectedPoint, 'selection');\n return (\n <div\n ref={host}\n className=\"min-h-0 flex-1 overflow-auto p-4\"\n style={{\n touchAction: activeTool === 'select' ? 'auto' : 'none',\n cursor: activeTool === 'select' ? undefined : 'crosshair',\n }}\n onPointerMove={(event) => {\n const drag = start.current;\n if (drag === undefined || drag.mode !== 'mark') return;\n const rect = normalizedAuthorRectangle(drag.element.getBoundingClientRect(), {\n left: drag.x,\n top: drag.y,\n right: event.clientX,\n bottom: event.clientY,\n });\n setSelection(rect === null ? undefined : { path: source.path, rect });\n }}\n onPointerDownCapture={(event) => {\n if ((activeTool !== 'mark' && activeTool !== 'comment') || event.button !== 0 || pendingCandidate) return;\n const element = event.target;\n if (\n !(\n element instanceof HTMLImageElement ||\n element instanceof HTMLVideoElement ||\n element instanceof HTMLCanvasElement\n )\n )\n return;\n event.preventDefault();\n setSelection(undefined);\n if (element instanceof HTMLVideoElement) {\n if (video.current?.isFrameReady?.() === false) {\n setError('Wait for the selected frame to finish loading.');\n return;\n }\n video.current?.pause();\n }\n start.current = { x: event.clientX, y: event.clientY, mode: activeTool, element };\n event.currentTarget.setPointerCapture(event.pointerId);\n }}\n onPointerUp={(event) => void mark(event)}\n onPointerCancel={() => {\n start.current = undefined;\n setSelection(undefined);\n }}\n >\n {mediaUrl === undefined ? (\n <p className=\"text-doom-dim\">{error === undefined ? 'Loading media...' : 'Media unavailable.'}</p>\n ) : source.kind === 'image' ? (\n <div className=\"relative inline-block max-w-full\">\n <img ref={image} src={mediaUrl} alt={source.path} draggable={false} className=\"block max-w-full\" />\n {selectionOverlay}\n {pointSelectionOverlay}\n {displayedRegions.flatMap(({ ordinal, region }) => {\n if (region.anchor.kind === 'image-point') return [pointPin(ordinal, region.anchor.point, region.id)];\n if (region.anchor.kind !== 'image-rect') return [];\n const { rect } = region.anchor;\n return [\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${String(rect.x * 100)}%`,\n top: `${String(rect.y * 100)}%`,\n width: `${String(rect.width * 100)}%`,\n height: `${String(rect.height * 100)}%`,\n }}\n >\n <span className=\"absolute -left-2 -top-2 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep\">\n {ordinal}\n </span>\n </div>,\n ];\n })}\n </div>\n ) : (\n <div className=\"relative w-fit max-w-full\">\n <MediaPreview\n src={mediaUrl}\n path={source.path}\n kind={source.kind === 'pdf' ? 'pdf' : source.kind === 'video' ? 'video' : 'download'}\n controllerRef={video}\n pdfControllerRef={pdf}\n data-testid=\"author-media\"\n videoControls={false}\n onPlaybackStateChange={(state) => {\n setPlayback(state);\n setFrameReady(video.current?.isFrameReady() ?? false);\n if (state.playing) setSelection(undefined);\n }}\n />\n {selectionOverlay}\n {pointSelectionOverlay}\n {displayedRegions.map(({ ordinal, region }) => {\n if (source.kind === 'pdf') {\n if (region.anchor.kind !== 'pdf-page-point' && region.anchor.kind !== 'pdf-page-rect') return null;\n if (region.anchor.page !== pdf.current?.getState().page) return null;\n if (region.anchor.kind === 'pdf-page-point') return pointPin(ordinal, region.anchor.point, region.id);\n const { rect } = region.anchor;\n return (\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${String(rect.x * 100)}%`,\n top: `${String(rect.y * 100)}%`,\n width: `${String(rect.width * 100)}%`,\n height: `${String(rect.height * 100)}%`,\n }}\n >\n <span className=\"bg-doom-yellow text-doom-deep\">{ordinal}</span>\n </div>\n );\n }\n if (source.kind !== 'video' || playback.playing) return null;\n if (\n region.anchor.kind === 'video-time-point' &&\n Math.abs(region.anchor.timeSeconds - playback.currentTime) <= 0.1\n ) {\n return pointPin(ordinal, region.anchor.point, region.id);\n }\n if (\n region.anchor.kind !== 'video-time-rect' ||\n Math.abs(region.anchor.timeSeconds - playback.currentTime) > 0.1\n )\n return null;\n const { rect } = region.anchor;\n return (\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${rect.x * 100}%`,\n top: `${rect.y * 100}%`,\n width: `${rect.width * 100}%`,\n height: `${rect.height * 100}%`,\n }}\n >\n <span className=\"bg-doom-yellow text-doom-deep\">{ordinal}</span>\n </div>\n );\n })}\n </div>\n )}\n {source.kind === 'video' ? (\n <AuthorVideoControls\n playback={playback}\n ready={frameReady}\n locked={pendingCandidate}\n marking={activeTool === 'mark'}\n onSeek={seek}\n onToggle={() => {\n setAuthorToolMode(sessionId, 'select');\n setSelection(undefined);\n if (playback.playing) video.current?.pause();\n else void video.current?.play().catch((reason: unknown) => setError(String(reason)));\n }}\n onAnnotate={() => {\n video.current?.pause();\n setAuthorToolMode(sessionId, 'mark');\n }}\n />\n ) : null}\n {error ? <output className=\"text-base text-doom-red\">{error}</output> : null}\n </div>\n );\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useEffect } from 'react';\n\nimport type { DocumentFragment } from '../../../../../types/structuredDocuments';\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n reviseAuthorFragment,\n setAuthorRegionCandidate,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\n\nexport function AuthorStructuredView({\n sessionId,\n document,\n displayedRegions,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n displayedRegions: readonly AuthorDisplayedRegion[];\n}) {\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const element = window.document.elementFromPoint(\n originX + cell.center.x * width,\n originY + cell.center.y * height,\n );\n const fragmentId = element?.closest<HTMLElement>('[data-author-fragment]')?.dataset.authorFragment;\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.readOnly === true) return undefined;\n if (document.kind === 'csv' || document.kind === 'xlsx') {\n return {\n anchor: { kind: 'cell', fragmentId: fragment.id, location: fragment.location },\n quote: fragment.text,\n };\n }\n const slide = Number(fragment.location.match(/(?:slide\\s*|slides\\/slide)(\\d+)/u)?.[1]);\n if (!Number.isSafeInteger(slide)) return undefined;\n return {\n anchor: { kind: 'slide-element', fragmentId: fragment.id, location: fragment.location, slide },\n quote: fragment.text,\n };\n }),\n [document.fragments, document.kind, document.version, sessionId],\n );\n const displayedByFragment = new Map(\n displayedRegions.flatMap(({ ordinal, region }) =>\n region.anchor.kind === 'cell' || region.anchor.kind === 'slide-element'\n ? [[region.anchor.fragmentId, ordinal] as const]\n : [],\n ),\n );\n const cells = document.kind === 'csv' || document.kind === 'xlsx';\n const groups = new Map<string, DocumentFragment[]>();\n for (const fragment of document.fragments ?? []) {\n const key = cells\n ? document.kind === 'csv'\n ? fragment.location.split(',')[0]!\n : fragment.location.replace(/![A-Z]+(\\d+)$/, '!row $1')\n : fragment.location;\n const group = groups.get(key) ?? [];\n group.push(fragment);\n groups.set(key, group);\n }\n return (\n <div data-testid=\"author-structured\" className=\"min-h-0 flex-1 space-y-3 overflow-auto p-4\">\n {!cells ? <p className=\"text-xs text-doom-faint\">Slide text view, not a layout-faithful rendering.</p> : null}\n {[...groups].map(([location, fragments]) => (\n <section key={location} className=\"space-y-1\">\n <h3 className=\"text-xs text-doom-faint\">{location}</h3>\n <div className={cells ? 'flex gap-1' : 'space-y-2'}>\n {fragments.map((fragment) => (\n <div\n key={fragment.id}\n data-author-fragment={fragment.id}\n data-author-region={displayedByFragment.get(fragment.id)}\n className={`${cells ? 'w-40 shrink-0' : ''} relative rounded ${displayedByFragment.has(fragment.id) ? 'ring-1 ring-doom-yellow' : ''}`}\n >\n {displayedByFragment.has(fragment.id) ? (\n <span className=\"absolute -left-1 -top-1 z-10 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep\">\n {displayedByFragment.get(fragment.id)}\n </span>\n ) : null}\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={(event) => {\n const bounds = event.currentTarget.getBoundingClientRect();\n const slide = Number(fragment.location.match(/(?:slide\\s*|slides\\/slide)(\\d+)/)?.[1]);\n if (!cells && !Number.isSafeInteger(slide)) return;\n setAuthorRegionCandidate(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n quote: fragment.text,\n anchor: cells\n ? { kind: 'cell', fragmentId: fragment.id, location: fragment.location }\n : { kind: 'slide-element', fragmentId: fragment.id, location: fragment.location, slide },\n viewport: { width: bounds.width, height: bounds.height },\n createdAt: Date.now(),\n });\n }}\n >\n mark {fragment.location}\n </Button>\n <textarea\n aria-label={fragment.location}\n value={fragment.text}\n readOnly={fragment.readOnly === true}\n className=\"w-full rounded border border-doom-border bg-doom-deep p-2 text-sm text-doom-text\"\n onChange={(event) => reviseAuthorFragment(sessionId, document.path, fragment.id, event.target.value)}\n />\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import { CodeEditor, Markdown, type CodeEditorController } from '@agimon-ai/doompi-web-components';\nimport { useEffect, useRef } from 'react';\n\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n authorDocument,\n reviseAuthorDocument,\n setAuthorRegionCandidate,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\n\nexport function AuthorTextView({\n sessionId,\n document,\n preview,\n displayedRegions,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n preview: boolean;\n displayedRegions: readonly AuthorDisplayedRegion[];\n}) {\n const host = useRef<HTMLDivElement>(null);\n const editor = useRef<CodeEditorController>(null);\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n if (preview || editor.current === null) return undefined;\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const range = editor.current.resolveViewportRegion({\n left: originX + cell.rect.x * width,\n top: originY + cell.rect.y * height,\n right: originX + (cell.rect.x + cell.rect.width) * width,\n bottom: originY + (cell.rect.y + cell.rect.height) * height,\n });\n if (range === null || range.from === range.to) return undefined;\n return {\n anchor: {\n kind: 'text-range',\n startOffset: range.from,\n endOffset: range.to,\n startLine: range.startLine,\n endLine: range.endLine,\n },\n quote: range.text,\n };\n }),\n [preview, sessionId],\n );\n useEffect(() => {\n editor.current?.setMarkedRanges(\n displayedRegions.flatMap(({ ordinal, region }) =>\n region.anchor.kind === 'text-range'\n ? [{ from: region.anchor.startOffset, to: region.anchor.endOffset, label: String(ordinal) }]\n : [],\n ),\n );\n }, [displayedRegions]);\n return (\n <div ref={host} className=\"flex min-h-0 flex-1 flex-col\">\n {preview ? (\n <div data-testid=\"author-markdown\" className=\"min-h-0 flex-1 overflow-auto p-4 text-sm text-doom-text\">\n <Markdown text={document.content ?? ''} />\n </div>\n ) : (\n <CodeEditor\n value={document.content ?? ''}\n path={document.path}\n data-testid=\"author-editor\"\n controllerRef={editor}\n className=\"min-h-0 flex-1\"\n onChange={(content) => reviseAuthorDocument(sessionId, document.path, content)}\n onSelect={(range) => {\n const current = authorDocument(sessionId, document.path);\n const bounds = host.current?.getBoundingClientRect();\n if (!current || !bounds || range.from === range.to) return;\n setAuthorRegionCandidate(sessionId, {\n documentPath: current.path,\n revision: current.version,\n sourceSha256: current.sourceSha256,\n quote: range.text,\n anchor: {\n kind: 'text-range',\n startOffset: range.from,\n endOffset: range.to,\n startLine: range.startLine,\n endLine: range.endLine,\n },\n viewport: { width: bounds.width, height: bounds.height },\n createdAt: Date.now(),\n });\n }}\n />\n )}\n </div>\n );\n}\n","import type { FileLinkSource, TransientTab, WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState } from 'react';\n\nimport {\n authorPreviewActionSlot,\n type AuthorPreviewActionSource,\n type AuthorPreviewDisplayedAnnotation,\n} from '../../../../../types/authorPreview';\nimport { focusAuthorViewport } from '../_lib/authorBrowserBridge';\nimport { loadAuthorDocument, saveAuthorDocument } from '../_lib/authorFiles';\nimport { authorProfilesForDocument } from '../_lib/authorProfiles';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n authorDocumentKey,\n authorWorkspace,\n completeAuthorSave,\n failAuthorSave,\n focusAuthorDocument,\n normalizeAuthorPath,\n putAuthorDocument,\n releaseAuthorDocumentFocus,\n requestAuthorSave,\n setAuthorRegionCandidate,\n setAuthorStoryPreview,\n syncAuthorDocumentFocus,\n type AuthorSessionWorkspace,\n} from '../_lib/authorWorkspaceStore';\nimport { AuthorGridOverlay, autonomousVoiceGridVisible } from './AuthorGridOverlay';\nimport { AuthorMediaView } from './AuthorMediaView';\nimport { AuthorStructuredView } from './AuthorStructuredView';\nimport { AuthorTextView } from './AuthorTextView';\ninterface AuthorDocumentPanelProps extends WebPluginSlotProps {\n path: string;\n}\n\nfunction tabId(path: string): string {\n let hash = 2166136261;\n for (const char of normalizeAuthorPath(path)) hash = Math.imul(hash ^ char.charCodeAt(0), 16777619);\n return `author-file-${(hash >>> 0).toString(36)}`;\n}\n\nexport function displayedAuthorRegions(\n workspace: Pick<AuthorSessionWorkspace, 'regions' | 'requests'> | undefined,\n): readonly AuthorDisplayedRegion[] {\n const draftRegions = workspace?.regions ?? [];\n if (draftRegions.length > 0) return draftRegions.map((region, index) => ({ ordinal: index + 1, region }));\n const activeRequest = workspace?.requests\n .slice()\n .reverse()\n .find((request) => request.status === 'REQUESTED' || request.status === 'CHANGING');\n return (activeRequest?.pendingRegions ?? []).map((region) => ({\n ordinal: Math.max(1, (activeRequest?.regions.findIndex((original) => original.id === region.id) ?? 0) + 1),\n region,\n }));\n}\nexport function AuthorDocumentPanel(props: AuthorDocumentPanelProps) {\n if (!props.activeMinorModes?.includes('author')) {\n const fallback = props.fileTabFor(props.path);\n if (fallback !== undefined && fallback.id !== tabId(props.path)) {\n return <fallback.panel {...props} />;\n }\n return (\n <p data-testid=\"author-mode-inactive\" className=\"p-3 text-sm text-doom-dim\">\n No file viewer is available for this path.\n </p>\n );\n }\n return <ActiveAuthorDocumentPanel {...props} />;\n}\n\nfunction ActiveAuthorDocumentPanel(props: AuthorDocumentPanelProps) {\n const { path, sessionId, statuses } = props;\n const document = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.documents[authorDocumentKey(sessionId, path)],\n );\n const focusGeneration = useRef<number | undefined>(undefined);\n const workspace = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.sessions[sessionId],\n );\n const activeTool = workspace?.activeTool ?? 'select';\n const [markdownPreview, setMarkdownPreview] = useState(true);\n const [status, setStatus] = useState<string | undefined>();\n const [previewOpen, setPreviewOpen] = useState(false);\n const kind = document?.kind;\n const previewSource: AuthorPreviewActionSource | undefined =\n document === undefined\n ? undefined\n : {\n path: document.path,\n kind: document.kind,\n hasUnsavedChanges: document.version !== document.savedVersion,\n revision: document.savedVersion,\n sourceSha256: document.sourceSha256,\n };\n const previewAction =\n previewSource === undefined\n ? undefined\n : (props.slotData?.(authorPreviewActionSlot) ?? []).find(\n ({ data }) =>\n data.embeddedPanel !== undefined &&\n (data.supportsSource === undefined || data.supportsSource(previewSource)),\n );\n const PreviewPanel = previewAction?.data.embeddedPanel;\n useEffect(() => {\n if (document !== undefined || sessionId === null) return;\n const controller = new AbortController();\n setStatus('loading');\n void loadAuthorDocument(sessionId, path, controller.signal)\n .then((loaded) => {\n if (controller.signal.aborted) return;\n putAuthorDocument(sessionId, loaded);\n setStatus(undefined);\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted) setStatus(error instanceof Error ? error.message : String(error));\n });\n return () => controller.abort();\n }, [document, path, sessionId]);\n useEffect(() => {\n if (document === undefined || sessionId === null) return;\n const generation = focusAuthorDocument(sessionId, path, document.version, document.sourceSha256);\n focusGeneration.current = generation;\n return () => releaseAuthorDocumentFocus(sessionId, generation);\n }, [kind, document?.sourceSha256, path, sessionId]);\n useEffect(() => {\n const generation = focusGeneration.current;\n if (document === undefined || sessionId === null || generation === undefined) return;\n syncAuthorDocumentFocus(sessionId, generation, document.version, document.sourceSha256);\n }, [document?.sourceSha256, document?.version, sessionId]);\n useEffect(() => {\n if (kind === undefined || sessionId === null) return;\n const profiles = authorProfilesForDocument(sessionId, path, kind);\n let release: (() => void) | undefined;\n let cancelled = false;\n void focusAuthorViewport(sessionId, profiles).then((nextRelease) => {\n if (cancelled) nextRelease();\n else release = nextRelease;\n });\n return () => {\n cancelled = true;\n release?.();\n };\n }, [kind, path, sessionId]);\n if (document === undefined || sessionId === null) {\n return <p className=\"p-4 text-sm text-doom-faint\">{status ?? 'Loading document...'}</p>;\n }\n\n const save = async (): Promise<void> => {\n const savedVersion = document.version;\n const savedFragments = document.fragments;\n requestAuthorSave(sessionId, path);\n setStatus('saving');\n try {\n const sha256 = await saveAuthorDocument(sessionId, document);\n completeAuthorSave(sessionId, path, sha256, savedVersion, savedFragments);\n setStatus('saved');\n } catch (error) {\n failAuthorSave(sessionId, path, savedVersion);\n setStatus(error instanceof Error ? error.message : String(error));\n }\n };\n const gridVisible = autonomousVoiceGridVisible(statuses);\n const displayedRegions = displayedAuthorRegions(workspace);\n const displayedPreviewAnnotations: readonly AuthorPreviewDisplayedAnnotation[] =\n displayedRegions.flatMap<AuthorPreviewDisplayedAnnotation>(({ ordinal, region }) => {\n if (region.anchor.kind === 'story-preview-rect') {\n return [{ ordinal, mode: 'region' as const, point: region.anchor.rect, rect: region.anchor.rect }];\n }\n if (region.anchor.kind === 'story-preview-point') {\n return [{ ordinal, mode: 'point' as const, point: region.anchor.point }];\n }\n return [];\n });\n const textPanel = (\n <AuthorTextView\n sessionId={sessionId}\n document={document}\n preview={document.kind === 'markdown' && markdownPreview && activeTool === 'select' && !gridVisible}\n displayedRegions={displayedRegions}\n />\n );\n const sourcePanel =\n document.kind === 'text' || document.kind === 'markdown' || document.kind === 'story-preview' ? (\n textPanel\n ) : document.structuredFormat !== undefined ? (\n <AuthorStructuredView sessionId={sessionId} document={document} displayedRegions={displayedRegions} />\n ) : (\n <AuthorMediaView\n key={document.path}\n sessionId={sessionId}\n document={document}\n activeTool={activeTool}\n displayedRegions={displayedRegions}\n pendingCandidate={workspace?.candidate !== undefined}\n seekRequest={workspace?.videoSeekRequest}\n />\n );\n\n return (\n <section data-testid=\"author-document\" className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-center gap-2 border-b border-doom-border px-4 py-2\">\n <strong className=\"min-w-0 flex-1 truncate text-base text-doom-hi\">{document.title ?? document.path}</strong>\n {PreviewPanel !== undefined && previewSource !== undefined ? (\n <Button\n size=\"xs\"\n variant={previewOpen ? 'primary' : 'outline'}\n data-testid=\"author-story-preview-toggle\"\n aria-pressed={previewOpen}\n aria-label={previewOpen ? 'show story source' : 'show story preview'}\n onClick={() => setPreviewOpen(!previewOpen)}\n >\n {previewOpen ? 'Source' : 'Preview'}\n </Button>\n ) : null}\n {document.kind === 'markdown' ? (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n data-testid=\"author-markdown-toggle\"\n onClick={() => setMarkdownPreview(!markdownPreview)}\n >\n {markdownPreview ? 'edit' : 'preview'}\n </Button>\n ) : null}\n {document.kind === 'video' ? (\n <span className=\"text-base text-doom-dim\">Video feedback</span>\n ) : (\n <Button\n className=\"min-h-11 px-4 text-base\"\n variant=\"outline\"\n data-testid=\"author-save\"\n disabled={document.revisions.length === 0 || document.savingVersion !== undefined}\n onClick={() => void save()}\n >\n {previewOpen && previewSource?.hasUnsavedChanges ? 'Save & refresh' : 'Save'}\n </Button>\n )}\n </header>\n {status === undefined ? null : <output className=\"px-4 py-1 text-xs text-doom-faint\">{status}</output>}\n <div className=\"relative flex min-h-0 flex-1 overflow-hidden\">\n {previewOpen && PreviewPanel !== undefined && previewSource !== undefined ? (\n <PreviewPanel\n {...props}\n source={previewSource}\n activeTool={activeTool === 'crop' ? 'select' : activeTool}\n displayedAnnotations={displayedPreviewAnnotations}\n pendingCandidate={workspace?.candidate !== undefined}\n onAnnotationCandidate={(candidate) => {\n setAuthorStoryPreview(sessionId, document.path, candidate.preview);\n setAuthorRegionCandidate(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n mode: candidate.mode,\n anchor:\n candidate.mode === 'region' && candidate.rect !== undefined\n ? { kind: 'story-preview-rect', rect: candidate.rect, preview: candidate.preview }\n : { kind: 'story-preview-point', point: candidate.point, preview: candidate.preview },\n viewport: candidate.preview.viewport,\n evidence: candidate.evidence,\n thumbnailUrl: candidate.thumbnailUrl,\n createdAt: Date.now(),\n });\n }}\n />\n ) : (\n sourcePanel\n )}\n {previewOpen && PreviewPanel !== undefined && previewSource !== undefined ? null : (\n <AuthorGridOverlay sessionId={sessionId} document={document} visible={gridVisible} />\n )}\n </div>\n </section>\n );\n}\n\nexport function authorFileTab(path: string): TransientTab {\n const normalized = normalizeAuthorPath(path);\n return {\n id: tabId(normalized),\n label: normalized.split('/').at(-1) ?? normalized,\n retainComposer: true,\n panel: (props) => <AuthorDocumentPanel {...props} path={normalized} />,\n };\n}\n\nexport const authorFileLinks: FileLinkSource = {\n requiredMinorMode: 'author',\n subscribe(listener) {\n const subscription = authorWorkspace.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n fingerprint(sessionId) {\n if (sessionId === null) return '';\n const prefix = `${sessionId}\\n`;\n return Object.keys(authorWorkspace.store.state.documents)\n .filter((key) => key.startsWith(prefix))\n .sort()\n .join('\\n');\n },\n resolve(sessionId, path) {\n if (sessionId === null) return undefined;\n const normalized = normalizeAuthorPath(path.replace(/:\\d+(?::\\d+)?$/, ''));\n return authorWorkspace.store.state.documents[authorDocumentKey(sessionId, normalized)] === undefined\n ? undefined\n : authorFileTab(normalized);\n },\n openPath(sessionId, path) {\n if (sessionId === null) return undefined;\n const normalized = normalizeAuthorPath(path);\n return normalized === '' ? undefined : authorFileTab(normalized);\n },\n};\n","import { defineFileLinks } from '@agimon-ai/doompi-core/web';\n\nimport { authorFileLinks } from '../_components/AuthorDocumentPanel';\n\nexport default defineFileLinks({ ...authorFileLinks });\n","import { defineLeaderBinding } from '@agimon-ai/doompi-core/web';\nexport default defineLeaderBinding({\n id: 'author.toggle',\n path: [\n { key: 'o', label: 'other', detail: 'optional modes and tools' },\n { key: 'a', label: 'author', detail: 'enable or disable focused document authoring' },\n ],\n command: 'minor author',\n});\n","import type { AuthorAnnotationCandidate, AuthorAnnotationDraft, AuthorNativeAnchor } from './authorViewportTypes';\nimport {\n AUTHOR_REGION_LIMIT,\n authorWorkspace,\n hydrateAuthorAnnotationCollections,\n normalizeAuthorPath,\n type AuthorAnnotationHydrationRecord,\n} from './authorWorkspaceStore';\n\nexport const AUTHOR_ANNOTATION_DATABASE = 'doompi-author-annotations';\nexport const AUTHOR_ANNOTATION_RECORD_LIMIT = 100;\nexport const AUTHOR_ANNOTATION_EVIDENCE_BYTE_LIMIT = 8 * 1024 * 1024;\nconst STORE = 'documents';\nconst RECORD_VERSION = 1;\n\nexport interface AuthorAnnotationPersistenceRecord extends AuthorAnnotationHydrationRecord {\n key: string;\n version: typeof RECORD_VERSION;\n}\n\nexport interface AuthorAnnotationRepository {\n load(): Promise<readonly unknown[]>;\n replace(records: readonly AuthorAnnotationPersistenceRecord[]): Promise<void>;\n close(): Promise<void>;\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction point(value: unknown): boolean {\n return (\n object(value) && finite(value.x) && finite(value.y) && value.x >= 0 && value.x <= 1 && value.y >= 0 && value.y <= 1\n );\n}\n\nfunction rect(value: unknown): boolean {\n return (\n point(value) && object(value) && finite(value.width) && finite(value.height) && value.width > 0 && value.height > 0\n );\n}\n\nfunction validAnchor(value: unknown): value is AuthorNativeAnchor {\n if (!object(value) || typeof value.kind !== 'string') return false;\n switch (value.kind) {\n case 'text-range':\n return finite(value.startOffset) && finite(value.endOffset) && finite(value.startLine) && finite(value.endLine);\n case 'cell':\n return typeof value.fragmentId === 'string' && typeof value.location === 'string';\n case 'slide-element':\n return typeof value.fragmentId === 'string' && finite(value.slide) && typeof value.location === 'string';\n case 'image-rect':\n return rect(value.rect) && finite(value.naturalWidth) && finite(value.naturalHeight);\n case 'pdf-page-rect':\n return finite(value.page) && rect(value.rect);\n case 'video-time-rect':\n return finite(value.timeSeconds) && rect(value.rect);\n case 'story-preview-rect':\n return rect(value.rect) && object(value.preview);\n case 'image-point':\n return point(value.point) && finite(value.naturalWidth) && finite(value.naturalHeight);\n case 'pdf-page-point':\n return finite(value.page) && point(value.point);\n case 'video-time-point':\n return finite(value.timeSeconds) && point(value.point);\n case 'story-preview-point':\n return point(value.point) && object(value.preview);\n default:\n return false;\n }\n}\n\nfunction validEvidence(value: unknown): value is Blob | undefined {\n return (\n value === undefined ||\n (typeof Blob !== 'undefined' && value instanceof Blob && value.size <= AUTHOR_ANNOTATION_EVIDENCE_BYTE_LIMIT)\n );\n}\n\nfunction validCandidate(value: unknown): value is AuthorAnnotationCandidate {\n if (!object(value)) return false;\n return (\n typeof value.documentPath === 'string' &&\n normalizeAuthorPath(value.documentPath) !== '' &&\n finite(value.revision) &&\n (value.sourceSha256 === undefined || typeof value.sourceSha256 === 'string') &&\n (value.mode === undefined || value.mode === 'region' || value.mode === 'point') &&\n validAnchor(value.anchor) &&\n object(value.viewport) &&\n finite(value.viewport.width) &&\n finite(value.viewport.height) &&\n finite(value.createdAt) &&\n validEvidence(value.evidence)\n );\n}\n\nfunction validAnnotation(value: unknown): value is AuthorAnnotationDraft {\n return (\n validCandidate(value) &&\n object(value) &&\n typeof value.id === 'string' &&\n value.id !== '' &&\n typeof value.comment === 'string' &&\n value.comment.trim() !== '' &&\n (value.version === undefined || (Number.isInteger(value.version) && (value.version as number) >= 1))\n );\n}\n\nfunction utf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function validateAuthorAnnotationRecord(input: unknown): AuthorAnnotationPersistenceRecord | undefined {\n if (!object(input) || input.version !== RECORD_VERSION || typeof input.key !== 'string') return undefined;\n if (typeof input.sessionId !== 'string' || input.sessionId === '' || typeof input.documentPath !== 'string')\n return undefined;\n const path = normalizeAuthorPath(input.documentPath);\n if (path === '' || input.key !== `${input.sessionId}\\n${path}` || !object(input.collection)) return undefined;\n const collection = input.collection;\n if (\n !finite(collection.revision) ||\n (collection.sourceSha256 !== undefined && typeof collection.sourceSha256 !== 'string') ||\n typeof collection.stale !== 'boolean' ||\n typeof collection.candidateText !== 'string' ||\n utf8Length(collection.candidateText) > 2 * 1024 ||\n !Array.isArray(collection.annotations) ||\n collection.annotations.length > AUTHOR_REGION_LIMIT ||\n !collection.annotations.every(validAnnotation) ||\n (collection.candidate !== undefined && !validCandidate(collection.candidate)) ||\n !finite(collection.updatedAt)\n )\n return undefined;\n return input as unknown as AuthorAnnotationPersistenceRecord;\n}\n\nfunction durableCandidate<T extends AuthorAnnotationCandidate>(candidate: T): T {\n const { thumbnailUrl: _thumbnailUrl, ...durable } = candidate;\n return durable as T;\n}\n\nfunction persistenceRecords(): readonly AuthorAnnotationPersistenceRecord[] {\n const records: AuthorAnnotationPersistenceRecord[] = [];\n for (const [sessionId, session] of Object.entries(authorWorkspace.store.state.sessions)) {\n for (const [documentPath, collection] of Object.entries(session.annotationsByDocument)) {\n if (collection.annotations.length === 0 && collection.candidate === undefined && collection.candidateText === '')\n continue;\n records.push({\n key: `${sessionId}\\n${documentPath}`,\n version: RECORD_VERSION,\n sessionId,\n documentPath,\n collection: {\n ...collection,\n candidate: collection.candidate && durableCandidate(collection.candidate),\n annotations: collection.annotations.map(durableCandidate),\n },\n });\n }\n }\n return records\n .sort((a, b) => b.collection.updatedAt - a.collection.updatedAt)\n .slice(0, AUTHOR_ANNOTATION_RECORD_LIMIT);\n}\n\nexport class IndexedDbAuthorAnnotationRepository implements AuthorAnnotationRepository {\n readonly #database: Promise<IDBDatabase>;\n #writes: Promise<void> = Promise.resolve();\n\n constructor(factory: IDBFactory) {\n this.#database = new Promise((resolve, reject) => {\n const request = factory.open(AUTHOR_ANNOTATION_DATABASE, 1);\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(STORE))\n request.result.createObjectStore(STORE, { keyPath: 'key' });\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Unable to open Author annotation storage.'));\n });\n }\n\n async load(): Promise<readonly unknown[]> {\n const database = await this.#database;\n return await new Promise((resolve, reject) => {\n const request = database.transaction(STORE, 'readonly').objectStore(STORE).getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Unable to read Author annotations.'));\n });\n }\n\n replace(records: readonly AuthorAnnotationPersistenceRecord[]): Promise<void> {\n const write = async (): Promise<void> => {\n const database = await this.#database;\n await new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE, 'readwrite');\n const store = transaction.objectStore(STORE);\n store.clear();\n records.forEach((record) => store.put(record));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('Unable to write Author annotations.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('Author annotation write was aborted.'));\n });\n };\n this.#writes = this.#writes.catch(() => undefined).then(write);\n return this.#writes;\n }\n\n async close(): Promise<void> {\n try {\n await this.#writes;\n } finally {\n const database = await this.#database;\n database.close();\n }\n }\n}\n\nexport function startAuthorAnnotationPersistence(repository?: AuthorAnnotationRepository): () => Promise<void> {\n const factory = typeof indexedDB === 'undefined' ? undefined : indexedDB;\n if (repository === undefined && factory === undefined) return async () => undefined;\n const storage = repository ?? new IndexedDbAuthorAnnotationRepository(factory!);\n let stopped = false;\n let hydrated = false;\n let dirty = false;\n const subscription = authorWorkspace.store.subscribe(() => {\n if (!hydrated) dirty = true;\n else void storage.replace(persistenceRecords()).catch(() => undefined);\n });\n void storage\n .load()\n .then((values) => {\n if (stopped) return;\n const records = values\n .map(validateAuthorAnnotationRecord)\n .filter((record): record is AuthorAnnotationPersistenceRecord => record !== undefined)\n .sort((a, b) => b.collection.updatedAt - a.collection.updatedAt)\n .slice(0, AUTHOR_ANNOTATION_RECORD_LIMIT);\n hydrateAuthorAnnotationCollections(records);\n hydrated = true;\n if (dirty || records.length > 0) void storage.replace(persistenceRecords()).catch(() => undefined);\n })\n .catch(() => {\n if (stopped) return;\n hydrated = true;\n if (dirty) void storage.replace(persistenceRecords()).catch(() => undefined);\n });\n return async () => {\n stopped = true;\n subscription.unsubscribe();\n await storage.close();\n };\n}\n","import type { CaptureStatusEvent, ComposerSubmission } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorCapturePacket } from '../../_lib/authorCapture';\nimport type { AuthorRegionDraft } from '../../_lib/authorViewportTypes';\nimport {\n authorSessionWorkspace,\n putAuthorRequest,\n removeAuthorRegion,\n updateAuthorRequest,\n} from '../../_lib/authorWorkspaceStore';\n\nfunction capturePacket(content: string): AuthorCapturePacket | undefined {\n try {\n const value = JSON.parse(content) as Partial<AuthorCapturePacket>;\n if (\n value.version !== 1 ||\n typeof value.captureId !== 'string' ||\n typeof value.capturedAt !== 'number' ||\n typeof value.document?.path !== 'string' ||\n typeof value.document.revision !== 'number' ||\n !Array.isArray(value.regions) ||\n value.regions.length === 0\n ) {\n return undefined;\n }\n return value as AuthorCapturePacket;\n } catch {\n return undefined;\n }\n}\n\nexport function recordAuthorComposerSubmission(submission: ComposerSubmission): void {\n for (const item of submission.contextItems) {\n if (item.source !== 'author' || item.kind !== 'author-capture') continue;\n const packet = capturePacket(item.metadata ?? item.content);\n if (packet === undefined || packet.captureId !== item.id) continue;\n if (authorSessionWorkspace(submission.sessionId).requests.some((request) => request.captureId === packet.captureId))\n continue;\n const regions: AuthorRegionDraft[] = packet.regions.map((region) => ({\n id: region.id,\n documentPath: packet.document.path,\n revision: packet.document.revision,\n sourceSha256: packet.document.sourceSha256,\n comment: region.comment,\n version: region.version ?? 1,\n mode: region.mode,\n quote: region.quote,\n anchor: structuredClone(region.anchor),\n viewport: { ...region.viewport },\n voiceGrid: region.voiceGrid && { ...region.voiceGrid },\n createdAt: packet.capturedAt,\n }));\n putAuthorRequest(submission.sessionId, {\n id: crypto.randomUUID(),\n captureId: packet.captureId,\n documentPath: packet.document.path,\n requestText: submission.message,\n regions,\n pendingRegions: regions,\n status: 'REQUESTED',\n createdAt: submission.submittedAt,\n updatedAt: submission.submittedAt,\n revision: packet.document.revision,\n sourceSha256: packet.document.sourceSha256,\n });\n for (const region of packet.regions) {\n removeAuthorRegion(submission.sessionId, region.id, region.version ?? 1, packet.document.path);\n }\n }\n}\n\n/** Only the host's correlated execution events may settle a submitted capture. */\nexport function recordAuthorCaptureStatus(event: CaptureStatusEvent): void {\n const request = authorSessionWorkspace(event.sessionId).requests.find(\n (record) => record.captureId === event.captureId,\n );\n if (request === undefined || ['COMPLETE', 'FAILED', 'CANCELLED'].includes(request.status)) return;\n if (event.status === 'queued') return;\n updateAuthorRequest(event.sessionId, request.id, (record) => ({\n ...record,\n status: event.status === 'working' ? 'CHANGING' : event.status === 'completed' ? 'COMPLETE' : 'FAILED',\n currentOperation: event.status === 'working' ? 'Agent is working on this request' : undefined,\n pendingRegions: event.status === 'completed' ? [] : record.pendingRegions,\n error: event.status === 'error' ? event.error || 'Request execution failed.' : undefined,\n updatedAt: Date.now(),\n }));\n}\n","import type { WebPluginRuntime } from '@agimon-ai/doompi-core/web';\n\nimport { startAuthorAnnotationPersistence } from '../../_lib/authorAnnotationPersistence';\nimport { startAuthorBrowserBridge } from '../../_lib/authorBrowserBridge';\nimport { recordAuthorCaptureStatus, recordAuthorComposerSubmission } from './authorRequestLifecycle';\n\nexport function startAuthorBrowserLifecycle(runtime: WebPluginRuntime): () => Promise<void> {\n const stopBridge = startAuthorBrowserBridge(runtime);\n const stopPersistence = startAuthorAnnotationPersistence();\n const stopSubmissions = runtime.onComposerSubmitted?.(recordAuthorComposerSubmission) ?? (() => undefined);\n const stopCaptureStatus = runtime.onCaptureStatus?.(recordAuthorCaptureStatus) ?? (() => undefined);\n return async () => {\n stopSubmissions();\n stopCaptureStatus();\n stopBridge();\n await stopPersistence().catch(() => undefined);\n };\n}\n","import { defineWebLifecycle } from '@agimon-ai/doompi-core/web';\n\nimport { startAuthorBrowserLifecycle } from './_lib/authorBrowserLifecycle';\n\nexport default defineWebLifecycle(startAuthorBrowserLifecycle);\n","import { defineMinorModeFile } from '@agimon-ai/doompi-core/web';\nexport default defineMinorModeFile({ name: 'author', keys: 'o a', order: 45 });\n","import { defineSlotFile } from '@agimon-ai/doompi-core/web';\n\nimport { parseAuthorPreviewAction } from '../../../../../types/authorPreview';\n\n/** Typed data slot for preview launchers that need Author's focused source. */\nexport default defineSlotFile({\n slot: 'author.preview-action',\n parse: parseAuthorPreviewAction,\n});\n","import { defineSlotFile } from '@agimon-ai/doompi-core/web';\n\n/**\n * Optional preview providers render launch controls here. The provider owns its\n * transient tab and preview lifecycle; Author owns the surrounding mode and\n * composer submission surface.\n */\nexport default defineSlotFile({});\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-web-components';\n\nexport const describeAuthorToolsToolName = 'describe_author_tools';\n\n/** Lines the collapsed item shows before it expands. */\nexport const describeAuthorToolsCollapsedLines = 8;\n\nexport function describeAuthorToolsCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return '';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function describeAuthorToolsResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport {\n describeAuthorToolsCallSummary,\n describeAuthorToolsCollapsedLines,\n describeAuthorToolsResultLines,\n} from '../_lib/describeAuthorToolsToolRender';\n\n/**\n * The describe_author_tools tool's timeline item: Describe the current Author viewport capabilities. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function DescribeAuthorToolsToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = describeAuthorToolsResultLines(result);\n const collapsed = collapseLines(lines, describeAuthorToolsCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, describeAuthorToolsCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {describeAuthorToolsCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { DescribeAuthorToolsToolCard } from './_components/DescribeAuthorToolsToolCard';\n\nexport default defineToolRenderer({ tools: ['describe_author_tools'], message: DescribeAuthorToolsToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n Button,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport { authorFileTab } from '../../_components/AuthorDocumentPanel';\n\nexport function openAuthoringFileTab(\n path: string,\n openTransientTab: ToolMessageRenderProps['openTransientTab'],\n openTab: ToolMessageRenderProps['openTab'],\n): void {\n const tab = authorFileTab(path);\n openTransientTab(tab);\n openTab(tab.id);\n}\n\nexport function resultPath(result: ToolMessageRenderProps['result']): string | undefined {\n if (typeof result?.details !== 'object' || result.details === null || !('path' in result.details)) return undefined;\n return typeof result.details.path === 'string' ? result.details.path : undefined;\n}\n\nexport function OpenAuthoringFileToolCard({\n args,\n result,\n running,\n isError,\n output,\n openTransientTab,\n openTab,\n}: ToolMessageRenderProps) {\n const path = resultPath(result);\n const unavailable = !running && !isError && result !== null && path === undefined;\n const errorLines = isError\n ? (output ?? '')\n .trim()\n .split(/\\r?\\n/u)\n .filter(Boolean)\n .slice(0, 4)\n .map((text) => ({ text, tone: 'error' as const }))\n : [];\n const requestedPath = typeof args.path === 'string' ? args.path : 'document';\n return (\n <MessageItem tone={toolTone({ running, isError: isError || unavailable })}>\n {() => (\n <>\n <MessageItemHeader title=\"open_authoring_file\">\n <span data-testid=\"tool-call-open_authoring_file\" className=\"min-w-0 flex-1 truncate text-doom-text\">\n {requestedPath}\n </span>\n </MessageItemHeader>\n <MessageItemBody data-testid=\"tool-result-open_authoring_file\" className=\"flex flex-col gap-1\">\n {errorLines.length > 0 ? <MessageLines lines={errorLines} /> : null}\n <MessageItemStatus tone={isError || unavailable ? 'error' : running ? 'running' : undefined}>\n {isError\n ? 'failed'\n : running\n ? 'validating'\n : unavailable\n ? 'unavailable'\n : path === undefined\n ? 'waiting'\n : 'ready'}\n </MessageItemStatus>\n {!running && !isError && path !== undefined ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n data-testid=\"author-open-file\"\n onClick={() => openAuthoringFileTab(path, openTransientTab, openTab)}\n >\n open in Author\n </Button>\n ) : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { authorFileTab } from '../_components/AuthorDocumentPanel';\nimport { OpenAuthoringFileToolCard, resultPath } from './_components/OpenAuthoringFileToolCard';\n\nexport default defineToolRenderer({\n tools: ['open_authoring_file'],\n message: OpenAuthoringFileToolCard,\n completionTab: ({ result }) => {\n const path = resultPath(result);\n return path === undefined ? undefined : authorFileTab(path);\n },\n});\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-web-components';\n\nexport const useAuthorToolsToolName = 'use_author_tools';\n\n/** Lines the collapsed item shows before it expands. */\nexport const useAuthorToolsCollapsedLines = 8;\n\nexport function useAuthorToolsCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.name === 'string' ? args.name : '';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function useAuthorToolsResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport {\n useAuthorToolsCallSummary,\n useAuthorToolsCollapsedLines,\n useAuthorToolsResultLines,\n} from '../_lib/useAuthorToolsToolRender';\n\n/**\n * The use_author_tools tool's timeline item: Use one capability of the current Author viewport. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function UseAuthorToolsToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = useAuthorToolsResultLines(result);\n const collapsed = collapseLines(lines, useAuthorToolsCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, useAuthorToolsCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {useAuthorToolsCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { UseAuthorToolsToolCard } from './_components/UseAuthorToolsToolCard';\n\nexport default defineToolRenderer({ tools: ['use_author_tools'], message: UseAuthorToolsToolCard });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-core/web';\n\nimport channelAuthorWebmcp from '../src/extensions/workspaces/sessions/(frontend)/channel/author-webmcp.web';\nimport dockAuthoring from '../src/extensions/workspaces/sessions/(frontend)/dock/authoring.web';\nimport fileLinksAuthorDocument from '../src/extensions/workspaces/sessions/(frontend)/file-links/author-document.web';\nimport leaderAuthorToggle from '../src/extensions/workspaces/sessions/(frontend)/leader/author-toggle.web';\nimport lifecycleStart from '../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.web';\nimport modeAuthor from '../src/extensions/workspaces/sessions/(frontend)/mode/author/mode.web';\nimport slotPreviewAction from '../src/extensions/workspaces/sessions/(frontend)/slot/preview-action.web';\nimport slotPreviewProvider from '../src/extensions/workspaces/sessions/(frontend)/slot/preview-provider.web';\nimport toolDescribeAuthorTools from '../src/extensions/workspaces/sessions/(frontend)/tool/describe-author-tools.web';\nimport toolOpenAuthoringFile from '../src/extensions/workspaces/sessions/(frontend)/tool/open-authoring-file.web';\nimport toolUseAuthorTools from '../src/extensions/workspaces/sessions/(frontend)/tool/use-author-tools.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T => ({ ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'author',\n session: {\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'author_webmcp' }, channelAuthorWebmcp)]; },\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'authoring' }, dockAuthoring)]; },\n get fileLinks(): WebPluginContributions['fileLinks'] { return fileLinksAuthorDocument; },\n get leaderBindings(): WebPluginContributions['leaderBindings'] { return [via({ id: 'author.author-toggle' }, leaderAuthorToggle)]; },\n get minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'author' }, modeAuthor)]; },\n get slots(): WebPluginContributions['slots'] { return [via({ slot: 'author.preview-action' }, slotPreviewAction), via({ slot: 'author.preview-provider' }, slotPreviewProvider)]; },\n get start(): WebPluginContributions['start'] { return lifecycleStart; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['describe_author_tools'] }, toolDescribeAuthorTools), via({ tools: ['open_authoring_file'] }, toolOpenAuthoringFile), via({ tools: ['use_author_tools'] }, toolUseAuthorTools)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.mjs","names":["routes","channelAuthorWebmcp","dockAuthoring","fileLinksAuthorDocument","leaderAuthorToggle","modeAuthor","slotPreviewAction","slotPreviewProvider","lifecycleStart","toolDescribeAuthorTools","toolOpenAuthoringFile","toolUseAuthorTools"],"sources":["../../src/types/webAuthor.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorRuntime.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorBrowserBridge.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorGrid.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorWorkspaceStore.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/_lib/authorStore.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/author-webmcp.web.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorGridOverlay.tsx","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorCapture.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorRegionDrafts.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorRequestLog.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorToolPalette.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/authoring.web.tsx","../../src/types/authorPreview.ts","../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/types/authorApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorFiles.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorGridTools.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorProfiles.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorMedia.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorRegions.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorVideoControls.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorMediaView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorStructuredView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorTextView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/AuthorDocumentPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/file-links/author-document.web.ts","../../src/extensions/workspaces/sessions/(frontend)/leader/author-toggle.web.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorAnnotationPersistence.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/authorRequestLifecycle.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/_lib/authorBrowserLifecycle.ts","../../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.web.ts","../../src/extensions/workspaces/sessions/(frontend)/mode/author/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/preview-action.web.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/preview-provider.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/describeAuthorToolsToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/DescribeAuthorToolsToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/describe-author-tools.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/OpenAuthoringFileToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/open-authoring-file.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/useAuthorToolsToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/UseAuthorToolsToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/use-author-tools.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { AuthorViewportCapabilityDescriptor } from './author';\n\nexport const authorChannelType = 'author_webmcp';\n\nexport interface AuthorRegisterMessage {\n kind: 'register';\n generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n kind: 'release';\n generation: number;\n}\nexport interface AuthorCatalogMessage {\n kind: 'catalog';\n generation: number;\n ownerToken: string;\n tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n kind: 'result';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n kind: 'cancelled';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport type AuthorBrowserMessage =\n | AuthorRegisterMessage\n | AuthorReleaseMessage\n | AuthorCatalogMessage\n | AuthorResultMessage\n | AuthorCancelledMessage;\n\nexport interface AuthorAcceptedMessage {\n kind: 'accepted';\n generation: number;\n ownerToken: string;\n catalogToken?: string;\n leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n kind: 'request';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\nexport interface AuthorCancelMessage {\n kind: 'cancel';\n generation: number;\n ownerToken: string;\n catalogToken: string;\n requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n kind: 'rejected';\n reason: string;\n}\n\nexport type AuthorHubMessage =\n | AuthorAcceptedMessage\n | AuthorRequestMessage\n | AuthorCancelMessage\n | AuthorRejectedMessage;\n\nexport interface AuthorWebView {\n activation: 'inactive' | 'active';\n capabilityCount: number;\n}\n","import type {\n ModelContext,\n ModelContextAbortSignal,\n ModelContextToolDescriptor,\n WebPluginRuntime,\n} from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorTrustedProfile, AuthorTrustedTool } from './authorViewportTypes';\n\nexport const AUTHOR_RUNTIME_BINDING_IDS = {\n text: 'author.viewport.text',\n media: 'author.viewport.media',\n} as const;\n\ninterface ActiveCatalog {\n generation: number;\n controller: AbortController;\n profiles: ReadonlyMap<string, AuthorTrustedProfile>;\n}\n\nfunction assertProfile(profile: AuthorTrustedProfile): void {\n if (profile.id.trim() === '') throw new Error('Author profile id must not be empty');\n if (profile.tools.length > 15) throw new Error('Author profiles may expose at most 15 tools');\n const names = new Set<string>();\n for (const tool of profile.tools) {\n if (!/^[a-z][a-z0-9_]{0,29}$/.test(tool.name)) throw new Error(`Invalid Author tool name: ${tool.name}`);\n if (names.has(tool.name)) throw new Error(`Duplicate Author tool name: ${tool.name}`);\n names.add(tool.name);\n }\n}\n\nfunction descriptorMatches(actual: ModelContextToolDescriptor, expected: AuthorTrustedTool): boolean {\n return (\n actual.name === expected.name &&\n actual.description === expected.description &&\n JSON.stringify(actual.inputSchema) === JSON.stringify(expected.inputSchema)\n );\n}\n\nfunction staleError(): Error {\n return new Error('Author viewport catalog is stale');\n}\n\nfunction invocationSignal(\n catalogSignal: AbortSignal,\n requestSignal: ModelContextAbortSignal,\n): { signal: AbortSignal; release: () => void } {\n const controller = new AbortController();\n const abortCatalog = (): void => controller.abort(catalogSignal.reason);\n const abortRequest = (): void => controller.abort(requestSignal.reason);\n if (catalogSignal.aborted) abortCatalog();\n else if (requestSignal.aborted) abortRequest();\n else {\n catalogSignal.addEventListener('abort', abortCatalog, { once: true });\n requestSignal.addEventListener('abort', abortRequest, { once: true });\n }\n return {\n signal: controller.signal,\n release: () => {\n catalogSignal.removeEventListener('abort', abortCatalog);\n requestSignal.removeEventListener('abort', abortRequest);\n },\n };\n}\n\n/** Owns page-lifetime WebMCP registrations. Profiles are replaced as one abortable catalog. */\nexport class AuthorRuntime {\n readonly #runtime: WebPluginRuntime;\n #context: ModelContext | undefined;\n #active: ActiveCatalog | undefined;\n #pending: ActiveCatalog | undefined;\n #generation = 0;\n #disposed = false;\n\n constructor(runtime: WebPluginRuntime) {\n this.#runtime = runtime;\n }\n\n async replaceProfiles(profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {\n if (this.#disposed) throw new Error('Author runtime is disposed');\n for (const profile of profiles) assertProfile(profile);\n const profileMap = new Map(profiles.map((profile) => [profile.id, profile]));\n const tools = profiles.flatMap((profile) => profile.tools);\n if (new Set(tools.map((tool) => tool.name)).size !== tools.length) {\n throw new Error('Author tool names must be unique across trusted profiles');\n }\n\n const context = this.#context ?? (await this.#runtime.acquireModelContext?.())?.modelContext;\n if (context === undefined) throw new Error('Model Context is unavailable');\n this.#context = context;\n const generation = ++this.#generation;\n const controller = new AbortController();\n const candidate: ActiveCatalog = { generation, controller, profiles: profileMap };\n const inactive = staleError();\n this.#pending?.controller.abort(inactive);\n this.#active?.controller.abort(inactive);\n this.#pending = candidate;\n this.#active = undefined;\n const assertCurrent = (): void => {\n if (controller.signal.aborted || this.#disposed || this.#active?.generation !== generation) throw staleError();\n };\n\n try {\n await Promise.all(\n tools.map(async (tool) =>\n context.registerTool(\n {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (input, options) => {\n assertCurrent();\n const parsed: unknown = JSON.parse(input);\n assertCurrent();\n const invocation = invocationSignal(controller.signal, options.signal);\n try {\n const result = await tool.execute(parsed, invocation.signal);\n assertCurrent();\n return result;\n } finally {\n invocation.release();\n }\n },\n },\n { signal: controller.signal },\n ),\n ),\n );\n const registered = await context.getTools();\n if (!tools.every((tool) => registered.some((descriptor) => descriptorMatches(descriptor, tool)))) {\n throw new Error('Model Context did not confirm the Author catalog');\n }\n if (this.#disposed || generation !== this.#generation || this.#pending !== candidate) throw staleError();\n this.#pending = undefined;\n this.#active = candidate;\n } catch (error) {\n controller.abort(error);\n if (this.#pending === candidate) this.#pending = undefined;\n throw error;\n }\n\n return () => {\n if (this.#active?.generation !== generation) return;\n controller.abort(staleError());\n this.#active = undefined;\n this.#generation += 1;\n };\n }\n\n async execute(name: string, input: unknown, signal: AbortSignal): Promise<unknown> {\n const context = this.#context;\n if (context === undefined || this.#active === undefined) throw new Error('Author catalog is not registered');\n return context.executeTool(name, JSON.stringify(input), { signal });\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n this.#generation += 1;\n this.#pending?.controller.abort(new Error('Author runtime disposed'));\n this.#active?.controller.abort(new Error('Author runtime disposed'));\n this.#pending = undefined;\n this.#active = undefined;\n }\n}\n","import type { WebPluginRuntime } from '@agimon-ai/doompi-core/web';\nimport { Store } from '@tanstack/store';\n\nimport type { AuthorBrowserMessage, AuthorHubMessage } from '../../../../../types/webAuthor';\nimport { AuthorRuntime } from './authorRuntime';\nimport type { AuthorTrustedProfile } from './authorViewportTypes';\n\ninterface ActiveViewport {\n sessionId: string;\n generation: number;\n profiles: readonly AuthorTrustedProfile[];\n release: () => void;\n ownerToken?: string;\n catalogToken?: string;\n}\n\nclass AuthorBrowserBridge {\n readonly #host: WebPluginRuntime;\n readonly #runtime: AuthorRuntime;\n readonly #pending = new Map<string, AbortController>();\n #active: ActiveViewport | undefined;\n #generation = 0;\n #disposed = false;\n readonly #releaseConnected: () => void;\n #leaseTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(host: WebPluginRuntime) {\n this.#host = host;\n this.#runtime = new AuthorRuntime(host);\n this.#releaseConnected = host.onHubConnected(() => {\n if (this.#active !== undefined) {\n this.#active.ownerToken = undefined;\n this.#active.catalogToken = undefined;\n }\n this.#register();\n });\n }\n\n async focus(sessionId: string, profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {\n if (this.#disposed) throw new Error('Author browser bridge is disposed');\n const generation = ++this.#generation;\n const release = await this.#runtime.replaceProfiles(profiles);\n if (this.#disposed || generation !== this.#generation) {\n release();\n return () => undefined;\n }\n this.#clearActive();\n this.#active = { sessionId, generation, profiles, release };\n this.#register();\n return () => {\n if (this.#active?.generation !== generation) return;\n this.#clearActive();\n this.#generation += 1;\n };\n }\n\n drop(sessionId: string): void {\n if (this.#active?.sessionId !== sessionId) return;\n this.#clearActive();\n this.#generation += 1;\n }\n\n apply(sessionId: string, message: AuthorHubMessage): void {\n const active = this.#active;\n if (active === undefined || active.sessionId !== sessionId || message.kind === 'rejected') return;\n if (\n message.generation !== active.generation ||\n (message.ownerToken !== active.ownerToken && active.ownerToken !== undefined)\n )\n return;\n if (message.kind === 'accepted') {\n active.ownerToken = message.ownerToken;\n clearTimeout(this.#leaseTimer);\n this.#leaseTimer = setTimeout(() => this.#register(), Math.max(1000, Math.floor(message.leaseMs / 2)));\n if (message.catalogToken === undefined) this.#sendCatalog(active);\n else active.catalogToken = message.catalogToken;\n return;\n }\n if (message.catalogToken !== active.catalogToken) return;\n if (message.kind === 'cancel') {\n this.#pending.get(message.requestId)?.abort(new Error('Author tool request cancelled'));\n return;\n }\n if (message.kind !== 'request' || this.#pending.has(message.requestId)) return;\n const controller = new AbortController();\n this.#pending.set(message.requestId, controller);\n void this.#runtime\n .execute(message.name, message.arguments, controller.signal)\n .then((result) => {\n if (!this.#current(active, message.requestId, controller)) return;\n if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);\n else\n this.#send(active.sessionId, {\n kind: 'result',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId: message.requestId,\n result,\n });\n })\n .catch((error: unknown) => {\n if (!this.#current(active, message.requestId, controller)) return;\n if (controller.signal.aborted) this.#sendCancelled(active, message.requestId);\n else {\n const messageText = error instanceof Error ? error.message : String(error);\n const code = /^([A-Z][A-Z_]+):/u.exec(messageText)?.[1] ?? 'AUTHOR_TOOL_ERROR';\n this.#send(active.sessionId, {\n kind: 'result',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId: message.requestId,\n result: { error: { code, message: messageText } },\n });\n }\n })\n .finally(() => {\n if (this.#pending.get(message.requestId) === controller) this.#pending.delete(message.requestId);\n });\n }\n\n activeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n const active = this.#active;\n return active?.sessionId === sessionId && active.catalogToken !== undefined\n ? {\n activation: 'active',\n capabilityCount: active.profiles.reduce((count, profile) => count + profile.tools.length, 0),\n }\n : { activation: 'inactive', capabilityCount: 0 };\n }\n\n dispose(): void {\n if (this.#disposed) return;\n this.#disposed = true;\n clearTimeout(this.#leaseTimer);\n this.#releaseConnected();\n this.#clearActive();\n this.#runtime.dispose();\n }\n\n #register(): void {\n const active = this.#active;\n if (active !== undefined) this.#send(active.sessionId, { kind: 'register', generation: active.generation });\n }\n\n #sendCatalog(active: ActiveViewport): void {\n this.#send(active.sessionId, {\n kind: 'catalog',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n tools: active.profiles.flatMap((profile) =>\n profile.tools.map((tool) => ({\n name: tool.name,\n label: tool.label ?? tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n })),\n ),\n });\n }\n\n #sendCancelled(active: ActiveViewport, requestId: string): void {\n this.#send(active.sessionId, {\n kind: 'cancelled',\n generation: active.generation,\n ownerToken: active.ownerToken!,\n catalogToken: active.catalogToken!,\n requestId,\n });\n }\n\n #send(sessionId: string, payload: AuthorBrowserMessage): void {\n const workspaceId = this.#host.mount?.scope === 'session' ? this.#host.mount.workspaceId : undefined;\n const mount = workspaceId ? { scope: 'workspace' as const, workspaceId } : { scope: 'global' as const };\n void this.#host\n .invokeServerMethod({ mount, service: 'author.bridge', method: 'send', input: { sessionId, message: payload } })\n .catch(() => undefined);\n }\n\n #current(active: ActiveViewport, requestId: string, controller: AbortController): boolean {\n return this.#active === active && this.#pending.get(requestId) === controller;\n }\n\n #clearActive(): void {\n clearTimeout(this.#leaseTimer);\n this.#leaseTimer = undefined;\n const active = this.#active;\n if (active !== undefined) {\n this.#send(active.sessionId, { kind: 'release', generation: active.generation });\n active.release();\n }\n this.#active = undefined;\n for (const controller of this.#pending.values()) controller.abort(new Error('Author viewport changed'));\n this.#pending.clear();\n }\n}\n\nconst authorBridgeRuntime = new Store<AuthorBrowserBridge | undefined>(undefined);\n\nexport function startAuthorBrowserBridge(runtime: WebPluginRuntime): () => void {\n authorBridgeRuntime.state?.dispose();\n const next = new AuthorBrowserBridge(runtime);\n authorBridgeRuntime.setState(() => next);\n return () => {\n if (authorBridgeRuntime.state !== next) return;\n next.dispose();\n authorBridgeRuntime.setState(() => undefined);\n };\n}\n\nexport async function focusAuthorViewport(\n sessionId: string,\n profiles: readonly AuthorTrustedProfile[],\n): Promise<() => void> {\n return (await authorBridgeRuntime.state?.focus(sessionId, profiles)) ?? (() => undefined);\n}\n\nexport function applyAuthorHubMessage(sessionId: string, message: AuthorHubMessage): void {\n authorBridgeRuntime.state?.apply(sessionId, message);\n}\n\nexport function dropAuthorViewportSession(sessionId: string): void {\n authorBridgeRuntime.state?.drop(sessionId);\n}\n\nexport function authorBridgeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n return authorBridgeRuntime.state?.activeView(sessionId) ?? { activation: 'inactive', capabilityCount: 0 };\n}\n","import { defineGlobalStore } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorNativeAnchor, AuthorVoiceGridEvidence, AuthorViewportSnapshot } from './authorViewportTypes';\n\nexport const AUTHOR_GRID_COLUMNS = 'ABCDEFGH' as const;\nexport const AUTHOR_GRID_SIZE = 8;\n\nexport interface AuthorGridGeometry {\n documentPath: string;\n revision: number;\n sourceSha256?: string;\n geometryToken: string;\n snapshotId: string;\n viewport: AuthorViewportSnapshot;\n updatedAt: number;\n}\n\ninterface AuthorGridState {\n sessions: Readonly<Record<string, AuthorGridGeometry>>;\n}\n\nexport interface AuthorGridCellResolution {\n cell: string;\n column: number;\n row: number;\n rect: { x: number; y: number; width: number; height: number };\n center: { x: number; y: number };\n evidence: AuthorVoiceGridEvidence;\n}\n\nexport interface AuthorGridNativeResolution {\n anchor: AuthorNativeAnchor;\n quote?: string;\n}\n\ntype AuthorGridNativeResolver = (\n cell: AuthorGridCellResolution,\n geometry: AuthorGridGeometry,\n) => AuthorGridNativeResolution | undefined;\n\nconst nativeResolvers = new Map<string, AuthorGridNativeResolver>();\n\nexport const authorGrid = defineGlobalStore<AuthorGridState>({ sessions: {} });\n\nexport function parseAuthorGridCell(cell: string): { cell: string; column: number; row: number } {\n const normalized = cell.trim().toUpperCase();\n if (!/^[A-H][1-8]$/u.test(normalized)) throw new Error(`Invalid Author grid cell '${cell}'. Expected A1 through H8.`);\n return {\n cell: normalized,\n column: AUTHOR_GRID_COLUMNS.indexOf(normalized[0] as (typeof AUTHOR_GRID_COLUMNS)[number]),\n row: Number(normalized[1]) - 1,\n };\n}\n\nexport function updateAuthorGridGeometry(\n sessionId: string,\n input: Omit<AuthorGridGeometry, 'geometryToken' | 'snapshotId' | 'updatedAt'>,\n): AuthorGridGeometry {\n const previous = authorGrid.store.state.sessions[sessionId];\n const geometry: AuthorGridGeometry = {\n ...input,\n geometryToken: crypto.randomUUID(),\n snapshotId:\n previous?.documentPath === input.documentPath &&\n previous.revision === input.revision &&\n previous.sourceSha256 === input.sourceSha256\n ? previous.snapshotId\n : crypto.randomUUID(),\n updatedAt: Date.now(),\n };\n authorGrid.update((state) => ({ ...state, sessions: { ...state.sessions, [sessionId]: geometry } }));\n return geometry;\n}\n\nexport function authorGridGeometry(sessionId: string): AuthorGridGeometry | undefined {\n return authorGrid.store.state.sessions[sessionId];\n}\n\nexport function clearAuthorGridGeometry(sessionId: string): void {\n authorGrid.update((state) => {\n if (state.sessions[sessionId] === undefined) return state;\n const sessions = { ...state.sessions };\n delete sessions[sessionId];\n return { ...state, sessions };\n });\n}\n\nexport function registerAuthorGridResolver(sessionId: string, resolver: AuthorGridNativeResolver): () => void {\n nativeResolvers.set(sessionId, resolver);\n return () => {\n if (nativeResolvers.get(sessionId) === resolver) nativeResolvers.delete(sessionId);\n };\n}\n\nexport function resolveAuthorGridNativeAnchor(\n sessionId: string,\n cell: AuthorGridCellResolution,\n): AuthorGridNativeResolution {\n const geometry = authorGridGeometry(sessionId);\n const resolved = geometry === undefined ? undefined : nativeResolvers.get(sessionId)?.(cell, geometry);\n if (resolved === undefined)\n throw new Error('AMBIGUOUS_GRID: The grid cell does not resolve to one visible native document target.');\n return resolved;\n}\n\nexport function resolveAuthorGridCell(\n sessionId: string,\n cell: string,\n expectedGeometryToken: string,\n): AuthorGridCellResolution {\n const geometry = authorGridGeometry(sessionId);\n if (geometry === undefined || geometry.geometryToken !== expectedGeometryToken) {\n throw new Error('STALE_GRID: The Author grid geometry changed. Describe the grid again.');\n }\n const parsed = parseAuthorGridCell(cell);\n const width = 1 / AUTHOR_GRID_SIZE;\n const height = 1 / AUTHOR_GRID_SIZE;\n const rect = { x: parsed.column * width, y: parsed.row * height, width, height };\n return {\n ...parsed,\n rect,\n center: { x: rect.x + width / 2, y: rect.y + height / 2 },\n evidence: { cell: parsed.cell, geometryToken: geometry.geometryToken, snapshotId: geometry.snapshotId },\n };\n}\n","import { defineGlobalStore } from '@agimon-ai/doompi-core/web';\n\nimport type {\n AuthorAnnotation,\n AuthorAnnotationCandidate,\n AuthorAnnotationDraft,\n AuthorCrop,\n AuthorDocumentInput,\n AuthorDraftRevision,\n AuthorFocusedDocument,\n AuthorRegionCandidate,\n AuthorRegionDraft,\n AuthorRequestRecord,\n AuthorRequestStatus,\n AuthorToolMode,\n} from './authorViewportTypes';\n\nexport const AUTHOR_REGION_LIMIT = 16;\nexport const AUTHOR_HISTORY_RECORD_LIMIT = 100;\nexport const AUTHOR_HISTORY_BYTE_LIMIT = 512 * 1024;\nconst TERMINAL_REQUEST_STATUSES: ReadonlySet<AuthorRequestStatus> = new Set(['COMPLETE', 'FAILED', 'CANCELLED']);\n\nexport interface AuthorWorkspaceDocument extends AuthorDocumentInput {\n path: string;\n annotations: readonly AuthorAnnotation[];\n revisions: readonly AuthorDraftRevision[];\n crop?: AuthorCrop;\n saveRequest: number;\n version: number;\n savedVersion: number;\n savingVersion?: number;\n}\n\nexport interface AuthorDocumentAnnotationCollection {\n revision: number;\n sourceSha256?: string;\n stale: boolean;\n candidate?: AuthorAnnotationCandidate;\n candidateText: string;\n annotations: readonly AuthorAnnotationDraft[];\n updatedAt: number;\n}\n\nexport interface AuthorSessionWorkspace {\n generation: number;\n focusedDocument?: AuthorFocusedDocument;\n activeTool: AuthorToolMode;\n annotationsByDocument: Readonly<Record<string, AuthorDocumentAnnotationCollection>>;\n /** Mixed annotations for the focused document. */\n annotations: readonly AuthorAnnotationDraft[];\n candidate?: AuthorRegionCandidate;\n candidateText: string;\n videoSeekRequest?: { path: string; generation: number; timeSeconds: number; sequence: number };\n /** Compatibility alias for annotations while region-only consumers migrate. */\n regions: readonly AuthorRegionDraft[];\n requests: readonly AuthorRequestRecord[];\n}\n\nexport interface AuthorWorkspaceState {\n documents: Readonly<Record<string, AuthorWorkspaceDocument>>;\n sessions: Readonly<Record<string, AuthorSessionWorkspace>>;\n}\n\nconst EMPTY_SESSION: AuthorSessionWorkspace = {\n generation: 0,\n activeTool: 'select',\n annotationsByDocument: {},\n annotations: [],\n candidateText: '',\n regions: [],\n requests: [],\n};\n\nexport function normalizeAuthorPath(path: string): string {\n const parts: string[] = [];\n for (const part of path.trim().replaceAll('\\\\', '/').split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') parts.pop();\n else parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function authorDocumentKey(sessionId: string, path: string): string {\n return `${sessionId}\\n${normalizeAuthorPath(path)}`;\n}\n\nexport const authorWorkspace = defineGlobalStore<AuthorWorkspaceState>({ documents: {}, sessions: {} });\n\nexport function authorDocument(sessionId: string | null, path: string): AuthorWorkspaceDocument | undefined {\n if (sessionId === null) return undefined;\n return authorWorkspace.store.state.documents[authorDocumentKey(sessionId, path)];\n}\n\nexport function authorSessionWorkspace(sessionId: string | null): AuthorSessionWorkspace {\n if (sessionId === null) return EMPTY_SESSION;\n return authorWorkspace.store.state.sessions[sessionId] ?? EMPTY_SESSION;\n}\n\nexport function authorDocumentAnnotations(\n sessionId: string | null,\n path: string,\n): AuthorDocumentAnnotationCollection | undefined {\n return sessionId === null\n ? undefined\n : authorWorkspace.store.state.sessions[sessionId]?.annotationsByDocument[normalizeAuthorPath(path)];\n}\n\nexport interface AuthorAnnotationHydrationRecord {\n sessionId: string;\n documentPath: string;\n collection: AuthorDocumentAnnotationCollection;\n}\n\nexport function hydrateAuthorAnnotationCollections(records: readonly AuthorAnnotationHydrationRecord[]): void {\n authorWorkspace.update((state) => {\n let sessions = state.sessions;\n for (const record of records) {\n const path = normalizeAuthorPath(record.documentPath);\n if (path === '') continue;\n const session = sessions[record.sessionId] ?? EMPTY_SESSION;\n const previous = session.annotationsByDocument[path];\n if (previous !== undefined && previous.updatedAt >= record.collection.updatedAt) continue;\n const document = state.documents[authorDocumentKey(record.sessionId, path)];\n const stale =\n record.collection.stale ||\n (document !== undefined &&\n (document.version !== record.collection.revision ||\n document.sourceSha256 !== record.collection.sourceSha256));\n const collection = restoreCollectionEvidence({ ...record.collection, stale });\n const focused = session.focusedDocument;\n const visible = focused?.path === path && !stale;\n const annotations = visible ? collection.annotations : session.annotations;\n sessions = {\n ...sessions,\n [record.sessionId]: {\n ...session,\n annotationsByDocument: { ...session.annotationsByDocument, [path]: collection },\n ...(visible\n ? {\n annotations,\n regions: annotations,\n candidate: collection.candidate,\n candidateText: collection.candidateText,\n }\n : {}),\n },\n };\n }\n return sessions === state.sessions ? state : { ...state, sessions };\n });\n}\n\nexport function putAuthorDocument(sessionId: string, input: AuthorDocumentInput): AuthorWorkspaceDocument {\n const path = normalizeAuthorPath(input.path);\n if (path === '') throw new Error('Author document path must not be empty');\n const key = authorDocumentKey(sessionId, path);\n const staleThumbnails: string[] = [];\n let result!: AuthorWorkspaceDocument;\n authorWorkspace.update((state) => {\n const previous = state.documents[key];\n const sourceChanged =\n previous?.sourceSha256 !== undefined &&\n input.sourceSha256 !== undefined &&\n previous.sourceSha256 !== input.sourceSha256;\n const baselineVersion = sourceChanged ? previous.version + 1 : (previous?.version ?? 0);\n result = {\n ...input,\n path,\n annotations: sourceChanged ? [] : (previous?.annotations ?? []),\n revisions: sourceChanged ? [] : (previous?.revisions ?? []),\n saveRequest: previous?.saveRequest ?? 0,\n version: baselineVersion,\n savedVersion: sourceChanged ? baselineVersion : (previous?.savedVersion ?? 0),\n ...(sourceChanged || previous?.crop === undefined ? {} : { crop: previous.crop }),\n };\n const session = state.sessions[sessionId];\n let sessions = state.sessions;\n if (sourceChanged && session?.focusedDocument?.path === path) {\n staleThumbnails.push(\n ...(session.candidate?.thumbnailUrl === undefined ? [] : [session.candidate.thumbnailUrl]),\n ...session.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n const now = Date.now();\n const generation = session.generation + 1;\n const staleCollection = staleAuthorCollection(session.annotationsByDocument[path], now);\n sessions = {\n ...sessions,\n [sessionId]: {\n ...session,\n generation,\n focusedDocument: {\n path,\n generation,\n revision: baselineVersion,\n sourceSha256: input.sourceSha256,\n focusedAt: now,\n },\n annotationsByDocument: {\n ...session.annotationsByDocument,\n ...(staleCollection && { [path]: staleCollection }),\n },\n annotations: [],\n regions: [],\n candidate: undefined,\n candidateText: '',\n requests: session.requests.map((request) =>\n input.kind !== 'story-preview' &&\n request.documentPath === path &&\n (request.status === 'REQUESTED' || request.status === 'CHANGING' || request.status === 'CHANGED')\n ? {\n ...request,\n status: 'FAILED',\n currentOperation: undefined,\n error: 'The document source changed before the request completed.',\n updatedAt: now,\n }\n : request,\n ),\n },\n };\n } else if (sourceChanged && session?.annotationsByDocument[path] !== undefined) {\n const collection = session.annotationsByDocument[path];\n if (collection.candidate?.thumbnailUrl !== undefined) staleThumbnails.push(collection.candidate.thumbnailUrl);\n staleThumbnails.push(\n ...collection.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n sessions = {\n ...sessions,\n [sessionId]: {\n ...session,\n annotationsByDocument: {\n ...session.annotationsByDocument,\n [path]: staleAuthorCollection(collection, Date.now())!,\n },\n },\n };\n }\n return { documents: { ...state.documents, [key]: result }, sessions };\n });\n staleThumbnails.forEach(revokeThumbnail);\n return result;\n}\n\n/** Claims focus and returns a generation token that makes cleanup race-safe. */\nexport function focusAuthorDocument(sessionId: string, path: string, revision: number, sourceSha256?: string): number {\n const normalized = normalizeAuthorPath(path);\n let generation = 0;\n authorWorkspace.update((state) => {\n const session = state.sessions[sessionId] ?? EMPTY_SESSION;\n generation = session.generation + 1;\n const stored = session.annotationsByDocument[normalized];\n const current =\n stored !== undefined && stored.revision === revision && stored.sourceSha256 === sourceSha256 && !stored.stale\n ? stored\n : undefined;\n const annotations = current?.annotations ?? [];\n return {\n ...state,\n sessions: {\n ...state.sessions,\n [sessionId]: {\n ...session,\n generation,\n focusedDocument: {\n path: normalized,\n generation,\n revision,\n sourceSha256,\n focusedAt: Date.now(),\n },\n annotations,\n regions: annotations,\n candidate: current?.candidate,\n candidateText: current?.candidateText ?? '',\n },\n },\n };\n });\n return generation;\n}\n\nexport function syncAuthorDocumentFocus(\n sessionId: string,\n generation: number,\n revision: number,\n sourceSha256?: string,\n): void {\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.generation !== generation) return session;\n if (focused.revision === revision && focused.sourceSha256 === sourceSha256) return session;\n return { ...session, focusedDocument: { ...focused, revision, sourceSha256 } };\n });\n}\n\nexport function releaseAuthorDocumentFocus(sessionId: string, generation: number): void {\n updateSession(sessionId, (session) => {\n if (session.focusedDocument?.generation !== generation) return session;\n return {\n ...session,\n focusedDocument: undefined,\n candidate: undefined,\n candidateText: '',\n annotations: [],\n regions: [],\n };\n });\n}\n\nexport function seekAuthorVideo(sessionId: string, timeSeconds: number): boolean {\n const workspace = authorSessionWorkspace(sessionId);\n const focused = workspace.focusedDocument;\n if (\n !focused ||\n workspace.candidate ||\n !Number.isFinite(timeSeconds) ||\n timeSeconds < 0 ||\n authorDocument(sessionId, focused.path)?.kind !== 'video'\n )\n return false;\n updateSession(sessionId, (session) => ({\n ...session,\n activeTool: 'select',\n videoSeekRequest: {\n path: focused.path,\n generation: focused.generation,\n timeSeconds,\n sequence: (session.videoSeekRequest?.sequence ?? 0) + 1,\n },\n }));\n return true;\n}\n\nexport function setAuthorToolMode(sessionId: string, activeTool: AuthorToolMode): void {\n updateSession(sessionId, (session) => (session.activeTool === activeTool ? session : { ...session, activeTool }));\n}\n\nexport function setAuthorRegionCandidate(sessionId: string, candidate: AuthorRegionCandidate | undefined): void {\n let staleThumbnail: string | undefined;\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (candidate !== undefined) {\n if (focused === undefined || focused.path !== normalizeAuthorPath(candidate.documentPath)) {\n throw new Error('The Author selection does not belong to the focused document.');\n }\n if (focused.revision !== candidate.revision || focused.sourceSha256 !== candidate.sourceSha256) {\n throw new Error('The Author selection is stale for the focused document.');\n }\n }\n if (focused === undefined) return session;\n staleThumbnail = session.candidate?.thumbnailUrl;\n const copied = candidate === undefined ? undefined : copyCandidate(candidate);\n return withFocusedCollection({ ...session, candidate: copied }, focused.path, { candidate: copied });\n });\n if (staleThumbnail !== undefined && staleThumbnail !== candidate?.thumbnailUrl) revokeThumbnail(staleThumbnail);\n}\n\nexport const setAuthorAnnotationCandidate = setAuthorRegionCandidate;\n\nexport function setAuthorCandidateText(sessionId: string, candidateText: string): void {\n if (new TextEncoder().encode(candidateText).byteLength > 2 * 1024)\n throw new Error('Author candidate text must not exceed 2 KiB.');\n updateSession(sessionId, (session) => {\n const path = session.focusedDocument?.path;\n return path === undefined ? session : withFocusedCollection({ ...session, candidateText }, path, { candidateText });\n });\n}\n\nexport function commitAuthorRegion(sessionId: string, comment: string): string {\n const id = crypto.randomUUID();\n const session = authorSessionWorkspace(sessionId);\n if (session.candidate === undefined) throw new Error('Select a document annotation before adding a comment.');\n addAuthorRegion(sessionId, { ...session.candidate, id, comment, version: 1 });\n updateSession(sessionId, (current) => {\n const path = current.focusedDocument?.path;\n return path === undefined\n ? current\n : withFocusedCollection({ ...current, candidate: undefined, candidateText: '' }, path, {\n candidate: undefined,\n candidateText: '',\n });\n });\n return id;\n}\n\nexport const commitAuthorAnnotation = commitAuthorRegion;\n\nexport function addAuthorRegion(sessionId: string, region: AuthorRegionDraft): void {\n if (region.comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n updateSession(sessionId, (session) => {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.path !== normalizeAuthorPath(region.documentPath)) {\n throw new Error('The Author annotation does not belong to the focused document.');\n }\n if (focused.revision !== region.revision || focused.sourceSha256 !== region.sourceSha256) {\n throw new Error('The Author annotation is stale for the focused document.');\n }\n if (session.annotations.length >= AUTHOR_REGION_LIMIT)\n throw new Error(`Author requests support at most ${AUTHOR_REGION_LIMIT} annotations.`);\n if (session.annotations.some((candidate) => candidate.id === region.id))\n throw new Error(`Author annotation '${region.id}' already exists.`);\n const annotations = [...session.annotations, copyRegion({ ...region, version: region.version ?? 1 })];\n return withFocusedCollection({ ...session, annotations, regions: annotations }, focused.path, { annotations });\n });\n}\n\nexport const addAuthorAnnotationDraft = addAuthorRegion;\n\nexport function removeAuthorRegion(\n sessionId: string,\n regionId: string,\n expectedVersion?: number,\n documentPath?: string,\n): void {\n let thumbnail: string | undefined;\n updateSession(sessionId, (session) => {\n const path = documentPath === undefined ? session.focusedDocument?.path : normalizeAuthorPath(documentPath);\n if (path === undefined) return session;\n const focused = session.focusedDocument?.path === path;\n const collection = session.annotationsByDocument[path];\n const current = focused ? session.annotations : collection?.annotations;\n if (current === undefined) return session;\n const annotation = current.find((candidate) => candidate.id === regionId);\n if (annotation === undefined || (expectedVersion !== undefined && (annotation.version ?? 1) !== expectedVersion)) {\n return session;\n }\n thumbnail = annotation.thumbnailUrl;\n const annotations = current.filter((candidate) => candidate.id !== regionId);\n if (focused) return withFocusedCollection({ ...session, annotations, regions: annotations }, path, { annotations });\n return {\n ...session,\n annotationsByDocument: {\n ...session.annotationsByDocument,\n [path]: { ...collection, annotations, updatedAt: Date.now() },\n },\n };\n });\n if (thumbnail !== undefined) revokeThumbnail(thumbnail);\n}\n\nexport const removeAuthorAnnotation = removeAuthorRegion;\n\nexport function updateAuthorRegionComment(sessionId: string, regionId: string, comment: string): void {\n if (comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n updateSession(sessionId, (session) => {\n const path = session.focusedDocument?.path;\n if (path === undefined) return session;\n const annotations = session.annotations.map((annotation) =>\n annotation.id === regionId ? { ...annotation, comment, version: (annotation.version ?? 1) + 1 } : annotation,\n );\n return withFocusedCollection({ ...session, annotations, regions: annotations }, path, { annotations });\n });\n}\n\nexport const updateAuthorAnnotationComment = updateAuthorRegionComment;\n\nexport function putAuthorRequest(sessionId: string, record: AuthorRequestRecord): void {\n if (record.requestText.trim() === '') throw new Error('An Author request requires verbatim request text.');\n if (record.regions.length === 0 || record.regions.some((region) => region.comment.trim() === '')) {\n throw new Error('An Author request requires at least one commented region.');\n }\n updateSession(sessionId, (session) => {\n if (session.requests.some((request) => request.id === record.id))\n throw new Error(`Author request '${record.id}' already exists.`);\n return { ...session, requests: boundHistory([...session.requests, copyRequest(record)]) };\n });\n}\n\nexport function updateAuthorRequest(\n sessionId: string,\n requestId: string,\n update: (record: AuthorRequestRecord) => AuthorRequestRecord,\n): void {\n updateSession(sessionId, (session) => ({\n ...session,\n requests: boundHistory(\n session.requests.map((request) => (request.id === requestId ? copyRequest(update(request)) : request)),\n ),\n }));\n}\n\nexport function reviseAuthorDocument(sessionId: string, path: string, content: string): void {\n updateDocument(sessionId, path, (document) => {\n if (document.content === content) return document;\n const version = document.version + 1;\n return {\n ...document,\n content,\n version,\n revisions: [...document.revisions, { revision: version, content }],\n };\n });\n}\n\nexport function reviseAuthorFragment(sessionId: string, path: string, fragmentId: string, text: string): void {\n updateDocument(sessionId, path, (document) => {\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.text === text) return document;\n const version = document.version + 1;\n return {\n ...document,\n fragments: document.fragments?.map((fragment) => (fragment.id === fragmentId ? { ...fragment, text } : fragment)),\n version,\n revisions: [...document.revisions, { revision: version, content: text }],\n };\n });\n}\n\nexport function addAuthorAnnotation(sessionId: string, path: string, annotation: AuthorAnnotation): void {\n updateDocument(sessionId, path, (document) => ({ ...document, annotations: [...document.annotations, annotation] }));\n}\n\nexport function setAuthorCrop(sessionId: string, path: string, crop: AuthorCrop | undefined): void {\n updateDocument(sessionId, path, (document) => {\n const version = document.version + 1;\n return {\n ...document,\n ...(crop === undefined ? { crop: undefined } : { crop }),\n version,\n revisions: [...document.revisions, { revision: version, content: JSON.stringify(crop ?? null) }],\n };\n });\n}\n\nexport function requestAuthorSave(sessionId: string, path: string): void {\n updateDocument(sessionId, path, (document) => ({\n ...document,\n saveRequest: document.saveRequest + 1,\n savingVersion: document.version,\n }));\n}\n\nexport function failAuthorSave(sessionId: string, path: string, savingVersion: number): void {\n updateDocument(sessionId, path, (document) =>\n document.savingVersion === savingVersion ? { ...document, savingVersion: undefined } : document,\n );\n}\n\nexport function completeAuthorSave(\n sessionId: string,\n path: string,\n sourceSha256: string,\n savedVersion: number,\n savedFragments: AuthorDocumentInput['fragments'],\n): void {\n updateDocument(sessionId, path, (document) => {\n if (savedVersion < document.savedVersion) return document;\n return {\n ...document,\n sourceSha256,\n savedVersion,\n savingVersion: document.savingVersion === savedVersion ? undefined : document.savingVersion,\n originalFragments: savedFragments?.map((fragment) => ({ ...fragment })),\n ...(document.version === savedVersion ? { crop: undefined } : {}),\n revisions: document.revisions.filter((revision) => revision.revision > savedVersion),\n };\n });\n const now = Date.now();\n updateSession(sessionId, (session) => ({\n ...session,\n requests: boundHistory(\n session.requests.map((request) =>\n request.documentPath === normalizeAuthorPath(path) &&\n request.status === 'CHANGED' &&\n request.revision <= savedVersion\n ? { ...request, status: 'COMPLETE', currentOperation: undefined, updatedAt: now }\n : request,\n ),\n ),\n }));\n}\n\nexport function dropAuthorSession(sessionId: string): void {\n const prefix = `${sessionId}\\n`;\n const session = authorWorkspace.store.state.sessions[sessionId];\n for (const collection of Object.values(session?.annotationsByDocument ?? {})) {\n if (collection.candidate?.thumbnailUrl !== undefined) revokeThumbnail(collection.candidate.thumbnailUrl);\n collection.annotations.forEach((annotation) => {\n if (annotation.thumbnailUrl !== undefined) revokeThumbnail(annotation.thumbnailUrl);\n });\n }\n authorWorkspace.update((state) => {\n const sessions = { ...state.sessions };\n delete sessions[sessionId];\n return {\n documents: Object.fromEntries(Object.entries(state.documents).filter(([key]) => !key.startsWith(prefix))),\n sessions,\n };\n });\n}\n\nexport function setAuthorStoryPreview(\n sessionId: string,\n path: string,\n storyPreview: NonNullable<AuthorWorkspaceDocument['storyPreview']>,\n): void {\n updateDocument(sessionId, path, (document) => ({ ...document, storyPreview: structuredClone(storyPreview) }));\n}\n\nfunction updateDocument(\n sessionId: string,\n path: string,\n update: (document: AuthorWorkspaceDocument) => AuthorWorkspaceDocument,\n): void {\n const key = authorDocumentKey(sessionId, path);\n const staleThumbnails: string[] = [];\n authorWorkspace.update((state) => {\n const document = state.documents[key];\n if (document === undefined) return state;\n const next = update(document);\n const session = state.sessions[sessionId];\n const focused = session?.focusedDocument;\n const identityChanged =\n focused?.path === document.path &&\n (focused.revision !== next.version || focused.sourceSha256 !== next.sourceSha256);\n if (identityChanged) {\n staleThumbnails.push(\n ...(session.candidate?.thumbnailUrl === undefined ? [] : [session.candidate.thumbnailUrl]),\n ...session.annotations.flatMap((annotation) =>\n annotation.thumbnailUrl === undefined ? [] : [annotation.thumbnailUrl],\n ),\n );\n }\n const staleCollection = identityChanged\n ? staleAuthorCollection(session.annotationsByDocument[document.path], Date.now())\n : undefined;\n const sessions = identityChanged\n ? {\n ...state.sessions,\n [sessionId]: {\n ...session,\n focusedDocument: { ...focused, revision: next.version, sourceSha256: next.sourceSha256 },\n annotationsByDocument: {\n ...session.annotationsByDocument,\n ...(staleCollection && { [document.path]: staleCollection }),\n },\n candidate: undefined,\n candidateText: '',\n annotations: [],\n regions: [],\n },\n }\n : state.sessions;\n return { documents: { ...state.documents, [key]: next }, sessions };\n });\n staleThumbnails.forEach(revokeThumbnail);\n}\n\nfunction updateSession(sessionId: string, update: (session: AuthorSessionWorkspace) => AuthorSessionWorkspace): void {\n authorWorkspace.update((state) => {\n const session = state.sessions[sessionId] ?? EMPTY_SESSION;\n const next = update(session);\n return next === session ? state : { ...state, sessions: { ...state.sessions, [sessionId]: next } };\n });\n}\n\nfunction copyCandidate<T extends AuthorAnnotationCandidate>(candidate: T): T {\n const anchor =\n 'rect' in candidate.anchor\n ? { ...candidate.anchor, rect: { ...candidate.anchor.rect } }\n : 'point' in candidate.anchor\n ? { ...candidate.anchor, point: { ...candidate.anchor.point } }\n : { ...candidate.anchor };\n return {\n ...candidate,\n anchor,\n viewport: { ...candidate.viewport },\n voiceGrid: candidate.voiceGrid && { ...candidate.voiceGrid },\n };\n}\n\nfunction copyRegion(region: AuthorRegionDraft): AuthorRegionDraft {\n return copyCandidate(region);\n}\n\nfunction staleAuthorCollection(\n collection: AuthorDocumentAnnotationCollection | undefined,\n updatedAt: number,\n): AuthorDocumentAnnotationCollection | undefined {\n if (collection === undefined) return undefined;\n return {\n ...collection,\n stale: true,\n candidate: collection.candidate && { ...copyCandidate(collection.candidate), thumbnailUrl: undefined },\n annotations: collection.annotations.map((annotation) => ({ ...copyRegion(annotation), thumbnailUrl: undefined })),\n updatedAt,\n };\n}\n\nfunction withFocusedCollection(\n session: AuthorSessionWorkspace,\n path: string,\n update: Partial<Pick<AuthorDocumentAnnotationCollection, 'annotations' | 'candidate' | 'candidateText'>>,\n): AuthorSessionWorkspace {\n const focused = session.focusedDocument;\n if (focused === undefined || focused.path !== path) return session;\n const previous = session.annotationsByDocument[path];\n const collection: AuthorDocumentAnnotationCollection = {\n ...previous,\n revision: focused.revision,\n sourceSha256: focused.sourceSha256,\n stale: false,\n candidate: session.candidate,\n candidateText: session.candidateText,\n annotations: session.annotations,\n updatedAt: Date.now(),\n ...update,\n };\n return { ...session, annotationsByDocument: { ...session.annotationsByDocument, [path]: collection } };\n}\n\nfunction boundedHistoryText(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const encoder = new TextEncoder();\n if (encoder.encode(value).byteLength <= 16 * 1024) return value;\n let end = value.length;\n while (end > 0 && encoder.encode(value.slice(0, end)).byteLength > 16 * 1024) end -= 256;\n return value.slice(0, end);\n}\n\nfunction copyRequest(record: AuthorRequestRecord): AuthorRequestRecord {\n return {\n ...record,\n before: boundedHistoryText(record.before),\n after: boundedHistoryText(record.after),\n regions: record.regions.map(copyRegion),\n pendingRegions: record.pendingRegions?.map(copyRegion),\n };\n}\n\nfunction boundHistory(records: readonly AuthorRequestRecord[]): readonly AuthorRequestRecord[] {\n const next = [...records];\n const bytes = (): number => new TextEncoder().encode(JSON.stringify(next)).byteLength;\n while (next.length > AUTHOR_HISTORY_RECORD_LIMIT || bytes() > AUTHOR_HISTORY_BYTE_LIMIT) {\n const terminal = next.findIndex((record) => TERMINAL_REQUEST_STATUSES.has(record.status));\n if (terminal < 0) throw new Error('Author request history is full while active requests are still running.');\n next.splice(terminal, 1);\n }\n return next;\n}\n\nfunction restoreCollectionEvidence(collection: AuthorDocumentAnnotationCollection): AuthorDocumentAnnotationCollection {\n const restore = <T extends AuthorAnnotationCandidate>(item: T): T => {\n const copied = copyCandidate(item);\n const existingVersion: unknown = Reflect.get(copied, 'version');\n const versioned =\n 'id' in copied\n ? ({ ...copied, version: typeof existingVersion === 'number' ? existingVersion : 1 } as T)\n : copied;\n if (versioned.thumbnailUrl !== undefined || versioned.evidence === undefined) return versioned;\n try {\n return { ...versioned, thumbnailUrl: URL.createObjectURL(versioned.evidence) };\n } catch {\n return versioned;\n }\n };\n return {\n ...collection,\n candidate: collection.candidate && restore(collection.candidate),\n annotations: collection.annotations.map(restore),\n };\n}\n\nfunction revokeThumbnail(url: string): void {\n if (!url.startsWith('blob:')) return;\n try {\n URL.revokeObjectURL(url);\n } catch {\n // Thumbnail cleanup must not make session teardown fail.\n }\n}\n","import { defineSessionStore, type SessionChannelContribution } from '@agimon-ai/doompi-core/web';\n\nimport { authorChannelType, type AuthorHubMessage, type AuthorWebView } from '../../../../../../types/webAuthor';\nimport { applyAuthorHubMessage, authorBridgeView, dropAuthorViewportSession } from '../../_lib/authorBrowserBridge';\nimport { clearAuthorGridGeometry } from '../../_lib/authorGrid';\nimport { dropAuthorSession } from '../../_lib/authorWorkspaceStore';\n\nexport const author = defineSessionStore<AuthorWebView>({ activation: 'inactive', capabilityCount: 0 });\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction parseAuthorHubMessage(input: unknown): AuthorHubMessage | AuthorWebView | null {\n if (!isRecord(input)) return null;\n if (\n (input.activation === 'active' || input.activation === 'inactive') &&\n Number.isSafeInteger(input.capabilityCount) &&\n (input.capabilityCount as number) >= 0\n ) {\n return input as unknown as AuthorWebView;\n }\n if (typeof input.kind !== 'string') return null;\n if (input.kind === 'rejected')\n return typeof input.reason === 'string' ? (input as unknown as AuthorHubMessage) : null;\n if (!Number.isSafeInteger(input.generation) || typeof input.ownerToken !== 'string') return null;\n if (input.kind === 'accepted') {\n return typeof input.leaseMs === 'number' &&\n (input.catalogToken === undefined || typeof input.catalogToken === 'string')\n ? (input as unknown as AuthorHubMessage)\n : null;\n }\n if (\n (input.kind === 'request' || input.kind === 'cancel') &&\n typeof input.catalogToken === 'string' &&\n typeof input.requestId === 'string'\n ) {\n if (input.kind === 'cancel') return input as unknown as AuthorHubMessage;\n return typeof input.name === 'string' && isRecord(input.arguments) ? (input as unknown as AuthorHubMessage) : null;\n }\n return null;\n}\n\nexport const authorChannel: SessionChannelContribution<AuthorHubMessage | AuthorWebView> = {\n channel: authorChannelType,\n parse: parseAuthorHubMessage,\n apply(sessionId, message) {\n if ('activation' in message) {\n author.update(sessionId, () => message);\n return;\n }\n applyAuthorHubMessage(sessionId, message);\n author.update(sessionId, () => authorBridgeView(sessionId));\n },\n drop(sessionId) {\n clearAuthorGridGeometry(sessionId);\n dropAuthorViewportSession(sessionId);\n dropAuthorSession(sessionId);\n author.drop(sessionId);\n },\n};\n","import { defineChannelFile } from '@agimon-ai/doompi-core/web';\n\nimport { authorChannel } from './_lib/authorStore';\n\nexport default defineChannelFile({ ...authorChannel });\n","import { useEffect, useRef } from 'react';\n\nimport {\n AUTHOR_GRID_COLUMNS,\n AUTHOR_GRID_SIZE,\n clearAuthorGridGeometry,\n updateAuthorGridGeometry,\n} from '../_lib/authorGrid';\nimport type { AuthorWorkspaceDocument } from '../_lib/authorWorkspaceStore';\n\nexport function autonomousVoiceGridVisible(statuses: Readonly<Record<string, string>>): boolean {\n return statuses['doom-voice']?.trimStart().startsWith('voice auto:') === true;\n}\n\nexport function AuthorGridOverlay({\n sessionId,\n document,\n visible,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n visible: boolean;\n}) {\n const host = useRef<HTMLDivElement>(null);\n useEffect(() => {\n const element = host.current?.parentElement;\n if (!visible || element === null || element === undefined) {\n clearAuthorGridGeometry(sessionId);\n return;\n }\n const publish = () => {\n const bounds = element.getBoundingClientRect();\n updateAuthorGridGeometry(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n viewport: {\n width: bounds.width,\n height: bounds.height,\n originX: bounds.left,\n originY: bounds.top,\n scrollX: element.scrollLeft,\n scrollY: element.scrollTop,\n zoom: window.devicePixelRatio,\n },\n });\n };\n publish();\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n element.addEventListener('scroll', publish, { passive: true, capture: true });\n window.addEventListener('focus', publish);\n return () => {\n observer.disconnect();\n element.removeEventListener('scroll', publish, true);\n window.removeEventListener('focus', publish);\n clearAuthorGridGeometry(sessionId);\n };\n }, [document.path, document.sourceSha256, document.version, sessionId, visible]);\n if (!visible) return null;\n return (\n <div\n ref={host}\n data-testid=\"author-grid\"\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-20 grid grid-cols-8 grid-rows-8\"\n >\n {Array.from({ length: AUTHOR_GRID_SIZE * AUTHOR_GRID_SIZE }, (_, index) => {\n const column = index % AUTHOR_GRID_SIZE;\n const row = Math.floor(index / AUTHOR_GRID_SIZE);\n return (\n <div key={index} className=\"relative border border-doom-red/25\">\n <span className=\"absolute left-1 top-0.5 rounded bg-doom-deep/80 px-1 text-2xs font-bold text-doom-red\">\n {AUTHOR_GRID_COLUMNS[column]}\n {row + 1}\n </span>\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ComposerCapture, WebPluginContextItem } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorCrop, AuthorNativeAnchor, AuthorRegionDraft } from './authorViewportTypes';\nimport type { AuthorWorkspaceDocument } from './authorWorkspaceStore';\n\nexport const AUTHOR_CAPTURE_MAX_DIMENSION = 1600;\nexport const AUTHOR_CAPTURE_MAX_BYTES = 2 * 1024 * 1024;\nexport const AUTHOR_PACKET_MAX_BYTES = 64 * 1024;\nexport const AUTHOR_COMMENT_MAX_BYTES = 2 * 1024;\nexport const AUTHOR_QUOTE_MAX_BYTES = 4 * 1024;\nexport const AUTHOR_REGION_COLORS = [\n '#ff5f57',\n '#00c2ff',\n '#ffd166',\n '#b388ff',\n '#4ade80',\n '#ff8c42',\n '#f472b6',\n '#2dd4bf',\n '#a3e635',\n '#60a5fa',\n '#e879f9',\n '#facc15',\n '#34d399',\n '#fb7185',\n '#818cf8',\n '#22d3ee',\n] as const;\n\nfunction annotationForeground(color: string): '#101216' | '#ffffff' {\n const red = Number.parseInt(color.slice(1, 3), 16);\n const green = Number.parseInt(color.slice(3, 5), 16);\n const blue = Number.parseInt(color.slice(5, 7), 16);\n return red * 299 + green * 587 + blue * 114 >= 150_000 ? '#101216' : '#ffffff';\n}\n\nexport interface AuthorCapturePacketRegion {\n id: string;\n ordinal: number;\n comment: string;\n version: number;\n mode: 'region' | 'point';\n quote?: string;\n anchor: AuthorNativeAnchor;\n viewport: AuthorRegionDraft['viewport'];\n voiceGrid?: AuthorRegionDraft['voiceGrid'];\n}\n\nexport interface AuthorCapturePacket {\n version: 1;\n captureId: string;\n capturedAt: number;\n document: {\n path: string;\n kind: AuthorWorkspaceDocument['kind'];\n revision: number;\n sourceSha256?: string;\n storyPreview?: AuthorWorkspaceDocument['storyPreview'];\n };\n regions: AuthorCapturePacketRegion[];\n}\n\nexport interface AuthorCaptureProvider {\n capture(signal?: AbortSignal): Promise<{ data: string; mimeType: 'image/png' | 'image/jpeg' }>;\n}\n\nconst bytes = (value: string): number => new TextEncoder().encode(value).byteLength;\n\nfunction utf8Prefix(value: string, limit: number): string {\n if (bytes(value) <= limit) return value;\n let low = 0;\n let high = value.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (bytes(value.slice(0, middle)) <= limit) low = middle;\n else high = middle - 1;\n }\n return value.slice(0, low);\n}\n\nexport function createAuthorCapturePacket(\n captureId: string,\n capturedAt: number,\n document: AuthorWorkspaceDocument,\n regions: readonly AuthorRegionDraft[],\n): AuthorCapturePacket {\n if (regions.length === 0 || regions.length > 16) throw new Error('Capture requires between 1 and 16 regions.');\n if (document.kind === 'story-preview' && document.storyPreview === undefined) {\n throw new Error('Story preview capture requires source provenance.');\n }\n const packet: AuthorCapturePacket = {\n version: 1,\n captureId,\n capturedAt,\n document: {\n path: document.path,\n kind: document.kind,\n revision: document.version,\n ...(document.sourceSha256 === undefined ? {} : { sourceSha256: document.sourceSha256 }),\n ...(document.storyPreview === undefined ? {} : { storyPreview: structuredClone(document.storyPreview) }),\n },\n regions: regions.map((region, index) => {\n if (\n region.documentPath !== document.path ||\n region.revision !== document.version ||\n region.sourceSha256 !== document.sourceSha256\n ) {\n throw new Error(`Region ${String(index + 1)} is stale for the focused document.`);\n }\n if (region.comment.trim() === '') throw new Error(`Region ${String(index + 1)} requires a comment.`);\n if (bytes(region.comment) > AUTHOR_COMMENT_MAX_BYTES) {\n throw new Error(`Region ${String(index + 1)} comment exceeds 2 KiB.`);\n }\n return {\n id: region.id,\n ordinal: index + 1,\n comment: region.comment,\n version: region.version ?? 1,\n mode: region.mode ?? ('point' in region.anchor ? 'point' : 'region'),\n ...(region.quote === undefined ? {} : { quote: utf8Prefix(region.quote, AUTHOR_QUOTE_MAX_BYTES) }),\n anchor: structuredClone(region.anchor),\n viewport: { ...region.viewport },\n ...(region.voiceGrid === undefined ? {} : { voiceGrid: { ...region.voiceGrid } }),\n };\n }),\n };\n if (bytes(JSON.stringify(packet)) > AUTHOR_PACKET_MAX_BYTES) throw new Error('Author capture packet exceeds 64 KiB.');\n return packet;\n}\n\nfunction percent(value: number): string {\n return `${String(Math.round(value * 1_000) / 10)}%`;\n}\n\nfunction rectLocation(rect: AuthorCrop): string {\n return `x ${percent(rect.x)}, y ${percent(rect.y)}, w ${percent(rect.width)}, h ${percent(rect.height)}`;\n}\n\nfunction anchorLocation(anchor: AuthorNativeAnchor): string {\n switch (anchor.kind) {\n case 'text-range':\n return anchor.startLine === anchor.endLine\n ? `line ${String(anchor.startLine)}`\n : `lines ${String(anchor.startLine)}-${String(anchor.endLine)}`;\n case 'cell':\n return `${anchor.sheet === undefined ? '' : `${anchor.sheet}!`}${anchor.location}`;\n case 'slide-element':\n return `slide ${String(anchor.slide)}: ${anchor.location}`;\n case 'image-rect':\n return `image ${rectLocation(anchor.rect)}`;\n case 'pdf-page-rect':\n return `page ${String(anchor.page)}, ${rectLocation(anchor.rect)}`;\n case 'video-time-rect':\n return `time ${anchor.timeSeconds.toFixed(3)}s${anchor.frame === undefined ? '' : `, frame ${String(anchor.frame)}`}, ${rectLocation(anchor.rect)}`;\n case 'story-preview-rect':\n return `story preview ${rectLocation(anchor.rect)}`;\n case 'image-point':\n return `image point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'pdf-page-point':\n return `page ${String(anchor.page)}, point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'video-time-point':\n return `time ${anchor.timeSeconds.toFixed(3)}s, point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n case 'story-preview-point':\n return `story preview point x ${percent(anchor.point.x)}, y ${percent(anchor.point.y)}`;\n }\n}\n\nfunction storyPreviewProvenance(packet: AuthorCapturePacket): string | undefined {\n const preview = packet.document.storyPreview;\n if (preview === undefined) return undefined;\n const sources = preview.sources.map((source) => `- ${source.path} (sha256 ${source.sha256})`).join('\\n');\n return [\n 'Story preview source (edit these sources, never the generated preview artifact):',\n `Project: ${preview.projectPath}`,\n `Story: ${preview.storyPath}#${preview.storyExport}`,\n `Build revision: ${preview.buildRevision}`,\n `Viewport: ${String(preview.viewport.width)}x${String(preview.viewport.height)}`,\n 'Sources:',\n sources,\n 'After editing the underlying story or component source, rebuild the preview before treating it as visually verified.',\n ].join('\\n');\n}\n\nexport function authorCaptureContext(packet: AuthorCapturePacket): WebPluginContextItem {\n const metadata = JSON.stringify(packet);\n if (bytes(metadata) > AUTHOR_PACKET_MAX_BYTES) throw new Error('Author capture packet exceeds 64 KiB.');\n const annotations = packet.regions\n .map(\n (region) =>\n `(${String(region.ordinal)}) ${region.comment} [${anchorLocation(region.anchor)}]${region.quote ? `\\nQuoted text: ${region.quote}` : ''}`,\n )\n .join('\\n\\n');\n const provenance = storyPreviewProvenance(packet);\n const content = provenance === undefined ? annotations : `${provenance}\\n\\nAnnotations:\\n${annotations}`;\n return {\n kind: 'author-capture',\n source: 'author',\n id: packet.captureId,\n label: `${packet.regions.length} annotation${packet.regions.length === 1 ? '' : 's'} · ${packet.document.path}`,\n content,\n metadata,\n };\n}\n\nfunction canvasBlob(canvas: HTMLCanvasElement, type: 'image/png' | 'image/jpeg', quality?: number): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob === null ? reject(new Error('Unable to capture viewport')) : resolve(blob)),\n type,\n quality,\n );\n });\n}\n\nasync function base64(blob: Blob): Promise<string> {\n const bytes = new Uint8Array(await blob.arrayBuffer());\n let binary = '';\n for (let offset = 0; offset < bytes.length; offset += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n }\n return btoa(binary);\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted === true) throw signal.reason;\n}\n\nasync function boundedCanvasCapture(\n canvas: HTMLCanvasElement,\n): Promise<{ data: string; mimeType: 'image/png' | 'image/jpeg' }> {\n let mimeType: 'image/png' | 'image/jpeg' = 'image/png';\n let blob = await canvasBlob(canvas, mimeType);\n for (const quality of [0.9, 0.75, 0.6, 0.45, 0.3]) {\n if (blob.size <= AUTHOR_CAPTURE_MAX_BYTES) break;\n mimeType = 'image/jpeg';\n blob = await canvasBlob(canvas, mimeType, quality);\n }\n if (blob.size > AUTHOR_CAPTURE_MAX_BYTES) throw new Error('Viewport capture exceeds 2 MiB');\n return { data: await base64(blob), mimeType };\n}\n\nexport function imageCaptureProvider(image: HTMLImageElement, crop?: AuthorCrop): AuthorCaptureProvider {\n return {\n async capture(signal) {\n throwIfAborted(signal);\n const normalized = crop ?? { x: 0, y: 0, width: 1, height: 1 };\n const source = {\n x: normalized.x * image.naturalWidth,\n y: normalized.y * image.naturalHeight,\n width: normalized.width * image.naturalWidth,\n height: normalized.height * image.naturalHeight,\n };\n if (source.width <= 0 || source.height <= 0) throw new Error('Image is not ready to capture');\n const scale = Math.min(1, AUTHOR_CAPTURE_MAX_DIMENSION / Math.max(source.width, source.height));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(source.width * scale));\n canvas.height = Math.max(1, Math.round(source.height * scale));\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable');\n context.drawImage(image, source.x, source.y, source.width, source.height, 0, 0, canvas.width, canvas.height);\n const capture = await boundedCanvasCapture(canvas);\n throwIfAborted(signal);\n return capture;\n },\n };\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('Unable to load a region capture.'));\n image.src = url;\n });\n}\n\nexport function multiRegionCaptureProvider(regions: readonly AuthorRegionDraft[]): AuthorCaptureProvider {\n return {\n async capture(signal) {\n throwIfAborted(signal);\n if (regions.length === 0 || regions.length > 16) throw new Error('Capture requires between 1 and 16 regions.');\n const tiles = [];\n for (const region of regions) {\n const image = region.thumbnailUrl === undefined ? undefined : await loadImage(region.thumbnailUrl);\n throwIfAborted(signal);\n const width = image?.naturalWidth ?? region.viewport.width;\n const height = image?.naturalHeight ?? region.viewport.height;\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new Error('Image is not ready to capture');\n }\n tiles.push({ region, image, width, height });\n }\n const width = Math.min(AUTHOR_CAPTURE_MAX_DIMENSION, Math.max(...tiles.map((tile) => tile.width)));\n const naturalHeight = tiles.reduce((height, tile) => height + (tile.height * width) / tile.width, 0);\n const scale = Math.min(1, AUTHOR_CAPTURE_MAX_DIMENSION / Math.max(width, naturalHeight));\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, Math.round(width * scale));\n canvas.height = Math.max(1, Math.round(naturalHeight * scale));\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable');\n context.scale(scale, scale);\n context.fillStyle = '#101216';\n context.fillRect(0, 0, width, naturalHeight);\n let y = 0;\n for (const [index, { region, image, width: sourceWidth, height: sourceHeight }] of tiles.entries()) {\n const annotationColor = AUTHOR_REGION_COLORS[index % AUTHOR_REGION_COLORS.length]!;\n throwIfAborted(signal);\n const tileHeight = (sourceHeight * width) / sourceWidth;\n const drawWidth = width;\n const drawHeight = tileHeight;\n const drawX = 0;\n const drawY = y;\n let labelX = drawX;\n let labelY = drawY;\n if (image !== undefined) {\n context.drawImage(image, drawX, drawY, drawWidth, drawHeight);\n if ('rect' in region.anchor) {\n const rect = region.anchor.rect;\n const rx = drawX + rect.x * drawWidth;\n const ry = drawY + rect.y * drawHeight;\n const rw = rect.width * drawWidth;\n const rh = rect.height * drawHeight;\n context.fillStyle = 'rgba(8,10,13,0.62)';\n context.fillRect(drawX, drawY, drawWidth, Math.max(0, ry - drawY));\n context.fillRect(drawX, ry + rh, drawWidth, Math.max(0, drawY + drawHeight - ry - rh));\n context.fillRect(drawX, ry, Math.max(0, rx - drawX), rh);\n context.fillRect(rx + rw, ry, Math.max(0, drawX + drawWidth - rx - rw), rh);\n context.strokeStyle = annotationColor;\n context.lineWidth = 3;\n context.strokeRect(rx, ry, rw, rh);\n labelX = rx;\n labelY = ry;\n } else if ('point' in region.anchor) {\n const px = drawX + region.anchor.point.x * drawWidth;\n const py = drawY + region.anchor.point.y * drawHeight;\n const radius = Math.max(6, Math.min(14, Math.min(drawWidth, drawHeight) / 12));\n context.beginPath();\n context.arc(px, py, radius, 0, Math.PI * 2);\n context.fillStyle = annotationColor;\n context.fill();\n context.strokeStyle = annotationForeground(annotationColor);\n context.lineWidth = 2;\n context.stroke();\n labelX = px + radius;\n labelY = py - radius;\n }\n }\n // Keep ordinals readable after downscaling, but never larger than their image.\n const ordinal = String(index + 1);\n let badgeScale = Math.min(1 / scale, drawHeight / 36);\n context.font = `bold ${String(24 * badgeScale)}px monospace`;\n const measuredWidth = context.measureText(ordinal).width + 12 * badgeScale;\n if (measuredWidth > drawWidth) badgeScale *= drawWidth / measuredWidth;\n context.font = `bold ${String(24 * badgeScale)}px monospace`;\n context.textBaseline = 'top';\n const padding = 6 * badgeScale;\n const labelWidth = Math.min(drawWidth, context.measureText(ordinal).width + padding * 2);\n const labelHeight = 36 * badgeScale;\n labelX = Math.max(drawX, Math.min(labelX, drawX + drawWidth - labelWidth));\n labelY = Math.max(drawY, Math.min(labelY, drawY + drawHeight - labelHeight));\n context.fillStyle = annotationColor;\n context.fillRect(labelX, labelY, labelWidth, labelHeight);\n context.fillStyle = annotationForeground(annotationColor);\n context.fillText(ordinal, labelX + padding, labelY + padding);\n y += tileHeight;\n }\n throwIfAborted(signal);\n return boundedCanvasCapture(canvas);\n },\n };\n}\n\nexport async function attachAuthorCapture(\n provider: AuthorCaptureProvider,\n context: WebPluginContextItem,\n attach: (capture: ComposerCapture) => void,\n signal?: AbortSignal,\n): Promise<void> {\n const capture = await provider.capture(signal);\n throwIfAborted(signal);\n attach({ ...capture, context });\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nimport type { AuthorSessionWorkspace } from '../../_lib/authorWorkspaceStore';\nimport {\n commitAuthorRegion,\n removeAuthorRegion,\n seekAuthorVideo,\n setAuthorCandidateText,\n setAuthorRegionCandidate,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string; workspace: AuthorSessionWorkspace }) {\n const [error, setError] = useState<string>();\n const add = () => {\n try {\n commitAuthorRegion(sessionId, workspace.candidateText);\n setError(undefined);\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n };\n if (!workspace.candidate && workspace.annotations.length === 0) return null;\n const candidateKind = workspace.candidate?.mode === 'point' ? 'point' : 'region';\n return (\n <section className=\"space-y-2\" data-testid=\"author-region-drafts\">\n {workspace.candidate ? (\n <>\n <h3 className=\"text-base font-semibold text-doom-text\">Current {candidateKind}</h3>\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Add feedback to keep this {candidateKind} as an unsent annotation.\n </p>\n {workspace.candidate.anchor.kind === 'video-time-rect' ||\n workspace.candidate.anchor.kind === 'video-time-point' ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Frame at {workspace.candidate.anchor.timeSeconds.toFixed(3)}s\n </p>\n ) : null}\n <textarea\n aria-label=\"Annotation comment\"\n value={workspace.candidateText}\n onChange={(event) => setAuthorCandidateText(sessionId, event.target.value)}\n placeholder=\"What should change here?\"\n rows={3}\n className=\"min-h-11 w-full resize-y rounded border border-doom-border bg-doom-deep p-2 text-lg leading-normal text-doom-text focus:border-doom-red focus:outline-none sm:text-sm\"\n />\n <Button\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"outline\"\n onClick={add}\n disabled={!workspace.candidate || !workspace.candidateText.trim() || workspace.annotations.length >= 16}\n >\n add annotation\n </Button>\n <Button\n variant=\"ghost\"\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n onClick={() => {\n setAuthorRegionCandidate(sessionId, undefined);\n setAuthorCandidateText(sessionId, '');\n setError(undefined);\n }}\n >\n Discard annotation\n </Button>\n </>\n ) : null}\n {error ? <output className=\"block text-base text-doom-red\">{error}</output> : null}\n {workspace.annotations.length > 0 ? (\n <h3 className=\"text-base font-semibold text-doom-text\">Unsent annotations ({workspace.annotations.length})</h3>\n ) : null}\n <ol className=\"space-y-2\">\n {workspace.annotations.map((region, index) => (\n <li\n key={region.id}\n className=\"rounded border border-doom-border bg-doom-panel p-2 text-base leading-normal text-doom-text sm:text-sm\"\n >\n <span>\n ({index + 1}) {region.mode === 'point' ? 'Point' : 'Region'}: {region.comment}\n </span>\n {region.anchor.kind === 'video-time-rect' || region.anchor.kind === 'video-time-point' ? (\n <Button\n variant=\"outline\"\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n disabled={workspace.candidate !== undefined}\n onClick={() => {\n if (region.anchor.kind === 'video-time-rect' || region.anchor.kind === 'video-time-point') {\n seekAuthorVideo(sessionId, region.anchor.timeSeconds);\n }\n }}\n >\n Go to {region.anchor.timeSeconds.toFixed(3)}s\n </Button>\n ) : null}\n <Button\n className=\"min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"ghost\"\n aria-label={`Remove annotation ${index + 1}`}\n onClick={() => removeAuthorRegion(sessionId, region.id)}\n >\n remove\n </Button>\n </li>\n ))}\n </ol>\n </section>\n );\n}\n","import type { AuthorNativeAnchor, AuthorRequestRecord } from '../../_lib/authorViewportTypes';\n\nconst STATUS_LABELS: Record<AuthorRequestRecord['status'], string> = {\n REQUESTED: 'Request queued',\n CHANGING: 'Agent working',\n CHANGED: 'Change ready',\n COMPLETE: 'Request completed',\n FAILED: 'Request failed',\n CANCELLED: 'Request cancelled',\n};\n\nconst STATUS_STYLES: Record<AuthorRequestRecord['status'], string> = {\n REQUESTED: 'border-doom-yellow/35 bg-doom-yellow/5 text-doom-yellow',\n CHANGING: 'border-doom-magenta/45 bg-doom-magenta/10 text-doom-yellow',\n CHANGED: 'border-doom-cyan/40 bg-doom-cyan/5 text-doom-cyan',\n COMPLETE: 'border-doom-green/40 bg-doom-green/5 text-doom-green',\n FAILED: 'border-doom-red/45 bg-doom-red/10 text-doom-red',\n CANCELLED: 'border-doom-border bg-doom-panel text-doom-dim',\n};\n\nfunction requestInstruction(requestText: string): string {\n const referencedContext = requestText.search(/(?:^|\\s+)Referenced context \"/u);\n return requestText\n .slice(0, referencedContext < 0 ? undefined : referencedContext)\n .replace(/^Please address the attached feedback\\.\\s*Request ID: \\S+\\s*/u, '')\n .trim();\n}\n\nfunction documentName(path: string): string {\n return path.replaceAll('\\\\', '/').split('/').at(-1) || path;\n}\n\nfunction anchorLabel(anchor: AuthorNativeAnchor): string {\n switch (anchor.kind) {\n case 'text-range':\n return anchor.startLine === anchor.endLine\n ? `Line ${anchor.startLine}`\n : `Lines ${anchor.startLine}–${anchor.endLine}`;\n case 'cell':\n return [anchor.sheet, anchor.location].filter(Boolean).join(' · ');\n case 'slide-element':\n return `Slide ${anchor.slide} · ${anchor.location}`;\n case 'image-rect':\n return 'Image region';\n case 'pdf-page-rect':\n return `Page ${anchor.page}`;\n case 'video-time-rect': {\n const minutes = Math.floor(anchor.timeSeconds / 60);\n const seconds = Math.floor(anchor.timeSeconds % 60)\n .toString()\n .padStart(2, '0');\n return `Video ${minutes}:${seconds}`;\n }\n case 'story-preview-rect':\n return `${anchor.preview.storyPath}#${anchor.preview.storyExport}`;\n case 'image-point':\n return 'Image point';\n case 'pdf-page-point':\n return `Page ${anchor.page} point`;\n case 'video-time-point': {\n const minutes = Math.floor(anchor.timeSeconds / 60);\n const seconds = Math.floor(anchor.timeSeconds % 60)\n .toString()\n .padStart(2, '0');\n return `Video ${minutes}:${seconds} point`;\n }\n case 'story-preview-point':\n return `${anchor.preview.storyPath}#${anchor.preview.storyExport} point`;\n }\n}\n\nfunction progressLabel(request: AuthorRequestRecord): string {\n const total = request.regions.length;\n const pending = request.pendingRegions?.length;\n if (request.status === 'CHANGING' && request.currentOperation === 'Agent is working on this request')\n return 'Processing request';\n if (request.status === 'CHANGING' && pending !== undefined)\n return `${total - pending} of ${total} annotations applied`;\n if (request.status === 'CHANGED') return 'Changes applied · awaiting save';\n if (request.status === 'COMPLETE') return 'Agent finished processing this request';\n if (request.status === 'FAILED') return 'Stopped with an error';\n if (request.status === 'CANCELLED') return 'Stopped before completion';\n return `${total} annotation${total === 1 ? '' : 's'} queued`;\n}\n\nfunction RequestRecord({ request, prominent = false }: { request: AuthorRequestRecord; prominent?: boolean }) {\n const instruction = requestInstruction(request.requestText);\n return (\n <article data-testid={prominent ? 'author-active-request' : undefined} className=\"space-y-3\">\n <header className=\"border-b border-doom-border-soft pb-3\">\n <p className=\"text-2xs font-bold tracking-widest text-doom-faint\">DOCUMENT CONTEXT</p>\n <p className=\"mt-2 flex items-center gap-2 truncate text-base font-bold text-doom-hi\">\n <span aria-hidden className=\"text-doom-magenta\">\n ↗\n </span>\n {documentName(request.documentPath)}\n </p>\n </header>\n\n <section aria-label=\"Request locations\" className=\"rounded border border-doom-border bg-doom-panel p-3\">\n <ol className=\"space-y-3\">\n {request.regions.map((region, index) => (\n <li key={region.id} className=\"space-y-2\">\n <p className=\"font-mono text-2xs font-bold uppercase tracking-wider text-doom-yellow\">\n WHERE · {request.regions.length > 1 ? `${index + 1} · ` : ''}\n {documentName(request.documentPath)} / {anchorLabel(region.anchor)} · rev {request.revision}\n </p>\n {region.quote ? (\n <blockquote className=\"line-clamp-3 text-sm italic leading-relaxed text-doom-text\">\n “{region.quote}”\n </blockquote>\n ) : null}\n <p className=\"text-xs leading-relaxed text-doom-dim\">{region.comment}</p>\n </li>\n ))}\n </ol>\n </section>\n\n <section\n data-testid={prominent ? 'author-operation-card' : undefined}\n className={`rounded border p-3 ${STATUS_STYLES[request.status]}`}\n >\n <p className=\"font-mono text-xs font-bold tracking-wider\">\n ●{' '}\n {request.status === 'CHANGING'\n ? 'WORKING'\n : request.status === 'COMPLETE'\n ? 'COMPLETED'\n : request.status === 'FAILED'\n ? 'ERROR'\n : request.status}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-doom-hi\">\n {request.currentOperation || STATUS_LABELS[request.status]}\n </p>\n {request.error ? <p className=\"mt-2 text-xs leading-relaxed text-doom-red\">{request.error}</p> : null}\n {request.before !== undefined || request.after !== undefined ? (\n <details className=\"mt-2 border-t border-current/20 pt-2 text-xs text-doom-dim\">\n <summary className=\"cursor-pointer select-none\">change preview</summary>\n {request.before !== undefined ? (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n before: {request.before}\n </pre>\n ) : null}\n {request.after !== undefined ? (\n <pre className=\"mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono\">\n after: {request.after}\n </pre>\n ) : null}\n </details>\n ) : null}\n </section>\n\n <section className=\"space-y-2\">\n <p className=\"text-2xs font-bold tracking-widest text-doom-faint\">REQUEST · HOW TO CHANGE</p>\n <div className=\"rounded border border-doom-border bg-doom-deep p-3\">\n <p className=\"whitespace-pre-wrap text-sm leading-relaxed text-doom-text\">\n {instruction || 'No additional instruction.'}\n </p>\n </div>\n </section>\n\n <footer className=\"font-mono text-2xs text-doom-dim\">{progressLabel(request)}</footer>\n </article>\n );\n}\n\nexport function AuthorRequestLog({ requests }: { requests: readonly AuthorRequestRecord[] }) {\n const latest = requests.at(-1);\n const earlier = requests.slice(0, -1).reverse();\n return (\n <section data-testid=\"author-request-history\" className=\"space-y-3\">\n <h3 className=\"text-2xs font-bold tracking-widest text-doom-faint\">AUTHORING</h3>\n {latest === undefined ? (\n <p className=\"text-sm leading-relaxed text-doom-dim\">No requests or changes yet.</p>\n ) : (\n <RequestRecord request={latest} prominent />\n )}\n {earlier.length > 0 ? (\n <details className=\"border-t border-doom-border-soft pt-3\" data-testid=\"author-earlier-requests\">\n <summary className=\"cursor-pointer select-none text-2xs font-bold tracking-wider text-doom-faint\">\n EARLIER REQUESTS ({earlier.length})\n </summary>\n <ol className=\"mt-3 space-y-5\">\n {earlier.map((request) => (\n <li key={request.id}>\n <RequestRecord request={request} />\n </li>\n ))}\n </ol>\n </details>\n ) : null}\n </section>\n );\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nimport type { AuthorDocumentKind, AuthorToolMode } from '../../_lib/authorViewportTypes';\nimport {\n authorDocument,\n authorSessionWorkspace,\n reviseAuthorDocument,\n setAuthorRegionCandidate,\n setAuthorToolMode,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorToolPalette({\n sessionId,\n kind,\n activeTool,\n}: {\n sessionId: string;\n kind: AuthorDocumentKind;\n activeTool: AuthorToolMode;\n}) {\n const [error, setError] = useState<string>();\n const format = (style: 'Bold' | 'Heading' | 'Link' | 'List') => {\n const session = authorSessionWorkspace(sessionId);\n const selected = session.candidate;\n const document = selected && authorDocument(sessionId, selected.documentPath);\n if (\n !selected ||\n !document ||\n selected.anchor.kind !== 'text-range' ||\n selected.revision !== document.version ||\n selected.sourceSha256 !== document.sourceSha256\n ) {\n setError('Select text in the document first.');\n return;\n }\n const { startOffset, endOffset } = selected.anchor;\n const content = document.content ?? '';\n const text = content.slice(startOffset, endOffset);\n const replacement =\n style === 'Bold'\n ? `**${text}**`\n : style === 'Link'\n ? `[${text}](https://)`\n : text\n .split('\\n')\n .map((line) => `${style === 'Heading' ? '## ' : '- '}${line}`)\n .join('\\n');\n reviseAuthorDocument(\n sessionId,\n document.path,\n content.slice(0, startOffset) + replacement + content.slice(endOffset),\n );\n setAuthorRegionCandidate(sessionId, undefined);\n setError(undefined);\n };\n const tools = [\n {\n label: 'Region',\n glyph: '⌗',\n action: () => setAuthorToolMode(sessionId, activeTool === 'mark' ? 'select' : 'mark'),\n active: activeTool === 'mark',\n },\n ...(kind === 'markdown'\n ? [\n { label: 'Bold', glyph: 'B', action: () => format('Bold') },\n { label: 'Heading', glyph: 'H', action: () => format('Heading') },\n { label: 'Link', glyph: '↗', action: () => format('Link') },\n { label: 'List', glyph: '≡', action: () => format('List') },\n ]\n : []),\n {\n label: 'Comment',\n glyph: '●',\n action: () => setAuthorToolMode(sessionId, activeTool === 'comment' ? 'select' : 'comment'),\n active: activeTool === 'comment',\n },\n ];\n return (\n <section data-testid=\"author-tool-palette\" className=\"space-y-2 border-b border-doom-border-soft pb-3\">\n <div className=\"flex justify-between text-sm text-doom-dim\">\n <h3 className=\"font-bold tracking-widest\">TOOLS</h3>\n <span>focused tab</span>\n </div>\n <div className=\"grid grid-cols-3 gap-1.5\">\n {tools.map((tool) => (\n <Button\n key={tool.label}\n size=\"md\"\n variant=\"outline\"\n aria-label={tool.label === 'Region' ? 'mark region' : tool.label}\n aria-pressed={tool.active}\n onClick={tool.action}\n className={`min-h-11 min-w-11 gap-1.5 rounded border text-base [@media(pointer:fine)]:min-h-8 sm:text-sm ${tool.active ? 'border-doom-red bg-doom-red/10 text-doom-red hover:bg-doom-red/15' : 'border-doom-border bg-doom-panel text-doom-dim'}`}\n >\n <span aria-hidden=\"true\">{tool.glyph}</span>\n {tool.label}\n </Button>\n ))}\n </div>\n <p className=\"text-base leading-normal text-doom-dim sm:text-sm\">\n {activeTool === 'mark'\n ? 'Drag over the document to mark a region.'\n : activeTool === 'comment'\n ? 'Click the document to place a comment pin.'\n : 'Choose Region to drag an area, or Comment to place a point.'}\n </p>\n {error ? <output className=\"block text-base text-doom-red\">{error}</output> : null}\n </section>\n );\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useState } from 'react';\n\nimport { autonomousVoiceGridVisible } from '../../_components/AuthorGridOverlay';\nimport { authorCaptureContext, createAuthorCapturePacket, multiRegionCaptureProvider } from '../../_lib/authorCapture';\nimport { authorGrid } from '../../_lib/authorGrid';\nimport { authorWorkspace } from '../../_lib/authorWorkspaceStore';\nimport { AuthorRegionDrafts } from './AuthorRegionDrafts';\nimport { AuthorRequestLog } from './AuthorRequestLog';\nimport { AuthorToolPalette } from './AuthorToolPalette';\n\nexport function AuthorPanel({\n sessionId,\n activeMinorModes,\n submitCapture,\n statuses,\n renderSlot,\n renderSessionActivity,\n}: WebPluginSlotProps) {\n const [captureStatus, setCaptureStatus] = useState<string>();\n const [capturing, setCapturing] = useState(false);\n const documents = useStore(authorWorkspace.store, (state) => {\n if (sessionId === null) return [];\n const prefix = `${sessionId}\\n`;\n return Object.entries(state.documents)\n .filter(([key]) => key.startsWith(prefix))\n .map(([, document]) => document);\n });\n const workspace = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.sessions[sessionId],\n );\n const grid = useStore(authorGrid.store, (state) => (sessionId === null ? undefined : state.sessions[sessionId]));\n const focused = documents.find((document) => document.path === workspace?.focusedDocument?.path);\n const activity = sessionId === null ? null : (renderSessionActivity?.() ?? null);\n if (!activeMinorModes?.includes('author')) return null;\n return (\n <section data-testid=\"author-panel\" className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3\">\n <div className=\"flex flex-col gap-2\">\n <div data-testid=\"author-preview-providers\">{renderSlot('author.preview-provider')}</div>\n {sessionId !== null && workspace !== undefined && focused !== undefined ? (\n <>\n <h2 className=\"text-base font-semibold text-doom-text\">Annotations</h2>\n <p className=\"text-base leading-normal text-doom-dim sm:text-sm\">\n Drag a region or place a point, add feedback, then submit here. Requests queue while the agent is\n working.\n </p>\n {focused.kind === 'video' ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Annotations reference video frames. They do not save changes to the source video.\n </p>\n ) : null}\n <AuthorToolPalette sessionId={sessionId} kind={focused.kind} activeTool={workspace.activeTool} />\n {autonomousVoiceGridVisible(statuses) && grid !== undefined ? (\n <div\n data-testid=\"author-grid-snapshot\"\n className=\"rounded border border-doom-red/40 bg-doom-red/5 p-2 text-base text-doom-dim\"\n >\n <strong className=\"text-doom-red\">VOICE GRID A1–H8</strong>\n <p className=\"mt-1 truncate\">token {grid.geometryToken}</p>\n </div>\n ) : null}\n <AuthorRegionDrafts key={focused.path} sessionId={sessionId} workspace={workspace} />\n {workspace.annotations.length > 0 ? (\n <div className=\"space-y-1.5 border-b border-doom-border-soft pb-3\">\n <Button\n className=\"min-h-11 min-w-11 w-full text-base [@media(pointer:fine)]:min-h-8 sm:text-sm\"\n variant=\"outline\"\n data-testid=\"author-attach-capture\"\n disabled={capturing || workspace.candidate !== undefined || submitCapture === undefined}\n onClick={async () => {\n if (capturing || workspace.candidate || submitCapture === undefined) return;\n setCapturing(true);\n setCaptureStatus('Submitting annotations…');\n try {\n const packet = createAuthorCapturePacket(\n crypto.randomUUID(),\n Date.now(),\n focused,\n workspace.annotations,\n );\n const image = await multiRegionCaptureProvider(workspace.annotations).capture();\n await submitCapture({ ...image, context: authorCaptureContext(packet) });\n setCaptureStatus('Request submitted. You can keep annotating here.');\n } catch (reason) {\n setCaptureStatus(reason instanceof Error ? reason.message : String(reason));\n } finally {\n setCapturing(false);\n }\n }}\n >\n {capturing\n ? 'Submitting…'\n : `Submit ${workspace.annotations.length} annotation${workspace.annotations.length === 1 ? '' : 's'}`}\n </Button>\n {workspace.candidate ? (\n <p className=\"text-base text-doom-dim sm:text-sm\">\n Add or discard the current annotation before submitting.\n </p>\n ) : null}\n </div>\n ) : null}\n {submitCapture === undefined ? (\n <output className=\"text-sm text-doom-red\">Submission unavailable. Reload to update the app.</output>\n ) : null}\n {captureStatus ? <output className=\"block text-sm text-doom-dim\">{captureStatus}</output> : null}\n </>\n ) : null}\n <AuthorRequestLog requests={workspace?.requests ?? []} />\n </div>\n </div>\n {activity === null ? null : (\n <footer data-testid=\"author-session-activity\" className=\"shrink-0 border-t border-doom-border bg-doom-rail p-3\">\n {activity}\n </footer>\n )}\n </section>\n );\n}\n","import { defineDockFace } from '@agimon-ai/doompi-core/web';\n\nimport { AuthorPanel } from './_components/AuthorPanel';\n\nexport default defineDockFace({\n id: 'authoring',\n label: 'authoring',\n order: 30,\n autoSelect: true,\n panel: AuthorPanel,\n requiredMinorMode: 'author',\n visibility: {\n subscribe() {\n return () => undefined;\n },\n isVisible(sessionId: string | null) {\n return sessionId !== null;\n },\n },\n});\n","import type { SlotDeclaration, TransientTab, WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport type { ComponentType } from 'react';\n\nexport interface AuthorPreviewActionSource {\n path: string;\n hasUnsavedChanges: boolean;\n kind?: string;\n revision?: number;\n sourceSha256?: string;\n}\n\nexport interface AuthorPreviewAnnotationLocation {\n mode: 'region' | 'point';\n point: { x: number; y: number };\n rect?: { x: number; y: number; width: number; height: number };\n}\n\nexport interface AuthorPreviewDisplayedAnnotation extends AuthorPreviewAnnotationLocation {\n ordinal: number;\n}\n\nexport interface AuthorPreviewAnnotationCandidate extends AuthorPreviewAnnotationLocation {\n preview: AuthorStoryPreviewIdentity;\n evidence: Blob;\n thumbnailUrl: string;\n}\n\nexport interface AuthorPreviewPanelProps extends WebPluginSlotProps {\n source: AuthorPreviewActionSource;\n activeTool?: 'select' | 'mark' | 'comment';\n displayedAnnotations?: readonly AuthorPreviewDisplayedAnnotation[];\n pendingCandidate?: boolean;\n onAnnotationCandidate?: (candidate: AuthorPreviewAnnotationCandidate) => void;\n}\n\nexport interface AuthorPreviewAction {\n version: 1;\n label: string;\n detail?: string;\n createTab(input: { source?: AuthorPreviewActionSource }): TransientTab;\n supportsSource?: (source: AuthorPreviewActionSource) => boolean;\n embeddedPanel?: ComponentType<AuthorPreviewPanelProps>;\n}\n\nexport function parseAuthorPreviewAction(input: unknown): AuthorPreviewAction | null {\n if (typeof input !== 'object' || input === null) return null;\n const candidate = input as Record<string, unknown>;\n if (candidate.version !== 1 || typeof candidate.label !== 'string' || candidate.label.trim() === '') return null;\n if (candidate.detail !== undefined && typeof candidate.detail !== 'string') return null;\n if (typeof candidate.createTab !== 'function') return null;\n if (candidate.supportsSource !== undefined && typeof candidate.supportsSource !== 'function') return null;\n if (candidate.embeddedPanel !== undefined && typeof candidate.embeddedPanel !== 'function') return null;\n return candidate as unknown as AuthorPreviewAction;\n}\n\nexport const authorPreviewActionSlot: SlotDeclaration<AuthorPreviewAction> = {\n slot: 'author.preview-action',\n parse: parseAuthorPreviewAction,\n};\n\nexport interface AuthorStoryPreviewSource {\n path: string;\n sha256: string;\n}\n\n/** Browser-safe identity retained with an immutable story-preview capture. */\nexport interface AuthorStoryPreviewIdentity {\n version: 1;\n provider: string;\n projectPath: string;\n storyPath: string;\n storyExport: string;\n buildRevision: string;\n viewport: { width: number; height: number };\n sources: readonly AuthorStoryPreviewSource[];\n}\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorSessionView } from './authorApi';\nimport type { DocumentPreflightReport, ParsedStructuredDocument } from './structuredDocuments';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path. The build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/author/`, so the mount is\n * stated once, by the folder that creates it. The browser used to restate it:\n * `authorStateUrl` built one URL from `API_BASE_PATH` and the document helper\n * two files away spelled `author` out again as a literal, so the two could\n * disagree and nothing would say so.\n *\n * The order below is the order the three Hono apps register in: `/state` in\n * `authorApi`, the eight bridge routes in `authorBridgeApi`, the three document\n * routes in `authorDocumentApi`. A reviewer can read the two side by side.\n *\n * Response types are named only where a caller reads the body. The bridge\n * routes are called by the hub's author channel over `requestSessionApi`, which\n * has its own message vocabulary and never sees this client.\n */\nexport default defineApiRoutes({\n state: {\n method: 'GET',\n path: '/state',\n response: apiResponse<AuthorSessionView>(),\n },\n bridgeRegister: {\n method: 'POST',\n path: '/bridge/register',\n },\n bridgeCatalog: {\n method: 'POST',\n path: '/bridge/catalog',\n },\n /** Long-polls for the next capability request, so it settles when one arrives. */\n bridgeNext: {\n method: 'POST',\n path: '/bridge/next',\n },\n bridgeResult: {\n method: 'POST',\n path: '/bridge/result',\n },\n bridgeCancelled: {\n method: 'POST',\n path: '/bridge/cancelled',\n },\n bridgeDisconnect: {\n method: 'POST',\n path: '/bridge/disconnect',\n },\n bridgeDescribe: {\n method: 'GET',\n path: '/bridge/describe',\n },\n bridgeInvoke: {\n method: 'POST',\n path: '/bridge/invoke',\n },\n /**\n * Parses one structured document.\n *\n * Answers a byte-length summary instead when the request names no format,\n * which is the agent-side tool path; the page always names one.\n */\n documentsOpen: {\n method: 'POST',\n path: '/documents/open',\n query: ['session'],\n response: apiResponse<ParsedStructuredDocument>(),\n },\n documentsPreflight: {\n method: 'POST',\n path: '/documents/preflight',\n query: ['session'],\n response: apiResponse<DocumentPreflightReport>(),\n },\n documentsSerialize: {\n method: 'POST',\n path: '/documents/serialize',\n query: ['session'],\n response: apiResponse<{ bytes: string; encoding: string }>(),\n },\n /**\n * The host's own bytes route, not this package's.\n *\n * `host: true` hangs it off the session root rather than under `/plugins`,\n * which is how the cockpit already serves it. Author reads a document's\n * bytes and its digest through it, and writes the edited bytes back to the\n * same path, so both stay raw transfers rather than calls: the body is the\n * file and the digest travels in a header.\n */\n file: {\n method: 'GET',\n path: '/file',\n query: ['path'],\n host: true,\n },\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'author' at. */\nexport const apiScopes = ['session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'author',\n transport: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\n});\n","import type { AuthorModeActivation } from './author';\n\n/**\n * The wire vocabulary this package's API shares with whatever calls it.\n *\n * Paths live in `./apiRoutes`, which the Hono apps register from and the\n * generated client addresses, so neither half can move alone. What stays here\n * is the mount segment the server registers under and the shape the state\n * route answers with.\n */\n\n/** Where a host mounts this package's API; the segment after /api/plugins/. */\nexport const API_BASE_PATH = 'author';\n\n/** Query parameter naming the session a document request belongs to. */\nexport const SESSION_QUERY_PARAM = 'session';\n\nexport interface AuthorSessionView {\n sessionId: string | null;\n activation: AuthorModeActivation;\n capabilityCount: number;\n}\n","import type { ApiMethod } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\nimport { api } from '../../../../../../generated/client';\nimport { SESSION_QUERY_PARAM } from '../../../../../types/authorApi';\nimport type {\n CsvDialect,\n DocumentFragment,\n DocumentOperation,\n StructuredDocumentFormat,\n} from '../../../../../types/structuredDocuments';\nimport type { AuthorDocumentInput, AuthorDocumentKind } from './authorViewportTypes';\n\nconst IMAGE_EXTENSIONS = new Set(['avif', 'bmp', 'gif', 'jpeg', 'jpg', 'png', 'svg', 'webp']);\nconst VIDEO_EXTENSIONS = new Set(['m4v', 'mov', 'mp4', 'webm']);\n\nfunction structuredFormat(path: string): StructuredDocumentFormat | undefined {\n const lower = path.toLowerCase();\n if (lower.endsWith('.slides.md')) return 'markdown-slides';\n if (lower.endsWith('.csv')) return 'csv';\n if (lower.endsWith('.pptx')) return 'pptx';\n if (lower.endsWith('.xlsx')) return 'xlsx';\n return undefined;\n}\n\nexport function authorKindForPath(path: string): AuthorDocumentKind {\n const lower = path.toLowerCase();\n if (/\\.stories\\.(?:js|jsx|ts|tsx)$/u.test(lower)) return 'story-preview';\n const format = structuredFormat(path);\n if (format === 'markdown-slides') return 'slides';\n if (format !== undefined) return format;\n const extension = lower.split('.').at(-1) ?? '';\n if (extension === 'md') return 'markdown';\n if (IMAGE_EXTENSIONS.has(extension)) return 'image';\n if (VIDEO_EXTENSIONS.has(extension)) return 'video';\n if (extension === 'pdf') return 'pdf';\n if (['txt', 'json', 'yaml', 'yml', 'xml', 'html', 'css', 'js', 'ts', 'tsx', 'jsx'].includes(extension)) return 'text';\n return 'opaque';\n}\n\n/**\n * Where a document's bytes are read from and written back to.\n *\n * This is the host's route, not this package's, which is why the route table\n * marks it `host: true` and it lands beside the session rather than under\n * `/plugins`. It stays a raw transfer rather than a call: the body is the file\n * itself, and the digest travels in a header on both legs.\n */\nexport function authorSessionFileUrl(sessionId: string, path: string): string {\n return api.session(sessionId).file.url({ query: { path } });\n}\n\n/** One document route, with the refusal the reader is shown: the route's own words, or its status. */\nasync function documentRequest<T>(\n method: ApiMethod<T>,\n sessionId: string,\n body: Record<string, unknown>,\n signal?: AbortSignal,\n): Promise<T> {\n const result = await method({\n body,\n query: { [SESSION_QUERY_PARAM]: sessionId },\n ...(signal === undefined ? {} : { signal }),\n });\n if (!result.ok) throw new Error(result.error === '' ? `Author document API failed (${result.status})` : result.error);\n return result.data;\n}\n\nexport async function loadAuthorDocument(\n sessionId: string,\n path: string,\n signal?: AbortSignal,\n): Promise<AuthorDocumentInput> {\n const kind = authorKindForPath(path);\n const url = authorSessionFileUrl(sessionId, path);\n const response = await sealedTransport.fetch(url, { signal });\n if (!response.ok) throw new Error(`Author could not open ${path} (${response.status})`);\n const sourceSha256 = response.headers.get('X-File-SHA256') ?? undefined;\n const format = structuredFormat(path);\n if (format !== undefined) {\n const parsed = await documentRequest(api.session(sessionId).documentsOpen, sessionId, { path, format }, signal);\n const parsedDigest = parsed.manifest?.sourceDigest;\n if (sourceSha256 !== undefined && parsedDigest !== undefined && sourceSha256 !== parsedDigest) {\n throw new Error('Document source changed while opening. Reopen the document.');\n }\n const csvDialect = format === 'csv' ? csvDialectFromMetadata(parsed.manifest?.metadata) : undefined;\n return {\n path,\n kind,\n title: path.split('/').at(-1) ?? path,\n structuredFormat: format,\n fragments: parsed.fragments,\n ...(csvDialect === undefined ? {} : { csvDialect }),\n originalFragments: parsed.fragments.map((fragment) => ({ ...fragment })),\n ...(sourceSha256 === undefined ? {} : { sourceSha256 }),\n };\n }\n const mediaUrl = kind === 'image' || kind === 'video' || kind === 'pdf' || kind === 'opaque' ? url : undefined;\n const content =\n kind === 'text' || kind === 'markdown' || kind === 'story-preview' ? await response.text() : undefined;\n return {\n path,\n kind,\n title: path.split('/').at(-1) ?? path,\n ...(content === undefined ? {} : { content }),\n ...(mediaUrl === undefined ? {} : { mediaUrl }),\n ...(sourceSha256 === undefined ? {} : { sourceSha256 }),\n };\n}\n\nfunction operationsFor(document: AuthorDocumentInput): DocumentOperation[] {\n const originals = new Map((document.originalFragments ?? []).map((fragment) => [fragment.id, fragment.text]));\n return (document.fragments ?? [])\n .filter((fragment) => !fragment.readOnly && originals.get(fragment.id) !== fragment.text)\n .map((fragment) => ({ fragmentId: fragment.id, replacement: fragment.text }));\n}\n\nfunction decodeBase64(value: string): Uint8Array {\n if (!/^(?:[A-Za-z\\d+/]{4})*(?:[A-Za-z\\d+/]{2}==|[A-Za-z\\d+/]{3}=)?$/.test(value))\n throw new Error('Invalid serialized document bytes.');\n const binary = atob(value);\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\nfunction imageMimeType(path: string): 'image/png' | 'image/jpeg' | 'image/webp' | undefined {\n const extension = path.split('.').at(-1)?.toLowerCase();\n if (extension === 'png') return 'image/png';\n if (extension === 'jpg' || extension === 'jpeg') return 'image/jpeg';\n if (extension === 'webp') return 'image/webp';\n return undefined;\n}\n\nasync function croppedImageBytes(documentInput: AuthorDocumentInput, signal?: AbortSignal): Promise<Blob> {\n const { crop, mediaUrl } = documentInput;\n if (crop === undefined || mediaUrl === undefined) throw new Error('This Author image has no crop source.');\n const mimeType = imageMimeType(documentInput.path);\n if (mimeType === undefined) throw new Error('This image format cannot preserve its encoding after crop.');\n const response = await sealedTransport.fetch(mediaUrl, { signal, cache: 'no-store' });\n if (!response.ok) throw new Error(`Author could not read the image before saving (${response.status})`);\n const bitmap = await createImageBitmap(await response.blob());\n try {\n const sourceX = Math.round(crop.x * bitmap.width);\n const sourceY = Math.round(crop.y * bitmap.height);\n const sourceWidth = Math.max(1, Math.round(crop.width * bitmap.width));\n const sourceHeight = Math.max(1, Math.round(crop.height * bitmap.height));\n const canvas = window.document.createElement('canvas');\n canvas.width = sourceWidth;\n canvas.height = sourceHeight;\n const context = canvas.getContext('2d');\n if (context === null) throw new Error('Canvas is unavailable for image crop.');\n context.drawImage(bitmap, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, sourceWidth, sourceHeight);\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, mimeType));\n if (blob === null || blob.type !== mimeType)\n throw new Error('The browser cannot encode this cropped image format.');\n return blob;\n } finally {\n bitmap.close();\n }\n}\n\nasync function bytesToSave(sessionId: string, document: AuthorDocumentInput, signal?: AbortSignal): Promise<BodyInit> {\n if (document.kind === 'text' || document.kind === 'markdown' || document.kind === 'story-preview')\n return document.content ?? '';\n if (document.kind === 'image' && document.crop !== undefined) return await croppedImageBytes(document, signal);\n if (document.structuredFormat === undefined) throw new Error('This Author view cannot be saved.');\n const operations = operationsFor(document);\n const request = {\n path: document.path,\n format: document.structuredFormat,\n operations,\n ...(document.csvDialect === undefined ? {} : { csvDialect: document.csvDialect }),\n };\n const preflight = await documentRequest(api.session(sessionId).documentsPreflight, sessionId, request, signal);\n if (preflight.sourceDigest !== undefined && preflight.sourceDigest !== document.sourceSha256) {\n throw new Error('Document source changed before saving. Reopen the document.');\n }\n if (!preflight.accepted)\n throw new Error(preflight.issues.map((issue) => issue.message).join('\\n') || 'Author preflight rejected the edit.');\n const serialized = await documentRequest(\n api.session(sessionId).documentsSerialize,\n sessionId,\n { ...request, preflightDigest: preflight.digest },\n signal,\n );\n if (serialized.encoding !== 'base64') throw new Error('Author serialize returned an unsupported encoding.');\n const bytes = decodeBase64(serialized.bytes);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nexport async function saveAuthorDocument(\n sessionId: string,\n document: AuthorDocumentInput,\n signal?: AbortSignal,\n): Promise<string> {\n if (document.sourceSha256 === undefined) throw new Error('This Author view has no source digest.');\n const response = await sealedTransport.fetch(authorSessionFileUrl(sessionId, document.path), {\n method: 'PUT',\n headers: { 'Content-Type': 'application/octet-stream', 'X-Expected-SHA256': document.sourceSha256 },\n body: await bytesToSave(sessionId, document, signal),\n signal,\n });\n if (!response.ok) throw new Error(`Author save failed (${response.status})`);\n const sha256 = response.headers.get('X-File-SHA256');\n if (sha256 === null || !/^[a-f0-9]{64}$/.test(sha256)) throw new Error('Author save returned an invalid digest.');\n return sha256;\n}\n\nfunction csvDialectFromMetadata(\n metadata: Record<string, string | number | boolean> | undefined,\n): CsvDialect | undefined {\n if (metadata === undefined) return undefined;\n const { delimiter, quote, recordDelimiter } = metadata;\n if (\n (delimiter !== ',' && delimiter !== ';' && delimiter !== '\\t' && delimiter !== '|') ||\n (quote !== '\"' && quote !== \"'\") ||\n (recordDelimiter !== '\\n' && recordDelimiter !== '\\r\\n')\n ) {\n throw new Error('Author document API returned an invalid CSV dialect.');\n }\n return { delimiter, quote, recordDelimiter };\n}\n\nexport function editableStructuredFragments(document: AuthorDocumentInput): readonly DocumentFragment[] {\n return document.fragments ?? [];\n}\n","import type { AuthorJsonSchema } from '../../../../../types/author';\nimport { authorGridGeometry, resolveAuthorGridCell, resolveAuthorGridNativeAnchor } from './authorGrid';\nimport type {\n AuthorDocumentKind,\n AuthorNativeAnchor,\n AuthorRegionDraft,\n AuthorTrustedTool,\n} from './authorViewportTypes';\nimport {\n addAuthorRegion,\n authorDocument,\n authorSessionWorkspace,\n putAuthorRequest,\n reviseAuthorDocument,\n reviseAuthorFragment,\n setAuthorCrop,\n updateAuthorRequest,\n} from './authorWorkspaceStore';\n\nconst stringProperty = { type: 'string', minLength: 1 } as const;\n\nfunction inputRecord(input: unknown): Record<string, unknown> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) throw new Error('Expected an object.');\n return input as Record<string, unknown>;\n}\n\nfunction requiredString(value: Record<string, unknown>, name: string): string {\n if (typeof value[name] !== 'string' || value[name] === '') throw new Error(`${name} must be a non-empty string.`);\n return value[name];\n}\n\nfunction resolvedAnchor(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n cell: ReturnType<typeof resolveAuthorGridCell>,\n): { anchor: AuthorNativeAnchor; quote?: string } {\n const document = authorDocument(sessionId, path);\n if (document === undefined) throw new Error('STALE_DOCUMENT: The focused Author document is no longer open.');\n if (kind === 'pdf' || kind === 'video' || kind === 'opaque') {\n throw new Error(\n 'UNSUPPORTED_GRID: PDF and video coordinates are capture-only and require a visible native selection.',\n );\n }\n return resolveAuthorGridNativeAnchor(sessionId, cell);\n}\n\nfunction checkedRegion(sessionId: string, path: string, value: Record<string, unknown>) {\n const document = authorDocument(sessionId, path);\n if (document === undefined) throw new Error('STALE_DOCUMENT: The Author document is no longer open.');\n if (document.savingVersion !== undefined)\n throw new Error('SAVE_IN_PROGRESS: Wait for the current Author save to finish.');\n const expectedRevision = value.expectedRevision;\n const expectedSourceSha256 = requiredString(value, 'expectedSourceSha256');\n if (expectedRevision !== document.version || expectedSourceSha256 !== document.sourceSha256) {\n throw new Error('STALE_DOCUMENT: The Author revision or source digest changed.');\n }\n const regionId = requiredString(value, 'regionId');\n const workspace = authorSessionWorkspace(sessionId);\n const region =\n workspace.regions.find((candidate) => candidate.id === regionId) ??\n workspace.requests\n .filter((request) => request.status === 'REQUESTED' || request.status === 'CHANGING')\n .flatMap((request) => request.pendingRegions ?? request.regions)\n .find((candidate) => candidate.id === regionId);\n if (region === undefined || region.documentPath !== path)\n throw new Error('STALE_REGION: The resolved Author region is unavailable.');\n if (region.revision !== document.version || region.sourceSha256 !== document.sourceSha256) {\n throw new Error('STALE_REGION: The resolved Author region no longer matches the document.');\n }\n return { document, region };\n}\n\nfunction gridTools(sessionId: string, path: string, kind: AuthorDocumentKind): AuthorTrustedTool[] {\n const describeSchema: AuthorJsonSchema = { type: 'object', additionalProperties: false, properties: {} };\n return [\n {\n name: 'author_describe_grid',\n label: 'Describe grid',\n description: 'Describe the current A1 through H8 grid and return its geometry token.',\n inputSchema: describeSchema,\n execute: async () => {\n const geometry = authorGridGeometry(sessionId);\n const document = authorDocument(sessionId, path);\n if (\n geometry === undefined ||\n document === undefined ||\n geometry.documentPath !== path ||\n geometry.revision !== document.version\n ) {\n throw new Error('STALE_GRID: The visible Author grid is unavailable.');\n }\n return { columns: 'A-H', rows: '1-8', ...geometry };\n },\n },\n {\n name: 'author_resolve_grid_cell',\n label: 'Resolve grid cell',\n description: 'Resolve one current grid cell to a native document anchor before mutation.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['cell', 'geometryToken', 'instruction'],\n properties: { cell: stringProperty, geometryToken: stringProperty, instruction: stringProperty },\n },\n execute: async (input) => {\n const value = inputRecord(input);\n const instruction = requiredString(value, 'instruction');\n const cell = resolveAuthorGridCell(\n sessionId,\n requiredString(value, 'cell'),\n requiredString(value, 'geometryToken'),\n );\n const geometry = authorGridGeometry(sessionId)!;\n const resolved = resolvedAnchor(sessionId, path, kind, cell);\n const regionId = crypto.randomUUID();\n const createdAt = Date.now();\n const region = {\n id: regionId,\n documentPath: path,\n revision: geometry.revision,\n sourceSha256: geometry.sourceSha256,\n comment: instruction,\n ...resolved,\n viewport: { ...geometry.viewport },\n voiceGrid: cell.evidence,\n createdAt,\n };\n addAuthorRegion(sessionId, region);\n putAuthorRequest(sessionId, {\n id: `voice:${regionId}`,\n documentPath: path,\n requestText: instruction,\n regions: [region],\n pendingRegions: [region],\n status: 'REQUESTED',\n createdAt,\n updatedAt: createdAt,\n revision: geometry.revision,\n sourceSha256: geometry.sourceSha256,\n });\n return { regionId, anchor: resolved.anchor, quote: resolved.quote, evidence: cell.evidence };\n },\n },\n ];\n}\n\ninterface MutationResult {\n changed: true;\n before?: string;\n after?: string;\n crop?: unknown;\n revision: number;\n}\n\nfunction assertRebasable(pending: readonly AuthorRegionDraft[], changed: AuthorRegionDraft): void {\n const remaining = pending.filter((region) => region.id !== changed.id);\n if (changed.anchor.kind === 'image-rect' && remaining.length > 0)\n throw new Error('UNSUPPORTED_REGION: A multi-region image request cannot apply more than one crop.');\n if (changed.anchor.kind !== 'text-range') return;\n for (const region of remaining) {\n if (region.anchor.kind !== 'text-range') continue;\n const separate =\n region.anchor.endOffset <= changed.anchor.startOffset || region.anchor.startOffset >= changed.anchor.endOffset;\n if (!separate) throw new Error('AMBIGUOUS_REGION: Submitted text regions overlap and cannot be safely rebased.');\n }\n}\n\nfunction lineAtOffset(content: string, offset: number): number {\n return content.slice(0, Math.max(0, offset)).split('\\n').length;\n}\n\nfunction rebasePendingRegions(\n pending: readonly AuthorRegionDraft[],\n changed: AuthorRegionDraft,\n result: MutationResult,\n nextContent: string | undefined,\n): readonly AuthorRegionDraft[] {\n return pending\n .filter((region) => region.id !== changed.id)\n .map((region) => {\n if (changed.anchor.kind !== 'text-range' || region.anchor.kind !== 'text-range' || nextContent === undefined)\n return { ...region, revision: result.revision };\n const delta = (result.after?.length ?? 0) - (result.before?.length ?? 0);\n const shift = region.anchor.startOffset >= changed.anchor.endOffset ? delta : 0;\n const startOffset = region.anchor.startOffset + shift;\n const endOffset = region.anchor.endOffset + shift;\n return {\n ...region,\n revision: result.revision,\n anchor: {\n ...region.anchor,\n startOffset,\n endOffset,\n startLine: lineAtOffset(nextContent, startOffset),\n endLine: lineAtOffset(nextContent, endOffset),\n },\n };\n });\n}\nfunction mutationTool(sessionId: string, path: string, kind: AuthorDocumentKind): AuthorTrustedTool | undefined {\n if (kind === 'pdf' || kind === 'video' || kind === 'opaque') return undefined;\n const needsReplacement = kind !== 'image';\n return {\n name: 'author_apply_region',\n label: 'Apply region change',\n description: 'Apply a fenced mutation through a previously resolved native Author region.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['regionId', 'expectedRevision', 'expectedSourceSha256', ...(needsReplacement ? ['replacement'] : [])],\n properties: {\n regionId: stringProperty,\n expectedRevision: { type: 'integer', minimum: 0 },\n expectedSourceSha256: stringProperty,\n ...(needsReplacement ? { replacement: { type: 'string' } } : {}),\n },\n },\n execute: async (input, signal) => {\n const value = inputRecord(input);\n const regionId = requiredString(value, 'regionId');\n const request = authorSessionWorkspace(sessionId).requests.find(\n (candidate) =>\n (candidate.pendingRegions ?? candidate.regions).some((item) => item.id === regionId) &&\n candidate.status === 'REQUESTED',\n );\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: 'CHANGING',\n currentOperation: 'validating native anchor',\n updatedAt: Date.now(),\n }));\n }\n try {\n if (signal.aborted)\n throw signal.reason instanceof Error ? signal.reason : new Error('Author mutation cancelled.');\n const { document, region } = checkedRegion(sessionId, path, value);\n const pending = request?.pendingRegions ?? request?.regions ?? [region];\n assertRebasable(pending, region);\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n currentOperation: `mutating ${region.anchor.kind}`,\n updatedAt: Date.now(),\n }));\n }\n let result: MutationResult;\n let nextContent: string | undefined;\n if (region.anchor.kind === 'text-range') {\n const replacement = typeof value.replacement === 'string' ? value.replacement : '';\n const { startOffset, endOffset } = region.anchor;\n const content = document.content ?? '';\n const before = content.slice(startOffset, endOffset);\n nextContent = content.slice(0, startOffset) + replacement + content.slice(endOffset);\n reviseAuthorDocument(sessionId, path, nextContent);\n result = { changed: true, before, after: replacement, revision: document.version + 1 };\n } else if (region.anchor.kind === 'cell' || region.anchor.kind === 'slide-element') {\n const fragmentId = region.anchor.fragmentId;\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.readOnly === true)\n throw new Error('UNSUPPORTED_REGION: The native fragment is not editable.');\n const replacement = typeof value.replacement === 'string' ? value.replacement : '';\n reviseAuthorFragment(sessionId, path, fragment.id, replacement);\n result = { changed: true, before: fragment.text, after: replacement, revision: document.version + 1 };\n } else if (region.anchor.kind === 'image-rect') {\n setAuthorCrop(sessionId, path, region.anchor.rect);\n result = { changed: true, crop: region.anchor.rect, revision: document.version + 1 };\n } else {\n throw new Error('UNSUPPORTED_REGION: PDF and video regions are capture-only.');\n }\n if (request !== undefined) {\n const pendingRegions = rebasePendingRegions(pending, region, result, nextContent);\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: pendingRegions.length === 0 ? 'CHANGED' : 'REQUESTED',\n currentOperation: undefined,\n before: [current.before, result.before].filter((item) => item !== undefined).join('\\n') || undefined,\n after:\n [current.after, result.after ?? (result.crop === undefined ? undefined : JSON.stringify(result.crop))]\n .filter((item) => item !== undefined)\n .join('\\n') || undefined,\n pendingRegions,\n revision: result.revision,\n updatedAt: Date.now(),\n }));\n }\n return result;\n } catch (error) {\n if (request !== undefined) {\n updateAuthorRequest(sessionId, request.id, (current) => ({\n ...current,\n status: signal.aborted ? 'CANCELLED' : 'FAILED',\n currentOperation: undefined,\n error: signal.aborted\n ? 'Author mutation cancelled.'\n : error instanceof Error\n ? error.message\n : String(error),\n updatedAt: Date.now(),\n }));\n }\n throw error;\n }\n },\n };\n}\n\nexport function authorGridTools(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n): readonly AuthorTrustedTool[] {\n const mutation = mutationTool(sessionId, path, kind);\n return [...gridTools(sessionId, path, kind), ...(mutation === undefined ? [] : [mutation])];\n}\n","import type { AuthorJsonSchema } from '../../../../../types/author';\nimport { authorGridTools } from './authorGridTools';\nimport { AUTHOR_RUNTIME_BINDING_IDS } from './authorRuntime';\nimport type { AuthorDocumentKind, AuthorTrustedProfile } from './authorViewportTypes';\nimport { addAuthorAnnotation } from './authorWorkspaceStore';\n\nfunction record(input: unknown): Record<string, unknown> {\n if (typeof input !== 'object' || input === null || Array.isArray(input)) throw new Error('Expected an object');\n return input as Record<string, unknown>;\n}\n\nfunction text(value: unknown, field: string): string {\n if (typeof value !== 'string') throw new Error(`${field} must be a string`);\n return value;\n}\n\nfunction target(input: unknown): { sessionId: string; path: string; value: Record<string, unknown> } {\n const value = record(input);\n return { sessionId: text(value.sessionId, 'sessionId'), path: text(value.path, 'path'), value };\n}\n\nconst TARGET_PROPERTIES = {\n sessionId: { type: 'string', minLength: 1 },\n path: { type: 'string', minLength: 1 },\n} as const;\n\nexport const AUTHOR_TEXT_PROFILE: AuthorTrustedProfile = {\n id: AUTHOR_RUNTIME_BINDING_IDS.text,\n tools: [\n {\n name: 'author_add_comment',\n label: 'Add comment',\n description: 'Add a local review comment to one open Author document.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['sessionId', 'path', 'body'],\n properties: { ...TARGET_PROPERTIES, body: { type: 'string' }, quote: { type: 'string' } },\n },\n execute: async (input) => {\n const { sessionId, path, value } = target(input);\n const body = text(value.body, 'body');\n addAuthorAnnotation(sessionId, path, {\n id: `${Date.now()}:${body.length}`,\n kind: 'comment',\n body,\n ...(typeof value.quote === 'string' ? { quote: value.quote } : {}),\n });\n return { added: true };\n },\n },\n {\n name: 'author_add_highlight',\n label: 'Add highlight',\n description: 'Highlight a line range in one open Author text document.',\n inputSchema: {\n type: 'object',\n additionalProperties: false,\n required: ['sessionId', 'path', 'startLine', 'endLine'],\n properties: {\n ...TARGET_PROPERTIES,\n startLine: { type: 'integer', minimum: 1 },\n endLine: { type: 'integer', minimum: 1 },\n },\n },\n execute: async (input) => {\n const { sessionId, path, value } = target(input);\n if (!Number.isSafeInteger(value.startLine) || !Number.isSafeInteger(value.endLine)) {\n throw new Error('Highlight lines must be integers');\n }\n const startLine = value.startLine as number;\n const endLine = value.endLine as number;\n if (startLine < 1 || endLine < startLine) throw new Error('Invalid highlight range');\n addAuthorAnnotation(sessionId, path, {\n id: `${Date.now()}:${startLine}:${endLine}`,\n kind: 'highlight',\n body: '',\n startLine,\n endLine,\n });\n return { added: true };\n },\n },\n ],\n};\n\nexport const AUTHOR_MEDIA_PROFILE: AuthorTrustedProfile = {\n id: AUTHOR_RUNTIME_BINDING_IDS.media,\n tools: [],\n};\n\nexport const AUTHOR_TRUSTED_PROFILES = [AUTHOR_TEXT_PROFILE, AUTHOR_MEDIA_PROFILE] as const;\n\nfunction bindProfile(profile: AuthorTrustedProfile, sessionId: string, path: string): AuthorTrustedProfile {\n return {\n id: profile.id,\n tools: profile.tools.map((tool) => {\n const schema = tool.inputSchema as Record<string, unknown>;\n const properties = record(schema.properties);\n const { sessionId: _sessionId, path: _path, ...boundProperties } = properties;\n const required = Array.isArray(schema.required)\n ? schema.required.filter((entry) => entry !== 'sessionId' && entry !== 'path')\n : [];\n return {\n ...tool,\n inputSchema: { ...schema, properties: boundProperties, required } as AuthorJsonSchema,\n execute: async (input: unknown, signal: AbortSignal) =>\n await tool.execute({ ...record(input), sessionId, path }, signal),\n };\n }),\n };\n}\n\nexport function authorProfilesForDocument(\n sessionId: string,\n path: string,\n kind: AuthorDocumentKind,\n): readonly AuthorTrustedProfile[] {\n const profiles =\n kind === 'image'\n ? [bindProfile(AUTHOR_MEDIA_PROFILE, sessionId, path)]\n : kind === 'text' || kind === 'markdown'\n ? [bindProfile(AUTHOR_TEXT_PROFILE, sessionId, path)]\n : [];\n const tools = authorGridTools(sessionId, path, kind);\n if (tools.length === 0) return profiles;\n return profiles.length === 0\n ? [{ id: AUTHOR_RUNTIME_BINDING_IDS.media, tools }]\n : [{ ...profiles[0]!, tools: [...profiles[0]!.tools, ...tools] }];\n}\n","import { sealedTransport } from '@agimon-ai/doompi-web-security/browser';\n\n/**\n * Native media elements cannot perform the remote session's encrypted HTTP exchange.\n *\n * `source` addresses the host's own session file route, which the route table\n * declares as `file` with `host: true`; this package serves no bytes of its\n * own. The transport stays raw because what comes back is a blob, and a call\n * through the generated client reads the body as JSON to report a refusal.\n */\nexport async function loadAuthorMedia(source: string, signal: AbortSignal): Promise<{ url: string; dispose(): void }> {\n const response = await sealedTransport.fetch(source, { signal, cache: 'no-store' });\n if (!response.ok) throw new Error(`Author media could not be loaded (${response.status}).`);\n const blob = await response.blob();\n signal.throwIfAborted();\n const url = URL.createObjectURL(blob);\n let disposed = false;\n return {\n url,\n dispose() {\n if (disposed) return;\n disposed = true;\n URL.revokeObjectURL(url);\n },\n };\n}\n","import type { AuthorNormalizedRect } from './authorViewportTypes';\n\nexport interface AuthorClientRect {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\n/** Clamp a drag to the source element, including drags made in reverse. */\nexport function normalizedAuthorRectangle(\n bounds: AuthorClientRect,\n drag: AuthorClientRect,\n): AuthorNormalizedRect | null {\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n if (![...Object.values(bounds), ...Object.values(drag)].every(Number.isFinite) || width <= 0 || height <= 0)\n return null;\n const left = Math.max(bounds.left, Math.min(drag.left, drag.right));\n const right = Math.min(bounds.right, Math.max(drag.left, drag.right));\n const top = Math.max(bounds.top, Math.min(drag.top, drag.bottom));\n const bottom = Math.min(bounds.bottom, Math.max(drag.top, drag.bottom));\n if (right <= left || bottom <= top) return null;\n return {\n x: (left - bounds.left) / width,\n y: (top - bounds.top) / height,\n width: (right - left) / width,\n height: (bottom - top) / height,\n };\n}\n","import { Button, type MediaPlaybackState } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nexport function videoTimeLabel(seconds: number): string {\n const milliseconds = Math.max(0, Math.round((Number.isFinite(seconds) ? seconds : 0) * 1000));\n return `${String(Math.floor(milliseconds / 60000)).padStart(2, '0')}:${String(Math.floor(milliseconds / 1000) % 60).padStart(2, '0')}.${String(milliseconds % 1000).padStart(3, '0')}`;\n}\n\nexport function AuthorVideoControls({\n playback,\n ready,\n locked,\n marking,\n onSeek,\n onToggle,\n onAnnotate,\n}: {\n playback: MediaPlaybackState;\n ready: boolean;\n locked: boolean;\n marking: boolean;\n onSeek: (seconds: number) => void;\n onToggle: () => void;\n onAnnotate: () => void;\n}) {\n const [seconds, setSeconds] = useState('');\n const duration = playback.duration;\n const invalid =\n seconds.trim() === '' || !Number.isFinite(Number(seconds)) || Number(seconds) < 0 || Number(seconds) > duration;\n const buttonClass = 'min-h-11 px-3 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm';\n return (\n <section\n aria-label=\"Video annotation controls\"\n className=\"mt-2 space-y-2 rounded border border-doom-border bg-doom-panel p-2.5 text-base text-doom-text sm:text-sm\"\n >\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <output aria-label=\"Playback position\" className=\"font-mono text-base tabular-nums\">\n {videoTimeLabel(playback.currentTime)} / {videoTimeLabel(duration)}\n </output>\n <span className=\"text-doom-dim\">\n {locked\n ? 'Annotation draft: add or discard it before seeking.'\n : marking\n ? 'Frame paused. Drag a region on the video.'\n : 'Seek to a moment, then choose Annotate this frame.'}\n </span>\n </div>\n <input\n aria-label=\"Video timeline\"\n type=\"range\"\n min={0}\n max={duration || 0}\n step={0.001}\n value={Math.min(playback.currentTime, duration)}\n disabled={locked || duration <= 0}\n onChange={(event) => onSeek(Number(event.target.value))}\n className=\"h-11 w-full cursor-pointer accent-doom-blue [@media(pointer:fine)]:h-6\"\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button className={buttonClass} disabled={locked || duration <= 0} onClick={onToggle}>\n {playback.playing ? 'Pause' : 'Play'}\n </Button>\n <Button\n className={buttonClass}\n disabled={locked || duration <= 0}\n onClick={() => onSeek(Math.max(0, playback.currentTime - 0.1))}\n aria-label=\"Seek back 0.1 seconds\"\n >\n −0.1s\n </Button>\n <Button\n className={buttonClass}\n disabled={locked || duration <= 0}\n onClick={() => onSeek(Math.min(duration, playback.currentTime + 0.1))}\n aria-label=\"Seek forward 0.1 seconds\"\n >\n +0.1s\n </Button>\n <Button variant=\"primary\" className={buttonClass} disabled={locked || !ready} onClick={onAnnotate}>\n Annotate this frame\n </Button>\n <form\n className=\"flex flex-wrap items-center gap-2 sm:ml-auto\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!invalid && !locked) onSeek(Number(seconds));\n }}\n >\n <label htmlFor=\"author-video-seconds\" className=\"text-doom-dim\">\n Go to seconds\n </label>\n <input\n id=\"author-video-seconds\"\n type=\"number\"\n min={0}\n max={duration}\n step={0.001}\n value={seconds}\n onChange={(event) => setSeconds(event.target.value)}\n disabled={locked || duration <= 0}\n placeholder=\"1.250\"\n className=\"h-11 w-24 rounded border border-doom-border bg-doom-deep px-2 text-lg [@media(pointer:fine)]:h-8 sm:text-sm\"\n />\n <Button type=\"submit\" className={buttonClass} disabled={locked || duration <= 0 || invalid}>\n Go\n </Button>\n </form>\n </div>\n </section>\n );\n}\n","import {\n MediaPreview,\n type MediaPlaybackState,\n type MediaPreviewController,\n type PdfPreviewController,\n} from '@agimon-ai/doompi-web-components';\nimport { useEffect, useRef, useState, type PointerEvent } from 'react';\n\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport { loadAuthorMedia } from '../_lib/authorMedia';\nimport { normalizedAuthorRectangle } from '../_lib/authorRegions';\nimport type { AuthorDisplayedRegion, AuthorNativeAnchor, AuthorToolMode } from '../_lib/authorViewportTypes';\nimport {\n authorSessionWorkspace,\n setAuthorRegionCandidate,\n setAuthorToolMode,\n type AuthorSessionWorkspace,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\nimport { AuthorVideoControls } from './AuthorVideoControls';\n\n/** Marks source media. Native playback and page controls remain usable in select mode. */\nexport function AuthorMediaView({\n sessionId,\n document: source,\n activeTool,\n displayedRegions,\n pendingCandidate = false,\n seekRequest,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n activeTool: AuthorToolMode;\n displayedRegions: readonly AuthorDisplayedRegion[];\n pendingCandidate?: boolean;\n seekRequest?: AuthorSessionWorkspace['videoSeekRequest'];\n}) {\n const host = useRef<HTMLDivElement>(null);\n const image = useRef<HTMLImageElement>(null);\n const video = useRef<MediaPreviewController>(null);\n const pdf = useRef<PdfPreviewController>(null);\n const start = useRef<\n | {\n x: number;\n y: number;\n mode: 'mark' | 'comment';\n element: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n }\n | undefined\n >(undefined);\n const [playback, setPlayback] = useState<MediaPlaybackState>({ playing: false, currentTime: 0, duration: 0 });\n const [frameReady, setFrameReady] = useState(false);\n const [selection, setSelection] = useState<{\n path: string;\n rect?: NonNullable<ReturnType<typeof normalizedAuthorRectangle>>;\n point?: { x: number; y: number };\n }>();\n const [error, setError] = useState<string>();\n const [media, setMedia] = useState<{ source: string; url: string }>();\n const mediaUrl = media?.source === source.mediaUrl ? media?.url : undefined;\n useEffect(() => {\n if (source.mediaUrl === undefined) return;\n const input = source.mediaUrl;\n const controller = new AbortController();\n let dispose: (() => void) | undefined;\n setError(undefined);\n void loadAuthorMedia(input, controller.signal)\n .then((asset) => {\n if (controller.signal.aborted) {\n asset.dispose();\n return;\n }\n dispose = () => asset.dispose();\n setMedia({ source: input, url: asset.url });\n })\n .catch((cause: unknown) => {\n if (!controller.signal.aborted) setError(cause instanceof Error ? cause.message : String(cause));\n });\n return () => {\n controller.abort();\n dispose?.();\n };\n }, [source.mediaUrl]);\n const seek = (seconds: number) => {\n if (authorSessionWorkspace(sessionId).candidate || !Number.isFinite(seconds)) return;\n const player = video.current;\n if (!player) return;\n player.pause();\n setAuthorToolMode(sessionId, 'select');\n setSelection(undefined);\n if (player.getState().currentTime === seconds) return;\n setFrameReady(false);\n player.seek(seconds);\n };\n useEffect(() => {\n if (\n seekRequest?.path === source.path &&\n seekRequest.generation === authorSessionWorkspace(sessionId).focusedDocument?.generation\n ) {\n seek(seekRequest.timeSeconds);\n }\n }, [seekRequest]);\n useEffect(() => {\n if (!pendingCandidate && start.current === undefined) setSelection(undefined);\n }, [pendingCandidate]);\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n const target = image.current;\n if (source.kind !== 'image' || target === null || target.naturalWidth === 0 || target.naturalHeight === 0)\n return undefined;\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const cellBounds = {\n left: originX + cell.rect.x * width,\n top: originY + cell.rect.y * height,\n right: originX + (cell.rect.x + cell.rect.width) * width,\n bottom: originY + (cell.rect.y + cell.rect.height) * height,\n };\n const bounds = target.getBoundingClientRect();\n const left = Math.max(bounds.left, cellBounds.left);\n const top = Math.max(bounds.top, cellBounds.top);\n const right = Math.min(bounds.right, cellBounds.right);\n const bottom = Math.min(bounds.bottom, cellBounds.bottom);\n if (right <= left || bottom <= top || bounds.width <= 0 || bounds.height <= 0) return undefined;\n return {\n anchor: {\n kind: 'image-rect',\n rect: {\n x: (left - bounds.left) / bounds.width,\n y: (top - bounds.top) / bounds.height,\n width: (right - left) / bounds.width,\n height: (bottom - top) / bounds.height,\n },\n naturalWidth: target.naturalWidth,\n naturalHeight: target.naturalHeight,\n },\n };\n }),\n [sessionId, source.kind, source.path, source.version],\n );\n const mark = async (event: PointerEvent<HTMLDivElement>) => {\n const drag = start.current;\n start.current = undefined;\n if (!drag) return;\n const bounds = drag.element.getBoundingClientRect();\n if (bounds.width <= 0 || bounds.height <= 0) return;\n const point = {\n x: Math.min(1, Math.max(0, (event.clientX - bounds.left) / bounds.width)),\n y: Math.min(1, Math.max(0, (event.clientY - bounds.top) / bounds.height)),\n };\n const rect =\n drag.mode === 'mark'\n ? normalizedAuthorRectangle(bounds, {\n left: drag.x,\n top: drag.y,\n right: event.clientX,\n bottom: event.clientY,\n })\n : undefined;\n if (drag.mode === 'mark' && !rect) return;\n setSelection(drag.mode === 'mark' ? { path: source.path, rect: rect! } : { path: source.path, point });\n const focused = authorSessionWorkspace(sessionId).focusedDocument;\n if (!focused || focused.path !== source.path) return;\n let anchor: AuthorNativeAnchor;\n let blob: Blob | null = null;\n let thumbnailUrl: string | undefined;\n try {\n if (drag.element instanceof HTMLImageElement) {\n const image = drag.element;\n if (!image.naturalWidth || !image.naturalHeight) throw new Error('Image is not ready.');\n anchor =\n drag.mode === 'mark'\n ? { kind: 'image-rect', rect: rect!, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight }\n : { kind: 'image-point', point, naturalWidth: image.naturalWidth, naturalHeight: image.naturalHeight };\n const canvas = document.createElement('canvas');\n const scale = Math.min(1, 1600 / Math.max(image.naturalWidth, image.naturalHeight));\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Canvas is unavailable.');\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n } else if (source.kind === 'pdf') {\n const page = pdf.current?.getState();\n if (!page?.sourceWidth) throw new Error('PDF page is not ready.');\n anchor =\n drag.mode === 'mark'\n ? { kind: 'pdf-page-rect', page: page.page, rect: rect! }\n : { kind: 'pdf-page-point', page: page.page, point };\n blob = await pdf.current!.capturePage();\n } else {\n const frame = await video.current?.captureFrame();\n if (!frame) throw new Error('Video frame is not ready.');\n anchor =\n drag.mode === 'mark'\n ? {\n kind: 'video-time-rect',\n rect: rect!,\n timeSeconds: frame.timeSeconds,\n intrinsicWidth: frame.width,\n intrinsicHeight: frame.height,\n }\n : {\n kind: 'video-time-point',\n point,\n timeSeconds: frame.timeSeconds,\n intrinsicWidth: frame.width,\n intrinsicHeight: frame.height,\n };\n blob = frame.blob;\n }\n if (!blob) throw new Error('Unable to capture selected media.');\n if (authorSessionWorkspace(sessionId).focusedDocument?.generation !== focused.generation) return;\n thumbnailUrl = URL.createObjectURL(blob);\n setAuthorRegionCandidate(sessionId, {\n documentPath: source.path,\n revision: source.version,\n sourceSha256: source.sourceSha256,\n mode: drag.mode === 'mark' ? 'region' : 'point',\n anchor,\n viewport: { width: bounds.width, height: bounds.height },\n thumbnailUrl,\n evidence: blob,\n createdAt: Date.now(),\n });\n setError(undefined);\n } catch (reason) {\n if (thumbnailUrl) URL.revokeObjectURL(thumbnailUrl);\n setError(reason instanceof Error ? reason.message : String(reason));\n }\n };\n const selected = selection?.path === source.path ? selection.rect : undefined;\n const selectedPoint = selection?.path === source.path ? selection.point : undefined;\n const selectionOverlay =\n selected === undefined ? null : (\n <div\n data-testid=\"author-media-selection\"\n className=\"pointer-events-none absolute border-2 border-doom-red bg-doom-red/10\"\n style={{\n left: `${selected.x * 100}%`,\n top: `${selected.y * 100}%`,\n width: `${selected.width * 100}%`,\n height: `${selected.height * 100}%`,\n }}\n />\n );\n const pointPin = (ordinal: number | undefined, point: { x: number; y: number }, key: string) => (\n <span\n key={key}\n data-author-point={ordinal}\n data-testid={ordinal === undefined ? 'author-media-point-selection' : undefined}\n className={`pointer-events-none absolute z-10 flex h-5 min-w-5 -translate-x-1/2 -translate-y-1/2 items-center justify-center rounded-full border-2 px-1 text-2xs font-bold ${ordinal === undefined ? 'border-white bg-doom-red text-white' : 'border-doom-deep bg-doom-yellow text-doom-deep'}`}\n style={{ left: `${String(point.x * 100)}%`, top: `${String(point.y * 100)}%` }}\n >\n {ordinal ?? '•'}\n </span>\n );\n const pointSelectionOverlay = selectedPoint === undefined ? null : pointPin(undefined, selectedPoint, 'selection');\n return (\n <div\n ref={host}\n className=\"min-h-0 flex-1 overflow-auto p-4\"\n style={{\n touchAction: activeTool === 'select' ? 'auto' : 'none',\n cursor: activeTool === 'select' ? undefined : 'crosshair',\n }}\n onPointerMove={(event) => {\n const drag = start.current;\n if (drag === undefined || drag.mode !== 'mark') return;\n const rect = normalizedAuthorRectangle(drag.element.getBoundingClientRect(), {\n left: drag.x,\n top: drag.y,\n right: event.clientX,\n bottom: event.clientY,\n });\n setSelection(rect === null ? undefined : { path: source.path, rect });\n }}\n onPointerDownCapture={(event) => {\n if ((activeTool !== 'mark' && activeTool !== 'comment') || event.button !== 0 || pendingCandidate) return;\n const element = event.target;\n if (\n !(\n element instanceof HTMLImageElement ||\n element instanceof HTMLVideoElement ||\n element instanceof HTMLCanvasElement\n )\n )\n return;\n event.preventDefault();\n setSelection(undefined);\n if (element instanceof HTMLVideoElement) {\n if (video.current?.isFrameReady?.() === false) {\n setError('Wait for the selected frame to finish loading.');\n return;\n }\n video.current?.pause();\n }\n start.current = { x: event.clientX, y: event.clientY, mode: activeTool, element };\n event.currentTarget.setPointerCapture(event.pointerId);\n }}\n onPointerUp={(event) => void mark(event)}\n onPointerCancel={() => {\n start.current = undefined;\n setSelection(undefined);\n }}\n >\n {mediaUrl === undefined ? (\n <p className=\"text-doom-dim\">{error === undefined ? 'Loading media...' : 'Media unavailable.'}</p>\n ) : source.kind === 'image' ? (\n <div className=\"relative inline-block max-w-full\">\n <img ref={image} src={mediaUrl} alt={source.path} draggable={false} className=\"block max-w-full\" />\n {selectionOverlay}\n {pointSelectionOverlay}\n {displayedRegions.flatMap(({ ordinal, region }) => {\n if (region.anchor.kind === 'image-point') return [pointPin(ordinal, region.anchor.point, region.id)];\n if (region.anchor.kind !== 'image-rect') return [];\n const { rect } = region.anchor;\n return [\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${String(rect.x * 100)}%`,\n top: `${String(rect.y * 100)}%`,\n width: `${String(rect.width * 100)}%`,\n height: `${String(rect.height * 100)}%`,\n }}\n >\n <span className=\"absolute -left-2 -top-2 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep\">\n {ordinal}\n </span>\n </div>,\n ];\n })}\n </div>\n ) : (\n <div className=\"relative w-fit max-w-full\">\n <MediaPreview\n src={mediaUrl}\n path={source.path}\n kind={source.kind === 'pdf' ? 'pdf' : source.kind === 'video' ? 'video' : 'download'}\n controllerRef={video}\n pdfControllerRef={pdf}\n data-testid=\"author-media\"\n videoControls={false}\n onPlaybackStateChange={(state) => {\n setPlayback(state);\n setFrameReady(video.current?.isFrameReady() ?? false);\n if (state.playing) setSelection(undefined);\n }}\n />\n {selectionOverlay}\n {pointSelectionOverlay}\n {displayedRegions.map(({ ordinal, region }) => {\n if (source.kind === 'pdf') {\n if (region.anchor.kind !== 'pdf-page-point' && region.anchor.kind !== 'pdf-page-rect') return null;\n if (region.anchor.page !== pdf.current?.getState().page) return null;\n if (region.anchor.kind === 'pdf-page-point') return pointPin(ordinal, region.anchor.point, region.id);\n const { rect } = region.anchor;\n return (\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${String(rect.x * 100)}%`,\n top: `${String(rect.y * 100)}%`,\n width: `${String(rect.width * 100)}%`,\n height: `${String(rect.height * 100)}%`,\n }}\n >\n <span className=\"bg-doom-yellow text-doom-deep\">{ordinal}</span>\n </div>\n );\n }\n if (source.kind !== 'video' || playback.playing) return null;\n if (\n region.anchor.kind === 'video-time-point' &&\n Math.abs(region.anchor.timeSeconds - playback.currentTime) <= 0.1\n ) {\n return pointPin(ordinal, region.anchor.point, region.id);\n }\n if (\n region.anchor.kind !== 'video-time-rect' ||\n Math.abs(region.anchor.timeSeconds - playback.currentTime) > 0.1\n )\n return null;\n const { rect } = region.anchor;\n return (\n <div\n key={region.id}\n data-author-region={ordinal}\n className=\"pointer-events-none absolute border border-doom-yellow bg-doom-yellow/10\"\n style={{\n left: `${rect.x * 100}%`,\n top: `${rect.y * 100}%`,\n width: `${rect.width * 100}%`,\n height: `${rect.height * 100}%`,\n }}\n >\n <span className=\"bg-doom-yellow text-doom-deep\">{ordinal}</span>\n </div>\n );\n })}\n </div>\n )}\n {source.kind === 'video' ? (\n <AuthorVideoControls\n playback={playback}\n ready={frameReady}\n locked={pendingCandidate}\n marking={activeTool === 'mark'}\n onSeek={seek}\n onToggle={() => {\n setAuthorToolMode(sessionId, 'select');\n setSelection(undefined);\n if (playback.playing) video.current?.pause();\n else void video.current?.play().catch((reason: unknown) => setError(String(reason)));\n }}\n onAnnotate={() => {\n video.current?.pause();\n setAuthorToolMode(sessionId, 'mark');\n }}\n />\n ) : null}\n {error ? <output className=\"text-base text-doom-red\">{error}</output> : null}\n </div>\n );\n}\n","import { Button } from '@agimon-ai/doompi-web-components';\nimport { useEffect } from 'react';\n\nimport type { DocumentFragment } from '../../../../../types/structuredDocuments';\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n reviseAuthorFragment,\n setAuthorRegionCandidate,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\n\nexport function AuthorStructuredView({\n sessionId,\n document,\n displayedRegions,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n displayedRegions: readonly AuthorDisplayedRegion[];\n}) {\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const element = window.document.elementFromPoint(\n originX + cell.center.x * width,\n originY + cell.center.y * height,\n );\n const fragmentId = element?.closest<HTMLElement>('[data-author-fragment]')?.dataset.authorFragment;\n const fragment = document.fragments?.find((candidate) => candidate.id === fragmentId);\n if (fragment === undefined || fragment.readOnly === true) return undefined;\n if (document.kind === 'csv' || document.kind === 'xlsx') {\n return {\n anchor: { kind: 'cell', fragmentId: fragment.id, location: fragment.location },\n quote: fragment.text,\n };\n }\n const slide = Number(fragment.location.match(/(?:slide\\s*|slides\\/slide)(\\d+)/u)?.[1]);\n if (!Number.isSafeInteger(slide)) return undefined;\n return {\n anchor: { kind: 'slide-element', fragmentId: fragment.id, location: fragment.location, slide },\n quote: fragment.text,\n };\n }),\n [document.fragments, document.kind, document.version, sessionId],\n );\n const displayedByFragment = new Map(\n displayedRegions.flatMap(({ ordinal, region }) =>\n region.anchor.kind === 'cell' || region.anchor.kind === 'slide-element'\n ? [[region.anchor.fragmentId, ordinal] as const]\n : [],\n ),\n );\n const cells = document.kind === 'csv' || document.kind === 'xlsx';\n const groups = new Map<string, DocumentFragment[]>();\n for (const fragment of document.fragments ?? []) {\n const key = cells\n ? document.kind === 'csv'\n ? fragment.location.split(',')[0]!\n : fragment.location.replace(/![A-Z]+(\\d+)$/, '!row $1')\n : fragment.location;\n const group = groups.get(key) ?? [];\n group.push(fragment);\n groups.set(key, group);\n }\n return (\n <div data-testid=\"author-structured\" className=\"min-h-0 flex-1 space-y-3 overflow-auto p-4\">\n {!cells ? <p className=\"text-xs text-doom-faint\">Slide text view, not a layout-faithful rendering.</p> : null}\n {[...groups].map(([location, fragments]) => (\n <section key={location} className=\"space-y-1\">\n <h3 className=\"text-xs text-doom-faint\">{location}</h3>\n <div className={cells ? 'flex gap-1' : 'space-y-2'}>\n {fragments.map((fragment) => (\n <div\n key={fragment.id}\n data-author-fragment={fragment.id}\n data-author-region={displayedByFragment.get(fragment.id)}\n className={`${cells ? 'w-40 shrink-0' : ''} relative rounded ${displayedByFragment.has(fragment.id) ? 'ring-1 ring-doom-yellow' : ''}`}\n >\n {displayedByFragment.has(fragment.id) ? (\n <span className=\"absolute -left-1 -top-1 z-10 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep\">\n {displayedByFragment.get(fragment.id)}\n </span>\n ) : null}\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={(event) => {\n const bounds = event.currentTarget.getBoundingClientRect();\n const slide = Number(fragment.location.match(/(?:slide\\s*|slides\\/slide)(\\d+)/)?.[1]);\n if (!cells && !Number.isSafeInteger(slide)) return;\n setAuthorRegionCandidate(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n quote: fragment.text,\n anchor: cells\n ? { kind: 'cell', fragmentId: fragment.id, location: fragment.location }\n : { kind: 'slide-element', fragmentId: fragment.id, location: fragment.location, slide },\n viewport: { width: bounds.width, height: bounds.height },\n createdAt: Date.now(),\n });\n }}\n >\n mark {fragment.location}\n </Button>\n <textarea\n aria-label={fragment.location}\n value={fragment.text}\n readOnly={fragment.readOnly === true}\n className=\"w-full rounded border border-doom-border bg-doom-deep p-2 text-sm text-doom-text\"\n onChange={(event) => reviseAuthorFragment(sessionId, document.path, fragment.id, event.target.value)}\n />\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import { CodeEditor, Markdown, type CodeEditorController } from '@agimon-ai/doompi-web-components';\nimport { useEffect, useRef } from 'react';\n\nimport { registerAuthorGridResolver } from '../_lib/authorGrid';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n authorDocument,\n reviseAuthorDocument,\n setAuthorRegionCandidate,\n type AuthorWorkspaceDocument,\n} from '../_lib/authorWorkspaceStore';\n\nexport function AuthorTextView({\n sessionId,\n document,\n preview,\n displayedRegions,\n}: {\n sessionId: string;\n document: AuthorWorkspaceDocument;\n preview: boolean;\n displayedRegions: readonly AuthorDisplayedRegion[];\n}) {\n const host = useRef<HTMLDivElement>(null);\n const editor = useRef<CodeEditorController>(null);\n useEffect(\n () =>\n registerAuthorGridResolver(sessionId, (cell, geometry) => {\n if (preview || editor.current === null) return undefined;\n const { originX = 0, originY = 0, width, height } = geometry.viewport;\n const range = editor.current.resolveViewportRegion({\n left: originX + cell.rect.x * width,\n top: originY + cell.rect.y * height,\n right: originX + (cell.rect.x + cell.rect.width) * width,\n bottom: originY + (cell.rect.y + cell.rect.height) * height,\n });\n if (range === null || range.from === range.to) return undefined;\n return {\n anchor: {\n kind: 'text-range',\n startOffset: range.from,\n endOffset: range.to,\n startLine: range.startLine,\n endLine: range.endLine,\n },\n quote: range.text,\n };\n }),\n [preview, sessionId],\n );\n useEffect(() => {\n editor.current?.setMarkedRanges(\n displayedRegions.flatMap(({ ordinal, region }) =>\n region.anchor.kind === 'text-range'\n ? [{ from: region.anchor.startOffset, to: region.anchor.endOffset, label: String(ordinal) }]\n : [],\n ),\n );\n }, [displayedRegions]);\n return (\n <div ref={host} className=\"flex min-h-0 flex-1 flex-col\">\n {preview ? (\n <div data-testid=\"author-markdown\" className=\"min-h-0 flex-1 overflow-auto p-4 text-sm text-doom-text\">\n <Markdown text={document.content ?? ''} />\n </div>\n ) : (\n <CodeEditor\n value={document.content ?? ''}\n path={document.path}\n data-testid=\"author-editor\"\n controllerRef={editor}\n className=\"min-h-0 flex-1\"\n onChange={(content) => reviseAuthorDocument(sessionId, document.path, content)}\n onSelect={(range) => {\n const current = authorDocument(sessionId, document.path);\n const bounds = host.current?.getBoundingClientRect();\n if (!current || !bounds || range.from === range.to) return;\n setAuthorRegionCandidate(sessionId, {\n documentPath: current.path,\n revision: current.version,\n sourceSha256: current.sourceSha256,\n quote: range.text,\n anchor: {\n kind: 'text-range',\n startOffset: range.from,\n endOffset: range.to,\n startLine: range.startLine,\n endLine: range.endLine,\n },\n viewport: { width: bounds.width, height: bounds.height },\n createdAt: Date.now(),\n });\n }}\n />\n )}\n </div>\n );\n}\n","import type { FileLinkSource, TransientTab, WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useRef, useState } from 'react';\n\nimport {\n authorPreviewActionSlot,\n type AuthorPreviewActionSource,\n type AuthorPreviewDisplayedAnnotation,\n} from '../../../../../types/authorPreview';\nimport { focusAuthorViewport } from '../_lib/authorBrowserBridge';\nimport { loadAuthorDocument, saveAuthorDocument } from '../_lib/authorFiles';\nimport { authorProfilesForDocument } from '../_lib/authorProfiles';\nimport type { AuthorDisplayedRegion } from '../_lib/authorViewportTypes';\nimport {\n authorDocumentKey,\n authorWorkspace,\n completeAuthorSave,\n failAuthorSave,\n focusAuthorDocument,\n normalizeAuthorPath,\n putAuthorDocument,\n releaseAuthorDocumentFocus,\n requestAuthorSave,\n setAuthorRegionCandidate,\n setAuthorStoryPreview,\n syncAuthorDocumentFocus,\n type AuthorSessionWorkspace,\n} from '../_lib/authorWorkspaceStore';\nimport { AuthorGridOverlay, autonomousVoiceGridVisible } from './AuthorGridOverlay';\nimport { AuthorMediaView } from './AuthorMediaView';\nimport { AuthorStructuredView } from './AuthorStructuredView';\nimport { AuthorTextView } from './AuthorTextView';\ninterface AuthorDocumentPanelProps extends WebPluginSlotProps {\n path: string;\n}\n\nfunction tabId(path: string): string {\n let hash = 2166136261;\n for (const char of normalizeAuthorPath(path)) hash = Math.imul(hash ^ char.charCodeAt(0), 16777619);\n return `author-file-${(hash >>> 0).toString(36)}`;\n}\n\nexport function displayedAuthorRegions(\n workspace: Pick<AuthorSessionWorkspace, 'regions' | 'requests'> | undefined,\n): readonly AuthorDisplayedRegion[] {\n const draftRegions = workspace?.regions ?? [];\n if (draftRegions.length > 0) return draftRegions.map((region, index) => ({ ordinal: index + 1, region }));\n const activeRequest = workspace?.requests\n .slice()\n .reverse()\n .find((request) => request.status === 'REQUESTED' || request.status === 'CHANGING');\n return (activeRequest?.pendingRegions ?? []).map((region) => ({\n ordinal: Math.max(1, (activeRequest?.regions.findIndex((original) => original.id === region.id) ?? 0) + 1),\n region,\n }));\n}\nexport function AuthorDocumentPanel(props: AuthorDocumentPanelProps) {\n if (!props.activeMinorModes?.includes('author')) {\n const fallback = props.fileTabFor(props.path);\n if (fallback !== undefined && fallback.id !== tabId(props.path)) {\n return <fallback.panel {...props} />;\n }\n return (\n <p data-testid=\"author-mode-inactive\" className=\"p-3 text-sm text-doom-dim\">\n No file viewer is available for this path.\n </p>\n );\n }\n return <ActiveAuthorDocumentPanel {...props} />;\n}\n\nfunction ActiveAuthorDocumentPanel(props: AuthorDocumentPanelProps) {\n const { path, sessionId, statuses } = props;\n const document = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.documents[authorDocumentKey(sessionId, path)],\n );\n const focusGeneration = useRef<number | undefined>(undefined);\n const workspace = useStore(authorWorkspace.store, (state) =>\n sessionId === null ? undefined : state.sessions[sessionId],\n );\n const activeTool = workspace?.activeTool ?? 'select';\n const [markdownPreview, setMarkdownPreview] = useState(true);\n const [status, setStatus] = useState<string | undefined>();\n const [previewOpen, setPreviewOpen] = useState(false);\n const kind = document?.kind;\n const previewSource: AuthorPreviewActionSource | undefined =\n document === undefined\n ? undefined\n : {\n path: document.path,\n kind: document.kind,\n hasUnsavedChanges: document.version !== document.savedVersion,\n revision: document.savedVersion,\n sourceSha256: document.sourceSha256,\n };\n const previewAction =\n previewSource === undefined\n ? undefined\n : (props.slotData?.(authorPreviewActionSlot) ?? []).find(\n ({ data }) =>\n data.embeddedPanel !== undefined &&\n (data.supportsSource === undefined || data.supportsSource(previewSource)),\n );\n const PreviewPanel = previewAction?.data.embeddedPanel;\n useEffect(() => {\n if (document !== undefined || sessionId === null) return;\n const controller = new AbortController();\n setStatus('loading');\n void loadAuthorDocument(sessionId, path, controller.signal)\n .then((loaded) => {\n if (controller.signal.aborted) return;\n putAuthorDocument(sessionId, loaded);\n setStatus(undefined);\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted) setStatus(error instanceof Error ? error.message : String(error));\n });\n return () => controller.abort();\n }, [document, path, sessionId]);\n useEffect(() => {\n if (document === undefined || sessionId === null) return;\n const generation = focusAuthorDocument(sessionId, path, document.version, document.sourceSha256);\n focusGeneration.current = generation;\n return () => releaseAuthorDocumentFocus(sessionId, generation);\n }, [kind, document?.sourceSha256, path, sessionId]);\n useEffect(() => {\n const generation = focusGeneration.current;\n if (document === undefined || sessionId === null || generation === undefined) return;\n syncAuthorDocumentFocus(sessionId, generation, document.version, document.sourceSha256);\n }, [document?.sourceSha256, document?.version, sessionId]);\n useEffect(() => {\n if (kind === undefined || sessionId === null) return;\n const profiles = authorProfilesForDocument(sessionId, path, kind);\n let release: (() => void) | undefined;\n let cancelled = false;\n void focusAuthorViewport(sessionId, profiles).then((nextRelease) => {\n if (cancelled) nextRelease();\n else release = nextRelease;\n });\n return () => {\n cancelled = true;\n release?.();\n };\n }, [kind, path, sessionId]);\n if (document === undefined || sessionId === null) {\n return <p className=\"p-4 text-sm text-doom-faint\">{status ?? 'Loading document...'}</p>;\n }\n\n const save = async (): Promise<void> => {\n const savedVersion = document.version;\n const savedFragments = document.fragments;\n requestAuthorSave(sessionId, path);\n setStatus('saving');\n try {\n const sha256 = await saveAuthorDocument(sessionId, document);\n completeAuthorSave(sessionId, path, sha256, savedVersion, savedFragments);\n setStatus('saved');\n } catch (error) {\n failAuthorSave(sessionId, path, savedVersion);\n setStatus(error instanceof Error ? error.message : String(error));\n }\n };\n const gridVisible = autonomousVoiceGridVisible(statuses);\n const displayedRegions = displayedAuthorRegions(workspace);\n const displayedPreviewAnnotations: readonly AuthorPreviewDisplayedAnnotation[] =\n displayedRegions.flatMap<AuthorPreviewDisplayedAnnotation>(({ ordinal, region }) => {\n if (region.anchor.kind === 'story-preview-rect') {\n return [{ ordinal, mode: 'region' as const, point: region.anchor.rect, rect: region.anchor.rect }];\n }\n if (region.anchor.kind === 'story-preview-point') {\n return [{ ordinal, mode: 'point' as const, point: region.anchor.point }];\n }\n return [];\n });\n const textPanel = (\n <AuthorTextView\n sessionId={sessionId}\n document={document}\n preview={document.kind === 'markdown' && markdownPreview && activeTool === 'select' && !gridVisible}\n displayedRegions={displayedRegions}\n />\n );\n const sourcePanel =\n document.kind === 'text' || document.kind === 'markdown' || document.kind === 'story-preview' ? (\n textPanel\n ) : document.structuredFormat !== undefined ? (\n <AuthorStructuredView sessionId={sessionId} document={document} displayedRegions={displayedRegions} />\n ) : (\n <AuthorMediaView\n key={document.path}\n sessionId={sessionId}\n document={document}\n activeTool={activeTool}\n displayedRegions={displayedRegions}\n pendingCandidate={workspace?.candidate !== undefined}\n seekRequest={workspace?.videoSeekRequest}\n />\n );\n\n return (\n <section data-testid=\"author-document\" className=\"flex min-h-0 flex-1 flex-col\">\n <header className=\"flex items-center gap-2 border-b border-doom-border px-4 py-2\">\n <strong className=\"min-w-0 flex-1 truncate text-base text-doom-hi\">{document.title ?? document.path}</strong>\n {PreviewPanel !== undefined && previewSource !== undefined ? (\n <Button\n size=\"xs\"\n variant={previewOpen ? 'primary' : 'outline'}\n data-testid=\"author-story-preview-toggle\"\n aria-pressed={previewOpen}\n aria-label={previewOpen ? 'show story source' : 'show story preview'}\n onClick={() => setPreviewOpen(!previewOpen)}\n >\n {previewOpen ? 'Source' : 'Preview'}\n </Button>\n ) : null}\n {document.kind === 'markdown' ? (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n data-testid=\"author-markdown-toggle\"\n onClick={() => setMarkdownPreview(!markdownPreview)}\n >\n {markdownPreview ? 'edit' : 'preview'}\n </Button>\n ) : null}\n {document.kind === 'video' ? (\n <span className=\"text-base text-doom-dim\">Video feedback</span>\n ) : (\n <Button\n className=\"min-h-11 px-4 text-base\"\n variant=\"outline\"\n data-testid=\"author-save\"\n disabled={document.revisions.length === 0 || document.savingVersion !== undefined}\n onClick={() => void save()}\n >\n {previewOpen && previewSource?.hasUnsavedChanges ? 'Save & refresh' : 'Save'}\n </Button>\n )}\n </header>\n {status === undefined ? null : <output className=\"px-4 py-1 text-xs text-doom-faint\">{status}</output>}\n <div className=\"relative flex min-h-0 flex-1 overflow-hidden\">\n {previewOpen && PreviewPanel !== undefined && previewSource !== undefined ? (\n <PreviewPanel\n {...props}\n source={previewSource}\n activeTool={activeTool === 'crop' ? 'select' : activeTool}\n displayedAnnotations={displayedPreviewAnnotations}\n pendingCandidate={workspace?.candidate !== undefined}\n onAnnotationCandidate={(candidate) => {\n setAuthorStoryPreview(sessionId, document.path, candidate.preview);\n setAuthorRegionCandidate(sessionId, {\n documentPath: document.path,\n revision: document.version,\n sourceSha256: document.sourceSha256,\n mode: candidate.mode,\n anchor:\n candidate.mode === 'region' && candidate.rect !== undefined\n ? { kind: 'story-preview-rect', rect: candidate.rect, preview: candidate.preview }\n : { kind: 'story-preview-point', point: candidate.point, preview: candidate.preview },\n viewport: candidate.preview.viewport,\n evidence: candidate.evidence,\n thumbnailUrl: candidate.thumbnailUrl,\n createdAt: Date.now(),\n });\n }}\n />\n ) : (\n sourcePanel\n )}\n {previewOpen && PreviewPanel !== undefined && previewSource !== undefined ? null : (\n <AuthorGridOverlay sessionId={sessionId} document={document} visible={gridVisible} />\n )}\n </div>\n </section>\n );\n}\n\nexport function authorFileTab(path: string): TransientTab {\n const normalized = normalizeAuthorPath(path);\n return {\n id: tabId(normalized),\n label: normalized.split('/').at(-1) ?? normalized,\n retainComposer: true,\n panel: (props) => <AuthorDocumentPanel {...props} path={normalized} />,\n };\n}\n\nexport const authorFileLinks: FileLinkSource = {\n requiredMinorMode: 'author',\n subscribe(listener) {\n const subscription = authorWorkspace.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n fingerprint(sessionId) {\n if (sessionId === null) return '';\n const prefix = `${sessionId}\\n`;\n return Object.keys(authorWorkspace.store.state.documents)\n .filter((key) => key.startsWith(prefix))\n .sort()\n .join('\\n');\n },\n resolve(sessionId, path) {\n if (sessionId === null) return undefined;\n const normalized = normalizeAuthorPath(path.replace(/:\\d+(?::\\d+)?$/, ''));\n return authorWorkspace.store.state.documents[authorDocumentKey(sessionId, normalized)] === undefined\n ? undefined\n : authorFileTab(normalized);\n },\n openPath(sessionId, path) {\n if (sessionId === null) return undefined;\n const normalized = normalizeAuthorPath(path);\n return normalized === '' ? undefined : authorFileTab(normalized);\n },\n};\n","import { defineFileLinks } from '@agimon-ai/doompi-core/web';\n\nimport { authorFileLinks } from '../_components/AuthorDocumentPanel';\n\nexport default defineFileLinks({ ...authorFileLinks });\n","import { defineLeaderBinding } from '@agimon-ai/doompi-core/web';\nexport default defineLeaderBinding({\n id: 'author.toggle',\n path: [\n { key: 'o', label: 'other', detail: 'optional modes and tools' },\n { key: 'a', label: 'author', detail: 'enable or disable focused document authoring' },\n ],\n command: 'minor author',\n});\n","import type { AuthorAnnotationCandidate, AuthorAnnotationDraft, AuthorNativeAnchor } from './authorViewportTypes';\nimport {\n AUTHOR_REGION_LIMIT,\n authorWorkspace,\n hydrateAuthorAnnotationCollections,\n normalizeAuthorPath,\n type AuthorAnnotationHydrationRecord,\n} from './authorWorkspaceStore';\n\nexport const AUTHOR_ANNOTATION_DATABASE = 'doompi-author-annotations';\nexport const AUTHOR_ANNOTATION_RECORD_LIMIT = 100;\nexport const AUTHOR_ANNOTATION_EVIDENCE_BYTE_LIMIT = 8 * 1024 * 1024;\nconst STORE = 'documents';\nconst RECORD_VERSION = 1;\n\nexport interface AuthorAnnotationPersistenceRecord extends AuthorAnnotationHydrationRecord {\n key: string;\n version: typeof RECORD_VERSION;\n}\n\nexport interface AuthorAnnotationRepository {\n load(): Promise<readonly unknown[]>;\n replace(records: readonly AuthorAnnotationPersistenceRecord[]): Promise<void>;\n close(): Promise<void>;\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction finite(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction point(value: unknown): boolean {\n return (\n object(value) && finite(value.x) && finite(value.y) && value.x >= 0 && value.x <= 1 && value.y >= 0 && value.y <= 1\n );\n}\n\nfunction rect(value: unknown): boolean {\n return (\n point(value) && object(value) && finite(value.width) && finite(value.height) && value.width > 0 && value.height > 0\n );\n}\n\nfunction validAnchor(value: unknown): value is AuthorNativeAnchor {\n if (!object(value) || typeof value.kind !== 'string') return false;\n switch (value.kind) {\n case 'text-range':\n return finite(value.startOffset) && finite(value.endOffset) && finite(value.startLine) && finite(value.endLine);\n case 'cell':\n return typeof value.fragmentId === 'string' && typeof value.location === 'string';\n case 'slide-element':\n return typeof value.fragmentId === 'string' && finite(value.slide) && typeof value.location === 'string';\n case 'image-rect':\n return rect(value.rect) && finite(value.naturalWidth) && finite(value.naturalHeight);\n case 'pdf-page-rect':\n return finite(value.page) && rect(value.rect);\n case 'video-time-rect':\n return finite(value.timeSeconds) && rect(value.rect);\n case 'story-preview-rect':\n return rect(value.rect) && object(value.preview);\n case 'image-point':\n return point(value.point) && finite(value.naturalWidth) && finite(value.naturalHeight);\n case 'pdf-page-point':\n return finite(value.page) && point(value.point);\n case 'video-time-point':\n return finite(value.timeSeconds) && point(value.point);\n case 'story-preview-point':\n return point(value.point) && object(value.preview);\n default:\n return false;\n }\n}\n\nfunction validEvidence(value: unknown): value is Blob | undefined {\n return (\n value === undefined ||\n (typeof Blob !== 'undefined' && value instanceof Blob && value.size <= AUTHOR_ANNOTATION_EVIDENCE_BYTE_LIMIT)\n );\n}\n\nfunction validCandidate(value: unknown): value is AuthorAnnotationCandidate {\n if (!object(value)) return false;\n return (\n typeof value.documentPath === 'string' &&\n normalizeAuthorPath(value.documentPath) !== '' &&\n finite(value.revision) &&\n (value.sourceSha256 === undefined || typeof value.sourceSha256 === 'string') &&\n (value.mode === undefined || value.mode === 'region' || value.mode === 'point') &&\n validAnchor(value.anchor) &&\n object(value.viewport) &&\n finite(value.viewport.width) &&\n finite(value.viewport.height) &&\n finite(value.createdAt) &&\n validEvidence(value.evidence)\n );\n}\n\nfunction validAnnotation(value: unknown): value is AuthorAnnotationDraft {\n return (\n validCandidate(value) &&\n object(value) &&\n typeof value.id === 'string' &&\n value.id !== '' &&\n typeof value.comment === 'string' &&\n value.comment.trim() !== '' &&\n (value.version === undefined || (Number.isInteger(value.version) && (value.version as number) >= 1))\n );\n}\n\nfunction utf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function validateAuthorAnnotationRecord(input: unknown): AuthorAnnotationPersistenceRecord | undefined {\n if (!object(input) || input.version !== RECORD_VERSION || typeof input.key !== 'string') return undefined;\n if (typeof input.sessionId !== 'string' || input.sessionId === '' || typeof input.documentPath !== 'string')\n return undefined;\n const path = normalizeAuthorPath(input.documentPath);\n if (path === '' || input.key !== `${input.sessionId}\\n${path}` || !object(input.collection)) return undefined;\n const collection = input.collection;\n if (\n !finite(collection.revision) ||\n (collection.sourceSha256 !== undefined && typeof collection.sourceSha256 !== 'string') ||\n typeof collection.stale !== 'boolean' ||\n typeof collection.candidateText !== 'string' ||\n utf8Length(collection.candidateText) > 2 * 1024 ||\n !Array.isArray(collection.annotations) ||\n collection.annotations.length > AUTHOR_REGION_LIMIT ||\n !collection.annotations.every(validAnnotation) ||\n (collection.candidate !== undefined && !validCandidate(collection.candidate)) ||\n !finite(collection.updatedAt)\n )\n return undefined;\n return input as unknown as AuthorAnnotationPersistenceRecord;\n}\n\nfunction durableCandidate<T extends AuthorAnnotationCandidate>(candidate: T): T {\n const { thumbnailUrl: _thumbnailUrl, ...durable } = candidate;\n return durable as T;\n}\n\nfunction persistenceRecords(): readonly AuthorAnnotationPersistenceRecord[] {\n const records: AuthorAnnotationPersistenceRecord[] = [];\n for (const [sessionId, session] of Object.entries(authorWorkspace.store.state.sessions)) {\n for (const [documentPath, collection] of Object.entries(session.annotationsByDocument)) {\n if (collection.annotations.length === 0 && collection.candidate === undefined && collection.candidateText === '')\n continue;\n records.push({\n key: `${sessionId}\\n${documentPath}`,\n version: RECORD_VERSION,\n sessionId,\n documentPath,\n collection: {\n ...collection,\n candidate: collection.candidate && durableCandidate(collection.candidate),\n annotations: collection.annotations.map(durableCandidate),\n },\n });\n }\n }\n return records\n .sort((a, b) => b.collection.updatedAt - a.collection.updatedAt)\n .slice(0, AUTHOR_ANNOTATION_RECORD_LIMIT);\n}\n\nexport class IndexedDbAuthorAnnotationRepository implements AuthorAnnotationRepository {\n readonly #database: Promise<IDBDatabase>;\n #writes: Promise<void> = Promise.resolve();\n\n constructor(factory: IDBFactory) {\n this.#database = new Promise((resolve, reject) => {\n const request = factory.open(AUTHOR_ANNOTATION_DATABASE, 1);\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(STORE))\n request.result.createObjectStore(STORE, { keyPath: 'key' });\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Unable to open Author annotation storage.'));\n });\n }\n\n async load(): Promise<readonly unknown[]> {\n const database = await this.#database;\n return await new Promise((resolve, reject) => {\n const request = database.transaction(STORE, 'readonly').objectStore(STORE).getAll();\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('Unable to read Author annotations.'));\n });\n }\n\n replace(records: readonly AuthorAnnotationPersistenceRecord[]): Promise<void> {\n const write = async (): Promise<void> => {\n const database = await this.#database;\n await new Promise<void>((resolve, reject) => {\n const transaction = database.transaction(STORE, 'readwrite');\n const store = transaction.objectStore(STORE);\n store.clear();\n records.forEach((record) => store.put(record));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error ?? new Error('Unable to write Author annotations.'));\n transaction.onabort = () => reject(transaction.error ?? new Error('Author annotation write was aborted.'));\n });\n };\n this.#writes = this.#writes.catch(() => undefined).then(write);\n return this.#writes;\n }\n\n async close(): Promise<void> {\n try {\n await this.#writes;\n } finally {\n const database = await this.#database;\n database.close();\n }\n }\n}\n\nexport function startAuthorAnnotationPersistence(repository?: AuthorAnnotationRepository): () => Promise<void> {\n const factory = typeof indexedDB === 'undefined' ? undefined : indexedDB;\n if (repository === undefined && factory === undefined) return async () => undefined;\n const storage = repository ?? new IndexedDbAuthorAnnotationRepository(factory!);\n let stopped = false;\n let hydrated = false;\n let dirty = false;\n const subscription = authorWorkspace.store.subscribe(() => {\n if (!hydrated) dirty = true;\n else void storage.replace(persistenceRecords()).catch(() => undefined);\n });\n void storage\n .load()\n .then((values) => {\n if (stopped) return;\n const records = values\n .map(validateAuthorAnnotationRecord)\n .filter((record): record is AuthorAnnotationPersistenceRecord => record !== undefined)\n .sort((a, b) => b.collection.updatedAt - a.collection.updatedAt)\n .slice(0, AUTHOR_ANNOTATION_RECORD_LIMIT);\n hydrateAuthorAnnotationCollections(records);\n hydrated = true;\n if (dirty || records.length > 0) void storage.replace(persistenceRecords()).catch(() => undefined);\n })\n .catch(() => {\n if (stopped) return;\n hydrated = true;\n if (dirty) void storage.replace(persistenceRecords()).catch(() => undefined);\n });\n return async () => {\n stopped = true;\n subscription.unsubscribe();\n await storage.close();\n };\n}\n","import type { CaptureStatusEvent, ComposerSubmission } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorCapturePacket } from '../../_lib/authorCapture';\nimport type { AuthorRegionDraft } from '../../_lib/authorViewportTypes';\nimport {\n authorSessionWorkspace,\n putAuthorRequest,\n removeAuthorRegion,\n updateAuthorRequest,\n} from '../../_lib/authorWorkspaceStore';\n\nfunction capturePacket(content: string): AuthorCapturePacket | undefined {\n try {\n const value = JSON.parse(content) as Partial<AuthorCapturePacket>;\n if (\n value.version !== 1 ||\n typeof value.captureId !== 'string' ||\n typeof value.capturedAt !== 'number' ||\n typeof value.document?.path !== 'string' ||\n typeof value.document.revision !== 'number' ||\n !Array.isArray(value.regions) ||\n value.regions.length === 0\n ) {\n return undefined;\n }\n return value as AuthorCapturePacket;\n } catch {\n return undefined;\n }\n}\n\nexport function recordAuthorComposerSubmission(submission: ComposerSubmission): void {\n for (const item of submission.contextItems) {\n if (item.source !== 'author' || item.kind !== 'author-capture') continue;\n const packet = capturePacket(item.metadata ?? item.content);\n if (packet === undefined || packet.captureId !== item.id) continue;\n if (authorSessionWorkspace(submission.sessionId).requests.some((request) => request.captureId === packet.captureId))\n continue;\n const regions: AuthorRegionDraft[] = packet.regions.map((region) => ({\n id: region.id,\n documentPath: packet.document.path,\n revision: packet.document.revision,\n sourceSha256: packet.document.sourceSha256,\n comment: region.comment,\n version: region.version ?? 1,\n mode: region.mode,\n quote: region.quote,\n anchor: structuredClone(region.anchor),\n viewport: { ...region.viewport },\n voiceGrid: region.voiceGrid && { ...region.voiceGrid },\n createdAt: packet.capturedAt,\n }));\n putAuthorRequest(submission.sessionId, {\n id: crypto.randomUUID(),\n captureId: packet.captureId,\n documentPath: packet.document.path,\n requestText: submission.message,\n regions,\n pendingRegions: regions,\n status: 'REQUESTED',\n createdAt: submission.submittedAt,\n updatedAt: submission.submittedAt,\n revision: packet.document.revision,\n sourceSha256: packet.document.sourceSha256,\n });\n for (const region of packet.regions) {\n removeAuthorRegion(submission.sessionId, region.id, region.version ?? 1, packet.document.path);\n }\n }\n}\n\n/** Only the host's correlated execution events may settle a submitted capture. */\nexport function recordAuthorCaptureStatus(event: CaptureStatusEvent): void {\n const request = authorSessionWorkspace(event.sessionId).requests.find(\n (record) => record.captureId === event.captureId,\n );\n if (request === undefined || ['COMPLETE', 'FAILED', 'CANCELLED'].includes(request.status)) return;\n if (event.status === 'queued') return;\n updateAuthorRequest(event.sessionId, request.id, (record) => ({\n ...record,\n status: event.status === 'working' ? 'CHANGING' : event.status === 'completed' ? 'COMPLETE' : 'FAILED',\n currentOperation: event.status === 'working' ? 'Agent is working on this request' : undefined,\n pendingRegions: event.status === 'completed' ? [] : record.pendingRegions,\n error: event.status === 'error' ? event.error || 'Request execution failed.' : undefined,\n updatedAt: Date.now(),\n }));\n}\n","import type { WebPluginRuntime } from '@agimon-ai/doompi-core/web';\n\nimport { startAuthorAnnotationPersistence } from '../../_lib/authorAnnotationPersistence';\nimport { startAuthorBrowserBridge } from '../../_lib/authorBrowserBridge';\nimport { recordAuthorCaptureStatus, recordAuthorComposerSubmission } from './authorRequestLifecycle';\n\nexport function startAuthorBrowserLifecycle(runtime: WebPluginRuntime): () => Promise<void> {\n const stopBridge = startAuthorBrowserBridge(runtime);\n const stopPersistence = startAuthorAnnotationPersistence();\n const stopSubmissions = runtime.onComposerSubmitted?.(recordAuthorComposerSubmission) ?? (() => undefined);\n const stopCaptureStatus = runtime.onCaptureStatus?.(recordAuthorCaptureStatus) ?? (() => undefined);\n return async () => {\n stopSubmissions();\n stopCaptureStatus();\n stopBridge();\n await stopPersistence().catch(() => undefined);\n };\n}\n","import { defineWebLifecycle } from '@agimon-ai/doompi-core/web';\n\nimport { startAuthorBrowserLifecycle } from './_lib/authorBrowserLifecycle';\n\nexport default defineWebLifecycle(startAuthorBrowserLifecycle);\n","import { defineMinorModeFile } from '@agimon-ai/doompi-core/web';\nexport default defineMinorModeFile({ name: 'author', keys: 'o a', order: 45 });\n","import { defineSlotFile } from '@agimon-ai/doompi-core/web';\n\nimport { parseAuthorPreviewAction } from '../../../../../types/authorPreview';\n\n/** Typed data slot for preview launchers that need Author's focused source. */\nexport default defineSlotFile({\n slot: 'author.preview-action',\n parse: parseAuthorPreviewAction,\n});\n","import { defineSlotFile } from '@agimon-ai/doompi-core/web';\n\n/**\n * Optional preview providers render launch controls here. The provider owns its\n * transient tab and preview lifecycle; Author owns the surrounding mode and\n * composer submission surface.\n */\nexport default defineSlotFile({});\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-web-components';\n\nexport const describeAuthorToolsToolName = 'describe_author_tools';\n\n/** Lines the collapsed item shows before it expands. */\nexport const describeAuthorToolsCollapsedLines = 8;\n\nexport function describeAuthorToolsCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return '';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function describeAuthorToolsResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport {\n describeAuthorToolsCallSummary,\n describeAuthorToolsCollapsedLines,\n describeAuthorToolsResultLines,\n} from '../_lib/describeAuthorToolsToolRender';\n\n/**\n * The describe_author_tools tool's timeline item: Describe the current Author viewport capabilities. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function DescribeAuthorToolsToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = describeAuthorToolsResultLines(result);\n const collapsed = collapseLines(lines, describeAuthorToolsCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, describeAuthorToolsCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {describeAuthorToolsCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { DescribeAuthorToolsToolCard } from './_components/DescribeAuthorToolsToolCard';\n\nexport default defineToolRenderer({ tools: ['describe_author_tools'], message: DescribeAuthorToolsToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n Button,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport { authorFileTab } from '../../_components/AuthorDocumentPanel';\n\nexport function openAuthoringFileTab(\n path: string,\n openTransientTab: ToolMessageRenderProps['openTransientTab'],\n openTab: ToolMessageRenderProps['openTab'],\n): void {\n const tab = authorFileTab(path);\n openTransientTab(tab);\n openTab(tab.id);\n}\n\nexport function resultPath(result: ToolMessageRenderProps['result']): string | undefined {\n if (typeof result?.details !== 'object' || result.details === null || !('path' in result.details)) return undefined;\n return typeof result.details.path === 'string' ? result.details.path : undefined;\n}\n\nexport function OpenAuthoringFileToolCard({\n args,\n result,\n running,\n isError,\n output,\n openTransientTab,\n openTab,\n}: ToolMessageRenderProps) {\n const path = resultPath(result);\n const unavailable = !running && !isError && result !== null && path === undefined;\n const errorLines = isError\n ? (output ?? '')\n .trim()\n .split(/\\r?\\n/u)\n .filter(Boolean)\n .slice(0, 4)\n .map((text) => ({ text, tone: 'error' as const }))\n : [];\n const requestedPath = typeof args.path === 'string' ? args.path : 'document';\n return (\n <MessageItem tone={toolTone({ running, isError: isError || unavailable })}>\n {() => (\n <>\n <MessageItemHeader title=\"open_authoring_file\">\n <span data-testid=\"tool-call-open_authoring_file\" className=\"min-w-0 flex-1 truncate text-doom-text\">\n {requestedPath}\n </span>\n </MessageItemHeader>\n <MessageItemBody data-testid=\"tool-result-open_authoring_file\" className=\"flex flex-col gap-1\">\n {errorLines.length > 0 ? <MessageLines lines={errorLines} /> : null}\n <MessageItemStatus tone={isError || unavailable ? 'error' : running ? 'running' : undefined}>\n {isError\n ? 'failed'\n : running\n ? 'validating'\n : unavailable\n ? 'unavailable'\n : path === undefined\n ? 'waiting'\n : 'ready'}\n </MessageItemStatus>\n {!running && !isError && path !== undefined ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n data-testid=\"author-open-file\"\n onClick={() => openAuthoringFileTab(path, openTransientTab, openTab)}\n >\n open in Author\n </Button>\n ) : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { authorFileTab } from '../_components/AuthorDocumentPanel';\nimport { OpenAuthoringFileToolCard, resultPath } from './_components/OpenAuthoringFileToolCard';\n\nexport default defineToolRenderer({\n tools: ['open_authoring_file'],\n message: OpenAuthoringFileToolCard,\n completionTab: ({ result }) => {\n const path = resultPath(result);\n return path === undefined ? undefined : authorFileTab(path);\n },\n});\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-web-components';\n\nexport const useAuthorToolsToolName = 'use_author_tools';\n\n/** Lines the collapsed item shows before it expands. */\nexport const useAuthorToolsCollapsedLines = 8;\n\nexport function useAuthorToolsCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.name === 'string' ? args.name : '';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function useAuthorToolsResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-web-components';\n\nimport {\n useAuthorToolsCallSummary,\n useAuthorToolsCollapsedLines,\n useAuthorToolsResultLines,\n} from '../_lib/useAuthorToolsToolRender';\n\n/**\n * The use_author_tools tool's timeline item: Use one capability of the current Author viewport. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function UseAuthorToolsToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = useAuthorToolsResultLines(result);\n const collapsed = collapseLines(lines, useAuthorToolsCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, useAuthorToolsCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {useAuthorToolsCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport { UseAuthorToolsToolCard } from './_components/UseAuthorToolsToolCard';\n\nexport default defineToolRenderer({ tools: ['use_author_tools'], message: UseAuthorToolsToolCard });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-core/web';\n\nimport channelAuthorWebmcp from '../src/extensions/workspaces/sessions/(frontend)/channel/author-webmcp.web';\nimport dockAuthoring from '../src/extensions/workspaces/sessions/(frontend)/dock/authoring.web';\nimport fileLinksAuthorDocument from '../src/extensions/workspaces/sessions/(frontend)/file-links/author-document.web';\nimport leaderAuthorToggle from '../src/extensions/workspaces/sessions/(frontend)/leader/author-toggle.web';\nimport lifecycleStart from '../src/extensions/workspaces/sessions/(frontend)/lifecycle/start.web';\nimport modeAuthor from '../src/extensions/workspaces/sessions/(frontend)/mode/author/mode.web';\nimport slotPreviewAction from '../src/extensions/workspaces/sessions/(frontend)/slot/preview-action.web';\nimport slotPreviewProvider from '../src/extensions/workspaces/sessions/(frontend)/slot/preview-provider.web';\nimport toolDescribeAuthorTools from '../src/extensions/workspaces/sessions/(frontend)/tool/describe-author-tools.web';\nimport toolOpenAuthoringFile from '../src/extensions/workspaces/sessions/(frontend)/tool/open-authoring-file.web';\nimport toolUseAuthorTools from '../src/extensions/workspaces/sessions/(frontend)/tool/use-author-tools.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'author',\n session: {\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'author_webmcp' }, channelAuthorWebmcp)]; },\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'authoring' }, dockAuthoring)]; },\n get fileLinks(): WebPluginContributions['fileLinks'] { return fileLinksAuthorDocument; },\n get leaderBindings(): WebPluginContributions['leaderBindings'] { return [via({ id: 'author.author-toggle' }, leaderAuthorToggle)]; },\n get minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'author' }, modeAuthor)]; },\n get slots(): WebPluginContributions['slots'] { return [via({ slot: 'author.preview-action' }, slotPreviewAction), via({ slot: 'author.preview-provider' }, slotPreviewProvider)]; },\n get start(): WebPluginContributions['start'] { return lifecycleStart; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['describe_author_tools'] }, toolDescribeAuthorTools), via({ tools: ['open_authoring_file'] }, toolOpenAuthoringFile), via({ tools: ['use_author_tools'] }, toolUseAuthorTools)]; },\n },\n});\n"],"mappings":"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"}