@arbidocs/react 0.5.102 → 0.5.104
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/dist/annotations/freeze/index.cjs +14 -14
- package/dist/annotations/freeze/index.js +3 -3
- package/dist/artifacts/index.cjs +45 -45
- package/dist/artifacts/index.js +8 -8
- package/dist/bundle-DCWPYNGD.cjs +14 -0
- package/dist/{bundle-IC65W2AO.cjs.map → bundle-DCWPYNGD.cjs.map} +1 -1
- package/dist/bundle-JCKKGEJE.js +5 -0
- package/dist/{bundle-YNOX7VIL.js.map → bundle-JCKKGEJE.js.map} +1 -1
- package/dist/calls/livekit/index.cjs +51 -51
- package/dist/calls/livekit/index.d.cts +1 -1
- package/dist/calls/livekit/index.d.ts +1 -1
- package/dist/calls/livekit/index.js +6 -6
- package/dist/{chunk-WJME7DI4.cjs → chunk-524AFWK7.cjs} +68 -68
- package/dist/{chunk-WJME7DI4.cjs.map → chunk-524AFWK7.cjs.map} +1 -1
- package/dist/{chunk-Q65QCWNI.cjs → chunk-6TUNWGRJ.cjs} +60 -60
- package/dist/{chunk-Q65QCWNI.cjs.map → chunk-6TUNWGRJ.cjs.map} +1 -1
- package/dist/{chunk-NDIKMOBJ.cjs → chunk-7C77IBQZ.cjs} +3 -3
- package/dist/{chunk-NDIKMOBJ.cjs.map → chunk-7C77IBQZ.cjs.map} +1 -1
- package/dist/{chunk-OYPKKHXY.js → chunk-7KZS22EK.js} +4 -4
- package/dist/{chunk-OYPKKHXY.js.map → chunk-7KZS22EK.js.map} +1 -1
- package/dist/{chunk-NIKPG4PW.js → chunk-A2XSLTIP.js} +3 -3
- package/dist/{chunk-NIKPG4PW.js.map → chunk-A2XSLTIP.js.map} +1 -1
- package/dist/{chunk-ALT6ETIE.js → chunk-A6HUB6PX.js} +6 -6
- package/dist/{chunk-ALT6ETIE.js.map → chunk-A6HUB6PX.js.map} +1 -1
- package/dist/{chunk-PC4O3JDV.cjs → chunk-B6I2HRRF.cjs} +3 -3
- package/dist/{chunk-PC4O3JDV.cjs.map → chunk-B6I2HRRF.cjs.map} +1 -1
- package/dist/{chunk-UW2SGTI5.js → chunk-GR7CZEJJ.js} +3 -3
- package/dist/{chunk-UW2SGTI5.js.map → chunk-GR7CZEJJ.js.map} +1 -1
- package/dist/{chunk-VIOW22Q4.cjs → chunk-IXE7HCCA.cjs} +44 -44
- package/dist/{chunk-VIOW22Q4.cjs.map → chunk-IXE7HCCA.cjs.map} +1 -1
- package/dist/{chunk-4SH5INC3.js → chunk-LD2SJBXC.js} +5 -5
- package/dist/{chunk-4SH5INC3.js.map → chunk-LD2SJBXC.js.map} +1 -1
- package/dist/{chunk-6SG2OGDR.js → chunk-M74JCOXW.js} +7 -2
- package/dist/chunk-M74JCOXW.js.map +1 -0
- package/dist/{chunk-YIZH5RVW.js → chunk-MAUZSNQY.js} +3 -3
- package/dist/{chunk-YIZH5RVW.js.map → chunk-MAUZSNQY.js.map} +1 -1
- package/dist/{chunk-HAGC67GL.cjs → chunk-Q2GNEVG2.cjs} +7 -2
- package/dist/chunk-Q2GNEVG2.cjs.map +1 -0
- package/dist/{chunk-ZEGCZATR.js → chunk-RC42YRVA.js} +4 -4
- package/dist/{chunk-ZEGCZATR.js.map → chunk-RC42YRVA.js.map} +1 -1
- package/dist/{chunk-Z3W4XFWB.cjs → chunk-TTHJNRLY.cjs} +5 -5
- package/dist/{chunk-Z3W4XFWB.cjs.map → chunk-TTHJNRLY.cjs.map} +1 -1
- package/dist/{chunk-5X3JANHT.js → chunk-V73GLDHD.js} +4 -4
- package/dist/{chunk-5X3JANHT.js.map → chunk-V73GLDHD.js.map} +1 -1
- package/dist/{chunk-ORBUPHMV.cjs → chunk-YD25DEMR.cjs} +41 -41
- package/dist/{chunk-ORBUPHMV.cjs.map → chunk-YD25DEMR.cjs.map} +1 -1
- package/dist/{chunk-5EELSW26.cjs → chunk-YNKV4MN6.cjs} +6 -6
- package/dist/{chunk-5EELSW26.cjs.map → chunk-YNKV4MN6.cjs.map} +1 -1
- package/dist/document-tools/core.cjs +100 -100
- package/dist/document-tools/core.d.cts +2 -2
- package/dist/document-tools/core.d.ts +2 -2
- package/dist/document-tools/core.js +5 -5
- package/dist/document-tools/index.cjs +103 -103
- package/dist/document-tools/index.d.cts +1 -1
- package/dist/document-tools/index.d.ts +1 -1
- package/dist/document-tools/index.js +7 -7
- package/dist/index.cjs +2355 -2211
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +137 -27
- package/dist/index.d.ts +137 -27
- package/dist/index.js +175 -39
- package/dist/index.js.map +1 -1
- package/dist/{query-keys.d-O3lHn6rp.d.cts → query-keys.d-Bpb7R_lB.d.cts} +5 -0
- package/dist/{query-keys.d-O3lHn6rp.d.ts → query-keys.d-Bpb7R_lB.d.ts} +5 -0
- package/dist/shell/index.cjs +39 -39
- package/dist/shell/index.js +4 -4
- package/dist/{useAudioRecorder.d-DpDeeeAZ.d.cts → useAudioRecorder.d-B9rlMI_E.d.cts} +1 -1
- package/dist/{useAudioRecorder.d-DpDeeeAZ.d.ts → useAudioRecorder.d-B9rlMI_E.d.ts} +1 -1
- package/package.json +3 -3
- package/dist/bundle-IC65W2AO.cjs +0 -14
- package/dist/bundle-YNOX7VIL.js +0 -5
- package/dist/chunk-6SG2OGDR.js.map +0 -1
- package/dist/chunk-HAGC67GL.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/stored-markdown.ts","../src/artifacts/versions.ts"],"names":[],"mappings":"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","file":"chunk-UW2SGTI5.js","sourcesContent":["/**\n * Helpers for markdown that is STORED (an agent's draft saved as an artifact, then read back from\n * the backend's parse). Pure and SDK-free; they sit next to `normalizeCitationMarkup`, which they\n * build on.\n *\n * Two directions:\n *\n * - Going in (`cleanDraftMarkdown` = `unwrapCitationLinks` + `stripAgentPreamble` +\n * `promoteBoldTitle`): a streamed draft carries citation links, `(*Source: ...*)` notes and\n * sometimes narration before the document. A stored letter should hold only the letter.\n * - Coming out (`unescapeMarkdown`): the backend's parse of a stored `.md` returns the text with\n * markdown punctuation backslash-escaped (`**Fees.**` comes back as `\\*\\*Fees\\.\\*\\*`).\n */\n\nimport { normalizeCitationMarkup } from './normalize-citations'\n\nconst FENCE = /^\\s*(```|~~~)/\n\n/** Run `fn` on every line outside a fenced code block. */\nfunction mapOutsideFences(text: string, fn: (line: string) => string): string {\n let inFence = false\n return text\n .split('\\n')\n .map((line) => {\n if (FENCE.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : fn(line)\n })\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Coming out: undo the parser's escaping\n// ---------------------------------------------------------------------------------------------\n\n/** A backslash followed by markdown punctuation: the only thing the parser's escaping produces. */\nconst ESCAPED_PUNCTUATION = /\\\\([\\\\`*_{}[\\]()#+\\-.!|>~<])/g\n/** The only escapes the parser puts inside an inline code span. */\nconst ESCAPED_EMPHASIS = /\\\\([*_])/g\nconst INLINE_CODE = /(`+)(?!`)(.+?)(?<!`)\\1(?!`)/g\n\n/**\n * Undo the backend's escaping of a markdown artifact: `\\*\\*Scope\\.\\*\\*` becomes `**Scope.**`.\n *\n * THE RULE. Apply this ONLY to text of an artifact that was stored from markdown (an agent draft\n * or an edited version, always uploaded as `.md`): for those the parser escapes every markdown\n * punctuation character, including the backslash itself, so removing one level of escaping is the\n * exact inverse (an author's literal `\\*` is stored as `\\\\\\*` and comes back as `\\*`). Do not\n * apply it to a PDF or Word parse, where a backslash is just a character.\n *\n * Details:\n * - Only a backslash followed by markdown punctuation (``\\ ` * _ { } [ ] ( ) # + - . ! | > ~ <``)\n * is removed; `\\n`, `C:\\temp` and a trailing backslash are left alone.\n * - Pairs are read left to right, so `\\\\*` is an escaped backslash followed by a bare `*`.\n * - Fenced code blocks are never touched (the parser does not escape inside them).\n * - Inline code spans: the parser DOES escape `*` and `_` there (`` `a*b` `` comes back as\n * `` `a\\*b` ``), so only `\\*` and `\\_` are undone inside a span; any other backslash in code\n * (`` `re\\.x` ``) is a literal and stays.\n */\nexport function unescapeMarkdown(text: string): string {\n if (!text.includes('\\\\')) return text\n return mapOutsideFences(text, (line) => {\n if (!line.includes('\\\\')) return line\n let out = ''\n let last = 0\n for (const span of line.matchAll(INLINE_CODE)) {\n const at = span.index ?? 0\n out +=\n line.slice(last, at).replace(ESCAPED_PUNCTUATION, '$1') +\n span[0].replace(ESCAPED_EMPHASIS, '$1')\n last = at + span[0].length\n }\n return out + line.slice(last).replace(ESCAPED_PUNCTUATION, '$1')\n })\n}\n\n/**\n * The parser also mangles the TITLE of a stored markdown document (seen on a real backend): the\n * first heading comes back doubled (`## # Title`) or alone inside a code fence\n * (a fence, `# Title`, a fence). Both are repaired, on the first non-blank line only, so a code\n * block or heading later in the text is never touched. Like `unescapeMarkdown`, apply it only to\n * artifacts stored from markdown.\n */\nexport function repairParsedTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const doubled = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/.exec(lines[first])\n if (doubled) {\n lines[first] = doubled[1]\n return lines.join('\\n')\n }\n if (/^\\s*```\\s*$/.test(lines[first]) && /^#{1,6}\\s+\\S/.test(lines[first + 1] ?? '')) {\n if (/^\\s*```\\s*$/.test(lines[first + 2] ?? '')) lines.splice(first + 2, 1)\n else return text\n lines.splice(first, 1)\n return lines.join('\\n')\n }\n return text\n}\n\nconst DOUBLED_HEADING = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_HEADING = /^[-*+]\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_IN_LIST = /^[-*+]\\s+[-*+]\\s+(\\S.*)$/\nconst LIST_ORDINAL = /^[-*+]\\s+(\\d{1,9})([.)])\\s+(\\S.*)$/\nconst LIST_ITEM_LINE = /^\\s*(?:[-*+]|\\d{1,9}[.)])\\s/\nconst TABLE_DELIMITER_CELL = /^:?-{1,}:?$/\n\n/** `1. a 2. b 3. c` (one line) split where the next ordinal follows: `['1. a', '2. b', '3. c']`. */\nfunction splitRunOfOrdinals(first: number, delimiter: string, rest: string): string[] {\n const items: string[] = []\n let n = first\n let remaining = rest\n for (;;) {\n const next = new RegExp(`^(.+?)\\\\s+${n + 1}\\\\${delimiter}\\\\s+(\\\\S.*)$`).exec(remaining)\n if (!next) break\n items.push(`${n}${delimiter} ${next[1]}`)\n n += 1\n remaining = next[2]\n }\n items.push(`${n}${delimiter} ${remaining}`)\n return items\n}\n\n/**\n * A table the parser put on ONE line (`| h | h | |---|---| | a | b |`, rows joined by a space, which\n * leaves one empty cell between rows) back as a pipe table. `null` when the line is not that shape.\n */\nfunction rebuildFlatTable(line: string): string[] | null {\n const trimmed = line.trim()\n if (!trimmed.startsWith('|') || !trimmed.endsWith('|')) return null\n const cells = trimmed\n .slice(1, -1)\n .split('|')\n .map((c) => c.trim())\n const firstRule = cells.findIndex((c) => TABLE_DELIMITER_CELL.test(c))\n if (firstRule < 2 || cells[firstRule - 1] !== '') return null\n const columns = firstRule - 1\n const rows: string[][] = []\n for (let at = 0; at < cells.length; at += columns + 1) {\n const row = cells.slice(at, at + columns)\n const gap = cells[at + columns]\n if (row.length !== columns || (gap !== undefined && gap !== '')) return null\n rows.push(row)\n }\n const [header, rule, ...body] = rows\n if (!rule.every((c) => TABLE_DELIMITER_CELL.test(c))) return null\n const fmt = (row: string[]): string => `| ${row.join(' | ')} |`\n return [fmt(header), fmt(rule.map(() => '---')), ...body.map(fmt)]\n}\n\n/**\n * Undo how the backend's parse of a stored `.md` restructures it (seen on a real backend):\n * - a heading comes back doubled (`## # Title`) or as a list item (`- # Title`);\n * - every list item gets a `- ` of its own on top of the original marker, so `* a` returns as\n * `- * a` and `1. a` as `- 1. a`, which a markdown editor loads as a list inside a list item\n * (and saves as `- - a`); a run of ordinals can come back on one line (`- 1. a 2. b`);\n * - a table comes back on one line.\n * List nesting and the bullet/ordered difference of a flat `- x` cannot be recovered, so items\n * stay flat. Items of one list are kept tight (no blank line between them). Fenced code is\n * never touched. Like `unescapeMarkdown`, apply it only to artifacts stored from markdown.\n */\nexport function repairParsedStructure(text: string): string {\n const out: string[] = []\n let inFence = false\n for (const line of text.split('\\n')) {\n if (FENCE.test(line)) {\n inFence = !inFence\n out.push(line)\n continue\n }\n if (inFence) {\n out.push(line)\n continue\n }\n const table = rebuildFlatTable(line)\n if (table) {\n out.push(...table)\n continue\n }\n const heading = DOUBLED_HEADING.exec(line) ?? LIST_HEADING.exec(line)\n if (heading) {\n out.push(heading[1])\n continue\n }\n const ordinal = LIST_ORDINAL.exec(line)\n if (ordinal) {\n out.push(...splitRunOfOrdinals(Number(ordinal[1]), ordinal[2], ordinal[3]))\n continue\n }\n const nested = LIST_IN_LIST.exec(line)\n out.push(nested ? `- ${nested[1]}` : line)\n }\n // Items parsed as separate chunks arrive one blank line apart: that is one tight list.\n return out\n .filter(\n (line, i) =>\n !(\n line === '' &&\n LIST_ITEM_LINE.test(out[i - 1] ?? '') &&\n LIST_ITEM_LINE.test(out[i + 1] ?? '')\n )\n )\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Going in: clean a streamed draft before it is stored\n// ---------------------------------------------------------------------------------------------\n\n/** `(*Source: Terms.pdf*)`, `(Sources: a, b)` and the italic form `*(Source: ...)*`. */\nconst SOURCE_NOTE =\n /[ \\t]*(?:\\*+\\(\\s*Sources?\\s*:[^)\\n]*\\)\\*+|\\(\\s*\\*{0,2}\\s*Sources?\\s*:[^)\\n]*\\))/gi\nconst CITE_TOKEN = /^\\]\\(#cite-[\\w-]+\\)/\n\n/**\n * Remove the citation links of ONE line and keep every word. A link is `[text](#cite-N)`, but the\n * model also writes brackets inside the text (`[We act for [PLACEHOLDER].](#cite-1)`) and links that\n * overlap other brackets, so a regex cannot find the opening bracket. This scans the line with a\n * stack of `[`: a `](#cite-N)` takes the nearest open `[` with it (both are removed, the text\n * between stays); a plain `]` closes the nearest `[`; a `](#cite-N)` with no open `[` loses only\n * the marker. Brackets that are not part of a link are never touched.\n */\nfunction removeCitationLinks(line: string): string {\n if (!line.includes('](#cite-')) return line\n const drop = new Set<number>()\n const open: number[] = []\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '[') open.push(i)\n else if (c === ']') {\n const token = CITE_TOKEN.exec(line.slice(i, i + 40))\n if (token) {\n const opener = open.pop()\n if (opener !== undefined) drop.add(opener)\n for (let k = i; k < i + token[0].length; k++) drop.add(k)\n i += token[0].length - 1\n } else open.pop()\n }\n }\n let out = ''\n for (let i = 0; i < line.length; i++) if (!drop.has(i)) out += line[i]\n return out\n}\n\n/** A line whose `**` do not pair up (one half was wrapped into a link) loses the stray marks. */\nfunction balanceBold(line: string): string {\n // A bold-wrapped heading (`**# Title**`) is just a heading.\n if (/^\\s*\\*\\*#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '').trim()\n if ((line.match(/\\*\\*/g)?.length ?? 0) % 2 === 0) return line\n if (/^#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '')\n return line.replace(/\\*\\*\\s*$/, '').replace(/^(\\s*(?:[-*]\\s+)?)\\*\\*(?=\\s)/, '$1')\n}\n\n/**\n * Text for storage from text that carries citations: `normalizeCitationMarkup` first (it hoists\n * list, heading and bold tokens out of the link so unwrapping cannot orphan half of a `**` pair),\n * then `[text](#cite-N)` becomes `text`, `(*Source: ...*)` notes are dropped, and a bold or\n * heading marker that lost its partner is repaired. Fenced code is left alone.\n */\nexport function unwrapCitationLinks(text: string): string {\n const withoutNotes = mapOutsideFences(text, (line) => line.replace(SOURCE_NOTE, ''))\n return mapOutsideFences(normalizeCitationMarkup(withoutNotes), (line) => {\n const unlinked = removeCitationLinks(line)\n return unlinked === line ? line : balanceBold(unlinked)\n })\n}\n\nconst HEADING = /^#{1,6}\\s+\\S/\nconst HR_ONLY = /^\\s*(?:-{3,}|\\*{3,}|_{3,})\\s*$/\n/** A whole-line bold title: `**Client Engagement Letter**`. */\nconst BOLD_LINE = /^\\*\\*[^*#].*\\*\\*$/\nconst MAX_PREAMBLE_CHARS = 900\nconst MAX_PREAMBLE_PARAGRAPHS = 4\nconst MAX_TITLE_CHARS = 100\n\n/**\n * How a paragraph of agent narration opens. An ALLOW-LIST: a paragraph that opens any other way is\n * treated as document text and never removed.\n */\nconst NARRATION_OPENER =\n /^(?:I(?:['’](?:ll|ve|m|d))?\\s|let me\\b|here(?:['’]s| is| are)\\b|below is\\b|sure[,.! ]|certainly[,.! ]|of course[,.! ]|okay[,.! ]|based on (?:the|your|my)\\b|per the (?:user|instructions?)|as requested\\b|the workspace\\b|no (?:relevant |workspace |matching )?documents?\\b|there (?:are|is) no (?:relevant |workspace )?documents?\\b|after (?:reviewing|reading|searching)\\b)/i\n\n/** Structure a covering note would not have: lists, tables, quotes, code, headings, bold, links. */\nconst STRUCTURED = /^\\s*(?:[-*+>|]|\\d{1,9}[.)]\\s|#{1,6}\\s|```|~~~)|\\*\\*|\\]\\(/m\n\n/**\n * Cut the agent's narration written BEFORE the document. Strictly non-destructive: if in doubt the\n * text is returned whole (a stray sentence is easy to delete, a lost clause is not recoverable).\n *\n * Text is removed only when ALL of these hold:\n * 1. a real markdown heading line (`# Title`, any level) follows it, and the cut stops exactly at\n * the FIRST such line (never at a bold line, never at a line that merely contains `**`);\n * 2. what precedes it is at most 4 paragraphs and 900 characters of plain prose (horizontal rules\n * between them are ignored): no list, table, quote, code, heading, bold or link;\n * 3. EVERY paragraph opens with an allow-listed narration opener: first person (\"I'll ...\",\n * \"I now have ...\"), \"Let me\", \"Here is/are\", \"Below is\", \"Sure\", \"Based on the ...\", \"Per the\n * instructions\", \"As requested\", \"The workspace ...\", \"No (relevant) documents ...\", \"There is\n * no document ...\", \"After reviewing ...\".\n * Anything else (a dateline, an address, a salutation, a sentence of the letter) keeps the text whole.\n */\nexport function stripAgentPreamble(text: string): string {\n const lines = text.split('\\n')\n const start = lines.findIndex((l) => HEADING.test(l))\n if (start <= 0) return text\n const before = lines\n .slice(0, start)\n .filter((l) => !HR_ONLY.test(l))\n .join('\\n')\n .trim()\n if (!before) return lines.slice(start).join('\\n')\n const paragraphs = before.split(/\\n\\s*\\n/).map((p) => p.trim())\n const narration =\n before.length <= MAX_PREAMBLE_CHARS &&\n paragraphs.length <= MAX_PREAMBLE_PARAGRAPHS &&\n !STRUCTURED.test(before) &&\n paragraphs.every((p) => NARRATION_OPENER.test(p))\n return narration ? lines.slice(start).join('\\n') : text\n}\n\n/**\n * Make the document's title a real heading: the FIRST non-blank line of the text, when it is a\n * short whole-line bold title (`**Letter**`, even with a stray inner `**`), becomes `# Letter`.\n * Nothing else is ever promoted: not a later line, not a mid-sentence fragment (the title must\n * start with a capital or digit, be at most 100 characters, hold no sentence break and not end in\n * `,` `;` or `:`), and a document that already opens with a heading is left alone.\n */\nexport function promoteBoldTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const line = lines[first].trim()\n if (!BOLD_LINE.test(line)) return text\n const title = line.replace(/\\*\\*/g, '').trim()\n if (\n title.length === 0 ||\n title.length > MAX_TITLE_CHARS ||\n !/^[\\p{Lu}\\d]/u.test(title) ||\n /[,;:]$/.test(title) ||\n /[.!?]\\s+\\S/.test(title)\n ) {\n return text\n }\n lines[first] = `# ${title}`\n return lines.join('\\n')\n}\n\n/** Tidy headings only: strip stray bold marks from heading lines (`# **Title**`). */\nfunction cleanHeadings(text: string): string {\n return mapOutsideFences(text, (line) =>\n /^\\s*#{1,6}\\s/.test(line) ? line.replace(/\\*\\*/g, '').trim() : line\n )\n}\n\n/** Which stage of the cleanup produced the text that is returned. */\nexport type DraftCleanStage = 'cleaned' | 'unwrapped' | 'raw'\n\nexport interface DraftCleanReport {\n /** What to store. */\n text: string\n /**\n * `cleaned`: the full cleanup. `unwrapped`: only the citation links were removed (the preamble or\n * title step was rejected by the guard). `raw`: the input as streamed (even link removal was\n * rejected).\n */\n stage: DraftCleanStage\n /** Length of the returned text over the length of the input without its citation markup. */\n ratio: number\n /** Which steps changed the text before the guard (for logs). */\n changedBy: ('citations' | 'preamble' | 'title')[]\n /** The guard rejected a step because it would have lost content. */\n guarded: boolean\n}\n\nconst MIN_RATIO = 0.7\nconst countMatches = (text: string, re: RegExp): number => text.match(re)?.length ?? 0\nconst LIST_NUMBER = /^\\s*\\d{1,9}[.)]\\s/gm\nconst HEADING_LINE = /^#{1,6}\\s/gm\n/** The text with only its citation markup gone: the floor no cleanup may go far under. */\nconst withoutCitationMarkup = (raw: string): string =>\n mapOutsideFences(raw.replace(SOURCE_NOTE, ''), removeCitationLinks).trim()\nconst tidy = (text: string): string => text.replace(/\\n{3,}/g, '\\n\\n').trim()\n/** `after` is `before` with a leading part removed (a prefix cut, never a cut in the middle). */\nconst isPrefixCut = (before: string, after: string): boolean =>\n before.trimEnd().endsWith(after.trim())\n/** Nothing structural was lost: headings and numbered items are all still there. */\nconst keepsStructure = (candidate: string, reference: string): boolean =>\n countMatches(candidate, LIST_NUMBER) >= countMatches(reference, LIST_NUMBER) &&\n countMatches(candidate, HEADING_LINE) >= countMatches(reference, HEADING_LINE)\n\n/** The three text steps of the cleanup; replaceable so the guard can be tested. */\nexport interface DraftCleanSteps {\n unwrap: (text: string) => string\n strip: (text: string) => string\n promote: (text: string) => string\n}\nconst DEFAULT_CLEAN_STEPS: DraftCleanSteps = {\n unwrap: unwrapCitationLinks,\n strip: stripAgentPreamble,\n promote: promoteBoldTitle,\n}\n\n/**\n * `cleanDraftMarkdown` with a safety net and a report, for storing a streamed draft. Each stage is\n * accepted only if it provably cost nothing but narration and citation markup:\n * - links removed: at least 70% of the text length remains and no heading or numbered item is lost\n * (else `raw`, the input exactly as streamed);\n * - narration removed: only a pure prefix of the text may go, and nothing structural;\n * - title and heading tidy: at least 70% of the text remains and no heading or numbered item is lost.\n * A rejected stage falls back to the previous one (`cleaned` -> `unwrapped` -> `raw`).\n */\nexport function cleanDraftWithReport(\n raw: string,\n steps: DraftCleanSteps = DEFAULT_CLEAN_STEPS\n): DraftCleanReport {\n const floor = withoutCitationMarkup(raw)\n const ratio = (t: string): number => (floor.length ? t.length / floor.length : 1)\n const unwrapped = tidy(steps.unwrap(raw))\n const stripped = tidy(steps.strip(unwrapped))\n const titled = tidy(cleanHeadings(steps.promote(stripped)))\n const changedBy: DraftCleanReport['changedBy'] = []\n if (unwrapped !== raw.trim()) changedBy.push('citations')\n if (stripped !== unwrapped) changedBy.push('preamble')\n if (titled !== stripped) changedBy.push('title')\n\n const unwrappedOk = unwrapped.length >= MIN_RATIO * floor.length && keepsStructure(unwrapped, raw)\n if (!unwrappedOk) return { text: raw, stage: 'raw', ratio: 1, changedBy, guarded: true }\n const strippedOk =\n stripped === unwrapped ||\n (isPrefixCut(unwrapped, stripped) && keepsStructure(stripped, unwrapped))\n const titledOk = titled.length >= MIN_RATIO * stripped.length && keepsStructure(titled, stripped)\n if (strippedOk && titledOk) {\n return { text: titled, stage: 'cleaned', ratio: ratio(titled), changedBy, guarded: false }\n }\n return { text: unwrapped, stage: 'unwrapped', ratio: ratio(unwrapped), changedBy, guarded: true }\n}\n\n/**\n * Everything a streamed draft needs before it is stored as the artifact's first version:\n * `unwrapCitationLinks`, `stripAgentPreamble`, `promoteBoldTitle`, clean headings, collapsed blank\n * runs, trimmed, under the guard of `cleanDraftWithReport` (use it to know which stage was kept).\n */\nexport function cleanDraftMarkdown(raw: string): string {\n return cleanDraftWithReport(raw).text\n}\n","/**\n * Versions of a document. A document keeps ONE id for its whole life; its versions live inside it\n * (`current_version` + `versions`, numbered 1..n). A version is named by a version reference\n * `doc-…@v{n}`; a plain document id means its current version. The workspace list carries every\n * document's `versions`, and `GET /v1/document/{id}/versions` (`arbi.documents.versions`) the same\n * list on its own.\n */\n\nimport { repairParsedStructure, repairParsedTitle, unescapeMarkdown } from '../ai/stored-markdown'\nimport { normalizeMarkdown } from './normalize-markdown'\n\n/** One version entry as the API returns it (a subset of `DocVersion`). */\nexport interface DocVersionEntry {\n n: number\n file_name?: string | null\n created_at?: string | null\n reason?: string | null\n /** The version an edit started from, when it was not the previous one. */\n made_from?: number | null\n is_current?: boolean | null\n /** The assistant message whose turn made this version, and its thread (none: a person's). */\n source_message_ext_id?: string | null\n conversation_ext_id?: string | null\n}\n\n/** The fields of a workspace document the version list needs (a subset of the API type). */\nexport interface VersionedDoc {\n external_id?: string | null\n current_version?: number | null\n versions?: readonly DocVersionEntry[] | null\n file_name?: string | null\n created_at?: string | null\n}\n\n/** One row of a version list. Matches `VersionEntry` of `@arbidocs/blocks/artifacts`. */\nexport interface ArtifactVersion {\n /** The version reference `doc-…@v{n}`: what opening or comparing this version names. */\n id: string\n /** The document (the same for every version). */\n docId: string\n /** File name as stored. */\n name: string\n /** ISO timestamp. */\n createdAt: string\n /** 1-based version number within the document. */\n number: number\n /** upload | edit | signed | sync */\n reason: string\n isCurrent: boolean\n /** The version this one was saved from (an older one than the previous version when restored). */\n savedFromId?: string | null\n /** The thread (and its message) whose turn made this version; none for a person's. */\n thread?: { conversationId: string; messageId: string | null } | null\n}\n\nconst VERSION_REF = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/\n\n/** `doc-…@v{n}`: a reference to version `n` of a document. */\nexport function versionRef(docId: string, version: number): string {\n return `${docId}@v${version}`\n}\n\n/**\n * Split a reference into the document and the version it names. A plain document id (or anything\n * else) names no version: the document's current one.\n */\nexport function parseVersionRef(ref: string | null | undefined): {\n docId: string\n version: number | null\n} {\n const match = VERSION_REF.exec(ref ?? '')\n if (!match) return { docId: ref ?? '', version: null }\n return { docId: match[1], version: Number(match[2]) }\n}\n\n/** The version a version was saved from: `made_from`, else the one before it. */\nexport function savedFromId(docId: string, entry: DocVersionEntry): string | null {\n if (entry.made_from) return versionRef(docId, entry.made_from)\n return entry.n > 1 ? versionRef(docId, entry.n - 1) : null\n}\n\n/** A document's version entries (oldest first) as plain version rows. */\nexport function toArtifactVersions(\n docId: string | null | undefined,\n entries: readonly DocVersionEntry[] | null | undefined,\n currentVersion?: number | null\n): ArtifactVersion[] {\n if (!docId) return []\n const current = currentVersion ?? entries?.find((e) => e.is_current)?.n ?? null\n return [...(entries ?? [])]\n .sort((a, b) => a.n - b.n)\n .map((e) => ({\n id: versionRef(docId, e.n),\n docId,\n name: e.file_name ?? '',\n createdAt: e.created_at ?? '',\n number: e.n,\n reason: e.reason ?? 'upload',\n isCurrent: current != null ? e.n === current : !!e.is_current,\n savedFromId: savedFromId(docId, e),\n thread: e.conversation_ext_id\n ? { conversationId: e.conversation_ext_id, messageId: e.source_message_ext_id ?? null }\n : null,\n }))\n}\n\n/** The versions of a listed document, oldest first (`[]` when the document is not given). */\nexport function documentVersions(doc: VersionedDoc | null | undefined): ArtifactVersion[] {\n if (!doc?.external_id) return []\n const entries = doc.versions?.length\n ? doc.versions\n : [{ n: doc.current_version ?? 1, file_name: doc.file_name, created_at: doc.created_at }]\n return toArtifactVersions(doc.external_id, entries, doc.current_version ?? null)\n}\n\n/** The row `ref` names: an exact version, or (a plain document id) the current version. */\nexport function findVersion(\n versions: readonly ArtifactVersion[],\n ref: string | null | undefined\n): ArtifactVersion | undefined {\n if (!ref) return undefined\n const { docId, version } = parseVersionRef(ref)\n return version == null\n ? versions.find((v) => v.docId === docId && v.isCurrent)\n : versions.find((v) => v.docId === docId && v.number === version)\n}\n\n/**\n * \"v2\": the version number `ref` names. `null` when there is nothing to tell apart (the document\n * has a single version, or it is unknown), so unversioned documents stay unlabelled.\n */\nexport function versionLabel(\n versions: readonly ArtifactVersion[],\n ref: string | null | undefined\n): string | null {\n if (!ref || versions.length <= 1) return null\n const version = findVersion(versions, ref)\n return version ? `v${version.number}` : null\n}\n\n/**\n * Join parsed chunks into one markdown text (blank line between chunks).\n *\n * `unescape: true` for an artifact stored from markdown: the backend's parse of a `.md` escapes\n * markdown punctuation, which `unescapeMarkdown` undoes (see its rule), and mangles its title\n * (`repairParsedTitle`, `repairParsedStructure`: doubled headings, `- ` stacked on list markers,\n * one-line tables), then normalised. Leave it off for the parse\n * of a PDF or Word file.\n */\nexport function flattenChunks(\n chunks: readonly { content?: string | null }[] | null | undefined,\n options?: { unescape?: boolean }\n): string {\n const text = (chunks ?? []).map((c) => (c.content ?? '').trim()).join('\\n\\n')\n if (!options?.unescape) return text\n // Canonical spelling last, so the text an editor starts from is what a save would persist.\n return normalizeMarkdown(\n repairParsedStructure(repairParsedTitle(unescapeMarkdown(text)))\n ).replace(/\\n$/, '')\n}\n\n/** The backend's pattern for a document id. Anything else (a streamed draft's placeholder) is local. */\nconst DOC_ID = /^doc/\n\n/** Is `id` a real, saved document id? Local drafts have placeholder ids and no backend document. */\nexport function isDocumentId(id: string | null | undefined): id is string {\n return !!id && DOC_ID.test(id)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ai/stored-markdown.ts","../src/artifacts/versions.ts"],"names":[],"mappings":"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","file":"chunk-GR7CZEJJ.js","sourcesContent":["/**\n * Helpers for markdown that is STORED (an agent's draft saved as an artifact, then read back from\n * the backend's parse). Pure and SDK-free; they sit next to `normalizeCitationMarkup`, which they\n * build on.\n *\n * Two directions:\n *\n * - Going in (`cleanDraftMarkdown` = `unwrapCitationLinks` + `stripAgentPreamble` +\n * `promoteBoldTitle`): a streamed draft carries citation links, `(*Source: ...*)` notes and\n * sometimes narration before the document. A stored letter should hold only the letter.\n * - Coming out (`unescapeMarkdown`): the backend's parse of a stored `.md` returns the text with\n * markdown punctuation backslash-escaped (`**Fees.**` comes back as `\\*\\*Fees\\.\\*\\*`).\n */\n\nimport { normalizeCitationMarkup } from './normalize-citations'\n\nconst FENCE = /^\\s*(```|~~~)/\n\n/** Run `fn` on every line outside a fenced code block. */\nfunction mapOutsideFences(text: string, fn: (line: string) => string): string {\n let inFence = false\n return text\n .split('\\n')\n .map((line) => {\n if (FENCE.test(line)) {\n inFence = !inFence\n return line\n }\n return inFence ? line : fn(line)\n })\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Coming out: undo the parser's escaping\n// ---------------------------------------------------------------------------------------------\n\n/** A backslash followed by markdown punctuation: the only thing the parser's escaping produces. */\nconst ESCAPED_PUNCTUATION = /\\\\([\\\\`*_{}[\\]()#+\\-.!|>~<])/g\n/** The only escapes the parser puts inside an inline code span. */\nconst ESCAPED_EMPHASIS = /\\\\([*_])/g\nconst INLINE_CODE = /(`+)(?!`)(.+?)(?<!`)\\1(?!`)/g\n\n/**\n * Undo the backend's escaping of a markdown artifact: `\\*\\*Scope\\.\\*\\*` becomes `**Scope.**`.\n *\n * THE RULE. Apply this ONLY to text of an artifact that was stored from markdown (an agent draft\n * or an edited version, always uploaded as `.md`): for those the parser escapes every markdown\n * punctuation character, including the backslash itself, so removing one level of escaping is the\n * exact inverse (an author's literal `\\*` is stored as `\\\\\\*` and comes back as `\\*`). Do not\n * apply it to a PDF or Word parse, where a backslash is just a character.\n *\n * Details:\n * - Only a backslash followed by markdown punctuation (``\\ ` * _ { } [ ] ( ) # + - . ! | > ~ <``)\n * is removed; `\\n`, `C:\\temp` and a trailing backslash are left alone.\n * - Pairs are read left to right, so `\\\\*` is an escaped backslash followed by a bare `*`.\n * - Fenced code blocks are never touched (the parser does not escape inside them).\n * - Inline code spans: the parser DOES escape `*` and `_` there (`` `a*b` `` comes back as\n * `` `a\\*b` ``), so only `\\*` and `\\_` are undone inside a span; any other backslash in code\n * (`` `re\\.x` ``) is a literal and stays.\n */\nexport function unescapeMarkdown(text: string): string {\n if (!text.includes('\\\\')) return text\n return mapOutsideFences(text, (line) => {\n if (!line.includes('\\\\')) return line\n let out = ''\n let last = 0\n for (const span of line.matchAll(INLINE_CODE)) {\n const at = span.index ?? 0\n out +=\n line.slice(last, at).replace(ESCAPED_PUNCTUATION, '$1') +\n span[0].replace(ESCAPED_EMPHASIS, '$1')\n last = at + span[0].length\n }\n return out + line.slice(last).replace(ESCAPED_PUNCTUATION, '$1')\n })\n}\n\n/**\n * The parser also mangles the TITLE of a stored markdown document (seen on a real backend): the\n * first heading comes back doubled (`## # Title`) or alone inside a code fence\n * (a fence, `# Title`, a fence). Both are repaired, on the first non-blank line only, so a code\n * block or heading later in the text is never touched. Like `unescapeMarkdown`, apply it only to\n * artifacts stored from markdown.\n */\nexport function repairParsedTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const doubled = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/.exec(lines[first])\n if (doubled) {\n lines[first] = doubled[1]\n return lines.join('\\n')\n }\n if (/^\\s*```\\s*$/.test(lines[first]) && /^#{1,6}\\s+\\S/.test(lines[first + 1] ?? '')) {\n if (/^\\s*```\\s*$/.test(lines[first + 2] ?? '')) lines.splice(first + 2, 1)\n else return text\n lines.splice(first, 1)\n return lines.join('\\n')\n }\n return text\n}\n\nconst DOUBLED_HEADING = /^#{1,6}\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_HEADING = /^[-*+]\\s+(#{1,6}\\s+\\S.*)$/\nconst LIST_IN_LIST = /^[-*+]\\s+[-*+]\\s+(\\S.*)$/\nconst LIST_ORDINAL = /^[-*+]\\s+(\\d{1,9})([.)])\\s+(\\S.*)$/\nconst LIST_ITEM_LINE = /^\\s*(?:[-*+]|\\d{1,9}[.)])\\s/\nconst TABLE_DELIMITER_CELL = /^:?-{1,}:?$/\n\n/** `1. a 2. b 3. c` (one line) split where the next ordinal follows: `['1. a', '2. b', '3. c']`. */\nfunction splitRunOfOrdinals(first: number, delimiter: string, rest: string): string[] {\n const items: string[] = []\n let n = first\n let remaining = rest\n for (;;) {\n const next = new RegExp(`^(.+?)\\\\s+${n + 1}\\\\${delimiter}\\\\s+(\\\\S.*)$`).exec(remaining)\n if (!next) break\n items.push(`${n}${delimiter} ${next[1]}`)\n n += 1\n remaining = next[2]\n }\n items.push(`${n}${delimiter} ${remaining}`)\n return items\n}\n\n/**\n * A table the parser put on ONE line (`| h | h | |---|---| | a | b |`, rows joined by a space, which\n * leaves one empty cell between rows) back as a pipe table. `null` when the line is not that shape.\n */\nfunction rebuildFlatTable(line: string): string[] | null {\n const trimmed = line.trim()\n if (!trimmed.startsWith('|') || !trimmed.endsWith('|')) return null\n const cells = trimmed\n .slice(1, -1)\n .split('|')\n .map((c) => c.trim())\n const firstRule = cells.findIndex((c) => TABLE_DELIMITER_CELL.test(c))\n if (firstRule < 2 || cells[firstRule - 1] !== '') return null\n const columns = firstRule - 1\n const rows: string[][] = []\n for (let at = 0; at < cells.length; at += columns + 1) {\n const row = cells.slice(at, at + columns)\n const gap = cells[at + columns]\n if (row.length !== columns || (gap !== undefined && gap !== '')) return null\n rows.push(row)\n }\n const [header, rule, ...body] = rows\n if (!rule.every((c) => TABLE_DELIMITER_CELL.test(c))) return null\n const fmt = (row: string[]): string => `| ${row.join(' | ')} |`\n return [fmt(header), fmt(rule.map(() => '---')), ...body.map(fmt)]\n}\n\n/**\n * Undo how the backend's parse of a stored `.md` restructures it (seen on a real backend):\n * - a heading comes back doubled (`## # Title`) or as a list item (`- # Title`);\n * - every list item gets a `- ` of its own on top of the original marker, so `* a` returns as\n * `- * a` and `1. a` as `- 1. a`, which a markdown editor loads as a list inside a list item\n * (and saves as `- - a`); a run of ordinals can come back on one line (`- 1. a 2. b`);\n * - a table comes back on one line.\n * List nesting and the bullet/ordered difference of a flat `- x` cannot be recovered, so items\n * stay flat. Items of one list are kept tight (no blank line between them). Fenced code is\n * never touched. Like `unescapeMarkdown`, apply it only to artifacts stored from markdown.\n */\nexport function repairParsedStructure(text: string): string {\n const out: string[] = []\n let inFence = false\n for (const line of text.split('\\n')) {\n if (FENCE.test(line)) {\n inFence = !inFence\n out.push(line)\n continue\n }\n if (inFence) {\n out.push(line)\n continue\n }\n const table = rebuildFlatTable(line)\n if (table) {\n out.push(...table)\n continue\n }\n const heading = DOUBLED_HEADING.exec(line) ?? LIST_HEADING.exec(line)\n if (heading) {\n out.push(heading[1])\n continue\n }\n const ordinal = LIST_ORDINAL.exec(line)\n if (ordinal) {\n out.push(...splitRunOfOrdinals(Number(ordinal[1]), ordinal[2], ordinal[3]))\n continue\n }\n const nested = LIST_IN_LIST.exec(line)\n out.push(nested ? `- ${nested[1]}` : line)\n }\n // Items parsed as separate chunks arrive one blank line apart: that is one tight list.\n return out\n .filter(\n (line, i) =>\n !(\n line === '' &&\n LIST_ITEM_LINE.test(out[i - 1] ?? '') &&\n LIST_ITEM_LINE.test(out[i + 1] ?? '')\n )\n )\n .join('\\n')\n}\n\n// ---------------------------------------------------------------------------------------------\n// Going in: clean a streamed draft before it is stored\n// ---------------------------------------------------------------------------------------------\n\n/** `(*Source: Terms.pdf*)`, `(Sources: a, b)` and the italic form `*(Source: ...)*`. */\nconst SOURCE_NOTE =\n /[ \\t]*(?:\\*+\\(\\s*Sources?\\s*:[^)\\n]*\\)\\*+|\\(\\s*\\*{0,2}\\s*Sources?\\s*:[^)\\n]*\\))/gi\nconst CITE_TOKEN = /^\\]\\(#cite-[\\w-]+\\)/\n\n/**\n * Remove the citation links of ONE line and keep every word. A link is `[text](#cite-N)`, but the\n * model also writes brackets inside the text (`[We act for [PLACEHOLDER].](#cite-1)`) and links that\n * overlap other brackets, so a regex cannot find the opening bracket. This scans the line with a\n * stack of `[`: a `](#cite-N)` takes the nearest open `[` with it (both are removed, the text\n * between stays); a plain `]` closes the nearest `[`; a `](#cite-N)` with no open `[` loses only\n * the marker. Brackets that are not part of a link are never touched.\n */\nfunction removeCitationLinks(line: string): string {\n if (!line.includes('](#cite-')) return line\n const drop = new Set<number>()\n const open: number[] = []\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (c === '[') open.push(i)\n else if (c === ']') {\n const token = CITE_TOKEN.exec(line.slice(i, i + 40))\n if (token) {\n const opener = open.pop()\n if (opener !== undefined) drop.add(opener)\n for (let k = i; k < i + token[0].length; k++) drop.add(k)\n i += token[0].length - 1\n } else open.pop()\n }\n }\n let out = ''\n for (let i = 0; i < line.length; i++) if (!drop.has(i)) out += line[i]\n return out\n}\n\n/** A line whose `**` do not pair up (one half was wrapped into a link) loses the stray marks. */\nfunction balanceBold(line: string): string {\n // A bold-wrapped heading (`**# Title**`) is just a heading.\n if (/^\\s*\\*\\*#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '').trim()\n if ((line.match(/\\*\\*/g)?.length ?? 0) % 2 === 0) return line\n if (/^#{1,6}\\s/.test(line)) return line.replace(/\\*\\*/g, '')\n return line.replace(/\\*\\*\\s*$/, '').replace(/^(\\s*(?:[-*]\\s+)?)\\*\\*(?=\\s)/, '$1')\n}\n\n/**\n * Text for storage from text that carries citations: `normalizeCitationMarkup` first (it hoists\n * list, heading and bold tokens out of the link so unwrapping cannot orphan half of a `**` pair),\n * then `[text](#cite-N)` becomes `text`, `(*Source: ...*)` notes are dropped, and a bold or\n * heading marker that lost its partner is repaired. Fenced code is left alone.\n */\nexport function unwrapCitationLinks(text: string): string {\n const withoutNotes = mapOutsideFences(text, (line) => line.replace(SOURCE_NOTE, ''))\n return mapOutsideFences(normalizeCitationMarkup(withoutNotes), (line) => {\n const unlinked = removeCitationLinks(line)\n return unlinked === line ? line : balanceBold(unlinked)\n })\n}\n\nconst HEADING = /^#{1,6}\\s+\\S/\nconst HR_ONLY = /^\\s*(?:-{3,}|\\*{3,}|_{3,})\\s*$/\n/** A whole-line bold title: `**Client Engagement Letter**`. */\nconst BOLD_LINE = /^\\*\\*[^*#].*\\*\\*$/\nconst MAX_PREAMBLE_CHARS = 900\nconst MAX_PREAMBLE_PARAGRAPHS = 4\nconst MAX_TITLE_CHARS = 100\n\n/**\n * How a paragraph of agent narration opens. An ALLOW-LIST: a paragraph that opens any other way is\n * treated as document text and never removed.\n */\nconst NARRATION_OPENER =\n /^(?:I(?:['’](?:ll|ve|m|d))?\\s|let me\\b|here(?:['’]s| is| are)\\b|below is\\b|sure[,.! ]|certainly[,.! ]|of course[,.! ]|okay[,.! ]|based on (?:the|your|my)\\b|per the (?:user|instructions?)|as requested\\b|the workspace\\b|no (?:relevant |workspace |matching )?documents?\\b|there (?:are|is) no (?:relevant |workspace )?documents?\\b|after (?:reviewing|reading|searching)\\b)/i\n\n/** Structure a covering note would not have: lists, tables, quotes, code, headings, bold, links. */\nconst STRUCTURED = /^\\s*(?:[-*+>|]|\\d{1,9}[.)]\\s|#{1,6}\\s|```|~~~)|\\*\\*|\\]\\(/m\n\n/**\n * Cut the agent's narration written BEFORE the document. Strictly non-destructive: if in doubt the\n * text is returned whole (a stray sentence is easy to delete, a lost clause is not recoverable).\n *\n * Text is removed only when ALL of these hold:\n * 1. a real markdown heading line (`# Title`, any level) follows it, and the cut stops exactly at\n * the FIRST such line (never at a bold line, never at a line that merely contains `**`);\n * 2. what precedes it is at most 4 paragraphs and 900 characters of plain prose (horizontal rules\n * between them are ignored): no list, table, quote, code, heading, bold or link;\n * 3. EVERY paragraph opens with an allow-listed narration opener: first person (\"I'll ...\",\n * \"I now have ...\"), \"Let me\", \"Here is/are\", \"Below is\", \"Sure\", \"Based on the ...\", \"Per the\n * instructions\", \"As requested\", \"The workspace ...\", \"No (relevant) documents ...\", \"There is\n * no document ...\", \"After reviewing ...\".\n * Anything else (a dateline, an address, a salutation, a sentence of the letter) keeps the text whole.\n */\nexport function stripAgentPreamble(text: string): string {\n const lines = text.split('\\n')\n const start = lines.findIndex((l) => HEADING.test(l))\n if (start <= 0) return text\n const before = lines\n .slice(0, start)\n .filter((l) => !HR_ONLY.test(l))\n .join('\\n')\n .trim()\n if (!before) return lines.slice(start).join('\\n')\n const paragraphs = before.split(/\\n\\s*\\n/).map((p) => p.trim())\n const narration =\n before.length <= MAX_PREAMBLE_CHARS &&\n paragraphs.length <= MAX_PREAMBLE_PARAGRAPHS &&\n !STRUCTURED.test(before) &&\n paragraphs.every((p) => NARRATION_OPENER.test(p))\n return narration ? lines.slice(start).join('\\n') : text\n}\n\n/**\n * Make the document's title a real heading: the FIRST non-blank line of the text, when it is a\n * short whole-line bold title (`**Letter**`, even with a stray inner `**`), becomes `# Letter`.\n * Nothing else is ever promoted: not a later line, not a mid-sentence fragment (the title must\n * start with a capital or digit, be at most 100 characters, hold no sentence break and not end in\n * `,` `;` or `:`), and a document that already opens with a heading is left alone.\n */\nexport function promoteBoldTitle(text: string): string {\n const lines = text.split('\\n')\n const first = lines.findIndex((l) => l.trim())\n if (first < 0) return text\n const line = lines[first].trim()\n if (!BOLD_LINE.test(line)) return text\n const title = line.replace(/\\*\\*/g, '').trim()\n if (\n title.length === 0 ||\n title.length > MAX_TITLE_CHARS ||\n !/^[\\p{Lu}\\d]/u.test(title) ||\n /[,;:]$/.test(title) ||\n /[.!?]\\s+\\S/.test(title)\n ) {\n return text\n }\n lines[first] = `# ${title}`\n return lines.join('\\n')\n}\n\n/** Tidy headings only: strip stray bold marks from heading lines (`# **Title**`). */\nfunction cleanHeadings(text: string): string {\n return mapOutsideFences(text, (line) =>\n /^\\s*#{1,6}\\s/.test(line) ? line.replace(/\\*\\*/g, '').trim() : line\n )\n}\n\n/** Which stage of the cleanup produced the text that is returned. */\nexport type DraftCleanStage = 'cleaned' | 'unwrapped' | 'raw'\n\nexport interface DraftCleanReport {\n /** What to store. */\n text: string\n /**\n * `cleaned`: the full cleanup. `unwrapped`: only the citation links were removed (the preamble or\n * title step was rejected by the guard). `raw`: the input as streamed (even link removal was\n * rejected).\n */\n stage: DraftCleanStage\n /** Length of the returned text over the length of the input without its citation markup. */\n ratio: number\n /** Which steps changed the text before the guard (for logs). */\n changedBy: ('citations' | 'preamble' | 'title')[]\n /** The guard rejected a step because it would have lost content. */\n guarded: boolean\n}\n\nconst MIN_RATIO = 0.7\nconst countMatches = (text: string, re: RegExp): number => text.match(re)?.length ?? 0\nconst LIST_NUMBER = /^\\s*\\d{1,9}[.)]\\s/gm\nconst HEADING_LINE = /^#{1,6}\\s/gm\n/** The text with only its citation markup gone: the floor no cleanup may go far under. */\nconst withoutCitationMarkup = (raw: string): string =>\n mapOutsideFences(raw.replace(SOURCE_NOTE, ''), removeCitationLinks).trim()\nconst tidy = (text: string): string => text.replace(/\\n{3,}/g, '\\n\\n').trim()\n/** `after` is `before` with a leading part removed (a prefix cut, never a cut in the middle). */\nconst isPrefixCut = (before: string, after: string): boolean =>\n before.trimEnd().endsWith(after.trim())\n/** Nothing structural was lost: headings and numbered items are all still there. */\nconst keepsStructure = (candidate: string, reference: string): boolean =>\n countMatches(candidate, LIST_NUMBER) >= countMatches(reference, LIST_NUMBER) &&\n countMatches(candidate, HEADING_LINE) >= countMatches(reference, HEADING_LINE)\n\n/** The three text steps of the cleanup; replaceable so the guard can be tested. */\nexport interface DraftCleanSteps {\n unwrap: (text: string) => string\n strip: (text: string) => string\n promote: (text: string) => string\n}\nconst DEFAULT_CLEAN_STEPS: DraftCleanSteps = {\n unwrap: unwrapCitationLinks,\n strip: stripAgentPreamble,\n promote: promoteBoldTitle,\n}\n\n/**\n * `cleanDraftMarkdown` with a safety net and a report, for storing a streamed draft. Each stage is\n * accepted only if it provably cost nothing but narration and citation markup:\n * - links removed: at least 70% of the text length remains and no heading or numbered item is lost\n * (else `raw`, the input exactly as streamed);\n * - narration removed: only a pure prefix of the text may go, and nothing structural;\n * - title and heading tidy: at least 70% of the text remains and no heading or numbered item is lost.\n * A rejected stage falls back to the previous one (`cleaned` -> `unwrapped` -> `raw`).\n */\nexport function cleanDraftWithReport(\n raw: string,\n steps: DraftCleanSteps = DEFAULT_CLEAN_STEPS\n): DraftCleanReport {\n const floor = withoutCitationMarkup(raw)\n const ratio = (t: string): number => (floor.length ? t.length / floor.length : 1)\n const unwrapped = tidy(steps.unwrap(raw))\n const stripped = tidy(steps.strip(unwrapped))\n const titled = tidy(cleanHeadings(steps.promote(stripped)))\n const changedBy: DraftCleanReport['changedBy'] = []\n if (unwrapped !== raw.trim()) changedBy.push('citations')\n if (stripped !== unwrapped) changedBy.push('preamble')\n if (titled !== stripped) changedBy.push('title')\n\n const unwrappedOk = unwrapped.length >= MIN_RATIO * floor.length && keepsStructure(unwrapped, raw)\n if (!unwrappedOk) return { text: raw, stage: 'raw', ratio: 1, changedBy, guarded: true }\n const strippedOk =\n stripped === unwrapped ||\n (isPrefixCut(unwrapped, stripped) && keepsStructure(stripped, unwrapped))\n const titledOk = titled.length >= MIN_RATIO * stripped.length && keepsStructure(titled, stripped)\n if (strippedOk && titledOk) {\n return { text: titled, stage: 'cleaned', ratio: ratio(titled), changedBy, guarded: false }\n }\n return { text: unwrapped, stage: 'unwrapped', ratio: ratio(unwrapped), changedBy, guarded: true }\n}\n\n/**\n * Everything a streamed draft needs before it is stored as the artifact's first version:\n * `unwrapCitationLinks`, `stripAgentPreamble`, `promoteBoldTitle`, clean headings, collapsed blank\n * runs, trimmed, under the guard of `cleanDraftWithReport` (use it to know which stage was kept).\n */\nexport function cleanDraftMarkdown(raw: string): string {\n return cleanDraftWithReport(raw).text\n}\n","/**\n * Versions of a document. A document keeps ONE id for its whole life; its versions live inside it\n * (`current_version` + `versions`, numbered 1..n). A version is named by a version reference\n * `doc-…@v{n}`; a plain document id means its current version. The workspace list carries every\n * document's `versions`, and `GET /v1/document/{id}/versions` (`arbi.documents.versions`) the same\n * list on its own.\n */\n\nimport { repairParsedStructure, repairParsedTitle, unescapeMarkdown } from '../ai/stored-markdown'\nimport { normalizeMarkdown } from './normalize-markdown'\n\n/** One version entry as the API returns it (a subset of `DocVersion`). */\nexport interface DocVersionEntry {\n n: number\n file_name?: string | null\n created_at?: string | null\n reason?: string | null\n /** The version an edit started from, when it was not the previous one. */\n made_from?: number | null\n is_current?: boolean | null\n /** The assistant message whose turn made this version, and its thread (none: a person's). */\n source_message_ext_id?: string | null\n conversation_ext_id?: string | null\n}\n\n/** The fields of a workspace document the version list needs (a subset of the API type). */\nexport interface VersionedDoc {\n external_id?: string | null\n current_version?: number | null\n versions?: readonly DocVersionEntry[] | null\n file_name?: string | null\n created_at?: string | null\n}\n\n/** One row of a version list. Matches `VersionEntry` of `@arbidocs/blocks/artifacts`. */\nexport interface ArtifactVersion {\n /** The version reference `doc-…@v{n}`: what opening or comparing this version names. */\n id: string\n /** The document (the same for every version). */\n docId: string\n /** File name as stored. */\n name: string\n /** ISO timestamp. */\n createdAt: string\n /** 1-based version number within the document. */\n number: number\n /** upload | edit | signed | sync */\n reason: string\n isCurrent: boolean\n /** The version this one was saved from (an older one than the previous version when restored). */\n savedFromId?: string | null\n /** The thread (and its message) whose turn made this version; none for a person's. */\n thread?: { conversationId: string; messageId: string | null } | null\n}\n\nconst VERSION_REF = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/\n\n/** `doc-…@v{n}`: a reference to version `n` of a document. */\nexport function versionRef(docId: string, version: number): string {\n return `${docId}@v${version}`\n}\n\n/**\n * Split a reference into the document and the version it names. A plain document id (or anything\n * else) names no version: the document's current one.\n */\nexport function parseVersionRef(ref: string | null | undefined): {\n docId: string\n version: number | null\n} {\n const match = VERSION_REF.exec(ref ?? '')\n if (!match) return { docId: ref ?? '', version: null }\n return { docId: match[1], version: Number(match[2]) }\n}\n\n/** The version a version was saved from: `made_from`, else the one before it. */\nexport function savedFromId(docId: string, entry: DocVersionEntry): string | null {\n if (entry.made_from) return versionRef(docId, entry.made_from)\n return entry.n > 1 ? versionRef(docId, entry.n - 1) : null\n}\n\n/** A document's version entries (oldest first) as plain version rows. */\nexport function toArtifactVersions(\n docId: string | null | undefined,\n entries: readonly DocVersionEntry[] | null | undefined,\n currentVersion?: number | null\n): ArtifactVersion[] {\n if (!docId) return []\n const current = currentVersion ?? entries?.find((e) => e.is_current)?.n ?? null\n return [...(entries ?? [])]\n .sort((a, b) => a.n - b.n)\n .map((e) => ({\n id: versionRef(docId, e.n),\n docId,\n name: e.file_name ?? '',\n createdAt: e.created_at ?? '',\n number: e.n,\n reason: e.reason ?? 'upload',\n isCurrent: current != null ? e.n === current : !!e.is_current,\n savedFromId: savedFromId(docId, e),\n thread: e.conversation_ext_id\n ? { conversationId: e.conversation_ext_id, messageId: e.source_message_ext_id ?? null }\n : null,\n }))\n}\n\n/** The versions of a listed document, oldest first (`[]` when the document is not given). */\nexport function documentVersions(doc: VersionedDoc | null | undefined): ArtifactVersion[] {\n if (!doc?.external_id) return []\n const entries = doc.versions?.length\n ? doc.versions\n : [{ n: doc.current_version ?? 1, file_name: doc.file_name, created_at: doc.created_at }]\n return toArtifactVersions(doc.external_id, entries, doc.current_version ?? null)\n}\n\n/** The row `ref` names: an exact version, or (a plain document id) the current version. */\nexport function findVersion(\n versions: readonly ArtifactVersion[],\n ref: string | null | undefined\n): ArtifactVersion | undefined {\n if (!ref) return undefined\n const { docId, version } = parseVersionRef(ref)\n return version == null\n ? versions.find((v) => v.docId === docId && v.isCurrent)\n : versions.find((v) => v.docId === docId && v.number === version)\n}\n\n/**\n * \"v2\": the version number `ref` names. `null` when there is nothing to tell apart (the document\n * has a single version, or it is unknown), so unversioned documents stay unlabelled.\n */\nexport function versionLabel(\n versions: readonly ArtifactVersion[],\n ref: string | null | undefined\n): string | null {\n if (!ref || versions.length <= 1) return null\n const version = findVersion(versions, ref)\n return version ? `v${version.number}` : null\n}\n\n/**\n * Join parsed chunks into one markdown text (blank line between chunks).\n *\n * `unescape: true` for an artifact stored from markdown: the backend's parse of a `.md` escapes\n * markdown punctuation, which `unescapeMarkdown` undoes (see its rule), and mangles its title\n * (`repairParsedTitle`, `repairParsedStructure`: doubled headings, `- ` stacked on list markers,\n * one-line tables), then normalised. Leave it off for the parse\n * of a PDF or Word file.\n */\nexport function flattenChunks(\n chunks: readonly { content?: string | null }[] | null | undefined,\n options?: { unescape?: boolean }\n): string {\n const text = (chunks ?? []).map((c) => (c.content ?? '').trim()).join('\\n\\n')\n if (!options?.unescape) return text\n // Canonical spelling last, so the text an editor starts from is what a save would persist.\n return normalizeMarkdown(\n repairParsedStructure(repairParsedTitle(unescapeMarkdown(text)))\n ).replace(/\\n$/, '')\n}\n\n/** The backend's pattern for a document id. Anything else (a streamed draft's placeholder) is local. */\nconst DOC_ID = /^doc/\n\n/** Is `id` a real, saved document id? Local drafts have placeholder ids and no backend document. */\nexport function isDocumentId(id: string | null | undefined): id is string {\n return !!id && DOC_ID.test(id)\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkQ2GNEVG2_cjs = require('./chunk-Q2GNEVG2.cjs');
|
|
4
4
|
var zustand = require('zustand');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var reactQuery = require('@tanstack/react-query');
|
|
@@ -17,10 +17,10 @@ function subscribeDocumentRows(listener) {
|
|
|
17
17
|
}
|
|
18
18
|
function getCachedDocuments(qc, workspaceId) {
|
|
19
19
|
if (!workspaceId) return void 0;
|
|
20
|
-
return qc.getQueryData(
|
|
20
|
+
return qc.getQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.documents(workspaceId));
|
|
21
21
|
}
|
|
22
22
|
function cachedLists(qc) {
|
|
23
|
-
return qc.getQueriesData({ queryKey:
|
|
23
|
+
return qc.getQueriesData({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.allDocuments() }).flatMap(
|
|
24
24
|
([key, data]) => typeof key[2] === "string" && Array.isArray(data) ? [[key[2], data]] : []
|
|
25
25
|
);
|
|
26
26
|
}
|
|
@@ -46,13 +46,13 @@ function patchDocuments(qc, reducer, workspaceId) {
|
|
|
46
46
|
for (const [id, before] of lists) {
|
|
47
47
|
const after = reducer(before);
|
|
48
48
|
if (after === before) continue;
|
|
49
|
-
qc.setQueryData(
|
|
49
|
+
qc.setQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.documents(id), after);
|
|
50
50
|
const change = diffRows(id, before, after);
|
|
51
51
|
const beforeById = new Map(before.map((doc) => [doc.external_id, doc]));
|
|
52
52
|
if (change.update.some(
|
|
53
53
|
(doc) => doc.current_version !== beforeById.get(doc.external_id)?.current_version
|
|
54
54
|
))
|
|
55
|
-
void qc.invalidateQueries({ queryKey:
|
|
55
|
+
void qc.invalidateQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.allDocumentVersions() });
|
|
56
56
|
if (change.add.length || change.update.length || change.remove.length)
|
|
57
57
|
for (const listener of rowListeners) listener(change);
|
|
58
58
|
}
|
|
@@ -80,11 +80,11 @@ function upsertDocuments(qc, documents, workspaceId) {
|
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
function setCachedDocument(qc, doc) {
|
|
83
|
-
qc.setQueryData(
|
|
83
|
+
qc.setQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.document(doc.external_id), doc);
|
|
84
84
|
}
|
|
85
85
|
function patchCachedDocument(qc, docId, reducer) {
|
|
86
|
-
const current = qc.getQueryData(
|
|
87
|
-
if (current) qc.setQueryData(
|
|
86
|
+
const current = qc.getQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.document(docId));
|
|
87
|
+
if (current) qc.setQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.document(docId), reducer(current));
|
|
88
88
|
}
|
|
89
89
|
function dropTagFromCachedDocuments(qc, tagId) {
|
|
90
90
|
const strip = (doc) => {
|
|
@@ -101,9 +101,9 @@ function dropTagFromCachedDocuments(qc, tagId) {
|
|
|
101
101
|
}
|
|
102
102
|
function forgetDocuments(qc, docIds) {
|
|
103
103
|
for (const id of docIds) {
|
|
104
|
-
qc.removeQueries({ queryKey:
|
|
105
|
-
qc.removeQueries({ queryKey:
|
|
106
|
-
qc.removeQueries({ queryKey:
|
|
104
|
+
qc.removeQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.document(id) });
|
|
105
|
+
qc.removeQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.documentVersions(id) });
|
|
106
|
+
qc.removeQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.parsedDocument(id) });
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
var useEntityExtractionStore = zustand.create(() => ({ docIds: [] }));
|
|
@@ -173,7 +173,7 @@ function useCapturingWorkspace(mutation, capture) {
|
|
|
173
173
|
// src/tags.ts
|
|
174
174
|
function workspaceOfTag(qc, tagId) {
|
|
175
175
|
for (const [key, tags] of qc.getQueriesData({
|
|
176
|
-
queryKey:
|
|
176
|
+
queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.allTags()
|
|
177
177
|
})) {
|
|
178
178
|
if (Array.isArray(tags) && tags.some((t) => t.external_id === tagId))
|
|
179
179
|
return key[2] ?? null;
|
|
@@ -184,23 +184,23 @@ function openWorkspaceId(arbi) {
|
|
|
184
184
|
return arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
|
|
185
185
|
}
|
|
186
186
|
function patchWorkspaceTags(qc, workspaceId, reducer) {
|
|
187
|
-
const key =
|
|
187
|
+
const key = chunkQ2GNEVG2_cjs.arbiQueryKeys.tags(workspaceId);
|
|
188
188
|
const current = qc.getQueryData(key);
|
|
189
189
|
if (!current) return;
|
|
190
190
|
const next = reducer(current);
|
|
191
191
|
if (next !== current) qc.setQueryData(key, next);
|
|
192
192
|
}
|
|
193
193
|
function invalidateTagTables(qc, workspaceId) {
|
|
194
|
-
return qc.invalidateQueries({ queryKey:
|
|
194
|
+
return qc.invalidateQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.tagLists(workspaceId) });
|
|
195
195
|
}
|
|
196
196
|
function invalidateTagData(qc, workspaceId) {
|
|
197
197
|
return Promise.all([
|
|
198
|
-
qc.invalidateQueries({ queryKey:
|
|
199
|
-
qc.invalidateQueries({ queryKey:
|
|
198
|
+
qc.invalidateQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.tags(workspaceId) }),
|
|
199
|
+
qc.invalidateQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.facts(workspaceId) })
|
|
200
200
|
]);
|
|
201
201
|
}
|
|
202
202
|
function useInvalidateTagData() {
|
|
203
|
-
const arbi =
|
|
203
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
204
204
|
const qc = reactQuery.useQueryClient();
|
|
205
205
|
return react.useCallback(() => {
|
|
206
206
|
const workspaceId = openWorkspaceId(arbi);
|
|
@@ -227,19 +227,19 @@ function settleChangedTag(qc, tag) {
|
|
|
227
227
|
}
|
|
228
228
|
var replayableTagMutations = [
|
|
229
229
|
{
|
|
230
|
-
mutationKey:
|
|
230
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.createTag(),
|
|
231
231
|
// In the workspace it was made in (named on the request), opened for this session first.
|
|
232
232
|
run: (client, input) => inWorkspace(primeOnClient(client), input.workspaceId, () => browser.tags.createTag(client, input)),
|
|
233
233
|
settle: (qc, created) => settleCreatedTag(qc, created)
|
|
234
234
|
}
|
|
235
235
|
];
|
|
236
236
|
function useCreateTag() {
|
|
237
|
-
const arbi =
|
|
237
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
238
238
|
const qc = reactQuery.useQueryClient();
|
|
239
239
|
const capture = (input) => input.workspaceId || !arbi.hasWorkspace ? input : { ...input, workspaceId: arbi.getWorkspaceId() };
|
|
240
240
|
return useCapturingWorkspace(
|
|
241
241
|
reactQuery.useMutation({
|
|
242
|
-
mutationKey:
|
|
242
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.createTag(),
|
|
243
243
|
mutationFn: (input) => inWorkspace(primeOnArbi(arbi), input.workspaceId, () => arbi.tags.create(input)),
|
|
244
244
|
onSuccess: (created) => settleCreatedTag(qc, created),
|
|
245
245
|
...QUEUED_WRITE_RETRY
|
|
@@ -253,7 +253,7 @@ function useIsCreatingTag() {
|
|
|
253
253
|
(name) => {
|
|
254
254
|
const wanted = name.trim().toLowerCase();
|
|
255
255
|
return qc.getMutationCache().findAll({
|
|
256
|
-
mutationKey:
|
|
256
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.createTag(),
|
|
257
257
|
predicate: (m) => m.state.status === "pending" && m.state.variables?.name.trim().toLowerCase() === wanted
|
|
258
258
|
}).length > 0;
|
|
259
259
|
},
|
|
@@ -261,19 +261,19 @@ function useIsCreatingTag() {
|
|
|
261
261
|
);
|
|
262
262
|
}
|
|
263
263
|
function useUpdateTag() {
|
|
264
|
-
const arbi =
|
|
264
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
265
265
|
const qc = reactQuery.useQueryClient();
|
|
266
266
|
return reactQuery.useMutation({
|
|
267
|
-
mutationKey:
|
|
267
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.updateTag(),
|
|
268
268
|
mutationFn: ({ tagId, change }) => arbi.tags.update(tagId, change),
|
|
269
269
|
onSuccess: (tag) => settleChangedTag(qc, tag)
|
|
270
270
|
});
|
|
271
271
|
}
|
|
272
272
|
function useSetTagValues() {
|
|
273
|
-
const arbi =
|
|
273
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
274
274
|
const qc = reactQuery.useQueryClient();
|
|
275
275
|
return reactQuery.useMutation({
|
|
276
|
-
mutationKey:
|
|
276
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.updateTag(),
|
|
277
277
|
mutationFn: ({
|
|
278
278
|
tagId,
|
|
279
279
|
values
|
|
@@ -282,10 +282,10 @@ function useSetTagValues() {
|
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
284
|
function useDeleteTag() {
|
|
285
|
-
const arbi =
|
|
285
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
286
286
|
const qc = reactQuery.useQueryClient();
|
|
287
287
|
return reactQuery.useMutation({
|
|
288
|
-
mutationKey:
|
|
288
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.deleteTag(),
|
|
289
289
|
mutationFn: (tagId) => arbi.tags.delete(tagId),
|
|
290
290
|
// The tag's own workspace (the cached list holding it), else the one open when it is sent: a
|
|
291
291
|
// switch while the delete runs must not patch the next workspace's list.
|
|
@@ -301,33 +301,33 @@ function useDeleteTag() {
|
|
|
301
301
|
);
|
|
302
302
|
return Promise.all([
|
|
303
303
|
invalidateTagTables(qc, workspaceId),
|
|
304
|
-
qc.invalidateQueries({ queryKey:
|
|
304
|
+
qc.invalidateQueries({ queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.facts(workspaceId) })
|
|
305
305
|
]);
|
|
306
306
|
}
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
309
|
function useExtractEntities() {
|
|
310
|
-
const arbi =
|
|
310
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
311
311
|
return reactQuery.useMutation({
|
|
312
|
-
mutationKey:
|
|
312
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.extractEntities(),
|
|
313
313
|
mutationFn: (docIds) => arbi.tags.extractEntities(docIds),
|
|
314
314
|
onSuccess: (data) => startEntityExtraction(data.doc_ext_ids)
|
|
315
315
|
});
|
|
316
316
|
}
|
|
317
317
|
function useTagKindSchema(kind, options) {
|
|
318
|
-
const arbi =
|
|
318
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
319
319
|
const workspaceId = openWorkspaceId(arbi) ?? "";
|
|
320
320
|
return reactQuery.useQuery({
|
|
321
|
-
queryKey:
|
|
321
|
+
queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.tagKind(workspaceId, kind ?? ""),
|
|
322
322
|
queryFn: () => arbi.readInWorkspace(workspaceId, () => arbi.tagKinds.get(kind)),
|
|
323
323
|
enabled: (options?.enabled ?? true) && !!kind && !!workspaceId
|
|
324
324
|
});
|
|
325
325
|
}
|
|
326
326
|
function useUpdateTagKindSchema() {
|
|
327
|
-
const arbi =
|
|
327
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
328
328
|
const qc = reactQuery.useQueryClient();
|
|
329
329
|
return reactQuery.useMutation({
|
|
330
|
-
mutationKey:
|
|
330
|
+
mutationKey: chunkQ2GNEVG2_cjs.arbiMutationKeys.updateTagKindSchema(),
|
|
331
331
|
mutationFn: ({
|
|
332
332
|
kind,
|
|
333
333
|
fields
|
|
@@ -338,7 +338,7 @@ function useUpdateTagKindSchema() {
|
|
|
338
338
|
onSuccess: (schema, _input, context) => {
|
|
339
339
|
const workspaceId = context?.workspaceId;
|
|
340
340
|
if (!workspaceId) return;
|
|
341
|
-
qc.setQueryData(
|
|
341
|
+
qc.setQueryData(chunkQ2GNEVG2_cjs.arbiQueryKeys.tagKind(workspaceId, schema.kind), schema);
|
|
342
342
|
return invalidateTagData(qc, workspaceId);
|
|
343
343
|
}
|
|
344
344
|
});
|
|
@@ -541,11 +541,11 @@ function openWorkspaceId2(arbi) {
|
|
|
541
541
|
return arbi.hasWorkspace ? arbi.getWorkspaceId() : null;
|
|
542
542
|
}
|
|
543
543
|
function useDocuments(workspaceId, options) {
|
|
544
|
-
const arbi =
|
|
544
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
545
545
|
const qc = reactQuery.useQueryClient();
|
|
546
546
|
const workspace = workspaceId ?? openWorkspaceId2(arbi) ?? "";
|
|
547
547
|
return reactQuery.useQuery({
|
|
548
|
-
queryKey:
|
|
548
|
+
queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.documents(workspace),
|
|
549
549
|
queryFn: ({ signal }) => {
|
|
550
550
|
if (openWorkspaceId2(arbi) !== workspace)
|
|
551
551
|
return Promise.reject(new Error("The selected workspace changed."));
|
|
@@ -563,9 +563,9 @@ function processingInterval(doc) {
|
|
|
563
563
|
return doc?.status && !FINISHED_DOCUMENT_STATUSES.has(doc.status) ? DOCUMENT_STATUS_POLL_MS : false;
|
|
564
564
|
}
|
|
565
565
|
function useDocument(docId, options) {
|
|
566
|
-
const arbi =
|
|
566
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
567
567
|
return reactQuery.useQuery({
|
|
568
|
-
queryKey:
|
|
568
|
+
queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.document(docId ?? ""),
|
|
569
569
|
queryFn: async () => (await arbi.documents.get([docId]))[0] ?? null,
|
|
570
570
|
enabled: (options?.enabled ?? true) && !!docId && arbi.isLoggedIn,
|
|
571
571
|
refetchInterval: options?.pollWhileProcessing ? (query) => processingInterval(query.state.data) : false
|
|
@@ -573,10 +573,10 @@ function useDocument(docId, options) {
|
|
|
573
573
|
}
|
|
574
574
|
var SIMILARITY_THRESHOLD = 0.98;
|
|
575
575
|
function useSimilarDocuments(options) {
|
|
576
|
-
const arbi =
|
|
576
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
577
577
|
const workspace = openWorkspaceId2(arbi) ?? "";
|
|
578
578
|
return reactQuery.useQuery({
|
|
579
|
-
queryKey:
|
|
579
|
+
queryKey: chunkQ2GNEVG2_cjs.arbiQueryKeys.similarDocuments(workspace, SIMILARITY_THRESHOLD),
|
|
580
580
|
queryFn: () => arbi.readInWorkspace(
|
|
581
581
|
workspace,
|
|
582
582
|
() => arbi.documents.similar({ threshold: SIMILARITY_THRESHOLD })
|
|
@@ -610,7 +610,7 @@ async function refreshDocuments(qc, arbi, docIds) {
|
|
|
610
610
|
}
|
|
611
611
|
function useRefreshDocuments() {
|
|
612
612
|
const qc = reactQuery.useQueryClient();
|
|
613
|
-
const arbi =
|
|
613
|
+
const arbi = chunkQ2GNEVG2_cjs.useArbi();
|
|
614
614
|
return react.useCallback((docIds) => refreshDocuments(qc, arbi, docIds), [qc, arbi]);
|
|
615
615
|
}
|
|
616
616
|
function reconcileTagCounts(qc, fresh) {
|
|
@@ -694,5 +694,5 @@ exports.useSimilarDocuments = useSimilarDocuments;
|
|
|
694
694
|
exports.useTagKindSchema = useTagKindSchema;
|
|
695
695
|
exports.useUpdateTag = useUpdateTag;
|
|
696
696
|
exports.useUpdateTagKindSchema = useUpdateTagKindSchema;
|
|
697
|
-
//# sourceMappingURL=chunk-
|
|
698
|
-
//# sourceMappingURL=chunk-
|
|
697
|
+
//# sourceMappingURL=chunk-IXE7HCCA.cjs.map
|
|
698
|
+
//# sourceMappingURL=chunk-IXE7HCCA.cjs.map
|