{"version":3,"file":"index.cjs","sources":["../src/artifact/contracts.ts","../src/chart/index.ts","../src/http.ts","../src/state/presentation.ts","../src/state/index.ts","../src/orchestrator/index.ts","../src/knowledge/index.ts","../src/transport/v2/reduce.ts"],"sourcesContent":["/**\r\n * Artifact workbench contracts (public, browser-safe).\r\n *\r\n * Field shapes mirror `docs/2026-08-28-sidebar-artifact-workbench/02-contract-storage-api.md`\r\n * §2/§7. Pure TypeScript, zero dependencies, shared by reducer/store/viewers.\r\n */\r\n\r\n/** Delivery kinds surfaced by the artifact workbench. */\r\nexport type PublicArtifactKind =\r\n  | 'presentation'\r\n  | 'document'\r\n  | 'spreadsheet'\r\n  | 'image'\r\n  | 'text'\r\n  | 'code'\r\n  | 'data'\r\n  | 'archive'\r\n  | 'unknown'\r\n\r\n/** Artifact lifecycle statuses (02 §2). */\r\nexport type PublicArtifactStatus =\r\n  | 'queued'\r\n  | 'generating'\r\n  | 'validating'\r\n  | 'previewing'\r\n  | 'ready'\r\n  | 'failed'\r\n  | 'cancelled'\r\n  | 'expired'\r\n\r\nexport type PublicArtifactProgressStatus = Extract<\r\n  PublicArtifactStatus,\r\n  'queued' | 'generating' | 'validating' | 'previewing'\r\n>\r\n\r\nexport type PublicArtifactTerminalStatus = Extract<\r\n  PublicArtifactStatus,\r\n  'ready' | 'failed' | 'cancelled' | 'expired'\r\n>\r\n\r\n/** Minimal public projection of one immutable artifact version (02 §2). */\r\nexport interface PublicArtifactRef {\r\n  schemaVersion: '1'\r\n  artifactId: string\r\n  artifactFamilyId?: string\r\n  revision?: number\r\n  kind: PublicArtifactKind\r\n  format: string\r\n  status: PublicArtifactStatus\r\n  displayName: string\r\n  mimeType?: string\r\n  size?: number\r\n  checksum?: string\r\n  originMessageId?: string\r\n  deliveryGroupId?: string\r\n  supersedesArtifactId?: string\r\n  preview: {\n    strategy: 'pages' | 'image' | 'markdown' | 'text' | 'table' | 'none'\n    pageCount?: number\n    state?: 'pending' | 'ready' | 'failed' | 'unavailable'\n    failure?: { code: string; safeMessage: string }\n  }\r\n  capabilities: Array<'preview' | 'download' | 'revise'>\r\n  createdAt: string\r\n  expiresAt: string\r\n}\r\n\r\n/**\r\n * Page preview manifest served by `GET .../artifacts/{id}/preview` (02 §7).\r\n * `defaultPage` is 1-based and must sit within [1, pageCount].\r\n */\r\nexport interface PagePreviewManifest {\r\n  schemaVersion: '1'\r\n  artifactId: string\r\n  revision: number\r\n  pageCount: number\r\n  defaultPage: number\r\n  pages: Array<{\r\n    page: number\r\n    width: number\r\n    height: number\r\n    checksum: string\r\n    thumbnailAvailable: boolean\r\n  }>\r\n}\r\n\r\n/** Cursor-page list result of `GET .../artifacts` (02 §5). */\r\nexport interface ArtifactListResult {\r\n  refs: PublicArtifactRef[]\r\n  nextCursor?: string\r\n}\r\n\r\n/** Bounded UTF-8 hydration returned by the managed artifact content route. */\r\nexport interface BoundedArtifactContent {\r\n  schemaVersion: '1'\r\n  artifactId: string\r\n  revision: number\r\n  format: string\r\n  mimeType: string\r\n  content: string\r\n}\r\n\r\nconst STATUS_PHASE: Readonly<Record<PublicArtifactStatus, number>> = {\r\n  queued: 10,\r\n  generating: 20,\r\n  validating: 30,\r\n  previewing: 40,\r\n  ready: 50,\r\n  failed: 60,\r\n  cancelled: 70,\r\n  expired: 80,\r\n}\r\n\r\n/** True once an artifact reached a state that never regresses. */\r\nexport function isArtifactTerminal(status: PublicArtifactStatus): boolean {\r\n  return STATUS_PHASE[status] >= STATUS_PHASE.ready\r\n}\r\n\r\n/** True when the manifest grants preview and the ref is usable. */\r\nexport function isArtifactPreviewable(ref: PublicArtifactRef): boolean {\r\n  return ref.status === 'ready' && ref.capabilities.includes('preview')\r\n}\r\n\r\n/** A verified original may be downloaded while its preview is still building. */\nexport function isArtifactDownloadable(ref: PublicArtifactRef): boolean {\n  return (ref.status === 'ready' || ref.status === 'previewing') && ref.capabilities.includes('download')\n}\r\n\r\n/**\r\n * Viewer strategy for a ref. A declared `preview.strategy` wins when it is\r\n * meaningful; otherwise the format whitelist decides (02 §6.1). Unknown\r\n * formats degrade to `none` (metadata + download only).\r\n */\r\nexport function resolvePreviewStrategy(\r\n  ref: PublicArtifactRef,\r\n): PublicArtifactRef['preview']['strategy'] {\n  if (ref.preview?.state === 'pending' || ref.preview?.state === 'failed') return 'none'\n  const declared = ref.preview?.strategy\r\n  if (declared && declared !== 'none') return declared\r\n  const format = (ref.format || '').toLowerCase()\r\n  if (format === 'markdown' || format === 'md') return 'markdown'\r\n  if (format === 'txt' || format === 'text' || format === 'js' || format === 'json') return 'text'\r\n  if (format === 'png' || format === 'jpeg' || format === 'jpg' || format === 'webp') return 'image'\r\n  if (format === 'xlsx') return 'table'\r\n  return 'none'\r\n}\r\n\r\n/** Numeric revision comparison for family/revision UI (Phase 3). */\r\nexport function compareRevision(a: PublicArtifactRef, b: PublicArtifactRef): number {\r\n  const left = typeof a.revision === 'number' ? a.revision : 0\r\n  const right = typeof b.revision === 'number' ? b.revision : 0\r\n  return left - right\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\r\n  return typeof value === 'object' && value !== null && !Array.isArray(value)\r\n}\r\n\r\nconst PUBLIC_KINDS = [\r\n  'presentation',\r\n  'document',\r\n  'spreadsheet',\r\n  'image',\r\n  'text',\r\n  'code',\r\n  'data',\r\n  'archive',\r\n  'unknown',\r\n] as const\r\n\r\nconst PUBLIC_STATUSES = [\r\n  'queued',\r\n  'generating',\r\n  'validating',\r\n  'previewing',\r\n  'ready',\r\n  'failed',\r\n  'cancelled',\r\n  'expired',\r\n] as const\r\n\r\nconst PREVIEW_STRATEGIES = ['pages', 'image', 'markdown', 'text', 'table', 'none'] as const\r\n\r\nconst CAPABILITIES = ['preview', 'download', 'revise'] as const\r\n\r\n/**\r\n * Runtime coercion for untrusted attachment payloads (stream/history/list).\r\n * Returns a typed ref, or null when the payload violates the contract.\r\n * Callers MUST skip+warn, never throw, on invalid entries (06 spec §3.3).\r\n */\r\nexport function coerceArtifactRef(value: unknown): PublicArtifactRef | null {\r\n  if (!isPlainObject(value)) return null\r\n  const id = value.artifactId\r\n  if (typeof id !== 'string' || !id.trim()) return null\r\n  const kind = value.kind\r\n  if (typeof kind !== 'string' || !(PUBLIC_KINDS as readonly string[]).includes(kind)) return null\r\n  const status = value.status\r\n  if (typeof status !== 'string' || !(PUBLIC_STATUSES as readonly string[]).includes(status)) return null\r\n  const displayName = typeof value.displayName === 'string' && value.displayName.trim()\r\n    ? value.displayName.trim()\r\n    : id\r\n  const preview = isPlainObject(value.preview)\r\n    ? {\r\n        strategy: PREVIEW_STRATEGIES.includes(value.preview.strategy as never)\r\n          ? (value.preview.strategy as PublicArtifactRef['preview']['strategy'])\r\n          : ('none' as const),\r\n        ...(typeof value.preview.pageCount === 'number' && Number.isFinite(value.preview.pageCount)\r\n          ? { pageCount: Math.max(0, Math.floor(value.preview.pageCount)) }\r\n          : {}),\r\n      }\r\n    : ({ strategy: 'none' } as PublicArtifactRef['preview'])\r\n  const capabilities = Array.isArray(value.capabilities)\r\n    ? value.capabilities.filter((item): item is PublicArtifactRef['capabilities'][number] =>\r\n        typeof item === 'string' && (CAPABILITIES as readonly string[]).includes(item))\r\n    : []\r\n  if (isPlainObject(value.preview)) {\n    if (['pending', 'ready', 'failed', 'unavailable'].includes(String(value.preview.state))) {\n      (preview as PublicArtifactRef['preview']).state = value.preview.state as NonNullable<PublicArtifactRef['preview']['state']>\n    }\n    if (value.preview.state === 'failed' && isPlainObject(value.preview.failure)\n      && typeof value.preview.failure.code === 'string' && typeof value.preview.failure.safeMessage === 'string') {\n      (preview as PublicArtifactRef['preview']).failure = {\n        code: value.preview.failure.code.slice(0, 128), safeMessage: value.preview.failure.safeMessage.slice(0, 512),\n      }\n    }\n  }\n  const ref: PublicArtifactRef = {\n    schemaVersion: '1',\r\n    artifactId: id,\r\n    kind: kind as PublicArtifactKind,\r\n    format: typeof value.format === 'string' && value.format ? value.format : 'unknown',\r\n    status: status as PublicArtifactStatus,\r\n    displayName,\r\n    preview,\r\n    capabilities,\r\n    createdAt: typeof value.createdAt === 'string' ? value.createdAt : new Date(0).toISOString(),\r\n    expiresAt: typeof value.expiresAt === 'string' ? value.expiresAt : '',\r\n  }\r\n  if (typeof value.artifactFamilyId === 'string') ref.artifactFamilyId = value.artifactFamilyId\r\n  if (typeof value.revision === 'number' && Number.isFinite(value.revision)) {\r\n    ref.revision = Math.max(0, Math.floor(value.revision))\r\n  }\r\n  if (typeof value.mimeType === 'string') ref.mimeType = value.mimeType\r\n  if (typeof value.size === 'number' && Number.isFinite(value.size)) ref.size = value.size\r\n  if (typeof value.checksum === 'string') ref.checksum = value.checksum\r\n  if (typeof value.originMessageId === 'string' && value.originMessageId) {\r\n    ref.originMessageId = value.originMessageId\r\n  }\r\n  if (typeof value.deliveryGroupId === 'string') ref.deliveryGroupId = value.deliveryGroupId\r\n  if (typeof value.supersedesArtifactId === 'string') ref.supersedesArtifactId = value.supersedesArtifactId\r\n  return ref\r\n}\r\n\r\n/** Runtime coercion for the preview manifest; null on contract violation. */\r\nexport function coercePagePreviewManifest(value: unknown): PagePreviewManifest | null {\r\n  if (!isPlainObject(value)) return null\r\n  const artifactId = value.artifactId\r\n  if (typeof artifactId !== 'string' || !artifactId.trim()) return null\r\n  const pageCount = value.pageCount\r\n  if (typeof pageCount !== 'number' || !Number.isFinite(pageCount) || pageCount <= 0) return null\r\n  const pages = Array.isArray(value.pages) ? value.pages : []\r\n  const coercedPages = pages.flatMap((entry, index) => {\r\n    if (!isPlainObject(entry)) return []\r\n    const pageNumber = typeof entry.page === 'number' && Number.isFinite(entry.page)\r\n      ? Math.floor(entry.page)\r\n      : index + 1\r\n    return [{\r\n      page: pageNumber,\r\n      width: typeof entry.width === 'number' ? entry.width : 0,\r\n      height: typeof entry.height === 'number' ? entry.height : 0,\r\n      checksum: typeof entry.checksum === 'string' ? entry.checksum : '',\r\n      thumbnailAvailable: entry.thumbnailAvailable === true,\r\n    }]\r\n  })\r\n  if (!coercedPages.length) return null\r\n  return {\r\n    schemaVersion: '1',\r\n    artifactId,\r\n    revision: typeof value.revision === 'number' ? value.revision : 1,\r\n    pageCount,\r\n    defaultPage: typeof value.defaultPage === 'number' && value.defaultPage >= 1\r\n      ? Math.floor(value.defaultPage)\r\n      : 1,\r\n    pages: coercedPages,\r\n  }\r\n}\r\n\r\n/** Extract browser-safe text from the canonical backend payload (and legacy fixtures). */\r\nexport function artifactTextContent(value: unknown): string {\r\n  if (typeof value === 'string') return value\r\n  if (!isPlainObject(value)) return ''\r\n  if (typeof value.content === 'string') return value.content\r\n  return typeof value.text === 'string' ? value.text : ''\r\n}\r\n","import type { ChartConfig } from '../protocol/types'\r\nimport type { ChartKind, ChartSpec, ColumnDef, Row } from '../protocol/v2/cards'\r\n\r\nexport type ChartValue = string | number | boolean\r\n\r\nexport interface ChartTableProjection {\r\n  columns: ColumnDef[]\r\n  rows: Row[]\r\n  total: number\r\n}\r\n\r\nexport interface CartesianSeries {\r\n  name: string\r\n  values: Array<number | null>\r\n  /** Dual-axis only: which y-scale this series is drawn against. */\r\n  axis?: 0 | 1\r\n}\r\n\r\nexport interface ScatterSeries {\r\n  name: string\r\n  points: Array<[number, number]>\r\n}\r\n\r\nexport type ClosedChartData =\r\n  | {\r\n      kind: 'radar'\r\n      datasetRef: string\r\n      indicators: Array<{ name: string; max: number }>\r\n      series: Array<{ name: string; values: number[] }>\r\n    }\r\n  | {\r\n      kind: 'cartesian'\r\n      datasetRef: string\r\n      categories: ChartValue[]\r\n      series: CartesianSeries[]\r\n      mode: 'standard' | 'grouped' | 'stacked'\r\n      area: boolean\r\n      xName: string\r\n      yNames: string[]\r\n      /** Present only for a dual-axis chart: two y-scales on one plot. */\r\n      axes?: 'dual'\r\n      /** Dual only, left then right. Always non-empty — the renderer never\r\n       * falls back to a raw column id, because an unlabelled scale is exactly\r\n       * what makes a dual-axis chart misread. */\r\n      axisNames?: [string, string]\r\n    }\r\n  | {\r\n      kind: 'scatter'\r\n      datasetRef: string\r\n      series: ScatterSeries[]\r\n      xName: string\r\n      yName: string\r\n    }\r\n  | {\r\n      kind: 'pie'\r\n      datasetRef: string\r\n      items: Array<{ name: ChartValue; value: number }>\r\n      nameField: string\r\n      valueField: string\r\n    }\r\n\r\nexport interface ChartArtifact {\r\n  kind: 'chart'\r\n  datasetRef: string\r\n  chartKind: Exclude<ChartKind, ''>\r\n  title: string\r\n  summary: string\r\n  data: ClosedChartData\r\n  table: ChartTableProjection\r\n}\r\n\r\nexport interface ChartProjectionSuccess {\r\n  ok: true\r\n  artifact: ChartArtifact\r\n  config: ChartConfig\r\n}\r\n\r\nexport interface ChartProjectionFailure {\r\n  ok: false\r\n  reason: string\r\n  table: ChartTableProjection\r\n}\r\n\r\nexport type ChartProjection = ChartProjectionSuccess | ChartProjectionFailure\r\n\r\nconst CHART_TYPE: Record<Exclude<ChartKind, ''>, ChartConfig['type']> = {\r\n  bar: 'bar',\r\n  'grouped-bar': 'bar',\r\n  'stacked-bar': 'bar',\r\n  // Dual-axis draws bars, so it shares the bar renderer and adds the second\r\n  // scale through the closed data (`axes: 'dual'`) rather than through a new\r\n  // v1 config type that every existing chart payload would have to tolerate.\r\n  'dual-axis': 'bar',\r\n  line: 'line',\r\n  area: 'line',\r\n  pie: 'pie',\r\n  scatter: 'scatter',\r\n  radar: 'radar',\r\n}\r\n\r\n/**\r\n * Validate and project the neutral protocol spec without accepting renderer\r\n * options, formatter functions, or HTML. Every plotted value is read directly\r\n * from the same immutable row projection used by the fallback table.\r\n */\r\nexport function projectChartSpec(input: unknown): ChartProjection {\r\n  const fallback = fallbackTable(input)\r\n  if (!isRecord(input)) return failure('图表规格不是对象。', fallback)\r\n  const chartKind = input.chartKind\r\n  if (!isChartKind(chartKind) || chartKind === '') {\r\n    return failure('没有适合当前数据的图表类型。', fallback)\r\n  }\r\n  if (!isRecord(input.encoding)) return failure('图表缺少字段映射。', fallback)\r\n  if (!Array.isArray(input.data) || input.data.length === 0) {\r\n    return failure('图表没有可绘制的数据行。', fallback)\r\n  }\r\n\r\n  const x = input.encoding.x\r\n  const rawY = input.encoding.y\r\n  const seriesKey = input.encoding.series\r\n  const columnLabels = stringMap(input.columnLabels)\r\n  if (typeof x !== 'string' || !x.trim()) return failure('图表缺少维度字段。', fallback)\r\n  if (!Array.isArray(rawY) || rawY.length === 0 || rawY.some(key => typeof key !== 'string' || !key.trim())) {\r\n    return failure('图表至少需要一个度量字段。', fallback)\r\n  }\r\n  const y = rawY as string[]\r\n  if (new Set(y).size !== y.length) return failure('图表度量字段不能重复。', fallback)\r\n  if (y.includes(x)) return failure('维度字段不能同时作为度量字段。', fallback)\r\n  if (seriesKey !== undefined && (typeof seriesKey !== 'string' || !seriesKey.trim())) {\r\n    return failure('系列字段无效。', fallback)\r\n  }\r\n  if (typeof seriesKey === 'string' && (seriesKey === x || y.includes(seriesKey))) {\r\n    return failure('系列字段必须独立于维度和度量字段。', fallback)\r\n  }\r\n  if (chartKind === 'pie' && (y.length !== 1 || seriesKey !== undefined)) {\r\n    return failure('饼图仅支持一个度量且不支持额外系列字段。', fallback)\r\n  }\r\n  let dual: { lineMeasure: string; left: string; right: string } | undefined\r\n  if (chartKind === 'dual-axis') {\r\n    const line = Array.isArray(input.encoding.lineColumns) ? input.encoding.lineColumns : []\r\n    const units = isRecord(input.encoding.axisUnits) ? input.encoding.axisUnits : undefined\r\n    const left = typeof units?.left === 'string' ? units.left.trim() : ''\r\n    const right = typeof units?.right === 'string' ? units.right.trim() : ''\r\n    const measure = line.length === 1 && typeof line[0] === 'string' ? line[0].trim() : ''\r\n    // Both scales must be named and distinct. An unlabelled second axis is what\r\n    // lets a reader attribute a value to the wrong measure, which is the whole\r\n    // hazard of putting two scales on one plot.\r\n    if (!measure || y.includes(measure) || measure === x || seriesKey !== undefined\r\n      || y.length > 2 || !left || !right || left === right) {\r\n      return failure('双轴图需要 1–2 个主轴度量、恰好一个次轴度量，以及两条不同的轴标签；次轴度量不能同时作为主轴度量或系列字段。', fallback)\r\n    }\r\n    dual = { lineMeasure: measure, left, right }\r\n  } else if (input.encoding.lineColumns !== undefined || input.encoding.axisUnits !== undefined) {\r\n    return failure('次轴度量与轴标签仅用于双轴图。', fallback)\r\n  }\r\n\r\n  const rows = normalizeRows(input.data)\r\n  if (!rows) return failure('图表数据行或单元格类型无效。', fallback)\r\n  const table = tableFrom(\r\n    rows, x, y, typeof seriesKey === 'string' ? seriesKey : undefined, columnLabels,\r\n  )\r\n  const datasetRef = typeof input.datasetRef === 'string' && input.datasetRef.trim()\r\n    ? input.datasetRef.trim()\r\n    : 'legacy:inline'\r\n  const title = typeof input.title === 'string' ? input.title : ''\r\n  // The secondary axis of a dual-axis chart is a measure in every respect\r\n  // except which scale it is drawn against, so it joins the measure list once.\r\n  const measures = dual === undefined ? y : [...y, dual.lineMeasure]\r\n\r\n  for (const row of rows) {\r\n    if (!isDimension(row[x])) return failure(`维度字段 ${x} 含有空值或复杂值。`, table)\r\n    if (typeof seriesKey === 'string' && !isDimension(row[seriesKey])) {\r\n      return failure(`系列字段 ${seriesKey} 含有空值或复杂值。`, table)\r\n    }\r\n    for (const measure of measures) {\r\n      if (toFiniteNumber(row[measure]) === null) {\r\n        return failure(`度量字段 ${measure} 必须逐值为有限数值。`, table)\r\n      }\r\n    }\r\n    if (chartKind === 'scatter' && toFiniteNumber(row[x]) === null) {\r\n      return failure(`散点图维度字段 ${x} 必须逐值为有限数值。`, table)\r\n    }\r\n  }\r\n\r\n  // The title is rendered as the card header, so the caption below it starts at\r\n  // the description — repeating the title there reads as a stutter.\r\n  const summary = `按 ${labelOf(x, columnLabels)} 展示 ${measures.map(key => labelOf(key, columnLabels)).join('、')}，共 ${rows.length} 条记录。`\r\n    + (chartKind === 'radar' ? `共同刻度 0–${input.encoding.radarMax}，按原值绘制。` : '')\r\n  let data: ClosedChartData\r\n  if (chartKind === 'radar') {\r\n    const max = input.encoding.radarMax\r\n    if (typeof max !== 'number' || !Number.isFinite(max) || max <= 0\r\n      || y.length < 3 || y.length > 8 || rows.length > 5 || seriesKey !== undefined\r\n      || new Set(rows.map(row => String(row[x]))).size !== rows.length\r\n      || rows.some(row => y.some(key => toFiniteNumber(row[key])! < 0 || toFiniteNumber(row[key])! > max))) {\r\n      return failure('雷达图需要 3–8 个可比指标、最多 5 个不重复对象，以及覆盖全部非负值的明确共同刻度；不自动归一化或填补缺失值。', table)\r\n    }\r\n    data = {\r\n      kind: 'radar', datasetRef,\r\n      indicators: y.map(key => ({ name: labelOf(key, columnLabels), max })),\r\n      series: rows.map(row => ({ name: String(row[x]), values: y.map(key => toFiniteNumber(row[key])!) })),\r\n    }\r\n  } else if (chartKind === 'scatter') {\r\n    data = scatterData(\r\n      rows, x, y, typeof seriesKey === 'string' ? seriesKey : undefined,\r\n      datasetRef, columnLabels,\r\n    )\r\n  } else if (chartKind === 'pie') {\r\n    const values = rows.map(row => toFiniteNumber(row[y[0]!])!)\r\n    if (values.some(value => value < 0) || !values.some(value => value > 0)\r\n      || new Set(rows.map(row => String(row[x]))).size !== rows.length) {\r\n      return failure('饼图需要不重复的类别、非负值及大于零的合计。', table)\r\n    }\r\n    data = {\r\n      kind: 'pie',\r\n      datasetRef,\r\n      nameField: labelOf(x, columnLabels),\r\n      valueField: labelOf(y[0]!, columnLabels),\r\n      items: rows.map(row => ({ name: row[x] as ChartValue, value: toFiniteNumber(row[y[0]!])! })),\r\n    }\r\n  } else {\r\n    const cartesian = cartesianData(\r\n      rows,\r\n      x,\r\n      measures,\r\n      typeof seriesKey === 'string' ? seriesKey : undefined,\r\n      datasetRef,\r\n      chartKind,\r\n      columnLabels,\r\n      dual,\r\n    )\r\n    if (typeof cartesian === 'string') return failure(cartesian, table)\r\n    data = cartesian\r\n  }\r\n\r\n  const artifact: ChartArtifact = {\r\n    kind: 'chart',\r\n    datasetRef,\r\n    chartKind,\r\n    title,\r\n    summary,\r\n    data,\r\n    table,\r\n  }\r\n  return {\r\n    ok: true,\r\n    artifact,\r\n    config: { type: CHART_TYPE[chartKind], title, data: { ...data, summary, table } },\r\n  }\r\n}\r\n\r\n/** Compatibility helper for callers that only consume the legacy config. */\r\nexport function chartSpecToConfig(spec: ChartSpec): ChartConfig | null {\r\n  const projection = projectChartSpec(spec)\r\n  return projection.ok ? projection.config : null\r\n}\r\n\r\nfunction cartesianData(\r\n  rows: Row[],\r\n  x: string,\r\n  measures: string[],\r\n  seriesKey: string | undefined,\r\n  datasetRef: string,\r\n  chartKind: Exclude<ChartKind, '' | 'pie' | 'scatter' | 'radar'>,\r\n  columnLabels: Readonly<Record<string, string>>,\r\n  dual?: { readonly lineMeasure: string; readonly left: string; readonly right: string },\r\n): Extract<ClosedChartData, { kind: 'cartesian' }> | string {\r\n  const categories = uniqueValues(rows.map(row => row[x] as ChartValue))\r\n  const groups = seriesKey ? uniqueValues(rows.map(row => row[seriesKey] as ChartValue)) : []\r\n  const cells = new Map<string, number>()\r\n  for (const row of rows) {\r\n    const category = valueKey(row[x] as ChartValue)\r\n    const group = seriesKey ? valueKey(row[seriesKey] as ChartValue) : ''\r\n    for (const measure of measures) {\r\n      const key = `${category}\\u0000${group}\\u0000${measure}`\r\n      if (cells.has(key)) return `维度 ${x}${seriesKey ? ` 与系列 ${seriesKey}` : ''} 存在重复点。`\r\n      cells.set(key, toFiniteNumber(row[measure])!)\r\n    }\r\n  }\r\n\r\n  const series: CartesianSeries[] = []\r\n  const groupValues = seriesKey ? groups : [null]\r\n  for (const group of groupValues) {\r\n    for (const measure of measures) {\r\n      series.push({\r\n        // A lone measure contributes nothing to a grouped legend entry — the\r\n        // axis summary already names it. Multi-measure charts keep the full\r\n        // \"group · measure\" pair so entries stay unambiguous.\r\n        name: group === null\r\n          ? labelOf(measure, columnLabels)\r\n          : measures.length === 1\r\n            ? String(group)\r\n            : `${String(group)} · ${labelOf(measure, columnLabels)}`,\r\n        ...(dual === undefined ? {} : { axis: measure === dual.lineMeasure ? 1 as const : 0 as const }),\r\n        values: categories.map(category => cells.get(\r\n          `${valueKey(category)}\\u0000${group === null ? '' : valueKey(group)}\\u0000${measure}`,\r\n        ) ?? null),\r\n      })\r\n    }\r\n  }\r\n  return {\r\n    kind: 'cartesian',\r\n    datasetRef,\r\n    categories,\r\n    series,\r\n    mode: chartKind === 'stacked-bar' ? 'stacked' : chartKind === 'grouped-bar' ? 'grouped' : 'standard',\r\n    area: chartKind === 'area',\r\n    xName: labelOf(x, columnLabels),\r\n    yNames: measures.map(measure => labelOf(measure, columnLabels)),\r\n    ...(dual === undefined\r\n      ? {}\r\n      : { axes: 'dual' as const, axisNames: [dual.left, dual.right] as [string, string] }),\r\n  }\r\n}\r\n\r\nfunction scatterData(\r\n  rows: Row[],\r\n  x: string,\r\n  measures: string[],\r\n  seriesKey: string | undefined,\r\n  datasetRef: string,\r\n  columnLabels: Readonly<Record<string, string>>,\r\n): Extract<ClosedChartData, { kind: 'scatter' }> {\r\n  const groups = seriesKey ? uniqueValues(rows.map(row => row[seriesKey] as ChartValue)) : [null]\r\n  const series: ScatterSeries[] = []\r\n  for (const group of groups) {\r\n    const groupRows = group === null\r\n      ? rows\r\n      : rows.filter(row => valueKey(row[seriesKey!] as ChartValue) === valueKey(group))\r\n    for (const measure of measures) {\r\n      series.push({\r\n        // Same lone-measure rule as cartesian series naming above.\r\n        name: group === null\r\n          ? labelOf(measure, columnLabels)\r\n          : measures.length === 1\r\n            ? String(group)\r\n            : `${String(group)} · ${labelOf(measure, columnLabels)}`,\r\n        points: groupRows.map(row => [toFiniteNumber(row[x])!, toFiniteNumber(row[measure])!]),\r\n      })\r\n    }\r\n  }\r\n  return {\r\n    kind: 'scatter', datasetRef, series,\r\n    xName: labelOf(x, columnLabels),\r\n    yName: measures.map(measure => labelOf(measure, columnLabels)).join(' / '),\r\n  }\r\n}\r\n\r\nfunction fallbackTable(input: unknown): ChartTableProjection {\r\n  if (!isRecord(input) || !Array.isArray(input.data)) return { columns: [], rows: [], total: 0 }\r\n  const rows = normalizeRows(input.data) ?? []\r\n  const keys = uniqueValues(rows.flatMap(row => Object.keys(row)))\r\n  const labels = stringMap(input.columnLabels)\r\n  return {\r\n    columns: keys.map(key => ({ key, title: labelOf(key, labels), displayName: labelOf(key, labels) })),\r\n    rows,\r\n    total: rows.length,\r\n  }\r\n}\r\n\r\nfunction tableFrom(\r\n  rows: Row[], x: string, y: string[], series: string | undefined,\r\n  labels: Readonly<Record<string, string>>,\r\n): ChartTableProjection {\r\n  const keys = uniqueValues([x, ...(series ? [series] : []), ...y])\r\n  return {\r\n    columns: keys.map(key => ({\r\n      key,\r\n      title: labelOf(key, labels),\r\n      displayName: labelOf(key, labels),\r\n      role: key === x || key === series ? 'dimension' : 'metric',\r\n    })),\r\n    rows: rows.map(row => Object.fromEntries(keys.map(key => [key, row[key] ?? null])) as Row),\r\n    total: rows.length,\r\n  }\r\n}\r\n\r\nfunction stringMap(value: unknown): Readonly<Record<string, string>> {\r\n  if (!isRecord(value)) return {}\r\n  return Object.fromEntries(Object.entries(value)\r\n    .filter((entry): entry is [string, string] => typeof entry[1] === 'string' && entry[1].trim().length > 0))\r\n}\r\n\r\nfunction labelOf(key: string, labels: Readonly<Record<string, string>>): string {\r\n  return labels[key]?.trim() || key\r\n}\r\n\r\nfunction normalizeRows(values: unknown[]): Row[] | null {\r\n  const rows: Row[] = []\r\n  for (const value of values) {\r\n    if (!isRecord(value)) return null\r\n    const row: Row = {}\r\n    for (const [key, cell] of Object.entries(value)) {\r\n      if (cell !== null && typeof cell !== 'string' && typeof cell !== 'number' && typeof cell !== 'boolean') {\r\n        return null\r\n      }\r\n      row[key] = cell\r\n    }\r\n    rows.push(row)\r\n  }\r\n  return rows\r\n}\r\n\r\nfunction isChartKind(value: unknown): value is ChartKind {\r\n  return value === '' || value === 'bar' || value === 'line' || value === 'pie'\r\n    || value === 'scatter' || value === 'area' || value === 'grouped-bar' || value === 'stacked-bar'\r\n    || value === 'radar' || value === 'dual-axis'\r\n}\r\n\r\nfunction isDimension(value: unknown): value is ChartValue {\r\n  return typeof value === 'string' || typeof value === 'boolean' || isFiniteNumber(value)\r\n}\r\n\r\nfunction isFiniteNumber(value: unknown): value is number {\r\n  return typeof value === 'number' && Number.isFinite(value)\r\n}\r\n\r\n/** JDBC decimal/count values can be serialized as strings to retain precision. */\r\nfunction toFiniteNumber(value: unknown): number | null {\r\n  if (isFiniteNumber(value)) return value\r\n  if (typeof value !== 'string' || value.trim() === '') return null\r\n  if (!/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value.trim())) return null\r\n  const parsed = Number(value)\r\n  return Number.isFinite(parsed) ? parsed : null\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n  return value !== null && typeof value === 'object' && !Array.isArray(value)\r\n}\r\n\r\nfunction uniqueValues<T>(values: T[]): T[] {\r\n  return [...new Map(values.map(value => [valueKey(value), value])).values()]\r\n}\r\n\r\nfunction valueKey(value: unknown): string {\r\n  return `${typeof value}:${String(value)}`\r\n}\r\n\r\nfunction failure(reason: string, table: ChartTableProjection): ChartProjectionFailure {\r\n  return { ok: false, reason, table }\r\n}\r\n","/**\r\n * AI Assistant REST HTTP Client\r\n *\r\n * Zero-dependency HTTP client for communicating with the Frost AI backend.\r\n * Automatically unwraps `Result<T>` responses (`{ code, message, data, traceId }`).\r\n * Designed for the core package with no framework dependency.\r\n */\r\n\r\nimport type {\r\n  AssistantMessage,\r\n  Conversation,\r\n  ModelOption,\r\n} from './protocol/types'\r\nimport type {\r\n  ArtifactListResult,\r\n  BoundedArtifactContent,\r\n  PagePreviewManifest,\r\n  PublicArtifactKind,\r\n  PublicArtifactRef,\r\n  PublicArtifactStatus,\r\n} from './artifact/contracts'\r\n\r\ninterface ApiResult<T> {\r\n  code: number\r\n  message: string\r\n  data: T\r\n  traceId?: string\r\n}\r\n\r\nexport interface PluginConfig {\r\n  systemCode: string\r\n  defaultMode: string\r\n  themeStrategy: string\r\n  themePreset: string\r\n  primaryColor: string\r\n  defaultModelCode: string\r\n  enableFullscreen: boolean\r\n  enableDrawer: boolean\r\n  enableKnowledge: boolean\r\n  rateLimitPerHour: number\r\n}\r\n\r\nexport class AiHttpError extends Error {\r\n  readonly code: number\r\n  readonly traceId?: string\r\n\r\n  constructor(code: number, message: string, traceId?: string) {\r\n    super(message)\r\n    this.name = 'AiHttpError'\r\n    this.code = code\r\n    this.traceId = traceId\r\n  }\r\n}\r\n\r\n/** Server view of one uploaded conversation attachment. */\r\nexport interface UploadedAttachment {\r\n  id: string\r\n  name: string\r\n  contentType: string\r\n  size: number\r\n  /** text | unsupported | failed — whether the backend extracted text. */\r\n  extractStatus: 'extracted' | 'unsupported' | 'failed'\r\n}\r\n\r\n/** Attachment content preview payload. */\r\nexport interface AttachmentContent {\r\n  id: string\r\n  name: string\r\n  contentType: string\r\n  size: number\r\n  extractStatus: string\r\n  /** 提取文本（仅文本类；二进制为 null）。 */\r\n  text: string | null\r\n}\r\n\r\nexport class AiHttpClient {\r\n  private readonly baseUrl: string\r\n  private readonly headersProvider: () => Record<string, string>\r\n\r\n  constructor(baseUrl: string, headersProvider: () => Record<string, string>) {\r\n    this.baseUrl = baseUrl.replace(/\\/+$/, '')\r\n    this.headersProvider = headersProvider\r\n  }\r\n\r\n  async getPluginConfig(systemCode: string): Promise<PluginConfig | null> {\r\n    const raw = await this.request<Record<string, unknown>>(\r\n      'GET',\r\n      `/plugin/config?systemCode=${encodeURIComponent(systemCode)}`,\r\n    ).catch(() => null)\r\n\r\n    if (!raw) {\r\n      return null\r\n    }\r\n\r\n    return {\r\n      systemCode: (raw.systemCode as string) ?? systemCode,\r\n      defaultMode: (raw.defaultMode as string) ?? 'floating',\r\n      themeStrategy: (raw.themeStrategy as string) ?? 'system',\r\n      themePreset: (raw.themePreset as string) ?? 'light',\r\n      primaryColor: (raw.primaryColor as string) ?? '#409EFF',\r\n      defaultModelCode: (raw.defaultModelCode as string) ?? 'default',\r\n      enableFullscreen: Boolean(raw.enableFullscreen ?? true),\r\n      enableDrawer: Boolean(raw.enableDrawer ?? true),\r\n      enableKnowledge: Boolean(raw.enableKnowledge ?? false),\r\n      rateLimitPerHour: Number(raw.rateLimitPerHour ?? 100),\r\n    }\r\n  }\r\n\r\n  async listModels(): Promise<ModelOption[]> {\r\n    const raw = await this.request<Array<Record<string, unknown>>>('GET', '/models')\r\n\r\n    return raw.map((item) => ({\r\n      code: (item.code as string) ?? '',\r\n      name: (item.name as string) ?? '',\r\n      supportStream: Boolean(item.supportStream ?? true),\r\n      supportToolCall: Boolean(item.supportToolCall ?? false),\r\n      bestFor: ((item.bestFor as ModelOption['bestFor']) ?? []).filter(Boolean),\r\n      maxTokens: typeof item.maxTokens === 'number' ? item.maxTokens : undefined,\r\n    })).filter((item) => item.code && item.name)\r\n  }\r\n\r\n  async createConversation(\r\n    systemCode: string,\r\n    title?: string,\r\n    modelCode?: string,\r\n    sceneCode?: string,\r\n  ): Promise<Conversation> {\r\n    return this.request<Conversation>('POST', '/conversations', {\r\n      systemCode,\r\n      title: title ?? 'New conversation',\r\n      modelCode: modelCode ?? 'default',\r\n      sceneCode,\r\n    })\r\n  }\r\n\r\n  async listConversations(\r\n    systemCode: string,\r\n    page = 1,\r\n    size = 20,\r\n  ): Promise<Conversation[]> {\r\n    return this.request<Conversation[]>(\r\n      'GET',\r\n      `/conversations?systemCode=${encodeURIComponent(systemCode)}&page=${page}&size=${size}`,\r\n    )\r\n  }\r\n\r\n  async getMessages(conversationId: string): Promise<AssistantMessage[]> {\r\n    return this.request<AssistantMessage[]>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}/messages`,\r\n    )\r\n  }\r\n\r\n  async deleteConversation(conversationId: string): Promise<void> {\r\n    await this.request<void>(\r\n      'DELETE',\r\n      `/conversations/${encodeURIComponent(conversationId)}`,\r\n    )\r\n  }\r\n\r\n  /**\r\n   * Fork a conversation into a new branch, copying history up to and including\r\n   * `messageId` (or the full history when omitted). Returns the new conversation.\r\n   */\r\n  async forkConversation(conversationId: string, messageId?: string): Promise<Conversation> {\r\n    return this.request<Conversation>(\r\n      'POST',\r\n      `/conversations/${encodeURIComponent(conversationId)}/fork`,\r\n      { messageId: messageId ?? '' },\r\n    )\r\n  }\r\n\r\n  /**\r\n   * Soft-delete messages at (`from`, inclusive) or after (`after`, exclusive) an\r\n   * anchor message. Returns the number of removed rows.\r\n   */\r\n  async truncateMessages(\r\n    conversationId: string,\r\n    messageId: string,\r\n    mode: 'from' | 'after',\r\n  ): Promise<number> {\r\n    return this.request<number>(\r\n      'DELETE',\r\n      `/conversations/${encodeURIComponent(conversationId)}/messages`\r\n        + `?messageId=${encodeURIComponent(messageId)}&mode=${encodeURIComponent(mode)}`,\r\n    )\r\n  }\r\n\r\n  async getSuggestions(systemCode: string, sceneCode?: string): Promise<string[]> {\r\n    let path = `/suggestions?systemCode=${encodeURIComponent(systemCode)}`\r\n    if (sceneCode) {\r\n      path += `&sceneCode=${encodeURIComponent(sceneCode)}`\r\n    }\r\n    return this.request<string[]>('GET', path)\r\n  }\r\n\r\n  async confirmAction(actionId: string, confirm: boolean): Promise<void> {\r\n    await this.request<void>('POST', '/actions/confirm', {\r\n      actionId,\r\n      confirm,\r\n    })\r\n  }\r\n\r\n  async submitFeedback(\r\n    messageId: string,\r\n    rating: number,\r\n    comment?: string,\r\n  ): Promise<void> {\r\n    await this.request<void>('POST', '/feedback', {\r\n      messageId,\r\n      rating,\r\n      comment,\r\n    })\r\n  }\r\n\r\n  /** Explicitly cancel a live DSH turn without conflating it with SSE detach. */\r\n  async cancelChat(conversationId: string, messageId: string): Promise<boolean> {\r\n    return this.request<boolean>('POST', '/v2/chat/cancel', {\r\n      conversationId,\r\n      messageId,\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Artifact workbench JSON APIs (06 spec §3.5). All conversation-scoped per\r\n   * 02-contract-storage-api §5; binary bytes go through fetchArtifactBytes.\r\n   */\r\n  async listArtifacts(\r\n    conversationId: string,\r\n    opts?: { cursor?: string; kind?: PublicArtifactKind; status?: PublicArtifactStatus },\r\n  ): Promise<ArtifactListResult> {\r\n    const params = new URLSearchParams()\r\n    if (opts?.cursor) params.set('cursor', opts.cursor)\r\n    if (opts?.kind) params.set('kind', opts.kind)\r\n    if (opts?.status) params.set('status', opts.status)\r\n    const query = params.toString()\r\n    const suffix = query ? `?${query}` : ''\r\n    return this.request<ArtifactListResult>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}/artifacts${suffix}`,\r\n    )\r\n  }\r\n\r\n  async getArtifact(conversationId: string, artifactId: string): Promise<PublicArtifactRef> {\r\n    return this.request<PublicArtifactRef>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}`,\r\n    )\r\n  }\r\n\r\n  async getPreviewManifest(\r\n    conversationId: string,\r\n    artifactId: string,\r\n  ): Promise<PagePreviewManifest> {\r\n    return this.request<PagePreviewManifest>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}/preview`,\r\n    )\r\n  }\r\n\r\n  /** Bounded content hydration for markdown/text/table viewers. */\r\n  async getArtifactContent(\r\n    conversationId: string,\r\n    artifactId: string,\r\n  ): Promise<BoundedArtifactContent> {\r\n    return this.request<BoundedArtifactContent>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}/artifacts/${encodeURIComponent(artifactId)}/content`,\r\n    )\r\n  }\r\n\r\n  /** Preview page image URL (browser constructs it from ids per 02 §7). */\r\n  artifactPreviewPageUrl(\r\n    conversationId: string,\r\n    artifactId: string,\r\n    page: number,\r\n    variant?: 'thumbnail' | 'full',\r\n  ): string {\r\n    const variantSuffix = variant && variant !== 'full' ? `?variant=${variant}` : ''\r\n    return (\r\n      `${this.baseUrl}/conversations/${encodeURIComponent(conversationId)}` +\r\n      `/artifacts/${encodeURIComponent(artifactId)}` +\r\n      `/preview/pages/${encodeURIComponent(String(page))}${variantSuffix}`\r\n    )\r\n  }\r\n\r\n  /** Original-file download URL (Range-capable, attachment disposition). */\r\n  artifactDownloadUrl(conversationId: string, artifactId: string): string {\r\n    return (\r\n      `${this.baseUrl}/conversations/${encodeURIComponent(conversationId)}` +\r\n      `/artifacts/${encodeURIComponent(artifactId)}/download`\r\n    )\r\n  }\r\n\r\n  /**\r\n   * Binary fetch for preview pages and downloads. Auth headers ride the same\r\n   * provider as every other call; failures map to AiHttpError with status so\r\n   * the store can render 409/410/404 distinctly (02 §5).\r\n   */\r\n  async fetchArtifactBytes(url: string, signal?: AbortSignal): Promise<Blob> {\r\n    const res = await fetch(url, {\r\n      method: 'GET',\r\n      headers: this.headersProvider(),\r\n      signal,\r\n    })\r\n    if (!res.ok) {\r\n      throw new AiHttpError(res.status, `HTTP ${res.status}: ${res.statusText}`)\r\n    }\r\n    return res.blob()\r\n  }\r\n\r\n  /**\r\n   * Upload one conversation attachment (multipart). Runs text extraction\r\n   * server-side; returns the metadata the turn request later references.\r\n   * Deliberately uses raw fetch (not `request`): FormData must set its own\r\n   * multipart boundary Content-Type.\r\n   */\r\n  async uploadAttachment(\r\n    conversationId: string,\r\n    file: File,\r\n    signal?: AbortSignal,\r\n  ): Promise<UploadedAttachment> {\r\n    const form = new FormData()\r\n    form.append('file', file, file.name)\r\n    const url = `${this.baseUrl}/conversations/${encodeURIComponent(conversationId)}/attachments`\r\n    const headers = { ...this.headersProvider() }\r\n    for (const key of Object.keys(headers)) {\r\n      if (key.toLowerCase() === 'content-type') delete headers[key]\r\n    }\r\n    const res = await fetch(url, {\r\n      method: 'POST',\r\n      headers,\r\n      body: form,\r\n      signal,\r\n    })\r\n    if (!res.ok) {\r\n      let message = `HTTP ${res.status}: ${res.statusText}`\r\n      let traceId: string | undefined\r\n      try {\r\n        const error = await res.json() as Partial<ApiResult<unknown>>\r\n        if (typeof error.message === 'string' && error.message.trim()) message = error.message\r\n        traceId = error.traceId\r\n      } catch {\r\n        // Non-JSON proxy/server errors retain the HTTP fallback above.\r\n      }\r\n      throw new AiHttpError(res.status, message, traceId)\r\n    }\r\n    const json = await res.json() as ApiResult<UploadedAttachment>\r\n    if (json.code !== undefined && json.code !== 200) {\r\n      throw new AiHttpError(json.code, json.message ?? `附件上传失败 (code ${json.code})`, json.traceId)\r\n    }\r\n    return json.data\r\n  }\r\n\r\n  /** 附件内容预览（文本类带提取文本；二进制类 text 为 null）。 */\r\n  async getAttachmentContent(\r\n    conversationId: string,\r\n    attachmentId: string,\r\n  ): Promise<AttachmentContent> {\r\n    return this.request<AttachmentContent>(\r\n      'GET',\r\n      `/conversations/${encodeURIComponent(conversationId)}` +\r\n        `/attachments/${encodeURIComponent(attachmentId)}/content`,\r\n    )\r\n  }\r\n\r\n  async health(): Promise<{ status: string; service: string }> {\r\n    const healthUrl = this.baseUrl.endsWith('/api/ai')\r\n      ? `${this.baseUrl.slice(0, -'/api/ai'.length)}/actuator/health`\r\n      : `${this.baseUrl}/health`\r\n\r\n    const res = await fetch(healthUrl, {\r\n      method: 'GET',\r\n      headers: this.headersProvider(),\r\n    })\r\n\r\n    if (!res.ok) {\r\n      throw new AiHttpError(res.status, `HTTP ${res.status}: ${res.statusText}`)\r\n    }\r\n\r\n    const json = await res.json() as ApiResult<{ status: string; service: string }> | { status: string }\r\n    if ('code' in json) {\r\n      if (json.code !== 200) {\r\n        throw new AiHttpError(json.code, json.message ?? 'Unknown API error', json.traceId)\r\n      }\r\n      return json.data\r\n    }\r\n\r\n    return {\r\n      status: json.status,\r\n      service: 'ai-gateway',\r\n    }\r\n  }\r\n\r\n  private async request<T>(\r\n    method: string,\r\n    path: string,\r\n    body?: unknown,\r\n  ): Promise<T> {\r\n    const url = `${this.baseUrl}${path}`\r\n    const headers = {\r\n      'Content-Type': 'application/json',\r\n      ...this.headersProvider(),\r\n    }\r\n\r\n    const init: RequestInit = {\r\n      method,\r\n      headers,\r\n    }\r\n\r\n    if (body !== undefined && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {\r\n      init.body = JSON.stringify(body)\r\n    }\r\n\r\n    const res = await fetch(url, init)\r\n    if (!res.ok) {\r\n      throw new AiHttpError(res.status, `HTTP ${res.status}: ${res.statusText}`)\r\n    }\r\n\r\n    if (res.status === 204 || method === 'DELETE') {\r\n      return undefined as T\r\n    }\r\n\r\n    const json = await res.json() as ApiResult<T>\r\n    if (json.code !== undefined && json.code !== 200) {\r\n      throw new AiHttpError(\r\n        json.code,\r\n        json.message ?? 'Unknown API error',\r\n        json.traceId,\r\n      )\r\n    }\r\n\r\n    return json.data as T\r\n  }\r\n}\r\n","import type {\r\n  AiOpenMode,\r\n  AssistantConnection,\r\n  AssistantPresentation,\r\n  AssistantVisibility,\r\n} from '../protocol'\r\n\r\nexport interface CanonicalPresentationState {\r\n  visibility: AssistantVisibility\r\n  preferredPresentation: AssistantPresentation\r\n}\r\n\r\n/** Convert one legacy open mode into the canonical orthogonal state. */\r\nexport function canonicalPresentationFromLegacy(mode: AiOpenMode): CanonicalPresentationState {\r\n  switch (mode) {\r\n    case 'launcher':\r\n      return { visibility: 'closed', preferredPresentation: 'compact' }\r\n    case 'drawer':\r\n      return { visibility: 'open', preferredPresentation: 'docked' }\r\n    case 'fullscreen':\r\n      return { visibility: 'open', preferredPresentation: 'workspace' }\r\n    case 'floating':\r\n    case 'focus-modal':\r\n    default:\r\n      return { visibility: 'open', preferredPresentation: 'compact' }\r\n  }\r\n}\r\n\r\n/** Return the stable legacy mode used by deprecated public callbacks. */\r\nexport function legacyModeFromCanonical(\r\n  visibility: AssistantVisibility,\r\n  presentation: AssistantPresentation\r\n): AiOpenMode {\r\n  if (visibility === 'closed') return 'launcher'\r\n  if (presentation === 'docked') return 'drawer'\r\n  if (presentation === 'workspace') return 'fullscreen'\r\n  return 'floating'\r\n}\r\n\r\n/**\r\n * Resolve layout for the current viewport without mutating user preference.\r\n * Below 900px every preferred layout becomes the full-viewport workspace.\r\n */\r\nexport function resolveAssistantPresentation(\r\n  preferred: AssistantPresentation,\r\n  viewportWidth: number\r\n): AssistantPresentation {\r\n  return viewportWidth < 900 ? 'workspace' : preferred\r\n}\r\n\r\n/** Map transport-specific status strings to the public connection vocabulary. */\r\nexport function assistantConnectionFromStreamStatus(status: string): AssistantConnection {\r\n  switch (status) {\r\n    case 'connecting':\r\n      return 'connecting'\r\n    case 'streaming':\r\n      return 'online'\r\n    case 'reconnecting':\r\n      return 'reconnecting'\r\n    case 'error':\r\n      return 'offline'\r\n    default:\r\n      return 'idle'\r\n  }\r\n}\r\n","/**\r\n * Pure TypeScript state management for AI Assistant Core\r\n *\r\n * No Vue / React / Pinia dependency.\r\n * Can be wrapped by any framework's reactive system.\r\n */\r\n\r\nimport type {\r\n  AiOpenMode,\r\n  AiThemeMode,\r\n  AssistantConnection,\r\n  AssistantMessage,\r\n  AssistantPresentation,\r\n  AssistantTurnPhase,\r\n  AssistantVisibility,\r\n  Conversation,\r\n  MessageStatus,\r\n  ToolStep,\r\n} from '../protocol'\r\nimport {\r\n  canonicalPresentationFromLegacy,\r\n  resolveAssistantPresentation,\r\n} from './presentation'\r\n\r\nexport * from './presentation'\r\n\r\n// ---------------------------------------------------------------------------\r\n// State shape\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface AssistantState {\r\n  /** Canonical shell visibility. */\r\n  visibility: AssistantVisibility\r\n  /** User-selected layout; never overwritten by responsive behavior. */\r\n  preferredPresentation: AssistantPresentation\r\n  /** Layout currently rendered after responsive resolution. */\r\n  resolvedPresentation: AssistantPresentation\r\n  /** Previous preferred layout for back-navigation. */\r\n  previousPresentation: AssistantPresentation | null\r\n  /** User-visible connection state. */\r\n  connection: AssistantConnection\r\n  /** Current turn lifecycle. */\r\n  turnPhase: AssistantTurnPhase\r\n  /** Composer draft, retained across presentation changes and failures. */\r\n  draft: string\r\n  /** Last transcript position for restoration after a host remount. */\r\n  scrollAnchor: { conversationId: string | null; top: number; pinned: boolean }\r\n  /** Stable focus target id for presentation transitions. */\r\n  focusedControlId: string | null\r\n  /** Selected artifact id for the inspector. */\r\n  selectedArtifactId: string | null\r\n  /** Floating window position (px) */\r\n  position: { x: number; y: number }\r\n  /** Floating window size (px) */\r\n  size: { width: number; height: number }\r\n  /** Business system code */\r\n  systemCode: string\r\n  /** Selected model code */\r\n  modelCode: string\r\n  /** Current conversation id */\r\n  currentConversationId: string | null\r\n  /** All loaded conversations */\r\n  conversations: Conversation[]\r\n  /** Messages keyed by conversation id */\r\n  messagesByConversation: Record<string, AssistantMessage[]>\r\n  /** Tool steps keyed by message id */\r\n  toolStepsByMessage: Record<string, ToolStep[]>\r\n  /** Stream connection status */\r\n  streamStatus: 'idle' | 'connecting' | 'streaming' | 'reconnecting' | 'closed' | 'error'\r\n  /** Last received sequence number (for ack / resume) */\r\n  lastSeq: number\r\n  /** Last heartbeat timestamp */\r\n  lastHeartbeatAt: number\r\n  /** Reconnect attempt counter */\r\n  reconnectAttempt: number\r\n  /** Theme mode */\r\n  themeMode: AiThemeMode\r\n  /** Primary color */\r\n  primaryColor: string\r\n  /** Whether an error toast is currently shown */\r\n  hasError: boolean\r\n  /** Last error message (transient) */\r\n  lastError: string | null\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Action types (discriminated union for reducer)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type StateAction =\r\n  | { type: 'OPEN'; presentation?: AssistantPresentation; mode?: AiOpenMode }\r\n  | { type: 'CLOSE' }\r\n  | { type: 'TOGGLE' }\r\n  | { type: 'SET_VISIBILITY'; visibility: AssistantVisibility }\r\n  | { type: 'SWITCH_PRESENTATION'; presentation: AssistantPresentation; viewportWidth?: number }\r\n  | { type: 'RESOLVE_PRESENTATION'; viewportWidth: number }\r\n  /** @deprecated Dispatch `SWITCH_PRESENTATION`. */\r\n  | { type: 'SWITCH_MODE'; mode: AiOpenMode }\r\n  | { type: 'SET_CONNECTION'; connection: AssistantConnection }\r\n  | { type: 'SET_TURN_PHASE'; phase: AssistantTurnPhase }\r\n  | { type: 'SET_DRAFT'; draft: string }\r\n  | { type: 'SET_SCROLL_ANCHOR'; conversationId: string | null; top: number; pinned: boolean }\r\n  | { type: 'SET_FOCUSED_CONTROL'; id: string | null }\r\n  | { type: 'SELECT_ARTIFACT'; id: string | null }\r\n  | { type: 'SET_POSITION'; x: number; y: number }\r\n  | { type: 'SET_SIZE'; width: number; height: number }\r\n  | { type: 'SET_SYSTEM_CODE'; systemCode: string }\r\n  | { type: 'SET_MODEL_CODE'; modelCode: string }\r\n  | { type: 'SET_CONVERSATION'; id: string | null }\r\n  | { type: 'ADD_CONVERSATION'; conversation: Conversation }\r\n  | { type: 'SET_CONVERSATIONS'; conversations: Conversation[] }\r\n  | { type: 'APPEND_MESSAGE'; conversationId: string; message: AssistantMessage }\r\n  | { type: 'APPEND_DELTA'; conversationId: string; messageId: string; delta: string }\r\n  | { type: 'UPDATE_MESSAGE_STATUS'; conversationId: string; messageId: string; status: MessageStatus }\r\n  | { type: 'SET_MESSAGES'; conversationId: string; messages: AssistantMessage[] }\r\n  | { type: 'APPEND_TOOL_STEP'; messageId: string; step: ToolStep }\r\n  | { type: 'UPDATE_TOOL_STEP'; messageId: string; stepId: string; patch: Partial<ToolStep> }\r\n  | { type: 'SET_STREAM_STATUS'; status: AssistantState['streamStatus'] }\r\n  | { type: 'SET_LAST_SEQ'; seq: number }\r\n  | { type: 'SET_HEARTBEAT'; ts: number }\r\n  | { type: 'INCREMENT_RECONNECT' }\r\n  | { type: 'RESET_RECONNECT' }\r\n  | { type: 'SET_THEME'; mode: AiThemeMode }\r\n  | { type: 'SET_PRIMARY_COLOR'; color: string }\r\n  | { type: 'SET_ERROR'; error: string | null }\r\n  | { type: 'HYDRATE'; state: Partial<AssistantState> }\r\n\r\n// ---------------------------------------------------------------------------\r\n// Factory\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function createInitialState(overrides?: Partial<AssistantState>): AssistantState {\r\n  return {\r\n    visibility: 'closed',\r\n    preferredPresentation: 'compact',\r\n    resolvedPresentation: 'compact',\r\n    previousPresentation: null,\r\n    connection: 'idle',\r\n    turnPhase: 'idle',\r\n    draft: '',\r\n    scrollAnchor: { conversationId: null, top: 0, pinned: true },\r\n    focusedControlId: null,\r\n    selectedArtifactId: null,\r\n    position: { x: 0, y: 0 },\r\n    size: { width: 420, height: 600 },\r\n    systemCode: '',\r\n    modelCode: '',\r\n    currentConversationId: null,\r\n    conversations: [],\r\n    messagesByConversation: {},\r\n    toolStepsByMessage: {},\r\n    streamStatus: 'idle',\r\n    lastSeq: 0,\r\n    lastHeartbeatAt: 0,\r\n    reconnectAttempt: 0,\r\n    themeMode: 'system',\r\n    primaryColor: '#1677ff',\r\n    hasError: false,\r\n    lastError: null,\r\n    ...overrides,\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Reducer (pure function)\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function reducer(state: AssistantState, action: StateAction): AssistantState {\r\n  switch (action.type) {\r\n    case 'OPEN':\r\n      if (action.mode) {\r\n        const canonical = canonicalPresentationFromLegacy(action.mode)\r\n        return {\r\n          ...state,\r\n          visibility: 'open',\r\n          preferredPresentation: canonical.preferredPresentation,\r\n          resolvedPresentation: canonical.preferredPresentation,\r\n        }\r\n      }\r\n      return {\r\n        ...state,\r\n        visibility: 'open',\r\n        preferredPresentation: action.presentation ?? state.preferredPresentation,\r\n        resolvedPresentation: action.presentation ?? state.resolvedPresentation,\r\n      }\r\n\r\n    case 'CLOSE':\r\n      return { ...state, visibility: 'closed' }\r\n\r\n    case 'TOGGLE':\r\n      return { ...state, visibility: state.visibility === 'open' ? 'closed' : 'open' }\r\n\r\n    case 'SET_VISIBILITY':\r\n      return { ...state, visibility: action.visibility }\r\n\r\n    case 'SWITCH_PRESENTATION':\r\n      return {\r\n        ...state,\r\n        visibility: 'open',\r\n        previousPresentation: state.preferredPresentation,\r\n        preferredPresentation: action.presentation,\r\n        resolvedPresentation:\r\n          typeof action.viewportWidth === 'number'\r\n            ? resolveAssistantPresentation(action.presentation, action.viewportWidth)\r\n            : action.presentation,\r\n      }\r\n\r\n    case 'RESOLVE_PRESENTATION':\r\n      return {\r\n        ...state,\r\n        resolvedPresentation: resolveAssistantPresentation(\r\n          state.preferredPresentation,\r\n          action.viewportWidth\r\n        ),\r\n      }\r\n\r\n    case 'SWITCH_MODE': {\r\n      const canonical = canonicalPresentationFromLegacy(action.mode)\r\n      return {\r\n        ...state,\r\n        visibility: canonical.visibility,\r\n        previousPresentation: state.preferredPresentation,\r\n        preferredPresentation: canonical.preferredPresentation,\r\n        resolvedPresentation: canonical.preferredPresentation,\r\n      }\r\n    }\r\n\r\n    case 'SET_CONNECTION':\r\n      return { ...state, connection: action.connection }\r\n\r\n    case 'SET_TURN_PHASE':\r\n      return { ...state, turnPhase: action.phase }\r\n\r\n    case 'SET_DRAFT':\r\n      return { ...state, draft: action.draft }\r\n\r\n    case 'SET_SCROLL_ANCHOR':\r\n      return {\r\n        ...state,\r\n        scrollAnchor: {\r\n          conversationId: action.conversationId,\r\n          top: action.top,\r\n          pinned: action.pinned,\r\n        },\r\n      }\r\n\r\n    case 'SET_FOCUSED_CONTROL':\r\n      return { ...state, focusedControlId: action.id }\r\n\r\n    case 'SELECT_ARTIFACT':\r\n      return { ...state, selectedArtifactId: action.id }\r\n\r\n    case 'SET_POSITION':\r\n      return {\r\n        ...state,\r\n        position: { x: action.x, y: action.y },\r\n      }\r\n\r\n    case 'SET_SIZE':\r\n      return {\r\n        ...state,\r\n        size: { width: action.width, height: action.height },\r\n      }\r\n\r\n    case 'SET_SYSTEM_CODE':\r\n      return { ...state, systemCode: action.systemCode }\r\n\r\n    case 'SET_MODEL_CODE':\r\n      return { ...state, modelCode: action.modelCode }\r\n\r\n    case 'SET_CONVERSATION':\r\n      return { ...state, currentConversationId: action.id }\r\n\r\n    case 'ADD_CONVERSATION': {\r\n      const next = [action.conversation, ...state.conversations]\r\n      return { ...state, conversations: next }\r\n    }\r\n\r\n    case 'SET_CONVERSATIONS':\r\n      return { ...state, conversations: action.conversations }\r\n\r\n    case 'APPEND_MESSAGE': {\r\n      const list = state.messagesByConversation[action.conversationId] ?? []\r\n      return {\r\n        ...state,\r\n        messagesByConversation: {\r\n          ...state.messagesByConversation,\r\n          [action.conversationId]: [...list, action.message],\r\n        },\r\n      }\r\n    }\r\n\r\n    case 'APPEND_DELTA': {\r\n      const list = state.messagesByConversation[action.conversationId]\r\n      if (!list) return state\r\n      const idx = list.findIndex(m => m.id === action.messageId)\r\n      if (idx === -1) return state\r\n      const next = list.slice()\r\n      next[idx] = { ...next[idx], content: next[idx].content + action.delta }\r\n      return {\r\n        ...state,\r\n        messagesByConversation: {\r\n          ...state.messagesByConversation,\r\n          [action.conversationId]: next,\r\n        },\r\n      }\r\n    }\r\n\r\n    case 'UPDATE_MESSAGE_STATUS': {\r\n      const list = state.messagesByConversation[action.conversationId]\r\n      if (!list) return state\r\n      const idx = list.findIndex(m => m.id === action.messageId)\r\n      if (idx === -1) return state\r\n      const next = list.slice()\r\n      const msg = next[idx]\r\n      next[idx] = {\r\n        ...msg,\r\n        status: action.status,\r\n        finishedAt:\r\n          action.status === 'success' || action.status === 'failed'\r\n            ? new Date().toISOString()\r\n            : msg.finishedAt,\r\n      }\r\n      return {\r\n        ...state,\r\n        messagesByConversation: {\r\n          ...state.messagesByConversation,\r\n          [action.conversationId]: next,\r\n        },\r\n      }\r\n    }\r\n\r\n    case 'SET_MESSAGES':\r\n      return {\r\n        ...state,\r\n        messagesByConversation: {\r\n          ...state.messagesByConversation,\r\n          [action.conversationId]: action.messages,\r\n        },\r\n      }\r\n\r\n    case 'APPEND_TOOL_STEP': {\r\n      const steps = state.toolStepsByMessage[action.messageId] ?? []\r\n      return {\r\n        ...state,\r\n        toolStepsByMessage: {\r\n          ...state.toolStepsByMessage,\r\n          [action.messageId]: [...steps, action.step],\r\n        },\r\n      }\r\n    }\r\n\r\n    case 'UPDATE_TOOL_STEP': {\r\n      const steps = state.toolStepsByMessage[action.messageId]\r\n      if (!steps) return state\r\n      const idx = steps.findIndex(s => s.stepId === action.stepId)\r\n      if (idx === -1) return state\r\n      const next = steps.slice()\r\n      next[idx] = { ...next[idx], ...action.patch }\r\n      return {\r\n        ...state,\r\n        toolStepsByMessage: {\r\n          ...state.toolStepsByMessage,\r\n          [action.messageId]: next,\r\n        },\r\n      }\r\n    }\r\n\r\n    case 'SET_STREAM_STATUS':\r\n      return { ...state, streamStatus: action.status }\r\n\r\n    case 'SET_LAST_SEQ':\r\n      return { ...state, lastSeq: action.seq }\r\n\r\n    case 'SET_HEARTBEAT':\r\n      return { ...state, lastHeartbeatAt: action.ts }\r\n\r\n    case 'INCREMENT_RECONNECT':\r\n      return { ...state, reconnectAttempt: state.reconnectAttempt + 1 }\r\n\r\n    case 'RESET_RECONNECT':\r\n      return { ...state, reconnectAttempt: 0 }\r\n\r\n    case 'SET_THEME':\r\n      return { ...state, themeMode: action.mode }\r\n\r\n    case 'SET_PRIMARY_COLOR':\r\n      return { ...state, primaryColor: action.color }\r\n\r\n    case 'SET_ERROR':\r\n      return {\r\n        ...state,\r\n        hasError: action.error !== null,\r\n        lastError: action.error,\r\n      }\r\n\r\n    case 'HYDRATE':\r\n      return { ...state, ...action.state }\r\n\r\n    default:\r\n      return state\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Serialization / Deserialization\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface SerializedState {\r\n  version: number\r\n  state: Omit<\r\n    AssistantState,\r\n    | 'connection'\r\n    | 'turnPhase'\r\n    | 'streamStatus'\r\n    | 'lastSeq'\r\n    | 'lastHeartbeatAt'\r\n    | 'reconnectAttempt'\r\n    | 'hasError'\r\n    | 'lastError'\r\n  >\r\n}\r\n\r\nconst SERIAL_VERSION = 2\r\n\r\n/** Serialize state to JSON-safe object (excludes transient stream fields). */\r\nexport function serialize(state: AssistantState): SerializedState {\r\n  const {\r\n    connection,\r\n    turnPhase,\r\n    streamStatus,\r\n    lastSeq,\r\n    lastHeartbeatAt,\r\n    reconnectAttempt,\r\n    hasError,\r\n    lastError,\r\n    ...persistable\r\n  } = state\r\n  void connection\r\n  void turnPhase\r\n  void streamStatus\r\n  void lastSeq\r\n  void lastHeartbeatAt\r\n  void reconnectAttempt\r\n  void hasError\r\n  void lastError\r\n  return { version: SERIAL_VERSION, state: persistable as SerializedState['state'] }\r\n}\r\n\r\n/** Deserialize and merge with fresh initial state defaults. */\r\nexport function deserialize(data: unknown): AssistantState | null {\r\n  if (!data || typeof data !== 'object') return null\r\n  const parsed = data as SerializedState\r\n  if (parsed.version === 1) {\r\n    const legacy = (parsed as unknown as { state?: Record<string, unknown> }).state\r\n    if (!legacy) return null\r\n    const mode = typeof legacy.mode === 'string' ? (legacy.mode as AiOpenMode) : 'floating'\r\n    const canonical = canonicalPresentationFromLegacy(mode)\r\n    const {\r\n      visible,\r\n      mode: _mode,\r\n      previousMode,\r\n      ...remaining\r\n    } = legacy\r\n    void _mode\r\n    const previous =\r\n      typeof previousMode === 'string'\r\n        ? canonicalPresentationFromLegacy(previousMode as AiOpenMode).preferredPresentation\r\n        : null\r\n    return createInitialState({\r\n      ...(remaining as Partial<AssistantState>),\r\n      visibility: visible === false ? 'closed' : canonical.visibility,\r\n      preferredPresentation: canonical.preferredPresentation,\r\n      resolvedPresentation: canonical.preferredPresentation,\r\n      previousPresentation: previous,\r\n    })\r\n  }\r\n  if (parsed.version !== SERIAL_VERSION) return null\r\n  return createInitialState(parsed.state)\r\n}\r\n\r\n/** Convenience: serialize to JSON string. */\r\nexport function serializeToString(state: AssistantState): string {\r\n  return JSON.stringify(serialize(state))\r\n}\r\n\r\n/** Convenience: deserialize from JSON string. */\r\nexport function deserializeFromString(json: string): AssistantState | null {\r\n  try {\r\n    return deserialize(JSON.parse(json))\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n","/**\r\n * Tool-call orchestrator for AI Assistant Core\r\n *\r\n * ToolRegistry  — register / lookup tools\r\n * ToolOrchestrator — execute steps in parallel or serial order\r\n */\r\n\r\nimport type { ToolDefinition, ToolExecutor, ToolStep } from '../protocol'\r\nimport { generateId } from '../utils'\r\n\r\n// ---------------------------------------------------------------------------\r\n// ToolRegistry\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface RegisteredTool {\r\n  definition: ToolDefinition\r\n  executor: ToolExecutor\r\n}\r\n\r\nexport class ToolRegistry {\r\n  private readonly tools = new Map<string, RegisteredTool>()\r\n\r\n  /** Register a tool with its definition and executor. */\r\n  register(definition: ToolDefinition, executor: ToolExecutor): void {\r\n    this.tools.set(definition.name, { definition, executor })\r\n  }\r\n\r\n  /** Unregister a tool by name. */\r\n  unregister(name: string): boolean {\r\n    return this.tools.delete(name)\r\n  }\r\n\r\n  /** Look up a registered tool. */\r\n  get(name: string): RegisteredTool | undefined {\r\n    return this.tools.get(name)\r\n  }\r\n\r\n  /** Check whether a tool is registered. */\r\n  has(name: string): boolean {\r\n    return this.tools.has(name)\r\n  }\r\n\r\n  /** List all registered tool names. */\r\n  list(): string[] {\r\n    return Array.from(this.tools.keys())\r\n  }\r\n\r\n  /** Get all definitions (for sending to LLM). */\r\n  getDefinitions(): ToolDefinition[] {\r\n    return Array.from(this.tools.values()).map(t => t.definition)\r\n  }\r\n\r\n  /** Clear all registrations. */\r\n  clear(): void {\r\n    this.tools.clear()\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// ToolOrchestrator\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface OrchestratorOptions {\r\n  registry: ToolRegistry\r\n  onStepStart?: (step: ToolStep) => void\r\n  onStepProgress?: (stepId: string, percent: number, message?: string) => void\r\n  onStepComplete?: (step: ToolStep) => void\r\n  onStepError?: (step: ToolStep, error: Error) => void\r\n}\r\n\r\nexport type ExecutionMode = 'parallel' | 'serial'\r\n\r\nexport interface ExecutionPlan {\r\n  mode: ExecutionMode\r\n  steps: Array<{\r\n    toolName: string\r\n    args: Record<string, unknown>\r\n    title?: string\r\n  }>\r\n}\r\n\r\nexport class ToolOrchestrator {\r\n  private readonly registry: ToolRegistry\r\n  private readonly onStepStart?: (step: ToolStep) => void\r\n  private readonly onStepComplete?: (step: ToolStep) => void\r\n  private readonly onStepError?: (step: ToolStep, error: Error) => void\r\n\r\n  constructor(options: OrchestratorOptions) {\r\n    this.registry = options.registry\r\n    this.onStepStart = options.onStepStart\r\n    this.onStepComplete = options.onStepComplete\r\n    this.onStepError = options.onStepError\r\n  }\r\n\r\n  /**\r\n   * Execute a plan of tool steps.\r\n   *\r\n   * - `serial`:  steps run one after another; if one fails, abort the rest.\r\n   * - `parallel`: steps run concurrently; all results collected regardless of individual failures.\r\n   */\r\n  async execute(plan: ExecutionPlan): Promise<ToolStep[]> {\r\n    if (plan.mode === 'serial') {\r\n      return this.executeSerial(plan.steps)\r\n    }\r\n    return this.executeParallel(plan.steps)\r\n  }\r\n\r\n  /** Execute a single tool step. */\r\n  async executeSingle(\r\n    toolName: string,\r\n    args: Record<string, unknown>,\r\n    title?: string\r\n  ): Promise<ToolStep> {\r\n    const registered = this.registry.get(toolName)\r\n    if (!registered) {\r\n      const step: ToolStep = {\r\n        stepId: generateId('step_'),\r\n        toolName,\r\n        title: title ?? toolName,\r\n        status: 'error',\r\n        args,\r\n        message: `Tool \"${toolName}\" is not registered`,\r\n      }\r\n      this.onStepError?.(step, new Error(step.message))\r\n      return step\r\n    }\r\n\r\n    const step: ToolStep = {\r\n      stepId: generateId('step_'),\r\n      toolName,\r\n      title: title ?? registered.definition.description ?? toolName,\r\n      status: 'running',\r\n      args,\r\n    }\r\n\r\n    this.onStepStart?.(step)\r\n\r\n    const startTime = Date.now()\r\n    try {\r\n      const result = await registered.executor(args)\r\n      step.status = 'success'\r\n      step.result = result\r\n      step.durationMs = Date.now() - startTime\r\n      this.onStepComplete?.(step)\r\n      return step\r\n    } catch (err) {\r\n      step.status = 'error'\r\n      step.result = err instanceof Error ? err.message : String(err)\r\n      step.durationMs = Date.now() - startTime\r\n      this.onStepError?.(step, err instanceof Error ? err : new Error(String(err)))\r\n      return step\r\n    }\r\n  }\r\n\r\n  private async executeSerial(\r\n    steps: ExecutionPlan['steps']\r\n  ): Promise<ToolStep[]> {\r\n    const results: ToolStep[] = []\r\n    for (const s of steps) {\r\n      const result = await this.executeSingle(s.toolName, s.args, s.title)\r\n      results.push(result)\r\n      if (result.status === 'error') {\r\n        // Abort remaining serial steps\r\n        break\r\n      }\r\n    }\r\n    return results\r\n  }\r\n\r\n  private async executeParallel(\r\n    steps: ExecutionPlan['steps']\r\n  ): Promise<ToolStep[]> {\r\n    return Promise.all(\r\n      steps.map(s => this.executeSingle(s.toolName, s.args, s.title))\r\n    )\r\n  }\r\n}\r\n","/**\r\n * Knowledge-base citation parser for AI Assistant Core\r\n *\r\n * Parses [1] [2] citation markers in assistant text and\r\n * matches them against content chunks returned by the backend.\r\n */\r\n\r\n// ---------------------------------------------------------------------------\r\n// CitationParser\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface Citation {\r\n  /** Raw marker text, e.g. \"[1]\" */\r\n  marker: string\r\n  /** Numeric index, e.g. 1 */\r\n  index: number\r\n  /** Start position in the source text */\r\n  start: number\r\n  /** End position in the source text */\r\n  end: number\r\n}\r\n\r\nexport class CitationParser {\r\n  /** Regex for citation markers: [1], [12], etc. */\r\n  private static readonly MARKER_RE = /\\[(\\d+)\\]/g\r\n\r\n  /**\r\n   * Extract all citation markers from a text block.\r\n   *\r\n   * @param text — source text containing [1], [2], … markers\r\n   * @returns ordered list of citations with positions\r\n   */\r\n  parse(text: string): Citation[] {\r\n    const citations: Citation[] = []\r\n    let match: RegExpExecArray | null\r\n    CitationParser.MARKER_RE.lastIndex = 0\r\n    while ((match = CitationParser.MARKER_RE.exec(text)) !== null) {\r\n      citations.push({\r\n        marker: match[0],\r\n        index: parseInt(match[1], 10),\r\n        start: match.index,\r\n        end: match.index + match[0].length,\r\n      })\r\n    }\r\n    return citations\r\n  }\r\n\r\n  /**\r\n   * Strip citation markers from text, returning clean text and a mapping.\r\n   *\r\n   * @returns `{ text: string, citations: Citation[] }`\r\n   */\r\n  strip(text: string): { text: string; citations: Citation[] } {\r\n    const citations = this.parse(text)\r\n    if (citations.length === 0) {\r\n      return { text, citations: [] }\r\n    }\r\n\r\n    let cleaned = ''\r\n    let lastEnd = 0\r\n    for (const c of citations) {\r\n      cleaned += text.slice(lastEnd, c.start)\r\n      lastEnd = c.end\r\n    }\r\n    cleaned += text.slice(lastEnd)\r\n\r\n    return { text: cleaned.trim(), citations }\r\n  }\r\n\r\n  /**\r\n   * Replace citation markers with custom formatter output.\r\n   *\r\n   * @param text    — source text\r\n   * @param format  — callback receiving citation index, returns replacement string\r\n   */\r\n  replace(text: string, format: (index: number) => string): string {\r\n    return text.replace(CitationParser.MARKER_RE, (_match, num) => format(parseInt(num, 10)))\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// ChunkMatcher\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface KnowledgeChunk {\r\n  /** Chunk index (1-based, matching citation numbers) */\r\n  index: number\r\n  /** Source title or document name */\r\n  title: string\r\n  /** Chunk text content */\r\n  content: string\r\n  /** Optional source URL or identifier */\r\n  source?: string\r\n  /** Relevance score (0–1) */\r\n  score?: number\r\n}\r\n\r\nexport interface MatchedChunk extends KnowledgeChunk {\r\n  /** Citation markers that reference this chunk */\r\n  citedBy: number[]\r\n}\r\n\r\nexport class ChunkMatcher {\r\n  /**\r\n   * Match parsed citations to a list of knowledge chunks.\r\n   *\r\n   * @param citations — output from `CitationParser.parse()`\r\n   * @param chunks    — chunks returned by backend (should be 1-based indexed)\r\n   * @returns chunks that were cited, with `citedBy` populated\r\n   */\r\n  match(citations: Citation[], chunks: KnowledgeChunk[]): MatchedChunk[] {\r\n    const citedIndices = new Set(citations.map(c => c.index))\r\n    const indexToCitations = new Map<number, number[]>()\r\n\r\n    for (const c of citations) {\r\n      const arr = indexToCitations.get(c.index) ?? []\r\n      arr.push(c.index)\r\n      indexToCitations.set(c.index, arr)\r\n    }\r\n\r\n    const matched: MatchedChunk[] = []\r\n    for (const chunk of chunks) {\r\n      if (citedIndices.has(chunk.index)) {\r\n        matched.push({\r\n          ...chunk,\r\n          citedBy: indexToCitations.get(chunk.index) ?? [chunk.index],\r\n        })\r\n      }\r\n    }\r\n\r\n    // Preserve chunk order\r\n    matched.sort((a, b) => a.index - b.index)\r\n    return matched\r\n  }\r\n\r\n  /**\r\n   * Build a flat map: citation index → chunk.\r\n   *\r\n   * @returns Map where key is citation number and value is the matching chunk\r\n   */\r\n  buildIndexMap(chunks: KnowledgeChunk[]): Map<number, KnowledgeChunk> {\r\n    const map = new Map<number, KnowledgeChunk>()\r\n    for (const chunk of chunks) {\r\n      map.set(chunk.index, chunk)\r\n    }\r\n    return map\r\n  }\r\n\r\n  /**\r\n   * Find chunks that are NOT cited in the text (orphans).\r\n   */\r\n  findOrphans(citations: Citation[], chunks: KnowledgeChunk[]): KnowledgeChunk[] {\r\n    const cited = new Set(citations.map(c => c.index))\r\n    return chunks.filter(c => !cited.has(c.index))\r\n  }\r\n}\r\n","/**\r\n * v2 stream reducer — pure, deterministic accumulator→snapshot fold.\r\n *\r\n * Designed for Phase-1 Vue stores to consume instead of the legacy `adaptEvent`.\r\n * Pure TypeScript, zero Vue / framework dependency (CLAUDE.md §3.1 red line).\r\n *\r\n * ## Seq / ordering policy\r\n * - Each event carries a globally monotonic `seq` cursor.\r\n * - On `run.start` the current message's `lastSeq` resets to `event.seq - 1` so\r\n *   all subsequent events for this run are accepted.\r\n * - For all other events: if `event.seq <= state.lastSeq`, the event is SKIPPED\r\n *   (duplicate / out-of-order replay already seen).\r\n * - `lastSeq` is updated to `event.seq` after every accepted event.\r\n * - Delta accumulation is idempotent given strict seq ordering; `*.end` events\r\n *   are authoritative no-op finalizers (they carry no new content).\r\n * - Unknown `type` values are silently ignored (forward-compat; never throw).\r\n *\r\n * ## Immutability contract\r\n * `reduce` returns a new `ReduceState` object. Top-level arrays (messages, parts)\r\n * are replaced on mutation so shallow comparison works in Vue reactive systems.\r\n * Inner objects (e.g. `TextPart`) are also replaced on mutation.\r\n */\r\nimport { coerceArtifactRef } from '../../artifact/contracts'\r\nimport type { PublicArtifactRef } from '../../artifact/contracts'\r\n\r\nimport type {\r\n  StreamEvent,\r\n  Usage,\r\n  FinishReason,\r\n  ToolOutput,\r\n  ToolFailureDiagnostic,\r\n  ToolStatus,\r\n  RiskLevel,\r\n  JsonPatchOp,\r\n  CardData,\r\n  CardKind,\r\n  CardPlacement,\r\n  JsonObject,\r\n  PlanTraceTask,\r\n  ClarifyQuestion,\r\n  ProgressStatus,\r\n  DshPresentationProjection,\r\n} from '../../protocol/v2'\r\n\r\n// ---------------------------------------------------------------------------\r\n// Snapshot types (public API)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Status of an assistant message lifetime (v2 reducer). */\r\nexport type RunStatus = 'streaming' | 'complete' | 'cancelled' | 'error'\r\n\r\n/** Status of a tool call across its state machine. */\r\nexport type ToolPartStatus =\r\n  | 'pending'\r\n  | 'input-streaming'\r\n  | 'input-ready'\r\n  | 'executing'\r\n  | 'output-available'\r\n  | 'output-error'\r\n\r\n/** A streamed text block (main reply or continuation). */\r\nexport interface TextPart {\r\n  kind: 'text'\r\n  partId: string\r\n  text: string\r\n  provisional?: boolean\r\n}\r\n\r\n/** Safe public analysis summary. Raw provider chain-of-thought is never materialized. */\r\nexport interface ReasoningPart {\r\n  kind: 'reasoning'\r\n  partId: string\r\n  text: string\r\n}\r\n\r\n/** A tool invocation with full lifecycle state. */\r\nexport interface ToolPart {\r\n  kind: 'tool'\r\n  toolCallId: string\r\n  toolName: string\r\n  status: ToolPartStatus\r\n  /** Correlation id shared with the result cards / stages of this tool call (v2.1). */\r\n  group?: string\r\n  /** Accumulated raw JSON string of the input (from `tool.input.delta`). */\r\n  inputRaw?: string\r\n  /** Authoritative parsed input (from `tool.input`). */\r\n  input?: JsonObject\r\n  output?: ToolOutput\r\n  outputStatus?: ToolStatus\r\n  error?: string\r\n  diagnostic?: ToolFailureDiagnostic\r\n}\r\n\r\n/** A rich presentation card (table / chart / metric / …). */\r\nexport interface CardPart {\r\n  kind: 'card'\r\n  id: string\r\n  cardKind: CardKind\r\n  data: CardData\r\n  /** Correlation id shared with the tool / sibling cards of one result (v2.1). */\r\n  group?: string\r\n  /** Section placement hint for Process / Answer / Artifact rendering. */\r\n  placement?: CardPlacement\r\n  /** Optional answer anchor this card is attached to. */\r\n  anchorId?: string\r\n  transient?: boolean\r\n  status?: string\r\n}\r\n\r\n/** Authoritative presentation event metadata retained alongside renderable cards. */\r\nexport interface PresentationPart {\r\n  kind: 'presentation'\r\n  projection: DshPresentationProjection\r\n}\r\n\r\n/**\r\n * Delivery artifact hint materialized from `presentation.attachments`.\r\n * Idempotent per `artifact.artifactId` so reconnect replays never duplicate.\r\n */\r\nexport interface ArtifactPart {\r\n  kind: 'artifact'\r\n  artifact: PublicArtifactRef\r\n}\r\n\r\n/** A deterministic pipeline stage progress notification (v2.1 additive). */\r\nexport interface StagePart {\r\n  kind: 'stage'\r\n  stageId: string\r\n  /** Source event sequence; current-stage selection must use this, not array order. */\r\n  seq?: number\r\n  label: string\r\n  /** Open-enum phase hint, e.g. 'schema-linking' | 'dsl-gen' | 'execute'. */\r\n  phase?: string\r\n  progress?: number\r\n  /** Correlation id shared with the producing tool / cards (v2.1). */\r\n  group?: string\r\n  /** Stable vNext identity; legacy stage events omit it. */\r\n  progressId?: string\r\n  /** Stable capability / plan step identity. */\r\n  stepId?: string\r\n  status?: ProgressStatus\r\n  attempt?: number\r\n  elapsedMs?: number\r\n  safeSummary?: string\r\n  occurredAt?: string\r\n}\r\n\r\n/** Latest backend-owned execution-plan snapshot for this turn. */\r\nexport interface PlanPart {\r\n  kind: 'plan'\r\n  runId: string\r\n  messageId: string\r\n  planId: string\r\n  planName: string\r\n  state: string\r\n  version: number\r\n  tasks: PlanTraceTask[]\r\n}\r\n\r\n/** A write-action pending 二次确认. */\r\nexport interface ActionPart {\r\n  kind: 'action'\r\n  actionId: string\r\n  title: string\r\n  summary?: string\r\n  riskLevel: RiskLevel\r\n  params: Record<string, string | number | boolean | null>\r\n}\r\n\r\n/** A clarification request asking the user to choose or answer. */\r\nexport interface ClarifyPart {\r\n  kind: 'clarify'\r\n  requestId: string\r\n  questions: ClarifyQuestion[]\r\n}\r\n\r\n/** Discriminated union of all renderable parts of an assistant turn. */\r\nexport type Part =\r\n  | TextPart\r\n  | ReasoningPart\r\n  | ToolPart\r\n  | CardPart\r\n  | StagePart\r\n  | PlanPart\r\n  | ActionPart\r\n  | ClarifyPart\r\n  | PresentationPart\r\n  | ArtifactPart\r\n\r\n/** Turn-level AskData observability restored from backend v2 event metadata. */\r\nexport interface AskDataObservation {\r\n  traceId?: string\r\n  runId?: string\r\n  stageLatenciesMs?: Record<string, number>\r\n  schemaConfidence?: number\r\n  goldenHit?: boolean\r\n  retryReason?: string\r\n  rowCount?: number\r\n  denyReason?: string\r\n  sensitive?: boolean\r\n  [key: string]: unknown\r\n}\r\n\r\n/**\r\n * Complete snapshot of a single assistant message at a point in time.\r\n * Parts are ordered by the `seq` of their originating start event.\r\n */\r\nexport interface MessageSnapshot {\r\n  messageId: string\r\n  conversationId: string\r\n  status: RunStatus\r\n  parts: Part[]\r\n  usage?: Usage\r\n  finishReason?: FinishReason\r\n  /** Wall-clock latency reported by the backend on `run.finish`. */\r\n  latencyMs?: number\r\n  /** AskData turn observability restored from persisted v2 event metadata. */\r\n  observation?: AskDataObservation\r\n  /** Backend run error metadata, preserved so hosts can show retry affordances. */\r\n  error?: {\r\n    code: string\r\n    message: string\r\n    retriable: boolean\r\n  }\r\n  /** Timestamp (ms) when `run.start` was received. */\r\n  startedAt: number\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Index maps (kept inside state for O(1) lookups)\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Internal indexes for the current (last) message. */\r\ninterface MessageIndexes {\r\n  /** partId → latest writable index in `parts` for text/reasoning parts */\r\n  byPartId: Map<string, number>\r\n  /** toolCallId → index in `parts` for tool parts */\r\n  byToolCallId: Map<string, number>\r\n  /** card.id → index in `parts` for card parts */\r\n  byCardId: Map<string, number>\r\n  /** planId -> index in `parts`; later snapshots replace the first one in place. */\r\n  byPlanId: Map<string, number>\r\n  /** requestId -> clarification index; repeated input.required updates in place. */\r\n  byRequestId: Map<string, number>\r\n}\r\n\r\n/**\r\n * Accumulator state for `reduce`. Plain / serialisable (Maps are the only\r\n * non-JSON-native field; callers that need JSON-round-trip should serialise\r\n * them separately).\r\n */\r\nexport interface ReduceState {\r\n  /** Ordered list of assistant messages produced so far. */\r\n  messages: MessageSnapshot[]\r\n  /** Last `seq` accepted (used for duplicate/OOO filtering). */\r\n  lastSeq: number\r\n  /**\r\n   * Internal indexes for the current (last) message.\r\n   * Replaced whenever the active message changes.\r\n   * @internal — Vue stores should not depend on this directly.\r\n   */\r\n  _idx: MessageIndexes\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction makeIndexes(): MessageIndexes {\r\n  return {\r\n    byPartId: new Map(),\r\n    byToolCallId: new Map(),\r\n    byCardId: new Map(),\r\n    byPlanId: new Map(),\r\n    byRequestId: new Map(),\r\n  }\r\n}\r\n\r\n/** Return a shallow-cloned state with `messages` array replaced. */\r\nfunction withMessages(state: ReduceState, messages: MessageSnapshot[]): ReduceState {\r\n  return { ...state, messages }\r\n}\r\n\r\n/** Replace the last message in the array. */\r\nfunction replaceLast(messages: MessageSnapshot[], next: MessageSnapshot): MessageSnapshot[] {\r\n  if (messages.length === 0) return messages\r\n  return [...messages.slice(0, -1), next]\r\n}\r\n\r\n/** Return the last message, or undefined. */\r\nfunction lastMsg(state: ReduceState): MessageSnapshot | undefined {\r\n  return state.messages[state.messages.length - 1]\r\n}\r\n\r\n/** Replace a part at `index` in the parts array. */\r\nfunction replacePart(parts: Part[], index: number, next: Part): Part[] {\r\n  const arr = [...parts]\r\n  arr[index] = next\r\n  return arr\r\n}\r\n\r\nfunction isWritableTextPart(msg: MessageSnapshot, index: number): boolean {\r\n  return index === msg.parts.length - 1 && msg.parts[index]?.kind === 'text'\r\n}\r\n\r\n/**\r\n * Apply a minimal subset of RFC 6902 JSON Patch (add / remove / replace) to a\r\n * plain object. Path must be a single-level `/key` reference. Nested paths and\r\n * arrays are ignored silently (forward-compat).\r\n */\r\nfunction applyPatch(\r\n  target: Record<string, unknown>,\r\n  ops: JsonPatchOp[],\r\n): Record<string, unknown> {\r\n  let result = { ...target }\r\n  for (const op of ops) {\r\n    // Only handle single-level paths: \"/key\"\r\n    const match = /^\\/([^/]+)$/.exec(op.path)\r\n    if (!match) continue\r\n    const key = match[1]\r\n    if (op.op === 'remove') {\r\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n      const { [key]: _removed, ...rest } = result\r\n      result = rest\r\n    } else if (op.op === 'add' || op.op === 'replace') {\r\n      result = { ...result, [key]: op.value }\r\n    }\r\n  }\r\n  return result\r\n}\r\n\r\nconst TOOL_STATUS_RANK: Record<ToolPartStatus, number> = {\r\n  pending: 0,\r\n  'input-streaming': 1,\r\n  'input-ready': 2,\r\n  executing: 3,\r\n  'output-available': 4,\r\n  'output-error': 4,\r\n}\r\n\r\nfunction mergeToolPart(current: ToolPart, next: ToolPart): ToolPart {\r\n  const status =\r\n    TOOL_STATUS_RANK[next.status] >= TOOL_STATUS_RANK[current.status]\r\n      ? next.status\r\n      : current.status\r\n\r\n  return {\r\n    ...current,\r\n    ...next,\r\n    status,\r\n    group: next.group ?? current.group,\r\n    inputRaw: next.inputRaw ?? current.inputRaw,\r\n    input: next.input ?? current.input,\r\n    output: next.output ?? current.output,\r\n    outputStatus: next.outputStatus ?? current.outputStatus,\r\n    error: next.error ?? current.error,\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// initialState\r\n// ---------------------------------------------------------------------------\r\n\r\n/** Factory for a blank accumulator. */\r\nexport function initialState(): ReduceState {\r\n  return {\r\n    messages: [],\r\n    lastSeq: 0,\r\n    _idx: makeIndexes(),\r\n  }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// reduce\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Pure fold: given the current accumulator state and one v2 `StreamEvent`,\r\n * return the next state. Never mutates `state`. Unknown event types are\r\n * ignored silently.\r\n */\r\nexport function reduce(state: ReduceState, event: StreamEvent): ReduceState {\r\n  // Duplicate / out-of-order guard (except run.start which resets the cursor)\r\n  if (event.type !== 'run.start' && event.seq <= state.lastSeq) {\r\n    return state\r\n  }\r\n\r\n  // Advance seq (will be done for every accepted event below)\r\n  const nextSeq = event.seq\r\n\r\n  // Shorthand: get the current message and its parts\r\n  const msg = lastMsg(state)\r\n\r\n  switch (event.type) {\r\n    // -------------------------------------------------------------------------\r\n    // run lifecycle\r\n    // -------------------------------------------------------------------------\r\n    case 'run.start': {\r\n      const newMsg: MessageSnapshot = {\r\n        messageId: event.messageId,\r\n        conversationId: event.conversationId,\r\n        status: 'streaming',\r\n        parts: [],\r\n        startedAt: Date.now(),\r\n      }\r\n      return {\r\n        messages: [...state.messages, newMsg],\r\n        lastSeq: nextSeq,\r\n        _idx: makeIndexes(),\r\n      }\r\n    }\r\n\r\n    case 'run.finish': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const finished: MessageSnapshot = {\r\n        ...msg,\r\n        parts: clearPreviews(msg.parts),\r\n        status: event.reason === 'cancelled' ? 'cancelled' : 'complete',\r\n        usage: event.usage,\r\n        finishReason: event.reason,\r\n        latencyMs: event.latencyMs,\r\n      }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, finished)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'run.error': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const errored: MessageSnapshot = {\r\n        ...msg,\r\n        parts: clearPreviews(msg.parts),\r\n        status: 'error',\r\n        error: {\r\n          code: event.code,\r\n          message: event.message,\r\n          retriable: event.retriable,\r\n        },\r\n      }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, errored)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // text block\r\n    // -------------------------------------------------------------------------\r\n    case 'text.start': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      if (hasCompletePresentationLayout(msg)) return { ...state, lastSeq: nextSeq }\r\n      const idx = msg.parts.length\r\n      const newPart: TextPart = { kind: 'text', partId: event.partId, text: '' }\r\n      const nextIdx = { ...state._idx, byPartId: new Map(state._idx.byPartId) }\r\n      nextIdx.byPartId.set(event.partId, idx)\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    case 'text.delta': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      if (hasCompletePresentationLayout(msg)) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byPartId.get(event.partId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      if (!isWritableTextPart(msg, idx)) {\r\n        const newIdx = msg.parts.length\r\n        const nextIdx = { ...state._idx, byPartId: new Map(state._idx.byPartId) }\r\n        nextIdx.byPartId.set(event.partId, newIdx)\r\n        const newPart: TextPart = { kind: 'text', partId: event.partId, text: event.delta }\r\n        const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n        return {\r\n          ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n          lastSeq: nextSeq,\r\n          _idx: nextIdx,\r\n        }\r\n      }\r\n      const part = msg.parts[idx] as TextPart\r\n      const updated: TextPart = { ...part, text: part.text + event.delta }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'text.end': {\r\n      // Authoritative no-op finalizer — just advance seq\r\n      return { ...state, lastSeq: nextSeq }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // safe public execution narration\r\n    // -------------------------------------------------------------------------\r\n    case 'narration.start': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = msg.parts.length\r\n      const newPart: ReasoningPart = { kind: 'reasoning', partId: event.partId, text: '' }\r\n      const nextIdx = { ...state._idx, byPartId: new Map(state._idx.byPartId) }\r\n      nextIdx.byPartId.set(event.partId, idx)\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    case 'narration.delta': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byPartId.get(event.partId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx]\r\n      if (!part || part.kind !== 'reasoning') return { ...state, lastSeq: nextSeq }\r\n      const updated: ReasoningPart = { ...part, text: part.text + event.delta }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'narration.end': {\r\n      return { ...state, lastSeq: nextSeq }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // Legacy reasoning block\r\n    // -------------------------------------------------------------------------\r\n    case 'reasoning.start':\r\n    case 'reasoning.delta':\r\n    case 'reasoning.end': {\r\n      // Rolling-upgrade compatibility: old v2 frames remain parseable so their\r\n      // cursors can advance, but raw provider reasoning is never materialized.\r\n      return { ...state, lastSeq: nextSeq }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // tool-call state machine\r\n    // -------------------------------------------------------------------------\r\n    case 'tool.start': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const newPart: ToolPart = {\r\n        kind: 'tool',\r\n        toolCallId: event.toolCallId,\r\n        toolName: event.toolName,\r\n        status: 'pending',\r\n        group: event.group,\r\n      }\r\n      const existing = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (existing !== undefined) {\r\n        const part = msg.parts[existing] as ToolPart\r\n        const updated = mergeToolPart(part, newPart)\r\n        const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, existing, updated) }\r\n        return {\r\n          ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n          lastSeq: nextSeq,\r\n        }\r\n      }\r\n      const idx = msg.parts.length\r\n      const nextIdx = { ...state._idx, byToolCallId: new Map(state._idx.byToolCallId) }\r\n      nextIdx.byToolCallId.set(event.toolCallId, idx)\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    case 'tool.input.delta': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as ToolPart\r\n      const updated: ToolPart = {\r\n        ...part,\r\n        status: 'input-streaming',\r\n        inputRaw: (part.inputRaw ?? '') + event.delta,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'tool.input': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as ToolPart\r\n      const updated: ToolPart = {\r\n        ...part,\r\n        status: 'input-ready',\r\n        input: event.input,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'tool.executing': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as ToolPart\r\n      const updated: ToolPart = { ...part, status: 'executing' }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'tool.output': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as ToolPart\r\n      const updated: ToolPart = {\r\n        ...part,\r\n        status: event.status === 'output-available' ? 'output-available' : 'output-error',\r\n        output: event.output,\r\n        outputStatus: event.status,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'tool.error': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byToolCallId.get(event.toolCallId)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as ToolPart\r\n      const updated: ToolPart = {\r\n        ...part,\r\n        status: 'output-error',\r\n        error: event.error,\r\n        diagnostic: event.diagnostic,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    case 'answer.preview': {\r\n      if (!msg || msg.status !== 'streaming' || hasCompletePresentationLayout(msg)) return { ...state, lastSeq: nextSeq }\r\n      const partId = `answer-preview:${event.previewId}`\r\n      const parts = [...msg.parts]\r\n      const index = parts.findIndex(part => part.kind === 'text' && part.partId === partId)\r\n      const part: TextPart = { kind: 'text', partId, text: event.text, provisional: true }\r\n      if (index < 0) parts.push(part)\r\n      else parts[index] = part\r\n      return { ...withMessages(state, replaceLast(state.messages, { ...msg, parts })), lastSeq: nextSeq }\r\n    }\r\n\r\n    case 'presentation': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const presentation: PresentationPart = {\r\n        kind: 'presentation',\r\n        projection: event.payload,\r\n      }\r\n      const cardParts: CardPart[] = event.payload.cards.map((card, cardIndex) => {\r\n        // Table and chart cards derived from the same governed evidence are\r\n        // complementary views of one result. Give them a shared base group so\r\n        // the renderer can present a single 图/表 switch instead of rendering\r\n        // the chart's accessible data table and an identical standalone table.\r\n        // Distinct narrative anchors are still split by groupTurnSections.\r\n        const presentationGroup = `presentation:${event.seq}:${card.evidenceId}`\r\n        // A stat card stands alone: there is no underlying table to offer as a\r\n        // second view, so it carries only its own label and value.\r\n        if (card.kind === 'metric') {\r\n          return {\r\n            kind: 'card',\r\n            id: `${card.artifactId}:metric:${cardIndex}`,\r\n            cardKind: 'metric',\r\n            group: presentationGroup,\r\n            placement: 'answer',\r\n            data: {\r\n              kind: 'metric',\r\n              evidenceId: card.evidenceId,\r\n              items: [{\r\n                label: card.label,\r\n                value: card.value,\r\n                ...(card.unit === undefined ? {} : { unit: card.unit }),\r\n              }],\r\n            },\r\n          }\r\n        }\r\n        const columns = card.columns.map(key => ({\r\n          key,\r\n          title: card.columnLabels?.[key] || key,\r\n          displayName: card.columnLabels?.[key] || key,\r\n        }))\r\n        const rows = card.previewRows.map(values => Object.fromEntries(\r\n          card.columns.map((column, index) => [column, values[index] ?? null]),\r\n        ))\r\n        if (card.kind === 'chart') {\r\n          return {\r\n            kind: 'card',\r\n            id: `${card.artifactId}:chart:${cardIndex}`,\r\n            cardKind: 'chart',\r\n            group: presentationGroup,\r\n            placement: 'answer',\r\n            data: {\r\n              kind: 'chart',\r\n              rowCount: card.rowCount,\r\n              truncated: card.truncated,\r\n              evidenceId: card.evidenceId,\r\n              datasetId: card.datasetId,\r\n              artifactId: card.artifactId,\r\n              spec: {\r\n                chartKind: card.chartKind,\r\n                title: card.title,\r\n                datasetRef: card.datasetId,\r\n                encoding: {\r\n                  x: card.xColumn,\r\n                  y: card.yColumns,\r\n                  series: card.seriesColumn,\r\n                  ...(card.radarMax === undefined ? {} : { radarMax: card.radarMax }),\r\n                  ...(card.lineColumns === undefined ? {} : { lineColumns: card.lineColumns }),\r\n                  ...(card.axisUnits === undefined ? {} : { axisUnits: card.axisUnits }),\r\n                },\r\n                columnLabels: card.columnLabels,\r\n                data: rows,\r\n              },\r\n            },\r\n          }\r\n        }\r\n        return {\r\n          kind: 'card',\r\n          id: `${card.artifactId}:table:${cardIndex}`,\r\n          cardKind: 'table',\r\n          group: presentationGroup,\r\n          placement: 'answer',\r\n          data: {\r\n            kind: 'table',\r\n            columns,\r\n            rows,\r\n            total: card.rowCount,\r\n            truncated: card.truncated,\r\n            evidenceId: card.evidenceId,\r\n            datasetId: card.datasetId,\r\n            artifactId: card.artifactId,\r\n          },\r\n        }\r\n      })\r\n      const inlineLayout = isCompletePresentationLayout(event.payload)\r\n        ? event.payload.layout\r\n        : undefined\r\n      const renderableParts: Part[] = []\r\n      let currentAnchorId: string | undefined\r\n      if (inlineLayout !== undefined) {\r\n        inlineLayout.forEach((block, layoutIndex) => {\r\n          if (block.kind === 'markdown') {\r\n            currentAnchorId = `presentation:${event.seq}:markdown:${layoutIndex}`\r\n            renderableParts.push({\r\n              kind: 'text',\r\n              partId: currentAnchorId,\r\n              text: block.text,\r\n            })\r\n            return\r\n          }\r\n          const card = cardParts[block.cardIndex]!\r\n          renderableParts.push({\r\n            ...card,\r\n            ...(currentAnchorId === undefined ? {} : { anchorId: currentAnchorId }),\r\n          })\r\n        })\r\n      } else {\r\n        renderableParts.push(...cardParts)\r\n      }\r\n      const webSources = (event.payload.sources ?? []).flatMap((raw) => {\r\n        const source = coerceWebSource(raw)\r\n        return source === undefined ? [] : [source]\r\n      })\r\n      const sourceParts: CardPart[] = webSources.length === 0 ? [] : [{\r\n        kind: 'card',\r\n        id: `presentation:${event.seq}:web-sources`,\r\n        cardKind: 'source',\r\n        group: `presentation:${event.seq}:web-sources`,\r\n        placement: 'answer',\r\n        data: {\r\n          kind: 'source',\r\n          items: webSources.map(source => ({ kind: 'web' as const, ...source })),\r\n        },\r\n      }]\r\n      const artifactParts: Part[] = []\r\n      for (const raw of event.payload.attachments ?? []) {\r\n        const ref = coerceArtifactRef(raw)\r\n        if (!ref) {\r\n          console.warn('[agentic-core] presentation attachment failed validation; skipped', { seq: event.seq })\r\n          continue\r\n        }\r\n        const previousIndex = artifactParts.findIndex(\r\n          part => part.kind === 'artifact' && part.artifact.artifactId === ref.artifactId,\r\n        )\r\n        if (previousIndex >= 0) artifactParts.splice(previousIndex, 1, { kind: 'artifact', artifact: ref })\r\n        else artifactParts.push({ kind: 'artifact', artifact: ref })\r\n      }\r\n      const start = msg.parts.length\r\n      const nextIdx = { ...state._idx, byCardId: new Map(state._idx.byCardId) }\r\n      const answerParts = [...renderableParts, ...sourceParts]\r\n      answerParts.forEach((part, index) => {\r\n        if (part.kind === 'card') nextIdx.byCardId.set(part.id, start + 1 + index)\r\n      })\r\n      const nextMsg: MessageSnapshot = {\r\n        ...msg,\r\n        parts: [...clearPreviews(msg.parts), presentation, ...answerParts, ...artifactParts],\r\n      }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // card (upsert by id; later overrides earlier: loading→ready)\r\n    // -------------------------------------------------------------------------\r\n    case 'card': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const existing = state._idx.byCardId.get(event.id)\r\n      const newPart: CardPart = {\r\n        kind: 'card',\r\n        id: event.id,\r\n        cardKind: event.kind,\r\n        data: event.data,\r\n        group: event.group,\r\n        placement: event.placement,\r\n        anchorId: event.anchorId,\r\n        transient: event.transient,\r\n        status: event.status,\r\n      }\r\n      if (existing !== undefined) {\r\n        // Upsert: replace in place\r\n        const nextMsg: MessageSnapshot = {\r\n          ...msg,\r\n          parts: replacePart(msg.parts, existing, newPart),\r\n        }\r\n        return {\r\n          ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n          lastSeq: nextSeq,\r\n        }\r\n      }\r\n      // New card: append\r\n      const idx = msg.parts.length\r\n      const nextIdx = { ...state._idx, byCardId: new Map(state._idx.byCardId) }\r\n      nextIdx.byCardId.set(event.id, idx)\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    case 'card.patch': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const idx = state._idx.byCardId.get(event.id)\r\n      if (idx === undefined) return { ...state, lastSeq: nextSeq }\r\n      const part = msg.parts[idx] as CardPart\r\n      // Apply patch to CardData (cast through unknown for type safety)\r\n      const patchedData = applyPatch(\r\n        part.data as unknown as Record<string, unknown>,\r\n        event.patch,\r\n      ) as unknown as CardData\r\n      const updated: CardPart = { ...part, data: patchedData }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: replacePart(msg.parts, idx, updated) }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // stage (deterministic pipeline progress; append in order, no de-dup)\r\n    // -------------------------------------------------------------------------\r\n    case 'stage': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const newPart: StagePart = {\r\n        kind: 'stage',\r\n        stageId: event.stageId,\r\n        seq: event.seq,\r\n        label: event.label,\r\n        phase: event.phase,\r\n        progress: event.progress,\r\n        group: event.group,\r\n        progressId: event.progressId,\r\n        stepId: event.stepId,\r\n        status: event.status,\r\n        attempt: event.attempt,\r\n        elapsedMs: event.elapsedMs,\r\n        safeSummary: event.safeSummary,\r\n        occurredAt: event.occurredAt,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // plan trace (the backend emits a full, versioned snapshot on every change)\r\n    // -------------------------------------------------------------------------\r\n    case 'plan.trace': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const newPart: PlanPart = {\r\n        kind: 'plan',\r\n        runId: event.runId,\r\n        messageId: event.messageId,\r\n        planId: event.planId,\r\n        planName: event.planName,\r\n        state: event.state,\r\n        version: event.version,\r\n        tasks: event.tasks,\r\n      }\r\n      const existing = state._idx.byPlanId.get(event.planId)\r\n      if (existing !== undefined) {\r\n        const current = msg.parts[existing] as PlanPart\r\n        if (event.version < current.version) {\r\n          return { ...state, lastSeq: nextSeq }\r\n        }\r\n        const nextMsg: MessageSnapshot = {\r\n          ...msg,\r\n          parts: replacePart(msg.parts, existing, newPart),\r\n        }\r\n        return {\r\n          ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n          lastSeq: nextSeq,\r\n        }\r\n      }\r\n\r\n      const idx = msg.parts.length\r\n      const nextIdx = { ...state._idx, byPlanId: new Map(state._idx.byPlanId) }\r\n      nextIdx.byPlanId.set(event.planId, idx)\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // action center\r\n    // -------------------------------------------------------------------------\r\n    case 'action.proposed': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const newPart: ActionPart = {\r\n        kind: 'action',\r\n        actionId: event.actionId,\r\n        title: event.title,\r\n        summary: event.summary,\r\n        riskLevel: event.riskLevel,\r\n        params: event.params,\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts: [...msg.parts, newPart] }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // clarify\r\n    // -------------------------------------------------------------------------\r\n    case 'clarify': {\r\n      if (!msg) return { ...state, lastSeq: nextSeq }\r\n      const newPart: ClarifyPart = {\r\n        kind: 'clarify',\r\n        requestId: event.requestId,\r\n        questions: event.questions,\r\n      }\r\n      const existingIndex = state._idx.byRequestId.get(event.requestId)\r\n      const parts = existingIndex === undefined\r\n        ? [...msg.parts, newPart]\r\n        : replacePart(msg.parts, existingIndex, newPart)\r\n      const nextIdx = existingIndex === undefined\r\n        ? { ...state._idx, byRequestId: new Map(state._idx.byRequestId) }\r\n        : state._idx\r\n      if (existingIndex === undefined) {\r\n        nextIdx.byRequestId.set(event.requestId, msg.parts.length)\r\n      }\r\n      const nextMsg: MessageSnapshot = { ...msg, parts }\r\n      return {\r\n        ...withMessages(state, replaceLast(state.messages, nextMsg)),\r\n        lastSeq: nextSeq,\r\n        _idx: nextIdx,\r\n      }\r\n    }\r\n\r\n    // -------------------------------------------------------------------------\r\n    // Forward-compat: unknown event types are silently ignored (never throw)\r\n    // -------------------------------------------------------------------------\r\n    default: {\r\n      // TypeScript exhaustiveness: this branch is unreachable with known events,\r\n      // but at runtime unknown future types fall through safely.\r\n      return { ...state, lastSeq: nextSeq }\r\n    }\r\n  }\r\n}\r\n\r\nfunction hasCompletePresentationLayout(message: MessageSnapshot): boolean {\r\n  return message.parts.some(part =>\r\n    part.kind === 'presentation' && isCompletePresentationLayout(part.projection))\r\n}\r\n\r\nfunction clearPreviews(parts: Part[]): Part[] {\r\n  return parts.map(part => part.kind === 'text' && part.provisional ? { ...part, text: '' } : part)\r\n}\r\n\r\nfunction isCompletePresentationLayout(projection: DshPresentationProjection): boolean {\r\n  const layout = projection.layout\r\n  if (layout === undefined || layout.length === 0 || layout[0]?.kind !== 'markdown') return false\r\n  const cardIndexes = new Set<number>()\r\n  for (const block of layout) {\r\n    if (block.kind === 'markdown') {\r\n      if (block.text.trim().length === 0) return false\r\n      continue\r\n    }\r\n    if (!Number.isSafeInteger(block.cardIndex)\r\n      || block.cardIndex < 0\r\n      || block.cardIndex >= projection.cards.length\r\n      || cardIndexes.has(block.cardIndex)) return false\r\n    cardIndexes.add(block.cardIndex)\r\n  }\r\n  return cardIndexes.size === projection.cards.length\r\n}\r\n\r\nfunction coerceWebSource(value: unknown): {\r\n  url: string\r\n  title?: string\r\n  snippet?: string\r\n  publishedAt?: string\r\n} | undefined {\r\n  if (typeof value !== 'object' || value === null || Array.isArray(value)) return undefined\r\n  const source = value as Record<string, unknown>\r\n  if (typeof source.url !== 'string' || source.url.length > 2_048) return undefined\r\n  try {\r\n    const parsed = new URL(source.url)\r\n    if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return undefined\r\n  } catch {\r\n    return undefined\r\n  }\r\n  const optional = [\r\n    ['title', 512], ['snippet', 4_000], ['publishedAt', 128],\r\n  ] as const\r\n  const result: { url: string; title?: string; snippet?: string; publishedAt?: string } = {\r\n    url: source.url,\r\n  }\r\n  for (const [key, maximum] of optional) {\r\n    const candidate = source[key]\r\n    if (candidate === undefined) continue\r\n    if (typeof candidate !== 'string' || candidate.trim().length === 0\r\n      || candidate.length > maximum) return undefined\r\n    result[key] = candidate\r\n  }\r\n  return result\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// reduceAll\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Convenience fold: reduce an entire ordered sequence of events from scratch.\r\n * Equivalent to `events.reduce(reduce, initialState())`.\r\n */\r\nexport function reduceAll(events: StreamEvent[]): ReduceState {\r\n  return events.reduce(reduce, initialState())\r\n}\r\n"],"names":["step","generateId","nextMsg","part"],"mappings":"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"}