luckerr 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +267 -0
- package/README.zh-CN.md +237 -0
- package/dashboard/app.css +3022 -0
- package/dashboard/dist/app.js +30137 -0
- package/dashboard/dist/app.js.map +1 -0
- package/dashboard/dist/vendor-hljs.css +10 -0
- package/dashboard/dist/vendor-uplot.css +1 -0
- package/dashboard/index.html +19 -0
- package/data/deepseek-tokenizer.json.gz +0 -0
- package/dist/cli/acp-EOOAI4F5.js +712 -0
- package/dist/cli/acp-EOOAI4F5.js.map +1 -0
- package/dist/cli/chat-7J6GJXL2.js +51 -0
- package/dist/cli/chat-7J6GJXL2.js.map +1 -0
- package/dist/cli/chunk-2425HK6U.js +54 -0
- package/dist/cli/chunk-2425HK6U.js.map +1 -0
- package/dist/cli/chunk-25T6CVUP.js +172 -0
- package/dist/cli/chunk-25T6CVUP.js.map +1 -0
- package/dist/cli/chunk-2UQP6H6T.js +31 -0
- package/dist/cli/chunk-2UQP6H6T.js.map +1 -0
- package/dist/cli/chunk-56OAJILV.js +47 -0
- package/dist/cli/chunk-56OAJILV.js.map +1 -0
- package/dist/cli/chunk-5FTI4KXH.js +150 -0
- package/dist/cli/chunk-5FTI4KXH.js.map +1 -0
- package/dist/cli/chunk-5TWQD73O.js +2846 -0
- package/dist/cli/chunk-5TWQD73O.js.map +1 -0
- package/dist/cli/chunk-653BOCMK.js +40 -0
- package/dist/cli/chunk-653BOCMK.js.map +1 -0
- package/dist/cli/chunk-6ALJTWWQ.js +2663 -0
- package/dist/cli/chunk-6ALJTWWQ.js.map +1 -0
- package/dist/cli/chunk-6DRKA2IL.js +341 -0
- package/dist/cli/chunk-6DRKA2IL.js.map +1 -0
- package/dist/cli/chunk-6LV63NJV.js +634 -0
- package/dist/cli/chunk-6LV63NJV.js.map +1 -0
- package/dist/cli/chunk-74EX7SUH.js +25293 -0
- package/dist/cli/chunk-74EX7SUH.js.map +1 -0
- package/dist/cli/chunk-74U5RKTX.js +60611 -0
- package/dist/cli/chunk-74U5RKTX.js.map +1 -0
- package/dist/cli/chunk-ANJSUESV.js +143 -0
- package/dist/cli/chunk-ANJSUESV.js.map +1 -0
- package/dist/cli/chunk-DB2Z3DKZ.js +54 -0
- package/dist/cli/chunk-DB2Z3DKZ.js.map +1 -0
- package/dist/cli/chunk-DDIH3ZAA.js +400 -0
- package/dist/cli/chunk-DDIH3ZAA.js.map +1 -0
- package/dist/cli/chunk-ELN3Z3B2.js +621 -0
- package/dist/cli/chunk-ELN3Z3B2.js.map +1 -0
- package/dist/cli/chunk-F6BSQJGV.js +200 -0
- package/dist/cli/chunk-F6BSQJGV.js.map +1 -0
- package/dist/cli/chunk-FET2UAG5.js +246 -0
- package/dist/cli/chunk-FET2UAG5.js.map +1 -0
- package/dist/cli/chunk-FFJ342IJ.js +190 -0
- package/dist/cli/chunk-FFJ342IJ.js.map +1 -0
- package/dist/cli/chunk-GB3247B6.js +130 -0
- package/dist/cli/chunk-GB3247B6.js.map +1 -0
- package/dist/cli/chunk-HC2J4U3G.js +373 -0
- package/dist/cli/chunk-HC2J4U3G.js.map +1 -0
- package/dist/cli/chunk-HRUZAIHQ.js +42 -0
- package/dist/cli/chunk-HRUZAIHQ.js.map +1 -0
- package/dist/cli/chunk-J3ZJFUDL.js +308 -0
- package/dist/cli/chunk-J3ZJFUDL.js.map +1 -0
- package/dist/cli/chunk-J5XJHLWM.js +55 -0
- package/dist/cli/chunk-J5XJHLWM.js.map +1 -0
- package/dist/cli/chunk-JFGLMRZ6.js +160 -0
- package/dist/cli/chunk-JFGLMRZ6.js.map +1 -0
- package/dist/cli/chunk-JMBMLOBP.js +26 -0
- package/dist/cli/chunk-JMBMLOBP.js.map +1 -0
- package/dist/cli/chunk-JMWHXZEL.js +551 -0
- package/dist/cli/chunk-JMWHXZEL.js.map +1 -0
- package/dist/cli/chunk-KEQGPJBO.js +209 -0
- package/dist/cli/chunk-KEQGPJBO.js.map +1 -0
- package/dist/cli/chunk-M4K6U37F.js +232 -0
- package/dist/cli/chunk-M4K6U37F.js.map +1 -0
- package/dist/cli/chunk-MIJI2WMN.js +95 -0
- package/dist/cli/chunk-MIJI2WMN.js.map +1 -0
- package/dist/cli/chunk-MPAO3JNR.js +128 -0
- package/dist/cli/chunk-MPAO3JNR.js.map +1 -0
- package/dist/cli/chunk-PZOFBEDC.js +873 -0
- package/dist/cli/chunk-PZOFBEDC.js.map +1 -0
- package/dist/cli/chunk-RAILYQLN.js +46 -0
- package/dist/cli/chunk-RAILYQLN.js.map +1 -0
- package/dist/cli/chunk-RR35VQVT.js +90 -0
- package/dist/cli/chunk-RR35VQVT.js.map +1 -0
- package/dist/cli/chunk-RRA7VPW4.js +417 -0
- package/dist/cli/chunk-RRA7VPW4.js.map +1 -0
- package/dist/cli/chunk-RU36QVN3.js +452 -0
- package/dist/cli/chunk-RU36QVN3.js.map +1 -0
- package/dist/cli/chunk-RUBIINXR.js +1819 -0
- package/dist/cli/chunk-RUBIINXR.js.map +1 -0
- package/dist/cli/chunk-S4XVGLRW.js +499 -0
- package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
- package/dist/cli/chunk-TUK7OWJA.js +51 -0
- package/dist/cli/chunk-TUK7OWJA.js.map +1 -0
- package/dist/cli/chunk-VALDDV76.js +580 -0
- package/dist/cli/chunk-VALDDV76.js.map +1 -0
- package/dist/cli/chunk-WQOGPYGN.js +11390 -0
- package/dist/cli/chunk-WQOGPYGN.js.map +1 -0
- package/dist/cli/chunk-WREKDFXT.js +34320 -0
- package/dist/cli/chunk-WREKDFXT.js.map +1 -0
- package/dist/cli/chunk-Y7XQU2EL.js +270 -0
- package/dist/cli/chunk-Y7XQU2EL.js.map +1 -0
- package/dist/cli/chunk-YBVCZJU4.js +54 -0
- package/dist/cli/chunk-YBVCZJU4.js.map +1 -0
- package/dist/cli/chunk-YLIHDXUQ.js +749 -0
- package/dist/cli/chunk-YLIHDXUQ.js.map +1 -0
- package/dist/cli/chunk-YV5XXFD7.js +767 -0
- package/dist/cli/chunk-YV5XXFD7.js.map +1 -0
- package/dist/cli/chunk-ZRCNIYRQ.js +101 -0
- package/dist/cli/chunk-ZRCNIYRQ.js.map +1 -0
- package/dist/cli/code-CRKVCMFZ.js +155 -0
- package/dist/cli/code-CRKVCMFZ.js.map +1 -0
- package/dist/cli/commands-QLMD3T7B.js +356 -0
- package/dist/cli/commands-QLMD3T7B.js.map +1 -0
- package/dist/cli/commit-53PP32NC.js +293 -0
- package/dist/cli/commit-53PP32NC.js.map +1 -0
- package/dist/cli/desktop-R6W5CLJ5.js +1046 -0
- package/dist/cli/desktop-R6W5CLJ5.js.map +1 -0
- package/dist/cli/devtools-YECO25QO.js +3719 -0
- package/dist/cli/devtools-YECO25QO.js.map +1 -0
- package/dist/cli/diff-LYNRCJZE.js +166 -0
- package/dist/cli/diff-LYNRCJZE.js.map +1 -0
- package/dist/cli/doctor-5IBP4R5J.js +28 -0
- package/dist/cli/doctor-5IBP4R5J.js.map +1 -0
- package/dist/cli/events-QN6KLN2V.js +340 -0
- package/dist/cli/events-QN6KLN2V.js.map +1 -0
- package/dist/cli/index.js +3500 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-FGKEH7RG.js +277 -0
- package/dist/cli/mcp-FGKEH7RG.js.map +1 -0
- package/dist/cli/mcp-browse-YCND4NWT.js +178 -0
- package/dist/cli/mcp-browse-YCND4NWT.js.map +1 -0
- package/dist/cli/mcp-inspect-V34J3VX5.js +143 -0
- package/dist/cli/mcp-inspect-V34J3VX5.js.map +1 -0
- package/dist/cli/package.json +3 -0
- package/dist/cli/prompt-I775PNKT.js +16 -0
- package/dist/cli/prompt-I775PNKT.js.map +1 -0
- package/dist/cli/prune-sessions-KGIIYD3P.js +44 -0
- package/dist/cli/prune-sessions-KGIIYD3P.js.map +1 -0
- package/dist/cli/replay-RDXLUAOE.js +292 -0
- package/dist/cli/replay-RDXLUAOE.js.map +1 -0
- package/dist/cli/run-RCAC2RYW.js +223 -0
- package/dist/cli/run-RCAC2RYW.js.map +1 -0
- package/dist/cli/server-FFU6TLYJ.js +3658 -0
- package/dist/cli/server-FFU6TLYJ.js.map +1 -0
- package/dist/cli/sessions-QT26MQAE.js +107 -0
- package/dist/cli/sessions-QT26MQAE.js.map +1 -0
- package/dist/cli/setup-VV4WKXHV.js +767 -0
- package/dist/cli/setup-VV4WKXHV.js.map +1 -0
- package/dist/cli/stats-JVZPQWAN.js +15 -0
- package/dist/cli/stats-JVZPQWAN.js.map +1 -0
- package/dist/cli/update-KYI3OVJP.js +15 -0
- package/dist/cli/update-KYI3OVJP.js.map +1 -0
- package/dist/cli/version-ANYORXTI.js +34 -0
- package/dist/cli/version-ANYORXTI.js.map +1 -0
- package/dist/index.d.ts +2557 -0
- package/dist/index.js +15000 -0
- package/dist/index.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index/semantic/builder.ts","../../src/index/semantic/chunker.ts","../../src/index/semantic/embedding.ts","../../src/index/semantic/store.ts"],"sourcesContent":["import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type ResolvedEmbeddingConfig, resolveSemanticEmbeddingConfig } from \"../../config.js\";\nimport { type ResolvedIndexConfig, defaultIndexConfig } from \"../config.js\";\nimport { walkChunks } from \"./chunker.js\";\nimport type { CodeChunk, SkipReason } from \"./chunker.js\";\nimport { embed, embedAll, probeOllama } from \"./embedding.js\";\nimport type { EmbedOptions } from \"./embedding.js\";\nimport {\n compareIndexIdentity,\n normalize,\n openStore,\n readIndexMeta,\n wipeStoreFiles,\n} from \"./store.js\";\nimport type { IndexEntry, IndexIdentity, IndexMismatch, SearchHit } from \"./store.js\";\n\nexport const INDEX_DIR_NAME = path.join(\".luckerr\", \"semantic\");\n\ntype BuildOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n windowLines?: number;\n overlap?: number;\n rebuild?: boolean;\n indexConfig?: ResolvedIndexConfig;\n onProgress?: (info: BuildProgress) => void;\n configPath?: string;\n};\n\nexport type SkipBuckets = Record<SkipReason, number>;\n\nexport interface BuildProgress {\n phase: \"setup\" | \"scan\" | \"embed\" | \"write\" | \"done\";\n filesScanned?: number;\n chunksTotal?: number;\n chunksDone?: number;\n filesSkipped?: number;\n filesChanged?: number;\n skipBuckets?: SkipBuckets;\n}\n\nexport interface BuildResult {\n filesScanned: number;\n filesChanged: number;\n chunksAdded: number;\n chunksRemoved: number;\n chunksSkipped: number;\n skipBuckets: SkipBuckets;\n durationMs: number;\n}\n\nfunction emptyBuckets(): SkipBuckets {\n return {\n defaultDir: 0,\n defaultFile: 0,\n binaryExt: 0,\n binaryContent: 0,\n tooLarge: 0,\n gitignore: 0,\n pattern: 0,\n readError: 0,\n };\n}\n\nexport async function buildIndex(root: string, opts: BuildOptions = {}): Promise<BuildResult> {\n const t0 = Date.now();\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveBuildEmbeddingConfig(opts);\n\n opts.onProgress?.({ phase: \"setup\" });\n throwIfAborted(opts.signal);\n await probeEmbeddingProvider(resolved, opts.signal);\n throwIfAborted(opts.signal);\n\n if (opts.rebuild) await wipeStoreFiles(indexDir);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n\n const lastMtimes = store.fileMtimes();\n const seenPaths = new Set<string>();\n const fileChunks = new Map<string, { chunks: CodeChunk[]; mtimeMs: number }>();\n let filesScanned = 0;\n let filesSkipped = 0;\n const skipBuckets = emptyBuckets();\n for await (const chunk of walkChunks(root, {\n windowLines: opts.windowLines,\n overlap: opts.overlap,\n config: opts.indexConfig ?? defaultIndexConfig(),\n onSkip: (_p, reason) => {\n skipBuckets[reason]++;\n },\n })) {\n throwIfAborted(opts.signal);\n seenPaths.add(chunk.path);\n let bucket = fileChunks.get(chunk.path);\n if (!bucket) {\n filesScanned++;\n const abs = path.join(root, chunk.path);\n let mtimeMs = 0;\n try {\n const stat = await fs.stat(abs);\n mtimeMs = stat.mtimeMs;\n } catch {\n continue;\n }\n const last = lastMtimes.get(chunk.path);\n if (last !== undefined && last === mtimeMs && !opts.rebuild) {\n filesSkipped++;\n continue;\n }\n bucket = { chunks: [], mtimeMs };\n fileChunks.set(chunk.path, bucket);\n }\n bucket.chunks.push(chunk);\n opts.onProgress?.({ phase: \"scan\", filesScanned });\n }\n\n throwIfAborted(opts.signal);\n const deletedPaths: string[] = [];\n for (const oldPath of lastMtimes.keys()) {\n if (!seenPaths.has(oldPath)) deletedPaths.push(oldPath);\n }\n const replacePaths = [...fileChunks.keys()].filter((p) => lastMtimes.has(p));\n throwIfAborted(opts.signal);\n const removed = await store.remove([...deletedPaths, ...replacePaths]);\n\n let chunksAdded = 0;\n let chunksSkipped = 0;\n const filesChanged = fileChunks.size;\n let chunksTotal = 0;\n for (const { chunks } of fileChunks.values()) chunksTotal += chunks.length;\n let chunksDone = 0;\n for (const [, bucket] of fileChunks) {\n throwIfAborted(opts.signal);\n if (bucket.chunks.length === 0) continue;\n const texts = bucket.chunks.map((c) => c.text);\n const vectors = await embedAll(texts, {\n ...resolved,\n signal: opts.signal,\n onProgress: (done, total) => {\n opts.onProgress?.({\n phase: \"embed\",\n filesScanned,\n filesChanged,\n chunksTotal,\n chunksDone: chunksDone + done,\n });\n if (done === total) chunksDone += total;\n },\n onError: (idx, err) => {\n chunksSkipped++;\n const c = bucket.chunks[idx];\n const where = c ? `${c.path}:${c.startLine}-${c.endLine}` : `chunk #${idx}`;\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`\\n ! skipped ${where}: ${msg}\\n`);\n },\n });\n throwIfAborted(opts.signal);\n const entries: IndexEntry[] = [];\n for (let i = 0; i < bucket.chunks.length; i++) {\n const vec = vectors[i];\n if (!vec) continue;\n const c = bucket.chunks[i];\n if (!c) continue;\n normalize(vec);\n entries.push({\n path: c.path,\n startLine: c.startLine,\n endLine: c.endLine,\n text: c.text,\n embedding: vec,\n mtimeMs: bucket.mtimeMs,\n });\n }\n throwIfAborted(opts.signal);\n if (entries.length > 0) await store.add(entries);\n chunksAdded += entries.length;\n }\n\n throwIfAborted(opts.signal);\n opts.onProgress?.({\n phase: \"done\",\n filesScanned,\n filesSkipped,\n filesChanged,\n chunksTotal,\n chunksDone,\n skipBuckets,\n });\n\n return {\n filesScanned,\n filesChanged,\n chunksAdded,\n chunksRemoved: removed,\n chunksSkipped,\n skipBuckets,\n durationMs: Date.now() - t0,\n };\n}\n\ntype QueryOptions = {\n provider?: \"ollama\" | \"openai-compat\";\n baseUrl?: string;\n apiKey?: string;\n model?: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n topK?: number;\n minScore?: number;\n configPath?: string;\n};\n\nexport async function querySemantic(\n root: string,\n query: string,\n opts: QueryOptions = {},\n): Promise<SearchHit[] | null> {\n const indexDir = path.join(root, INDEX_DIR_NAME);\n const resolved = resolveQueryEmbeddingConfig(opts);\n const store = await openStore(indexDir, {\n provider: resolved.provider,\n model: resolved.model,\n });\n if (store.empty) return null;\n const qvec = await embed(query, { ...resolved, signal: opts.signal });\n normalize(qvec);\n return store.search(qvec, opts.topK ?? 8, opts.minScore ?? 0.3);\n}\n\nexport async function indexExists(root: string): Promise<boolean> {\n const meta = path.join(root, INDEX_DIR_NAME, \"index.meta.json\");\n try {\n await fs.access(meta);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function indexCompatible(\n root: string,\n opts: { provider?: \"ollama\" | \"openai-compat\"; model?: string; configPath?: string } = {},\n): Promise<boolean> {\n const meta = await readIndexMeta(path.join(root, INDEX_DIR_NAME));\n if (!meta) return false;\n return compareIndexIdentity(meta, resolveIndexIdentity(opts)) === null;\n}\n\nfunction resolveBuildEmbeddingConfig(opts: BuildOptions): ResolvedEmbeddingConfig {\n if (opts.provider === \"openai-compat\") {\n if (!opts.baseUrl || !opts.apiKey || !opts.model) {\n throw new Error(\n \"OpenAI-compatible embeddings require baseUrl, apiKey, and model when passed directly.\",\n );\n }\n return {\n provider: \"openai-compat\",\n baseUrl: opts.baseUrl,\n apiKey: opts.apiKey,\n model: opts.model,\n extraBody: opts.extraBody ?? {},\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n if (opts.baseUrl || opts.model) {\n return {\n provider: \"ollama\",\n baseUrl: opts.baseUrl ?? process.env.OLLAMA_URL ?? \"http://localhost:11434\",\n model: opts.model ?? process.env.LUCKERR_EMBED_MODEL ?? \"nomic-embed-text\",\n timeoutMs: opts.timeoutMs ?? 30_000,\n };\n }\n return resolveSemanticEmbeddingConfig(opts.configPath);\n}\n\nfunction resolveIndexIdentity(opts: {\n provider?: \"ollama\" | \"openai-compat\";\n model?: string;\n configPath?: string;\n}): IndexIdentity {\n if (opts.provider && opts.model) {\n return { provider: opts.provider, model: opts.model };\n }\n const resolved = resolveSemanticEmbeddingConfig(opts.configPath);\n return { provider: resolved.provider, model: resolved.model };\n}\n\nfunction resolveQueryEmbeddingConfig(opts: QueryOptions): ResolvedEmbeddingConfig {\n return resolveBuildEmbeddingConfig(opts);\n}\n\nasync function probeEmbeddingProvider(\n config: ResolvedEmbeddingConfig,\n signal: AbortSignal | undefined,\n): Promise<void> {\n if (config.provider === \"openai-compat\") return;\n const probe = await probeOllama({ baseUrl: config.baseUrl, signal });\n if (!probe.ok) {\n throw new Error(\n `Ollama is not reachable: ${probe.error}. Install from https://ollama.com, then \\`ollama serve\\` and \\`ollama pull ${config.model}\\`.`,\n );\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw new Error(\"semantic indexing aborted\");\n }\n}\n","/** Line-window chunker (not AST) — language-agnostic, every chunk carries exact startLine/endLine for cite-back. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { type GitignoreLayer, ignoredByLayers, loadGitignoreAt } from \"../../gitignore.js\";\nimport {\n type IndexFilters,\n type ResolvedIndexConfig,\n compileFilters,\n defaultIndexConfig,\n} from \"../config.js\";\n\nexport interface CodeChunk {\n /** Path relative to the index root, forward slashes. Stable across OS. */\n path: string;\n /** 1-based, inclusive. */\n startLine: number;\n endLine: number;\n text: string;\n}\n\nexport type SkipReason =\n | \"defaultDir\"\n | \"defaultFile\"\n | \"binaryExt\"\n | \"binaryContent\"\n | \"tooLarge\"\n | \"gitignore\"\n | \"pattern\"\n | \"readError\";\n\nexport interface ChunkOptions {\n /** Lines per window. Default 60. */\n windowLines?: number;\n /** Lines of overlap between consecutive windows. Default 12. */\n overlap?: number;\n /** Default 4000 — keeps unicode-heavy slices under nomic-embed-text's 8K-token window. */\n maxChunkChars?: number;\n /** Resolved exclude/limit settings. Falls back to package defaults when omitted. */\n config?: ResolvedIndexConfig;\n /** Tally callback for files that didn't make it into the index. */\n onSkip?: (relPath: string, reason: SkipReason) => void;\n}\n\n/** Default character cap per chunk — sized for nomic-embed-text. */\nexport const DEFAULT_MAX_CHUNK_CHARS = 4000;\n\nexport function chunkText(\n text: string,\n filePath: string,\n windowLines: number,\n overlap: number,\n maxChunkChars: number = DEFAULT_MAX_CHUNK_CHARS,\n): CodeChunk[] {\n const lines = text.split(/\\r?\\n/);\n if (lines.length === 0 || (lines.length === 1 && lines[0] === \"\")) return [];\n const stride = Math.max(1, windowLines - overlap);\n const chunks: CodeChunk[] = [];\n for (let start = 0; start < lines.length; start += stride) {\n const end = Math.min(lines.length, start + windowLines);\n const slice = lines.slice(start, end).join(\"\\n\").trim();\n if (slice.length === 0) {\n if (end >= lines.length) break;\n continue;\n }\n const window: CodeChunk = {\n path: filePath,\n startLine: start + 1,\n endLine: end,\n text: slice,\n };\n for (const sub of safeSplit(window, maxChunkChars)) chunks.push(sub);\n if (end >= lines.length) break;\n }\n return chunks;\n}\n\nfunction safeSplit(chunk: CodeChunk, maxChars: number): CodeChunk[] {\n if (chunk.text.length <= maxChars) return [chunk];\n const lines = chunk.text.split(\"\\n\");\n const out: CodeChunk[] = [];\n let bufLines: string[] = [];\n let bufStart = chunk.startLine;\n let bufLen = 0;\n const flush = (untilLineNo: number): void => {\n if (bufLines.length === 0) return;\n out.push({\n path: chunk.path,\n startLine: bufStart,\n endLine: untilLineNo,\n text: bufLines.join(\"\\n\"),\n });\n bufLines = [];\n bufLen = 0;\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n const lineLen = line.length + 1;\n if (lineLen > maxChars) {\n flush(chunk.startLine + i - 1);\n out.push({\n path: chunk.path,\n startLine: chunk.startLine + i,\n endLine: chunk.startLine + i,\n text: line.slice(0, maxChars),\n });\n bufStart = chunk.startLine + i + 1;\n continue;\n }\n if (bufLen + lineLen > maxChars && bufLines.length > 0) {\n flush(chunk.startLine + i - 1);\n bufStart = chunk.startLine + i;\n }\n bufLines.push(line);\n bufLen += lineLen;\n }\n flush(chunk.endLine);\n return out;\n}\n\nfunction toForwardRel(root: string, abs: string): string {\n return path.relative(root, abs).split(path.sep).join(\"/\");\n}\n\ninterface WalkFrame {\n dir: string;\n layers: readonly GitignoreLayer[];\n}\n\nexport async function* walkChunks(\n root: string,\n opts: ChunkOptions = {},\n): AsyncGenerator<CodeChunk> {\n const windowLines = opts.windowLines ?? 60;\n const overlap = Math.min(opts.overlap ?? 12, Math.max(0, windowLines - 1));\n const maxChunkChars = opts.maxChunkChars ?? DEFAULT_MAX_CHUNK_CHARS;\n const filters: IndexFilters = compileFilters(opts.config ?? defaultIndexConfig());\n const onSkip = opts.onSkip ?? (() => {});\n\n const initial: GitignoreLayer[] = [];\n if (filters.respectGitignore) {\n const rootIg = await loadGitignoreAt(root);\n if (rootIg) initial.push({ dirAbs: root, ig: rootIg });\n }\n\n const stack: WalkFrame[] = [{ dir: root, layers: initial }];\n while (stack.length > 0) {\n const frame = stack.pop();\n if (!frame) break;\n const { dir, layers } = frame;\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const name = entry.name;\n const abs = path.join(dir, name);\n const rel = toForwardRel(root, abs);\n if (entry.isDirectory()) {\n if (filters.dirSet.has(name)) {\n onSkip(rel, \"defaultDir\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, true)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(`${rel}/`) || filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n const childLayers = filters.respectGitignore ? await extendLayers(layers, abs) : layers;\n stack.push({ dir: abs, layers: childLayers });\n continue;\n }\n if (!entry.isFile()) continue;\n if (filters.fileSet.has(name)) {\n onSkip(rel, \"defaultFile\");\n continue;\n }\n const ext = path.extname(name).toLowerCase();\n if (filters.extSet.has(ext)) {\n onSkip(rel, \"binaryExt\");\n continue;\n }\n if (filters.respectGitignore && ignoredByLayers(layers, abs, false)) {\n onSkip(rel, \"gitignore\");\n continue;\n }\n if (filters.patternMatch(rel)) {\n onSkip(rel, \"pattern\");\n continue;\n }\n // Open once and check size + read against the same fd. Skipping\n // a path-based `fs.stat` upstream is intentional — stat→open is\n // the TOCTOU shape CodeQL flags as js/file-system-race.\n const result = await readSizeBoundedFile(abs, filters.maxFileBytes);\n if (result.kind === \"skip\") {\n onSkip(rel, result.reason);\n continue;\n }\n const text = result.text;\n if (text.indexOf(\"\\0\") !== -1) {\n onSkip(rel, \"binaryContent\");\n continue;\n }\n for (const chunk of chunkText(text, rel, windowLines, overlap, maxChunkChars)) {\n yield chunk;\n }\n }\n }\n}\n\nasync function extendLayers(\n layers: readonly GitignoreLayer[],\n dirAbs: string,\n): Promise<readonly GitignoreLayer[]> {\n const ig = await loadGitignoreAt(dirAbs);\n return ig ? [...layers, { dirAbs, ig }] : layers;\n}\n\nexport async function chunkDirectory(root: string, opts: ChunkOptions = {}): Promise<CodeChunk[]> {\n const out: CodeChunk[] = [];\n for await (const c of walkChunks(root, opts)) out.push(c);\n return out;\n}\n\ntype ReadFileResult = { kind: \"ok\"; text: string } | { kind: \"skip\"; reason: SkipReason };\n\nasync function readSizeBoundedFile(abs: string, maxBytes: number): Promise<ReadFileResult> {\n try {\n const fh = await fs.open(abs, \"r\");\n try {\n const stat = await fh.stat();\n if (stat.size > maxBytes) return { kind: \"skip\", reason: \"tooLarge\" };\n return { kind: \"ok\", text: await fh.readFile(\"utf8\") };\n } finally {\n await fh.close();\n }\n } catch {\n return { kind: \"skip\", reason: \"readError\" };\n }\n}\n","const DEFAULT_OLLAMA_URL = \"http://localhost:11434\";\nconst DEFAULT_EMBED_MODEL = \"nomic-embed-text\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport type EmbedOptions =\n | {\n provider?: \"ollama\";\n baseUrl?: string;\n model?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n }\n | {\n provider: \"openai-compat\";\n baseUrl: string;\n apiKey: string;\n model: string;\n extraBody?: Record<string, unknown>;\n timeoutMs?: number;\n signal?: AbortSignal;\n };\n\nexport class EmbeddingError extends Error {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"EmbeddingError\";\n }\n}\n\nexport async function embed(text: string, opts: EmbedOptions = {}): Promise<Float32Array> {\n if (opts.provider === \"openai-compat\") return await embedOpenAICompat(text, opts);\n return await embedOllama(text, opts);\n}\n\nexport async function embedAll(\n texts: readonly string[],\n opts: EmbedOptions & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n } = {},\n): Promise<Array<Float32Array | null>> {\n if (opts.provider === \"openai-compat\") return await embedAllOpenAICompat(texts, opts);\n const out: Array<Float32Array | null> = [];\n for (let i = 0; i < texts.length; i++) {\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const text = texts[i];\n if (text === undefined) continue;\n try {\n out.push(await embed(text, opts));\n } catch (err) {\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n opts.onError?.(i, err);\n out.push(null);\n }\n opts.onProgress?.(i + 1, texts.length);\n }\n return out;\n}\n\nexport async function probeOllama(\n opts: { baseUrl?: string; signal?: AbortSignal } = {},\n): Promise<{ ok: true; models: string[] } | { ok: false; error: string }> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n try {\n const res = await fetch(`${baseUrl}/api/tags`, { signal: opts.signal });\n if (!res.ok) return { ok: false, error: `Ollama returned ${res.status}` };\n const json = (await res.json()) as { models?: Array<{ name?: string }> };\n const models = (json.models ?? [])\n .map((m) => m.name)\n .filter((n): n is string => typeof n === \"string\");\n return { ok: true, models };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { ok: false, error: msg };\n }\n}\n\nasync function embedOllama(\n text: string,\n opts: Extract<EmbedOptions, { provider?: \"ollama\" }>,\n): Promise<Float32Array> {\n const baseUrl = opts.baseUrl ?? process.env.OLLAMA_URL ?? DEFAULT_OLLAMA_URL;\n const model = opts.model ?? process.env.LUCKERR_EMBED_MODEL ?? DEFAULT_EMBED_MODEL;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n\n let res: Response;\n try {\n res = await fetch(`${baseUrl}/api/embeddings`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ model, prompt: text }),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n const msg = err instanceof Error ? err.message : String(err);\n if (/ECONNREFUSED|connect ECONNREFUSED|fetch failed/i.test(msg)) {\n throw new EmbeddingError(\n `Cannot reach Ollama at ${baseUrl}. Install from https://ollama.com, then run \\`ollama pull ${model}\\` and \\`ollama serve\\`. Override the URL via OLLAMA_URL.`,\n err,\n );\n }\n throw new EmbeddingError(`embedding request failed: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n if (res.status === 404 && /model.*not found/i.test(body)) {\n throw new EmbeddingError(\n `Embedding model \"${model}\" not pulled. Run \\`ollama pull ${model}\\` once, then retry.`,\n );\n }\n throw new EmbeddingError(`Ollama returned ${res.status}: ${body.slice(0, 200)}`);\n }\n\n const json = (await res.json()) as { embedding?: unknown };\n if (!json.embedding || !Array.isArray(json.embedding)) {\n throw new EmbeddingError(\"Ollama response missing 'embedding' array\");\n }\n return toFloat32Array(json.embedding, \"embedding\");\n}\n\nasync function embedOpenAICompat(\n text: string,\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Float32Array> {\n const vectors = await requestOpenAICompatEmbeddings(text, opts);\n const v = vectors[0];\n if (!v) {\n throw new EmbeddingError(\n `Embedding provider returned no vector for the input (model ${opts.model})`,\n );\n }\n return v;\n}\n\nasync function embedAllOpenAICompat(\n texts: readonly string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }> & {\n onProgress?: (done: number, total: number) => void;\n onError?: (index: number, err: unknown) => void;\n },\n): Promise<Array<Float32Array | null>> {\n if (texts.length === 0) return [];\n if (opts.signal?.aborted) throw new EmbeddingError(\"embedding aborted\");\n const vectors = await requestOpenAICompatEmbeddings([...texts], opts);\n for (let i = 0; i < vectors.length; i++) {\n if (vectors[i] === null) {\n opts.onError?.(\n i,\n new EmbeddingError(\n `provider dropped input ${i} from the batch (model ${opts.model} returned no embedding for it)`,\n ),\n );\n }\n }\n opts.onProgress?.(texts.length, texts.length);\n return vectors;\n}\n\nasync function requestOpenAICompatEmbeddings(\n input: string | string[],\n opts: Extract<EmbedOptions, { provider: \"openai-compat\" }>,\n): Promise<Array<Float32Array | null>> {\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const { controller, cleanup } = composeAbort(opts.signal, timeoutMs, \"embedding timeout\");\n const url = opts.baseUrl.trim();\n const body = {\n ...(opts.extraBody ?? {}),\n model: opts.model,\n input,\n encoding_format: \"float\",\n };\n\n let res: Response;\n try {\n res = await fetch(url, {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${opts.apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n cleanup();\n if (isAbortError(err) || opts.signal?.aborted) {\n throw new EmbeddingError(\"embedding aborted\", err);\n }\n const msg = err instanceof Error ? err.message : String(err);\n throw new EmbeddingError(`Cannot reach OpenAI-compatible embeddings at ${url}: ${msg}`, err);\n } finally {\n cleanup();\n }\n\n if (!res.ok) {\n const raw = await res.text().catch(() => \"\");\n const bodyText = raw.slice(0, 300);\n if (res.status === 401 || res.status === 403) {\n throw new EmbeddingError(\n `OpenAI-compatible API rejected the API key for ${url}. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 404) {\n throw new EmbeddingError(\n `Embeddings endpoint not found at ${url}. Check the configured API URL. Response ${res.status}: ${bodyText}`,\n );\n }\n if (res.status === 400) {\n throw new EmbeddingError(\n `Embedding provider returned 400: ${bodyText}. Check model and custom request body fields.`,\n );\n }\n throw new EmbeddingError(`OpenAI-compatible API returned ${res.status}: ${bodyText}`);\n }\n\n const json = (await res.json()) as {\n data?: Array<{ index?: unknown; embedding?: unknown }>;\n };\n if (!Array.isArray(json.data)) {\n throw new EmbeddingError(\"OpenAI-compatible response missing 'data' array\");\n }\n const size = Array.isArray(input) ? input.length : 1;\n const out: Array<Float32Array | null> = new Array(size).fill(null);\n for (const row of json.data) {\n const rawIndex = row.index;\n if (\n typeof rawIndex !== \"number\" ||\n !Number.isInteger(rawIndex) ||\n rawIndex < 0 ||\n rawIndex >= size\n ) {\n throw new EmbeddingError(\"OpenAI-compatible response returned an invalid embedding index\");\n }\n const index = rawIndex;\n if (!Array.isArray(row.embedding)) {\n throw new EmbeddingError(`OpenAI-compatible response missing embedding for index ${index}`);\n }\n out[index] = toFloat32Array(row.embedding, `data[${index}].embedding`);\n }\n return out;\n}\n\nfunction toFloat32Array(values: unknown[], label: string): Float32Array {\n const out = new Float32Array(values.length);\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new EmbeddingError(`${label}[${i}] is not a finite number`);\n }\n out[i] = value;\n }\n return out;\n}\n\nfunction composeAbort(\n signal: AbortSignal | undefined,\n timeoutMs: number,\n reason: string,\n): { controller: AbortController; cleanup: () => void } {\n const controller = new AbortController();\n const onCallerAbort = () => controller.abort(signal?.reason);\n if (signal) {\n if (signal.aborted) controller.abort(signal.reason);\n else signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(new Error(reason)), timeoutMs);\n return {\n controller,\n cleanup: () => {\n clearTimeout(timer);\n if (signal) signal.removeEventListener(\"abort\", onCallerAbort);\n },\n };\n}\n\nfunction isAbortError(err: unknown): boolean {\n if (err instanceof Error) {\n if (err.name === \"AbortError\") return true;\n if (/aborted/i.test(err.message)) return true;\n }\n return false;\n}\n","/** JSONL append-only (Ctrl+C-safe) + linear cosine scan over unboxed Float32Array — fast enough for ≤10k chunks. */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport type { EmbeddingProvider } from \"../../config.js\";\nimport type { CodeChunk } from \"./chunker.js\";\n\nexport interface IndexEntry extends CodeChunk {\n embedding: Float32Array;\n mtimeMs: number;\n}\n\nexport interface SearchHit {\n entry: IndexEntry;\n score: number;\n}\n\nexport type IndexMismatch = \"provider\" | \"model\";\n\nexport interface IndexIdentity {\n provider: EmbeddingProvider;\n model: string;\n}\n\nexport interface IndexMeta extends IndexIdentity {\n version: number;\n dim: number;\n updatedAt: string;\n}\n\nexport const STORE_VERSION = 1;\n\nconst META_FILE = \"index.meta.json\";\nconst DATA_FILE = \"index.jsonl\";\n\nexport async function readIndexMeta(indexDir: string): Promise<IndexMeta | null> {\n try {\n const raw = await fs.readFile(path.join(indexDir, META_FILE), \"utf8\");\n return normalizeMeta(JSON.parse(raw) as Partial<IndexMeta>);\n } catch {\n return null;\n }\n}\n\nexport function compareIndexIdentity(\n meta: IndexIdentity,\n identity: IndexIdentity,\n): IndexMismatch | null {\n if (meta.provider !== identity.provider) return \"provider\";\n if (meta.model !== identity.model) return \"model\";\n return null;\n}\n\nexport async function wipeStoreFiles(indexDir: string): Promise<void> {\n await fs.rm(path.join(indexDir, DATA_FILE), { force: true });\n await fs.rm(path.join(indexDir, META_FILE), { force: true });\n}\n\nexport class SemanticStore {\n private entries: IndexEntry[] = [];\n private byPath = new Map<string, IndexEntry[]>();\n private dim = 0;\n\n constructor(\n public readonly indexDir: string,\n public readonly identity: IndexIdentity,\n ) {}\n\n get provider(): EmbeddingProvider {\n return this.identity.provider;\n }\n\n get model(): string {\n return this.identity.model;\n }\n\n get empty(): boolean {\n return this.entries.length === 0;\n }\n\n get size(): number {\n return this.entries.length;\n }\n\n get all(): readonly IndexEntry[] {\n return this.entries;\n }\n\n fileMtimes(): Map<string, number> {\n const out = new Map<string, number>();\n for (const [p, group] of this.byPath) {\n const first = group[0];\n if (first) out.set(p, first.mtimeMs);\n }\n return out;\n }\n\n async add(entries: readonly IndexEntry[]): Promise<void> {\n if (entries.length === 0) return;\n if (this.dim === 0) this.dim = entries[0]!.embedding.length;\n const lines: string[] = [];\n for (const e of entries) {\n if (e.embedding.length !== this.dim) {\n throw new Error(\n `embedding dim mismatch: expected ${this.dim}, got ${e.embedding.length} for ${e.path}:${e.startLine}`,\n );\n }\n this.entries.push(e);\n const list = this.byPath.get(e.path);\n if (list) list.push(e);\n else this.byPath.set(e.path, [e]);\n lines.push(serializeEntry(e));\n }\n await fs.mkdir(this.indexDir, { recursive: true });\n await fs.appendFile(path.join(this.indexDir, DATA_FILE), `${lines.join(\"\\n\")}\\n`, \"utf8\");\n await this.writeMeta();\n }\n\n async remove(paths: readonly string[]): Promise<number> {\n if (paths.length === 0) return 0;\n const drop = new Set(paths);\n const before = this.entries.length;\n this.entries = this.entries.filter((e) => !drop.has(e.path));\n for (const p of paths) this.byPath.delete(p);\n const removed = before - this.entries.length;\n if (removed > 0) await this.flush();\n return removed;\n }\n\n search(query: Float32Array, topK = 8, minScore = 0): SearchHit[] {\n if (this.entries.length === 0) return [];\n if (query.length !== this.dim && this.dim !== 0) {\n throw new Error(`query dim ${query.length} ≠ index dim ${this.dim}`);\n }\n const heap: SearchHit[] = [];\n for (const entry of this.entries) {\n const score = dot(query, entry.embedding);\n if (score < minScore) continue;\n if (heap.length < topK) {\n heap.push({ entry, score });\n if (heap.length === topK) heap.sort((a, b) => a.score - b.score);\n } else if (score > heap[0]!.score) {\n heap[0] = { entry, score };\n for (let i = 0; i < heap.length - 1; i++) {\n if (heap[i]!.score > heap[i + 1]!.score) {\n const tmp = heap[i]!;\n heap[i] = heap[i + 1]!;\n heap[i + 1] = tmp;\n }\n }\n }\n }\n return heap.sort((a, b) => b.score - a.score);\n }\n\n private async flush(): Promise<void> {\n await fs.mkdir(this.indexDir, { recursive: true });\n const tmp = path.join(this.indexDir, `${DATA_FILE}.tmp`);\n const final = path.join(this.indexDir, DATA_FILE);\n const lines = this.entries.map(serializeEntry).join(\"\\n\");\n await fs.writeFile(tmp, lines.length > 0 ? `${lines}\\n` : \"\", \"utf8\");\n await fs.rename(tmp, final);\n await this.writeMeta();\n }\n\n private async writeMeta(): Promise<void> {\n const meta: IndexMeta = {\n version: STORE_VERSION,\n provider: this.provider,\n model: this.model,\n dim: this.dim,\n updatedAt: new Date().toISOString(),\n };\n await fs.writeFile(\n path.join(this.indexDir, META_FILE),\n `${JSON.stringify(meta, null, 2)}\\n`,\n \"utf8\",\n );\n }\n\n async wipe(): Promise<void> {\n this.entries = [];\n this.byPath.clear();\n this.dim = 0;\n await wipeStoreFiles(this.indexDir);\n }\n}\n\nexport async function openStore(indexDir: string, identity: IndexIdentity): Promise<SemanticStore> {\n const store = new SemanticStore(indexDir, identity);\n const dataPath = path.join(indexDir, DATA_FILE);\n\n const meta = await readIndexMeta(indexDir);\n\n if (meta) {\n if (meta.version !== STORE_VERSION) {\n throw new Error(\n `Index format version ${meta.version} does not match current ${STORE_VERSION}. Run \\`luckerr index --rebuild\\`.`,\n );\n }\n const mismatch = compareIndexIdentity(meta, identity);\n if (mismatch !== null) {\n throw new Error(\n `Index was built with provider \"${meta.provider}\" model \"${meta.model}\" but current config is provider \"${identity.provider}\" model \"${identity.model}\". Run \\`luckerr index --rebuild\\`.`,\n );\n }\n }\n\n let raw: string;\n try {\n raw = await fs.readFile(dataPath, \"utf8\");\n } catch {\n return store;\n }\n for (const line of raw.split(\"\\n\")) {\n if (line.length === 0) continue;\n try {\n const entry = deserializeEntry(line);\n (store as unknown as { dim: number }).dim = entry.embedding.length;\n (store as unknown as { entries: IndexEntry[] }).entries.push(entry);\n const map = (store as unknown as { byPath: Map<string, IndexEntry[]> }).byPath;\n const list = map.get(entry.path);\n if (list) list.push(entry);\n else map.set(entry.path, [entry]);\n } catch {\n /* tolerate malformed line */\n }\n }\n return store;\n}\n\nexport function normalize(v: Float32Array): Float32Array {\n let sum = 0;\n for (let i = 0; i < v.length; i++) sum += v[i]! * v[i]!;\n const inv = sum > 0 ? 1 / Math.sqrt(sum) : 0;\n for (let i = 0; i < v.length; i++) v[i] = v[i]! * inv;\n return v;\n}\n\nfunction dot(a: Float32Array, b: Float32Array): number {\n let s = 0;\n for (let i = 0; i < a.length; i++) s += a[i]! * b[i]!;\n return s;\n}\n\nfunction serializeEntry(e: IndexEntry): string {\n const buf = Buffer.from(e.embedding.buffer, e.embedding.byteOffset, e.embedding.byteLength);\n return JSON.stringify({\n p: e.path,\n s: e.startLine,\n e: e.endLine,\n m: e.mtimeMs,\n t: e.text,\n v: buf.toString(\"base64\"),\n });\n}\n\nfunction deserializeEntry(line: string): IndexEntry {\n const parsed = JSON.parse(line) as {\n p: string;\n s: number;\n e: number;\n m: number;\n t: string;\n v: string;\n };\n const buf = Buffer.from(parsed.v, \"base64\");\n const embedding = new Float32Array(\n buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength),\n );\n return {\n path: parsed.p,\n startLine: parsed.s,\n endLine: parsed.e,\n mtimeMs: parsed.m,\n text: parsed.t,\n embedding: new Float32Array(embedding),\n };\n}\n\nfunction normalizeMeta(meta: Partial<IndexMeta>): IndexMeta {\n return {\n version: typeof meta.version === \"number\" ? meta.version : STORE_VERSION,\n provider: meta.provider === \"openai-compat\" ? \"openai-compat\" : \"ollama\",\n model: typeof meta.model === \"string\" ? meta.model : \"\",\n dim: typeof meta.dim === \"number\" ? meta.dim : 0,\n updatedAt: typeof meta.updatedAt === \"string\" ? meta.updatedAt : new Date(0).toISOString(),\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAYA,WAAU;AAC/B,OAAOC,WAAU;;;ACCjB,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AA0CV,IAAM,0BAA0B;AAEhC,SAAS,UACd,MACA,UACA,aACA,SACA,gBAAwB,yBACX;AACb,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,MAAI,MAAM,WAAW,KAAM,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,GAAK,QAAO,CAAC;AAC3E,QAAM,SAAS,KAAK,IAAI,GAAG,cAAc,OAAO;AAChD,QAAM,SAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AACzD,UAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ,WAAW;AACtD,UAAM,QAAQ,MAAM,MAAM,OAAO,GAAG,EAAE,KAAK,IAAI,EAAE,KAAK;AACtD,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,OAAO,MAAM,OAAQ;AACzB;AAAA,IACF;AACA,UAAM,SAAoB;AAAA,MACxB,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AACA,eAAW,OAAO,UAAU,QAAQ,aAAa,EAAG,QAAO,KAAK,GAAG;AACnE,QAAI,OAAO,MAAM,OAAQ;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAkB,UAA+B;AAClE,MAAI,MAAM,KAAK,UAAU,SAAU,QAAO,CAAC,KAAK;AAChD,QAAM,QAAQ,MAAM,KAAK,MAAM,IAAI;AACnC,QAAM,MAAmB,CAAC;AAC1B,MAAI,WAAqB,CAAC;AAC1B,MAAI,WAAW,MAAM;AACrB,MAAI,SAAS;AACb,QAAM,QAAQ,CAAC,gBAA8B;AAC3C,QAAI,SAAS,WAAW,EAAG;AAC3B,QAAI,KAAK;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,MAAM,SAAS,KAAK,IAAI;AAAA,IAC1B,CAAC;AACD,eAAW,CAAC;AACZ,aAAS;AAAA,EACX;AACA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC,KAAK;AACzB,UAAM,UAAU,KAAK,SAAS;AAC9B,QAAI,UAAU,UAAU;AACtB,YAAM,MAAM,YAAY,IAAI,CAAC;AAC7B,UAAI,KAAK;AAAA,QACP,MAAM,MAAM;AAAA,QACZ,WAAW,MAAM,YAAY;AAAA,QAC7B,SAAS,MAAM,YAAY;AAAA,QAC3B,MAAM,KAAK,MAAM,GAAG,QAAQ;AAAA,MAC9B,CAAC;AACD,iBAAW,MAAM,YAAY,IAAI;AACjC;AAAA,IACF;AACA,QAAI,SAAS,UAAU,YAAY,SAAS,SAAS,GAAG;AACtD,YAAM,MAAM,YAAY,IAAI,CAAC;AAC7B,iBAAW,MAAM,YAAY;AAAA,IAC/B;AACA,aAAS,KAAK,IAAI;AAClB,cAAU;AAAA,EACZ;AACA,QAAM,MAAM,OAAO;AACnB,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,KAAqB;AACvD,SAAO,KAAK,SAAS,MAAM,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AAC1D;AAOA,gBAAuB,WACrB,MACA,OAAqB,CAAC,GACK;AAC3B,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,UAAU,KAAK,IAAI,KAAK,WAAW,IAAI,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;AACzE,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,UAAwB,eAAe,KAAK,UAAU,mBAAmB,CAAC;AAChF,QAAM,SAAS,KAAK,WAAW,MAAM;AAAA,EAAC;AAEtC,QAAM,UAA4B,CAAC;AACnC,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,QAAI,OAAQ,SAAQ,KAAK,EAAE,QAAQ,MAAM,IAAI,OAAO,CAAC;AAAA,EACvD;AAEA,QAAM,QAAqB,CAAC,EAAE,KAAK,MAAM,QAAQ,QAAQ,CAAC;AAC1D,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,QAAQ,MAAM,IAAI;AACxB,QAAI,CAAC,MAAO;AACZ,UAAM,EAAE,KAAK,OAAO,IAAI;AACxB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACzD,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAO,MAAM;AACnB,YAAM,MAAM,KAAK,KAAK,KAAK,IAAI;AAC/B,YAAM,MAAM,aAAa,MAAM,GAAG;AAClC,UAAI,MAAM,YAAY,GAAG;AACvB,YAAI,QAAQ,OAAO,IAAI,IAAI,GAAG;AAC5B,iBAAO,KAAK,YAAY;AACxB;AAAA,QACF;AACA,YAAI,QAAQ,oBAAoB,gBAAgB,QAAQ,KAAK,IAAI,GAAG;AAClE,iBAAO,KAAK,WAAW;AACvB;AAAA,QACF;AACA,YAAI,QAAQ,aAAa,GAAG,GAAG,GAAG,KAAK,QAAQ,aAAa,GAAG,GAAG;AAChE,iBAAO,KAAK,SAAS;AACrB;AAAA,QACF;AACA,cAAM,cAAc,QAAQ,mBAAmB,MAAM,aAAa,QAAQ,GAAG,IAAI;AACjF,cAAM,KAAK,EAAE,KAAK,KAAK,QAAQ,YAAY,CAAC;AAC5C;AAAA,MACF;AACA,UAAI,CAAC,MAAM,OAAO,EAAG;AACrB,UAAI,QAAQ,QAAQ,IAAI,IAAI,GAAG;AAC7B,eAAO,KAAK,aAAa;AACzB;AAAA,MACF;AACA,YAAM,MAAM,KAAK,QAAQ,IAAI,EAAE,YAAY;AAC3C,UAAI,QAAQ,OAAO,IAAI,GAAG,GAAG;AAC3B,eAAO,KAAK,WAAW;AACvB;AAAA,MACF;AACA,UAAI,QAAQ,oBAAoB,gBAAgB,QAAQ,KAAK,KAAK,GAAG;AACnE,eAAO,KAAK,WAAW;AACvB;AAAA,MACF;AACA,UAAI,QAAQ,aAAa,GAAG,GAAG;AAC7B,eAAO,KAAK,SAAS;AACrB;AAAA,MACF;AAIA,YAAM,SAAS,MAAM,oBAAoB,KAAK,QAAQ,YAAY;AAClE,UAAI,OAAO,SAAS,QAAQ;AAC1B,eAAO,KAAK,OAAO,MAAM;AACzB;AAAA,MACF;AACA,YAAM,OAAO,OAAO;AACpB,UAAI,KAAK,QAAQ,IAAI,MAAM,IAAI;AAC7B,eAAO,KAAK,eAAe;AAC3B;AAAA,MACF;AACA,iBAAW,SAAS,UAAU,MAAM,KAAK,aAAa,SAAS,aAAa,GAAG;AAC7E,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,aACb,QACA,QACoC;AACpC,QAAM,KAAK,MAAM,gBAAgB,MAAM;AACvC,SAAO,KAAK,CAAC,GAAG,QAAQ,EAAE,QAAQ,GAAG,CAAC,IAAI;AAC5C;AAUA,eAAe,oBAAoB,KAAa,UAA2C;AACzF,MAAI;AACF,UAAM,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,UAAI,KAAK,OAAO,SAAU,QAAO,EAAE,MAAM,QAAQ,QAAQ,WAAW;AACpE,aAAO,EAAE,MAAM,MAAM,MAAM,MAAM,GAAG,SAAS,MAAM,EAAE;AAAA,IACvD,UAAE;AACA,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,MAAM,QAAQ,QAAQ,YAAY;AAAA,EAC7C;AACF;;;ACpPA,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAoBpB,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YACE,SACyB,OACzB;AACA,UAAM,OAAO;AAFY;AAGzB,SAAK,OAAO;AAAA,EACd;AAAA,EAJ2B;AAK7B;AAEA,eAAsB,MAAM,MAAc,OAAqB,CAAC,GAA0B;AACxF,MAAI,KAAK,aAAa,gBAAiB,QAAO,MAAM,kBAAkB,MAAM,IAAI;AAChF,SAAO,MAAM,YAAY,MAAM,IAAI;AACrC;AAEA,eAAsB,SACpB,OACA,OAGI,CAAC,GACgC;AACrC,MAAI,KAAK,aAAa,gBAAiB,QAAO,MAAM,qBAAqB,OAAO,IAAI;AACpF,QAAM,MAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,eAAe,mBAAmB;AACtE,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,SAAS,OAAW;AACxB,QAAI;AACF,UAAI,KAAK,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,UAAI,aAAa,GAAG,KAAK,KAAK,QAAQ,SAAS;AAC7C,cAAM,IAAI,eAAe,qBAAqB,GAAG;AAAA,MACnD;AACA,WAAK,UAAU,GAAG,GAAG;AACrB,UAAI,KAAK,IAAI;AAAA,IACf;AACA,SAAK,aAAa,IAAI,GAAG,MAAM,MAAM;AAAA,EACvC;AACA,SAAO;AACT;AAEA,eAAsB,YACpB,OAAmD,CAAC,GACoB;AACxE,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,cAAc;AAC1D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,aAAa,EAAE,QAAQ,KAAK,OAAO,CAAC;AACtE,QAAI,CAAC,IAAI,GAAI,QAAO,EAAE,IAAI,OAAO,OAAO,mBAAmB,IAAI,MAAM,GAAG;AACxE,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,UAAU,KAAK,UAAU,CAAC,GAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACnD,WAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EAC5B,SAAS,KAAK;AACZ,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,WAAO,EAAE,IAAI,OAAO,OAAO,IAAI;AAAA,EACjC;AACF;AAEA,eAAe,YACb,MACA,MACuB;AACvB,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,cAAc;AAC1D,QAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI,uBAAuB;AAC/D,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,EAAE,YAAY,QAAQ,IAAI,aAAa,KAAK,QAAQ,WAAW,mBAAmB;AAExF,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,OAAO,mBAAmB;AAAA,MAC7C,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,KAAK,CAAC;AAAA,MAC5C,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ;AACR,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,QAAI,kDAAkD,KAAK,GAAG,GAAG;AAC/D,YAAM,IAAI;AAAA,QACR,0BAA0B,OAAO,6DAA6D,KAAK;AAAA,QACnG;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI,eAAe,6BAA6B,GAAG,IAAI,GAAG;AAAA,EAClE,UAAE;AACA,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,QAAI,IAAI,WAAW,OAAO,oBAAoB,KAAK,IAAI,GAAG;AACxD,YAAM,IAAI;AAAA,QACR,oBAAoB,KAAK,mCAAmC,KAAK;AAAA,MACnE;AAAA,IACF;AACA,UAAM,IAAI,eAAe,mBAAmB,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACjF;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,KAAK,aAAa,CAAC,MAAM,QAAQ,KAAK,SAAS,GAAG;AACrD,UAAM,IAAI,eAAe,2CAA2C;AAAA,EACtE;AACA,SAAO,eAAe,KAAK,WAAW,WAAW;AACnD;AAEA,eAAe,kBACb,MACA,MACuB;AACvB,QAAM,UAAU,MAAM,8BAA8B,MAAM,IAAI;AAC9D,QAAM,IAAI,QAAQ,CAAC;AACnB,MAAI,CAAC,GAAG;AACN,UAAM,IAAI;AAAA,MACR,8DAA8D,KAAK,KAAK;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,qBACb,OACA,MAIqC;AACrC,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAChC,MAAI,KAAK,QAAQ,QAAS,OAAM,IAAI,eAAe,mBAAmB;AACtE,QAAM,UAAU,MAAM,8BAA8B,CAAC,GAAG,KAAK,GAAG,IAAI;AACpE,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,CAAC,MAAM,MAAM;AACvB,WAAK;AAAA,QACH;AAAA,QACA,IAAI;AAAA,UACF,0BAA0B,CAAC,0BAA0B,KAAK,KAAK;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,OAAK,aAAa,MAAM,QAAQ,MAAM,MAAM;AAC5C,SAAO;AACT;AAEA,eAAe,8BACb,OACA,MACqC;AACrC,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,EAAE,YAAY,QAAQ,IAAI,aAAa,KAAK,QAAQ,WAAW,mBAAmB;AACxF,QAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,QAAM,OAAO;AAAA,IACX,GAAI,KAAK,aAAa,CAAC;AAAA,IACvB,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,EACnB;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACpC,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB,QAAQ,WAAW;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,YAAQ;AACR,QAAI,aAAa,GAAG,KAAK,KAAK,QAAQ,SAAS;AAC7C,YAAM,IAAI,eAAe,qBAAqB,GAAG;AAAA,IACnD;AACA,UAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,UAAM,IAAI,eAAe,gDAAgD,GAAG,KAAK,GAAG,IAAI,GAAG;AAAA,EAC7F,UAAE;AACA,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC3C,UAAM,WAAW,IAAI,MAAM,GAAG,GAAG;AACjC,QAAI,IAAI,WAAW,OAAO,IAAI,WAAW,KAAK;AAC5C,YAAM,IAAI;AAAA,QACR,kDAAkD,GAAG,cAAc,IAAI,MAAM,KAAK,QAAQ;AAAA,MAC5F;AAAA,IACF;AACA,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,IAAI;AAAA,QACR,oCAAoC,GAAG,4CAA4C,IAAI,MAAM,KAAK,QAAQ;AAAA,MAC5G;AAAA,IACF;AACA,QAAI,IAAI,WAAW,KAAK;AACtB,YAAM,IAAI;AAAA,QACR,oCAAoC,QAAQ;AAAA,MAC9C;AAAA,IACF;AACA,UAAM,IAAI,eAAe,kCAAkC,IAAI,MAAM,KAAK,QAAQ,EAAE;AAAA,EACtF;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAG7B,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC7B,UAAM,IAAI,eAAe,iDAAiD;AAAA,EAC5E;AACA,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,SAAS;AACnD,QAAM,MAAkC,IAAI,MAAM,IAAI,EAAE,KAAK,IAAI;AACjE,aAAW,OAAO,KAAK,MAAM;AAC3B,UAAM,WAAW,IAAI;AACrB,QACE,OAAO,aAAa,YACpB,CAAC,OAAO,UAAU,QAAQ,KAC1B,WAAW,KACX,YAAY,MACZ;AACA,YAAM,IAAI,eAAe,gEAAgE;AAAA,IAC3F;AACA,UAAM,QAAQ;AACd,QAAI,CAAC,MAAM,QAAQ,IAAI,SAAS,GAAG;AACjC,YAAM,IAAI,eAAe,0DAA0D,KAAK,EAAE;AAAA,IAC5F;AACA,QAAI,KAAK,IAAI,eAAe,IAAI,WAAW,QAAQ,KAAK,aAAa;AAAA,EACvE;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAmB,OAA6B;AACtE,QAAM,MAAM,IAAI,aAAa,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,YAAM,IAAI,eAAe,GAAG,KAAK,IAAI,CAAC,0BAA0B;AAAA,IAClE;AACA,QAAI,CAAC,IAAI;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,aACP,QACA,WACA,QACsD;AACtD,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,gBAAgB,MAAM,WAAW,MAAM,QAAQ,MAAM;AAC3D,MAAI,QAAQ;AACV,QAAI,OAAO,QAAS,YAAW,MAAM,OAAO,MAAM;AAAA,QAC7C,QAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,EACrE;AACA,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,IAAI,MAAM,MAAM,CAAC,GAAG,SAAS;AAC7E,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM;AACb,mBAAa,KAAK;AAClB,UAAI,OAAQ,QAAO,oBAAoB,SAAS,aAAa;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAAuB;AAC3C,MAAI,eAAe,OAAO;AACxB,QAAI,IAAI,SAAS,aAAc,QAAO;AACtC,QAAI,WAAW,KAAK,IAAI,OAAO,EAAG,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;;;ACjSA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AA2BV,IAAM,gBAAgB;AAE7B,IAAM,YAAY;AAClB,IAAM,YAAY;AAElB,eAAsB,cAAc,UAA6C;AAC/E,MAAI;AACF,UAAM,MAAM,MAAMD,IAAG,SAASC,MAAK,KAAK,UAAU,SAAS,GAAG,MAAM;AACpE,WAAO,cAAc,KAAK,MAAM,GAAG,CAAuB;AAAA,EAC5D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBACd,MACA,UACsB;AACtB,MAAI,KAAK,aAAa,SAAS,SAAU,QAAO;AAChD,MAAI,KAAK,UAAU,SAAS,MAAO,QAAO;AAC1C,SAAO;AACT;AAEA,eAAsB,eAAe,UAAiC;AACpE,QAAMD,IAAG,GAAGC,MAAK,KAAK,UAAU,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC3D,QAAMD,IAAG,GAAGC,MAAK,KAAK,UAAU,SAAS,GAAG,EAAE,OAAO,KAAK,CAAC;AAC7D;AAEO,IAAM,gBAAN,MAAoB;AAAA,EAKzB,YACkB,UACA,UAChB;AAFgB;AACA;AAAA,EACf;AAAA,EAFe;AAAA,EACA;AAAA,EANV,UAAwB,CAAC;AAAA,EACzB,SAAS,oBAAI,IAA0B;AAAA,EACvC,MAAM;AAAA,EAOd,IAAI,WAA8B;AAChC,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,QAAiB;AACnB,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,MAA6B;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAkC;AAChC,UAAM,MAAM,oBAAI,IAAoB;AACpC,eAAW,CAAC,GAAG,KAAK,KAAK,KAAK,QAAQ;AACpC,YAAM,QAAQ,MAAM,CAAC;AACrB,UAAI,MAAO,KAAI,IAAI,GAAG,MAAM,OAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,SAA+C;AACvD,QAAI,QAAQ,WAAW,EAAG;AAC1B,QAAI,KAAK,QAAQ,EAAG,MAAK,MAAM,QAAQ,CAAC,EAAG,UAAU;AACrD,UAAM,QAAkB,CAAC;AACzB,eAAW,KAAK,SAAS;AACvB,UAAI,EAAE,UAAU,WAAW,KAAK,KAAK;AACnC,cAAM,IAAI;AAAA,UACR,oCAAoC,KAAK,GAAG,SAAS,EAAE,UAAU,MAAM,QAAQ,EAAE,IAAI,IAAI,EAAE,SAAS;AAAA,QACtG;AAAA,MACF;AACA,WAAK,QAAQ,KAAK,CAAC;AACnB,YAAM,OAAO,KAAK,OAAO,IAAI,EAAE,IAAI;AACnC,UAAI,KAAM,MAAK,KAAK,CAAC;AAAA,UAChB,MAAK,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChC,YAAM,KAAK,eAAe,CAAC,CAAC;AAAA,IAC9B;AACA,UAAMD,IAAG,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AACjD,UAAMA,IAAG,WAAWC,MAAK,KAAK,KAAK,UAAU,SAAS,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,GAAM,MAAM;AACxF,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,OAA2C;AACtD,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,UAAM,SAAS,KAAK,QAAQ;AAC5B,SAAK,UAAU,KAAK,QAAQ,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC;AAC3D,eAAW,KAAK,MAAO,MAAK,OAAO,OAAO,CAAC;AAC3C,UAAM,UAAU,SAAS,KAAK,QAAQ;AACtC,QAAI,UAAU,EAAG,OAAM,KAAK,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAqB,OAAO,GAAG,WAAW,GAAgB;AAC/D,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO,CAAC;AACvC,QAAI,MAAM,WAAW,KAAK,OAAO,KAAK,QAAQ,GAAG;AAC/C,YAAM,IAAI,MAAM,aAAa,MAAM,MAAM,qBAAgB,KAAK,GAAG,EAAE;AAAA,IACrE;AACA,UAAM,OAAoB,CAAC;AAC3B,eAAW,SAAS,KAAK,SAAS;AAChC,YAAM,QAAQ,IAAI,OAAO,MAAM,SAAS;AACxC,UAAI,QAAQ,SAAU;AACtB,UAAI,KAAK,SAAS,MAAM;AACtB,aAAK,KAAK,EAAE,OAAO,MAAM,CAAC;AAC1B,YAAI,KAAK,WAAW,KAAM,MAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,MACjE,WAAW,QAAQ,KAAK,CAAC,EAAG,OAAO;AACjC,aAAK,CAAC,IAAI,EAAE,OAAO,MAAM;AACzB,iBAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,cAAI,KAAK,CAAC,EAAG,QAAQ,KAAK,IAAI,CAAC,EAAG,OAAO;AACvC,kBAAM,MAAM,KAAK,CAAC;AAClB,iBAAK,CAAC,IAAI,KAAK,IAAI,CAAC;AACpB,iBAAK,IAAI,CAAC,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EAC9C;AAAA,EAEA,MAAc,QAAuB;AACnC,UAAMD,IAAG,MAAM,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AACjD,UAAM,MAAMC,MAAK,KAAK,KAAK,UAAU,GAAG,SAAS,MAAM;AACvD,UAAM,QAAQA,MAAK,KAAK,KAAK,UAAU,SAAS;AAChD,UAAM,QAAQ,KAAK,QAAQ,IAAI,cAAc,EAAE,KAAK,IAAI;AACxD,UAAMD,IAAG,UAAU,KAAK,MAAM,SAAS,IAAI,GAAG,KAAK;AAAA,IAAO,IAAI,MAAM;AACpE,UAAMA,IAAG,OAAO,KAAK,KAAK;AAC1B,UAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAEA,MAAc,YAA2B;AACvC,UAAM,OAAkB;AAAA,MACtB,SAAS;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAMA,IAAG;AAAA,MACPC,MAAK,KAAK,KAAK,UAAU,SAAS;AAAA,MAClC,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU,CAAC;AAChB,SAAK,OAAO,MAAM;AAClB,SAAK,MAAM;AACX,UAAM,eAAe,KAAK,QAAQ;AAAA,EACpC;AACF;AAEA,eAAsB,UAAU,UAAkB,UAAiD;AACjG,QAAM,QAAQ,IAAI,cAAc,UAAU,QAAQ;AAClD,QAAM,WAAWA,MAAK,KAAK,UAAU,SAAS;AAE9C,QAAM,OAAO,MAAM,cAAc,QAAQ;AAEzC,MAAI,MAAM;AACR,QAAI,KAAK,YAAY,eAAe;AAClC,YAAM,IAAI;AAAA,QACR,wBAAwB,KAAK,OAAO,2BAA2B,aAAa;AAAA,MAC9E;AAAA,IACF;AACA,UAAM,WAAW,qBAAqB,MAAM,QAAQ;AACpD,QAAI,aAAa,MAAM;AACrB,YAAM,IAAI;AAAA,QACR,kCAAkC,KAAK,QAAQ,YAAY,KAAK,KAAK,qCAAqC,SAAS,QAAQ,YAAY,SAAS,KAAK;AAAA,MACvJ;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAMD,IAAG,SAAS,UAAU,MAAM;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACA,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,QAAI,KAAK,WAAW,EAAG;AACvB,QAAI;AACF,YAAM,QAAQ,iBAAiB,IAAI;AACnC,MAAC,MAAqC,MAAM,MAAM,UAAU;AAC5D,MAAC,MAA+C,QAAQ,KAAK,KAAK;AAClE,YAAM,MAAO,MAA2D;AACxE,YAAM,OAAO,IAAI,IAAI,MAAM,IAAI;AAC/B,UAAI,KAAM,MAAK,KAAK,KAAK;AAAA,UACpB,KAAI,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC;AAAA,IAClC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAU,GAA+B;AACvD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,QAAO,EAAE,CAAC,IAAK,EAAE,CAAC;AACrD,QAAM,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI;AAC3C,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,GAAE,CAAC,IAAI,EAAE,CAAC,IAAK;AAClD,SAAO;AACT;AAEA,SAAS,IAAI,GAAiB,GAAyB;AACrD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,MAAK,EAAE,CAAC,IAAK,EAAE,CAAC;AACnD,SAAO;AACT;AAEA,SAAS,eAAe,GAAuB;AAC7C,QAAM,MAAM,OAAO,KAAK,EAAE,UAAU,QAAQ,EAAE,UAAU,YAAY,EAAE,UAAU,UAAU;AAC1F,SAAO,KAAK,UAAU;AAAA,IACpB,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,EAAE;AAAA,IACL,GAAG,IAAI,SAAS,QAAQ;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,iBAAiB,MAA0B;AAClD,QAAM,SAAS,KAAK,MAAM,IAAI;AAQ9B,QAAM,MAAM,OAAO,KAAK,OAAO,GAAG,QAAQ;AAC1C,QAAM,YAAY,IAAI;AAAA,IACpB,IAAI,OAAO,MAAM,IAAI,YAAY,IAAI,aAAa,IAAI,UAAU;AAAA,EAClE;AACA,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,MAAM,OAAO;AAAA,IACb,WAAW,IAAI,aAAa,SAAS;AAAA,EACvC;AACF;AAEA,SAAS,cAAc,MAAqC;AAC1D,SAAO;AAAA,IACL,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,IAC3D,UAAU,KAAK,aAAa,kBAAkB,kBAAkB;AAAA,IAChE,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,IACrD,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;AAAA,IAC/C,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,aAAY,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,EAC3F;AACF;;;AH/QO,IAAM,iBAAiBE,MAAK,KAAK,YAAY,UAAU;AAwC9D,SAAS,eAA4B;AACnC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,IACf,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,WAAW,MAAc,OAAqB,CAAC,GAAyB;AAC5F,QAAM,KAAK,KAAK,IAAI;AACpB,QAAM,WAAWA,MAAK,KAAK,MAAM,cAAc;AAC/C,QAAM,WAAW,4BAA4B,IAAI;AAEjD,OAAK,aAAa,EAAE,OAAO,QAAQ,CAAC;AACpC,iBAAe,KAAK,MAAM;AAC1B,QAAM,uBAAuB,UAAU,KAAK,MAAM;AAClD,iBAAe,KAAK,MAAM;AAE1B,MAAI,KAAK,QAAS,OAAM,eAAe,QAAQ;AAC/C,QAAM,QAAQ,MAAM,UAAU,UAAU;AAAA,IACtC,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,EAClB,CAAC;AAED,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,aAAa,oBAAI,IAAsD;AAC7E,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,QAAM,cAAc,aAAa;AACjC,mBAAiB,SAAS,WAAW,MAAM;AAAA,IACzC,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK,eAAe,mBAAmB;AAAA,IAC/C,QAAQ,CAAC,IAAI,WAAW;AACtB,kBAAY,MAAM;AAAA,IACpB;AAAA,EACF,CAAC,GAAG;AACF,mBAAe,KAAK,MAAM;AAC1B,cAAU,IAAI,MAAM,IAAI;AACxB,QAAI,SAAS,WAAW,IAAI,MAAM,IAAI;AACtC,QAAI,CAAC,QAAQ;AACX;AACA,YAAM,MAAMA,MAAK,KAAK,MAAM,MAAM,IAAI;AACtC,UAAI,UAAU;AACd,UAAI;AACF,cAAM,OAAO,MAAMC,IAAG,KAAK,GAAG;AAC9B,kBAAU,KAAK;AAAA,MACjB,QAAQ;AACN;AAAA,MACF;AACA,YAAM,OAAO,WAAW,IAAI,MAAM,IAAI;AACtC,UAAI,SAAS,UAAa,SAAS,WAAW,CAAC,KAAK,SAAS;AAC3D;AACA;AAAA,MACF;AACA,eAAS,EAAE,QAAQ,CAAC,GAAG,QAAQ;AAC/B,iBAAW,IAAI,MAAM,MAAM,MAAM;AAAA,IACnC;AACA,WAAO,OAAO,KAAK,KAAK;AACxB,SAAK,aAAa,EAAE,OAAO,QAAQ,aAAa,CAAC;AAAA,EACnD;AAEA,iBAAe,KAAK,MAAM;AAC1B,QAAM,eAAyB,CAAC;AAChC,aAAW,WAAW,WAAW,KAAK,GAAG;AACvC,QAAI,CAAC,UAAU,IAAI,OAAO,EAAG,cAAa,KAAK,OAAO;AAAA,EACxD;AACA,QAAM,eAAe,CAAC,GAAG,WAAW,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAC3E,iBAAe,KAAK,MAAM;AAC1B,QAAM,UAAU,MAAM,MAAM,OAAO,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAErE,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,QAAM,eAAe,WAAW;AAChC,MAAI,cAAc;AAClB,aAAW,EAAE,OAAO,KAAK,WAAW,OAAO,EAAG,gBAAe,OAAO;AACpE,MAAI,aAAa;AACjB,aAAW,CAAC,EAAE,MAAM,KAAK,YAAY;AACnC,mBAAe,KAAK,MAAM;AAC1B,QAAI,OAAO,OAAO,WAAW,EAAG;AAChC,UAAM,QAAQ,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAC7C,UAAM,UAAU,MAAM,SAAS,OAAO;AAAA,MACpC,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,YAAY,CAAC,MAAM,UAAU;AAC3B,aAAK,aAAa;AAAA,UAChB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,aAAa;AAAA,QAC3B,CAAC;AACD,YAAI,SAAS,MAAO,eAAc;AAAA,MACpC;AAAA,MACA,SAAS,CAAC,KAAK,QAAQ;AACrB;AACA,cAAM,IAAI,OAAO,OAAO,GAAG;AAC3B,cAAM,QAAQ,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG;AACzE,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,gBAAQ,OAAO,MAAM;AAAA,cAAiB,KAAK,KAAK,GAAG;AAAA,CAAI;AAAA,MACzD;AAAA,IACF,CAAC;AACD,mBAAe,KAAK,MAAM;AAC1B,UAAM,UAAwB,CAAC;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAC7C,YAAM,MAAM,QAAQ,CAAC;AACrB,UAAI,CAAC,IAAK;AACV,YAAM,IAAI,OAAO,OAAO,CAAC;AACzB,UAAI,CAAC,EAAG;AACR,gBAAU,GAAG;AACb,cAAQ,KAAK;AAAA,QACX,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,SAAS,EAAE;AAAA,QACX,MAAM,EAAE;AAAA,QACR,WAAW;AAAA,QACX,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AACA,mBAAe,KAAK,MAAM;AAC1B,QAAI,QAAQ,SAAS,EAAG,OAAM,MAAM,IAAI,OAAO;AAC/C,mBAAe,QAAQ;AAAA,EACzB;AAEA,iBAAe,KAAK,MAAM;AAC1B,OAAK,aAAa;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAeA,eAAsB,cACpB,MACA,OACA,OAAqB,CAAC,GACO;AAC7B,QAAM,WAAWD,MAAK,KAAK,MAAM,cAAc;AAC/C,QAAM,WAAW,4BAA4B,IAAI;AACjD,QAAM,QAAQ,MAAM,UAAU,UAAU;AAAA,IACtC,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,EAClB,CAAC;AACD,MAAI,MAAM,MAAO,QAAO;AACxB,QAAM,OAAO,MAAM,MAAM,OAAO,EAAE,GAAG,UAAU,QAAQ,KAAK,OAAO,CAAC;AACpE,YAAU,IAAI;AACd,SAAO,MAAM,OAAO,MAAM,KAAK,QAAQ,GAAG,KAAK,YAAY,GAAG;AAChE;AAEA,eAAsB,YAAY,MAAgC;AAChE,QAAM,OAAOA,MAAK,KAAK,MAAM,gBAAgB,iBAAiB;AAC9D,MAAI;AACF,UAAMC,IAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBACpB,MACA,OAAuF,CAAC,GACtE;AAClB,QAAM,OAAO,MAAM,cAAcD,MAAK,KAAK,MAAM,cAAc,CAAC;AAChE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,qBAAqB,MAAM,qBAAqB,IAAI,CAAC,MAAM;AACpE;AAEA,SAAS,4BAA4B,MAA6C;AAChF,MAAI,KAAK,aAAa,iBAAiB;AACrC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU,CAAC,KAAK,OAAO;AAChD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK,aAAa,CAAC;AAAA,MAC9B,WAAW,KAAK,aAAa;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,KAAK,WAAW,KAAK,OAAO;AAC9B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,KAAK,WAAW,QAAQ,IAAI,cAAc;AAAA,MACnD,OAAO,KAAK,SAAS,QAAQ,IAAI,uBAAuB;AAAA,MACxD,WAAW,KAAK,aAAa;AAAA,IAC/B;AAAA,EACF;AACA,SAAO,+BAA+B,KAAK,UAAU;AACvD;AAEA,SAAS,qBAAqB,MAIZ;AAChB,MAAI,KAAK,YAAY,KAAK,OAAO;AAC/B,WAAO,EAAE,UAAU,KAAK,UAAU,OAAO,KAAK,MAAM;AAAA,EACtD;AACA,QAAM,WAAW,+BAA+B,KAAK,UAAU;AAC/D,SAAO,EAAE,UAAU,SAAS,UAAU,OAAO,SAAS,MAAM;AAC9D;AAEA,SAAS,4BAA4B,MAA6C;AAChF,SAAO,4BAA4B,IAAI;AACzC;AAEA,eAAe,uBACb,QACA,QACe;AACf,MAAI,OAAO,aAAa,gBAAiB;AACzC,QAAM,QAAQ,MAAM,YAAY,EAAE,SAAS,OAAO,SAAS,OAAO,CAAC;AACnE,MAAI,CAAC,MAAM,IAAI;AACb,UAAM,IAAI;AAAA,MACR,4BAA4B,MAAM,KAAK,8EAA8E,OAAO,KAAK;AAAA,IACnI;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAuC;AAC7D,MAAI,QAAQ,SAAS;AACnB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACF;","names":["fs","path","fs","path","path","fs"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
|
+
import {
|
|
4
|
+
t
|
|
5
|
+
} from "./chunk-5TWQD73O.js";
|
|
6
|
+
|
|
7
|
+
// src/cli/ui/mcp-lifecycle.ts
|
|
8
|
+
var STATE = {
|
|
9
|
+
handshake: { glyph: "\u21BB", label: () => t("mcpLifecycle.handshake") },
|
|
10
|
+
connected: { glyph: "\u2713", label: () => t("mcpLifecycle.connected") },
|
|
11
|
+
failed: { glyph: "\u2716", label: () => t("mcpLifecycle.failed") },
|
|
12
|
+
disabled: { glyph: "\u25CB", label: () => t("mcpLifecycle.disabled") },
|
|
13
|
+
reconnect: { glyph: "\u21BB", label: () => t("mcpLifecycle.reconnect") }
|
|
14
|
+
};
|
|
15
|
+
var NAME_COL = 22;
|
|
16
|
+
var STATE_COL = 15;
|
|
17
|
+
function formatMcpLifecycleEvent(ev) {
|
|
18
|
+
const { glyph, label } = STATE[ev.state];
|
|
19
|
+
const namePart = `MCP \xB7 ${ev.name}`;
|
|
20
|
+
const namePad = " ".repeat(Math.max(1, NAME_COL - namePart.length));
|
|
21
|
+
const stateField = `${glyph} ${label()}`.padEnd(STATE_COL);
|
|
22
|
+
return `\u2318 ${namePart}${namePad}${stateField}${describeDetail(ev)}`;
|
|
23
|
+
}
|
|
24
|
+
function describeDetail(ev) {
|
|
25
|
+
if (ev.state === "handshake") return t("mcpLifecycle.initDetail");
|
|
26
|
+
if (ev.state === "failed") return ev.reason;
|
|
27
|
+
if (ev.state === "disabled") return t("mcpLifecycle.disabledDetail", { name: ev.name });
|
|
28
|
+
if (ev.state === "reconnect") return t("mcpLifecycle.reconnectDetail");
|
|
29
|
+
const parts = [`${ev.tools} tools`];
|
|
30
|
+
if (ev.resources && ev.resources > 0) parts.push(`${ev.resources} resources`);
|
|
31
|
+
if (ev.prompts && ev.prompts > 0) parts.push(`${ev.prompts} prompts`);
|
|
32
|
+
parts.push(`${ev.ms}ms`);
|
|
33
|
+
return parts.join(" \xB7 ");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/cli/ui/mcp-toast.ts
|
|
37
|
+
function formatMcpSlowToast(tst) {
|
|
38
|
+
const seconds = (tst.p95Ms / 1e3).toFixed(1);
|
|
39
|
+
return t("mcpHealth.slowToast", { name: tst.name, seconds, sampleSize: tst.sampleSize });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
formatMcpLifecycleEvent,
|
|
44
|
+
formatMcpSlowToast
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=chunk-RAILYQLN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/ui/mcp-lifecycle.ts","../../src/cli/ui/mcp-toast.ts"],"sourcesContent":["/** Formats one-liner MCP lifecycle events per `docs/design/agent-tui-terminal.html` §37. */\n\nimport { t } from \"../../i18n/index.js\";\n\nexport type McpLifecycleEvent =\n | { state: \"handshake\"; name: string }\n | {\n state: \"connected\";\n name: string;\n tools: number;\n resources?: number;\n prompts?: number;\n ms: number;\n }\n | { state: \"failed\"; name: string; reason: string }\n | { state: \"disabled\"; name: string }\n | { state: \"reconnect\"; name: string };\n\nconst STATE: Record<McpLifecycleEvent[\"state\"], { glyph: string; label: () => string }> = {\n handshake: { glyph: \"↻\", label: () => t(\"mcpLifecycle.handshake\") },\n connected: { glyph: \"✓\", label: () => t(\"mcpLifecycle.connected\") },\n failed: { glyph: \"✖\", label: () => t(\"mcpLifecycle.failed\") },\n disabled: { glyph: \"○\", label: () => t(\"mcpLifecycle.disabled\") },\n reconnect: { glyph: \"↻\", label: () => t(\"mcpLifecycle.reconnect\") },\n};\n\nconst NAME_COL = 22;\nconst STATE_COL = 15;\n\nexport function formatMcpLifecycleEvent(ev: McpLifecycleEvent): string {\n const { glyph, label } = STATE[ev.state];\n const namePart = `MCP · ${ev.name}`;\n const namePad = \" \".repeat(Math.max(1, NAME_COL - namePart.length));\n const stateField = `${glyph} ${label()}`.padEnd(STATE_COL);\n return `⌘ ${namePart}${namePad}${stateField}${describeDetail(ev)}`;\n}\n\nfunction describeDetail(ev: McpLifecycleEvent): string {\n if (ev.state === \"handshake\") return t(\"mcpLifecycle.initDetail\");\n if (ev.state === \"failed\") return ev.reason;\n if (ev.state === \"disabled\") return t(\"mcpLifecycle.disabledDetail\", { name: ev.name });\n if (ev.state === \"reconnect\") return t(\"mcpLifecycle.reconnectDetail\");\n const parts: string[] = [`${ev.tools} tools`];\n if (ev.resources && ev.resources > 0) parts.push(`${ev.resources} resources`);\n if (ev.prompts && ev.prompts > 0) parts.push(`${ev.prompts} prompts`);\n parts.push(`${ev.ms}ms`);\n return parts.join(\" · \");\n}\n","/** One-line warn toast emitted when an MCP server's p95 crosses the slow threshold (design §32). */\n\nimport { t } from \"../../i18n/index.js\";\n\nexport interface McpSlowToast {\n name: string;\n p95Ms: number;\n sampleSize: number;\n}\n\nexport function formatMcpSlowToast(tst: McpSlowToast): string {\n const seconds = (tst.p95Ms / 1000).toFixed(1);\n return t(\"mcpHealth.slowToast\", { name: tst.name, seconds, sampleSize: tst.sampleSize });\n}\n"],"mappings":";;;;;;;AAkBA,IAAM,QAAoF;AAAA,EACxF,WAAW,EAAE,OAAO,UAAK,OAAO,MAAM,EAAE,wBAAwB,EAAE;AAAA,EAClE,WAAW,EAAE,OAAO,UAAK,OAAO,MAAM,EAAE,wBAAwB,EAAE;AAAA,EAClE,QAAQ,EAAE,OAAO,UAAK,OAAO,MAAM,EAAE,qBAAqB,EAAE;AAAA,EAC5D,UAAU,EAAE,OAAO,UAAK,OAAO,MAAM,EAAE,uBAAuB,EAAE;AAAA,EAChE,WAAW,EAAE,OAAO,UAAK,OAAO,MAAM,EAAE,wBAAwB,EAAE;AACpE;AAEA,IAAM,WAAW;AACjB,IAAM,YAAY;AAEX,SAAS,wBAAwB,IAA+B;AACrE,QAAM,EAAE,OAAO,MAAM,IAAI,MAAM,GAAG,KAAK;AACvC,QAAM,WAAW,YAAS,GAAG,IAAI;AACjC,QAAM,UAAU,IAAI,OAAO,KAAK,IAAI,GAAG,WAAW,SAAS,MAAM,CAAC;AAClE,QAAM,aAAa,GAAG,KAAK,IAAI,MAAM,CAAC,GAAG,OAAO,SAAS;AACzD,SAAO,UAAK,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,eAAe,EAAE,CAAC;AAClE;AAEA,SAAS,eAAe,IAA+B;AACrD,MAAI,GAAG,UAAU,YAAa,QAAO,EAAE,yBAAyB;AAChE,MAAI,GAAG,UAAU,SAAU,QAAO,GAAG;AACrC,MAAI,GAAG,UAAU,WAAY,QAAO,EAAE,+BAA+B,EAAE,MAAM,GAAG,KAAK,CAAC;AACtF,MAAI,GAAG,UAAU,YAAa,QAAO,EAAE,8BAA8B;AACrE,QAAM,QAAkB,CAAC,GAAG,GAAG,KAAK,QAAQ;AAC5C,MAAI,GAAG,aAAa,GAAG,YAAY,EAAG,OAAM,KAAK,GAAG,GAAG,SAAS,YAAY;AAC5E,MAAI,GAAG,WAAW,GAAG,UAAU,EAAG,OAAM,KAAK,GAAG,GAAG,OAAO,UAAU;AACpE,QAAM,KAAK,GAAG,GAAG,EAAE,IAAI;AACvB,SAAO,MAAM,KAAK,QAAK;AACzB;;;ACrCO,SAAS,mBAAmB,KAA2B;AAC5D,QAAM,WAAW,IAAI,QAAQ,KAAM,QAAQ,CAAC;AAC5C,SAAO,EAAE,uBAAuB,EAAE,MAAM,IAAI,MAAM,SAAS,YAAY,IAAI,WAAW,CAAC;AACzF;","names":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
|
+
import {
|
|
4
|
+
Text,
|
|
5
|
+
eastAsianWidth,
|
|
6
|
+
require_react,
|
|
7
|
+
stripAnsi,
|
|
8
|
+
use_stdout_default
|
|
9
|
+
} from "./chunk-WREKDFXT.js";
|
|
10
|
+
import {
|
|
11
|
+
__toESM
|
|
12
|
+
} from "./chunk-TUK7OWJA.js";
|
|
13
|
+
|
|
14
|
+
// node_modules/emoji-regex/index.mjs
|
|
15
|
+
var emoji_regex_default = () => {
|
|
16
|
+
return /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E-\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED8\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDD1D\uDEEF]\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE]|\uDEEF\u200D\uD83D\uDC69\uD83C[\uDFFB-\uDFFE])))?))?|\uDD75(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F)?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3C-\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE8A\uDE8E-\uDEC2\uDEC6\uDEC8\uDECD-\uDEDC\uDEDF-\uDEEA\uDEEF]|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC30\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3\uDE70]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|\uDEEF\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// node_modules/string-width/index.js
|
|
20
|
+
var segmenter = new Intl.Segmenter();
|
|
21
|
+
var defaultIgnorableCodePointRegex = new RegExp("^\\p{Default_Ignorable_Code_Point}$", "u");
|
|
22
|
+
function stringWidth(string, options = {}) {
|
|
23
|
+
if (typeof string !== "string" || string.length === 0) {
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
const {
|
|
27
|
+
ambiguousIsNarrow = true,
|
|
28
|
+
countAnsiEscapeCodes = false
|
|
29
|
+
} = options;
|
|
30
|
+
if (!countAnsiEscapeCodes) {
|
|
31
|
+
string = stripAnsi(string);
|
|
32
|
+
}
|
|
33
|
+
if (string.length === 0) {
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
let width = 0;
|
|
37
|
+
const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
|
|
38
|
+
for (const { segment: character } of segmenter.segment(string)) {
|
|
39
|
+
const codePoint = character.codePointAt(0);
|
|
40
|
+
if (codePoint <= 31 || codePoint >= 127 && codePoint <= 159) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (codePoint >= 8203 && codePoint <= 8207 || codePoint === 65279) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (codePoint >= 768 && codePoint <= 879 || codePoint >= 6832 && codePoint <= 6911 || codePoint >= 7616 && codePoint <= 7679 || codePoint >= 8400 && codePoint <= 8447 || codePoint >= 65056 && codePoint <= 65071) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (codePoint >= 55296 && codePoint <= 57343) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (codePoint >= 65024 && codePoint <= 65039) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (defaultIgnorableCodePointRegex.test(character)) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (emoji_regex_default().test(character)) {
|
|
59
|
+
width += 2;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
width += eastAsianWidth(codePoint, eastAsianWidthOptions);
|
|
63
|
+
}
|
|
64
|
+
return width;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// src/cli/ui/primitives.tsx
|
|
68
|
+
var import_react = __toESM(require_react(), 1);
|
|
69
|
+
function ChromeRule() {
|
|
70
|
+
const { stdout } = use_stdout_default();
|
|
71
|
+
const cols = stdout?.columns ?? 80;
|
|
72
|
+
const w = Math.max(20, cols - 2);
|
|
73
|
+
return /* @__PURE__ */ import_react.default.createElement(Text, { dimColor: true }, "\u2500".repeat(w));
|
|
74
|
+
}
|
|
75
|
+
function Bar({
|
|
76
|
+
ratio,
|
|
77
|
+
color,
|
|
78
|
+
cells = 14,
|
|
79
|
+
dim
|
|
80
|
+
}) {
|
|
81
|
+
const filled = Math.max(0, Math.min(cells, Math.round(ratio * cells)));
|
|
82
|
+
return /* @__PURE__ */ import_react.default.createElement(Text, null, /* @__PURE__ */ import_react.default.createElement(Text, { color, dimColor: dim }, "\u25B0".repeat(filled)), /* @__PURE__ */ import_react.default.createElement(Text, { dimColor: true }, "\u25B1".repeat(cells - filled)));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
stringWidth,
|
|
87
|
+
ChromeRule,
|
|
88
|
+
Bar
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=chunk-RR35VQVT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../node_modules/emoji-regex/index.mjs","../../node_modules/string-width/index.js","../../src/cli/ui/primitives.tsx"],"sourcesContent":["export default () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E-\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED8\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDD1D\\uDEEF]\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE]|[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE]|\\uDEEF\\u200D\\uD83D\\uDC69\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE8A\\uDE8E-\\uDEC2\\uDEC6\\uDEC8\\uDECD-\\uDEDC\\uDEDF-\\uDEEA\\uDEEF]|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC30\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3\\uDE70]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF]|\\uDEEF\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n","import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\nimport emojiRegex from 'emoji-regex';\n\nconst segmenter = new Intl.Segmenter();\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n","import { Text, useStdout } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React in value scope for JSX compilation\nimport React from \"react\";\nimport { t } from \"../../i18n/index.js\";\nimport { COLOR } from \"./theme.js\";\n\n/**\n * Faint full-width horizontal rule. Width tracks the terminal columns\n * minus 2 cells so it lines up exactly under content rendered inside\n * a `paddingX={1}` parent — the standard chrome layout. Used by the\n * top chrome bar, the replay StatsPanel, and the bottom ctx footer.\n */\nexport function ChromeRule(): React.ReactElement {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const w = Math.max(20, cols - 2);\n return <Text dimColor>{\"─\".repeat(w)}</Text>;\n}\n\n/** Compact binary-K formatter — `1234 → \"1.2K\"`, `131072 → \"128K\"`. */\nexport function formatTokens(n: number): string {\n if (n < 1024) return String(n);\n const k = n / 1024;\n return k >= 100 ? `${k.toFixed(0)}K` : `${k.toFixed(1)}K`;\n}\n\n/**\n * Filled / empty progress bar. `▰▱` glyphs have distinct shapes so the\n * boundary stays visible even when the terminal collapses to 8-color slots.\n */\nexport function Bar({\n ratio,\n color,\n cells = 14,\n dim,\n}: {\n ratio: number;\n color: string;\n cells?: number;\n dim?: boolean;\n}): React.ReactElement {\n const filled = Math.max(0, Math.min(cells, Math.round(ratio * cells)));\n return (\n <Text>\n <Text color={color} dimColor={dim}>\n {\"▰\".repeat(filled)}\n </Text>\n <Text dimColor>{\"▱\".repeat(cells - filled)}</Text>\n </Text>\n );\n}\n\n/**\n * `▣ ctx ▰▰▱▱… 14K/128K (11%)` — the canonical context-pressure cell.\n * Used by the persistent footer (chat) and StatsPanel (replay). Color\n * thresholds match the `/compact` warning policy in the loop:\n * green <60% · amber 60-80% · red ≥80% (with `· /compact` hint).\n */\nexport function ContextCell({\n ratio,\n promptTokens,\n ctxMax,\n showBar,\n}: {\n ratio: number;\n promptTokens: number;\n ctxMax: number;\n showBar?: boolean;\n}): React.ReactElement {\n if (promptTokens === 0) {\n return (\n <Text>\n <Text color={COLOR.info} dimColor>\n {\"▣ ctx \"}\n </Text>\n <Text dimColor>{`\\u2014 ${t(\"common.noTurns\")}`}</Text>\n </Text>\n );\n }\n const color = ratio >= 0.8 ? COLOR.err : ratio >= 0.6 ? COLOR.warn : COLOR.ok;\n const pct = Math.round(ratio * 100);\n return (\n <Text>\n <Text color={COLOR.info}>{\"▣ ctx \"}</Text>\n <Bar ratio={ratio} color={color} cells={showBar ? 14 : 10} />\n <Text> </Text>\n <Text color={color} bold>\n {formatTokens(promptTokens)}/{formatTokens(ctxMax)}\n </Text>\n <Text dimColor> ({pct}%)</Text>\n {ratio >= 0.8 ? (\n <Text color={COLOR.err} bold>\n {\" · /compact\"}\n </Text>\n ) : null}\n </Text>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAO,sBAAQ,MAAM;AAEpB,SAAO;AACR;;;ACCA,IAAM,YAAY,IAAI,KAAK,UAAU;AAErC,IAAM,iCAAiC,WAAC,uCAAmC,GAAC;AAE7D,SAAR,YAA6B,QAAQ,UAAU,CAAC,GAAG;AACzD,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AACtD,WAAO;AAAA,EACR;AAEA,QAAM;AAAA,IACL,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,EACxB,IAAI;AAEJ,MAAI,CAAC,sBAAsB;AAC1B,aAAS,UAAU,MAAM;AAAA,EAC1B;AAEA,MAAI,OAAO,WAAW,GAAG;AACxB,WAAO;AAAA,EACR;AAEA,MAAI,QAAQ;AACZ,QAAM,wBAAwB,EAAC,iBAAiB,CAAC,kBAAiB;AAElE,aAAW,EAAC,SAAS,UAAS,KAAK,UAAU,QAAQ,MAAM,GAAG;AAC7D,UAAM,YAAY,UAAU,YAAY,CAAC;AAGzC,QAAI,aAAa,MAAS,aAAa,OAAQ,aAAa,KAAO;AAClE;AAAA,IACD;AAGA,QACE,aAAa,QAAW,aAAa,QACnC,cAAc,OAChB;AACD;AAAA,IACD;AAGA,QACE,aAAa,OAAU,aAAa,OACjC,aAAa,QAAW,aAAa,QACrC,aAAa,QAAW,aAAa,QACrC,aAAa,QAAW,aAAa,QACrC,aAAa,SAAW,aAAa,OACxC;AACD;AAAA,IACD;AAGA,QAAI,aAAa,SAAW,aAAa,OAAS;AACjD;AAAA,IACD;AAGA,QAAI,aAAa,SAAW,aAAa,OAAS;AACjD;AAAA,IACD;AAGA,QAAI,+BAA+B,KAAK,SAAS,GAAG;AACnD;AAAA,IACD;AAGA,QAAI,oBAAW,EAAE,KAAK,SAAS,GAAG;AACjC,eAAS;AACT;AAAA,IACD;AAEA,aAAS,eAAe,WAAW,qBAAqB;AAAA,EACzD;AAEA,SAAO;AACR;;;AC/EA,mBAAkB;AAUX,SAAS,aAAiC;AAC/C,QAAM,EAAE,OAAO,IAAI,mBAAU;AAC7B,QAAM,OAAO,QAAQ,WAAW;AAChC,QAAM,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC;AAC/B,SAAO,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,SAAI,OAAO,CAAC,CAAE;AACvC;AAaO,SAAS,IAAI;AAAA,EAClB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACF,GAKuB;AACrB,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,KAAK,CAAC,CAAC;AACrE,SACE,6BAAAC,QAAA,cAAC,YACC,6BAAAA,QAAA,cAAC,QAAK,OAAc,UAAU,OAC3B,SAAI,OAAO,MAAM,CACpB,GACA,6BAAAA,QAAA,cAAC,QAAK,UAAQ,QAAE,SAAI,OAAO,QAAQ,MAAM,CAAE,CAC7C;AAEJ;","names":["React","React"]}
|