@athenaintel/react 0.59.0 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +52 -19
  2. package/dist/agent-runtime/src/composer-markdown.cjs +0 -16
  3. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  4. package/dist/agent-runtime/src/composer-markdown.js +1 -17
  5. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  6. package/dist/agent-runtime/src/named-agents.js +1 -1
  7. package/dist/agent-runtime/src/offline-status.cjs.map +1 -1
  8. package/dist/agent-runtime/src/offline-status.d.ts +27 -0
  9. package/dist/agent-runtime/src/offline-status.js.map +1 -1
  10. package/dist/agent-runtime/src/tool-metadata.cjs +7 -0
  11. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  12. package/dist/agent-runtime/src/tool-metadata.js +7 -0
  13. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  14. package/dist/chat/AthenaChat.cjs +15 -5
  15. package/dist/chat/AthenaChat.cjs.map +1 -1
  16. package/dist/chat/AthenaChat.js +16 -6
  17. package/dist/chat/AthenaChat.js.map +1 -1
  18. package/dist/chat-ui/index.cjs +2 -0
  19. package/dist/chat-ui/index.cjs.map +1 -1
  20. package/dist/chat-ui/index.d.ts +1 -0
  21. package/dist/chat-ui/index.js +2 -0
  22. package/dist/chat-ui/index.js.map +1 -1
  23. package/dist/chat-ui/mentions/mention-chip.cjs +9 -3
  24. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  25. package/dist/chat-ui/mentions/mention-chip.js +9 -3
  26. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  27. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs +18 -2
  28. package/dist/chat-ui/mentions/suggestions/components/mention-icon.cjs.map +1 -1
  29. package/dist/chat-ui/mentions/suggestions/components/mention-icon.d.ts +10 -1
  30. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js +19 -3
  31. package/dist/chat-ui/mentions/suggestions/components/mention-icon.js.map +1 -1
  32. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +9 -0
  33. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  34. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +6 -0
  35. package/dist/chat-ui/mentions/suggestions/data/api-client.js +9 -0
  36. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  37. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs +89 -0
  38. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.cjs.map +1 -0
  39. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.d.ts +8 -0
  40. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js +89 -0
  41. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icon-names.generated.js.map +1 -0
  42. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs +140 -116
  43. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.cjs.map +1 -1
  44. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.d.ts +46 -12
  45. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js +141 -117
  46. package/dist/chat-ui/mentions/suggestions/data/sources/asset-type-icons.js.map +1 -1
  47. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs +37 -6
  48. package/dist/chat-ui/mentions/suggestions/data/sources/index.cjs.map +1 -1
  49. package/dist/chat-ui/mentions/suggestions/data/sources/index.js +39 -8
  50. package/dist/chat-ui/mentions/suggestions/data/sources/index.js.map +1 -1
  51. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs +12 -0
  52. package/dist/chat-ui/mentions/use-asset-icon-app-url.cjs.map +1 -0
  53. package/dist/chat-ui/mentions/use-asset-icon-app-url.d.ts +8 -0
  54. package/dist/chat-ui/mentions/use-asset-icon-app-url.js +12 -0
  55. package/dist/chat-ui/mentions/use-asset-icon-app-url.js.map +1 -0
  56. package/dist/collab/client.cjs +24 -1
  57. package/dist/collab/client.cjs.map +1 -1
  58. package/dist/collab/client.d.ts +16 -0
  59. package/dist/collab/client.js +24 -1
  60. package/dist/collab/client.js.map +1 -1
  61. package/dist/composer/attached-references.js +1 -1
  62. package/dist/composer/staged-message-metadata.cjs +12 -0
  63. package/dist/composer/staged-message-metadata.cjs.map +1 -0
  64. package/dist/composer/staged-message-metadata.d.ts +15 -0
  65. package/dist/composer/staged-message-metadata.js +12 -0
  66. package/dist/composer/staged-message-metadata.js.map +1 -0
  67. package/dist/data/athena-request.cjs +2 -0
  68. package/dist/data/athena-request.cjs.map +1 -1
  69. package/dist/data/athena-request.js +2 -0
  70. package/dist/data/athena-request.js.map +1 -1
  71. package/dist/provider/AthenaProvider.cjs +4 -3
  72. package/dist/provider/AthenaProvider.cjs.map +1 -1
  73. package/dist/provider/AthenaProvider.js +4 -3
  74. package/dist/provider/AthenaProvider.js.map +1 -1
  75. package/dist/react/package.json.cjs +1 -1
  76. package/dist/react/package.json.js +1 -1
  77. package/dist/references/src/anchors/parse.cjs +11 -1
  78. package/dist/references/src/anchors/parse.cjs.map +1 -1
  79. package/dist/references/src/anchors/parse.js +11 -1
  80. package/dist/references/src/anchors/parse.js.map +1 -1
  81. package/dist/references/src/anchors/schemas.d.ts +1 -0
  82. package/dist/references/src/anchors/serialize.cjs +1 -0
  83. package/dist/references/src/anchors/serialize.cjs.map +1 -1
  84. package/dist/references/src/anchors/serialize.js +1 -0
  85. package/dist/references/src/anchors/serialize.js.map +1 -1
  86. package/dist/references/src/anchors/types.cjs.map +1 -1
  87. package/dist/references/src/anchors/types.d.ts +9 -0
  88. package/dist/references/src/anchors/types.js.map +1 -1
  89. package/dist/references/src/schemas.d.ts +2 -0
  90. package/dist/runtime/useAthenaStatewireRuntime.cjs +6 -8
  91. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  92. package/dist/runtime/useAthenaStatewireRuntime.js +6 -8
  93. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  94. package/dist/threads/statewire-thread-list.cjs +14 -2
  95. package/dist/threads/statewire-thread-list.cjs.map +1 -1
  96. package/dist/threads/statewire-thread-list.d.ts +11 -2
  97. package/dist/threads/statewire-thread-list.js +14 -2
  98. package/dist/threads/statewire-thread-list.js.map +1 -1
  99. package/dist/tools/drive-tool-uis.cjs +8 -4
  100. package/dist/tools/drive-tool-uis.cjs.map +1 -1
  101. package/dist/tools/drive-tool-uis.d.ts +5 -4
  102. package/dist/tools/drive-tool-uis.js +9 -5
  103. package/dist/tools/drive-tool-uis.js.map +1 -1
  104. package/dist/version.cjs +4 -0
  105. package/dist/version.cjs.map +1 -1
  106. package/dist/version.d.ts +9 -0
  107. package/dist/version.js +4 -0
  108. package/dist/version.js.map +1 -1
  109. package/dist/workbench/live-desktop-api.cjs +2 -1
  110. package/dist/workbench/live-desktop-api.cjs.map +1 -1
  111. package/dist/workbench/live-desktop-api.js +2 -1
  112. package/dist/workbench/live-desktop-api.js.map +1 -1
  113. package/dist/workbench/session-workspace-api.cjs +7 -2
  114. package/dist/workbench/session-workspace-api.cjs.map +1 -1
  115. package/dist/workbench/session-workspace-api.d.ts +10 -0
  116. package/dist/workbench/session-workspace-api.js +7 -2
  117. package/dist/workbench/session-workspace-api.js.map +1 -1
  118. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parse.cjs","sources":["../../../../../references/src/anchors/parse.ts"],"sourcesContent":["import { fileLineRangeAnchorProblem } from './file-line-range';\nimport type {\n Anchor,\n AnchorType,\n FileLineRangeAnchor,\n QueryResultRelationship,\n SemanticQueryAnchor,\n SqlQueryAnchor,\n} from './types';\nimport { isAnchorType, LEGACY_ANCHOR_TYPES } from './types';\n\n/**\n * Parse snake_case URL query parameters into a camelCase Anchor object.\n *\n * Expects `params` to contain `anchor=<type>` plus type-specific params.\n * Returns `undefined` if the anchor type is missing or unrecognized.\n */\nexport function parseAnchorFromParams(params: URLSearchParams): Anchor | undefined {\n const rawType = params.get('anchor');\n const anchorType = rawType == null ? undefined : (LEGACY_ANCHOR_TYPES[rawType] ?? rawType);\n if (!anchorType || !isAnchorType(anchorType)) return undefined;\n\n return parseAnchorByType(anchorType, params);\n}\n\nfunction requireString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = params.get(key) ?? legacyKeys.map((k) => params.get(k)).find((v) => v != null);\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n return value;\n}\n\nfunction requireNonEmptyString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = requireString(params, key, ...legacyKeys);\n if (value.trim().length === 0) throw new Error(`Anchor param must be non-empty: ${key}`);\n return value;\n}\n\nfunction requireInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseInt(raw, 10);\n if (Number.isNaN(n)) throw new Error(`Invalid integer for anchor param ${key}: ${raw}`);\n return n;\n}\n\nconst POSITIVE_INT = /^[1-9]\\d*$/;\n\n/** Strict 1-based ordinal: the whole value must be digits, no leading zeros, ≥ 1. */\nfunction requirePositiveInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key).trim();\n if (!POSITIVE_INT.test(raw)) {\n throw new Error(`Anchor param must be a positive integer: ${key}: ${raw}`);\n }\n return Number(raw);\n}\n\n/**\n * One value for `key`, refused when the parameter repeats. Clio's strict\n * anchor parser refuses a repeated parameter; `URLSearchParams.get` would\n * silently keep the first one.\n */\nfunction requireSingle(params: URLSearchParams, key: string): string {\n const values = params.getAll(key);\n const [value] = values;\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n if (values.length > 1) throw new Error(`Anchor param must not repeat: ${key}`);\n return value;\n}\n\nconst ASCII_DECIMAL = /^\\d+$/;\n/** Python's `int()` refuses a decimal string longer than this (`sys.get_int_max_str_digits()`). */\nconst PYTHON_INT_MAX_STR_DIGITS = 4300;\n\n/**\n * A line number as Clio's anchor parser reads it: ASCII decimal digits only\n * (a Unicode digit, a sign, or a numeral too long for Python's `int()` is\n * malformed). The `[1, MAX_LINE_NUMBER]` bound is `fileLineRangeAnchorProblem`'s;\n * every numeral `Number()` cannot hold exactly also exceeds that bound, so no\n * separate integer-precision check is observable here.\n */\nfunction requireAsciiDecimal(params: URLSearchParams, key: string): number {\n const raw = requireSingle(params, key);\n if (!ASCII_DECIMAL.test(raw)) {\n throw new Error(`Anchor param must be an ASCII decimal: ${key}: ${raw}`);\n }\n if (raw.length > PYTHON_INT_MAX_STR_DIGITS) {\n throw new Error(`Anchor param is too long to be an integer: ${key}`);\n }\n return Number(raw);\n}\n\n/**\n * `anchor=file_line_range&path=…&start_line=…&end_line=…` (any parameter\n * order), refused on any rule Clio's `LineRangeLocator` refuses so a malformed\n * or unstorable anchor never resolves to a wrong file or line.\n *\n * Wire strictness mirrors Clio's anchor parser as far as `URLSearchParams`\n * can observe it: a repeated `path` / `start_line` / `end_line` is refused,\n * and so is a path containing U+FFFD — what `URLSearchParams` makes of a\n * malformed percent-escape, which Clio refuses outright (this also refuses a\n * literal `%EF%BF%BD`, which Clio would accept; nothing sensible puts U+FFFD\n * in a path). A stray `&&` or a pair without `=` is malformed to Clio but\n * invisible here — `URLSearchParams` drops or normalizes it before this parser\n * runs — so the parity claim stops at what the transport lets through.\n */\nfunction parseFileLineRange(params: URLSearchParams): FileLineRangeAnchor {\n const path = requireSingle(params, 'path');\n if (path.includes('\\uFFFD')) {\n throw new Error('path must not contain U+FFFD (a malformed percent-escape)');\n }\n const anchor: FileLineRangeAnchor = {\n type: 'file_line_range',\n path,\n startLine: requireAsciiDecimal(params, 'start_line'),\n endLine: requireAsciiDecimal(params, 'end_line'),\n };\n const problem = fileLineRangeAnchorProblem(anchor);\n if (problem) throw new Error(problem);\n return anchor;\n}\n\n/**\n * Parse a sheet_id that may be a numeric ID (common) or a string ID (legacy).\n * Legacy content sometimes stored sheetId as a string (e.g. \"sheet_1\").\n * Returns a number when possible, falling back to 0 for non-numeric values\n * to avoid silently dropping the entire anchor.\n */\nfunction parseSheetId(params: URLSearchParams): number {\n const raw = requireString(params, 'sheet_id');\n const n = Number.parseInt(raw, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction requireFloat(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) throw new Error(`Invalid number for anchor param ${key}: ${raw}`);\n return n;\n}\n\n/** Parse a JSON object param. Throws (caught upstream → undefined anchor) on non-objects. */\nfunction parseJsonObject(raw: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('Expected a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Parse a JSON string-map param (e.g. a row key), coercing all values to strings. */\nfunction parseStringRecord(raw: string): Record<string, string> {\n return Object.fromEntries(\n Object.entries(parseJsonObject(raw)).map(([key, value]) => [key, String(value)])\n );\n}\n\n/**\n * An optional provenance map param. Provenance only adds information, so an\n * unreadable value is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStringRecord(raw: string | null): Record<string, string> | undefined {\n if (raw == null) return undefined;\n try {\n return parseStringRecord(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The engine shift-log frontier a `sheet_range` anchor was taken at (writer id → seq, a JSON object\n * of non-negative integers). It only adds information — a range without one resolves to its stored\n * A1 — so an unreadable value is dropped instead of failing the whole anchor. An empty object is a\n * real frontier (a document with no structural edit journaled yet) and is kept.\n */\nfunction parseOptionalShiftLogFrontier(raw: string | null): Record<string, number> | undefined {\n if (raw == null) return undefined;\n try {\n const frontier: Record<string, number> = {};\n for (const [writer, seq] of Object.entries(parseJsonObject(raw))) {\n if (typeof seq !== 'number' || !Number.isInteger(seq) || seq < 0) return undefined;\n frontier[writer] = seq;\n }\n return frontier;\n } catch {\n return undefined;\n }\n}\n\nfunction parseRelationship(raw: string | null): QueryResultRelationship | undefined {\n return raw === 'exact' || raw === 'supporting' ? raw : undefined;\n}\n\nfunction parseAnchorByType(anchorType: AnchorType, params: URLSearchParams): Anchor | undefined {\n try {\n switch (anchorType) {\n case 'cell':\n return { type: 'cell', cellId: requireString(params, 'cell_id') };\n\n case 'cell_range':\n return {\n type: 'cell_range',\n startCellId: requireString(params, 'start_cell_id'),\n endCellId: requireString(params, 'end_cell_id'),\n };\n\n case 'comment':\n return {\n type: 'comment',\n threadId: requireString(params, 'thread_id'),\n commentId: requireString(params, 'comment_id'),\n };\n\n case 'comment_thread':\n return {\n type: 'comment_thread',\n threadId: requireString(params, 'thread_id'),\n };\n\n case 'file_line_range':\n return parseFileLineRange(params);\n\n case 'line':\n return { type: 'line', line: requireInt(params, 'line') };\n\n case 'line_range':\n return {\n type: 'line_range',\n startLine: requireInt(params, 'start_line'),\n endLine: requireInt(params, 'end_line'),\n };\n\n case 'msg':\n return { type: 'msg', messageId: requireNonEmptyString(params, 'msg_id', 'message_id') };\n\n case 'msg_range':\n return {\n type: 'msg_range',\n startMessageId: requireNonEmptyString(params, 'start_msg_id', 'start_message_id'),\n endMessageId: requireNonEmptyString(params, 'end_msg_id', 'end_message_id'),\n };\n\n case 'msg_block': {\n const hash = params.get('hash');\n return {\n type: 'msg_block',\n messageId: requireNonEmptyString(params, 'msg_id'),\n block: requirePositiveInt(params, 'block'),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'msg_section': {\n const nth = params.get('nth') != null ? requirePositiveInt(params, 'nth') : undefined;\n return {\n type: 'msg_section',\n messageId: requireNonEmptyString(params, 'msg_id'),\n heading: requireNonEmptyString(params, 'heading'),\n ...(nth != null ? { nth } : {}),\n };\n }\n\n case 'msg_text': {\n const block = params.get('block') != null ? requirePositiveInt(params, 'block') : undefined;\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n return {\n type: 'msg_text',\n messageId: requireNonEmptyString(params, 'msg_id'),\n text: requireNonEmptyString(params, 'text'),\n ...(block != null ? { block } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n }\n\n case 'page':\n return { type: 'page', page: requireInt(params, 'page') };\n\n case 'page_range':\n return {\n type: 'page_range',\n startPage: requireInt(params, 'start_page'),\n endPage: requireInt(params, 'end_page'),\n };\n\n case 'page_rect': {\n const unitRaw = params.get('unit');\n return {\n type: 'page_rect',\n page: requireInt(params, 'page'),\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n ...(unitRaw === 'percent' || unitRaw === 'point' ? { unit: unitRaw } : {}),\n };\n }\n\n case 'page_text': {\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n const hash = params.get('hash');\n return {\n type: 'page_text',\n page: requireInt(params, 'page'),\n text: requireString(params, 'text'),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'path': {\n const line = params.get('line') != null ? requireInt(params, 'line') : undefined;\n const column =\n line != null && params.get('column') != null ? requireInt(params, 'column') : undefined;\n return {\n type: 'path',\n path: requireString(params, 'path'),\n ...(line != null ? { line } : {}),\n ...(column != null ? { column } : {}),\n };\n }\n\n case 'pixel_range':\n return {\n type: 'pixel_range',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n case 'pm_node':\n return { type: 'pm_node', nodeId: requireString(params, 'node_id') };\n\n case 'pm_node_range':\n return {\n type: 'pm_node_range',\n startNodeId: requireString(params, 'start_node_id'),\n endNodeId: requireString(params, 'end_node_id'),\n };\n\n case 'pm_mark':\n return { type: 'pm_mark', markId: requireString(params, 'mark_id') };\n\n case 'rect':\n return {\n type: 'rect',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n\n case 'section': {\n const topic = params.get('topic') != null ? requirePositiveInt(params, 'topic') : undefined;\n return {\n type: 'section',\n section: requireString(params, 'section'),\n ...(topic != null ? { topic } : {}),\n };\n }\n\n case 'semantic_query': {\n const anchor: SemanticQueryAnchor = {\n type: 'semantic_query',\n query: parseJsonObject(requireString(params, 'query')),\n };\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n if (params.get('schema_version') != null) {\n anchor.schemaVersion = requireInt(params, 'schema_version');\n }\n const schemaHash = params.get('schema_hash');\n if (schemaHash != null) anchor.schemaHash = schemaHash;\n const sourceSnapshots = parseOptionalStringRecord(params.get('source_snapshots'));\n if (sourceSnapshots != null) anchor.sourceSnapshots = sourceSnapshots;\n const dataAsOf = params.get('data_as_of');\n if (dataAsOf != null) anchor.dataAsOf = dataAsOf;\n return anchor;\n }\n\n case 'shape': {\n const shapeIds = requireString(params, 'shape_ids')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (shapeIds.length === 0) {\n throw new Error('Anchor param must be non-empty: shape_ids');\n }\n const shapeSlideId = params.get('slide_id');\n const shapeSlideIndexRaw = params.get('slide_index');\n return {\n type: 'shape',\n shapeIds,\n ...(shapeSlideId != null ? { slideId: shapeSlideId } : {}),\n ...(shapeSlideIndexRaw != null\n ? { slideIndex: requireInt(params, 'slide_index') }\n : {}),\n };\n }\n\n case 'sheet_cell': {\n const chartId = params.get('chart');\n return {\n type: 'sheet_cell',\n sheetId: parseSheetId(params),\n cell: requireString(params, 'cell'),\n ...(chartId ? { chartId } : {}),\n };\n }\n\n case 'sheet_range': {\n const frontier = parseOptionalShiftLogFrontier(params.get('frontier'));\n return {\n type: 'sheet_range',\n sheetId: parseSheetId(params),\n range: requireString(params, 'range'),\n ...(frontier ? { frontier } : {}),\n };\n }\n\n case 'sheet_tab':\n return {\n type: 'sheet_tab',\n sheetId: parseSheetId(params),\n };\n\n case 'sheet_table': {\n const fallbackRange = params.get('fallback_range');\n return {\n type: 'sheet_table',\n sheetId: parseSheetId(params),\n tableName: requireString(params, 'table_name'),\n ...(fallbackRange != null ? { fallbackRange } : {}),\n };\n }\n\n case 'lakehouse_table': {\n const tableUuid = params.get('table_uuid');\n const snapshotId = params.get('snapshot_id');\n return {\n type: 'lakehouse_table',\n table: requireString(params, 'table'),\n ...(tableUuid ? { tableUuid } : {}),\n ...(snapshotId ? { snapshotId } : {}),\n };\n }\n\n case 'slide': {\n let slideId = params.get('slide_id');\n let slideIndex = params.get('slide_index') != null ? requireInt(params, 'slide_index') : undefined;\n // Forgiving alias: anchor=slide&slide=<value>. An integer is a 1-based\n // position (matching the \"Slide N\" headers agents see in deck reads);\n // anything else is treated as a slide id.\n const bareSlide = params.get('slide');\n if (bareSlide != null && slideId == null && slideIndex == null) {\n const n = Number.parseInt(bareSlide, 10);\n if (Number.isNaN(n)) {\n slideId = bareSlide;\n } else {\n slideIndex = n;\n }\n }\n if (slideId == null && slideIndex == null) {\n throw new Error('Provide slide_id and/or slide_index (1-based)');\n }\n return {\n type: 'slide',\n ...(slideId != null ? { slideId } : {}),\n ...(slideIndex != null ? { slideIndex } : {}),\n };\n }\n\n case 'sql_query': {\n const anchor: SqlQueryAnchor = { type: 'sql_query' };\n const sql = params.get('sql');\n if (sql != null) anchor.sql = sql;\n const snippetId = params.get('query_snippet_asset_id');\n if (snippetId != null) anchor.querySnippetAssetId = snippetId;\n const dialect = params.get('dialect');\n if (dialect != null) anchor.dialect = dialect;\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n // A sql_query anchor with no SQL and no snippet reference carries no\n // provenance — reject it rather than emit a payload-less shell.\n if (anchor.sql === undefined && anchor.querySnippetAssetId === undefined) {\n return undefined;\n }\n return anchor;\n }\n\n case 'time':\n return { type: 'time', time: requireString(params, 'time') };\n\n case 'time_range':\n return {\n type: 'time_range',\n startTime: requireString(params, 'start_time'),\n endTime: requireString(params, 'end_time'),\n };\n\n case 'tool_call': {\n const messageId = params.get('msg_id') ?? params.get('message_id');\n return {\n type: 'tool_call',\n toolCallId: requireString(params, 'tool_call_id'),\n ...(messageId ? { messageId } : {}),\n };\n }\n\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n"],"names":["LEGACY_ANCHOR_TYPES","isAnchorType","fileLineRangeAnchorProblem"],"mappings":"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"}
1
+ {"version":3,"file":"parse.cjs","sources":["../../../../../references/src/anchors/parse.ts"],"sourcesContent":["import { fileLineRangeAnchorProblem } from './file-line-range';\nimport type {\n Anchor,\n AnchorType,\n FileLineRangeAnchor,\n QueryResultRelationship,\n SemanticQueryAnchor,\n SqlQueryAnchor,\n} from './types';\nimport { isAnchorType, LEGACY_ANCHOR_TYPES } from './types';\n\n/**\n * Parse snake_case URL query parameters into a camelCase Anchor object.\n *\n * Expects `params` to contain `anchor=<type>` plus type-specific params.\n * Returns `undefined` if the anchor type is missing or unrecognized.\n */\nexport function parseAnchorFromParams(params: URLSearchParams): Anchor | undefined {\n const rawType = params.get('anchor');\n const anchorType = rawType == null ? undefined : (LEGACY_ANCHOR_TYPES[rawType] ?? rawType);\n if (!anchorType || !isAnchorType(anchorType)) return undefined;\n\n return parseAnchorByType(anchorType, params);\n}\n\nfunction requireString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = params.get(key) ?? legacyKeys.map((k) => params.get(k)).find((v) => v != null);\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n return value;\n}\n\nfunction requireNonEmptyString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = requireString(params, key, ...legacyKeys);\n if (value.trim().length === 0) throw new Error(`Anchor param must be non-empty: ${key}`);\n return value;\n}\n\nfunction requireInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseInt(raw, 10);\n if (Number.isNaN(n)) throw new Error(`Invalid integer for anchor param ${key}: ${raw}`);\n return n;\n}\n\nconst POSITIVE_INT = /^[1-9]\\d*$/;\n\n/** Strict 1-based ordinal: the whole value must be digits, no leading zeros, ≥ 1. */\nfunction requirePositiveInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key).trim();\n if (!POSITIVE_INT.test(raw)) {\n throw new Error(`Anchor param must be a positive integer: ${key}: ${raw}`);\n }\n return Number(raw);\n}\n\n/**\n * One value for `key`, refused when the parameter repeats. Clio's strict\n * anchor parser refuses a repeated parameter; `URLSearchParams.get` would\n * silently keep the first one.\n */\nfunction requireSingle(params: URLSearchParams, key: string): string {\n const values = params.getAll(key);\n const [value] = values;\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n if (values.length > 1) throw new Error(`Anchor param must not repeat: ${key}`);\n return value;\n}\n\nconst ASCII_DECIMAL = /^\\d+$/;\n/** Python's `int()` refuses a decimal string longer than this (`sys.get_int_max_str_digits()`). */\nconst PYTHON_INT_MAX_STR_DIGITS = 4300;\n\n/**\n * A line number as Clio's anchor parser reads it: ASCII decimal digits only\n * (a Unicode digit, a sign, or a numeral too long for Python's `int()` is\n * malformed). The `[1, MAX_LINE_NUMBER]` bound is `fileLineRangeAnchorProblem`'s;\n * every numeral `Number()` cannot hold exactly also exceeds that bound, so no\n * separate integer-precision check is observable here.\n */\nfunction requireAsciiDecimal(params: URLSearchParams, key: string): number {\n const raw = requireSingle(params, key);\n if (!ASCII_DECIMAL.test(raw)) {\n throw new Error(`Anchor param must be an ASCII decimal: ${key}: ${raw}`);\n }\n if (raw.length > PYTHON_INT_MAX_STR_DIGITS) {\n throw new Error(`Anchor param is too long to be an integer: ${key}`);\n }\n return Number(raw);\n}\n\n/**\n * `anchor=file_line_range&path=…&start_line=…&end_line=…` (any parameter\n * order), refused on any rule Clio's `LineRangeLocator` refuses so a malformed\n * or unstorable anchor never resolves to a wrong file or line.\n *\n * Wire strictness mirrors Clio's anchor parser as far as `URLSearchParams`\n * can observe it: a repeated `path` / `start_line` / `end_line` is refused,\n * and so is a path containing U+FFFD — what `URLSearchParams` makes of a\n * malformed percent-escape, which Clio refuses outright (this also refuses a\n * literal `%EF%BF%BD`, which Clio would accept; nothing sensible puts U+FFFD\n * in a path). A stray `&&` or a pair without `=` is malformed to Clio but\n * invisible here — `URLSearchParams` drops or normalizes it before this parser\n * runs — so the parity claim stops at what the transport lets through.\n */\nfunction parseFileLineRange(params: URLSearchParams): FileLineRangeAnchor {\n const path = requireSingle(params, 'path');\n if (path.includes('\\uFFFD')) {\n throw new Error('path must not contain U+FFFD (a malformed percent-escape)');\n }\n const anchor: FileLineRangeAnchor = {\n type: 'file_line_range',\n path,\n startLine: requireAsciiDecimal(params, 'start_line'),\n endLine: requireAsciiDecimal(params, 'end_line'),\n };\n const problem = fileLineRangeAnchorProblem(anchor);\n if (problem) throw new Error(problem);\n return anchor;\n}\n\n/**\n * Parse a sheet_id that may be a numeric ID (common) or a string ID (legacy).\n * Legacy content sometimes stored sheetId as a string (e.g. \"sheet_1\").\n * Returns a number when possible, falling back to 0 for non-numeric values\n * to avoid silently dropping the entire anchor.\n */\nfunction parseSheetId(params: URLSearchParams): number {\n const raw = requireString(params, 'sheet_id');\n const n = Number.parseInt(raw, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction requireFloat(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) throw new Error(`Invalid number for anchor param ${key}: ${raw}`);\n return n;\n}\n\n/** Parse a JSON object param. Throws (caught upstream → undefined anchor) on non-objects. */\nfunction parseJsonObject(raw: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('Expected a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Parse a JSON string-map param (e.g. a row key), coercing all values to strings. */\nfunction parseStringRecord(raw: string): Record<string, string> {\n return Object.fromEntries(\n Object.entries(parseJsonObject(raw)).map(([key, value]) => [key, String(value)])\n );\n}\n\n/**\n * An optional provenance map param. Provenance only adds information, so an\n * unreadable value is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStringRecord(raw: string | null): Record<string, string> | undefined {\n if (raw == null) return undefined;\n try {\n return parseStringRecord(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The engine shift-log frontier a `sheet_range` anchor was taken at (writer id → seq, a JSON object\n * of non-negative integers). It only adds information — a range without one resolves to its stored\n * A1 — so an unreadable value is dropped instead of failing the whole anchor. An empty object is a\n * real frontier (a document with no structural edit journaled yet) and is kept.\n */\nfunction parseOptionalShiftLogFrontier(raw: string | null): Record<string, number> | undefined {\n if (raw == null) return undefined;\n try {\n const frontier: Record<string, number> = {};\n for (const [writer, seq] of Object.entries(parseJsonObject(raw))) {\n if (typeof seq !== 'number' || !Number.isInteger(seq) || seq < 0) return undefined;\n frontier[writer] = seq;\n }\n return frontier;\n } catch {\n return undefined;\n }\n}\n\n/** The longest `stable_range` kept: an engine line anchor is a few dozen characters. */\nconst MAX_STABLE_RANGE_CHARS = 512;\nconst STABLE_RANGE = /^[A-Za-z0-9+/]+={0,2}$/;\n\n/**\n * The engine line anchor a `sheet_range` anchor carries on a stable-ids (v5) document (standard\n * padded base64, `SpreadsheetEngine.anchorRange`). Like the frontier it only adds information, so a\n * value that is not one is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStableRange(raw: string | null | undefined): string | undefined {\n if (raw == null || raw.length > MAX_STABLE_RANGE_CHARS || !STABLE_RANGE.test(raw)) {\n return undefined;\n }\n return raw;\n}\n\nfunction parseRelationship(raw: string | null): QueryResultRelationship | undefined {\n return raw === 'exact' || raw === 'supporting' ? raw : undefined;\n}\n\nfunction parseAnchorByType(anchorType: AnchorType, params: URLSearchParams): Anchor | undefined {\n try {\n switch (anchorType) {\n case 'cell':\n return { type: 'cell', cellId: requireString(params, 'cell_id') };\n\n case 'cell_range':\n return {\n type: 'cell_range',\n startCellId: requireString(params, 'start_cell_id'),\n endCellId: requireString(params, 'end_cell_id'),\n };\n\n case 'comment':\n return {\n type: 'comment',\n threadId: requireString(params, 'thread_id'),\n commentId: requireString(params, 'comment_id'),\n };\n\n case 'comment_thread':\n return {\n type: 'comment_thread',\n threadId: requireString(params, 'thread_id'),\n };\n\n case 'file_line_range':\n return parseFileLineRange(params);\n\n case 'line':\n return { type: 'line', line: requireInt(params, 'line') };\n\n case 'line_range':\n return {\n type: 'line_range',\n startLine: requireInt(params, 'start_line'),\n endLine: requireInt(params, 'end_line'),\n };\n\n case 'msg':\n return { type: 'msg', messageId: requireNonEmptyString(params, 'msg_id', 'message_id') };\n\n case 'msg_range':\n return {\n type: 'msg_range',\n startMessageId: requireNonEmptyString(params, 'start_msg_id', 'start_message_id'),\n endMessageId: requireNonEmptyString(params, 'end_msg_id', 'end_message_id'),\n };\n\n case 'msg_block': {\n const hash = params.get('hash');\n return {\n type: 'msg_block',\n messageId: requireNonEmptyString(params, 'msg_id'),\n block: requirePositiveInt(params, 'block'),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'msg_section': {\n const nth = params.get('nth') != null ? requirePositiveInt(params, 'nth') : undefined;\n return {\n type: 'msg_section',\n messageId: requireNonEmptyString(params, 'msg_id'),\n heading: requireNonEmptyString(params, 'heading'),\n ...(nth != null ? { nth } : {}),\n };\n }\n\n case 'msg_text': {\n const block = params.get('block') != null ? requirePositiveInt(params, 'block') : undefined;\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n return {\n type: 'msg_text',\n messageId: requireNonEmptyString(params, 'msg_id'),\n text: requireNonEmptyString(params, 'text'),\n ...(block != null ? { block } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n }\n\n case 'page':\n return { type: 'page', page: requireInt(params, 'page') };\n\n case 'page_range':\n return {\n type: 'page_range',\n startPage: requireInt(params, 'start_page'),\n endPage: requireInt(params, 'end_page'),\n };\n\n case 'page_rect': {\n const unitRaw = params.get('unit');\n return {\n type: 'page_rect',\n page: requireInt(params, 'page'),\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n ...(unitRaw === 'percent' || unitRaw === 'point' ? { unit: unitRaw } : {}),\n };\n }\n\n case 'page_text': {\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n const hash = params.get('hash');\n return {\n type: 'page_text',\n page: requireInt(params, 'page'),\n text: requireString(params, 'text'),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'path': {\n const line = params.get('line') != null ? requireInt(params, 'line') : undefined;\n const column =\n line != null && params.get('column') != null ? requireInt(params, 'column') : undefined;\n return {\n type: 'path',\n path: requireString(params, 'path'),\n ...(line != null ? { line } : {}),\n ...(column != null ? { column } : {}),\n };\n }\n\n case 'pixel_range':\n return {\n type: 'pixel_range',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n case 'pm_node':\n return { type: 'pm_node', nodeId: requireString(params, 'node_id') };\n\n case 'pm_node_range':\n return {\n type: 'pm_node_range',\n startNodeId: requireString(params, 'start_node_id'),\n endNodeId: requireString(params, 'end_node_id'),\n };\n\n case 'pm_mark':\n return { type: 'pm_mark', markId: requireString(params, 'mark_id') };\n\n case 'rect':\n return {\n type: 'rect',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n\n case 'section': {\n const topic = params.get('topic') != null ? requirePositiveInt(params, 'topic') : undefined;\n return {\n type: 'section',\n section: requireString(params, 'section'),\n ...(topic != null ? { topic } : {}),\n };\n }\n\n case 'semantic_query': {\n const anchor: SemanticQueryAnchor = {\n type: 'semantic_query',\n query: parseJsonObject(requireString(params, 'query')),\n };\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n if (params.get('schema_version') != null) {\n anchor.schemaVersion = requireInt(params, 'schema_version');\n }\n const schemaHash = params.get('schema_hash');\n if (schemaHash != null) anchor.schemaHash = schemaHash;\n const sourceSnapshots = parseOptionalStringRecord(params.get('source_snapshots'));\n if (sourceSnapshots != null) anchor.sourceSnapshots = sourceSnapshots;\n const dataAsOf = params.get('data_as_of');\n if (dataAsOf != null) anchor.dataAsOf = dataAsOf;\n return anchor;\n }\n\n case 'shape': {\n const shapeIds = requireString(params, 'shape_ids')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (shapeIds.length === 0) {\n throw new Error('Anchor param must be non-empty: shape_ids');\n }\n const shapeSlideId = params.get('slide_id');\n const shapeSlideIndexRaw = params.get('slide_index');\n return {\n type: 'shape',\n shapeIds,\n ...(shapeSlideId != null ? { slideId: shapeSlideId } : {}),\n ...(shapeSlideIndexRaw != null\n ? { slideIndex: requireInt(params, 'slide_index') }\n : {}),\n };\n }\n\n case 'sheet_cell': {\n const chartId = params.get('chart');\n return {\n type: 'sheet_cell',\n sheetId: parseSheetId(params),\n cell: requireString(params, 'cell'),\n ...(chartId ? { chartId } : {}),\n };\n }\n\n case 'sheet_range': {\n const frontier = parseOptionalShiftLogFrontier(params.get('frontier'));\n const stableRange = parseOptionalStableRange(params.get('stable_range'));\n return {\n type: 'sheet_range',\n sheetId: parseSheetId(params),\n range: requireString(params, 'range'),\n ...(frontier ? { frontier } : {}),\n ...(stableRange ? { stableRange } : {}),\n };\n }\n\n case 'sheet_tab':\n return {\n type: 'sheet_tab',\n sheetId: parseSheetId(params),\n };\n\n case 'sheet_table': {\n const fallbackRange = params.get('fallback_range');\n return {\n type: 'sheet_table',\n sheetId: parseSheetId(params),\n tableName: requireString(params, 'table_name'),\n ...(fallbackRange != null ? { fallbackRange } : {}),\n };\n }\n\n case 'lakehouse_table': {\n const tableUuid = params.get('table_uuid');\n const snapshotId = params.get('snapshot_id');\n return {\n type: 'lakehouse_table',\n table: requireString(params, 'table'),\n ...(tableUuid ? { tableUuid } : {}),\n ...(snapshotId ? { snapshotId } : {}),\n };\n }\n\n case 'slide': {\n let slideId = params.get('slide_id');\n let slideIndex = params.get('slide_index') != null ? requireInt(params, 'slide_index') : undefined;\n // Forgiving alias: anchor=slide&slide=<value>. An integer is a 1-based\n // position (matching the \"Slide N\" headers agents see in deck reads);\n // anything else is treated as a slide id.\n const bareSlide = params.get('slide');\n if (bareSlide != null && slideId == null && slideIndex == null) {\n const n = Number.parseInt(bareSlide, 10);\n if (Number.isNaN(n)) {\n slideId = bareSlide;\n } else {\n slideIndex = n;\n }\n }\n if (slideId == null && slideIndex == null) {\n throw new Error('Provide slide_id and/or slide_index (1-based)');\n }\n return {\n type: 'slide',\n ...(slideId != null ? { slideId } : {}),\n ...(slideIndex != null ? { slideIndex } : {}),\n };\n }\n\n case 'sql_query': {\n const anchor: SqlQueryAnchor = { type: 'sql_query' };\n const sql = params.get('sql');\n if (sql != null) anchor.sql = sql;\n const snippetId = params.get('query_snippet_asset_id');\n if (snippetId != null) anchor.querySnippetAssetId = snippetId;\n const dialect = params.get('dialect');\n if (dialect != null) anchor.dialect = dialect;\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n // A sql_query anchor with no SQL and no snippet reference carries no\n // provenance — reject it rather than emit a payload-less shell.\n if (anchor.sql === undefined && anchor.querySnippetAssetId === undefined) {\n return undefined;\n }\n return anchor;\n }\n\n case 'time':\n return { type: 'time', time: requireString(params, 'time') };\n\n case 'time_range':\n return {\n type: 'time_range',\n startTime: requireString(params, 'start_time'),\n endTime: requireString(params, 'end_time'),\n };\n\n case 'tool_call': {\n const messageId = params.get('msg_id') ?? params.get('message_id');\n return {\n type: 'tool_call',\n toolCallId: requireString(params, 'tool_call_id'),\n ...(messageId ? { messageId } : {}),\n };\n }\n\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n"],"names":["LEGACY_ANCHOR_TYPES","isAnchorType","fileLineRangeAnchorProblem"],"mappings":"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"}
@@ -108,6 +108,14 @@ function parseOptionalShiftLogFrontier(raw) {
108
108
  return void 0;
109
109
  }
110
110
  }
111
+ const MAX_STABLE_RANGE_CHARS = 512;
112
+ const STABLE_RANGE = /^[A-Za-z0-9+/]+={0,2}$/;
113
+ function parseOptionalStableRange(raw) {
114
+ if (raw == null || raw.length > MAX_STABLE_RANGE_CHARS || !STABLE_RANGE.test(raw)) {
115
+ return void 0;
116
+ }
117
+ return raw;
118
+ }
111
119
  function parseRelationship(raw) {
112
120
  return raw === "exact" || raw === "supporting" ? raw : void 0;
113
121
  }
@@ -307,11 +315,13 @@ function parseAnchorByType(anchorType, params) {
307
315
  }
308
316
  case "sheet_range": {
309
317
  const frontier = parseOptionalShiftLogFrontier(params.get("frontier"));
318
+ const stableRange = parseOptionalStableRange(params.get("stable_range"));
310
319
  return {
311
320
  type: "sheet_range",
312
321
  sheetId: parseSheetId(params),
313
322
  range: requireString(params, "range"),
314
- ...frontier ? { frontier } : {}
323
+ ...frontier ? { frontier } : {},
324
+ ...stableRange ? { stableRange } : {}
315
325
  };
316
326
  }
317
327
  case "sheet_tab":
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sources":["../../../../../references/src/anchors/parse.ts"],"sourcesContent":["import { fileLineRangeAnchorProblem } from './file-line-range';\nimport type {\n Anchor,\n AnchorType,\n FileLineRangeAnchor,\n QueryResultRelationship,\n SemanticQueryAnchor,\n SqlQueryAnchor,\n} from './types';\nimport { isAnchorType, LEGACY_ANCHOR_TYPES } from './types';\n\n/**\n * Parse snake_case URL query parameters into a camelCase Anchor object.\n *\n * Expects `params` to contain `anchor=<type>` plus type-specific params.\n * Returns `undefined` if the anchor type is missing or unrecognized.\n */\nexport function parseAnchorFromParams(params: URLSearchParams): Anchor | undefined {\n const rawType = params.get('anchor');\n const anchorType = rawType == null ? undefined : (LEGACY_ANCHOR_TYPES[rawType] ?? rawType);\n if (!anchorType || !isAnchorType(anchorType)) return undefined;\n\n return parseAnchorByType(anchorType, params);\n}\n\nfunction requireString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = params.get(key) ?? legacyKeys.map((k) => params.get(k)).find((v) => v != null);\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n return value;\n}\n\nfunction requireNonEmptyString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = requireString(params, key, ...legacyKeys);\n if (value.trim().length === 0) throw new Error(`Anchor param must be non-empty: ${key}`);\n return value;\n}\n\nfunction requireInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseInt(raw, 10);\n if (Number.isNaN(n)) throw new Error(`Invalid integer for anchor param ${key}: ${raw}`);\n return n;\n}\n\nconst POSITIVE_INT = /^[1-9]\\d*$/;\n\n/** Strict 1-based ordinal: the whole value must be digits, no leading zeros, ≥ 1. */\nfunction requirePositiveInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key).trim();\n if (!POSITIVE_INT.test(raw)) {\n throw new Error(`Anchor param must be a positive integer: ${key}: ${raw}`);\n }\n return Number(raw);\n}\n\n/**\n * One value for `key`, refused when the parameter repeats. Clio's strict\n * anchor parser refuses a repeated parameter; `URLSearchParams.get` would\n * silently keep the first one.\n */\nfunction requireSingle(params: URLSearchParams, key: string): string {\n const values = params.getAll(key);\n const [value] = values;\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n if (values.length > 1) throw new Error(`Anchor param must not repeat: ${key}`);\n return value;\n}\n\nconst ASCII_DECIMAL = /^\\d+$/;\n/** Python's `int()` refuses a decimal string longer than this (`sys.get_int_max_str_digits()`). */\nconst PYTHON_INT_MAX_STR_DIGITS = 4300;\n\n/**\n * A line number as Clio's anchor parser reads it: ASCII decimal digits only\n * (a Unicode digit, a sign, or a numeral too long for Python's `int()` is\n * malformed). The `[1, MAX_LINE_NUMBER]` bound is `fileLineRangeAnchorProblem`'s;\n * every numeral `Number()` cannot hold exactly also exceeds that bound, so no\n * separate integer-precision check is observable here.\n */\nfunction requireAsciiDecimal(params: URLSearchParams, key: string): number {\n const raw = requireSingle(params, key);\n if (!ASCII_DECIMAL.test(raw)) {\n throw new Error(`Anchor param must be an ASCII decimal: ${key}: ${raw}`);\n }\n if (raw.length > PYTHON_INT_MAX_STR_DIGITS) {\n throw new Error(`Anchor param is too long to be an integer: ${key}`);\n }\n return Number(raw);\n}\n\n/**\n * `anchor=file_line_range&path=…&start_line=…&end_line=…` (any parameter\n * order), refused on any rule Clio's `LineRangeLocator` refuses so a malformed\n * or unstorable anchor never resolves to a wrong file or line.\n *\n * Wire strictness mirrors Clio's anchor parser as far as `URLSearchParams`\n * can observe it: a repeated `path` / `start_line` / `end_line` is refused,\n * and so is a path containing U+FFFD — what `URLSearchParams` makes of a\n * malformed percent-escape, which Clio refuses outright (this also refuses a\n * literal `%EF%BF%BD`, which Clio would accept; nothing sensible puts U+FFFD\n * in a path). A stray `&&` or a pair without `=` is malformed to Clio but\n * invisible here — `URLSearchParams` drops or normalizes it before this parser\n * runs — so the parity claim stops at what the transport lets through.\n */\nfunction parseFileLineRange(params: URLSearchParams): FileLineRangeAnchor {\n const path = requireSingle(params, 'path');\n if (path.includes('\\uFFFD')) {\n throw new Error('path must not contain U+FFFD (a malformed percent-escape)');\n }\n const anchor: FileLineRangeAnchor = {\n type: 'file_line_range',\n path,\n startLine: requireAsciiDecimal(params, 'start_line'),\n endLine: requireAsciiDecimal(params, 'end_line'),\n };\n const problem = fileLineRangeAnchorProblem(anchor);\n if (problem) throw new Error(problem);\n return anchor;\n}\n\n/**\n * Parse a sheet_id that may be a numeric ID (common) or a string ID (legacy).\n * Legacy content sometimes stored sheetId as a string (e.g. \"sheet_1\").\n * Returns a number when possible, falling back to 0 for non-numeric values\n * to avoid silently dropping the entire anchor.\n */\nfunction parseSheetId(params: URLSearchParams): number {\n const raw = requireString(params, 'sheet_id');\n const n = Number.parseInt(raw, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction requireFloat(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) throw new Error(`Invalid number for anchor param ${key}: ${raw}`);\n return n;\n}\n\n/** Parse a JSON object param. Throws (caught upstream → undefined anchor) on non-objects. */\nfunction parseJsonObject(raw: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('Expected a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Parse a JSON string-map param (e.g. a row key), coercing all values to strings. */\nfunction parseStringRecord(raw: string): Record<string, string> {\n return Object.fromEntries(\n Object.entries(parseJsonObject(raw)).map(([key, value]) => [key, String(value)])\n );\n}\n\n/**\n * An optional provenance map param. Provenance only adds information, so an\n * unreadable value is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStringRecord(raw: string | null): Record<string, string> | undefined {\n if (raw == null) return undefined;\n try {\n return parseStringRecord(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The engine shift-log frontier a `sheet_range` anchor was taken at (writer id → seq, a JSON object\n * of non-negative integers). It only adds information — a range without one resolves to its stored\n * A1 — so an unreadable value is dropped instead of failing the whole anchor. An empty object is a\n * real frontier (a document with no structural edit journaled yet) and is kept.\n */\nfunction parseOptionalShiftLogFrontier(raw: string | null): Record<string, number> | undefined {\n if (raw == null) return undefined;\n try {\n const frontier: Record<string, number> = {};\n for (const [writer, seq] of Object.entries(parseJsonObject(raw))) {\n if (typeof seq !== 'number' || !Number.isInteger(seq) || seq < 0) return undefined;\n frontier[writer] = seq;\n }\n return frontier;\n } catch {\n return undefined;\n }\n}\n\nfunction parseRelationship(raw: string | null): QueryResultRelationship | undefined {\n return raw === 'exact' || raw === 'supporting' ? raw : undefined;\n}\n\nfunction parseAnchorByType(anchorType: AnchorType, params: URLSearchParams): Anchor | undefined {\n try {\n switch (anchorType) {\n case 'cell':\n return { type: 'cell', cellId: requireString(params, 'cell_id') };\n\n case 'cell_range':\n return {\n type: 'cell_range',\n startCellId: requireString(params, 'start_cell_id'),\n endCellId: requireString(params, 'end_cell_id'),\n };\n\n case 'comment':\n return {\n type: 'comment',\n threadId: requireString(params, 'thread_id'),\n commentId: requireString(params, 'comment_id'),\n };\n\n case 'comment_thread':\n return {\n type: 'comment_thread',\n threadId: requireString(params, 'thread_id'),\n };\n\n case 'file_line_range':\n return parseFileLineRange(params);\n\n case 'line':\n return { type: 'line', line: requireInt(params, 'line') };\n\n case 'line_range':\n return {\n type: 'line_range',\n startLine: requireInt(params, 'start_line'),\n endLine: requireInt(params, 'end_line'),\n };\n\n case 'msg':\n return { type: 'msg', messageId: requireNonEmptyString(params, 'msg_id', 'message_id') };\n\n case 'msg_range':\n return {\n type: 'msg_range',\n startMessageId: requireNonEmptyString(params, 'start_msg_id', 'start_message_id'),\n endMessageId: requireNonEmptyString(params, 'end_msg_id', 'end_message_id'),\n };\n\n case 'msg_block': {\n const hash = params.get('hash');\n return {\n type: 'msg_block',\n messageId: requireNonEmptyString(params, 'msg_id'),\n block: requirePositiveInt(params, 'block'),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'msg_section': {\n const nth = params.get('nth') != null ? requirePositiveInt(params, 'nth') : undefined;\n return {\n type: 'msg_section',\n messageId: requireNonEmptyString(params, 'msg_id'),\n heading: requireNonEmptyString(params, 'heading'),\n ...(nth != null ? { nth } : {}),\n };\n }\n\n case 'msg_text': {\n const block = params.get('block') != null ? requirePositiveInt(params, 'block') : undefined;\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n return {\n type: 'msg_text',\n messageId: requireNonEmptyString(params, 'msg_id'),\n text: requireNonEmptyString(params, 'text'),\n ...(block != null ? { block } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n }\n\n case 'page':\n return { type: 'page', page: requireInt(params, 'page') };\n\n case 'page_range':\n return {\n type: 'page_range',\n startPage: requireInt(params, 'start_page'),\n endPage: requireInt(params, 'end_page'),\n };\n\n case 'page_rect': {\n const unitRaw = params.get('unit');\n return {\n type: 'page_rect',\n page: requireInt(params, 'page'),\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n ...(unitRaw === 'percent' || unitRaw === 'point' ? { unit: unitRaw } : {}),\n };\n }\n\n case 'page_text': {\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n const hash = params.get('hash');\n return {\n type: 'page_text',\n page: requireInt(params, 'page'),\n text: requireString(params, 'text'),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'path': {\n const line = params.get('line') != null ? requireInt(params, 'line') : undefined;\n const column =\n line != null && params.get('column') != null ? requireInt(params, 'column') : undefined;\n return {\n type: 'path',\n path: requireString(params, 'path'),\n ...(line != null ? { line } : {}),\n ...(column != null ? { column } : {}),\n };\n }\n\n case 'pixel_range':\n return {\n type: 'pixel_range',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n case 'pm_node':\n return { type: 'pm_node', nodeId: requireString(params, 'node_id') };\n\n case 'pm_node_range':\n return {\n type: 'pm_node_range',\n startNodeId: requireString(params, 'start_node_id'),\n endNodeId: requireString(params, 'end_node_id'),\n };\n\n case 'pm_mark':\n return { type: 'pm_mark', markId: requireString(params, 'mark_id') };\n\n case 'rect':\n return {\n type: 'rect',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n\n case 'section': {\n const topic = params.get('topic') != null ? requirePositiveInt(params, 'topic') : undefined;\n return {\n type: 'section',\n section: requireString(params, 'section'),\n ...(topic != null ? { topic } : {}),\n };\n }\n\n case 'semantic_query': {\n const anchor: SemanticQueryAnchor = {\n type: 'semantic_query',\n query: parseJsonObject(requireString(params, 'query')),\n };\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n if (params.get('schema_version') != null) {\n anchor.schemaVersion = requireInt(params, 'schema_version');\n }\n const schemaHash = params.get('schema_hash');\n if (schemaHash != null) anchor.schemaHash = schemaHash;\n const sourceSnapshots = parseOptionalStringRecord(params.get('source_snapshots'));\n if (sourceSnapshots != null) anchor.sourceSnapshots = sourceSnapshots;\n const dataAsOf = params.get('data_as_of');\n if (dataAsOf != null) anchor.dataAsOf = dataAsOf;\n return anchor;\n }\n\n case 'shape': {\n const shapeIds = requireString(params, 'shape_ids')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (shapeIds.length === 0) {\n throw new Error('Anchor param must be non-empty: shape_ids');\n }\n const shapeSlideId = params.get('slide_id');\n const shapeSlideIndexRaw = params.get('slide_index');\n return {\n type: 'shape',\n shapeIds,\n ...(shapeSlideId != null ? { slideId: shapeSlideId } : {}),\n ...(shapeSlideIndexRaw != null\n ? { slideIndex: requireInt(params, 'slide_index') }\n : {}),\n };\n }\n\n case 'sheet_cell': {\n const chartId = params.get('chart');\n return {\n type: 'sheet_cell',\n sheetId: parseSheetId(params),\n cell: requireString(params, 'cell'),\n ...(chartId ? { chartId } : {}),\n };\n }\n\n case 'sheet_range': {\n const frontier = parseOptionalShiftLogFrontier(params.get('frontier'));\n return {\n type: 'sheet_range',\n sheetId: parseSheetId(params),\n range: requireString(params, 'range'),\n ...(frontier ? { frontier } : {}),\n };\n }\n\n case 'sheet_tab':\n return {\n type: 'sheet_tab',\n sheetId: parseSheetId(params),\n };\n\n case 'sheet_table': {\n const fallbackRange = params.get('fallback_range');\n return {\n type: 'sheet_table',\n sheetId: parseSheetId(params),\n tableName: requireString(params, 'table_name'),\n ...(fallbackRange != null ? { fallbackRange } : {}),\n };\n }\n\n case 'lakehouse_table': {\n const tableUuid = params.get('table_uuid');\n const snapshotId = params.get('snapshot_id');\n return {\n type: 'lakehouse_table',\n table: requireString(params, 'table'),\n ...(tableUuid ? { tableUuid } : {}),\n ...(snapshotId ? { snapshotId } : {}),\n };\n }\n\n case 'slide': {\n let slideId = params.get('slide_id');\n let slideIndex = params.get('slide_index') != null ? requireInt(params, 'slide_index') : undefined;\n // Forgiving alias: anchor=slide&slide=<value>. An integer is a 1-based\n // position (matching the \"Slide N\" headers agents see in deck reads);\n // anything else is treated as a slide id.\n const bareSlide = params.get('slide');\n if (bareSlide != null && slideId == null && slideIndex == null) {\n const n = Number.parseInt(bareSlide, 10);\n if (Number.isNaN(n)) {\n slideId = bareSlide;\n } else {\n slideIndex = n;\n }\n }\n if (slideId == null && slideIndex == null) {\n throw new Error('Provide slide_id and/or slide_index (1-based)');\n }\n return {\n type: 'slide',\n ...(slideId != null ? { slideId } : {}),\n ...(slideIndex != null ? { slideIndex } : {}),\n };\n }\n\n case 'sql_query': {\n const anchor: SqlQueryAnchor = { type: 'sql_query' };\n const sql = params.get('sql');\n if (sql != null) anchor.sql = sql;\n const snippetId = params.get('query_snippet_asset_id');\n if (snippetId != null) anchor.querySnippetAssetId = snippetId;\n const dialect = params.get('dialect');\n if (dialect != null) anchor.dialect = dialect;\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n // A sql_query anchor with no SQL and no snippet reference carries no\n // provenance — reject it rather than emit a payload-less shell.\n if (anchor.sql === undefined && anchor.querySnippetAssetId === undefined) {\n return undefined;\n }\n return anchor;\n }\n\n case 'time':\n return { type: 'time', time: requireString(params, 'time') };\n\n case 'time_range':\n return {\n type: 'time_range',\n startTime: requireString(params, 'start_time'),\n endTime: requireString(params, 'end_time'),\n };\n\n case 'tool_call': {\n const messageId = params.get('msg_id') ?? params.get('message_id');\n return {\n type: 'tool_call',\n toolCallId: requireString(params, 'tool_call_id'),\n ...(messageId ? { messageId } : {}),\n };\n }\n\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sources":["../../../../../references/src/anchors/parse.ts"],"sourcesContent":["import { fileLineRangeAnchorProblem } from './file-line-range';\nimport type {\n Anchor,\n AnchorType,\n FileLineRangeAnchor,\n QueryResultRelationship,\n SemanticQueryAnchor,\n SqlQueryAnchor,\n} from './types';\nimport { isAnchorType, LEGACY_ANCHOR_TYPES } from './types';\n\n/**\n * Parse snake_case URL query parameters into a camelCase Anchor object.\n *\n * Expects `params` to contain `anchor=<type>` plus type-specific params.\n * Returns `undefined` if the anchor type is missing or unrecognized.\n */\nexport function parseAnchorFromParams(params: URLSearchParams): Anchor | undefined {\n const rawType = params.get('anchor');\n const anchorType = rawType == null ? undefined : (LEGACY_ANCHOR_TYPES[rawType] ?? rawType);\n if (!anchorType || !isAnchorType(anchorType)) return undefined;\n\n return parseAnchorByType(anchorType, params);\n}\n\nfunction requireString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = params.get(key) ?? legacyKeys.map((k) => params.get(k)).find((v) => v != null);\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n return value;\n}\n\nfunction requireNonEmptyString(params: URLSearchParams, key: string, ...legacyKeys: string[]): string {\n const value = requireString(params, key, ...legacyKeys);\n if (value.trim().length === 0) throw new Error(`Anchor param must be non-empty: ${key}`);\n return value;\n}\n\nfunction requireInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseInt(raw, 10);\n if (Number.isNaN(n)) throw new Error(`Invalid integer for anchor param ${key}: ${raw}`);\n return n;\n}\n\nconst POSITIVE_INT = /^[1-9]\\d*$/;\n\n/** Strict 1-based ordinal: the whole value must be digits, no leading zeros, ≥ 1. */\nfunction requirePositiveInt(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key).trim();\n if (!POSITIVE_INT.test(raw)) {\n throw new Error(`Anchor param must be a positive integer: ${key}: ${raw}`);\n }\n return Number(raw);\n}\n\n/**\n * One value for `key`, refused when the parameter repeats. Clio's strict\n * anchor parser refuses a repeated parameter; `URLSearchParams.get` would\n * silently keep the first one.\n */\nfunction requireSingle(params: URLSearchParams, key: string): string {\n const values = params.getAll(key);\n const [value] = values;\n if (value == null) throw new Error(`Missing required anchor param: ${key}`);\n if (values.length > 1) throw new Error(`Anchor param must not repeat: ${key}`);\n return value;\n}\n\nconst ASCII_DECIMAL = /^\\d+$/;\n/** Python's `int()` refuses a decimal string longer than this (`sys.get_int_max_str_digits()`). */\nconst PYTHON_INT_MAX_STR_DIGITS = 4300;\n\n/**\n * A line number as Clio's anchor parser reads it: ASCII decimal digits only\n * (a Unicode digit, a sign, or a numeral too long for Python's `int()` is\n * malformed). The `[1, MAX_LINE_NUMBER]` bound is `fileLineRangeAnchorProblem`'s;\n * every numeral `Number()` cannot hold exactly also exceeds that bound, so no\n * separate integer-precision check is observable here.\n */\nfunction requireAsciiDecimal(params: URLSearchParams, key: string): number {\n const raw = requireSingle(params, key);\n if (!ASCII_DECIMAL.test(raw)) {\n throw new Error(`Anchor param must be an ASCII decimal: ${key}: ${raw}`);\n }\n if (raw.length > PYTHON_INT_MAX_STR_DIGITS) {\n throw new Error(`Anchor param is too long to be an integer: ${key}`);\n }\n return Number(raw);\n}\n\n/**\n * `anchor=file_line_range&path=…&start_line=…&end_line=…` (any parameter\n * order), refused on any rule Clio's `LineRangeLocator` refuses so a malformed\n * or unstorable anchor never resolves to a wrong file or line.\n *\n * Wire strictness mirrors Clio's anchor parser as far as `URLSearchParams`\n * can observe it: a repeated `path` / `start_line` / `end_line` is refused,\n * and so is a path containing U+FFFD — what `URLSearchParams` makes of a\n * malformed percent-escape, which Clio refuses outright (this also refuses a\n * literal `%EF%BF%BD`, which Clio would accept; nothing sensible puts U+FFFD\n * in a path). A stray `&&` or a pair without `=` is malformed to Clio but\n * invisible here — `URLSearchParams` drops or normalizes it before this parser\n * runs — so the parity claim stops at what the transport lets through.\n */\nfunction parseFileLineRange(params: URLSearchParams): FileLineRangeAnchor {\n const path = requireSingle(params, 'path');\n if (path.includes('\\uFFFD')) {\n throw new Error('path must not contain U+FFFD (a malformed percent-escape)');\n }\n const anchor: FileLineRangeAnchor = {\n type: 'file_line_range',\n path,\n startLine: requireAsciiDecimal(params, 'start_line'),\n endLine: requireAsciiDecimal(params, 'end_line'),\n };\n const problem = fileLineRangeAnchorProblem(anchor);\n if (problem) throw new Error(problem);\n return anchor;\n}\n\n/**\n * Parse a sheet_id that may be a numeric ID (common) or a string ID (legacy).\n * Legacy content sometimes stored sheetId as a string (e.g. \"sheet_1\").\n * Returns a number when possible, falling back to 0 for non-numeric values\n * to avoid silently dropping the entire anchor.\n */\nfunction parseSheetId(params: URLSearchParams): number {\n const raw = requireString(params, 'sheet_id');\n const n = Number.parseInt(raw, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction requireFloat(params: URLSearchParams, key: string): number {\n const raw = requireString(params, key);\n const n = Number.parseFloat(raw);\n if (Number.isNaN(n)) throw new Error(`Invalid number for anchor param ${key}: ${raw}`);\n return n;\n}\n\n/** Parse a JSON object param. Throws (caught upstream → undefined anchor) on non-objects. */\nfunction parseJsonObject(raw: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('Expected a JSON object');\n }\n return parsed as Record<string, unknown>;\n}\n\n/** Parse a JSON string-map param (e.g. a row key), coercing all values to strings. */\nfunction parseStringRecord(raw: string): Record<string, string> {\n return Object.fromEntries(\n Object.entries(parseJsonObject(raw)).map(([key, value]) => [key, String(value)])\n );\n}\n\n/**\n * An optional provenance map param. Provenance only adds information, so an\n * unreadable value is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStringRecord(raw: string | null): Record<string, string> | undefined {\n if (raw == null) return undefined;\n try {\n return parseStringRecord(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The engine shift-log frontier a `sheet_range` anchor was taken at (writer id → seq, a JSON object\n * of non-negative integers). It only adds information — a range without one resolves to its stored\n * A1 — so an unreadable value is dropped instead of failing the whole anchor. An empty object is a\n * real frontier (a document with no structural edit journaled yet) and is kept.\n */\nfunction parseOptionalShiftLogFrontier(raw: string | null): Record<string, number> | undefined {\n if (raw == null) return undefined;\n try {\n const frontier: Record<string, number> = {};\n for (const [writer, seq] of Object.entries(parseJsonObject(raw))) {\n if (typeof seq !== 'number' || !Number.isInteger(seq) || seq < 0) return undefined;\n frontier[writer] = seq;\n }\n return frontier;\n } catch {\n return undefined;\n }\n}\n\n/** The longest `stable_range` kept: an engine line anchor is a few dozen characters. */\nconst MAX_STABLE_RANGE_CHARS = 512;\nconst STABLE_RANGE = /^[A-Za-z0-9+/]+={0,2}$/;\n\n/**\n * The engine line anchor a `sheet_range` anchor carries on a stable-ids (v5) document (standard\n * padded base64, `SpreadsheetEngine.anchorRange`). Like the frontier it only adds information, so a\n * value that is not one is dropped instead of failing the whole anchor.\n */\nfunction parseOptionalStableRange(raw: string | null | undefined): string | undefined {\n if (raw == null || raw.length > MAX_STABLE_RANGE_CHARS || !STABLE_RANGE.test(raw)) {\n return undefined;\n }\n return raw;\n}\n\nfunction parseRelationship(raw: string | null): QueryResultRelationship | undefined {\n return raw === 'exact' || raw === 'supporting' ? raw : undefined;\n}\n\nfunction parseAnchorByType(anchorType: AnchorType, params: URLSearchParams): Anchor | undefined {\n try {\n switch (anchorType) {\n case 'cell':\n return { type: 'cell', cellId: requireString(params, 'cell_id') };\n\n case 'cell_range':\n return {\n type: 'cell_range',\n startCellId: requireString(params, 'start_cell_id'),\n endCellId: requireString(params, 'end_cell_id'),\n };\n\n case 'comment':\n return {\n type: 'comment',\n threadId: requireString(params, 'thread_id'),\n commentId: requireString(params, 'comment_id'),\n };\n\n case 'comment_thread':\n return {\n type: 'comment_thread',\n threadId: requireString(params, 'thread_id'),\n };\n\n case 'file_line_range':\n return parseFileLineRange(params);\n\n case 'line':\n return { type: 'line', line: requireInt(params, 'line') };\n\n case 'line_range':\n return {\n type: 'line_range',\n startLine: requireInt(params, 'start_line'),\n endLine: requireInt(params, 'end_line'),\n };\n\n case 'msg':\n return { type: 'msg', messageId: requireNonEmptyString(params, 'msg_id', 'message_id') };\n\n case 'msg_range':\n return {\n type: 'msg_range',\n startMessageId: requireNonEmptyString(params, 'start_msg_id', 'start_message_id'),\n endMessageId: requireNonEmptyString(params, 'end_msg_id', 'end_message_id'),\n };\n\n case 'msg_block': {\n const hash = params.get('hash');\n return {\n type: 'msg_block',\n messageId: requireNonEmptyString(params, 'msg_id'),\n block: requirePositiveInt(params, 'block'),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'msg_section': {\n const nth = params.get('nth') != null ? requirePositiveInt(params, 'nth') : undefined;\n return {\n type: 'msg_section',\n messageId: requireNonEmptyString(params, 'msg_id'),\n heading: requireNonEmptyString(params, 'heading'),\n ...(nth != null ? { nth } : {}),\n };\n }\n\n case 'msg_text': {\n const block = params.get('block') != null ? requirePositiveInt(params, 'block') : undefined;\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n return {\n type: 'msg_text',\n messageId: requireNonEmptyString(params, 'msg_id'),\n text: requireNonEmptyString(params, 'text'),\n ...(block != null ? { block } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n };\n }\n\n case 'page':\n return { type: 'page', page: requireInt(params, 'page') };\n\n case 'page_range':\n return {\n type: 'page_range',\n startPage: requireInt(params, 'start_page'),\n endPage: requireInt(params, 'end_page'),\n };\n\n case 'page_rect': {\n const unitRaw = params.get('unit');\n return {\n type: 'page_rect',\n page: requireInt(params, 'page'),\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n ...(unitRaw === 'percent' || unitRaw === 'point' ? { unit: unitRaw } : {}),\n };\n }\n\n case 'page_text': {\n const prefix = params.get('prefix');\n const suffix = params.get('suffix');\n const hash = params.get('hash');\n return {\n type: 'page_text',\n page: requireInt(params, 'page'),\n text: requireString(params, 'text'),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(hash ? { hash } : {}),\n };\n }\n\n case 'path': {\n const line = params.get('line') != null ? requireInt(params, 'line') : undefined;\n const column =\n line != null && params.get('column') != null ? requireInt(params, 'column') : undefined;\n return {\n type: 'path',\n path: requireString(params, 'path'),\n ...(line != null ? { line } : {}),\n ...(column != null ? { column } : {}),\n };\n }\n\n case 'pixel_range':\n return {\n type: 'pixel_range',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n case 'pm_node':\n return { type: 'pm_node', nodeId: requireString(params, 'node_id') };\n\n case 'pm_node_range':\n return {\n type: 'pm_node_range',\n startNodeId: requireString(params, 'start_node_id'),\n endNodeId: requireString(params, 'end_node_id'),\n };\n\n case 'pm_mark':\n return { type: 'pm_mark', markId: requireString(params, 'mark_id') };\n\n case 'rect':\n return {\n type: 'rect',\n x: requireFloat(params, 'x'),\n y: requireFloat(params, 'y'),\n width: requireFloat(params, 'width'),\n height: requireFloat(params, 'height'),\n };\n\n case 'section': {\n const topic = params.get('topic') != null ? requirePositiveInt(params, 'topic') : undefined;\n return {\n type: 'section',\n section: requireString(params, 'section'),\n ...(topic != null ? { topic } : {}),\n };\n }\n\n case 'semantic_query': {\n const anchor: SemanticQueryAnchor = {\n type: 'semantic_query',\n query: parseJsonObject(requireString(params, 'query')),\n };\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n if (params.get('schema_version') != null) {\n anchor.schemaVersion = requireInt(params, 'schema_version');\n }\n const schemaHash = params.get('schema_hash');\n if (schemaHash != null) anchor.schemaHash = schemaHash;\n const sourceSnapshots = parseOptionalStringRecord(params.get('source_snapshots'));\n if (sourceSnapshots != null) anchor.sourceSnapshots = sourceSnapshots;\n const dataAsOf = params.get('data_as_of');\n if (dataAsOf != null) anchor.dataAsOf = dataAsOf;\n return anchor;\n }\n\n case 'shape': {\n const shapeIds = requireString(params, 'shape_ids')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (shapeIds.length === 0) {\n throw new Error('Anchor param must be non-empty: shape_ids');\n }\n const shapeSlideId = params.get('slide_id');\n const shapeSlideIndexRaw = params.get('slide_index');\n return {\n type: 'shape',\n shapeIds,\n ...(shapeSlideId != null ? { slideId: shapeSlideId } : {}),\n ...(shapeSlideIndexRaw != null\n ? { slideIndex: requireInt(params, 'slide_index') }\n : {}),\n };\n }\n\n case 'sheet_cell': {\n const chartId = params.get('chart');\n return {\n type: 'sheet_cell',\n sheetId: parseSheetId(params),\n cell: requireString(params, 'cell'),\n ...(chartId ? { chartId } : {}),\n };\n }\n\n case 'sheet_range': {\n const frontier = parseOptionalShiftLogFrontier(params.get('frontier'));\n const stableRange = parseOptionalStableRange(params.get('stable_range'));\n return {\n type: 'sheet_range',\n sheetId: parseSheetId(params),\n range: requireString(params, 'range'),\n ...(frontier ? { frontier } : {}),\n ...(stableRange ? { stableRange } : {}),\n };\n }\n\n case 'sheet_tab':\n return {\n type: 'sheet_tab',\n sheetId: parseSheetId(params),\n };\n\n case 'sheet_table': {\n const fallbackRange = params.get('fallback_range');\n return {\n type: 'sheet_table',\n sheetId: parseSheetId(params),\n tableName: requireString(params, 'table_name'),\n ...(fallbackRange != null ? { fallbackRange } : {}),\n };\n }\n\n case 'lakehouse_table': {\n const tableUuid = params.get('table_uuid');\n const snapshotId = params.get('snapshot_id');\n return {\n type: 'lakehouse_table',\n table: requireString(params, 'table'),\n ...(tableUuid ? { tableUuid } : {}),\n ...(snapshotId ? { snapshotId } : {}),\n };\n }\n\n case 'slide': {\n let slideId = params.get('slide_id');\n let slideIndex = params.get('slide_index') != null ? requireInt(params, 'slide_index') : undefined;\n // Forgiving alias: anchor=slide&slide=<value>. An integer is a 1-based\n // position (matching the \"Slide N\" headers agents see in deck reads);\n // anything else is treated as a slide id.\n const bareSlide = params.get('slide');\n if (bareSlide != null && slideId == null && slideIndex == null) {\n const n = Number.parseInt(bareSlide, 10);\n if (Number.isNaN(n)) {\n slideId = bareSlide;\n } else {\n slideIndex = n;\n }\n }\n if (slideId == null && slideIndex == null) {\n throw new Error('Provide slide_id and/or slide_index (1-based)');\n }\n return {\n type: 'slide',\n ...(slideId != null ? { slideId } : {}),\n ...(slideIndex != null ? { slideIndex } : {}),\n };\n }\n\n case 'sql_query': {\n const anchor: SqlQueryAnchor = { type: 'sql_query' };\n const sql = params.get('sql');\n if (sql != null) anchor.sql = sql;\n const snippetId = params.get('query_snippet_asset_id');\n if (snippetId != null) anchor.querySnippetAssetId = snippetId;\n const dialect = params.get('dialect');\n if (dialect != null) anchor.dialect = dialect;\n const field = params.get('field');\n if (field != null) anchor.field = field;\n const rowKey = params.get('row_key');\n if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);\n if (params.get('row_index') != null) anchor.rowIndex = requireInt(params, 'row_index');\n const relationship = parseRelationship(params.get('relationship'));\n if (relationship != null) anchor.relationship = relationship;\n // A sql_query anchor with no SQL and no snippet reference carries no\n // provenance — reject it rather than emit a payload-less shell.\n if (anchor.sql === undefined && anchor.querySnippetAssetId === undefined) {\n return undefined;\n }\n return anchor;\n }\n\n case 'time':\n return { type: 'time', time: requireString(params, 'time') };\n\n case 'time_range':\n return {\n type: 'time_range',\n startTime: requireString(params, 'start_time'),\n endTime: requireString(params, 'end_time'),\n };\n\n case 'tool_call': {\n const messageId = params.get('msg_id') ?? params.get('message_id');\n return {\n type: 'tool_call',\n toolCallId: requireString(params, 'tool_call_id'),\n ...(messageId ? { messageId } : {}),\n };\n }\n\n default:\n return undefined;\n }\n } catch {\n return undefined;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -150,6 +150,7 @@ export declare const anchorSchema: z.ZodPreprocess<z.ZodDiscriminatedUnion<[z.Zo
150
150
  sheetId: z.ZodNumber;
151
151
  range: z.ZodString;
152
152
  frontier: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
153
+ stableRange: z.ZodOptional<z.ZodString>;
153
154
  }, z.core.$strip>, z.ZodObject<{
154
155
  type: z.ZodLiteral<"sheet_tab">;
155
156
  sheetId: z.ZodNumber;
@@ -147,6 +147,7 @@ function serializeAnchorToParams(anchor) {
147
147
  params.set("sheet_id", String(anchor.sheetId));
148
148
  params.set("range", anchor.range);
149
149
  if (anchor.frontier != null) params.set("frontier", JSON.stringify(anchor.frontier));
150
+ if (anchor.stableRange != null) params.set("stable_range", anchor.stableRange);
150
151
  break;
151
152
  case "sheet_tab":
152
153
  params.set("sheet_id", String(anchor.sheetId));
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.cjs","sources":["../../../../../references/src/anchors/serialize.ts"],"sourcesContent":["import type { Anchor } from './types';\n\n/**\n * Serialize an Anchor to snake_case URL query parameters.\n *\n * Returns a `URLSearchParams` containing `anchor=<type>` plus type-specific params.\n * The caller appends these to the asset URL.\n */\nexport function serializeAnchorToParams(anchor: Anchor): URLSearchParams {\n const params = new URLSearchParams();\n params.set('anchor', anchor.type);\n\n switch (anchor.type) {\n case 'cell':\n params.set('cell_id', anchor.cellId);\n break;\n case 'cell_range':\n params.set('start_cell_id', anchor.startCellId);\n params.set('end_cell_id', anchor.endCellId);\n break;\n case 'comment':\n params.set('thread_id', anchor.threadId);\n params.set('comment_id', anchor.commentId);\n break;\n case 'comment_thread':\n params.set('thread_id', anchor.threadId);\n break;\n case 'file_line_range':\n // Sorted parameters — Clio's canonical order (anchor, end_line, path,\n // start_line). URLSearchParams encodes `~` and `*` the other way round\n // from Python's urlencode, so equality with Clio's stored string is by\n // decoded value; see file-line-range.ts.\n params.set('end_line', String(anchor.endLine));\n params.set('path', anchor.path);\n params.set('start_line', String(anchor.startLine));\n break;\n case 'line':\n params.set('line', String(anchor.line));\n break;\n case 'line_range':\n params.set('start_line', String(anchor.startLine));\n params.set('end_line', String(anchor.endLine));\n break;\n case 'msg':\n params.set('msg_id', anchor.messageId);\n break;\n case 'msg_range':\n params.set('start_msg_id', anchor.startMessageId);\n params.set('end_msg_id', anchor.endMessageId);\n break;\n case 'msg_block':\n params.set('msg_id', anchor.messageId);\n params.set('block', String(anchor.block));\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'msg_section':\n params.set('msg_id', anchor.messageId);\n params.set('heading', anchor.heading);\n if (anchor.nth != null) params.set('nth', String(anchor.nth));\n break;\n case 'msg_text':\n params.set('msg_id', anchor.messageId);\n params.set('text', anchor.text);\n if (anchor.block != null) params.set('block', String(anchor.block));\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n break;\n case 'page':\n params.set('page', String(anchor.page));\n break;\n case 'page_range':\n params.set('start_page', String(anchor.startPage));\n params.set('end_page', String(anchor.endPage));\n break;\n case 'page_rect':\n params.set('page', String(anchor.page));\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n if (anchor.unit != null) params.set('unit', anchor.unit);\n break;\n case 'page_text':\n params.set('page', String(anchor.page));\n params.set('text', anchor.text);\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'path':\n params.set('path', anchor.path);\n if (anchor.line != null) {\n params.set('line', String(anchor.line));\n if (anchor.column != null) params.set('column', String(anchor.column));\n }\n break;\n case 'pixel_range':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'pm_node':\n params.set('node_id', anchor.nodeId);\n break;\n case 'pm_node_range':\n params.set('start_node_id', anchor.startNodeId);\n params.set('end_node_id', anchor.endNodeId);\n break;\n case 'pm_mark':\n params.set('mark_id', anchor.markId);\n break;\n case 'rect':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'section':\n params.set('section', anchor.section);\n if (anchor.topic != null) params.set('topic', String(anchor.topic));\n break;\n case 'semantic_query':\n params.set('query', JSON.stringify(anchor.query));\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n if (anchor.schemaVersion != null) params.set('schema_version', String(anchor.schemaVersion));\n if (anchor.schemaHash != null) params.set('schema_hash', anchor.schemaHash);\n if (anchor.sourceSnapshots != null) {\n params.set('source_snapshots', JSON.stringify(anchor.sourceSnapshots));\n }\n if (anchor.dataAsOf != null) params.set('data_as_of', anchor.dataAsOf);\n break;\n case 'sql_query':\n if (anchor.sql != null) params.set('sql', anchor.sql);\n if (anchor.querySnippetAssetId != null) {\n params.set('query_snippet_asset_id', anchor.querySnippetAssetId);\n }\n if (anchor.dialect != null) params.set('dialect', anchor.dialect);\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n break;\n case 'shape':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n params.set('shape_ids', anchor.shapeIds.join(','));\n break;\n case 'sheet_cell':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('cell', anchor.cell);\n if (anchor.chartId != null) params.set('chart', anchor.chartId);\n break;\n case 'sheet_range':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('range', anchor.range);\n // An empty frontier (a document with no structural edit journaled yet) still names a point\n // in the engine's log, so it is written, not dropped.\n if (anchor.frontier != null) params.set('frontier', JSON.stringify(anchor.frontier));\n break;\n case 'sheet_tab':\n params.set('sheet_id', String(anchor.sheetId));\n break;\n case 'sheet_table':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('table_name', anchor.tableName);\n if (anchor.fallbackRange != null) {\n params.set('fallback_range', anchor.fallbackRange);\n }\n break;\n case 'lakehouse_table':\n params.set('table', anchor.table);\n if (anchor.tableUuid) params.set('table_uuid', anchor.tableUuid);\n if (anchor.snapshotId) params.set('snapshot_id', anchor.snapshotId);\n break;\n case 'slide':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n break;\n case 'time':\n params.set('time', anchor.time);\n break;\n case 'time_range':\n params.set('start_time', anchor.startTime);\n params.set('end_time', anchor.endTime);\n break;\n case 'tool_call':\n params.set('tool_call_id', anchor.toolCallId);\n if (anchor.messageId) params.set('msg_id', anchor.messageId);\n break;\n }\n\n return params;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize.cjs","sources":["../../../../../references/src/anchors/serialize.ts"],"sourcesContent":["import type { Anchor } from './types';\n\n/**\n * Serialize an Anchor to snake_case URL query parameters.\n *\n * Returns a `URLSearchParams` containing `anchor=<type>` plus type-specific params.\n * The caller appends these to the asset URL.\n */\nexport function serializeAnchorToParams(anchor: Anchor): URLSearchParams {\n const params = new URLSearchParams();\n params.set('anchor', anchor.type);\n\n switch (anchor.type) {\n case 'cell':\n params.set('cell_id', anchor.cellId);\n break;\n case 'cell_range':\n params.set('start_cell_id', anchor.startCellId);\n params.set('end_cell_id', anchor.endCellId);\n break;\n case 'comment':\n params.set('thread_id', anchor.threadId);\n params.set('comment_id', anchor.commentId);\n break;\n case 'comment_thread':\n params.set('thread_id', anchor.threadId);\n break;\n case 'file_line_range':\n // Sorted parameters — Clio's canonical order (anchor, end_line, path,\n // start_line). URLSearchParams encodes `~` and `*` the other way round\n // from Python's urlencode, so equality with Clio's stored string is by\n // decoded value; see file-line-range.ts.\n params.set('end_line', String(anchor.endLine));\n params.set('path', anchor.path);\n params.set('start_line', String(anchor.startLine));\n break;\n case 'line':\n params.set('line', String(anchor.line));\n break;\n case 'line_range':\n params.set('start_line', String(anchor.startLine));\n params.set('end_line', String(anchor.endLine));\n break;\n case 'msg':\n params.set('msg_id', anchor.messageId);\n break;\n case 'msg_range':\n params.set('start_msg_id', anchor.startMessageId);\n params.set('end_msg_id', anchor.endMessageId);\n break;\n case 'msg_block':\n params.set('msg_id', anchor.messageId);\n params.set('block', String(anchor.block));\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'msg_section':\n params.set('msg_id', anchor.messageId);\n params.set('heading', anchor.heading);\n if (anchor.nth != null) params.set('nth', String(anchor.nth));\n break;\n case 'msg_text':\n params.set('msg_id', anchor.messageId);\n params.set('text', anchor.text);\n if (anchor.block != null) params.set('block', String(anchor.block));\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n break;\n case 'page':\n params.set('page', String(anchor.page));\n break;\n case 'page_range':\n params.set('start_page', String(anchor.startPage));\n params.set('end_page', String(anchor.endPage));\n break;\n case 'page_rect':\n params.set('page', String(anchor.page));\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n if (anchor.unit != null) params.set('unit', anchor.unit);\n break;\n case 'page_text':\n params.set('page', String(anchor.page));\n params.set('text', anchor.text);\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'path':\n params.set('path', anchor.path);\n if (anchor.line != null) {\n params.set('line', String(anchor.line));\n if (anchor.column != null) params.set('column', String(anchor.column));\n }\n break;\n case 'pixel_range':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'pm_node':\n params.set('node_id', anchor.nodeId);\n break;\n case 'pm_node_range':\n params.set('start_node_id', anchor.startNodeId);\n params.set('end_node_id', anchor.endNodeId);\n break;\n case 'pm_mark':\n params.set('mark_id', anchor.markId);\n break;\n case 'rect':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'section':\n params.set('section', anchor.section);\n if (anchor.topic != null) params.set('topic', String(anchor.topic));\n break;\n case 'semantic_query':\n params.set('query', JSON.stringify(anchor.query));\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n if (anchor.schemaVersion != null) params.set('schema_version', String(anchor.schemaVersion));\n if (anchor.schemaHash != null) params.set('schema_hash', anchor.schemaHash);\n if (anchor.sourceSnapshots != null) {\n params.set('source_snapshots', JSON.stringify(anchor.sourceSnapshots));\n }\n if (anchor.dataAsOf != null) params.set('data_as_of', anchor.dataAsOf);\n break;\n case 'sql_query':\n if (anchor.sql != null) params.set('sql', anchor.sql);\n if (anchor.querySnippetAssetId != null) {\n params.set('query_snippet_asset_id', anchor.querySnippetAssetId);\n }\n if (anchor.dialect != null) params.set('dialect', anchor.dialect);\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n break;\n case 'shape':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n params.set('shape_ids', anchor.shapeIds.join(','));\n break;\n case 'sheet_cell':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('cell', anchor.cell);\n if (anchor.chartId != null) params.set('chart', anchor.chartId);\n break;\n case 'sheet_range':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('range', anchor.range);\n // An empty frontier (a document with no structural edit journaled yet) still names a point\n // in the engine's log, so it is written, not dropped.\n if (anchor.frontier != null) params.set('frontier', JSON.stringify(anchor.frontier));\n if (anchor.stableRange != null) params.set('stable_range', anchor.stableRange);\n break;\n case 'sheet_tab':\n params.set('sheet_id', String(anchor.sheetId));\n break;\n case 'sheet_table':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('table_name', anchor.tableName);\n if (anchor.fallbackRange != null) {\n params.set('fallback_range', anchor.fallbackRange);\n }\n break;\n case 'lakehouse_table':\n params.set('table', anchor.table);\n if (anchor.tableUuid) params.set('table_uuid', anchor.tableUuid);\n if (anchor.snapshotId) params.set('snapshot_id', anchor.snapshotId);\n break;\n case 'slide':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n break;\n case 'time':\n params.set('time', anchor.time);\n break;\n case 'time_range':\n params.set('start_time', anchor.startTime);\n params.set('end_time', anchor.endTime);\n break;\n case 'tool_call':\n params.set('tool_call_id', anchor.toolCallId);\n if (anchor.messageId) params.set('msg_id', anchor.messageId);\n break;\n }\n\n return params;\n}\n"],"names":[],"mappings":"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"}
@@ -145,6 +145,7 @@ function serializeAnchorToParams(anchor) {
145
145
  params.set("sheet_id", String(anchor.sheetId));
146
146
  params.set("range", anchor.range);
147
147
  if (anchor.frontier != null) params.set("frontier", JSON.stringify(anchor.frontier));
148
+ if (anchor.stableRange != null) params.set("stable_range", anchor.stableRange);
148
149
  break;
149
150
  case "sheet_tab":
150
151
  params.set("sheet_id", String(anchor.sheetId));
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.js","sources":["../../../../../references/src/anchors/serialize.ts"],"sourcesContent":["import type { Anchor } from './types';\n\n/**\n * Serialize an Anchor to snake_case URL query parameters.\n *\n * Returns a `URLSearchParams` containing `anchor=<type>` plus type-specific params.\n * The caller appends these to the asset URL.\n */\nexport function serializeAnchorToParams(anchor: Anchor): URLSearchParams {\n const params = new URLSearchParams();\n params.set('anchor', anchor.type);\n\n switch (anchor.type) {\n case 'cell':\n params.set('cell_id', anchor.cellId);\n break;\n case 'cell_range':\n params.set('start_cell_id', anchor.startCellId);\n params.set('end_cell_id', anchor.endCellId);\n break;\n case 'comment':\n params.set('thread_id', anchor.threadId);\n params.set('comment_id', anchor.commentId);\n break;\n case 'comment_thread':\n params.set('thread_id', anchor.threadId);\n break;\n case 'file_line_range':\n // Sorted parameters — Clio's canonical order (anchor, end_line, path,\n // start_line). URLSearchParams encodes `~` and `*` the other way round\n // from Python's urlencode, so equality with Clio's stored string is by\n // decoded value; see file-line-range.ts.\n params.set('end_line', String(anchor.endLine));\n params.set('path', anchor.path);\n params.set('start_line', String(anchor.startLine));\n break;\n case 'line':\n params.set('line', String(anchor.line));\n break;\n case 'line_range':\n params.set('start_line', String(anchor.startLine));\n params.set('end_line', String(anchor.endLine));\n break;\n case 'msg':\n params.set('msg_id', anchor.messageId);\n break;\n case 'msg_range':\n params.set('start_msg_id', anchor.startMessageId);\n params.set('end_msg_id', anchor.endMessageId);\n break;\n case 'msg_block':\n params.set('msg_id', anchor.messageId);\n params.set('block', String(anchor.block));\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'msg_section':\n params.set('msg_id', anchor.messageId);\n params.set('heading', anchor.heading);\n if (anchor.nth != null) params.set('nth', String(anchor.nth));\n break;\n case 'msg_text':\n params.set('msg_id', anchor.messageId);\n params.set('text', anchor.text);\n if (anchor.block != null) params.set('block', String(anchor.block));\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n break;\n case 'page':\n params.set('page', String(anchor.page));\n break;\n case 'page_range':\n params.set('start_page', String(anchor.startPage));\n params.set('end_page', String(anchor.endPage));\n break;\n case 'page_rect':\n params.set('page', String(anchor.page));\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n if (anchor.unit != null) params.set('unit', anchor.unit);\n break;\n case 'page_text':\n params.set('page', String(anchor.page));\n params.set('text', anchor.text);\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'path':\n params.set('path', anchor.path);\n if (anchor.line != null) {\n params.set('line', String(anchor.line));\n if (anchor.column != null) params.set('column', String(anchor.column));\n }\n break;\n case 'pixel_range':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'pm_node':\n params.set('node_id', anchor.nodeId);\n break;\n case 'pm_node_range':\n params.set('start_node_id', anchor.startNodeId);\n params.set('end_node_id', anchor.endNodeId);\n break;\n case 'pm_mark':\n params.set('mark_id', anchor.markId);\n break;\n case 'rect':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'section':\n params.set('section', anchor.section);\n if (anchor.topic != null) params.set('topic', String(anchor.topic));\n break;\n case 'semantic_query':\n params.set('query', JSON.stringify(anchor.query));\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n if (anchor.schemaVersion != null) params.set('schema_version', String(anchor.schemaVersion));\n if (anchor.schemaHash != null) params.set('schema_hash', anchor.schemaHash);\n if (anchor.sourceSnapshots != null) {\n params.set('source_snapshots', JSON.stringify(anchor.sourceSnapshots));\n }\n if (anchor.dataAsOf != null) params.set('data_as_of', anchor.dataAsOf);\n break;\n case 'sql_query':\n if (anchor.sql != null) params.set('sql', anchor.sql);\n if (anchor.querySnippetAssetId != null) {\n params.set('query_snippet_asset_id', anchor.querySnippetAssetId);\n }\n if (anchor.dialect != null) params.set('dialect', anchor.dialect);\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n break;\n case 'shape':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n params.set('shape_ids', anchor.shapeIds.join(','));\n break;\n case 'sheet_cell':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('cell', anchor.cell);\n if (anchor.chartId != null) params.set('chart', anchor.chartId);\n break;\n case 'sheet_range':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('range', anchor.range);\n // An empty frontier (a document with no structural edit journaled yet) still names a point\n // in the engine's log, so it is written, not dropped.\n if (anchor.frontier != null) params.set('frontier', JSON.stringify(anchor.frontier));\n break;\n case 'sheet_tab':\n params.set('sheet_id', String(anchor.sheetId));\n break;\n case 'sheet_table':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('table_name', anchor.tableName);\n if (anchor.fallbackRange != null) {\n params.set('fallback_range', anchor.fallbackRange);\n }\n break;\n case 'lakehouse_table':\n params.set('table', anchor.table);\n if (anchor.tableUuid) params.set('table_uuid', anchor.tableUuid);\n if (anchor.snapshotId) params.set('snapshot_id', anchor.snapshotId);\n break;\n case 'slide':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n break;\n case 'time':\n params.set('time', anchor.time);\n break;\n case 'time_range':\n params.set('start_time', anchor.startTime);\n params.set('end_time', anchor.endTime);\n break;\n case 'tool_call':\n params.set('tool_call_id', anchor.toolCallId);\n if (anchor.messageId) params.set('msg_id', anchor.messageId);\n break;\n }\n\n return params;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialize.js","sources":["../../../../../references/src/anchors/serialize.ts"],"sourcesContent":["import type { Anchor } from './types';\n\n/**\n * Serialize an Anchor to snake_case URL query parameters.\n *\n * Returns a `URLSearchParams` containing `anchor=<type>` plus type-specific params.\n * The caller appends these to the asset URL.\n */\nexport function serializeAnchorToParams(anchor: Anchor): URLSearchParams {\n const params = new URLSearchParams();\n params.set('anchor', anchor.type);\n\n switch (anchor.type) {\n case 'cell':\n params.set('cell_id', anchor.cellId);\n break;\n case 'cell_range':\n params.set('start_cell_id', anchor.startCellId);\n params.set('end_cell_id', anchor.endCellId);\n break;\n case 'comment':\n params.set('thread_id', anchor.threadId);\n params.set('comment_id', anchor.commentId);\n break;\n case 'comment_thread':\n params.set('thread_id', anchor.threadId);\n break;\n case 'file_line_range':\n // Sorted parameters — Clio's canonical order (anchor, end_line, path,\n // start_line). URLSearchParams encodes `~` and `*` the other way round\n // from Python's urlencode, so equality with Clio's stored string is by\n // decoded value; see file-line-range.ts.\n params.set('end_line', String(anchor.endLine));\n params.set('path', anchor.path);\n params.set('start_line', String(anchor.startLine));\n break;\n case 'line':\n params.set('line', String(anchor.line));\n break;\n case 'line_range':\n params.set('start_line', String(anchor.startLine));\n params.set('end_line', String(anchor.endLine));\n break;\n case 'msg':\n params.set('msg_id', anchor.messageId);\n break;\n case 'msg_range':\n params.set('start_msg_id', anchor.startMessageId);\n params.set('end_msg_id', anchor.endMessageId);\n break;\n case 'msg_block':\n params.set('msg_id', anchor.messageId);\n params.set('block', String(anchor.block));\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'msg_section':\n params.set('msg_id', anchor.messageId);\n params.set('heading', anchor.heading);\n if (anchor.nth != null) params.set('nth', String(anchor.nth));\n break;\n case 'msg_text':\n params.set('msg_id', anchor.messageId);\n params.set('text', anchor.text);\n if (anchor.block != null) params.set('block', String(anchor.block));\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n break;\n case 'page':\n params.set('page', String(anchor.page));\n break;\n case 'page_range':\n params.set('start_page', String(anchor.startPage));\n params.set('end_page', String(anchor.endPage));\n break;\n case 'page_rect':\n params.set('page', String(anchor.page));\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n if (anchor.unit != null) params.set('unit', anchor.unit);\n break;\n case 'page_text':\n params.set('page', String(anchor.page));\n params.set('text', anchor.text);\n if (anchor.prefix) params.set('prefix', anchor.prefix);\n if (anchor.suffix) params.set('suffix', anchor.suffix);\n if (anchor.hash) params.set('hash', anchor.hash);\n break;\n case 'path':\n params.set('path', anchor.path);\n if (anchor.line != null) {\n params.set('line', String(anchor.line));\n if (anchor.column != null) params.set('column', String(anchor.column));\n }\n break;\n case 'pixel_range':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'pm_node':\n params.set('node_id', anchor.nodeId);\n break;\n case 'pm_node_range':\n params.set('start_node_id', anchor.startNodeId);\n params.set('end_node_id', anchor.endNodeId);\n break;\n case 'pm_mark':\n params.set('mark_id', anchor.markId);\n break;\n case 'rect':\n params.set('x', String(anchor.x));\n params.set('y', String(anchor.y));\n params.set('width', String(anchor.width));\n params.set('height', String(anchor.height));\n break;\n case 'section':\n params.set('section', anchor.section);\n if (anchor.topic != null) params.set('topic', String(anchor.topic));\n break;\n case 'semantic_query':\n params.set('query', JSON.stringify(anchor.query));\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n if (anchor.schemaVersion != null) params.set('schema_version', String(anchor.schemaVersion));\n if (anchor.schemaHash != null) params.set('schema_hash', anchor.schemaHash);\n if (anchor.sourceSnapshots != null) {\n params.set('source_snapshots', JSON.stringify(anchor.sourceSnapshots));\n }\n if (anchor.dataAsOf != null) params.set('data_as_of', anchor.dataAsOf);\n break;\n case 'sql_query':\n if (anchor.sql != null) params.set('sql', anchor.sql);\n if (anchor.querySnippetAssetId != null) {\n params.set('query_snippet_asset_id', anchor.querySnippetAssetId);\n }\n if (anchor.dialect != null) params.set('dialect', anchor.dialect);\n if (anchor.field != null) params.set('field', anchor.field);\n if (anchor.rowKey != null) params.set('row_key', JSON.stringify(anchor.rowKey));\n if (anchor.rowIndex != null) params.set('row_index', String(anchor.rowIndex));\n if (anchor.relationship != null) params.set('relationship', anchor.relationship);\n break;\n case 'shape':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n params.set('shape_ids', anchor.shapeIds.join(','));\n break;\n case 'sheet_cell':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('cell', anchor.cell);\n if (anchor.chartId != null) params.set('chart', anchor.chartId);\n break;\n case 'sheet_range':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('range', anchor.range);\n // An empty frontier (a document with no structural edit journaled yet) still names a point\n // in the engine's log, so it is written, not dropped.\n if (anchor.frontier != null) params.set('frontier', JSON.stringify(anchor.frontier));\n if (anchor.stableRange != null) params.set('stable_range', anchor.stableRange);\n break;\n case 'sheet_tab':\n params.set('sheet_id', String(anchor.sheetId));\n break;\n case 'sheet_table':\n params.set('sheet_id', String(anchor.sheetId));\n params.set('table_name', anchor.tableName);\n if (anchor.fallbackRange != null) {\n params.set('fallback_range', anchor.fallbackRange);\n }\n break;\n case 'lakehouse_table':\n params.set('table', anchor.table);\n if (anchor.tableUuid) params.set('table_uuid', anchor.tableUuid);\n if (anchor.snapshotId) params.set('snapshot_id', anchor.snapshotId);\n break;\n case 'slide':\n if (anchor.slideId != null) params.set('slide_id', anchor.slideId);\n if (anchor.slideIndex != null) params.set('slide_index', String(anchor.slideIndex));\n break;\n case 'time':\n params.set('time', anchor.time);\n break;\n case 'time_range':\n params.set('start_time', anchor.startTime);\n params.set('end_time', anchor.endTime);\n break;\n case 'tool_call':\n params.set('tool_call_id', anchor.toolCallId);\n if (anchor.messageId) params.set('msg_id', anchor.messageId);\n break;\n }\n\n return params;\n}\n"],"names":[],"mappings":"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"}