pi2dsh 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -19
- package/README.zh.md +44 -19
- package/dist/build-DsGYAgiT.mjs +4416 -0
- package/dist/build-DsGYAgiT.mjs.map +1 -0
- package/dist/cli.mjs +2 -2
- package/dist/compat/pi-ai.d.mts +195 -2435
- package/dist/compat/pi-ai.d.mts.map +1 -1
- package/dist/compat/pi-ai.mjs +3 -4668
- package/dist/compat/pi-coding-agent.d.mts +333 -14
- package/dist/compat/pi-coding-agent.d.mts.map +1 -1
- package/dist/compat/pi-coding-agent.mjs +2 -2
- package/dist/compat/pi-tui.mjs +1 -3620
- package/dist/credentials-oauth.d.mts +27 -0
- package/dist/credentials-oauth.d.mts.map +1 -0
- package/dist/credentials-oauth.mjs +91 -0
- package/dist/credentials-oauth.mjs.map +1 -0
- package/dist/host.mjs +4 -2
- package/dist/host.mjs.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/{mcp-config-jL9w70It.mjs → mcp-config-gqg7GJEE.mjs} +115 -51
- package/dist/mcp-config-gqg7GJEE.mjs.map +1 -0
- package/dist/oauth-bridge-BpPrppjR.mjs +359 -0
- package/dist/oauth-bridge-BpPrppjR.mjs.map +1 -0
- package/dist/pi-ai-CWFlgigJ.mjs +2947 -0
- package/dist/pi-ai-CWFlgigJ.mjs.map +1 -0
- package/dist/pi-coding-agent-Z1hTs61i.mjs +5203 -0
- package/dist/pi-coding-agent-Z1hTs61i.mjs.map +1 -0
- package/dist/pi-tui-5CYLcj-_.mjs +4512 -0
- package/dist/pi-tui-5CYLcj-_.mjs.map +1 -0
- package/dist/pi-types-BLt46jaf.d.mts +2494 -0
- package/dist/pi-types-BLt46jaf.d.mts.map +1 -0
- package/dist/{rolldown-runtime-C2Q2p085.mjs → rolldown-runtime-D-uZhY3_.mjs} +3 -2
- package/dist/{runtime-D84Hv_3m.mjs → runtime-6DefpI6h.mjs} +344 -23
- package/dist/runtime-6DefpI6h.mjs.map +1 -0
- package/dist/runtime.d.mts.map +1 -1
- package/dist/runtime.mjs +1 -1
- package/dist/{source-D7Ir-rPT.mjs → source-0sA5z08z.mjs} +6 -2
- package/dist/source-0sA5z08z.mjs.map +1 -0
- package/package.json +14 -1
- package/dist/compat/pi-ai.mjs.map +0 -1
- package/dist/compat/pi-tui.mjs.map +0 -1
- package/dist/mcp-config-jL9w70It.mjs.map +0 -1
- package/dist/pi-coding-agent-Dsg6_0ua.mjs +0 -2060
- package/dist/pi-coding-agent-Dsg6_0ua.mjs.map +0 -1
- package/dist/pi-tui-utils-CcaVtm-3.mjs +0 -895
- package/dist/pi-tui-utils-CcaVtm-3.mjs.map +0 -1
- package/dist/pi-types-KazmR2O5.d.mts +0 -62
- package/dist/pi-types-KazmR2O5.d.mts.map +0 -1
- package/dist/pi-uuid-Db8ShZsK.mjs +0 -47
- package/dist/pi-uuid-Db8ShZsK.mjs.map +0 -1
- package/dist/runtime-D84Hv_3m.mjs.map +0 -1
- package/dist/source-D7Ir-rPT.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi-tui-utils-CcaVtm-3.mjs","names":[],"sources":["../src/compat/vendor/pi-tui-utils.ts"],"sourcesContent":["// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\n// Vendored from Pi (https://github.com/badlogic/pi-mono), packages/tui/src/utils.ts.\n// Copyright (c) 2025 Mario Zechner. MIT License — see PI-LICENSE in this directory.\n// Kept byte-identical below this header so Pi extensions observe identical\n// terminal-width semantics (ANSI/OSC/APC stripping, grapheme widths, wrapping).\nimport { eastAsianWidth } from \"get-east-asian-width\";\n\n// segmenters (shared instance)\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst wordSegmenter = new Intl.Segmenter(undefined, { granularity: \"word\" });\n\n/**\n * Get the shared grapheme segmenter instance.\n */\nexport function getGraphemeSegmenter(): Intl.Segmenter {\n\treturn graphemeSegmenter;\n}\n\n/**\n * Get the shared word segmenter instance.\n */\nexport function getWordSegmenter(): Intl.Segmenter {\n\treturn wordSegmenter;\n}\n\n/**\n * Check if a grapheme cluster (after segmentation) could possibly be an RGI emoji.\n * This is a fast heuristic to avoid the expensive rgiEmojiRegex test.\n * The tested Unicode blocks are deliberately broad to account for future\n * Unicode additions.\n */\nfunction couldBeEmoji(segment: string): boolean {\n\tconst cp = segment.codePointAt(0)!;\n\treturn (\n\t\t(cp >= 0x1f000 && cp <= 0x1fbff) || // Emoji and Pictograph\n\t\t(cp >= 0x2300 && cp <= 0x23ff) || // Misc technical\n\t\t(cp >= 0x2600 && cp <= 0x27bf) || // Misc symbols, dingbats\n\t\t(cp >= 0x2b50 && cp <= 0x2b55) || // Specific stars/circles\n\t\tsegment.includes(\"\\uFE0F\") || // Contains VS16 (emoji presentation selector)\n\t\tsegment.length > 2 // Multi-codepoint sequences (ZWJ, skin tones, etc.)\n\t);\n}\n\n// Regexes for character classification (same as string-width library)\nconst zeroWidthRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$/v;\nconst leadingNonPrintingRegex = /^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+/v;\nconst nonPrintingCharRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Mark}|\\p{Surrogate})$/v;\nconst markCharRegex = /^\\p{Mark}$/v;\n// Marks that terminals allocate cells for when attached to a base character.\n// This includes Unicode spacing marks and non-spacing exceptions in legacy wcwidth tables.\nconst terminalSpacingMarkRegex =\n\t/^(?:[\\p{Spacing_Mark}--[\\u1734\\u302E\\u302F]]|[\\u065F\\u0F7F\\u102B\\u102C\\u1031\\u1033-\\u1035\\u1038\\u103A-\\u103E])+$/v;\nconst rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\n// Cache for non-ASCII strings\nconst WIDTH_CACHE_SIZE = 512;\nconst widthCache = new Map<string, number>();\n\nexport const cjkBreakRegex =\n\t/[\\p{Script_Extensions=Han}\\p{Script_Extensions=Hiragana}\\p{Script_Extensions=Katakana}\\p{Script_Extensions=Hangul}\\p{Script_Extensions=Bopomofo}]/u;\n\nfunction isPrintableAscii(str: string): boolean {\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst code = str.charCodeAt(i);\n\t\tif (code < 0x20 || code > 0x7e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction truncateFragmentToWidth(text: string, maxWidth: number): { text: string; width: number } {\n\tif (maxWidth <= 0 || text.length === 0) {\n\t\treturn { text: \"\", width: 0 };\n\t}\n\n\tif (isPrintableAscii(text)) {\n\t\tconst clipped = text.slice(0, maxWidth);\n\t\treturn { text: clipped, width: clipped.length };\n\t}\n\n\tconst hasAnsi = text.includes(\"\\x1b\");\n\tconst hasTabs = text.includes(\"\\t\");\n\tif (!hasAnsi && !hasTabs) {\n\t\tlet result = \"\";\n\t\tlet width = 0;\n\t\tfor (const { segment } of graphemeSegmenter.segment(text)) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tif (width + w > maxWidth) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult += segment;\n\t\t\twidth += w;\n\t\t}\n\t\treturn { text: result, width };\n\t}\n\n\tlet result = \"\";\n\tlet width = 0;\n\tlet i = 0;\n\tlet pendingAnsi = \"\";\n\n\twhile (i < text.length) {\n\t\tconst ansi = extractAnsiCode(text, i);\n\t\tif (ansi) {\n\t\t\tpendingAnsi += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (text[i] === \"\\t\") {\n\t\t\tif (width + 3 > maxWidth) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (pendingAnsi) {\n\t\t\t\tresult += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\t\t\tresult += \"\\t\";\n\t\t\twidth += 3;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet end = i;\n\t\twhile (end < text.length && text[end] !== \"\\t\") {\n\t\t\tconst nextAnsi = extractAnsiCode(text, end);\n\t\t\tif (nextAnsi) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tend++;\n\t\t}\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tif (width + w > maxWidth) {\n\t\t\t\treturn { text: result, width };\n\t\t\t}\n\t\t\tif (pendingAnsi) {\n\t\t\t\tresult += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\t\t\tresult += segment;\n\t\t\twidth += w;\n\t\t}\n\t\ti = end;\n\t}\n\n\treturn { text: result, width };\n}\n\nfunction finalizeTruncatedResult(\n\tprefix: string,\n\tprefixWidth: number,\n\tellipsis: string,\n\tellipsisWidth: number,\n\tmaxWidth: number,\n\tpad: boolean,\n): string {\n\tconst reset = \"\\x1b[0m\";\n\tconst hyperlinkClose = getActiveOsc8Close(prefix);\n\tconst visibleWidth = prefixWidth + ellipsisWidth;\n\tlet result: string;\n\n\tif (ellipsis.length > 0) {\n\t\tresult = `${prefix}${hyperlinkClose}${reset}${ellipsis}${reset}`;\n\t} else {\n\t\tresult = `${prefix}${hyperlinkClose}${reset}`;\n\t}\n\n\treturn pad ? result + \" \".repeat(Math.max(0, maxWidth - visibleWidth)) : result;\n}\n\n/**\n * Calculate the terminal width of a single grapheme cluster.\n * Based on code from the string-width library, but includes a possible-emoji\n * check to avoid running the RGI_Emoji regex unnecessarily.\n */\nfunction graphemeWidth(segment: string): number {\n\tif (segment === \"\\t\") {\n\t\treturn 3;\n\t}\n\n\t// Some marks occupy cells even without a base character.\n\tif (terminalSpacingMarkRegex.test(segment)) {\n\t\treturn [...segment].length;\n\t}\n\n\t// Zero-width clusters\n\tif (zeroWidthRegex.test(segment)) {\n\t\treturn 0;\n\t}\n\n\t// Emoji check with pre-filter\n\tif (couldBeEmoji(segment) && rgiEmojiRegex.test(segment)) {\n\t\treturn 2;\n\t}\n\n\t// Get base visible codepoint\n\tconst base = segment.replace(leadingNonPrintingRegex, \"\");\n\tconst cp = base.codePointAt(0);\n\tif (cp === undefined) {\n\t\treturn 0;\n\t}\n\n\t// Regional indicator symbols (U+1F1E6..U+1F1FF) are often rendered as\n\t// full-width emoji in terminals, even when isolated during streaming.\n\t// Keep width conservative (2) to avoid terminal auto-wrap drift artifacts.\n\tif (cp >= 0x1f1e6 && cp <= 0x1f1ff) {\n\t\treturn 2;\n\t}\n\n\tlet width = eastAsianWidth(cp);\n\n\t// Intl.Segmenter can group multiple terminal-spacing code points into one\n\t// grapheme. Count trailing visible code points that terminals may allocate\n\t// cells for: Indic consonants after marks, halfwidth/fullwidth forms, and\n\t// Thai/Lao AM vowels.\n\tlet followsMark = false;\n\tconst chars = [...base];\n\tfor (const char of chars.slice(1)) {\n\t\tif (terminalSpacingMarkRegex.test(char)) {\n\t\t\twidth += 1;\n\t\t\tfollowsMark = false;\n\t\t} else if (markCharRegex.test(char)) {\n\t\t\tfollowsMark = true;\n\t\t} else if (!nonPrintingCharRegex.test(char)) {\n\t\t\tconst c = char.codePointAt(0)!;\n\t\t\tif (followsMark || (c >= 0xff00 && c <= 0xffef)) {\n\t\t\t\t// halfwidth + fullwidth forms\n\t\t\t\twidth += eastAsianWidth(c);\n\t\t\t} else if (c === 0x0e33 || c === 0x0eb3) {\n\t\t\t\twidth += 1;\n\t\t\t}\n\t\t\tfollowsMark = false;\n\t\t}\n\t}\n\n\treturn width;\n}\n\n/**\n * Calculate the visible width of a string in terminal columns.\n */\nexport function visibleWidth(str: string): number {\n\tif (str.length === 0) {\n\t\treturn 0;\n\t}\n\n\t// Fast path: pure ASCII printable\n\tif (isPrintableAscii(str)) {\n\t\treturn str.length;\n\t}\n\n\t// Check cache\n\tconst cached = widthCache.get(str);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\t// Normalize: tabs to 3 spaces, strip ANSI escape codes\n\tlet clean = str;\n\tif (str.includes(\"\\t\")) {\n\t\tclean = clean.replace(/\\t/g, \" \");\n\t}\n\tif (clean.includes(\"\\x1b\")) {\n\t\t// Strip supported ANSI/OSC/APC escape sequences in one pass.\n\t\t// This covers CSI styling/cursor codes, OSC hyperlinks and prompt markers,\n\t\t// and APC sequences like CURSOR_MARKER.\n\t\tlet stripped = \"\";\n\t\tlet i = 0;\n\t\twhile (i < clean.length) {\n\t\t\tconst ansi = extractAnsiCode(clean, i);\n\t\t\tif (ansi) {\n\t\t\t\ti += ansi.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstripped += clean[i];\n\t\t\ti++;\n\t\t}\n\t\tclean = stripped;\n\t}\n\n\t// Calculate width\n\tlet width = 0;\n\tfor (const { segment } of graphemeSegmenter.segment(clean)) {\n\t\twidth += graphemeWidth(segment);\n\t}\n\n\t// Cache result\n\tif (widthCache.size >= WIDTH_CACHE_SIZE) {\n\t\tconst firstKey = widthCache.keys().next().value;\n\t\tif (firstKey !== undefined) {\n\t\t\twidthCache.delete(firstKey);\n\t\t}\n\t}\n\twidthCache.set(str, width);\n\n\treturn width;\n}\n\n/** Remove ANSI, OSC, and APC control sequences while preserving visible text. */\nexport function stripTerminalSequences(str: string): string {\n\tif (!str.includes(\"\\x1b\")) return str;\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < str.length) {\n\t\tconst ansi = extractAnsiCode(str, i);\n\t\tif (ansi) {\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += str[i];\n\t\ti++;\n\t}\n\treturn result;\n}\n\ninterface GraphemeCellRange {\n\tstart: number;\n\tend: number;\n}\n\n/** Return the terminal-cell range occupied by the grapheme at a visible column. */\nexport function getGraphemeCellRange(line: string, column: number): GraphemeCellRange | undefined {\n\tlet currentCol = 0;\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst width = graphemeWidth(segment);\n\t\t\tif (width > 0 && column >= currentCol && column < currentCol + width) {\n\t\t\t\treturn { start: currentCol, end: currentCol + width };\n\t\t\t}\n\t\t\tcurrentCol += width;\n\t\t}\n\t\ti = textEnd;\n\t}\n\treturn undefined;\n}\n\n/** Return the OSC 8 hyperlink covering a visible terminal column. */\nexport function getOsc8LinkAtColumn(line: string, column: number): string | undefined {\n\tlet activeUrl: string | undefined;\n\tlet currentCol = 0;\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\tconst hyperlink = /^\\x1b\\]8;[^;]*;([^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)$/.exec(ansi.code);\n\t\t\tif (hyperlink) activeUrl = hyperlink[1] || undefined;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst width = segment === \"\\t\" ? 3 : graphemeWidth(segment);\n\t\t\tif (column >= currentCol && column < currentCol + width) return activeUrl;\n\t\t\tcurrentCol += width;\n\t\t}\n\t\ti = textEnd;\n\t}\n\treturn undefined;\n}\n\n/**\n * Normalize text for terminal output without changing logical editor content.\n * Some terminals render precomposed Thai/Lao AM vowels inconsistently during\n * differential repaint. Their compatibility decompositions have the same cell\n * width but avoid stale-cell artifacts in terminal renderers. Visible tabs are\n * expanded to the fixed width used by layout so terminal tab stops cannot wrap\n * a logical line, while tabs inside terminal string sequences stay untouched.\n */\nconst THAI_LAO_AM_REGEX = /[\\u0e33\\u0eb3]/;\nconst THAI_LAO_AM_GLOBAL_REGEX = /[\\u0e33\\u0eb3]/g;\n\nexport function normalizeTerminalOutput(str: string): string {\n\tlet normalized = str;\n\tif (THAI_LAO_AM_REGEX.test(normalized)) {\n\t\tnormalized = normalized.replace(THAI_LAO_AM_GLOBAL_REGEX, (char) =>\n\t\t\tchar === \"\\u0e33\" ? \"\\u0e4d\\u0e32\" : \"\\u0ecd\\u0eb2\",\n\t\t);\n\t}\n\tif (!normalized.includes(\"\\t\")) return normalized;\n\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < normalized.length) {\n\t\tconst ansi = extractAnsiCode(normalized, i);\n\t\tif (ansi) {\n\t\t\tresult += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += normalized[i] === \"\\t\" ? \" \" : normalized[i];\n\t\ti++;\n\t}\n\treturn result;\n}\n\n/**\n * Extract ANSI escape sequences from a string at the given position.\n */\nexport function extractAnsiCode(str: string, pos: number): { code: string; length: number } | null {\n\tif (pos >= str.length || str[pos] !== \"\\x1b\") return null;\n\n\tconst next = str[pos + 1];\n\n\t// CSI sequence: ESC [ ... m/G/K/H/J\n\tif (next === \"[\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length && !/[mGKHJ]/.test(str[j]!)) j++;\n\t\tif (j < str.length) return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\treturn null;\n\t}\n\n\t// OSC sequence: ESC ] ... BEL or ESC ] ... ST (ESC \\)\n\t// Used for hyperlinks (OSC 8), window titles, etc.\n\tif (next === \"]\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length) {\n\t\t\tif (str[j] === \"\\x07\") return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\t\tif (str[j] === \"\\x1b\" && str[j + 1] === \"\\\\\") return { code: str.substring(pos, j + 2), length: j + 2 - pos };\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// APC sequence: ESC _ ... BEL or ESC _ ... ST (ESC \\)\n\t// Used for cursor marker and application-specific commands\n\tif (next === \"_\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length) {\n\t\t\tif (str[j] === \"\\x07\") return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\t\tif (str[j] === \"\\x1b\" && str[j + 1] === \"\\\\\") return { code: str.substring(pos, j + 2), length: j + 2 - pos };\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\ntype Osc8Terminator = \"\\x07\" | \"\\x1b\\\\\";\n\ninterface ActiveHyperlink {\n\tparams: string;\n\turl: string;\n\tterminator: Osc8Terminator;\n}\n\nfunction parseOsc8Hyperlink(ansiCode: string): ActiveHyperlink | null | undefined {\n\tif (!ansiCode.startsWith(\"\\x1b]8;\")) {\n\t\treturn undefined;\n\t}\n\n\tconst terminator: Osc8Terminator = ansiCode.endsWith(\"\\x07\") ? \"\\x07\" : \"\\x1b\\\\\";\n\tconst body = ansiCode.slice(4, terminator === \"\\x07\" ? -1 : -2);\n\tconst separatorIndex = body.indexOf(\";\");\n\tif (separatorIndex === -1) {\n\t\treturn undefined;\n\t}\n\n\tconst params = body.slice(0, separatorIndex);\n\tconst url = body.slice(separatorIndex + 1);\n\tif (!url) {\n\t\treturn null;\n\t}\n\treturn { params, url, terminator };\n}\n\nfunction formatOsc8Hyperlink(hyperlink: ActiveHyperlink): string {\n\treturn `\\x1b]8;${hyperlink.params};${hyperlink.url}${hyperlink.terminator}`;\n}\n\nfunction formatOsc8Close(terminator: Osc8Terminator): string {\n\treturn `\\x1b]8;;${terminator}`;\n}\n\nfunction getActiveOsc8Close(prefix: string): string {\n\tif (!prefix.includes(\"\\x1b]8;\")) {\n\t\treturn \"\";\n\t}\n\n\tlet activeHyperlink: ActiveHyperlink | null = null;\n\tlet i = 0;\n\twhile (i < prefix.length) {\n\t\tconst ansi = extractAnsiCode(prefix, i);\n\t\tif (ansi) {\n\t\t\tconst hyperlink = parseOsc8Hyperlink(ansi.code);\n\t\t\tif (hyperlink !== undefined) {\n\t\t\t\tactiveHyperlink = hyperlink;\n\t\t\t}\n\t\t\ti += ansi.length;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\treturn activeHyperlink ? formatOsc8Close(activeHyperlink.terminator) : \"\";\n}\n\n/**\n * Track active ANSI SGR codes to preserve styling across line breaks.\n */\nclass AnsiCodeTracker {\n\t// Track individual attributes separately so we can reset them specifically\n\tprivate bold = false;\n\tprivate dim = false;\n\tprivate italic = false;\n\tprivate underline = false;\n\tprivate blink = false;\n\tprivate inverse = false;\n\tprivate hidden = false;\n\tprivate strikethrough = false;\n\tprivate fgColor: string | null = null; // Stores the full code like \"31\" or \"38;5;240\"\n\tprivate bgColor: string | null = null; // Stores the full code like \"41\" or \"48;5;240\"\n\tprivate activeHyperlink: ActiveHyperlink | null = null;\n\n\tprocess(ansiCode: string): void {\n\t\t// OSC 8 hyperlink: \\x1b]8;;<url>\\x1b\\\\ (open) or \\x1b]8;;\\x1b\\\\ (close).\n\t\t// Preserve the original terminator because some terminals only make BEL-terminated\n\t\t// links clickable. OAuth login URLs use BEL, so reopening wrapped lines with ST\n\t\t// made only the first physical line clickable in those terminals.\n\t\tconst hyperlink = parseOsc8Hyperlink(ansiCode);\n\t\tif (hyperlink !== undefined) {\n\t\t\tthis.activeHyperlink = hyperlink;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!ansiCode.endsWith(\"m\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract the parameters between \\x1b[ and m\n\t\tconst match = ansiCode.match(/\\x1b\\[([\\d;]*)m/);\n\t\tif (!match) return;\n\n\t\tconst params = match[1];\n\t\tif (params === \"\" || params === \"0\") {\n\t\t\t// Full reset\n\t\t\tthis.reset();\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse parameters (can be semicolon-separated)\n\t\tconst parts = params.split(\";\");\n\t\tlet i = 0;\n\t\twhile (i < parts.length) {\n\t\t\tconst code = Number.parseInt(parts[i], 10);\n\n\t\t\t// Handle 256-color and RGB codes which consume multiple parameters\n\t\t\tif (code === 38 || code === 48) {\n\t\t\t\t// 38;5;N (256 color fg) or 38;2;R;G;B (RGB fg)\n\t\t\t\t// 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)\n\t\t\t\tif (parts[i + 1] === \"5\" && parts[i + 2] !== undefined) {\n\t\t\t\t\t// 256 color: 38;5;N or 48;5;N\n\t\t\t\t\tconst colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;\n\t\t\t\t\tif (code === 38) {\n\t\t\t\t\t\tthis.fgColor = colorCode;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.bgColor = colorCode;\n\t\t\t\t\t}\n\t\t\t\t\ti += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (parts[i + 1] === \"2\" && parts[i + 4] !== undefined) {\n\t\t\t\t\t// RGB color: 38;2;R;G;B or 48;2;R;G;B\n\t\t\t\t\tconst colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;\n\t\t\t\t\tif (code === 38) {\n\t\t\t\t\t\tthis.fgColor = colorCode;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.bgColor = colorCode;\n\t\t\t\t\t}\n\t\t\t\t\ti += 5;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Standard SGR codes\n\t\t\tswitch (code) {\n\t\t\t\tcase 0:\n\t\t\t\t\tthis.reset();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tthis.bold = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tthis.dim = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tthis.italic = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tthis.underline = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\tthis.blink = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 7:\n\t\t\t\t\tthis.inverse = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\tthis.hidden = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9:\n\t\t\t\t\tthis.strikethrough = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 21:\n\t\t\t\t\tthis.bold = false;\n\t\t\t\t\tbreak; // Some terminals\n\t\t\t\tcase 22:\n\t\t\t\t\tthis.bold = false;\n\t\t\t\t\tthis.dim = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 23:\n\t\t\t\t\tthis.italic = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 24:\n\t\t\t\t\tthis.underline = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 25:\n\t\t\t\t\tthis.blink = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 27:\n\t\t\t\t\tthis.inverse = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 28:\n\t\t\t\t\tthis.hidden = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 29:\n\t\t\t\t\tthis.strikethrough = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39:\n\t\t\t\t\tthis.fgColor = null;\n\t\t\t\t\tbreak; // Default fg\n\t\t\t\tcase 49:\n\t\t\t\t\tthis.bgColor = null;\n\t\t\t\t\tbreak; // Default bg\n\t\t\t\tdefault:\n\t\t\t\t\t// Standard foreground colors 30-37, 90-97\n\t\t\t\t\tif ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {\n\t\t\t\t\t\tthis.fgColor = String(code);\n\t\t\t\t\t}\n\t\t\t\t\t// Standard background colors 40-47, 100-107\n\t\t\t\t\telse if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {\n\t\t\t\t\t\tthis.bgColor = String(code);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\n\tprivate reset(): void {\n\t\tthis.bold = false;\n\t\tthis.dim = false;\n\t\tthis.italic = false;\n\t\tthis.underline = false;\n\t\tthis.blink = false;\n\t\tthis.inverse = false;\n\t\tthis.hidden = false;\n\t\tthis.strikethrough = false;\n\t\tthis.fgColor = null;\n\t\tthis.bgColor = null;\n\t\t// SGR reset does not affect OSC 8 hyperlink state\n\t}\n\n\t/** Clear all state for reuse. */\n\tclear(): void {\n\t\tthis.reset();\n\t\tthis.activeHyperlink = null;\n\t}\n\n\tgetActiveCodes(): string {\n\t\tconst codes: string[] = [];\n\t\tif (this.bold) codes.push(\"1\");\n\t\tif (this.dim) codes.push(\"2\");\n\t\tif (this.italic) codes.push(\"3\");\n\t\tif (this.underline) codes.push(\"4\");\n\t\tif (this.blink) codes.push(\"5\");\n\t\tif (this.inverse) codes.push(\"7\");\n\t\tif (this.hidden) codes.push(\"8\");\n\t\tif (this.strikethrough) codes.push(\"9\");\n\t\tif (this.fgColor) codes.push(this.fgColor);\n\t\tif (this.bgColor) codes.push(this.bgColor);\n\n\t\tlet result = codes.length > 0 ? `\\x1b[${codes.join(\";\")}m` : \"\";\n\t\tif (this.activeHyperlink) {\n\t\t\tresult += formatOsc8Hyperlink(this.activeHyperlink);\n\t\t}\n\t\treturn result;\n\t}\n\n\thasActiveCodes(): boolean {\n\t\treturn (\n\t\t\tthis.bold ||\n\t\t\tthis.dim ||\n\t\t\tthis.italic ||\n\t\t\tthis.underline ||\n\t\t\tthis.blink ||\n\t\t\tthis.inverse ||\n\t\t\tthis.hidden ||\n\t\t\tthis.strikethrough ||\n\t\t\tthis.fgColor !== null ||\n\t\t\tthis.bgColor !== null ||\n\t\t\tthis.activeHyperlink !== null\n\t\t);\n\t}\n\n\t/**\n\t * Get reset codes for attributes that need to be turned off at line end.\n\t * Underline must be closed to prevent bleeding into padding.\n\t * Active OSC 8 hyperlinks must be closed and re-opened on the next line.\n\t * Returns empty string if no attributes need closing.\n\t */\n\tgetLineEndReset(): string {\n\t\tlet result = \"\";\n\t\tif (this.underline) {\n\t\t\tresult += \"\\x1b[24m\"; // Underline off only\n\t\t}\n\t\tif (this.activeHyperlink) {\n\t\t\tresult += formatOsc8Close(this.activeHyperlink.terminator); // Re-opened at line start via getActiveCodes()\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction updateTrackerFromText(text: string, tracker: AnsiCodeTracker): void {\n\tlet i = 0;\n\twhile (i < text.length) {\n\t\tconst ansiResult = extractAnsiCode(text, i);\n\t\tif (ansiResult) {\n\t\t\ttracker.process(ansiResult.code);\n\t\t\ti += ansiResult.length;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n}\n\n/**\n * Split text into words while keeping ANSI codes attached.\n */\nfunction splitIntoTokensWithAnsi(text: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet pendingAnsi = \"\"; // ANSI codes waiting to be attached to next visible content\n\tlet currentKind: \"space\" | \"word\" | null = null;\n\tlet i = 0;\n\n\tconst flushCurrent = (): void => {\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\t\ttokens.push(current);\n\t\tcurrent = \"\";\n\t\tcurrentKind = null;\n\t};\n\n\twhile (i < text.length) {\n\t\tconst ansiResult = extractAnsiCode(text, i);\n\t\tif (ansiResult) {\n\t\t\t// Hold ANSI codes separately - they'll be attached to the next visible char\n\t\t\tpendingAnsi += ansiResult.code;\n\t\t\ti += ansiResult.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet end = i;\n\t\twhile (end < text.length && !extractAnsiCode(text, end)) {\n\t\t\tend++;\n\t\t}\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\tconst segmentIsSpace = segment === \" \";\n\t\t\tif (!segmentIsSpace && cjkBreakRegex.test(segment)) {\n\t\t\t\tflushCurrent();\n\t\t\t\tconst token = pendingAnsi + segment;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t\ttokens.push(token);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst segmentKind = segmentIsSpace ? \"space\" : \"word\";\n\t\t\tif (current && currentKind !== segmentKind) {\n\t\t\t\tflushCurrent();\n\t\t\t}\n\n\t\t\t// Attach any pending ANSI codes to this visible character\n\t\t\tif (pendingAnsi) {\n\t\t\t\tcurrent += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\n\t\t\tcurrentKind = segmentKind;\n\t\t\tcurrent += segment;\n\t\t}\n\n\t\ti = end;\n\t}\n\n\t// Handle any remaining pending ANSI codes (attach to last token)\n\tif (pendingAnsi) {\n\t\tif (current) {\n\t\t\tcurrent += pendingAnsi;\n\t\t} else if (tokens.length > 0) {\n\t\t\ttokens[tokens.length - 1] += pendingAnsi;\n\t\t} else {\n\t\t\tcurrent = pendingAnsi;\n\t\t}\n\t}\n\n\tif (current) {\n\t\ttokens.push(current);\n\t}\n\n\treturn tokens;\n}\n\n/**\n * Wrap text with ANSI codes preserved.\n *\n * ONLY does word wrapping - NO padding, NO background colors.\n * Returns lines where each line is <= width visible chars.\n * Active ANSI codes are preserved across line breaks.\n *\n * @param text - Text to wrap (may contain ANSI codes and newlines)\n * @param width - Maximum visible width per line\n * @returns Array of wrapped lines (NOT padded to width)\n */\nexport function wrapTextWithAnsi(text: string, width: number): string[] {\n\tif (!text) {\n\t\treturn [\"\"];\n\t}\n\n\t// Handle newlines by processing each line separately\n\t// Track ANSI state across lines so styles carry over after literal newlines\n\tconst inputLines = text.split(/\\r\\n|\\r|\\n/);\n\tconst result: string[] = [];\n\tconst tracker = new AnsiCodeTracker();\n\n\tfor (const inputLine of inputLines) {\n\t\t// Prepend active ANSI codes from previous lines (except for first line)\n\t\tconst prefix = result.length > 0 ? tracker.getActiveCodes() : \"\";\n\t\tconst wrappedLines = wrapSingleLine(prefix + inputLine, width);\n\t\tfor (const wrappedLine of wrappedLines) {\n\t\t\tresult.push(wrappedLine);\n\t\t}\n\t\t// Update tracker with codes from this line for next iteration\n\t\tupdateTrackerFromText(inputLine, tracker);\n\t}\n\n\treturn result.length > 0 ? result : [\"\"];\n}\n\nfunction wrapSingleLine(line: string, width: number): string[] {\n\tif (!line) {\n\t\treturn [\"\"];\n\t}\n\n\tconst visibleLength = visibleWidth(line);\n\tif (visibleLength <= width) {\n\t\treturn [line];\n\t}\n\n\tconst wrapped: string[] = [];\n\tconst tracker = new AnsiCodeTracker();\n\tconst tokens = splitIntoTokensWithAnsi(line);\n\n\tlet currentLine = \"\";\n\tlet currentVisibleLength = 0;\n\n\tfor (const token of tokens) {\n\t\tconst tokenVisibleLength = visibleWidth(token);\n\t\tconst isWhitespace = token.trim() === \"\";\n\n\t\t// Token itself is too long - break it character by character\n\t\tif (tokenVisibleLength > width && !isWhitespace) {\n\t\t\tif (currentLine) {\n\t\t\t\t// Add specific reset for underline only (preserves background)\n\t\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\t\tif (lineEndReset) {\n\t\t\t\t\tcurrentLine += lineEndReset;\n\t\t\t\t}\n\t\t\t\twrapped.push(currentLine);\n\t\t\t\tcurrentLine = \"\";\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t}\n\n\t\t\t// Break long token - breakLongWord handles its own resets\n\t\t\tconst broken = breakLongWord(token, width, tracker);\n\t\t\tfor (let i = 0; i < broken.length - 1; i++) {\n\t\t\t\twrapped.push(broken[i]!);\n\t\t\t}\n\t\t\tcurrentLine = broken[broken.length - 1];\n\t\t\tcurrentVisibleLength = visibleWidth(currentLine);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if adding this token would exceed width\n\t\tconst totalNeeded = currentVisibleLength + tokenVisibleLength;\n\n\t\tif (totalNeeded > width && currentVisibleLength > 0) {\n\t\t\t// Trim trailing whitespace, then add underline reset (not full reset, to preserve background)\n\t\t\tlet lineToWrap = currentLine.trimEnd();\n\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\tif (lineEndReset) {\n\t\t\t\tlineToWrap += lineEndReset;\n\t\t\t}\n\t\t\twrapped.push(lineToWrap);\n\t\t\tif (isWhitespace) {\n\t\t\t\t// Don't start new line with whitespace\n\t\t\t\tcurrentLine = tracker.getActiveCodes();\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t} else {\n\t\t\t\tcurrentLine = tracker.getActiveCodes() + token;\n\t\t\t\tcurrentVisibleLength = tokenVisibleLength;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add to current line\n\t\t\tcurrentLine += token;\n\t\t\tcurrentVisibleLength += tokenVisibleLength;\n\t\t}\n\n\t\tupdateTrackerFromText(token, tracker);\n\t}\n\n\tif (currentLine) {\n\t\t// No reset at end of final line - let caller handle it\n\t\twrapped.push(currentLine);\n\t}\n\n\t// Trailing whitespace can cause lines to exceed the requested width\n\treturn wrapped.length > 0 ? wrapped.map((line) => line.trimEnd()) : [\"\"];\n}\n\nexport const PUNCTUATION_REGEX = /[(){}[\\]<>.,;:'\"!?+\\-=*/\\\\|&%^$#@~`]/;\n\n/**\n * Check if a character is whitespace.\n */\nexport function isWhitespaceChar(char: string): boolean {\n\treturn /\\s/.test(char);\n}\n\n/**\n * Check if a character is punctuation.\n */\nexport function isPunctuationChar(char: string): boolean {\n\treturn PUNCTUATION_REGEX.test(char);\n}\n\nfunction breakLongWord(word: string, width: number, tracker: AnsiCodeTracker): string[] {\n\tconst lines: string[] = [];\n\tlet currentLine = tracker.getActiveCodes();\n\tlet currentWidth = 0;\n\n\t// First, separate ANSI codes from visible content\n\t// We need to handle ANSI codes specially since they're not graphemes\n\tlet i = 0;\n\tconst segments: Array<{ type: \"ansi\" | \"grapheme\"; value: string }> = [];\n\n\twhile (i < word.length) {\n\t\tconst ansiResult = extractAnsiCode(word, i);\n\t\tif (ansiResult) {\n\t\t\tsegments.push({ type: \"ansi\", value: ansiResult.code });\n\t\t\ti += ansiResult.length;\n\t\t} else {\n\t\t\t// Find the next ANSI code or end of string\n\t\t\tlet end = i;\n\t\t\twhile (end < word.length) {\n\t\t\t\tconst nextAnsi = extractAnsiCode(word, end);\n\t\t\t\tif (nextAnsi) break;\n\t\t\t\tend++;\n\t\t\t}\n\t\t\t// Segment this non-ANSI portion into graphemes\n\t\t\tconst textPortion = word.slice(i, end);\n\t\t\tfor (const seg of graphemeSegmenter.segment(textPortion)) {\n\t\t\t\tsegments.push({ type: \"grapheme\", value: seg.segment });\n\t\t\t}\n\t\t\ti = end;\n\t\t}\n\t}\n\n\t// Now process segments\n\tfor (const seg of segments) {\n\t\tif (seg.type === \"ansi\") {\n\t\t\tcurrentLine += seg.value;\n\t\t\ttracker.process(seg.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst grapheme = seg.value;\n\t\t// Skip empty graphemes to avoid issues with string-width calculation\n\t\tif (!grapheme) continue;\n\n\t\tconst graphemeWidth = visibleWidth(grapheme);\n\n\t\tif (currentWidth + graphemeWidth > width) {\n\t\t\t// Add specific reset for underline only (preserves background)\n\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\tif (lineEndReset) {\n\t\t\t\tcurrentLine += lineEndReset;\n\t\t\t}\n\t\t\tlines.push(currentLine);\n\t\t\tcurrentLine = tracker.getActiveCodes();\n\t\t\tcurrentWidth = 0;\n\t\t}\n\n\t\tcurrentLine += grapheme;\n\t\tcurrentWidth += graphemeWidth;\n\t}\n\n\tif (currentLine) {\n\t\t// No reset at end of final segment - caller handles continuation\n\t\tlines.push(currentLine);\n\t}\n\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\n/**\n * Apply background color to a line, padding to full width.\n *\n * @param line - Line of text (may contain ANSI codes)\n * @param width - Total width to pad to\n * @param bgFn - Background color function\n * @returns Line with background applied and padded to width\n */\nexport function applyBackgroundToLine(line: string, width: number, bgFn: (text: string) => string): string {\n\t// Calculate padding needed\n\tconst visibleLen = visibleWidth(line);\n\tconst paddingNeeded = Math.max(0, width - visibleLen);\n\tconst padding = \" \".repeat(paddingNeeded);\n\n\t// Apply background to content + padding\n\tconst withPadding = line + padding;\n\treturn bgFn(withPadding);\n}\n\n/**\n * Truncate text to fit within a maximum visible width, adding ellipsis if needed.\n * Optionally pad with spaces to reach exactly maxWidth.\n * Properly handles ANSI escape codes (they don't count toward width).\n *\n * @param text - Text to truncate (may contain ANSI codes)\n * @param maxWidth - Maximum visible width\n * @param ellipsis - Ellipsis string to append when truncating (default: \"...\")\n * @param pad - If true, pad result with spaces to exactly maxWidth (default: false)\n * @returns Truncated text, optionally padded to exactly maxWidth\n */\nexport function truncateToWidth(\n\ttext: string,\n\tmaxWidth: number,\n\tellipsis: string = \"...\",\n\tpad: boolean = false,\n): string {\n\tif (maxWidth <= 0) {\n\t\treturn \"\";\n\t}\n\n\tif (text.length === 0) {\n\t\treturn pad ? \" \".repeat(maxWidth) : \"\";\n\t}\n\n\tconst ellipsisWidth = visibleWidth(ellipsis);\n\tif (ellipsisWidth >= maxWidth) {\n\t\tconst textWidth = visibleWidth(text);\n\t\tif (textWidth <= maxWidth) {\n\t\t\treturn pad ? text + \" \".repeat(maxWidth - textWidth) : text;\n\t\t}\n\n\t\tconst clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);\n\t\tif (clippedEllipsis.width === 0) {\n\t\t\treturn pad ? \" \".repeat(maxWidth) : \"\";\n\t\t}\n\t\treturn finalizeTruncatedResult(\"\", 0, clippedEllipsis.text, clippedEllipsis.width, maxWidth, pad);\n\t}\n\n\tif (isPrintableAscii(text)) {\n\t\tif (text.length <= maxWidth) {\n\t\t\treturn pad ? text + \" \".repeat(maxWidth - text.length) : text;\n\t\t}\n\t\tconst targetWidth = maxWidth - ellipsisWidth;\n\t\treturn finalizeTruncatedResult(text.slice(0, targetWidth), targetWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n\t}\n\n\tconst targetWidth = maxWidth - ellipsisWidth;\n\tlet result = \"\";\n\tlet pendingAnsi = \"\";\n\tlet visibleSoFar = 0;\n\tlet keptWidth = 0;\n\tlet keepContiguousPrefix = true;\n\tlet overflowed = false;\n\tlet exhaustedInput = false;\n\tconst hasAnsi = text.includes(\"\\x1b\");\n\tconst hasTabs = text.includes(\"\\t\");\n\n\tif (!hasAnsi && !hasTabs) {\n\t\tfor (const { segment } of graphemeSegmenter.segment(text)) {\n\t\t\tconst width = graphemeWidth(segment);\n\t\t\tif (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n\t\t\t\tresult += segment;\n\t\t\t\tkeptWidth += width;\n\t\t\t} else {\n\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t}\n\t\t\tvisibleSoFar += width;\n\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\toverflowed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\texhaustedInput = !overflowed;\n\t} else {\n\t\tlet i = 0;\n\t\twhile (i < text.length) {\n\t\t\tconst ansi = extractAnsiCode(text, i);\n\t\t\tif (ansi) {\n\t\t\t\tpendingAnsi += ansi.code;\n\t\t\t\ti += ansi.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (text[i] === \"\\t\") {\n\t\t\t\tif (keepContiguousPrefix && keptWidth + 3 <= targetWidth) {\n\t\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tresult += \"\\t\";\n\t\t\t\t\tkeptWidth += 3;\n\t\t\t\t} else {\n\t\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\t\t\t\tvisibleSoFar += 3;\n\t\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\t\toverflowed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet end = i;\n\t\t\twhile (end < text.length && text[end] !== \"\\t\") {\n\t\t\t\tconst nextAnsi = extractAnsiCode(text, end);\n\t\t\t\tif (nextAnsi) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tend++;\n\t\t\t}\n\n\t\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\t\tconst width = graphemeWidth(segment);\n\t\t\t\tif (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n\t\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tresult += segment;\n\t\t\t\t\tkeptWidth += width;\n\t\t\t\t} else {\n\t\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\n\t\t\t\tvisibleSoFar += width;\n\t\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\t\toverflowed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (overflowed) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti = end;\n\t\t}\n\t\texhaustedInput = i >= text.length;\n\t}\n\n\tif (!overflowed && exhaustedInput) {\n\t\treturn pad ? text + \" \".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;\n\t}\n\n\treturn finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n}\n\n/**\n * Extract a range of visible columns from a line. Handles ANSI codes and wide chars.\n * @param strict - If true, exclude wide chars at boundary that would extend past the range\n */\nexport function sliceByColumn(line: string, startCol: number, length: number, strict = false): string {\n\treturn sliceWithWidth(line, startCol, length, strict).text;\n}\n\n/** Like sliceByColumn but also returns the actual visible width of the result. */\nexport function sliceWithWidth(\n\tline: string,\n\tstartCol: number,\n\tlength: number,\n\tstrict = false,\n): { text: string; width: number } {\n\tif (length <= 0) return { text: \"\", width: 0 };\n\tconst endCol = startCol + length;\n\tlet result = \"\",\n\t\tresultWidth = 0,\n\t\tcurrentCol = 0,\n\t\ti = 0,\n\t\tpendingAnsi = \"\";\n\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\tif (currentCol >= startCol && currentCol < endCol) result += ansi.code;\n\t\t\telse if (currentCol < startCol) pendingAnsi += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tconst inRange = currentCol >= startCol && currentCol < endCol;\n\t\t\tconst fits = !strict || currentCol + w <= endCol;\n\t\t\tif (inRange && fits) {\n\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\t\t\t\tresult += segment;\n\t\t\t\tresultWidth += w;\n\t\t\t}\n\t\t\tcurrentCol += w;\n\t\t\tif (currentCol >= endCol) break;\n\t\t}\n\t\ti = textEnd;\n\t\tif (currentCol >= endCol) break;\n\t}\n\treturn { text: result, width: resultWidth };\n}\n\n// Pooled tracker instance for extractSegments (avoids allocation per call)\nconst pooledStyleTracker = new AnsiCodeTracker();\n\n/**\n * Extract \"before\" and \"after\" segments from a line in a single pass.\n * Used for overlay compositing where we need content before and after the overlay region.\n * Preserves styling from before the overlay that should affect content after it.\n */\nexport function extractSegments(\n\tline: string,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterLen: number,\n\tstrictAfter = false,\n): { before: string; beforeWidth: number; after: string; afterWidth: number } {\n\tlet before = \"\",\n\t\tbeforeWidth = 0,\n\t\tafter = \"\",\n\t\tafterWidth = 0;\n\tlet currentCol = 0,\n\t\ti = 0;\n\tlet pendingAnsiBefore = \"\";\n\tlet afterStarted = false;\n\tconst afterEnd = afterStart + afterLen;\n\n\t// Track styling state so \"after\" inherits styling from before the overlay\n\tpooledStyleTracker.clear();\n\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\t// Track all SGR codes to know styling state at afterStart\n\t\t\tpooledStyleTracker.process(ansi.code);\n\t\t\t// Include ANSI codes in their respective segments\n\t\t\tif (currentCol < beforeEnd) {\n\t\t\t\tpendingAnsiBefore += ansi.code;\n\t\t\t} else if (currentCol >= afterStart && currentCol < afterEnd && afterStarted) {\n\t\t\t\t// Only include after we've started \"after\" (styling already prepended)\n\t\t\t\tafter += ansi.code;\n\t\t\t}\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst w = graphemeWidth(segment);\n\n\t\t\tif (currentCol < beforeEnd && currentCol + w <= beforeEnd) {\n\t\t\t\tif (pendingAnsiBefore) {\n\t\t\t\t\tbefore += pendingAnsiBefore;\n\t\t\t\t\tpendingAnsiBefore = \"\";\n\t\t\t\t}\n\t\t\t\tbefore += segment;\n\t\t\t\tbeforeWidth += w;\n\t\t\t} else if (currentCol >= afterStart && currentCol < afterEnd) {\n\t\t\t\tconst fits = !strictAfter || currentCol + w <= afterEnd;\n\t\t\t\tif (fits) {\n\t\t\t\t\t// On first \"after\" grapheme, prepend inherited styling from before overlay\n\t\t\t\t\tif (!afterStarted) {\n\t\t\t\t\t\tafter += pooledStyleTracker.getActiveCodes();\n\t\t\t\t\t\tafterStarted = true;\n\t\t\t\t\t}\n\t\t\t\t\tafter += segment;\n\t\t\t\t\tafterWidth += w;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrentCol += w;\n\t\t\t// Early exit: done with \"before\" only, or done with both segments\n\t\t\tif (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n\t\t}\n\t\ti = textEnd;\n\t\tif (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n\t}\n\n\treturn { before, beforeWidth, after, afterWidth };\n}\n"],"mappings":"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"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/compat/vendor/pi-types.d.ts
|
|
3
|
-
interface TextContent {
|
|
4
|
-
type: 'text';
|
|
5
|
-
text: string;
|
|
6
|
-
[key: string]: unknown;
|
|
7
|
-
}
|
|
8
|
-
interface ImageContent {
|
|
9
|
-
type: 'image';
|
|
10
|
-
data: string;
|
|
11
|
-
mimeType: string;
|
|
12
|
-
[key: string]: unknown;
|
|
13
|
-
}
|
|
14
|
-
interface ThinkingContent {
|
|
15
|
-
type: 'thinking';
|
|
16
|
-
thinking: string;
|
|
17
|
-
[key: string]: unknown;
|
|
18
|
-
}
|
|
19
|
-
interface ToolCallContent {
|
|
20
|
-
type: 'toolCall';
|
|
21
|
-
id: string;
|
|
22
|
-
name: string;
|
|
23
|
-
arguments: unknown;
|
|
24
|
-
[key: string]: unknown;
|
|
25
|
-
}
|
|
26
|
-
interface Usage {
|
|
27
|
-
input?: number;
|
|
28
|
-
output?: number;
|
|
29
|
-
cacheRead?: number;
|
|
30
|
-
cacheWrite?: number;
|
|
31
|
-
[key: string]: unknown;
|
|
32
|
-
}
|
|
33
|
-
interface UserMessage {
|
|
34
|
-
role: 'user';
|
|
35
|
-
content: string | (TextContent | ImageContent)[];
|
|
36
|
-
timestamp?: number;
|
|
37
|
-
[key: string]: unknown;
|
|
38
|
-
}
|
|
39
|
-
interface AssistantMessage {
|
|
40
|
-
role: 'assistant';
|
|
41
|
-
content: (TextContent | ThinkingContent | ToolCallContent)[];
|
|
42
|
-
usage?: Usage;
|
|
43
|
-
timestamp?: number;
|
|
44
|
-
[key: string]: unknown;
|
|
45
|
-
}
|
|
46
|
-
interface ToolResultMessage {
|
|
47
|
-
role: 'toolResult';
|
|
48
|
-
toolCallId?: string;
|
|
49
|
-
content: (TextContent | ImageContent)[];
|
|
50
|
-
isError?: boolean;
|
|
51
|
-
timestamp?: number;
|
|
52
|
-
[key: string]: unknown;
|
|
53
|
-
}
|
|
54
|
-
type Message = UserMessage | AssistantMessage | ToolResultMessage;
|
|
55
|
-
type AgentMessage = Message | {
|
|
56
|
-
role: string;
|
|
57
|
-
timestamp?: number;
|
|
58
|
-
[key: string]: unknown;
|
|
59
|
-
};
|
|
60
|
-
//#endregion
|
|
61
|
-
export { TextContent as a, ToolResultMessage as c, Message as i, Usage as l, AssistantMessage as n, ThinkingContent as o, ImageContent as r, ToolCallContent as s, AgentMessage as t, UserMessage as u };
|
|
62
|
-
//# sourceMappingURL=pi-types-KazmR2O5.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi-types-KazmR2O5.d.mts","names":[],"sources":["../src/compat/vendor/pi-types.ts"],"mappings":";;UAMiB;EACf;EACA;GACC;;UAGc;EACf;EACA;EACA;GACC;;UAGc;EACf;EACA;GACC;;UAGc;EACf;EACA;EACA;EACA;GACC;;UAGc;EACf;EACA;EACA;EACA;GACC;;UAGc;EACf;EACA,mBAAmB,cAAc;EACjC;GACC;;UAGc;EACf;EACA,UAAU,cAAc,kBAAkB;EAC1C,QAAQ;EACR;GACC;;UAGc;EACf;EACA;EACA,UAAU,cAAc;EACxB;EACA;GACC;;KAGS,UAAU,cAAc,mBAAmB;KAM3C,eAAe;EAAY;EAAc;GAAqB"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/compat/vendor/pi-uuid.ts
|
|
3
|
-
let lastTimestamp = -Infinity;
|
|
4
|
-
let sequence = 0;
|
|
5
|
-
function fillRandomBytes(bytes) {
|
|
6
|
-
if (globalThis.crypto?.getRandomValues) {
|
|
7
|
-
globalThis.crypto.getRandomValues(bytes);
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);
|
|
11
|
-
}
|
|
12
|
-
/** Generate a time-ordered UUIDv7. */
|
|
13
|
-
function uuidv7() {
|
|
14
|
-
const random = /* @__PURE__ */ new Uint8Array(16);
|
|
15
|
-
fillRandomBytes(random);
|
|
16
|
-
const timestamp = Date.now();
|
|
17
|
-
if (timestamp > lastTimestamp) {
|
|
18
|
-
sequence = random[6] * 16777216 + random[7] * 65536 + random[8] * 256 + random[9];
|
|
19
|
-
lastTimestamp = timestamp;
|
|
20
|
-
} else {
|
|
21
|
-
sequence = sequence + 1 >>> 0;
|
|
22
|
-
if (sequence === 0) lastTimestamp++;
|
|
23
|
-
}
|
|
24
|
-
const bytes = /* @__PURE__ */ new Uint8Array(16);
|
|
25
|
-
bytes[0] = lastTimestamp / 1099511627776 & 255;
|
|
26
|
-
bytes[1] = lastTimestamp / 4294967296 & 255;
|
|
27
|
-
bytes[2] = lastTimestamp / 16777216 & 255;
|
|
28
|
-
bytes[3] = lastTimestamp / 65536 & 255;
|
|
29
|
-
bytes[4] = lastTimestamp / 256 & 255;
|
|
30
|
-
bytes[5] = lastTimestamp & 255;
|
|
31
|
-
bytes[6] = 112 | sequence >>> 28 & 15;
|
|
32
|
-
bytes[7] = sequence >>> 20 & 255;
|
|
33
|
-
bytes[8] = 128 | sequence >>> 14 & 63;
|
|
34
|
-
bytes[9] = sequence >>> 6 & 255;
|
|
35
|
-
bytes[10] = (sequence & 63) << 2 | random[10] & 3;
|
|
36
|
-
bytes[11] = random[11];
|
|
37
|
-
bytes[12] = random[12];
|
|
38
|
-
bytes[13] = random[13];
|
|
39
|
-
bytes[14] = random[14];
|
|
40
|
-
bytes[15] = random[15];
|
|
41
|
-
const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0"));
|
|
42
|
-
return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10, 16).join("")}`;
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
export { uuidv7 as t };
|
|
46
|
-
|
|
47
|
-
//# sourceMappingURL=pi-uuid-Db8ShZsK.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pi-uuid-Db8ShZsK.mjs","names":[],"sources":["../src/compat/vendor/pi-uuid.ts"],"sourcesContent":["// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nlet lastTimestamp = -Infinity;\nlet sequence = 0;\n\nfunction fillRandomBytes(bytes: Uint8Array<ArrayBuffer>): void {\n\tif (globalThis.crypto?.getRandomValues) {\n\t\tglobalThis.crypto.getRandomValues(bytes);\n\t\treturn;\n\t}\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbytes[i] = Math.floor(Math.random() * 256);\n\t}\n}\n\n/** Generate a time-ordered UUIDv7. */\nexport function uuidv7(): string {\n\tconst random = new Uint8Array(16);\n\tfillRandomBytes(random);\n\tconst timestamp = Date.now();\n\n\tif (timestamp > lastTimestamp) {\n\t\tsequence = random[6] * 0x1000000 + random[7] * 0x10000 + random[8] * 0x100 + random[9];\n\t\tlastTimestamp = timestamp;\n\t} else {\n\t\tsequence = (sequence + 1) >>> 0;\n\t\tif (sequence === 0) lastTimestamp++;\n\t}\n\n\tconst bytes = new Uint8Array(16);\n\tbytes[0] = (lastTimestamp / 0x10000000000) & 0xff;\n\tbytes[1] = (lastTimestamp / 0x100000000) & 0xff;\n\tbytes[2] = (lastTimestamp / 0x1000000) & 0xff;\n\tbytes[3] = (lastTimestamp / 0x10000) & 0xff;\n\tbytes[4] = (lastTimestamp / 0x100) & 0xff;\n\tbytes[5] = lastTimestamp & 0xff;\n\tbytes[6] = 0x70 | ((sequence >>> 28) & 0x0f);\n\tbytes[7] = (sequence >>> 20) & 0xff;\n\tbytes[8] = 0x80 | ((sequence >>> 14) & 0x3f);\n\tbytes[9] = (sequence >>> 6) & 0xff;\n\tbytes[10] = ((sequence & 0x3f) << 2) | (random[10] & 0x03);\n\tbytes[11] = random[11];\n\tbytes[12] = random[12];\n\tbytes[13] = random[13];\n\tbytes[14] = random[14];\n\tbytes[15] = random[15];\n\n\tconst hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n\treturn `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n"],"mappings":";;AACA,IAAI,gBAAgB;AACpB,IAAI,WAAW;AAEf,SAAS,gBAAgB,OAAsC;CAC9D,IAAI,WAAW,QAAQ,iBAAiB;EACvC,WAAW,OAAO,gBAAgB,KAAK;EACvC;CACD;CACA,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KACjC,MAAM,KAAK,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG;AAE3C;;AAGA,SAAgB,SAAiB;CAChC,MAAM,yBAAS,IAAI,WAAW,EAAE;CAChC,gBAAgB,MAAM;CACtB,MAAM,YAAY,KAAK,IAAI;CAE3B,IAAI,YAAY,eAAe;EAC9B,WAAW,OAAO,KAAK,WAAY,OAAO,KAAK,QAAU,OAAO,KAAK,MAAQ,OAAO;EACpF,gBAAgB;CACjB,OAAO;EACN,WAAY,WAAW,MAAO;EAC9B,IAAI,aAAa,GAAG;CACrB;CAEA,MAAM,wBAAQ,IAAI,WAAW,EAAE;CAC/B,MAAM,KAAM,gBAAgB,gBAAiB;CAC7C,MAAM,KAAM,gBAAgB,aAAe;CAC3C,MAAM,KAAM,gBAAgB,WAAa;CACzC,MAAM,KAAM,gBAAgB,QAAW;CACvC,MAAM,KAAM,gBAAgB,MAAS;CACrC,MAAM,KAAK,gBAAgB;CAC3B,MAAM,KAAK,MAAS,aAAa,KAAM;CACvC,MAAM,KAAM,aAAa,KAAM;CAC/B,MAAM,KAAK,MAAS,aAAa,KAAM;CACvC,MAAM,KAAM,aAAa,IAAK;CAC9B,MAAM,OAAQ,WAAW,OAAS,IAAM,OAAO,MAAM;CACrD,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CACnB,MAAM,MAAM,OAAO;CAEnB,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC;CAC1E,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE;AACrJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-D84Hv_3m.mjs","names":["dshToPiContent"],"sources":["../src/session-bridge.ts","../src/runtime.ts"],"sourcesContent":["// Pi session semantics over a DSH durable session.\n//\n// DSH's append-only event log is authoritative for messages; Pi-only state\n// (custom entries, labels, a session name fallback) persists in a pi2dsh\n// sidecar JSONL next to DSH's home. The sidecar exists because DSH currently\n// has no channel for out-of-repo plugin events: `Session.append()` cannot set\n// the envelope's `ignorable: true`, so an unknown event type appended to the\n// main log would make other builds refuse to reload the whole session. Until\n// DSH grows that registration surface, the sidecar keeps Pi entries durable\n// and replayable without touching main-log compatibility.\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport { getAgentDir } from './compat/vendor/pi-config-shim.js'\n\ntype UnknownRecord = Record<string, unknown>\n\ninterface DshSessionLike {\n id: string\n events: readonly UnknownRecord[] | (() => readonly UnknownRecord[])\n append?(type: string, data: unknown, opts?: unknown): unknown\n header?: UnknownRecord\n}\n\ninterface SidecarRecord {\n kind: 'custom' | 'label' | 'name'\n id: string\n timestamp: string\n customType?: string\n data?: unknown\n targetId?: string\n label?: string\n name?: string\n}\n\nexport interface PiProjectedEntry {\n type: string\n id: string\n parentId: string | null\n timestamp: string\n [key: string]: unknown\n}\n\nfunction sidecarDir(): string {\n return join(getAgentDir(), 'session-entries')\n}\n\nfunction sessionEvents(session: DshSessionLike): readonly UnknownRecord[] {\n const events = session.events\n return typeof events === 'function' ? events.call(session) : events ?? []\n}\n\nfunction dshToPiContent(content: unknown): unknown[] {\n if (!Array.isArray(content)) return [{ type: 'text', text: String(content ?? '') }]\n return content.map(block => {\n if (typeof block !== 'object' || block === null) return { type: 'text', text: String(block) }\n const record = block as UnknownRecord\n if (record.type === 'text') return { type: 'text', text: String(record.text ?? '') }\n if (record.type === 'reasoning') return { type: 'thinking', thinking: String(record.text ?? '') }\n if (record.type === 'tool-call') {\n return { type: 'toolCall', id: record.id, name: record.name, arguments: record.arguments }\n }\n return { type: record.type }\n })\n}\n\nexport class PiSessionBridge {\n private readonly records = new Map<string, SidecarRecord[]>()\n private readonly loaded = new Set<string>()\n\n private sidecarPath(sessionId: string): string {\n const safe = sessionId.replace(/[^a-zA-Z0-9._-]+/gu, '_')\n return join(sidecarDir(), `${safe}.jsonl`)\n }\n\n load(sessionId: string): void {\n if (this.loaded.has(sessionId)) return\n this.loaded.add(sessionId)\n const path = this.sidecarPath(sessionId)\n if (!existsSync(path)) {\n this.records.set(sessionId, this.records.get(sessionId) ?? [])\n return\n }\n const parsed: SidecarRecord[] = []\n for (const line of readFileSync(path, 'utf8').split('\\n')) {\n if (line.trim().length === 0) continue\n try {\n parsed.push(JSON.parse(line) as SidecarRecord)\n } catch {\n // A torn tail line from a crashed process is dropped, like DSH's own\n // never-finished trailing fragments.\n }\n }\n this.records.set(sessionId, parsed)\n }\n\n private persist(sessionId: string, record: SidecarRecord): void {\n this.load(sessionId)\n const list = this.records.get(sessionId) ?? []\n list.push(record)\n this.records.set(sessionId, list)\n mkdirSync(sidecarDir(), { recursive: true })\n appendFileSync(this.sidecarPath(sessionId), `${JSON.stringify(record)}\\n`)\n }\n\n appendCustomEntry(sessionId: string, customType: string, data: unknown): string {\n const id = randomUUID()\n this.persist(sessionId, {\n kind: 'custom', id, timestamp: new Date().toISOString(), customType,\n ...(data === undefined ? {} : { data }),\n })\n return id\n }\n\n appendLabel(sessionId: string, targetId: string, label: string | undefined): void {\n this.persist(sessionId, {\n kind: 'label', id: randomUUID(), timestamp: new Date().toISOString(), targetId,\n ...(label === undefined ? {} : { label }),\n })\n }\n\n setName(sessionId: string, name: string): void {\n const sanitized = name.replace(/[\\r\\n]+/gu, ' ').trim()\n this.persist(sessionId, { kind: 'name', id: randomUUID(), timestamp: new Date().toISOString(), name: sanitized })\n }\n\n getName(sessionId: string): string | undefined {\n this.load(sessionId)\n const list = this.records.get(sessionId) ?? []\n for (let i = list.length - 1; i >= 0; i -= 1) {\n if (list[i]!.kind === 'name') return list[i]!.name\n }\n return undefined\n }\n\n labels(sessionId: string): Map<string, string> {\n this.load(sessionId)\n const labels = new Map<string, string>()\n for (const record of this.records.get(sessionId) ?? []) {\n if (record.kind !== 'label' || record.targetId === undefined) continue\n if (record.label === undefined) labels.delete(record.targetId)\n else labels.set(record.targetId, record.label)\n }\n return labels\n }\n\n /**\n * Project the DSH durable log plus sidecar records into Pi's entry-chain\n * shape. DSH history is linear, so the projection is a single-branch tree:\n * every entry's parent is its predecessor.\n */\n projectEntries(session: DshSessionLike): PiProjectedEntry[] {\n this.load(session.id)\n const merged: Array<{ time: number; entry: Omit<PiProjectedEntry, 'parentId'> }> = []\n for (const event of sessionEvents(session)) {\n const seq = Number(event.seq ?? 0)\n const time = Number(event.time ?? 0)\n const data = (event.data ?? {}) as UnknownRecord\n const type = event.type\n if (type === 'user/message') {\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: { role: 'user', content: dshToPiContent(data.content) },\n },\n })\n } else if (type === 'assistant/message') {\n const message = (data.message ?? {}) as UnknownRecord\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: { role: 'assistant', content: dshToPiContent(message.content) },\n },\n })\n } else if (type === 'tool/result') {\n const message = (data.message ?? {}) as UnknownRecord\n const blocks = Array.isArray(message.content) ? message.content as UnknownRecord[] : []\n const tool = blocks.find(block => block.type === 'tool-result')\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: {\n role: 'toolResult',\n toolCallId: tool?.toolCallId,\n content: dshToPiContent(tool?.content ?? []),\n isError: tool?.isError === true,\n },\n },\n })\n }\n }\n for (const record of this.records.get(session.id) ?? []) {\n const time = Date.parse(record.timestamp)\n if (record.kind === 'custom') {\n merged.push({\n time,\n entry: {\n type: 'custom', id: record.id, timestamp: record.timestamp,\n customType: record.customType,\n ...(record.data === undefined ? {} : { data: record.data }),\n },\n })\n } else if (record.kind === 'label') {\n merged.push({\n time,\n entry: {\n type: 'label', id: record.id, timestamp: record.timestamp,\n targetId: record.targetId, label: record.label,\n },\n })\n } else {\n merged.push({\n time,\n entry: { type: 'session_info', id: record.id, timestamp: record.timestamp, name: record.name },\n })\n }\n }\n merged.sort((left, right) => left.time - right.time)\n const entries: PiProjectedEntry[] = []\n let parentId: string | null = null\n for (const item of merged) {\n const entry = { ...item.entry, parentId } as PiProjectedEntry\n entries.push(entry)\n parentId = entry.id\n }\n return entries\n }\n\n /** The exact 14-method surface Pi exposes as ctx.sessionManager. */\n readonlySessionManager(session: DshSessionLike, cwd: string): UnknownRecord {\n const entriesOf = (): PiProjectedEntry[] => this.projectEntries(session)\n const leafOf = (): PiProjectedEntry | undefined => entriesOf().at(-1)\n return {\n getCwd: () => cwd,\n getSessionDir: () => sidecarDir(),\n getSessionId: () => session.id,\n getSessionFile: () => this.sidecarPath(session.id),\n getLeafId: () => leafOf()?.id ?? null,\n getLeafEntry: () => leafOf(),\n getEntry: (id: string) => entriesOf().find(entry => entry.id === id),\n getLabel: (id: string) => this.labels(session.id).get(id),\n getBranch: (fromId?: string) => {\n const entries = entriesOf()\n if (fromId === undefined) return entries\n const index = entries.findIndex(entry => entry.id === fromId)\n return index === -1 ? [] : entries.slice(0, index + 1)\n },\n // Pi context rules: message/compaction/branch_summary/custom_message\n // enter the LLM context; custom entries and labels are state-only.\n buildContextEntries: () => entriesOf().filter(entry =>\n entry.type === 'message' || entry.type === 'compaction' || entry.type === 'branch_summary' || entry.type === 'custom_message'),\n getHeader: () => ({\n type: 'session',\n version: 3,\n id: session.id,\n timestamp: new Date(Number(sessionEvents(session)[0]?.time ?? Date.now())).toISOString(),\n cwd,\n }),\n getEntries: () => entriesOf(),\n getTree: () => {\n const entries = entriesOf()\n const labels = this.labels(session.id)\n type Node = { entry: PiProjectedEntry; children: Node[]; label?: string | undefined }\n let root: Node | undefined\n let cursor: Node | undefined\n for (const entry of entries) {\n const node: Node = {\n entry,\n children: [],\n ...(labels.has(entry.id) ? { label: labels.get(entry.id) } : {}),\n }\n if (cursor === undefined) root = node\n else cursor.children.push(node)\n cursor = node\n }\n return root === undefined ? [] : [root]\n },\n getSessionName: () => this.getName(session.id),\n }\n }\n}\n","import { access, readFile } from 'node:fs/promises'\nimport { EventEmitter } from 'node:events'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { createJiti } from 'jiti'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { createUserMessage, type ContentBlock } from '@deepseek-ai/dsh-llm'\nimport { renderPrompt } from '@deepseek-ai/dsh-system-prompt'\nimport type {\n PostToolDecision,\n PreToolDecision,\n ToolDefinition,\n ToolExecution,\n ToolExecutionResult,\n} from '@deepseek-ai/dsh-tools'\nimport type { GeneratedRuntimeManifest } from './types.js'\nimport { PiSessionBridge } from './session-bridge.js'\nimport { Theme } from './compat/pi-coding-agent.js'\n\ntype UnknownRecord = Record<string, unknown>\ntype PiHandler = (event: UnknownRecord, context: UnknownRecord) => unknown | Promise<unknown>\n\ninterface RuntimeOptions {\n rootUrl: URL\n manifest: GeneratedRuntimeManifest\n config?: UnknownRecord\n}\n\ninterface PiTool {\n name: string\n label?: string\n description: string\n parameters: unknown\n executionMode?: 'parallel' | 'sequential'\n prepareArguments?: (args: unknown) => unknown\n execute(\n toolCallId: string,\n args: unknown,\n signal: AbortSignal | undefined,\n onUpdate: ((result: unknown) => void) | undefined,\n context: UnknownRecord,\n ): Promise<unknown>\n}\n\ninterface PiCommand {\n name: string\n description: string\n argumentHint?: string\n handler(args: string, context: UnknownRecord): unknown | Promise<unknown>\n}\n\ninterface RuntimeState {\n handlers: Map<string, PiHandler[]>\n tools: Map<string, PiTool>\n toolDisposers: Map<string, () => void>\n toolRestrictions: WeakMap<object, () => void>\n pendingActiveTools?: string[]\n commands: Map<string, PiCommand>\n flags: Map<string, boolean | string | undefined>\n notifications: string[]\n activeAgents: Set<UnknownRecord>\n disposedAgents: WeakSet<object>\n currentSystemPrompt: string\n messageSource: string\n eventBus: EventEmitter\n agentScope: AsyncLocalStorage<UnknownRecord | undefined>\n bridge: PiSessionBridge\n theme: Theme\n // Registered-but-headless surfaces: accepted so packages load and can\n // introspect their own registrations; DSH owns actual presentation.\n shortcuts: Map<string, UnknownRecord>\n messageRenderers: Map<string, unknown>\n entryRenderers: Map<string, unknown>\n markdownTransformer?: unknown\n providers: Map<string, UnknownRecord>\n autocompleteProviders: unknown[]\n editorComponentFactory?: unknown\n editorBuffers: WeakMap<object, string>\n toolsExpanded: boolean\n // Per-agent model/thinking overrides applied through the agent/request waterfall.\n modelOverrides: WeakMap<object, { provider?: string; model?: string }>\n thinkingLevels: WeakMap<object, string>\n globalThinkingLevel: string\n // Pi tool_call handlers mutate event.input in place; mutations apply to\n // pi2dsh-owned tools through this channel (DSH core deliberately forbids\n // rewriting exec.arguments for native tools).\n argMutations: WeakMap<object, unknown>\n // Streaming accumulation for message_update projection from assistant/chunk.\n streamingTexts: Map<string, string>\n // Last model id seen in a request/header event, for model_select projection.\n lastLoggedModels: WeakMap<object, string>\n}\n\ninterface PiExecOptions {\n signal?: AbortSignal\n timeout?: number\n cwd?: string\n}\n\ninterface DshSubprocessHandle {\n collected: {\n stdout?: { readFrom(offset: number): { text: string; lossy: boolean } }\n stderr?: { readFrom(offset: number): { text: string; lossy: boolean } }\n }\n done: Promise<{ exitCode: number | null; signal: string | null }>\n}\n\ninterface DshSubprocessService {\n resolveExecutable(command: string, env?: Readonly<Record<string, string>>, signal?: AbortSignal): Promise<string>\n spawn(spec: UnknownRecord): DshSubprocessHandle\n}\n\ninterface DshAgent extends UnknownRecord {\n steer(message: unknown): void\n followup(message: unknown): void\n inject(message: unknown): void\n}\n\nfunction logger(ctx: Context): { warn(message: string): void; info(message: string): void; debug(message: string): void } {\n const candidate = (ctx as unknown as { logger?: Partial<ReturnType<typeof logger>> }).logger\n return {\n warn: message => candidate?.warn?.(message) ?? console.warn(message),\n info: message => candidate?.info?.(message) ?? console.info(message),\n debug: message => candidate?.debug?.(message) ?? undefined,\n }\n}\n\nfunction cloneJson<T>(value: T): T {\n return structuredClone(value)\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n try {\n return JSON.stringify(left) === JSON.stringify(right)\n } catch {\n return false\n }\n}\n\nfunction jsonValue(value: unknown): unknown {\n if (value === undefined) return null\n try {\n return JSON.parse(JSON.stringify(value)) as unknown\n } catch {\n return String(value)\n }\n}\n\nfunction textBlocks(content: unknown): Array<{ type: 'text'; text: string }> {\n if (!Array.isArray(content)) return [{ type: 'text', text: String(content ?? '') }]\n return content.map((block): { type: 'text'; text: string } => {\n if (typeof block === 'object' && block !== null && (block as UnknownRecord).type === 'text') {\n return { type: 'text', text: String((block as UnknownRecord).text ?? '') }\n }\n if (typeof block === 'object' && block !== null && (block as UnknownRecord).type === 'image') {\n const mime = String((block as UnknownRecord).mimeType ?? 'image')\n return { type: 'text', text: `[Pi tool returned ${mime}; binary image output requires a native DSH attachment adapter]` }\n }\n return { type: 'text', text: String(block) }\n })\n}\n\nfunction normalizeToolResult(result: unknown): UnknownRecord {\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n return { content: [{ type: 'text', text: String(result ?? '') }], details: null }\n }\n const record = result as UnknownRecord\n return {\n content: textBlocks(record.content),\n details: jsonValue(record.details),\n ...(record.isError === true ? { isError: true } : {}),\n ...(record.usage !== undefined ? { usage: jsonValue(record.usage) } : {}),\n ...(record.terminate === true ? { terminate: true } : {}),\n }\n}\n\nasync function piToDshContent(ctx: Context, content: unknown): Promise<ContentBlock[]> {\n const values = Array.isArray(content) ? content : [{ type: 'text', text: String(content ?? '') }]\n const blocks: ContentBlock[] = []\n for (const value of values) {\n if (typeof value !== 'object' || value === null) {\n blocks.push({ type: 'text', text: String(value) })\n continue\n }\n const block = value as UnknownRecord\n if (block.type === 'text') {\n blocks.push({ type: 'text', text: String(block.text ?? '') })\n continue\n }\n if (block.type !== 'image') {\n blocks.push({ type: 'text', text: String(value) })\n continue\n }\n const attachments = optionalService<{\n saveImage(input: { data: Uint8Array; mediaType: string; name?: string }): Promise<UnknownRecord>\n }>(ctx, 'attachments')\n if (attachments === undefined) {\n throw new Error('pi2dsh: Pi image content requires the DSH attachments service')\n }\n if (typeof block.data !== 'string' || typeof block.mimeType !== 'string') {\n throw new TypeError('pi2dsh: Pi image content requires base64 data and mimeType')\n }\n const attachment = await attachments.saveImage({\n data: Buffer.from(block.data, 'base64'),\n mediaType: block.mimeType,\n ...(typeof block.name === 'string' ? { name: block.name } : {}),\n })\n blocks.push({ type: 'image', attachment } as unknown as ContentBlock)\n }\n return blocks\n}\n\nasync function normalizeToolResultForDsh(ctx: Context, result: unknown): Promise<UnknownRecord> {\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n return { content: [{ type: 'text', text: String(result ?? '') }], details: null }\n }\n const record = result as UnknownRecord\n return {\n content: await piToDshContent(ctx, record.content),\n details: jsonValue(record.details),\n ...(record.isError === true ? { isError: true } : {}),\n ...(record.usage !== undefined ? { usage: jsonValue(record.usage) } : {}),\n ...(record.terminate === true ? { terminate: true } : {}),\n }\n}\n\nconst SUPPORTED_SCHEMA_KEYS = new Set([\n 'type', 'oneOf', 'anyOf', 'properties', 'required', 'additionalProperties',\n 'items', 'enum', 'const', 'description', 'title', 'default', 'examples',\n])\n\nfunction normalizeSchemaNode(value: unknown, path: string, warnings: string[]): UnknownRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n warnings.push(`${path}: non-object schema replaced with unconstrained JSON`)\n return {}\n }\n const source = value as UnknownRecord\n const output: UnknownRecord = {}\n for (const key of Object.keys(source)) {\n if (!SUPPORTED_SCHEMA_KEYS.has(key)) warnings.push(`${path}.${key}: constraint is not enforced by DSH and was dropped`)\n }\n const type = source.type\n if (typeof type === 'string' && ['object', 'array', 'string', 'number', 'integer', 'boolean', 'null'].includes(type)) {\n output.type = type\n } else if (type !== undefined) {\n warnings.push(`${path}.type: unsupported type was dropped`)\n }\n const union = Array.isArray(source.oneOf) ? source.oneOf : Array.isArray(source.anyOf) ? source.anyOf : undefined\n if (union !== undefined) {\n if (source.anyOf !== undefined) warnings.push(`${path}.anyOf: converted to DSH exact-one oneOf semantics`)\n output.oneOf = union.map((entry, index) => normalizeSchemaNode(entry, `${path}.oneOf[${index}]`, warnings))\n delete output.type\n }\n if (output.type === 'object') {\n const properties = typeof source.properties === 'object' && source.properties !== null && !Array.isArray(source.properties)\n ? source.properties as UnknownRecord\n : {}\n output.properties = Object.fromEntries(\n Object.entries(properties).map(([key, entry]) => [key, normalizeSchemaNode(entry, `${path}.properties.${key}`, warnings)]),\n )\n if (Array.isArray(source.required)) output.required = source.required.filter(item => typeof item === 'string')\n if (typeof source.additionalProperties === 'boolean') output.additionalProperties = source.additionalProperties\n else if (source.additionalProperties !== undefined) {\n output.additionalProperties = true\n warnings.push(`${path}.additionalProperties: schema-valued form widened to true`)\n }\n }\n if (output.type === 'array' && source.items !== undefined) {\n output.items = normalizeSchemaNode(source.items, `${path}.items`, warnings)\n }\n if (Array.isArray(source.enum)) output.enum = source.enum.filter(item => item === null || ['string', 'number', 'boolean'].includes(typeof item))\n if (source.const === null || ['string', 'number', 'boolean'].includes(typeof source.const)) output.const = source.const\n for (const annotation of ['description', 'title'] as const) {\n if (typeof source[annotation] === 'string') output[annotation] = source[annotation]\n }\n for (const annotation of ['default', 'examples'] as const) {\n if (source[annotation] !== undefined) output[annotation] = jsonValue(source[annotation])\n }\n return output\n}\n\nexport function normalizeToolSchema(schema: unknown): { schema: UnknownRecord; warnings: string[] } {\n const warnings: string[] = []\n const normalized = normalizeSchemaNode(schema, '$', warnings)\n if (normalized.type !== 'object') {\n throw new TypeError('Pi tool parameters must use an object-root TypeBox schema')\n }\n return { schema: normalized, warnings }\n}\n\nfunction cwdOf(agent: UnknownRecord | undefined): string {\n const session = agent?.session\n if (typeof session === 'object' && session !== null) {\n const header = (session as UnknownRecord).header\n if (typeof header === 'object' && header !== null && typeof (header as UnknownRecord).cwd === 'string') {\n return (header as UnknownRecord).cwd as string\n }\n }\n return process.cwd()\n}\n\nfunction unsupported(name: string): never {\n throw new Error(`pi2dsh: Pi API ${name} requires a native DSH port; inspect the compatibility report`)\n}\n\nfunction optionalService<T>(ctx: Context, name: string): T | undefined {\n return (ctx as unknown as { get(name: string): unknown }).get(name) as T | undefined\n}\n\nfunction requireAgent(state: RuntimeState, operation: string): DshAgent {\n const agent = currentAgent(state)\n if (agent === undefined) {\n throw new Error(`pi2dsh: ${operation} requires one active DSH agent context`)\n }\n return agent as DshAgent\n}\n\nfunction answerText(answer: UnknownRecord | undefined): string | undefined {\n if (answer === undefined) return undefined\n if (typeof answer.custom === 'string' && answer.custom.length > 0) return answer.custom\n const selected = answer.selected\n return Array.isArray(selected) && typeof selected[0] === 'string' ? selected[0] : undefined\n}\n\nasync function askOne(\n ctx: Context,\n agent: UnknownRecord | undefined,\n signal: AbortSignal | undefined,\n question: UnknownRecord,\n): Promise<string | undefined> {\n const service = optionalService<{\n ask(request: UnknownRecord): Promise<{ answers: UnknownRecord[] }>\n }>(ctx, 'userQuestions')\n if (service === undefined) unsupported('ctx.ui AskUser')\n const result = await service.ask({ questions: [question], ...(agent !== undefined ? { agent } : {}), signal })\n return answerText(result.answers.find(answer => answer.id === question.id))\n}\n\nfunction agentSession(agent: UnknownRecord | undefined): { id: string; events: unknown } | undefined {\n const session = agent?.session\n if (typeof session !== 'object' || session === null) return undefined\n const record = session as UnknownRecord\n if (typeof record.id !== 'string') return undefined\n return record as unknown as { id: string; events: unknown }\n}\n\nfunction thinkingLevelOf(state: RuntimeState, agent: UnknownRecord | undefined): string {\n if (agent !== undefined) {\n const scoped = state.thinkingLevels.get(agent)\n if (scoped !== undefined) return scoped\n }\n return state.globalThinkingLevel\n}\n\nfunction contextFor(\n ctx: Context,\n state: RuntimeState,\n agent: UnknownRecord | undefined,\n signal: AbortSignal | undefined,\n command = false,\n): UnknownRecord {\n const notices: string[] = []\n const userQuestions = optionalService(ctx, 'userQuestions')\n const ui = {\n notify(message: unknown) {\n const text = String(message)\n notices.push(text)\n state.notifications.push(text)\n logger(ctx).info(`[pi2dsh] ${text}`)\n },\n select: (title: unknown, options: unknown[]) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-select',\n question: String(title),\n options: options.map(option => ({ label: String(option) })),\n }),\n async confirm(title: unknown, message: unknown) {\n return await askOne(ctx, agent, signal, {\n id: 'pi2dsh-confirm',\n question: String(title),\n detail: String(message),\n options: [{ label: 'Yes' }, { label: 'No' }],\n }) === 'Yes'\n },\n input: (title: unknown, placeholder?: unknown) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-input',\n question: String(title),\n ...(placeholder === undefined ? {} : { detail: String(placeholder) }),\n }),\n editor: (title: unknown, prefill?: unknown) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-editor',\n question: String(title),\n ...(prefill === undefined ? {} : { detail: `Current text:\\n${String(prefill)}` }),\n }),\n setStatus: () => undefined,\n setWidget: () => undefined,\n onTerminalInput: () => () => undefined,\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // Pi's own rpc mode resolves ui.custom to undefined; mirror that exactly.\n custom: async () => undefined,\n pasteToEditor(text: unknown) {\n if (agent !== undefined) {\n state.editorBuffers.set(agent, (state.editorBuffers.get(agent) ?? '') + String(text))\n }\n },\n setEditorText(text: unknown) {\n if (agent !== undefined) state.editorBuffers.set(agent, String(text))\n },\n getEditorText: () => (agent === undefined ? '' : state.editorBuffers.get(agent) ?? ''),\n addAutocompleteProvider(factory: unknown) {\n state.autocompleteProviders.push(factory)\n },\n setEditorComponent(factory: unknown) {\n state.editorComponentFactory = factory\n },\n getEditorComponent: () => state.editorComponentFactory,\n get theme() {\n return state.theme\n },\n getAllThemes: () => [{ name: state.theme.name, path: undefined }],\n getTheme: (name: string) => (name === state.theme.name ? state.theme : undefined),\n setTheme: (target: unknown) => (\n typeof target === 'object' || target === state.theme.name\n ? { success: true }\n : { success: false, error: `pi2dsh headless mode ships a single theme (${state.theme.name})` }\n ),\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded(expanded: unknown) {\n state.toolsExpanded = expanded === true\n },\n }\n const session = agentSession(agent)\n // Pi's ModelRegistry surface with an empty catalog: DSH owns model routing,\n // so extensions see a well-formed registry that reports no Pi providers.\n const modelRegistry = {\n getAll: () => [],\n getAvailable: () => [],\n find: (_provider: string, _modelId: string) => undefined,\n getError: () => undefined,\n hasConfiguredAuth: (_model: unknown) => false,\n getProviderAuthStatus: (_provider: string) => 'none',\n getProvider: (_provider: string) => undefined,\n getProviderDisplayName: (provider: string) => provider,\n getProviderAuth: async (_provider: string) => undefined,\n getApiKeyForProvider: async (_provider: string) => undefined,\n isUsingOAuth: (_model: unknown) => false,\n refresh: async () => ({ models: [], errors: [] }),\n }\n const base: UnknownRecord = {\n ui,\n mode: 'rpc',\n hasUI: userQuestions !== undefined,\n cwd: cwdOf(agent),\n sessionManager: session === undefined\n ? state.bridge.readonlySessionManager({ id: 'pi2dsh-detached', events: [] }, cwdOf(agent))\n : state.bridge.readonlySessionManager(session as never, cwdOf(agent)),\n modelRegistry,\n model: agent === undefined ? undefined : state.modelOverrides.get(agent),\n scopedModels: [],\n thinkingLevel: thinkingLevelOf(state, agent),\n isIdle: () => command,\n isProjectTrusted: () => false,\n signal,\n abort: () => {\n const target = agent as { cancel?(cause: unknown): void } | undefined\n if (typeof target?.cancel !== 'function') unsupported('ctx.abort without a live DSH agent')\n target.cancel({ kind: 'hook', reason: 'pi2dsh: aborted by migrated Pi extension' })\n },\n hasPendingMessages: () => false,\n shutdown: () => unsupported('ctx.shutdown'),\n getContextUsage: () => undefined,\n compact: () => unsupported('ctx.compact'),\n getSystemPrompt: () => state.currentSystemPrompt,\n __agent: agent,\n __notices: notices,\n }\n if (command) {\n Object.assign(base, {\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => {\n const wait = agent?.whenIdle\n if (typeof wait === 'function') await wait.call(agent)\n },\n newSession: () => unsupported('ctx.newSession'),\n fork: () => unsupported('ctx.fork'),\n navigateTree: () => unsupported('ctx.navigateTree'),\n switchSession: () => unsupported('ctx.switchSession'),\n reload: () => unsupported('ctx.reload'),\n })\n }\n return base\n}\n\nasync function dispatch(\n state: RuntimeState,\n eventName: string,\n event: UnknownRecord,\n eventContext: UnknownRecord,\n): Promise<unknown[]> {\n const results: unknown[] = []\n const agent = eventContext.__agent as UnknownRecord | undefined\n for (const handler of state.handlers.get(eventName) ?? []) {\n results.push(await state.agentScope.run(agent, () => handler(event, eventContext)))\n }\n return results\n}\n\nfunction dshToPiContent(content: readonly ContentBlock[]): Array<UnknownRecord> {\n return content.map(block => {\n if (block.type === 'text') return { type: 'text', text: block.text }\n if (block.type === 'reasoning') return { type: 'thinking', thinking: block.text }\n if (block.type === 'tool-call') return { type: 'toolCall', id: block.id, name: block.name, arguments: block.arguments }\n return { type: block.type }\n })\n}\n\nfunction messageFromSessionEvent(event: UnknownRecord): UnknownRecord | undefined {\n const type = event.type\n const data = event.data\n if (typeof data !== 'object' || data === null) return undefined\n const record = data as UnknownRecord\n if (type === 'user/message') return { role: 'user', content: dshToPiContent((record.content ?? []) as ContentBlock[]) }\n if (type === 'assistant/message') {\n const message = record.message as UnknownRecord | undefined\n return { role: 'assistant', content: dshToPiContent((message?.content ?? []) as ContentBlock[]) }\n }\n if (type === 'tool/result') {\n const message = record.message as UnknownRecord | undefined\n const blocks = (message?.content ?? []) as Array<UnknownRecord>\n const tool = blocks.find(block => block.type === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: tool?.toolCallId,\n content: dshToPiContent((tool?.content ?? []) as ContentBlock[]),\n isError: tool?.isError === true,\n }\n }\n return undefined\n}\n\nfunction sourceReason(value: unknown): string {\n return value === 'resume' ? 'resume' : value === 'fork' ? 'fork' : 'startup'\n}\n\nfunction subscribeLifecycle(ctx: Context, state: RuntimeState): void {\n const cordis = ctx as unknown as {\n on(name: string, callback: (...args: any[]) => unknown, options?: unknown): () => void\n effect(callback: () => unknown, label?: string): unknown\n }\n const warn = (event: string, error: unknown) => logger(ctx).warn(`[pi2dsh] ${event} handler failed: ${String(error)}`)\n\n cordis.on('agent/session-start', (payload: UnknownRecord) => {\n const agent = payload.agent as UnknownRecord\n state.activeAgents.add(agent)\n const session = agentSession(agent)\n if (session !== undefined) state.bridge.load(session.id)\n if (state.pendingActiveTools !== undefined) {\n state.agentScope.run(agent, () => setActiveTools(ctx, state, state.pendingActiveTools!))\n }\n void dispatch(state, 'session_start', { type: 'session_start', reason: sourceReason(payload.source) }, contextFor(ctx, state, agent, undefined))\n .catch(error => warn('session_start', error))\n })\n cordis.on('agent/disposed', (payload: UnknownRecord) => {\n const agent = payload.agent as UnknownRecord\n state.activeAgents.delete(agent)\n if (typeof agent === 'object' && agent !== null) {\n state.toolRestrictions.get(agent)?.()\n state.toolRestrictions.delete(agent)\n }\n if (typeof agent === 'object' && agent !== null && !state.disposedAgents.has(agent)) {\n state.disposedAgents.add(agent)\n void dispatch(state, 'session_shutdown', { type: 'session_shutdown', reason: 'quit' }, contextFor(ctx, state, agent, undefined))\n .catch(error => warn('session_shutdown', error))\n }\n })\n\n cordis.on('session/event', (session: UnknownRecord, event: UnknownRecord) => {\n const agent = [...state.activeAgents].find(candidate => candidate.session === session)\n const eventContext = contextFor(ctx, state, agent, undefined)\n const type = event.type\n if (type === 'turn/start') {\n const turn = Number((event.data as UnknownRecord).turn ?? 1)\n void dispatch(state, 'agent_start', { type: 'agent_start' }, eventContext).catch(error => warn('agent_start', error))\n void dispatch(state, 'turn_start', { type: 'turn_start', turnIndex: turn - 1, timestamp: event.time ?? Date.now() }, eventContext)\n .catch(error => warn('turn_start', error))\n }\n if (type === 'tool/call') {\n const data = event.data as UnknownRecord\n let args: unknown = {}\n try { args = JSON.parse(String(data.arguments ?? '{}')) } catch { args = {} }\n void dispatch(state, 'tool_execution_start', {\n type: 'tool_execution_start', toolCallId: data.callId, toolName: data.name, args,\n }, eventContext).catch(error => warn('tool_execution_start', error))\n }\n if (type === 'assistant/chunk' && (state.handlers.get('message_update')?.length ?? 0) > 0) {\n const data = event.data as UnknownRecord\n const chunk = (data.chunk ?? {}) as UnknownRecord\n const key = `${String(session.id ?? '')}:${String(data.turn ?? 0)}:${String(data.step ?? 0)}`\n const delta = typeof chunk.text === 'string'\n ? chunk.text\n : typeof chunk.delta === 'string' ? chunk.delta : ''\n const accumulated = (state.streamingTexts.get(key) ?? '') + delta\n state.streamingTexts.set(key, accumulated)\n void dispatch(state, 'message_update', {\n type: 'message_update',\n message: { role: 'assistant', content: [{ type: 'text', text: accumulated }] },\n assistantMessageEvent: chunk,\n }, eventContext).catch(error => warn('message_update', error))\n }\n if (type === 'assistant/message') {\n const data = event.data as UnknownRecord\n state.streamingTexts.delete(`${String(session.id ?? '')}:${String(data.turn ?? 0)}:${String(data.step ?? 0)}`)\n }\n if (type === 'session/title') {\n const data = event.data as UnknownRecord\n void dispatch(state, 'session_info_changed', {\n type: 'session_info_changed', name: typeof data.title === 'string' ? data.title : undefined,\n }, eventContext).catch(error => warn('session_info_changed', error))\n }\n // DSH compaction events are facts from the durable log: the \"before\"\n // projection is advisory (cancel/replace cannot reach DSH's compactor),\n // and the \"after\" projection carries the summary when one was recorded.\n if (type === 'compaction/start') {\n void dispatch(state, 'session_before_compact', {\n type: 'session_before_compact',\n preparation: { ...(event.data as UnknownRecord) },\n branchEntries: [],\n reason: 'threshold',\n willRetry: false,\n }, eventContext).catch(error => warn('session_before_compact', error))\n }\n if (type === 'compaction/end' || type === 'compaction/summary') {\n const data = event.data as UnknownRecord\n void dispatch(state, 'session_compact', {\n type: 'session_compact',\n compactionEntry: {\n type: 'compaction',\n id: `dsh-${String(event.seq ?? '')}`,\n summary: typeof data.summary === 'string' ? data.summary : '',\n ...(data as object),\n },\n fromExtension: false,\n reason: 'threshold',\n willRetry: false,\n }, eventContext).catch(error => warn('session_compact', error))\n }\n if (type === 'request/header') {\n const header = ((event.data as UnknownRecord).header ?? {}) as UnknownRecord\n const model = header.model ?? (header as { config?: UnknownRecord }).config?.model\n if (model !== undefined && agent !== undefined) {\n const previous = state.lastLoggedModels.get(agent)\n if (previous !== undefined && previous !== String(model)) {\n void dispatch(state, 'model_select', {\n type: 'model_select',\n model: { id: String(model) },\n previousModel: { id: previous },\n source: 'set',\n }, eventContext).catch(error => warn('model_select', error))\n }\n state.lastLoggedModels.set(agent, String(model))\n }\n }\n const message = messageFromSessionEvent(event)\n if (message !== undefined) {\n void dispatch(state, 'message_start', { type: 'message_start', message }, eventContext)\n .then(() => dispatch(state, 'message_end', { type: 'message_end', message }, eventContext))\n .catch(error => warn('message lifecycle', error))\n }\n if (type === 'turn/end') {\n const data = event.data as UnknownRecord\n const turnIndex = Number(data.turn ?? 1) - 1\n const finalMessage = { role: 'assistant', content: [] }\n void dispatch(state, 'turn_end', { type: 'turn_end', turnIndex, message: finalMessage, toolResults: [] }, eventContext)\n .then(() => dispatch(state, 'agent_end', { type: 'agent_end', messages: [] }, eventContext))\n .then(() => dispatch(state, 'agent_settled', { type: 'agent_settled' }, eventContext))\n .catch(error => warn('turn end lifecycle', error))\n }\n })\n\n // Per-agent model/thinking overrides recorded by setModel()/setThinkingLevel()\n // are applied at the request boundary, DSH's sanctioned seam for call-config\n // replacement.\n cordis.on('agent/request', async (payload: UnknownRecord, next: () => Promise<UnknownRecord>) => {\n const config = await next()\n const agent = payload.agent as UnknownRecord | undefined\n if (agent === undefined) return config\n const override = state.modelOverrides.get(agent)\n const thinking = state.thinkingLevels.get(agent)\n if (override === undefined && thinking === undefined) return config\n return {\n ...config,\n ...(override?.provider === undefined ? {} : { provider: override.provider }),\n ...(override?.model === undefined ? {} : { model: override.model }),\n ...(thinking === undefined || thinking === 'off' ? {} : { reasoningEffort: thinking }),\n }\n })\n\n cordis.on('tools/result', (exec: ToolExecution, result: ToolExecutionResult) => {\n const agent = exec.agent as unknown as UnknownRecord | undefined\n void dispatch(state, 'tool_execution_end', {\n type: 'tool_execution_end',\n toolCallId: exec.callId,\n toolName: exec.name,\n result: { content: dshToPiContent(result.content), details: result.meta ?? null },\n isError: result.isError,\n }, contextFor(ctx, state, agent, exec.signal)).catch(error => warn('tool_execution_end', error))\n })\n\n cordis.effect(() => async () => {\n for (const agent of state.activeAgents) {\n if (typeof agent === 'object' && agent !== null && !state.disposedAgents.has(agent)) {\n state.disposedAgents.add(agent)\n await dispatch(state, 'session_shutdown', { type: 'session_shutdown', reason: 'quit' }, contextFor(ctx, state, agent, undefined))\n }\n }\n state.activeAgents.clear()\n for (const dispose of state.toolDisposers.values()) dispose()\n state.toolDisposers.clear()\n state.eventBus.removeAllListeners()\n }, 'pi2dsh session shutdown')\n}\n\nfunction subscribeInterceptors(ctx: Context, state: RuntimeState): void {\n const cordis = ctx as unknown as { on(name: string, callback: (...args: any[]) => unknown): () => void }\n cordis.on('tools/pre-execute', async (exec: ToolExecution, next: () => Promise<PreToolDecision>): Promise<PreToolDecision> => {\n const input = cloneJson(exec.arguments)\n const event: UnknownRecord = { type: 'tool_call', toolName: exec.name, toolCallId: exec.callId, input }\n const results = await dispatch(state, 'tool_call', event, contextFor(ctx, state, exec.agent as unknown as UnknownRecord, exec.signal))\n if (!jsonEqual(event.input, exec.arguments)) {\n if (state.tools.has(exec.name)) {\n // Pi semantics: tool_call handlers mutate event.input in place. For\n // pi2dsh-owned tools the mutation is applied inside our execute\n // wrapper; DSH-native tools cannot accept it because the core logs\n // arguments before policy on purpose.\n state.argMutations.set(exec as unknown as object, cloneJson(event.input))\n } else {\n return { kind: 'deny', reason: `pi2dsh: a Pi tool_call hook mutated arguments of native DSH tool ${JSON.stringify(exec.name)}; DSH logs arguments before policy, so this mutation cannot be honored` }\n }\n }\n for (const result of results) {\n if (typeof result === 'object' && result !== null && (result as UnknownRecord).block === true) {\n return { kind: 'deny', reason: String((result as UnknownRecord).reason ?? 'blocked by migrated Pi tool_call hook') }\n }\n }\n return next()\n })\n\n cordis.on('tools/post-execute', async (\n exec: ToolExecution,\n result: ToolExecutionResult,\n next: () => Promise<PostToolDecision>,\n ): Promise<PostToolDecision> => {\n const downstream = await next()\n if (downstream.kind === 'block') return downstream\n const event: UnknownRecord = {\n type: 'tool_result',\n toolName: exec.name,\n toolCallId: exec.callId,\n input: cloneJson(exec.arguments),\n content: dshToPiContent(result.content),\n details: result.meta ?? null,\n isError: result.isError,\n usage: undefined,\n }\n const results = await dispatch(state, 'tool_result', event, contextFor(ctx, state, exec.agent as unknown as UnknownRecord, exec.signal))\n for (const patch of results) {\n if (typeof patch !== 'object' || patch === null) continue\n Object.assign(event, patch)\n }\n const content = textBlocks(event.content)\n if (event.isError === true && !result.isError) return { kind: 'block', feedback: content }\n if (event.isError === false && result.isError) {\n logger(ctx).warn('[pi2dsh] a Pi tool_result hook attempted to recover a DSH error; error recovery was ignored')\n }\n if (!jsonEqual(event.content, dshToPiContent(result.content))) return { kind: 'accept', content }\n return downstream\n })\n\n cordis.on('system-prompt/assemble', async (assembly: UnknownRecord, assembleContext: UnknownRecord, next: () => Promise<UnknownRecord>) => {\n const downstream = await next()\n if ((state.handlers.get('before_agent_start')?.length ?? 0) === 0) return downstream\n const original = renderPrompt(downstream as never)\n state.currentSystemPrompt = original\n const event: UnknownRecord = {\n type: 'before_agent_start', prompt: '', systemPrompt: original, systemPromptOptions: {},\n }\n const results = await dispatch(state, 'before_agent_start', event, contextFor(ctx, state, assembleContext.scope as UnknownRecord, assembleContext.signal as AbortSignal | undefined))\n let replacement = original\n for (const result of results) {\n if (typeof result === 'object' && result !== null && typeof (result as UnknownRecord).systemPrompt === 'string') {\n replacement = (result as UnknownRecord).systemPrompt as string\n event.systemPrompt = replacement\n }\n if (typeof result === 'object' && result !== null && (result as UnknownRecord).message !== undefined) {\n logger(ctx).warn('[pi2dsh] before_agent_start custom-message injection is unsupported and was ignored')\n }\n }\n state.currentSystemPrompt = replacement\n return { ...downstream, sections: [{ name: 'pi2dsh:system-prompt', text: replacement }] }\n })\n}\n\nfunction registerTool(ctx: Context, state: RuntimeState, tool: PiTool): void {\n if (state.tools.has(tool.name)) throw new Error(`Pi tool ${JSON.stringify(tool.name)} is already registered`)\n const normalized = normalizeToolSchema(tool.parameters)\n for (const warning of normalized.warnings) logger(ctx).warn(`[pi2dsh] tool ${tool.name}: ${warning}`)\n state.tools.set(tool.name, tool)\n const definition: ToolDefinition = {\n name: tool.name,\n description: tool.description,\n parameters: normalized.schema,\n output: {\n schema: {},\n render: (_args, value) => (value as UnknownRecord).content as ContentBlock[],\n presentationMeta: (_args, value) => jsonValue((value as UnknownRecord).details) as never,\n },\n isConcurrencySafe: () => tool.executionMode === 'parallel',\n async execute(args, exec) {\n const mutated = state.argMutations.get(exec as unknown as object)\n if (mutated !== undefined) state.argMutations.delete(exec as unknown as object)\n const effective = mutated ?? args\n const prepared = tool.prepareArguments?.(cloneJson(effective)) ?? effective\n const agent = exec.agent as unknown as UnknownRecord | undefined\n const result = await normalizeToolResultForDsh(ctx, await state.agentScope.run(agent, () => tool.execute(\n String(exec.callId),\n prepared,\n exec.signal,\n update => {\n void dispatch(state, 'tool_execution_update', {\n type: 'tool_execution_update',\n toolCallId: String(exec.callId),\n toolName: tool.name,\n args: prepared,\n partialResult: jsonValue(update),\n }, contextFor(ctx, state, agent, exec.signal))\n .catch(error => logger(ctx).warn(`[pi2dsh] tool_execution_update handler failed: ${String(error)}`))\n },\n contextFor(ctx, state, agent, exec.signal),\n )))\n if (result.terminate === true) exec.concludeTurn()\n if (result.isError === true) {\n const message = textBlocks(result.content).map(block => block.text).filter(Boolean).join('\\n')\n throw new Error(message || `Pi tool ${tool.name} failed`)\n }\n return result\n },\n }\n const dispose = (ctx as unknown as { tools: { register(toolDefinition: ToolDefinition): () => void } }).tools.register(definition)\n state.toolDisposers.set(tool.name, dispose)\n}\n\nfunction unregisterTool(state: RuntimeState, name: string): boolean {\n const dispose = state.toolDisposers.get(name)\n if (dispose === undefined) return false\n dispose()\n state.toolDisposers.delete(name)\n state.tools.delete(name)\n return true\n}\n\nfunction currentAgent(state: RuntimeState): UnknownRecord | undefined {\n const scoped = state.agentScope.getStore()\n if (scoped !== undefined) return scoped\n if (state.activeAgents.size === 1) return state.activeAgents.values().next().value as UnknownRecord | undefined\n return undefined\n}\n\nfunction toolRuntime(ctx: Context, agent?: UnknownRecord): {\n schemas(scope?: unknown): Array<{ name: string; description?: string; parameters?: unknown }>\n restrict?(filter: { allow: string[] }): () => void\n} {\n const scoped = agent?.ctx as { tools?: ReturnType<typeof toolRuntime> } | undefined\n return scoped?.tools ?? (ctx as unknown as { tools: ReturnType<typeof toolRuntime> }).tools\n}\n\nfunction getActiveTools(ctx: Context, state: RuntimeState): string[] {\n const agent = currentAgent(state)\n return toolRuntime(ctx, agent).schemas(agent).map(tool => tool.name)\n}\n\nfunction setActiveTools(ctx: Context, state: RuntimeState, names: string[]): void {\n const unique = [...new Set(names)]\n const agent = currentAgent(state)\n state.pendingActiveTools = unique\n if (agent === undefined || typeof agent !== 'object' || agent === null) return\n const scopedTools = agent.ctx === undefined ? undefined : toolRuntime(ctx, agent)\n if (scopedTools === undefined || typeof scopedTools.restrict !== 'function') {\n // No agent-scoped tool runtime (e.g. a bare test agent): remember the\n // intent and apply it when a scoped agent starts. Restricting the global\n // registry here would mask every agent, which DSH rightly rejects.\n logger(ctx).warn('[pi2dsh] setActiveTools deferred: the current agent exposes no scoped tools.restrict()')\n return\n }\n state.toolRestrictions.get(agent)?.()\n state.toolRestrictions.set(agent, scopedTools.restrict({ allow: unique }))\n}\n\nfunction deliverAgentMessage(agent: DshAgent, message: unknown, mode: 'inject' | 'steer' | 'followup'): void {\n const deliver = agent[mode]\n if (typeof deliver !== 'function') throw new Error(`pi2dsh: active DSH agent has no ${mode}() delivery method`)\n deliver.call(agent, message)\n}\n\nasync function sendPiMessage(\n ctx: Context,\n state: RuntimeState,\n content: unknown,\n mode: 'inject' | 'steer' | 'followup',\n): Promise<void> {\n const agent = requireAgent(state, mode === 'inject' ? 'sendMessage' : 'sendUserMessage')\n const blocks = await piToDshContent(ctx, typeof content === 'string' ? [{ type: 'text', text: content }] : content)\n deliverAgentMessage(agent, createUserMessage({\n content: blocks,\n source: { kind: 'plugin', plugin: state.messageSource },\n }), mode)\n}\n\nfunction combineExecSignal(options: PiExecOptions): {\n signal: AbortSignal\n killed(): boolean\n cleanup(): void\n} {\n const controller = new AbortController()\n let killed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const abort = (reason: unknown): void => {\n if (controller.signal.aborted) return\n killed = true\n controller.abort(reason)\n }\n const onAbort = (): void => abort(options.signal?.reason ?? new Error('Pi exec aborted'))\n if (options.signal?.aborted) onAbort()\n else options.signal?.addEventListener('abort', onAbort, { once: true })\n if (typeof options.timeout === 'number' && Number.isFinite(options.timeout) && options.timeout > 0) {\n timer = setTimeout(() => abort(new Error(`Pi exec timed out after ${options.timeout}ms`)), options.timeout)\n }\n return {\n signal: controller.signal,\n killed: () => killed,\n cleanup() {\n if (timer !== undefined) clearTimeout(timer)\n options.signal?.removeEventListener('abort', onAbort)\n },\n }\n}\n\nasync function executePiCommand(\n service: DshSubprocessService,\n cwd: string,\n command: string,\n args: string[],\n options: PiExecOptions,\n): Promise<{ stdout: string; stderr: string; code: number; killed: boolean }> {\n const operation = combineExecSignal(options)\n try {\n if (typeof command !== 'string' || command.length === 0) throw new TypeError('Pi exec command must be a non-empty string')\n if (!Array.isArray(args) || args.some(value => typeof value !== 'string')) throw new TypeError('Pi exec args must be strings')\n const executable = await service.resolveExecutable(command, undefined, operation.signal)\n const collect = { maxBytes: 64 * 1024 * 1024 }\n const handle = service.spawn({\n argv: [executable, ...args],\n cwd: options.cwd ?? cwd,\n stdio: { stdin: 'ignore', stdout: collect, stderr: collect },\n graceMs: 5_000,\n signal: operation.signal,\n })\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n const truncation = [stdout?.lossy ? 'stdout' : '', stderr?.lossy ? 'stderr' : ''].filter(Boolean)\n return {\n stdout: stdout?.text ?? '',\n stderr: `${stderr?.text ?? ''}${truncation.length === 0 ? '' : `\\n[pi2dsh: ${truncation.join(' and ')} exceeded the 64 MiB compatibility limit]`}`,\n code: outcome.exitCode ?? 0,\n killed: operation.killed(),\n }\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n code: operation.signal.aborted ? 0 : 1,\n killed: operation.killed(),\n }\n } finally {\n operation.cleanup()\n }\n}\n\nfunction dshCommandName(ctx: Context, piName: string): string {\n // DSH command names are /^[a-z][a-z0-9_-]*$/; Pi allows richer names like\n // \"btw:tangent\". Normalize instead of refusing the whole package.\n const normalized = piName.toLowerCase().replace(/[^a-z0-9_-]+/gu, '-').replace(/^[^a-z]+/u, '')\n const name = normalized.length > 0 ? normalized : 'pi-command'\n if (name !== piName) logger(ctx).warn(`[pi2dsh] Pi command /${piName} registered as /${name} to satisfy DSH command naming`)\n return name\n}\n\nfunction registerCommand(ctx: Context, state: RuntimeState, command: PiCommand): void {\n if (state.commands.has(command.name)) throw new Error(`Pi command ${JSON.stringify(command.name)} is already registered`)\n state.commands.set(command.name, command)\n const commands = (ctx as unknown as { get(name: string): unknown }).get('commands') as {\n register(definition: UnknownRecord): () => void\n } | undefined\n if (commands === undefined) {\n logger(ctx).warn(`[pi2dsh] command /${command.name} was not registered because this DSH composition has no ctx.commands`)\n return\n }\n commands.register({\n name: dshCommandName(ctx, command.name),\n description: command.description || `Migrated Pi command /${command.name}`,\n ...(command.argumentHint !== undefined ? { input: { hint: command.argumentHint } } : {}),\n async handler(invocation: UnknownRecord) {\n const agent = invocation.agent as UnknownRecord\n const commandContext = contextFor(ctx, state, agent, invocation.signal as AbortSignal, true)\n await state.agentScope.run(agent, () => command.handler(String(invocation.rawInput ?? '').trimStart(), commandContext))\n const notices = commandContext.__notices as string[]\n return { kind: 'success', ...(notices.length > 0 ? { text: notices.join('\\n') } : {}) }\n },\n })\n}\n\nfunction requireSession(state: RuntimeState, operation: string): { id: string; events: unknown } {\n const agent = currentAgent(state)\n const session = agentSession(agent)\n if (session === undefined) {\n throw new Error(`pi2dsh: ${operation} requires one active DSH agent with a durable session`)\n }\n return session\n}\n\nfunction createPiApi(ctx: Context, state: RuntimeState): UnknownRecord {\n return {\n on(event: string, handler: PiHandler) {\n const list = state.handlers.get(event) ?? []\n list.push(handler)\n state.handlers.set(event, list)\n },\n registerTool: (tool: PiTool) => registerTool(ctx, state, tool),\n unregisterTool: (name: string) => unregisterTool(state, name),\n registerCommand(name: string, options: UnknownRecord) {\n registerCommand(ctx, state, {\n name,\n description: typeof options.description === 'string' ? options.description : `Migrated Pi command /${name}`,\n ...(typeof options.argumentHint === 'string' ? { argumentHint: options.argumentHint } : {}),\n handler: options.handler as PiCommand['handler'],\n })\n },\n // Registered and introspectable; DSH surfaces have no terminal key\n // bindings, so handlers never fire — the same as Pi's non-TUI modes.\n registerShortcut(shortcut: string, options: UnknownRecord) {\n state.shortcuts.set(shortcut, options)\n },\n registerFlag(name: string, options: UnknownRecord) {\n state.flags.set(name, options.default as boolean | string | undefined)\n logger(ctx).warn(`[pi2dsh] Pi flag --${name} uses its default only; DSH CLI registration is unsupported`)\n },\n getFlag: (name: string) => state.flags.get(name),\n registerProvider(providerOrName: unknown, config?: UnknownRecord) {\n const name = typeof providerOrName === 'string'\n ? providerOrName\n : String((providerOrName as UnknownRecord | undefined)?.name ?? 'unnamed')\n const value = typeof providerOrName === 'string' ? config ?? {} : providerOrName as UnknownRecord\n state.providers.set(name, value)\n logger(ctx).info(`[pi2dsh] recorded Pi provider ${JSON.stringify(name)}; model calls stay on DSH llm adapters`)\n },\n unregisterProvider(name: string) {\n state.providers.delete(name)\n },\n // Renderer registrations are accepted verbatim; DSH owns presentation, so\n // they are never invoked — matching Pi's own non-TUI surfaces.\n registerMessageRenderer(customType: string, renderer: unknown) {\n state.messageRenderers.set(customType, renderer)\n },\n registerEntryRenderer(customType: string, renderer: unknown) {\n state.entryRenderers.set(customType, renderer)\n },\n registerMarkdownTransformer(transformer: unknown) {\n state.markdownTransformer = transformer\n },\n sendMessage(message: UnknownRecord, options: UnknownRecord = {}) {\n requireAgent(state, 'sendMessage')\n const mode = options.deliverAs === 'steer'\n ? 'steer'\n : options.deliverAs === 'followUp' || options.deliverAs === 'nextTurn' || options.triggerTurn === true\n ? 'followup'\n : 'inject'\n return sendPiMessage(ctx, state, message.content, mode)\n },\n sendUserMessage(content: unknown, options: UnknownRecord = {}) {\n requireAgent(state, 'sendUserMessage')\n return sendPiMessage(ctx, state, content, options.deliverAs === 'steer' ? 'steer' : 'followup')\n },\n appendEntry(customType: string, data?: unknown) {\n const session = requireSession(state, 'appendEntry')\n state.bridge.appendCustomEntry(session.id, customType, data)\n },\n setSessionName(name: string) {\n const session = requireSession(state, 'setSessionName')\n state.bridge.setName(session.id, String(name))\n void dispatch(state, 'session_info_changed', {\n type: 'session_info_changed',\n name: state.bridge.getName(session.id),\n }, contextFor(ctx, state, currentAgent(state), undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] session_info_changed handler failed: ${String(error)}`))\n },\n getSessionName() {\n const agent = currentAgent(state)\n const session = agentSession(agent)\n return session === undefined ? undefined : state.bridge.getName(session.id)\n },\n setLabel(entryId: string, label: string | undefined) {\n const session = requireSession(state, 'setLabel')\n state.bridge.appendLabel(session.id, String(entryId), label)\n },\n exec(command: string, args: string[] = [], options: PiExecOptions = {}) {\n const service = optionalService<DshSubprocessService>(ctx, 'subprocess')\n if (service === undefined) unsupported('exec')\n return executePiCommand(service, cwdOf(currentAgent(state)), command, args, options)\n },\n getActiveTools: () => getActiveTools(ctx, state),\n getAllTools: () => toolRuntime(ctx, currentAgent(state)).schemas(currentAgent(state)).map(tool => ({\n name: tool.name,\n description: tool.description ?? '',\n parameters: tool.parameters ?? {},\n source: state.tools.has(tool.name) ? 'extension' : 'builtin',\n sourceInfo: { path: '', source: state.tools.has(tool.name) ? 'pi2dsh' : 'dsh', scope: 'session', origin: 'runtime' },\n })),\n setActiveTools: (names: string[]) => setActiveTools(ctx, state, names),\n getCommands: () => [...state.commands.values()].map(command => ({\n name: command.name,\n description: command.description,\n source: 'extension',\n sourceInfo: { path: '', source: 'pi2dsh', scope: 'user', origin: 'package' },\n })),\n async setModel(model: UnknownRecord) {\n const agent = currentAgent(state)\n if (agent === undefined) return false\n const override = {\n ...(typeof model?.provider === 'string' ? { provider: model.provider } : {}),\n ...(typeof model?.id === 'string' ? { model: model.id } : {}),\n }\n if (override.model === undefined) return false\n state.modelOverrides.set(agent, override)\n const previous = state.modelOverrides.get(agent)\n void dispatch(state, 'model_select', {\n type: 'model_select', model, previousModel: previous, source: 'set',\n }, contextFor(ctx, state, agent, undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] model_select handler failed: ${String(error)}`))\n return true\n },\n getThinkingLevel: () => thinkingLevelOf(state, currentAgent(state)),\n setThinkingLevel(level: string) {\n const agent = currentAgent(state)\n const previousLevel = thinkingLevelOf(state, agent)\n if (agent === undefined) state.globalThinkingLevel = String(level)\n else state.thinkingLevels.set(agent, String(level))\n void dispatch(state, 'thinking_level_select', {\n type: 'thinking_level_select', level: String(level), previousLevel,\n }, contextFor(ctx, state, agent, undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] thinking_level_select handler failed: ${String(error)}`))\n },\n events: {\n emit(channel: string, data: unknown) {\n state.eventBus.emit(channel, data)\n },\n on(channel: string, handler: (data: unknown) => unknown) {\n const safeHandler = (data: unknown) => {\n Promise.resolve(handler(data)).catch(error => logger(ctx).warn(`[pi2dsh] package event ${channel} handler failed: ${String(error)}`))\n }\n state.eventBus.on(channel, safeHandler)\n return () => state.eventBus.off(channel, safeHandler)\n },\n },\n }\n}\n\nfunction splitArguments(input: string): string[] {\n const values: string[] = []\n let current = ''\n let quote: string | undefined\n for (const character of input) {\n if (quote !== undefined) {\n if (character === quote) quote = undefined\n else current += character\n } else if (character === '\"' || character === \"'\") {\n quote = character\n } else if (/\\s/u.test(character)) {\n if (current.length > 0) {\n values.push(current)\n current = ''\n }\n } else {\n current += character\n }\n }\n if (current.length > 0) values.push(current)\n return values\n}\n\nfunction promptBody(text: string): string {\n const normalized = text.replace(/\\r\\n?/gu, '\\n')\n if (!normalized.startsWith('---')) return normalized\n const endIndex = normalized.indexOf('\\n---', 3)\n if (endIndex === -1) return normalized\n return normalized.slice(endIndex + 4).trim()\n}\n\nfunction expandPrompt(text: string, rawInput: string): string {\n const args = splitArguments(rawInput)\n const all = args.join(' ')\n return promptBody(text).replace(\n /\\$\\{(\\d+|ARGUMENTS|@):-([^}]*)\\}|\\$\\{@:(\\d+)(?::(\\d+))?\\}|\\$(ARGUMENTS|@|\\d+)/gu,\n (_match, defaultTarget: string | undefined, fallback: string | undefined, sliceStart: string | undefined, sliceLength: string | undefined, simple: string | undefined) => {\n if (defaultTarget !== undefined) {\n const value = defaultTarget === '@' || defaultTarget === 'ARGUMENTS'\n ? all\n : args[Number(defaultTarget) - 1]\n return value || fallback || ''\n }\n if (sliceStart !== undefined) {\n const offset = Math.max(0, Number(sliceStart) - 1)\n return args.slice(offset, sliceLength === undefined ? undefined : offset + Number(sliceLength)).join(' ')\n }\n if (simple === '@' || simple === 'ARGUMENTS') return all\n return args[Number(simple) - 1] ?? ''\n },\n )\n}\n\nasync function registerPromptCommands(ctx: Context, state: RuntimeState, rootDir: string, manifest: GeneratedRuntimeManifest): Promise<void> {\n for (const prompt of manifest.prompts) {\n const text = await readFile(join(rootDir, prompt.path), 'utf8')\n registerCommand(ctx, state, {\n name: prompt.name,\n description: prompt.description,\n ...(prompt.argumentHint !== undefined ? { argumentHint: prompt.argumentHint } : {}),\n handler(rawInput, commandContext) {\n const agent = (commandContext as UnknownRecord).__agent as UnknownRecord | undefined\n const invocationAgent = agent ?? [...state.activeAgents][0]\n if (invocationAgent === undefined || typeof invocationAgent.steer !== 'function') {\n throw new Error(`pi2dsh: /${prompt.name} requires a live DSH agent`)\n }\n invocationAgent.steer(createUserMessage({\n content: [{ type: 'text', text: expandPrompt(text, rawInput) }],\n source: { kind: 'plugin', plugin: `pi2dsh:${manifest.package.name}`, form: 'relay' },\n }))\n },\n })\n }\n}\n\nasync function loadExtensions(\n rootDir: string,\n manifest: GeneratedRuntimeManifest,\n api: UnknownRecord,\n onExtensionError?: (failure: string) => void,\n): Promise<void> {\n const resolveShim = async (name: string): Promise<string> => {\n const compiled = fileURLToPath(new URL(`./compat/${name}.mjs`, import.meta.url))\n try {\n await access(compiled)\n return compiled\n } catch {\n return fileURLToPath(new URL(`./compat/${name}.ts`, import.meta.url))\n }\n }\n const [codingAgentShim, tuiShim, aiShim] = await Promise.all([\n resolveShim('pi-coding-agent'),\n resolveShim('pi-tui'),\n resolveShim('pi-ai'),\n ])\n const aliases: Record<string, string> = {}\n for (const family of ['@earendil-works', '@mariozechner']) {\n aliases[`${family}/pi-coding-agent`] = codingAgentShim\n aliases[`${family}/pi-tui`] = tuiShim\n aliases[`${family}/pi-ai`] = aiShim\n // Pi resolves subpath entries of pi-ai (compat superset, oauth, provider\n // catalogs) for extensions; all of them land on the same shim surface.\n aliases[`${family}/pi-ai/compat`] = aiShim\n aliases[`${family}/pi-ai/oauth`] = aiShim\n aliases[`${family}/pi-ai/providers/all`] = aiShim\n }\n // Pi's loader hands extensions the host's typebox without a declaration;\n // mirror that by resolving every typebox entry the whitelist names to the\n // bridge's own copy.\n // typebox restricts its exports map (no ./package.json), so resolve each\n // public entry directly; resolution anchors at this runtime file, which in a\n // generated bundle sits next to the bundle's own node_modules.\n const require = createRequire(import.meta.url)\n for (const entry of ['typebox', 'typebox/value', 'typebox/compile']) {\n try {\n const resolved = require.resolve(entry)\n aliases[entry] = resolved\n aliases[entry.replace('typebox', '@sinclair/typebox')] = resolved\n } catch {\n // Without a resolvable typebox entry extensions fall back to normal\n // resolution against their own dependencies.\n }\n }\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n alias: aliases,\n })\n // Pi's loader isolates per-extension failures: one broken entry reports and\n // the rest keep loading. A package whose every entry fails still errors.\n const failures: string[] = []\n let mounted = 0\n for (const extension of manifest.extensions) {\n try {\n const loaded: unknown = await jiti.import(join(rootDir, extension))\n const candidate = typeof loaded === 'object' && loaded !== null && 'default' in loaded\n ? (loaded as { default: unknown }).default\n : loaded\n if (typeof candidate !== 'function') throw new TypeError(`Pi extension ${extension} has no default factory function`)\n await candidate(api)\n mounted += 1\n } catch (error) {\n failures.push(`${extension}: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (failures.length > 0 && mounted === 0 && manifest.extensions.length > 0) {\n throw new Error(`every Pi extension entry failed to load:\\n${failures.map(item => `- ${item}`).join('\\n')}`)\n }\n for (const failure of failures) onExtensionError?.(failure)\n}\n\nexport async function applyPiPackage(ctx: Context, options: RuntimeOptions): Promise<void> {\n if (options.manifest.schemaVersion !== 1) throw new Error(`unsupported pi2dsh manifest version ${String(options.manifest.schemaVersion)}`)\n const rootDir = fileURLToPath(options.rootUrl)\n const state: RuntimeState = {\n handlers: new Map(),\n tools: new Map(),\n toolDisposers: new Map(),\n toolRestrictions: new WeakMap(),\n commands: new Map(),\n flags: new Map(),\n notifications: [],\n activeAgents: new Set(),\n disposedAgents: new WeakSet(),\n currentSystemPrompt: '',\n messageSource: `pi2dsh:${options.manifest.package.name}`,\n eventBus: new EventEmitter(),\n agentScope: new AsyncLocalStorage(),\n bridge: new PiSessionBridge(),\n theme: new Theme(),\n shortcuts: new Map(),\n messageRenderers: new Map(),\n entryRenderers: new Map(),\n providers: new Map(),\n autocompleteProviders: [],\n editorBuffers: new WeakMap(),\n toolsExpanded: false,\n modelOverrides: new WeakMap(),\n thinkingLevels: new WeakMap(),\n globalThinkingLevel: 'off',\n argMutations: new WeakMap(),\n streamingTexts: new Map(),\n lastLoggedModels: new WeakMap(),\n }\n subscribeLifecycle(ctx, state)\n subscribeInterceptors(ctx, state)\n if (options.manifest.skillDirs.length > 0) {\n const skills = (ctx as unknown as { get(name: string): unknown }).get('skills')\n if (skills === undefined) logger(ctx).warn('[pi2dsh] migrated skills were not mounted because this DSH composition has no ctx.skills')\n else {\n const { apply: applyFilesystemSkills } = await import('@deepseek-ai/dsh-skill-filesystem')\n applyFilesystemSkills(ctx, {\n providerName: `pi2dsh-${options.manifest.package.name.replace(/[^a-zA-Z0-9_-]+/gu, '-').replace(/^-+|-+$/gu, '')}`,\n includeDefaultRoots: false,\n customSkillDirs: options.manifest.skillDirs.map(path => join(rootDir, path)),\n watch: false,\n })\n }\n }\n await registerPromptCommands(ctx, state, rootDir, options.manifest)\n await loadExtensions(rootDir, options.manifest, createPiApi(ctx, state),\n failure => logger(ctx).warn(`[pi2dsh] extension entry failed and was skipped (matching Pi's per-extension error isolation): ${failure}`))\n logger(ctx).info(`[pi2dsh] loaded ${options.manifest.package.name}: ${state.tools.size} tools, ${state.commands.size} commands, ${options.manifest.skillDirs.length} skill roots`)\n}\n\nexport const runtimeInternals = {\n expandPrompt,\n normalizeToolResult,\n splitArguments,\n textBlocks,\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-D7Ir-rPT.mjs","names":[],"sources":["../src/source.ts"],"sourcesContent":["import { access, mkdtemp, readFile, rm, stat } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path'\nimport { glob } from 'tinyglobby'\nimport type { ResolvedPiPackage, ResourceInventory } from './types.js'\n\ntype PiManifest = Partial<Record<'extensions' | 'skills' | 'prompts' | 'themes', string[]>>\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await access(path)\n return true\n } catch {\n return false\n }\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every(item => typeof item === 'string') ? value : undefined\n}\n\nfunction piManifest(packageJson: Record<string, unknown>): PiManifest | undefined {\n const raw = packageJson.pi\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return undefined\n const record = raw as Record<string, unknown>\n const extensions = stringArray(record.extensions)\n const skills = stringArray(record.skills)\n const prompts = stringArray(record.prompts)\n const themes = stringArray(record.themes)\n return {\n ...(extensions !== undefined ? { extensions } : {}),\n ...(skills !== undefined ? { skills } : {}),\n ...(prompts !== undefined ? { prompts } : {}),\n ...(themes !== undefined ? { themes } : {}),\n }\n}\n\nconst DEFAULT_PATTERNS: Record<keyof ResourceInventory, string[]> = {\n extensions: ['extensions/**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}'],\n skills: ['skills/**/*'],\n prompts: ['prompts/*.md'],\n themes: ['themes/*.json'],\n}\n\nconst FILE_PATTERNS: Record<keyof ResourceInventory, string> = {\n extensions: '**/*.{ts,tsx,js,jsx,mts,mjs,cts,cjs}',\n skills: '**/*',\n prompts: '**/*.md',\n themes: '**/*.json',\n}\n\nfunction safePattern(pattern: string): string {\n const normalized = pattern.replaceAll('\\\\', '/')\n const positive = normalized.startsWith('!') ? normalized.slice(1) : normalized\n if (isAbsolute(positive) || positive.split('/').includes('..')) {\n throw new Error(`resource pattern must stay inside the Pi package: ${JSON.stringify(pattern)}`)\n }\n return normalized\n}\n\nasync function patternsFor(\n rootDir: string,\n kind: keyof ResourceInventory,\n configured: string[] | undefined,\n): Promise<string[]> {\n if (configured === undefined) return DEFAULT_PATTERNS[kind]\n const output: string[] = []\n for (const raw of configured) {\n const pattern = safePattern(raw)\n if (pattern.startsWith('!')) {\n output.push(pattern)\n continue\n }\n const absolute = resolve(rootDir, pattern)\n try {\n const info = await stat(absolute)\n output.push(info.isDirectory() ? `${pattern.replace(/\\/$/u, '')}/${FILE_PATTERNS[kind]}` : pattern)\n } catch {\n output.push(pattern)\n }\n }\n return output\n}\n\nasync function discoverResources(rootDir: string, packageJson: Record<string, unknown>): Promise<ResourceInventory> {\n const manifest = piManifest(packageJson)\n const discover = async (kind: keyof ResourceInventory): Promise<string[]> => {\n const patterns = await patternsFor(rootDir, kind, manifest?.[kind])\n const matches = await glob(patterns, {\n cwd: rootDir,\n absolute: true,\n onlyFiles: true,\n dot: false,\n followSymbolicLinks: false,\n })\n return matches.sort()\n }\n return {\n extensions: await discover('extensions'),\n skills: await discover('skills'),\n prompts: await discover('prompts'),\n themes: await discover('themes'),\n }\n}\n\nfunction packageIdentity(packageJson: Record<string, unknown>, source: string, fallbackName: string) {\n return {\n name: typeof packageJson.name === 'string' ? packageJson.name : fallbackName,\n version: typeof packageJson.version === 'string' ? packageJson.version : '0.0.0-local',\n source,\n }\n}\n\nasync function readPackageJson(rootDir: string): Promise<Record<string, unknown>> {\n const text = await readFile(join(rootDir, 'package.json'), 'utf8')\n const parsed: unknown = JSON.parse(text)\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error('package.json must contain an object')\n }\n return parsed as Record<string, unknown>\n}\n\nexport async function resolvePiPackage(source: string, cwd = process.cwd()): Promise<ResolvedPiPackage> {\n const localCandidate = resolve(cwd, source.replace(/^file:/u, ''))\n const local = source.startsWith('.')\n || source.startsWith('/')\n || source.startsWith('file:')\n || await exists(localCandidate)\n let rootDir: string\n let temporary = false\n let packageJson: Record<string, unknown>\n\n if (local) {\n const requested = localCandidate\n const info = await stat(requested)\n if (info.isFile()) {\n rootDir = dirname(requested)\n const packagePath = join(rootDir, 'package.json')\n packageJson = await exists(packagePath)\n ? await readPackageJson(rootDir)\n : { name: basename(requested).replace(/\\.[^.]+$/u, ''), pi: { extensions: [basename(requested)] } }\n } else {\n rootDir = requested\n packageJson = await readPackageJson(rootDir)\n }\n } else {\n rootDir = await mkdtemp(join(tmpdir(), 'pi2dsh-source-'))\n temporary = true\n try {\n // Lazy: only npm-spec resolution needs the registry client. Host\n // bundles resolve installed directories and never load pacote.\n const { default: pacote } = await import('pacote')\n await pacote.extract(source, rootDir)\n packageJson = await readPackageJson(rootDir)\n } catch (error) {\n await rm(rootDir, { recursive: true, force: true })\n throw error\n }\n }\n\n const resources = await discoverResources(rootDir, packageJson)\n const identity = packageIdentity(packageJson, source, basename(rootDir))\n return {\n rootDir,\n temporary,\n identity,\n packageJson,\n resources,\n async dispose() {\n if (temporary) await rm(rootDir, { recursive: true, force: true })\n },\n }\n}\n"],"mappings":"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"}
|