{"version":3,"file":"web.mjs","names":["routes","channelAuthorWebmcp","dockAuthoring","fileLinksAuthorDocument","fillAuthor","leaderAuthorToggle","modeAuthor","slotOpenSource","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/authorCanvasState.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorRegions.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/authorCapture.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorRegionDrafts.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/AuthorFeedbackControls.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/apiRoutes.ts","../../generated/client.ts","../../src/types/authorPreview.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)/_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)/fill/Author.author.open-source.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/open-source.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  alias: string;\n  kind: 'register';\n  generation: number;\n}\n\nexport interface AuthorReleaseMessage {\n  alias: string;\n  kind: 'release';\n  generation: number;\n}\nexport interface AuthorCatalogMessage {\n  alias: string;\n  kind: 'catalog';\n  generation: number;\n  ownerToken: string;\n  tools: AuthorViewportCapabilityDescriptor[];\n}\n\nexport interface AuthorResultMessage {\n  alias: string;\n  kind: 'result';\n  generation: number;\n  ownerToken: string;\n  catalogToken: string;\n  requestId: string;\n  result: unknown;\n}\n\nexport interface AuthorCancelledMessage {\n  alias: string;\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  alias?: string;\n  kind: 'accepted';\n  generation: number;\n  ownerToken: string;\n  catalogToken?: string;\n  leaseMs: number;\n}\n\nexport interface AuthorRequestMessage {\n  alias?: string;\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  alias?: string;\n  kind: 'cancel';\n  generation: number;\n  ownerToken: string;\n  catalogToken: string;\n  requestId: string;\n}\n\nexport interface AuthorRejectedMessage {\n  alias?: string;\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';\nimport { Store } from '@tanstack/store';\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  registrations: ReadonlyMap<string, string>;\n}\n\nconst runtimeIds = new Store(0);\nfunction runtimePrefix(): string {\n  runtimeIds.setState((id) => id + 1);\n  return `a${runtimeIds.state.toString(36)}_`;\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  readonly #registrationPrefix = runtimePrefix();\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 registrations = new Map(\n      tools.map((tool, index) => [tool.name, `${this.#registrationPrefix}${index.toString(36)}`]),\n    );\n    const generation = ++this.#generation;\n    const controller = new AbortController();\n    const candidate: ActiveCatalog = { generation, controller, profiles: profileMap, registrations };\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: registrations.get(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 (\n        !tools.every((tool) =>\n          registered.some((descriptor) =>\n            descriptorMatches(descriptor, { ...tool, name: registrations.get(tool.name)! }),\n          ),\n        )\n      ) {\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    const registration = this.#active.registrations.get(name);\n    if (registration === undefined) throw new Error(`Unknown Author capability: ${name}`);\n    return context.executeTool(registration, 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\ntype Canvas = {\n  sessionId: string;\n  alias: string;\n  generation: number;\n  profiles: readonly AuthorTrustedProfile[];\n  documentProfiles: readonly AuthorTrustedProfile[];\n  runtime: AuthorRuntime;\n  release: () => void;\n  ownerToken?: string;\n  catalogToken?: string;\n  pending: Map<string, AbortController>;\n  leaseTimer?: ReturnType<typeof setTimeout>;\n  visible: boolean;\n  focusId: number;\n  replacementId: number;\n};\n\nconst canvasKey = (sessionId: string, alias: string): string => `${sessionId}\\n${alias}`;\nconst VISIBLE_ONLY = new Set(['author_describe_grid', 'author_resolve_grid_cell']);\nconst documentProfiles = (profiles: readonly AuthorTrustedProfile[]): readonly AuthorTrustedProfile[] =>\n  profiles.map((profile) => ({ ...profile, tools: profile.tools.filter((tool) => !VISIBLE_ONLY.has(tool.name)) }));\n\nclass AuthorBrowserBridge {\n  readonly #host: WebPluginRuntime;\n  readonly #canvases = new Map<string, Canvas>();\n  readonly #opening = new Map<string, { promise: Promise<void>; runtime: AuthorRuntime }>();\n  #generation = 0;\n  #disposed = false;\n  readonly #releaseConnected: () => void;\n\n  constructor(host: WebPluginRuntime) {\n    this.#host = host;\n    this.#releaseConnected = host.onHubConnected(() => {\n      for (const canvas of this.#canvases.values()) {\n        canvas.ownerToken = undefined;\n        canvas.catalogToken = undefined;\n        this.#register(canvas);\n      }\n    });\n  }\n\n  async open(sessionId: string, alias: string, profiles: readonly AuthorTrustedProfile[]): Promise<void> {\n    if (this.#disposed) throw new Error('Author browser bridge is disposed');\n    const key = canvasKey(sessionId, alias);\n    if (this.#canvases.has(key)) return;\n    const pending = this.#opening.get(key);\n    if (pending !== undefined) return await pending.promise;\n    const runtime = new AuthorRuntime(this.#host);\n    const generation = ++this.#generation;\n    const base = documentProfiles(profiles);\n    let opening!: Promise<void>;\n    opening = (async () => {\n      const release = await runtime.replaceProfiles(base);\n      if (this.#disposed || this.#canvases.has(key) || this.#opening.get(key)?.promise !== opening) {\n        release();\n        runtime.dispose();\n        return;\n      }\n      const canvas: Canvas = {\n        sessionId,\n        alias,\n        generation,\n        profiles: base,\n        documentProfiles: base,\n        runtime,\n        release,\n        pending: new Map(),\n        visible: false,\n        focusId: 0,\n        replacementId: 0,\n      };\n      this.#canvases.set(key, canvas);\n      this.#register(canvas);\n    })();\n    this.#opening.set(key, { promise: opening, runtime });\n    try {\n      await opening;\n    } finally {\n      if (this.#opening.get(key)?.promise === opening) this.#opening.delete(key);\n    }\n  }\n\n  async focus(sessionId: string, alias: string, profiles: readonly AuthorTrustedProfile[]): Promise<() => void> {\n    await this.open(sessionId, alias, profiles);\n    const canvas = this.#canvases.get(canvasKey(sessionId, alias));\n    if (canvas === undefined) return () => undefined;\n    canvas.visible = true;\n    const focusId = ++canvas.focusId;\n    await this.#replace(canvas, profiles);\n    return () => {\n      if (this.#canvases.get(canvasKey(sessionId, alias)) !== canvas || canvas.focusId !== focusId) return;\n      canvas.visible = false;\n      canvas.focusId += 1;\n      void this.#replace(canvas, canvas.documentProfiles);\n    };\n  }\n\n  drop(sessionId: string, alias?: string): void {\n    for (const [key, entry] of this.#opening) {\n      if (key.startsWith(`${sessionId}\\n`) && (alias === undefined || key === canvasKey(sessionId, alias))) {\n        this.#opening.delete(key);\n        entry.runtime.dispose();\n      }\n    }\n    for (const canvas of this.#canvases.values()) {\n      if (canvas.sessionId !== sessionId || (alias !== undefined && canvas.alias !== alias)) continue;\n      this.#canvases.delete(canvasKey(sessionId, canvas.alias));\n      this.#release(canvas);\n      canvas.runtime.dispose();\n    }\n  }\n\n  apply(sessionId: string, message: AuthorHubMessage): void {\n    if (message.alias === undefined) return;\n    const canvas = this.#canvases.get(canvasKey(sessionId, message.alias));\n    if (canvas === undefined || message.kind === 'rejected') return;\n    if (\n      message.generation !== canvas.generation ||\n      (message.ownerToken !== canvas.ownerToken && canvas.ownerToken !== undefined)\n    )\n      return;\n    if (message.kind === 'accepted') {\n      canvas.ownerToken = message.ownerToken;\n      clearTimeout(canvas.leaseTimer);\n      canvas.leaseTimer = setTimeout(() => this.#register(canvas), Math.max(1000, Math.floor(message.leaseMs / 2)));\n      if (message.catalogToken === undefined) this.#sendCatalog(canvas);\n      else canvas.catalogToken = message.catalogToken;\n      return;\n    }\n    if (message.catalogToken !== canvas.catalogToken) return;\n    if (message.kind === 'cancel') {\n      canvas.pending.get(message.requestId)?.abort(new Error('Author tool request cancelled'));\n      return;\n    }\n    if (message.kind !== 'request' || canvas.pending.has(message.requestId)) return;\n    const controller = new AbortController();\n    canvas.pending.set(message.requestId, controller);\n    void canvas.runtime\n      .execute(message.name, message.arguments, controller.signal)\n      .then((result) => {\n        if (!this.#current(canvas, message.requestId, controller)) return;\n        if (controller.signal.aborted) this.#sendCancelled(canvas, message.requestId);\n        else\n          this.#send(canvas, {\n            kind: 'result',\n            alias: canvas.alias,\n            generation: canvas.generation,\n            ownerToken: canvas.ownerToken!,\n            catalogToken: canvas.catalogToken!,\n            requestId: message.requestId,\n            result,\n          });\n      })\n      .catch((error: unknown) => {\n        if (!this.#current(canvas, message.requestId, controller)) return;\n        if (controller.signal.aborted) this.#sendCancelled(canvas, 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(canvas, {\n            kind: 'result',\n            alias: canvas.alias,\n            generation: canvas.generation,\n            ownerToken: canvas.ownerToken!,\n            catalogToken: canvas.catalogToken!,\n            requestId: message.requestId,\n            result: { error: { code, message: messageText } },\n          });\n        }\n      })\n      .finally(() => {\n        if (canvas.pending.get(message.requestId) === controller) canvas.pending.delete(message.requestId);\n      });\n  }\n\n  activeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n    const active = [...this.#canvases.values()].filter(\n      (canvas) => canvas.sessionId === sessionId && canvas.catalogToken,\n    );\n    return active.length > 0\n      ? {\n          activation: 'active',\n          capabilityCount: active.reduce(\n            (count, canvas) => count + canvas.profiles.reduce((total, profile) => total + profile.tools.length, 0),\n            0,\n          ),\n        }\n      : { activation: 'inactive', capabilityCount: 0 };\n  }\n\n  dispose(): void {\n    if (this.#disposed) return;\n    this.#disposed = true;\n    this.#releaseConnected();\n    for (const canvas of this.#canvases.values()) {\n      this.#release(canvas);\n      canvas.runtime.dispose();\n    }\n    this.#canvases.clear();\n    for (const entry of this.#opening.values()) entry.runtime.dispose();\n    this.#opening.clear();\n  }\n\n  async #replace(canvas: Canvas, profiles: readonly AuthorTrustedProfile[]): Promise<void> {\n    const key = canvasKey(canvas.sessionId, canvas.alias);\n    if (this.#disposed || this.#canvases.get(key) !== canvas) return;\n    this.#release(canvas);\n    const generation = canvas.generation;\n    const replacementId = ++canvas.replacementId;\n    let release: () => void;\n    try {\n      release = await canvas.runtime.replaceProfiles(profiles);\n    } catch (error) {\n      if (canvas.replacementId !== replacementId || this.#canvases.get(key) !== canvas) return;\n      throw error;\n    }\n    if (\n      this.#disposed ||\n      this.#canvases.get(key) !== canvas ||\n      canvas.generation !== generation ||\n      canvas.replacementId !== replacementId\n    ) {\n      release();\n      return;\n    }\n    canvas.release = release;\n    canvas.profiles = profiles;\n    this.#register(canvas);\n  }\n\n  #register(canvas: Canvas): void {\n    if (this.#canvases.get(canvasKey(canvas.sessionId, canvas.alias)) === canvas)\n      this.#send(canvas, { kind: 'register', alias: canvas.alias, generation: canvas.generation });\n  }\n\n  #sendCatalog(canvas: Canvas): void {\n    this.#send(canvas, {\n      kind: 'catalog',\n      alias: canvas.alias,\n      generation: canvas.generation,\n      ownerToken: canvas.ownerToken!,\n      tools: canvas.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(canvas: Canvas, requestId: string): void {\n    this.#send(canvas, {\n      kind: 'cancelled',\n      alias: canvas.alias,\n      generation: canvas.generation,\n      ownerToken: canvas.ownerToken!,\n      catalogToken: canvas.catalogToken!,\n      requestId,\n    });\n  }\n\n  #send(canvas: Canvas, 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({\n        mount,\n        service: 'author.bridge',\n        method: 'send',\n        input: { sessionId: canvas.sessionId, message: payload },\n      })\n      .catch(() => undefined);\n  }\n\n  #current(canvas: Canvas, requestId: string, controller: AbortController): boolean {\n    return (\n      this.#canvases.get(canvasKey(canvas.sessionId, canvas.alias)) === canvas &&\n      canvas.pending.get(requestId) === controller\n    );\n  }\n\n  #release(canvas: Canvas): void {\n    clearTimeout(canvas.leaseTimer);\n    canvas.leaseTimer = undefined;\n    this.#send(canvas, { kind: 'release', alias: canvas.alias, generation: canvas.generation });\n    canvas.release();\n    for (const controller of canvas.pending.values()) controller.abort(new Error('Author viewport changed'));\n    canvas.pending.clear();\n    canvas.ownerToken = undefined;\n    canvas.catalogToken = undefined;\n    canvas.generation = ++this.#generation;\n  }\n}\n\nconst authorBridgeRuntimes = new Store<ReadonlyMap<string, AuthorBrowserBridge>>(new Map());\nconst bridgeFor = (sessionId: string): AuthorBrowserBridge | undefined =>\n  authorBridgeRuntimes.state.get(sessionId) ?? authorBridgeRuntimes.state.get('global');\n\nexport function startAuthorBrowserBridge(runtime: WebPluginRuntime): () => void {\n  const key = runtime.mount?.scope === 'session' ? runtime.mount.sessionId : 'global';\n  const previous = authorBridgeRuntimes.state.get(key);\n  previous?.dispose();\n  const next = new AuthorBrowserBridge(runtime);\n  authorBridgeRuntimes.setState((state) => new Map(state).set(key, next));\n  return () => {\n    if (authorBridgeRuntimes.state.get(key) !== next) return;\n    next.dispose();\n    authorBridgeRuntimes.setState((state) => {\n      const remaining = new Map(state);\n      remaining.delete(key);\n      return remaining;\n    });\n  };\n}\n\nexport async function openAuthorCanvas(\n  sessionId: string,\n  alias: string,\n  profiles: readonly AuthorTrustedProfile[],\n): Promise<void> {\n  await bridgeFor(sessionId)?.open(sessionId, alias, profiles);\n}\n\nexport async function focusAuthorViewport(\n  sessionId: string,\n  profiles: readonly AuthorTrustedProfile[],\n  alias = 'default',\n): Promise<() => void> {\n  return (await bridgeFor(sessionId)?.focus(sessionId, alias, profiles)) ?? (() => undefined);\n}\n\nexport function applyAuthorHubMessage(sessionId: string, message: AuthorHubMessage): void {\n  bridgeFor(sessionId)?.apply(sessionId, message);\n}\n\nexport function dropAuthorViewportSession(sessionId: string, alias?: string): void {\n  bridgeFor(sessionId)?.drop(sessionId, alias);\n}\n\nexport function authorBridgeView(sessionId: string): { activation: 'inactive' | 'active'; capabilityCount: number } {\n  return bridgeFor(sessionId)?.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 { AuthorPreviewSelection } from '../../../../../types/authorPreview';\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  annotationsByDocument: Readonly<Record<string, AuthorDocumentAnnotationCollection>>;\n  toolsByDocument: Readonly<Record<string, AuthorToolMode>>;\n  previewSelections?: Readonly<Record<string, AuthorPreviewSelection>>;\n  videoSeekRequest?: { path: string; generation: number; timeSeconds: number; sequence: number };\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  annotationsByDocument: {},\n  toolsByDocument: {},\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\nconst EMPTY_COLLECTION: AuthorDocumentAnnotationCollection = Object.freeze({\n  revision: 0,\n  stale: false,\n  candidate: undefined,\n  candidateText: '',\n  annotations: Object.freeze([]),\n  updatedAt: 0,\n});\n\nexport function authorDocumentAnnotations(\n  sessionId: string | null,\n  path: string,\n  state: AuthorWorkspaceState = authorWorkspace.store.state,\n): AuthorDocumentAnnotationCollection {\n  if (sessionId === null) return EMPTY_COLLECTION;\n  const document = state.documents[authorDocumentKey(sessionId, path)];\n  const collection = state.sessions[sessionId]?.annotationsByDocument[normalizeAuthorPath(path)];\n  return document !== undefined &&\n    collection !== undefined &&\n    !collection.stale &&\n    collection.revision === document.version &&\n    collection.sourceSha256 === document.sourceSha256\n    ? collection\n    : EMPTY_COLLECTION;\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      sessions = {\n        ...sessions,\n        [record.sessionId]: {\n          ...session,\n          annotationsByDocument: { ...session.annotationsByDocument, [path]: collection },\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 !== 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      const now = Date.now();\n      const staleCollection = staleAuthorCollection(collection, now);\n      sessions = {\n        ...sessions,\n        [sessionId]: {\n          ...session,\n          annotationsByDocument: {\n            ...session.annotationsByDocument,\n            ...(staleCollection && { [path]: staleCollection }),\n          },\n          requests: session.requests.map((request) =>\n            input.kind !== 'story-preview' &&\n            request.documentPath === path &&\n            ['REQUESTED', 'CHANGING', 'CHANGED'].includes(request.status)\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    }\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): number {\n  let generation = 0;\n  updateSession(sessionId, (session) => {\n    generation = session.generation + 1;\n    return {\n      ...session,\n      generation,\n      focusedDocument: { path: normalizeAuthorPath(path), generation, focusedAt: Date.now() },\n    };\n  });\n  return generation;\n}\n\nexport function releaseAuthorDocumentFocus(sessionId: string, generation: number): void {\n  updateSession(sessionId, (session) =>\n    session.focusedDocument?.generation === generation ? { ...session, focusedDocument: undefined } : session,\n  );\n}\n\nexport function seekAuthorVideo(sessionId: string, path: string, timeSeconds: number): boolean {\n  const normalized = normalizeAuthorPath(path);\n  const focused = authorSessionWorkspace(sessionId).focusedDocument;\n  if (\n    focused?.path !== normalized ||\n    authorDocumentAnnotations(sessionId, normalized).candidate ||\n    !Number.isFinite(timeSeconds) ||\n    timeSeconds < 0 ||\n    authorDocument(sessionId, normalized)?.kind !== 'video'\n  )\n    return false;\n  setAuthorToolMode(sessionId, normalized, 'select');\n  updateSession(sessionId, (session) => ({\n    ...session,\n    videoSeekRequest: {\n      path: normalized,\n      generation: focused.generation,\n      timeSeconds,\n      sequence: (session.videoSeekRequest?.sequence ?? 0) + 1,\n    },\n  }));\n  return true;\n}\n\nexport function authorToolMode(sessionId: string | null, path: string): AuthorToolMode {\n  return authorSessionWorkspace(sessionId).toolsByDocument[normalizeAuthorPath(path)] ?? 'select';\n}\n\nexport function setAuthorPreviewSelection(\n  sessionId: string,\n  path: string,\n  preview: AuthorPreviewSelection | undefined,\n): void {\n  const normalized = normalizeAuthorPath(path);\n  updateSession(sessionId, (session) => {\n    const selections = { ...session.previewSelections };\n    if (preview === undefined) delete selections[normalized];\n    else selections[normalized] = { ...preview };\n    return { ...session, previewSelections: selections };\n  });\n}\n\nexport function setAuthorToolMode(sessionId: string, path: string, tool: AuthorToolMode): void {\n  const normalized = normalizeAuthorPath(path);\n  updateSession(sessionId, (session) => ({\n    ...session,\n    toolsByDocument: { ...session.toolsByDocument, [normalized]: tool },\n  }));\n}\n\nfunction validateCandidate(sessionId: string, path: string, candidate: AuthorRegionCandidate): void {\n  const document = authorDocument(sessionId, path);\n  if (document === undefined || normalizeAuthorPath(candidate.documentPath) !== normalizeAuthorPath(path))\n    throw new Error('The Author selection does not belong to the document.');\n  if (document.version !== candidate.revision || document.sourceSha256 !== candidate.sourceSha256)\n    throw new Error('The Author selection is stale for the document.');\n}\n\nexport function setAuthorRegionCandidate(\n  sessionId: string,\n  path: string,\n  candidate: AuthorRegionCandidate | undefined,\n): void {\n  if (candidate !== undefined) validateCandidate(sessionId, path, candidate);\n  const thumbnail = authorDocumentAnnotations(sessionId, path).candidate?.thumbnailUrl;\n  updateCollection(sessionId, path, (collection) => ({\n    ...collection,\n    candidate: candidate && copyCandidate(candidate),\n  }));\n  if (thumbnail !== undefined && thumbnail !== candidate?.thumbnailUrl) revokeThumbnail(thumbnail);\n}\n\nexport function setAuthorCandidateText(sessionId: string, path: 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  updateCollection(sessionId, path, (collection) => ({ ...collection, candidateText }));\n}\n\nexport function commitAuthorRegion(sessionId: string, path: string, comment: string): string {\n  const candidate = authorDocumentAnnotations(sessionId, path).candidate;\n  if (candidate === undefined) throw new Error('Select a document annotation before adding a comment.');\n  const id = crypto.randomUUID();\n  addAuthorRegion(sessionId, { ...candidate, id, comment, version: 1 });\n  updateCollection(sessionId, path, (collection) => ({ ...collection, candidate: undefined, candidateText: '' }));\n  return id;\n}\n\nexport function addAuthorRegion(sessionId: string, region: AuthorRegionDraft): void {\n  if (region.comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n  validateCandidate(sessionId, region.documentPath, region);\n  updateCollection(sessionId, region.documentPath, (collection) => {\n    if (collection.annotations.length >= AUTHOR_REGION_LIMIT)\n      throw new Error(`Author requests support at most ${AUTHOR_REGION_LIMIT} annotations.`);\n    if (collection.annotations.some((candidate) => candidate.id === region.id))\n      throw new Error(`Author annotation '${region.id}' already exists.`);\n    return {\n      ...collection,\n      annotations: [...collection.annotations, copyRegion({ ...region, version: region.version ?? 1 })],\n    };\n  });\n}\n\nexport function removeAuthorRegion(sessionId: string, path: string, regionId: string, expectedVersion?: number): void {\n  let thumbnail: string | undefined;\n  updateCollection(sessionId, path, (collection) => {\n    const annotation = collection.annotations.find((candidate) => candidate.id === regionId);\n    if (annotation === undefined || (expectedVersion !== undefined && (annotation.version ?? 1) !== expectedVersion))\n      return collection;\n    thumbnail = annotation.thumbnailUrl;\n    return { ...collection, annotations: collection.annotations.filter((candidate) => candidate.id !== regionId) };\n  });\n  if (thumbnail !== undefined) revokeThumbnail(thumbnail);\n}\n\nexport function updateAuthorRegionComment(sessionId: string, path: string, regionId: string, comment: string): void {\n  if (comment.trim() === '') throw new Error('Every Author annotation requires a comment.');\n  updateCollection(sessionId, path, (collection) => ({\n    ...collection,\n    annotations: collection.annotations.map((annotation) =>\n      annotation.id === regionId ? { ...annotation, comment, version: (annotation.version ?? 1) + 1 } : annotation,\n    ),\n  }));\n}\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 identityChanged = document.version !== next.version || document.sourceSha256 !== next.sourceSha256;\n    const collection = identityChanged ? session?.annotationsByDocument[document.path] : undefined;\n    if (collection !== undefined) {\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    }\n    const staleCollection = identityChanged ? staleAuthorCollection(collection, Date.now()) : undefined;\n    const sessions =\n      identityChanged && session !== undefined\n        ? {\n            ...state.sessions,\n            [sessionId]: {\n              ...session,\n              annotationsByDocument: {\n                ...session.annotationsByDocument,\n                ...(staleCollection && { [document.path]: staleCollection }),\n              },\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    stroke: candidate.stroke?.map((point) => ({ ...point })),\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 updateCollection(\n  sessionId: string,\n  path: string,\n  update: (collection: AuthorDocumentAnnotationCollection) => AuthorDocumentAnnotationCollection,\n): void {\n  const normalized = normalizeAuthorPath(path);\n  const document = authorDocument(sessionId, normalized);\n  if (document === undefined) return;\n  updateSession(sessionId, (session) => {\n    const current = authorDocumentAnnotations(sessionId, normalized);\n    const base =\n      current === EMPTY_COLLECTION\n        ? { ...EMPTY_COLLECTION, revision: document.version, sourceSha256: document.sourceSha256 }\n        : current;\n    const next = update(base);\n    if (next === base) return session;\n    return {\n      ...session,\n      annotationsByDocument: {\n        ...session.annotationsByDocument,\n        [normalized]: { ...next, stale: false, updatedAt: Date.now() },\n      },\n    };\n  });\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 { Store } from '@tanstack/store';\n\nimport { authorDocumentKey } from './authorWorkspaceStore';\n\nexport const canvasAliases = new Store<Readonly<Record<string, string>>>({});\nexport const canvasPaths = new Store<Readonly<Record<string, string>>>({});\nexport const canvasFailures = new Store<Readonly<Record<string, string>>>({});\n\nexport const authorCanvasAlias = (sessionId: string, path: string): string | undefined =>\n  canvasAliases.state[authorDocumentKey(sessionId, path)];\n","import type { AuthorNormalizedPoint, AuthorNormalizedRect } from './authorViewportTypes';\n\nexport const AUTHOR_STROKE_POINT_LIMIT = 128;\n\n/** Keep freehand evidence small and source-relative. Reject malformed geometry rather than degrading it into a crop. */\nexport function validAuthorStroke(value: unknown): value is readonly AuthorNormalizedPoint[] {\n  return (\n    Array.isArray(value) &&\n    value.length >= 2 &&\n    value.length <= AUTHOR_STROKE_POINT_LIMIT &&\n    value.some((point: AuthorNormalizedPoint) => point.x !== value[0]?.x || point.y !== value[0]?.y) &&\n    value.every(\n      (point: unknown) =>\n        typeof point === 'object' &&\n        point !== null &&\n        Number.isFinite((point as AuthorNormalizedPoint).x) &&\n        Number.isFinite((point as AuthorNormalizedPoint).y) &&\n        (point as AuthorNormalizedPoint).x >= 0 &&\n        (point as AuthorNormalizedPoint).x <= 1 &&\n        (point as AuthorNormalizedPoint).y >= 0 &&\n        (point as AuthorNormalizedPoint).y <= 1,\n    )\n  );\n}\n\nexport function authorStrokeBounds(points: readonly AuthorNormalizedPoint[]): AuthorNormalizedRect | null {\n  if (!validAuthorStroke(points)) return null;\n  const left = Math.min(...points.map((point) => point.x));\n  const top = Math.min(...points.map((point) => point.y));\n  const right = Math.max(...points.map((point) => point.x));\n  const bottom = Math.max(...points.map((point) => point.y));\n  const x = Math.max(0, Math.min(left, 1 - 0.001));\n  const y = Math.max(0, Math.min(top, 1 - 0.001));\n  return {\n    x,\n    y,\n    width: Math.min(1 - x, Math.max(right - x, 0.001)),\n    height: Math.min(1 - y, Math.max(bottom - y, 0.001)),\n  };\n}\n\nexport function appendAuthorStrokePoint(\n  points: readonly AuthorNormalizedPoint[],\n  point: AuthorNormalizedPoint,\n): readonly AuthorNormalizedPoint[] {\n  if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) return points;\n  const next = { x: Math.max(0, Math.min(1, point.x)), y: Math.max(0, Math.min(1, point.y)) };\n  if (points.length >= AUTHOR_STROKE_POINT_LIMIT) return points;\n  const last = points.at(-1);\n  return last?.x === next.x && last.y === next.y ? points : [...points, next];\n}\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 type { ComposerCapture, WebPluginContextItem } from '@agimon-ai/doompi-core/web';\n\nimport { validAuthorStroke } from './authorRegions';\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  stroke?: AuthorRegionDraft['stroke'];\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    alias?: 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  alias?: string,\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      ...(alias === undefined ? {} : { alias }),\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 (\n        region.stroke !== undefined &&\n        (!validAuthorStroke(region.stroke) || !('rect' in region.anchor) || region.mode !== 'region')\n      ) {\n        throw new Error(`Region ${String(index + 1)} has invalid feedback stroke geometry.`);\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        ...(region.stroke === undefined ? {} : { stroke: region.stroke.map((point) => ({ ...point })) }),\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\n/** Context stays below the host limit even when paths and anchor locations are unusually long. */\nexport function authorDocumentContextContent(\n  path: string,\n  alias: string | undefined,\n  annotations: readonly AuthorRegionDraft[],\n): string {\n  const heading = `Author document: ${path}${alias === undefined ? '' : ` (canvas ${alias})`}`;\n  // ponytail: Comments are previews, not submitted annotations. Keep each preview short.\n  const drafts = annotations.map(\n    (region, index) => `(${index + 1}) ${region.comment.slice(0, 1000)} [${anchorLocation(region.anchor)}]`,\n  );\n  return utf8Prefix(\n    [heading, ...(drafts.length === 0 ? [] : ['Unsent annotations (not yet submitted):', ...drafts])].join('\\n'),\n    AUTHOR_PACKET_MAX_BYTES,\n  );\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: `Author document: ${packet.document.path}${packet.document.alias === undefined ? '' : ` (canvas ${packet.document.alias})`}\\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 (region.stroke !== undefined) {\n            if (!validAuthorStroke(region.stroke)) throw new Error('Invalid feedback stroke geometry.');\n            context.beginPath();\n            region.stroke.forEach((point, index) => {\n              const x = drawX + point.x * drawWidth;\n              const y = drawY + point.y * drawHeight;\n              if (index === 0) context.moveTo(x, y);\n              else context.lineTo(x, y);\n            });\n            context.strokeStyle = annotationColor;\n            context.lineWidth = Math.max(3, Math.min(drawWidth, drawHeight) / 150);\n            context.lineCap = 'round';\n            context.lineJoin = 'round';\n            context.stroke();\n            labelX = drawX + region.stroke[0]!.x * drawWidth;\n            labelY = drawY + region.stroke[0]!.y * drawHeight;\n          } else 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 { AuthorDocumentAnnotationCollection } from '../../_lib/authorWorkspaceStore';\nimport {\n  commitAuthorRegion,\n  removeAuthorRegion,\n  seekAuthorVideo,\n  setAuthorCandidateText,\n  setAuthorRegionCandidate,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorRegionDrafts({\n  sessionId,\n  path,\n  drafts,\n}: {\n  sessionId: string;\n  path: string;\n  drafts: AuthorDocumentAnnotationCollection;\n}) {\n  const [error, setError] = useState<string>();\n  const add = () => {\n    try {\n      commitAuthorRegion(sessionId, path, drafts.candidateText);\n      setError(undefined);\n    } catch (reason) {\n      setError(reason instanceof Error ? reason.message : String(reason));\n    }\n  };\n  if (!drafts.candidate && drafts.annotations.length === 0) return null;\n  const candidateKind = drafts.candidate?.mode === 'point' ? 'point' : 'region';\n  return (\n    <section className=\"space-y-2\" data-testid=\"author-region-drafts\">\n      {drafts.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          {drafts.candidate.anchor.kind === 'video-time-rect' || drafts.candidate.anchor.kind === 'video-time-point' ? (\n            <p className=\"text-base text-doom-dim sm:text-sm\">\n              Frame at {drafts.candidate.anchor.timeSeconds.toFixed(3)}s\n            </p>\n          ) : null}\n          <textarea\n            aria-label=\"Annotation comment\"\n            value={drafts.candidateText}\n            onChange={(event) => setAuthorCandidateText(sessionId, path, 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={!drafts.candidate || !drafts.candidateText.trim() || drafts.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, path, undefined);\n              setAuthorCandidateText(sessionId, path, '');\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      {drafts.annotations.length > 0 ? (\n        <h3 className=\"text-base font-semibold text-doom-text\">Unsent annotations ({drafts.annotations.length})</h3>\n      ) : null}\n      <ol className=\"space-y-2\">\n        {drafts.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={drafts.candidate !== undefined}\n                onClick={() => {\n                  if (region.anchor.kind === 'video-time-rect' || region.anchor.kind === 'video-time-point') {\n                    seekAuthorVideo(sessionId, path, 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, path, region.id)}\n            >\n              remove\n            </Button>\n          </li>\n        ))}\n      </ol>\n    </section>\n  );\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-web-components';\nimport { useState } from 'react';\n\nimport { authorCanvasAlias } from '../../_lib/authorCanvasState';\nimport { authorCaptureContext, createAuthorCapturePacket, multiRegionCaptureProvider } from '../../_lib/authorCapture';\nimport type { AuthorWorkspaceDocument, AuthorDocumentAnnotationCollection } from '../../_lib/authorWorkspaceStore';\nimport { AuthorRegionDrafts } from './AuthorRegionDrafts';\n\nexport function AuthorFeedbackControls({\n  sessionId,\n  document,\n  drafts,\n  submitCapture,\n}: {\n  sessionId: string;\n  document: AuthorWorkspaceDocument;\n  drafts: AuthorDocumentAnnotationCollection;\n  submitCapture: WebPluginSlotProps['submitCapture'];\n}) {\n  const [status, setStatus] = useState<string>();\n  const [capturing, setCapturing] = useState(false);\n  return (\n    <div className=\"space-y-2\">\n      <AuthorRegionDrafts sessionId={sessionId} path={document.path} drafts={drafts} />\n      {drafts.annotations.length > 0 ? (\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 || drafts.candidate !== undefined || submitCapture === undefined}\n          onClick={async () => {\n            if (capturing || drafts.candidate || submitCapture === undefined) return;\n            setCapturing(true);\n            setStatus('Submitting annotations…');\n            try {\n              const packet = createAuthorCapturePacket(\n                crypto.randomUUID(),\n                Date.now(),\n                document,\n                drafts.annotations,\n                authorCanvasAlias(sessionId, document.path),\n              );\n              const image = await multiRegionCaptureProvider(drafts.annotations).capture();\n              await submitCapture({ ...image, context: authorCaptureContext(packet) });\n              setStatus('Request submitted. You can keep annotating here.');\n            } catch (reason) {\n              setStatus(reason instanceof Error ? reason.message : String(reason));\n            } finally {\n              setCapturing(false);\n            }\n          }}\n        >\n          {capturing\n            ? 'Submitting…'\n            : `Submit ${drafts.annotations.length} annotation${drafts.annotations.length === 1 ? '' : 's'}`}\n        </Button>\n      ) : null}\n      {submitCapture === undefined ? (\n        <output className=\"text-sm text-doom-red\">Submission unavailable. Reload to update the app.</output>\n      ) : null}\n      {status ? <output className=\"block text-sm text-doom-dim\">{status}</output> : null}\n    </div>\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  authorDocumentAnnotations,\n  reviseAuthorDocument,\n  setAuthorRegionCandidate,\n  setAuthorToolMode,\n} from '../../_lib/authorWorkspaceStore';\n\nexport function AuthorToolPalette({\n  sessionId,\n  path,\n  kind,\n  activeTool,\n}: {\n  sessionId: string;\n  path: string;\n  kind: AuthorDocumentKind;\n  activeTool: AuthorToolMode;\n}) {\n  const [error, setError] = useState<string>();\n  const format = (style: 'Bold' | 'Heading' | 'Link' | 'List') => {\n    const selected = authorDocumentAnnotations(sessionId, path).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, path, undefined);\n    setError(undefined);\n  };\n  const tools = [\n    ...(['image', 'pdf', 'video', 'story-preview'].includes(kind)\n      ? [\n          {\n            label: 'Pan',\n            glyph: '✋',\n            action: () => setAuthorToolMode(sessionId, path, activeTool === 'pan' ? 'select' : 'pan'),\n            active: activeTool === 'pan',\n          },\n          {\n            label: 'Draw',\n            glyph: '✎',\n            action: () => setAuthorToolMode(sessionId, path, activeTool === 'draw' ? 'select' : 'draw'),\n            active: activeTool === 'draw',\n          },\n        ]\n      : []),\n    {\n      label: 'Region',\n      glyph: '⌗',\n      action: () => setAuthorToolMode(sessionId, path, 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, path, 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-hi 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 === 'draw'\n          ? 'Draw a location mark, then enter feedback text. Marks never edit the source.'\n          : activeTool === 'pan'\n            ? 'Drag to pan; pinch to zoom. Use Fit to reset the view.'\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 { useStore } from '@tanstack/react-store';\n\nimport { autonomousVoiceGridVisible } from '../../_components/AuthorGridOverlay';\nimport { authorGrid } from '../../_lib/authorGrid';\nimport { authorWorkspace, authorDocumentAnnotations, normalizeAuthorPath } from '../../_lib/authorWorkspaceStore';\nimport { AuthorFeedbackControls } from './AuthorFeedbackControls';\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 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 focusedPath = workspace?.focusedDocument?.path;\n  const requests = (workspace?.requests ?? []).filter(\n    (request) => focusedPath === undefined || request.documentPath === focusedPath,\n  );\n  const drafts = useStore(authorWorkspace.store, (state) =>\n    authorDocumentAnnotations(sessionId, focusedPath ?? '', state),\n  );\n  const activity =\n    sessionId !== null &&\n    focusedPath !== undefined &&\n    requests.some((request) => request.status === 'REQUESTED' || request.status === 'CHANGING')\n      ? (renderSessionActivity?.() ?? null)\n      : 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\n                sessionId={sessionId}\n                path={focused.path}\n                kind={focused.kind}\n                activeTool={workspace.toolsByDocument[normalizeAuthorPath(focused.path)] ?? 'select'}\n              />\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              <div className=\"hidden sm:block\">\n                <AuthorFeedbackControls\n                  key={focused.path}\n                  sessionId={sessionId}\n                  document={focused}\n                  drafts={drafts}\n                  submitCapture={submitCapture}\n                />\n              </div>\n            </>\n          ) : null}\n          <AuthorRequestLog requests={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 { apiResponse, defineApiRoutes } from '@agimon-ai/doompi-core/web';\n\nimport type { AuthorOpenFileResult } from './author';\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  bridgeClose: {\n    method: 'POST',\n    path: '/bridge/close',\n  },\n  bridgeDescribe: {\n    method: 'GET',\n    path: '/bridge/describe',\n    query: ['alias'],\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 | AuthorOpenFileResult>(),\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 { SlotDeclaration, TransientTab, WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport type { ComponentType } from 'react';\n\nexport interface AuthorPreviewSelection {\n  appPath: string;\n  storyExport: string;\n  snapshot?: boolean;\n}\n\nexport interface AuthorOpenSourceAction {\n  version: 1;\n  createTab(input: { sessionId: string; path: string; preview?: AuthorPreviewSelection }): TransientTab;\n}\n\nexport function parseAuthorOpenSourceAction(input: unknown): AuthorOpenSourceAction | null {\n  if (typeof input !== 'object' || input === null) return null;\n  const candidate = input as Record<string, unknown>;\n  return candidate.version === 1 && typeof candidate.createTab === 'function'\n    ? (candidate as unknown as AuthorOpenSourceAction)\n    : null;\n}\n\nexport interface AuthorPreviewActionSource {\n  path: string;\n  hasUnsavedChanges: boolean;\n  kind?: string;\n  revision?: number;\n  sourceSha256?: string;\n  preview?: AuthorPreviewSelection;\n}\n\nexport interface AuthorPreviewAnnotationLocation {\n  mode: 'region' | 'point';\n  /** Feedback-only normalized location mark, never an editable source region. */\n  stroke?: readonly { x: number; y: number }[];\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' | 'draw' | 'pan';\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 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    if (!('fragments' in parsed) || !Array.isArray(parsed.fragments))\n      throw new Error('Author returned an invalid structured document.');\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  authorDocumentAnnotations,\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    authorDocumentAnnotations(sessionId, path)?.annotations.find((candidate) => candidate.id === regionId) ??\n    workspace.requests\n      .filter(\n        (request) => request.documentPath === path && (request.status === 'REQUESTED' || request.status === 'CHANGING'),\n      )\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.stroke !== undefined)\n    throw new Error('UNSUPPORTED_REGION: Freehand feedback cannot authorize a document mutation.');\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.documentPath === path &&\n          candidate.status === 'REQUESTED' &&\n          (candidate.pendingRegions ?? candidate.regions).some((item) => item.id === regionId),\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 { 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  Button,\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 { appendAuthorStrokePoint, authorStrokeBounds, normalizedAuthorRectangle } from '../_lib/authorRegions';\nimport type { AuthorDisplayedRegion, AuthorNativeAnchor, AuthorToolMode } from '../_lib/authorViewportTypes';\nimport {\n  authorSessionWorkspace,\n  authorDocumentAnnotations,\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        pointerId: number;\n        mode: 'mark' | 'comment' | 'draw';\n        points: readonly { x: number; y: number }[];\n        element: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n      }\n    | undefined\n  >(undefined);\n  const pointers = useRef(new Map<number, { x: number; y: number }>());\n  const pan = useRef<{ x: number; y: number; left: number; top: number } | undefined>(undefined);\n  const pinch = useRef<{ distance: number; zoom: number } | undefined>(undefined);\n  const [zoom, setZoom] = useState(1);\n  const [stroke, setStroke] = useState<readonly { x: number; y: number }[]>();\n  const [pdfPlane, setPdfPlane] = useState<{ left: number; top: number; width: number; height: number }>();\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  useEffect(() => {\n    start.current = undefined;\n    pointers.current.clear();\n    pinch.current = undefined;\n    pan.current = undefined;\n    setStroke(undefined);\n    setSelection(undefined);\n    setZoom(1);\n  }, [source.path, source.version, source.sourceSha256, source.mediaUrl]);\n  useEffect(() => {\n    start.current = undefined;\n    setStroke(undefined);\n    pointers.current.clear();\n    pinch.current = undefined;\n    pan.current = undefined;\n  }, [activeTool]);\n  const mediaUrl = media?.source === source.mediaUrl ? media?.url : undefined;\n  useEffect(() => {\n    if (source.kind !== 'pdf' || mediaUrl === undefined) return;\n    const container = host.current;\n    if (container === null) return;\n    const update = () => {\n      const canvas = container.querySelector('canvas');\n      const wrapper = container.querySelector('[data-testid=\"author-media\"]');\n      if (!canvas || !wrapper) return;\n      const bounds = canvas.getBoundingClientRect();\n      const outer = wrapper.getBoundingClientRect();\n      const next = {\n        left: (bounds.left - outer.left) / zoom,\n        top: (bounds.top - outer.top) / zoom,\n        width: bounds.width / zoom,\n        height: bounds.height / zoom,\n      };\n      setPdfPlane((current) =>\n        current &&\n        Object.keys(next).every(\n          (key) => Math.abs(current[key as keyof typeof next] - next[key as keyof typeof next]) < 0.01,\n        )\n          ? current\n          : next,\n      );\n    };\n    const resize = new ResizeObserver(update);\n    const mutation = new MutationObserver(() => {\n      const canvas = container.querySelector('canvas');\n      if (canvas) resize.observe(canvas);\n      update();\n    });\n    mutation.observe(container, { childList: true, subtree: true });\n    const canvas = container.querySelector('canvas');\n    if (canvas) resize.observe(canvas);\n    update();\n    return () => {\n      resize.disconnect();\n      mutation.disconnect();\n    };\n  }, [source.kind, mediaUrl, zoom]);\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 (authorDocumentAnnotations(sessionId, source.path).candidate || !Number.isFinite(seconds)) return;\n    const player = video.current;\n    if (!player) return;\n    player.pause();\n    setAuthorToolMode(sessionId, source.path, '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    if (!drag || drag.pointerId !== event.pointerId || pinch.current !== undefined) return;\n    start.current = undefined;\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 points = drag.mode === 'draw' ? appendAuthorStrokePoint(drag.points, point) : undefined;\n    const rect =\n      drag.mode === 'draw'\n        ? authorStrokeBounds(points ?? [])\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 !== 'comment' && !rect) return;\n    setStroke(undefined);\n    setSelection(\n      drag.mode === 'draw'\n        ? undefined\n        : drag.mode === 'mark'\n          ? { path: source.path, rect: rect! }\n          : { path: source.path, point },\n    );\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 !== 'comment'\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 !== 'comment'\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        if (pdf.current?.getState().page !== page.page) return;\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 !== 'comment'\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        if (\n          Math.abs((video.current?.getState().currentTime ?? -1) - frame.timeSeconds) > 0.1 ||\n          video.current?.isFrameReady() === false\n        )\n          return;\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, source.path, {\n        documentPath: source.path,\n        revision: source.version,\n        sourceSha256: source.sourceSha256,\n        mode: drag.mode === 'comment' ? 'point' : 'region',\n        anchor,\n        ...(points === undefined ? {} : { stroke: points }),\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 strokeOverlay = (points: readonly { x: number; y: number }[] | undefined, ordinal?: number) =>\n    points === undefined ? null : (\n      <svg\n        data-testid={ordinal === undefined ? 'author-media-stroke-selection' : 'author-media-stroke'}\n        data-author-stroke={ordinal}\n        aria-hidden=\"true\"\n        className=\"pointer-events-none absolute inset-0 h-full w-full overflow-visible\"\n        viewBox=\"0 0 1000 1000\"\n        preserveAspectRatio=\"none\"\n      >\n        <polyline\n          points={points.map((point) => `${String(point.x * 1000)},${String(point.y * 1000)}`).join(' ')}\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"5\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className={ordinal === undefined ? 'text-doom-red' : 'text-doom-yellow'}\n        />\n      </svg>\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={{ cursor: activeTool === 'draw' || activeTool === 'mark' ? 'crosshair' : undefined }}\n      onPointerMove={(event) => {\n        if (pointers.current.has(event.pointerId))\n          pointers.current.set(event.pointerId, { x: event.clientX, y: event.clientY });\n        if (pinch.current !== undefined && pointers.current.size >= 2) {\n          const [a, b] = [...pointers.current.values()];\n          const distance = Math.hypot(a!.x - b!.x, a!.y - b!.y);\n          if (pinch.current.distance > 0)\n            setZoom(Math.min(8, Math.max(1, (pinch.current.zoom * distance) / pinch.current.distance)));\n          return;\n        }\n        if (pan.current !== undefined && activeTool === 'pan') {\n          const element = host.current;\n          if (element) {\n            element.scrollLeft = pan.current.left + pan.current.x - event.clientX;\n            element.scrollTop = pan.current.top + pan.current.y - event.clientY;\n          }\n          return;\n        }\n        const drag = start.current;\n        if (drag?.pointerId !== event.pointerId) return;\n        if (drag.mode === 'draw') {\n          const bounds = drag.element.getBoundingClientRect();\n          if (bounds.width <= 0 || bounds.height <= 0) return;\n          drag.points = appendAuthorStrokePoint(drag.points, {\n            x: (event.clientX - bounds.left) / bounds.width,\n            y: (event.clientY - bounds.top) / bounds.height,\n          });\n          setStroke(drag.points);\n          return;\n        }\n        if (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 (event.button !== 0) 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        pointers.current.set(event.pointerId, { x: event.clientX, y: event.clientY });\n        if (pointers.current.size === 2) {\n          start.current = undefined;\n          setStroke(undefined);\n          setSelection(undefined);\n          pan.current = undefined;\n          const [a, b] = [...pointers.current.values()];\n          pinch.current = { distance: Math.hypot(a!.x - b!.x, a!.y - b!.y), zoom };\n          event.currentTarget.setPointerCapture(event.pointerId);\n          return;\n        }\n        if (activeTool === 'pan') {\n          const container = host.current;\n          if (container)\n            pan.current = { x: event.clientX, y: event.clientY, left: container.scrollLeft, top: container.scrollTop };\n          event.currentTarget.setPointerCapture(event.pointerId);\n          return;\n        }\n        if ((activeTool !== 'mark' && activeTool !== 'comment' && activeTool !== 'draw') || pendingCandidate) 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        const bounds = element.getBoundingClientRect();\n        start.current = {\n          x: event.clientX,\n          y: event.clientY,\n          pointerId: event.pointerId,\n          mode: activeTool,\n          element,\n          points:\n            activeTool === 'draw'\n              ? [{ x: (event.clientX - bounds.left) / bounds.width, y: (event.clientY - bounds.top) / bounds.height }]\n              : [],\n        };\n        event.currentTarget.setPointerCapture(event.pointerId);\n      }}\n      onPointerUp={(event) => {\n        if (pinch.current === undefined && pan.current === undefined) void mark(event);\n        pointers.current.delete(event.pointerId);\n        pan.current = undefined;\n        if (pointers.current.size < 2) pinch.current = undefined;\n      }}\n      onPointerCancel={(event) => {\n        pointers.current.delete(event.pointerId);\n        pinch.current = undefined;\n        pan.current = undefined;\n        start.current = undefined;\n        setStroke(undefined);\n        setSelection(undefined);\n      }}\n      onLostPointerCapture={() => {\n        start.current = undefined;\n        pan.current = undefined;\n        setStroke(undefined);\n      }}\n    >\n      <div\n        className=\"sticky top-0 z-20 mb-2 flex items-center gap-2 bg-doom-bg py-1\"\n        role=\"group\"\n        aria-label=\"Canvas zoom\"\n      >\n        <Button\n          size=\"md\"\n          variant=\"outline\"\n          aria-label=\"Zoom out\"\n          className=\"min-h-11 min-w-11\"\n          onClick={() => setZoom((current) => Math.max(1, current / 1.5))}\n        >\n          −\n        </Button>\n        <output className=\"text-sm text-doom-dim\">{Math.round(zoom * 100)}%</output>\n        <Button\n          size=\"md\"\n          variant=\"outline\"\n          aria-label=\"Zoom in\"\n          className=\"min-h-11 min-w-11\"\n          onClick={() => setZoom((current) => Math.min(8, current * 1.5))}\n        >\n          +\n        </Button>\n        <Button\n          size=\"md\"\n          variant=\"outline\"\n          aria-label=\"Fit canvas\"\n          className=\"min-h-11\"\n          onClick={() => {\n            setZoom(1);\n            if (host.current) {\n              host.current.scrollLeft = 0;\n              host.current.scrollTop = 0;\n            }\n          }}\n        >\n          Fit\n        </Button>\n      </div>\n      {mediaUrl === undefined ? (\n        <p className=\"text-doom-dim\">{error === undefined ? 'Loading media...' : 'Media unavailable.'}</p>\n      ) : source.kind === 'image' ? (\n        <div\n          className=\"relative inline-block max-w-full\"\n          style={{ zoom, touchAction: activeTool === 'select' ? 'auto' : 'none' }}\n        >\n          <img ref={image} src={mediaUrl} alt={source.path} draggable={false} className=\"block max-w-full\" />\n          {selectionOverlay}\n          {pointSelectionOverlay}\n          {strokeOverlay(stroke)}\n          {displayedRegions.flatMap(({ ordinal, region }) => {\n            if (region.stroke !== undefined)\n              return [\n                <div key={region.id} className=\"pointer-events-none absolute inset-0\">\n                  {strokeOverlay(region.stroke, ordinal)}\n                  {pointPin(ordinal, region.stroke[0]!, `label:${region.id}`)}\n                </div>,\n              ];\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\n          className=\"relative w-fit max-w-full\"\n          style={{ zoom, touchAction: activeTool === 'select' ? 'auto' : 'none' }}\n        >\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          <div\n            className=\"pointer-events-none absolute\"\n            style={\n              source.kind === 'pdf'\n                ? pdfPlane === undefined\n                  ? { display: 'none' }\n                  : { left: pdfPlane.left, top: pdfPlane.top, width: pdfPlane.width, height: pdfPlane.height }\n                : { inset: 0 }\n            }\n          >\n            {selectionOverlay}\n            {pointSelectionOverlay}\n            {strokeOverlay(stroke)}\n            {displayedRegions.map(({ ordinal, region }) => {\n              if (region.stroke !== undefined) {\n                const anchor = region.anchor;\n                if (\n                  source.kind === 'pdf' &&\n                  (anchor.kind !== 'pdf-page-rect' || anchor.page !== pdf.current?.getState().page)\n                )\n                  return null;\n                if (\n                  source.kind === 'video' &&\n                  (anchor.kind !== 'video-time-rect' ||\n                    playback.playing ||\n                    Math.abs(anchor.timeSeconds - playback.currentTime) > 0.1)\n                )\n                  return null;\n                return (\n                  <div key={region.id} className=\"pointer-events-none absolute inset-0\">\n                    {strokeOverlay(region.stroke, ordinal)}\n                    {pointPin(ordinal, region.stroke[0]!, `label:${region.id}`)}\n                  </div>\n                );\n              }\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        </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, source.path, '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, source.path, '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, document.path, {\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, document.path, {\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, useState } from 'react';\n\nimport { api } from '../../../../../../generated/client';\nimport {\n  authorPreviewActionSlot,\n  type AuthorPreviewActionSource,\n  type AuthorPreviewDisplayedAnnotation,\n  type AuthorOpenSourceAction,\n} from '../../../../../types/authorPreview';\nimport { dropAuthorViewportSession, focusAuthorViewport, openAuthorCanvas } from '../_lib/authorBrowserBridge';\nimport { canvasAliases, canvasFailures, canvasPaths } from '../_lib/authorCanvasState';\nimport { authorDocumentContextContent } from '../_lib/authorCapture';\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  setAuthorPreviewSelection,\n  setAuthorRegionCandidate,\n  setAuthorStoryPreview,\n  setAuthorToolMode,\n  authorDocumentAnnotations,\n  type AuthorDocumentAnnotationCollection,\n} from '../_lib/authorWorkspaceStore';\nimport { AuthorFeedbackControls } from '../dock/_components/AuthorFeedbackControls';\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  alias?: string;\n}\n\nconst pendingCanvases = new Map<string, AbortController>();\nconst canvasOwners = new Map<string, Set<string>>();\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\n/** Unsent annotations only. Sent ones live in the request log, not on the canvas. */\nexport function displayedAuthorRegions(\n  workspace: Pick<AuthorDocumentAnnotationCollection, 'annotations'> | undefined,\n): readonly AuthorDisplayedRegion[] {\n  return (workspace?.annotations ?? []).map((region, index) => ({ ordinal: index + 1, region }));\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 { sessionId, statuses } = props;\n  const path = useStore(canvasPaths, (state) =>\n    sessionId === null ? props.path : (state[authorDocumentKey(sessionId, props.path)] ?? props.path),\n  );\n  const alias = useStore(\n    canvasAliases,\n    (state) => props.alias ?? (sessionId === null ? undefined : state[authorDocumentKey(sessionId, props.path)]),\n  );\n  const loadFailure = useStore(canvasFailures, (state) =>\n    sessionId === null ? undefined : state[authorDocumentKey(sessionId, props.path)],\n  );\n  const document = useStore(authorWorkspace.store, (state) =>\n    sessionId === null ? undefined : state.documents[authorDocumentKey(sessionId, path)],\n  );\n  const workspace = useStore(authorWorkspace.store, (state) =>\n    sessionId === null ? undefined : state.sessions[sessionId],\n  );\n  const drafts = useStore(authorWorkspace.store, (state) => authorDocumentAnnotations(sessionId, path, state));\n  const activeTool = workspace?.toolsByDocument[normalizeAuthorPath(path)] ?? 'select';\n  const [markdownPreview, setMarkdownPreview] = useState(true);\n  const [status, setStatus] = useState<string | undefined>();\n  const previewSelection =\n    workspace?.previewSelections?.[normalizeAuthorPath(props.path)] ??\n    workspace?.previewSelections?.[normalizeAuthorPath(path)];\n  const [previewOpen, setPreviewOpen] = useState(previewSelection !== undefined);\n  useEffect(() => {\n    if (previewSelection !== undefined) setPreviewOpen(true);\n  }, [previewSelection]);\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          ...(previewSelection === undefined ? {} : { preview: previewSelection }),\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 (sessionId === null) return;\n    const generation = focusAuthorDocument(sessionId, path);\n    return () => releaseAuthorDocumentFocus(sessionId, generation);\n  }, [path, sessionId]);\n  useEffect(() => {\n    if (kind === undefined || sessionId === null || alias === undefined) return;\n    const profiles = authorProfilesForDocument(sessionId, path, kind);\n    let release: (() => void) | undefined;\n    let cancelled = false;\n    void focusAuthorViewport(sessionId, profiles, alias).then((nextRelease) => {\n      if (cancelled) nextRelease();\n      else release = nextRelease;\n    });\n    return () => {\n      cancelled = true;\n      release?.();\n    };\n  }, [alias, kind, path, sessionId]);\n  if (document === undefined || sessionId === null) {\n    return <p className=\"p-4 text-sm text-doom-faint\">{loadFailure ?? 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(drafts);\n  const displayedPreviewAnnotations: readonly AuthorPreviewDisplayedAnnotation[] =\n    displayedRegions.flatMap<AuthorPreviewDisplayedAnnotation>(({ ordinal, region }) => {\n      if (region.anchor.kind === 'story-preview-rect') {\n        return [\n          {\n            ordinal,\n            mode: 'region' as const,\n            point: region.anchor.rect,\n            rect: region.anchor.rect,\n            stroke: region.stroke,\n          },\n        ];\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={drafts.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\">\n          {alias === undefined ? '' : `${alias} · `}\n          {document.title ?? document.path}\n        </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      {['image', 'pdf', 'video', 'story-preview'].includes(document.kind) ? (\n        <nav\n          aria-label=\"Author canvas tools\"\n          className=\"flex shrink-0 gap-1 overflow-x-auto border-b border-doom-border px-2 py-1 sm:hidden\"\n        >\n          {(['select', 'pan', 'mark', 'comment', 'draw'] as const).map((mode) => (\n            <Button\n              key={mode}\n              size=\"xs\"\n              variant={activeTool === mode ? 'primary' : 'outline'}\n              className=\"min-h-11 min-w-11 shrink-0\"\n              aria-label={`${mode} tool`}\n              aria-pressed={activeTool === mode}\n              onClick={() => setAuthorToolMode(sessionId, document.path, mode)}\n            >\n              {mode}\n            </Button>\n          ))}\n        </nav>\n      ) : null}\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={drafts.candidate !== undefined}\n            onAnnotationCandidate={(candidate) => {\n              setAuthorStoryPreview(sessionId, document.path, candidate.preview);\n              setAuthorRegionCandidate(sessionId, document.path, {\n                documentPath: document.path,\n                revision: document.version,\n                sourceSha256: document.sourceSha256,\n                mode: candidate.mode,\n                stroke: candidate.stroke,\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      {['image', 'pdf', 'video', 'story-preview'].includes(document.kind) ? (\n        <div className=\"max-h-56 shrink-0 overflow-y-auto border-t border-doom-border p-2 sm:hidden\">\n          <AuthorFeedbackControls\n            sessionId={sessionId}\n            document={document}\n            drafts={drafts}\n            submitCapture={props.submitCapture}\n          />\n        </div>\n      ) : null}\n    </section>\n  );\n}\n\nexport const authorOpenSourceAction: AuthorOpenSourceAction = {\n  version: 1,\n  createTab({ sessionId, path, preview }) {\n    const normalized = normalizeAuthorPath(path);\n    if (\n      sessionId.trim() === '' ||\n      normalized === '' ||\n      path.startsWith('/') ||\n      /^[A-Za-z]:/.test(path) ||\n      path.replaceAll('\\\\', '/').split('/').includes('..')\n    )\n      throw new Error('Author source opening requires a session and a repository-relative path.');\n    if (\n      preview !== undefined &&\n      (typeof preview.appPath !== 'string' ||\n        preview.appPath.trim() === '' ||\n        typeof preview.storyExport !== 'string' ||\n        !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(preview.storyExport) ||\n        (preview.snapshot !== undefined && typeof preview.snapshot !== 'boolean'))\n    )\n      throw new Error('Author preview requires a project and an exact story export.');\n    const canonical = canvasPaths.state[authorDocumentKey(sessionId, normalized)] ?? normalized;\n    const prefix = `${sessionId}\\n`;\n    const ownerKey = Object.entries(canvasPaths.state).find(\n      ([key, path]) => key.startsWith(prefix) && path === canonical,\n    )?.[0];\n    const tabPath = ownerKey?.slice(prefix.length) ?? normalized;\n    setAuthorPreviewSelection(sessionId, tabPath, preview);\n    if (canonical !== tabPath) setAuthorPreviewSelection(sessionId, canonical, preview);\n    return authorFileTab(tabPath, canvasAliases.state[authorDocumentKey(sessionId, tabPath)]);\n  },\n};\n\nexport function authorFileTab(path: string, preferredAlias?: string): TransientTab {\n  const normalized = normalizeAuthorPath(path);\n  return {\n    id: tabId(normalized),\n    label:\n      preferredAlias === undefined\n        ? (normalized.split('/').at(-1) ?? normalized)\n        : `${preferredAlias} · ${normalized.split('/').at(-1) ?? normalized}`,\n    retainComposer: true,\n    composerContext(sessionId) {\n      const key = authorDocumentKey(sessionId, normalized);\n      const documentPath = canvasPaths.state[key] ?? normalized;\n      // Server-confirmed alias only: the alias asked for at open can name the wrong canvas when the file was already open.\n      const alias = canvasAliases.state[key];\n      const name = documentPath.split('/').at(-1) ?? documentPath;\n      return {\n        kind: 'author-document',\n        source: 'author',\n        id: documentPath,\n        label: alias === undefined ? name : `${alias} · ${name}`,\n        content: authorDocumentContextContent(\n          documentPath,\n          alias,\n          authorDocumentAnnotations(sessionId, documentPath).annotations,\n        ),\n      };\n    },\n    onOpen(sessionId) {\n      const key = authorDocumentKey(sessionId, normalized);\n      const controller = new AbortController();\n      pendingCanvases.set(key, controller);\n      canvasFailures.setState((state) => {\n        const next = { ...state };\n        delete next[key];\n        return next;\n      });\n      void (async () => {\n        const result = await api.session(sessionId).documentsOpen({\n          body: { path: normalized, ...(preferredAlias === undefined ? {} : { alias: preferredAlias }) },\n          query: { session: sessionId },\n          signal: controller.signal,\n        });\n        if (!result.ok) throw new Error(result.error);\n        if (!('alias' in result.data) || typeof result.data.alias !== 'string')\n          throw new Error('The Author canvas did not return an alias. Reopen the document.');\n        const opened = result.data;\n        const canonicalAlias = opened.alias!;\n        if (controller.signal.aborted || pendingCanvases.get(key) !== controller) {\n          if ((canvasOwners.get(`${sessionId}\\n${canonicalAlias}`)?.size ?? 0) === 0)\n            void api\n              .session(sessionId)\n              .bridgeClose({ body: { alias: canonicalAlias } })\n              .catch(() => undefined);\n          return;\n        }\n        canvasAliases.setState((state) => ({\n          ...state,\n          [key]: canonicalAlias,\n          [authorDocumentKey(sessionId, opened.path)]: canonicalAlias,\n        }));\n        canvasPaths.setState((state) => ({ ...state, [key]: opened.path }));\n        const ownerKey = `${sessionId}\\n${canonicalAlias}`;\n        const owners = canvasOwners.get(ownerKey) ?? new Set<string>();\n        owners.add(key);\n        canvasOwners.set(ownerKey, owners);\n        const documentKey = authorDocumentKey(sessionId, opened.path);\n        if (authorWorkspace.store.state.documents[documentKey] === undefined) {\n          const loaded = await loadAuthorDocument(sessionId, opened.path, controller.signal);\n          if (controller.signal.aborted || pendingCanvases.get(key) !== controller) return;\n          putAuthorDocument(sessionId, loaded);\n        }\n        const document = authorWorkspace.store.state.documents[documentKey];\n        if (document !== undefined && !controller.signal.aborted)\n          await openAuthorCanvas(\n            sessionId,\n            canonicalAlias,\n            authorProfilesForDocument(sessionId, opened.path, document.kind),\n          );\n      })()\n        .catch((error: unknown) => {\n          if (!controller.signal.aborted)\n            canvasFailures.setState((state) => ({\n              ...state,\n              [key]: error instanceof Error ? error.message : String(error),\n            }));\n        })\n        .finally(() => {\n          if (pendingCanvases.get(key) === controller) pendingCanvases.delete(key);\n        });\n    },\n    onClose(sessionId) {\n      const key = authorDocumentKey(sessionId, normalized);\n      const canonical = canvasPaths.state[key] ?? normalized;\n      setAuthorToolMode(sessionId, canonical, 'select');\n      setAuthorPreviewSelection(sessionId, normalized, undefined);\n      if (canonical !== normalized) setAuthorPreviewSelection(sessionId, canonical, undefined);\n      pendingCanvases.get(key)?.abort();\n      pendingCanvases.delete(key);\n      const alias = canvasAliases.state[key] ?? preferredAlias;\n      if (alias === undefined) {\n        // Opening may have reached the server before the browser aborted its response.\n        void api\n          .session(sessionId)\n          .documentsOpen({ body: { path: normalized }, query: { session: sessionId } })\n          .then((result) => {\n            if (!result.ok || !('alias' in result.data) || typeof result.data.alias !== 'string') return;\n            const recoveredAlias = result.data.alias;\n            if ((canvasOwners.get(`${sessionId}\\n${recoveredAlias}`)?.size ?? 0) === 0)\n              void api\n                .session(sessionId)\n                .bridgeClose({ body: { alias: recoveredAlias } })\n                .catch(() => undefined);\n          })\n          .catch(() => undefined);\n        return;\n      }\n      const owners = canvasOwners.get(`${sessionId}\\n${alias}`);\n      owners?.delete(key);\n      if (owners !== undefined && owners.size === 0) canvasOwners.delete(`${sessionId}\\n${alias}`);\n      const lastOwner = owners === undefined || owners.size === 0;\n      if (lastOwner) dropAuthorViewportSession(sessionId, alias);\n      canvasAliases.setState((state) => {\n        const next = { ...state };\n        delete next[key];\n        return next;\n      });\n      canvasPaths.setState((state) => {\n        const next = { ...state };\n        delete next[key];\n        return next;\n      });\n      canvasFailures.setState((state) => {\n        const next = { ...state };\n        delete next[key];\n        return next;\n      });\n      if (lastOwner)\n        void api\n          .session(sessionId)\n          .bridgeClose({ body: { alias } })\n          .catch(() => undefined);\n    },\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, canvasAliases.state[authorDocumentKey(sessionId, normalized)]);\n  },\n  openPath(sessionId, path) {\n    if (sessionId === null) return undefined;\n    const normalized = normalizeAuthorPath(path);\n    return normalized === ''\n      ? undefined\n      : authorFileTab(normalized, canvasAliases.state[authorDocumentKey(sessionId, 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 { defineFill } from '@agimon-ai/doompi-core/web';\n\nimport { authorOpenSourceAction } from '../_components/AuthorDocumentPanel';\n\nexport default defineFill({\n  slot: 'author.open-source',\n  id: 'author',\n  data: authorOpenSourceAction,\n});\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 { validAuthorStroke } from './authorRegions';\nimport 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) &&\n    object(value) &&\n    finite(value.width) &&\n    finite(value.height) &&\n    value.width > 0 &&\n    value.height > 0 &&\n    finite(value.x) &&\n    finite(value.y) &&\n    value.x + value.width <= 1 &&\n    value.y + value.height <= 1\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    (value.stroke === undefined ||\n      (validAuthorStroke(value.stroke) && 'rect' in value.anchor && value.mode === 'region')) &&\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 {\n    ...durable,\n    ...(candidate.stroke === undefined ? {} : { stroke: candidate.stroke.map((point) => ({ ...point })) }),\n  } 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 { validAuthorStroke } from '../../_lib/authorRegions';\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      value.regions.length > 16 ||\n      value.regions.some(\n        (region) =>\n          region.stroke !== undefined &&\n          (!validAuthorStroke(region.stroke) || region.mode !== 'region' || !('rect' in region.anchor)),\n      )\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      ...(region.stroke === undefined ? {} : { stroke: region.stroke.map((point) => ({ ...point })) }),\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, packet.document.path, region.id, region.version ?? 1);\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 { parseAuthorOpenSourceAction } from '../../../../../types/authorPreview';\n\nexport default defineSlotFile({\n  slot: 'author.open-source',\n  parse: parseAuthorOpenSourceAction,\n});\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  alias?: string,\n): void {\n  const tab = authorFileTab(path, alias);\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  const alias =\n    typeof result?.details === 'object' &&\n    result.details !== null &&\n    'alias' in result.details &&\n    typeof result.details.alias === 'string'\n      ? result.details.alias\n      : undefined;\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              {alias === undefined ? requestedPath : `${alias} · ${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, alias)}\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    const details = result?.details as { alias?: unknown } | undefined;\n    return path === undefined\n      ? undefined\n      : authorFileTab(path, typeof details?.alias === 'string' ? details.alias : undefined);\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 fillAuthor from '../src/extensions/workspaces/sessions/(frontend)/fill/Author.author.open-source.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 slotOpenSource from '../src/extensions/workspaces/sessions/(frontend)/slot/open-source.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 fills(): WebPluginContributions['fills'] { return [via({ slot: 'author.open-source', id: 'author' }, fillAuthor)]; },\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.open-source' }, slotOpenSource), 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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"}