@athenaintel/react 0.40.3 → 0.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/dist/chat/athena-citation-links.cjs +23 -2
- package/dist/chat/athena-citation-links.cjs.map +1 -1
- package/dist/chat/athena-citation-links.d.ts +5 -0
- package/dist/chat/athena-citation-links.js +23 -2
- package/dist/chat/athena-citation-links.js.map +1 -1
- package/dist/chat-ui/index.d.ts +1 -1
- package/dist/chat-ui/lib/asset-urls.cjs +6 -1
- package/dist/chat-ui/lib/asset-urls.cjs.map +1 -1
- package/dist/chat-ui/lib/asset-urls.d.ts +6 -1
- package/dist/chat-ui/lib/asset-urls.js +7 -2
- package/dist/chat-ui/lib/asset-urls.js.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.cjs +118 -7
- package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
- package/dist/chat-ui/mentions/mention-chip.d.ts +29 -0
- package/dist/chat-ui/mentions/mention-chip.js +120 -9
- package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs +2 -1
- package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
- package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
- package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/lib/athena-urls.cjs +17 -0
- package/dist/lib/athena-urls.cjs.map +1 -1
- package/dist/lib/athena-urls.d.ts +14 -0
- package/dist/lib/athena-urls.js +17 -0
- package/dist/lib/athena-urls.js.map +1 -1
- package/dist/react/package.json.cjs +1 -1
- package/dist/react/package.json.js +1 -1
- package/dist/references/src/anchors/file-line-range.cjs +70 -0
- package/dist/references/src/anchors/file-line-range.cjs.map +1 -0
- package/dist/references/src/anchors/file-line-range.js +70 -0
- package/dist/references/src/anchors/file-line-range.js.map +1 -0
- package/dist/references/src/anchors/format.cjs +219 -0
- package/dist/references/src/anchors/format.cjs.map +1 -0
- package/dist/references/src/anchors/format.js +219 -0
- package/dist/references/src/anchors/format.js.map +1 -0
- package/dist/references/src/anchors/parse.cjs +408 -0
- package/dist/references/src/anchors/parse.cjs.map +1 -0
- package/dist/references/src/anchors/parse.js +408 -0
- package/dist/references/src/anchors/parse.js.map +1 -0
- package/dist/references/src/anchors/serialize.cjs +185 -0
- package/dist/references/src/anchors/serialize.cjs.map +1 -0
- package/dist/references/src/anchors/serialize.js +185 -0
- package/dist/references/src/anchors/serialize.js.map +1 -0
- package/dist/references/src/anchors/types.cjs +50 -0
- package/dist/references/src/anchors/types.cjs.map +1 -0
- package/dist/references/src/anchors/types.js +50 -0
- package/dist/references/src/anchors/types.js.map +1 -0
- package/dist/references/src/formats/uri/asset-mention-uri.cjs +29 -0
- package/dist/references/src/formats/uri/asset-mention-uri.cjs.map +1 -0
- package/dist/references/src/formats/uri/asset-mention-uri.js +29 -0
- package/dist/references/src/formats/uri/asset-mention-uri.js.map +1 -0
- package/dist/references/src/formats/uri/asset-spaces-url.cjs +64 -0
- package/dist/references/src/formats/uri/asset-spaces-url.cjs.map +1 -0
- package/dist/references/src/formats/uri/asset-spaces-url.js +64 -0
- package/dist/references/src/formats/uri/asset-spaces-url.js.map +1 -0
- package/dist/references/src/formats/uri/template-placeholder.cjs +9 -0
- package/dist/references/src/formats/uri/template-placeholder.cjs.map +1 -0
- package/dist/references/src/formats/uri/template-placeholder.js +9 -0
- package/dist/references/src/formats/uri/template-placeholder.js.map +1 -0
- package/dist/references/src/sheet-name.cjs +10 -0
- package/dist/references/src/sheet-name.cjs.map +1 -0
- package/dist/references/src/sheet-name.js +10 -0
- package/dist/references/src/sheet-name.js.map +1 -0
- package/dist/references/src/version-ref.cjs +61 -0
- package/dist/references/src/version-ref.cjs.map +1 -0
- package/dist/references/src/version-ref.js +61 -0
- package/dist/references/src/version-ref.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/workbench/session-workbench-model.cjs +0 -18
- package/dist/workbench/session-workbench-model.cjs.map +1 -1
- package/dist/workbench/session-workbench-model.d.ts +0 -13
- package/dist/workbench/session-workbench-model.js +0 -18
- package/dist/workbench/session-workbench-model.js.map +1 -1
- package/dist/workbench/session-workbench-panes.cjs +1 -1
- package/dist/workbench/session-workbench-panes.cjs.map +1 -1
- package/dist/workbench/session-workbench-panes.js +2 -2
- package/dist/workbench/session-workbench-panes.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { fileLineRangeAnchorProblem } from "./file-line-range.js";
|
|
2
|
+
import { isAnchorType, LEGACY_ANCHOR_TYPES } from "./types.js";
|
|
3
|
+
function parseAnchorFromParams(params) {
|
|
4
|
+
const rawType = params.get("anchor");
|
|
5
|
+
const anchorType = rawType == null ? void 0 : LEGACY_ANCHOR_TYPES[rawType] ?? rawType;
|
|
6
|
+
if (!anchorType || !isAnchorType(anchorType)) return void 0;
|
|
7
|
+
return parseAnchorByType(anchorType, params);
|
|
8
|
+
}
|
|
9
|
+
function requireString(params, key, ...legacyKeys) {
|
|
10
|
+
const value = params.get(key) ?? legacyKeys.map((k) => params.get(k)).find((v) => v != null);
|
|
11
|
+
if (value == null) throw new Error(`Missing required anchor param: ${key}`);
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function requireNonEmptyString(params, key, ...legacyKeys) {
|
|
15
|
+
const value = requireString(params, key, ...legacyKeys);
|
|
16
|
+
if (value.trim().length === 0) throw new Error(`Anchor param must be non-empty: ${key}`);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function requireInt(params, key) {
|
|
20
|
+
const raw = requireString(params, key);
|
|
21
|
+
const n = Number.parseInt(raw, 10);
|
|
22
|
+
if (Number.isNaN(n)) throw new Error(`Invalid integer for anchor param ${key}: ${raw}`);
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
const POSITIVE_INT = /^[1-9]\d*$/;
|
|
26
|
+
function requirePositiveInt(params, key) {
|
|
27
|
+
const raw = requireString(params, key).trim();
|
|
28
|
+
if (!POSITIVE_INT.test(raw)) {
|
|
29
|
+
throw new Error(`Anchor param must be a positive integer: ${key}: ${raw}`);
|
|
30
|
+
}
|
|
31
|
+
return Number(raw);
|
|
32
|
+
}
|
|
33
|
+
function requireSingle(params, key) {
|
|
34
|
+
const values = params.getAll(key);
|
|
35
|
+
const [value] = values;
|
|
36
|
+
if (value == null) throw new Error(`Missing required anchor param: ${key}`);
|
|
37
|
+
if (values.length > 1) throw new Error(`Anchor param must not repeat: ${key}`);
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
const ASCII_DECIMAL = /^\d+$/;
|
|
41
|
+
const PYTHON_INT_MAX_STR_DIGITS = 4300;
|
|
42
|
+
function requireAsciiDecimal(params, key) {
|
|
43
|
+
const raw = requireSingle(params, key);
|
|
44
|
+
if (!ASCII_DECIMAL.test(raw)) {
|
|
45
|
+
throw new Error(`Anchor param must be an ASCII decimal: ${key}: ${raw}`);
|
|
46
|
+
}
|
|
47
|
+
if (raw.length > PYTHON_INT_MAX_STR_DIGITS) {
|
|
48
|
+
throw new Error(`Anchor param is too long to be an integer: ${key}`);
|
|
49
|
+
}
|
|
50
|
+
return Number(raw);
|
|
51
|
+
}
|
|
52
|
+
function parseFileLineRange(params) {
|
|
53
|
+
const path = requireSingle(params, "path");
|
|
54
|
+
if (path.includes("�")) {
|
|
55
|
+
throw new Error("path must not contain U+FFFD (a malformed percent-escape)");
|
|
56
|
+
}
|
|
57
|
+
const anchor = {
|
|
58
|
+
type: "file_line_range",
|
|
59
|
+
path,
|
|
60
|
+
startLine: requireAsciiDecimal(params, "start_line"),
|
|
61
|
+
endLine: requireAsciiDecimal(params, "end_line")
|
|
62
|
+
};
|
|
63
|
+
const problem = fileLineRangeAnchorProblem(anchor);
|
|
64
|
+
if (problem) throw new Error(problem);
|
|
65
|
+
return anchor;
|
|
66
|
+
}
|
|
67
|
+
function parseSheetId(params) {
|
|
68
|
+
const raw = requireString(params, "sheet_id");
|
|
69
|
+
const n = Number.parseInt(raw, 10);
|
|
70
|
+
return Number.isNaN(n) ? 0 : n;
|
|
71
|
+
}
|
|
72
|
+
function requireFloat(params, key) {
|
|
73
|
+
const raw = requireString(params, key);
|
|
74
|
+
const n = Number.parseFloat(raw);
|
|
75
|
+
if (Number.isNaN(n)) throw new Error(`Invalid number for anchor param ${key}: ${raw}`);
|
|
76
|
+
return n;
|
|
77
|
+
}
|
|
78
|
+
function parseJsonObject(raw) {
|
|
79
|
+
const parsed = JSON.parse(raw);
|
|
80
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
81
|
+
throw new Error("Expected a JSON object");
|
|
82
|
+
}
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
function parseStringRecord(raw) {
|
|
86
|
+
return Object.fromEntries(
|
|
87
|
+
Object.entries(parseJsonObject(raw)).map(([key, value]) => [key, String(value)])
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
function parseOptionalStringRecord(raw) {
|
|
91
|
+
if (raw == null) return void 0;
|
|
92
|
+
try {
|
|
93
|
+
return parseStringRecord(raw);
|
|
94
|
+
} catch {
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function parseOptionalShiftLogFrontier(raw) {
|
|
99
|
+
if (raw == null) return void 0;
|
|
100
|
+
try {
|
|
101
|
+
const frontier = {};
|
|
102
|
+
for (const [writer, seq] of Object.entries(parseJsonObject(raw))) {
|
|
103
|
+
if (typeof seq !== "number" || !Number.isInteger(seq) || seq < 0) return void 0;
|
|
104
|
+
frontier[writer] = seq;
|
|
105
|
+
}
|
|
106
|
+
return frontier;
|
|
107
|
+
} catch {
|
|
108
|
+
return void 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function parseRelationship(raw) {
|
|
112
|
+
return raw === "exact" || raw === "supporting" ? raw : void 0;
|
|
113
|
+
}
|
|
114
|
+
function parseAnchorByType(anchorType, params) {
|
|
115
|
+
try {
|
|
116
|
+
switch (anchorType) {
|
|
117
|
+
case "cell":
|
|
118
|
+
return { type: "cell", cellId: requireString(params, "cell_id") };
|
|
119
|
+
case "cell_range":
|
|
120
|
+
return {
|
|
121
|
+
type: "cell_range",
|
|
122
|
+
startCellId: requireString(params, "start_cell_id"),
|
|
123
|
+
endCellId: requireString(params, "end_cell_id")
|
|
124
|
+
};
|
|
125
|
+
case "comment":
|
|
126
|
+
return {
|
|
127
|
+
type: "comment",
|
|
128
|
+
threadId: requireString(params, "thread_id"),
|
|
129
|
+
commentId: requireString(params, "comment_id")
|
|
130
|
+
};
|
|
131
|
+
case "comment_thread":
|
|
132
|
+
return {
|
|
133
|
+
type: "comment_thread",
|
|
134
|
+
threadId: requireString(params, "thread_id")
|
|
135
|
+
};
|
|
136
|
+
case "file_line_range":
|
|
137
|
+
return parseFileLineRange(params);
|
|
138
|
+
case "line":
|
|
139
|
+
return { type: "line", line: requireInt(params, "line") };
|
|
140
|
+
case "line_range":
|
|
141
|
+
return {
|
|
142
|
+
type: "line_range",
|
|
143
|
+
startLine: requireInt(params, "start_line"),
|
|
144
|
+
endLine: requireInt(params, "end_line")
|
|
145
|
+
};
|
|
146
|
+
case "msg":
|
|
147
|
+
return { type: "msg", messageId: requireNonEmptyString(params, "msg_id", "message_id") };
|
|
148
|
+
case "msg_range":
|
|
149
|
+
return {
|
|
150
|
+
type: "msg_range",
|
|
151
|
+
startMessageId: requireNonEmptyString(params, "start_msg_id", "start_message_id"),
|
|
152
|
+
endMessageId: requireNonEmptyString(params, "end_msg_id", "end_message_id")
|
|
153
|
+
};
|
|
154
|
+
case "msg_block": {
|
|
155
|
+
const hash = params.get("hash");
|
|
156
|
+
return {
|
|
157
|
+
type: "msg_block",
|
|
158
|
+
messageId: requireNonEmptyString(params, "msg_id"),
|
|
159
|
+
block: requirePositiveInt(params, "block"),
|
|
160
|
+
...hash ? { hash } : {}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
case "msg_section": {
|
|
164
|
+
const nth = params.get("nth") != null ? requirePositiveInt(params, "nth") : void 0;
|
|
165
|
+
return {
|
|
166
|
+
type: "msg_section",
|
|
167
|
+
messageId: requireNonEmptyString(params, "msg_id"),
|
|
168
|
+
heading: requireNonEmptyString(params, "heading"),
|
|
169
|
+
...nth != null ? { nth } : {}
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
case "msg_text": {
|
|
173
|
+
const block = params.get("block") != null ? requirePositiveInt(params, "block") : void 0;
|
|
174
|
+
const prefix = params.get("prefix");
|
|
175
|
+
const suffix = params.get("suffix");
|
|
176
|
+
return {
|
|
177
|
+
type: "msg_text",
|
|
178
|
+
messageId: requireNonEmptyString(params, "msg_id"),
|
|
179
|
+
text: requireNonEmptyString(params, "text"),
|
|
180
|
+
...block != null ? { block } : {},
|
|
181
|
+
...prefix ? { prefix } : {},
|
|
182
|
+
...suffix ? { suffix } : {}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
case "page":
|
|
186
|
+
return { type: "page", page: requireInt(params, "page") };
|
|
187
|
+
case "page_range":
|
|
188
|
+
return {
|
|
189
|
+
type: "page_range",
|
|
190
|
+
startPage: requireInt(params, "start_page"),
|
|
191
|
+
endPage: requireInt(params, "end_page")
|
|
192
|
+
};
|
|
193
|
+
case "page_rect": {
|
|
194
|
+
const unitRaw = params.get("unit");
|
|
195
|
+
return {
|
|
196
|
+
type: "page_rect",
|
|
197
|
+
page: requireInt(params, "page"),
|
|
198
|
+
x: requireFloat(params, "x"),
|
|
199
|
+
y: requireFloat(params, "y"),
|
|
200
|
+
width: requireFloat(params, "width"),
|
|
201
|
+
height: requireFloat(params, "height"),
|
|
202
|
+
...unitRaw === "percent" || unitRaw === "point" ? { unit: unitRaw } : {}
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
case "page_text": {
|
|
206
|
+
const prefix = params.get("prefix");
|
|
207
|
+
const suffix = params.get("suffix");
|
|
208
|
+
const hash = params.get("hash");
|
|
209
|
+
return {
|
|
210
|
+
type: "page_text",
|
|
211
|
+
page: requireInt(params, "page"),
|
|
212
|
+
text: requireString(params, "text"),
|
|
213
|
+
...prefix ? { prefix } : {},
|
|
214
|
+
...suffix ? { suffix } : {},
|
|
215
|
+
...hash ? { hash } : {}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
case "path": {
|
|
219
|
+
const line = params.get("line") != null ? requireInt(params, "line") : void 0;
|
|
220
|
+
const column = line != null && params.get("column") != null ? requireInt(params, "column") : void 0;
|
|
221
|
+
return {
|
|
222
|
+
type: "path",
|
|
223
|
+
path: requireString(params, "path"),
|
|
224
|
+
...line != null ? { line } : {},
|
|
225
|
+
...column != null ? { column } : {}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case "pixel_range":
|
|
229
|
+
return {
|
|
230
|
+
type: "pixel_range",
|
|
231
|
+
x: requireFloat(params, "x"),
|
|
232
|
+
y: requireFloat(params, "y"),
|
|
233
|
+
width: requireFloat(params, "width"),
|
|
234
|
+
height: requireFloat(params, "height")
|
|
235
|
+
};
|
|
236
|
+
case "pm_node":
|
|
237
|
+
return { type: "pm_node", nodeId: requireString(params, "node_id") };
|
|
238
|
+
case "pm_node_range":
|
|
239
|
+
return {
|
|
240
|
+
type: "pm_node_range",
|
|
241
|
+
startNodeId: requireString(params, "start_node_id"),
|
|
242
|
+
endNodeId: requireString(params, "end_node_id")
|
|
243
|
+
};
|
|
244
|
+
case "pm_mark":
|
|
245
|
+
return { type: "pm_mark", markId: requireString(params, "mark_id") };
|
|
246
|
+
case "rect":
|
|
247
|
+
return {
|
|
248
|
+
type: "rect",
|
|
249
|
+
x: requireFloat(params, "x"),
|
|
250
|
+
y: requireFloat(params, "y"),
|
|
251
|
+
width: requireFloat(params, "width"),
|
|
252
|
+
height: requireFloat(params, "height")
|
|
253
|
+
};
|
|
254
|
+
case "section": {
|
|
255
|
+
const topic = params.get("topic") != null ? requirePositiveInt(params, "topic") : void 0;
|
|
256
|
+
return {
|
|
257
|
+
type: "section",
|
|
258
|
+
section: requireString(params, "section"),
|
|
259
|
+
...topic != null ? { topic } : {}
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
case "semantic_query": {
|
|
263
|
+
const anchor = {
|
|
264
|
+
type: "semantic_query",
|
|
265
|
+
query: parseJsonObject(requireString(params, "query"))
|
|
266
|
+
};
|
|
267
|
+
const field = params.get("field");
|
|
268
|
+
if (field != null) anchor.field = field;
|
|
269
|
+
const rowKey = params.get("row_key");
|
|
270
|
+
if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);
|
|
271
|
+
if (params.get("row_index") != null) anchor.rowIndex = requireInt(params, "row_index");
|
|
272
|
+
const relationship = parseRelationship(params.get("relationship"));
|
|
273
|
+
if (relationship != null) anchor.relationship = relationship;
|
|
274
|
+
if (params.get("schema_version") != null) {
|
|
275
|
+
anchor.schemaVersion = requireInt(params, "schema_version");
|
|
276
|
+
}
|
|
277
|
+
const schemaHash = params.get("schema_hash");
|
|
278
|
+
if (schemaHash != null) anchor.schemaHash = schemaHash;
|
|
279
|
+
const sourceSnapshots = parseOptionalStringRecord(params.get("source_snapshots"));
|
|
280
|
+
if (sourceSnapshots != null) anchor.sourceSnapshots = sourceSnapshots;
|
|
281
|
+
const dataAsOf = params.get("data_as_of");
|
|
282
|
+
if (dataAsOf != null) anchor.dataAsOf = dataAsOf;
|
|
283
|
+
return anchor;
|
|
284
|
+
}
|
|
285
|
+
case "shape": {
|
|
286
|
+
const shapeIds = requireString(params, "shape_ids").split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
287
|
+
if (shapeIds.length === 0) {
|
|
288
|
+
throw new Error("Anchor param must be non-empty: shape_ids");
|
|
289
|
+
}
|
|
290
|
+
const shapeSlideId = params.get("slide_id");
|
|
291
|
+
const shapeSlideIndexRaw = params.get("slide_index");
|
|
292
|
+
return {
|
|
293
|
+
type: "shape",
|
|
294
|
+
shapeIds,
|
|
295
|
+
...shapeSlideId != null ? { slideId: shapeSlideId } : {},
|
|
296
|
+
...shapeSlideIndexRaw != null ? { slideIndex: requireInt(params, "slide_index") } : {}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
case "sheet_cell": {
|
|
300
|
+
const chartId = params.get("chart");
|
|
301
|
+
return {
|
|
302
|
+
type: "sheet_cell",
|
|
303
|
+
sheetId: parseSheetId(params),
|
|
304
|
+
cell: requireString(params, "cell"),
|
|
305
|
+
...chartId ? { chartId } : {}
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
case "sheet_range": {
|
|
309
|
+
const frontier = parseOptionalShiftLogFrontier(params.get("frontier"));
|
|
310
|
+
return {
|
|
311
|
+
type: "sheet_range",
|
|
312
|
+
sheetId: parseSheetId(params),
|
|
313
|
+
range: requireString(params, "range"),
|
|
314
|
+
...frontier ? { frontier } : {}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
case "sheet_tab":
|
|
318
|
+
return {
|
|
319
|
+
type: "sheet_tab",
|
|
320
|
+
sheetId: parseSheetId(params)
|
|
321
|
+
};
|
|
322
|
+
case "sheet_table": {
|
|
323
|
+
const fallbackRange = params.get("fallback_range");
|
|
324
|
+
return {
|
|
325
|
+
type: "sheet_table",
|
|
326
|
+
sheetId: parseSheetId(params),
|
|
327
|
+
tableName: requireString(params, "table_name"),
|
|
328
|
+
...fallbackRange != null ? { fallbackRange } : {}
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
case "lakehouse_table": {
|
|
332
|
+
const tableUuid = params.get("table_uuid");
|
|
333
|
+
const snapshotId = params.get("snapshot_id");
|
|
334
|
+
return {
|
|
335
|
+
type: "lakehouse_table",
|
|
336
|
+
table: requireString(params, "table"),
|
|
337
|
+
...tableUuid ? { tableUuid } : {},
|
|
338
|
+
...snapshotId ? { snapshotId } : {}
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
case "slide": {
|
|
342
|
+
let slideId = params.get("slide_id");
|
|
343
|
+
let slideIndex = params.get("slide_index") != null ? requireInt(params, "slide_index") : void 0;
|
|
344
|
+
const bareSlide = params.get("slide");
|
|
345
|
+
if (bareSlide != null && slideId == null && slideIndex == null) {
|
|
346
|
+
const n = Number.parseInt(bareSlide, 10);
|
|
347
|
+
if (Number.isNaN(n)) {
|
|
348
|
+
slideId = bareSlide;
|
|
349
|
+
} else {
|
|
350
|
+
slideIndex = n;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (slideId == null && slideIndex == null) {
|
|
354
|
+
throw new Error("Provide slide_id and/or slide_index (1-based)");
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
type: "slide",
|
|
358
|
+
...slideId != null ? { slideId } : {},
|
|
359
|
+
...slideIndex != null ? { slideIndex } : {}
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
case "sql_query": {
|
|
363
|
+
const anchor = { type: "sql_query" };
|
|
364
|
+
const sql = params.get("sql");
|
|
365
|
+
if (sql != null) anchor.sql = sql;
|
|
366
|
+
const snippetId = params.get("query_snippet_asset_id");
|
|
367
|
+
if (snippetId != null) anchor.querySnippetAssetId = snippetId;
|
|
368
|
+
const dialect = params.get("dialect");
|
|
369
|
+
if (dialect != null) anchor.dialect = dialect;
|
|
370
|
+
const field = params.get("field");
|
|
371
|
+
if (field != null) anchor.field = field;
|
|
372
|
+
const rowKey = params.get("row_key");
|
|
373
|
+
if (rowKey != null) anchor.rowKey = parseStringRecord(rowKey);
|
|
374
|
+
if (params.get("row_index") != null) anchor.rowIndex = requireInt(params, "row_index");
|
|
375
|
+
const relationship = parseRelationship(params.get("relationship"));
|
|
376
|
+
if (relationship != null) anchor.relationship = relationship;
|
|
377
|
+
if (anchor.sql === void 0 && anchor.querySnippetAssetId === void 0) {
|
|
378
|
+
return void 0;
|
|
379
|
+
}
|
|
380
|
+
return anchor;
|
|
381
|
+
}
|
|
382
|
+
case "time":
|
|
383
|
+
return { type: "time", time: requireString(params, "time") };
|
|
384
|
+
case "time_range":
|
|
385
|
+
return {
|
|
386
|
+
type: "time_range",
|
|
387
|
+
startTime: requireString(params, "start_time"),
|
|
388
|
+
endTime: requireString(params, "end_time")
|
|
389
|
+
};
|
|
390
|
+
case "tool_call": {
|
|
391
|
+
const messageId = params.get("msg_id") ?? params.get("message_id");
|
|
392
|
+
return {
|
|
393
|
+
type: "tool_call",
|
|
394
|
+
toolCallId: requireString(params, "tool_call_id"),
|
|
395
|
+
...messageId ? { messageId } : {}
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
default:
|
|
399
|
+
return void 0;
|
|
400
|
+
}
|
|
401
|
+
} catch {
|
|
402
|
+
return void 0;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
export {
|
|
406
|
+
parseAnchorFromParams
|
|
407
|
+
};
|
|
408
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +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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"}
|