@code-yeongyu/senpi 2026.10.10-4 → 2026.10.10-6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/bundle/chunks/{anthropic-messages-OE3QBX4P.js → anthropic-messages-DUULMQBF.js} +1 -1
  3. package/dist/bundle/chunks/{app-server-command-N3L2LNP7.js → app-server-command-GJ5NXQSY.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-3A3C5VVO.js → chunk-3OGEJMZ7.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-J5MUMVWB.js → chunk-64ZVBCTL.js} +8 -7
  6. package/dist/bundle/chunks/{chunk-MP2DMTI7.js → chunk-C7LEZMWS.js} +124 -124
  7. package/dist/bundle/chunks/{chunk-ZSYRWQWG.js → chunk-JMI5OCIJ.js} +1 -1
  8. package/dist/bundle/chunks/{chunk-ODYQK5XJ.js → chunk-TALS4X7S.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-7GVD54RM.js → chunk-U3IL5N76.js} +1 -1
  10. package/dist/bundle/chunks/{chunk-H67EVDWG.js → chunk-URQSNRHZ.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-H4UIUFU5.js → chunk-VGYIPYOK.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-M2IHGL3M.js → chunk-VW74BGIC.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-4TK7VCZZ.js → chunk-WKMUAG23.js} +1 -1
  14. package/dist/bundle/chunks/chunk-YG5UO3E4.js +7 -0
  15. package/dist/bundle/chunks/chunk-YV2XQFXG.js +14 -0
  16. package/dist/bundle/chunks/{chunk-Z7MMKKIY.js → chunk-ZYHIRFGT.js} +1 -1
  17. package/dist/bundle/chunks/{cli-main-CHDR33FZ.js → cli-main-SZ54SQLA.js} +1 -1
  18. package/dist/bundle/chunks/{help-fast-path-EHRZEBRO.js → help-fast-path-W5W3FYYM.js} +1 -1
  19. package/dist/bundle/chunks/{host-command-VATE7HRG.js → host-command-YG2FIDPN.js} +1 -1
  20. package/dist/bundle/chunks/{host-lifecycle-GC3GIR2N.js → host-lifecycle-5AV4JXDQ.js} +1 -1
  21. package/dist/bundle/chunks/{interactive-mode-RVEM62WX.js → interactive-mode-SCNDQ4R6.js} +1 -1
  22. package/dist/bundle/chunks/{list-tips-IIRFXBTO.js → list-tips-BXAA4FG5.js} +1 -1
  23. package/dist/bundle/chunks/{multi-session-host-CFND7CXH.js → multi-session-host-ZDZMPNP5.js} +7 -6
  24. package/dist/bundle/chunks/{package-manager-cli-NWNECBF7.js → package-manager-cli-4LMYHHKH.js} +1 -1
  25. package/dist/bundle/chunks/{rotation-stream-C5BM7TMM.js → rotation-stream-E3XKSST7.js} +1 -1
  26. package/dist/bundle/chunks/{rpc-mode-JQFUDLNB.js → rpc-mode-ZFNFREN5.js} +1 -1
  27. package/dist/bundle/chunks/{schedule-command-EQ4PQCRP.js → schedule-command-K6CTAB4T.js} +1 -1
  28. package/dist/bundle/chunks/{session-control-endpoint-HMB5T5VD.js → session-control-endpoint-MVSYBGM3.js} +1 -1
  29. package/dist/bundle/chunks/{session-picker-O7OESJWU.js → session-picker-TNXWY5QY.js} +1 -1
  30. package/dist/bundle/chunks/session-worker.js +224 -222
  31. package/dist/bundle/cli.js +1 -1
  32. package/dist/bundle/index.js +1 -1
  33. package/dist/bundle/rpc-entry.js +1 -1
  34. package/dist/bundle/runtime-manifest.json +1 -1
  35. package/dist/core/agent-session-runtime.d.ts +6 -0
  36. package/dist/core/agent-session-runtime.js +18 -0
  37. package/dist/core/agent-session.js +5 -2
  38. package/dist/core/extensions/builtin/anthropic-subscription/auth-lane.js +3 -2
  39. package/dist/core/extensions/builtin/anthropic-subscription/options.js +11 -2
  40. package/dist/core/extensions/builtin/anthropic-subscription/session-reattach.js +4 -1
  41. package/dist/core/extensions/builtin/anthropic-subscription/session-sync.js +3 -0
  42. package/dist/core/extensions/builtin/anthropic-subscription/settings.d.ts +5 -0
  43. package/dist/core/extensions/builtin/anthropic-subscription/settings.js +11 -0
  44. package/dist/core/extensions/builtin/anthropic-subscription/stream.d.ts +1 -0
  45. package/dist/core/extensions/builtin/anthropic-subscription/stream.js +17 -1
  46. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +20 -12
  47. package/dist/core/extensions/builtin/compaction/lane-policy.js +39 -34
  48. package/dist/core/extensions/builtin/html-render/bootstrap.d.ts +15 -0
  49. package/dist/core/extensions/builtin/html-render/bootstrap.js +123 -0
  50. package/dist/core/extensions/builtin/html-render/images.d.ts +16 -0
  51. package/dist/core/extensions/builtin/html-render/images.js +155 -0
  52. package/dist/core/extensions/builtin/html-render/index.d.ts +3 -0
  53. package/dist/core/extensions/builtin/html-render/index.js +5 -0
  54. package/dist/core/extensions/builtin/html-render/tool.d.ts +19 -0
  55. package/dist/core/extensions/builtin/html-render/tool.js +74 -0
  56. package/dist/core/extensions/builtin/index.js +4 -0
  57. package/dist/core/extensions/builtin/mcp/auth/catalog-identity.d.ts +4 -0
  58. package/dist/core/extensions/builtin/mcp/auth/catalog-identity.js +41 -0
  59. package/dist/core/extensions/builtin/mcp/auth/legacy-lock.d.ts +3 -0
  60. package/dist/core/extensions/builtin/mcp/auth/legacy-lock.js +39 -0
  61. package/dist/core/extensions/builtin/mcp/auth/legacy-migration.d.ts +14 -0
  62. package/dist/core/extensions/builtin/mcp/auth/legacy-migration.js +91 -0
  63. package/dist/core/extensions/builtin/mcp/auth/oauth-refresh.js +1 -1
  64. package/dist/core/extensions/builtin/mcp/auth/token-store.d.ts +1 -0
  65. package/dist/core/extensions/builtin/mcp/auth/token-store.js +19 -90
  66. package/dist/core/extensions/builtin/mcp/catalog-cache.d.ts +7 -3
  67. package/dist/core/extensions/builtin/mcp/catalog-cache.js +61 -12
  68. package/dist/core/extensions/builtin/mcp/catalog.d.ts +3 -1
  69. package/dist/core/extensions/builtin/mcp/catalog.js +2 -0
  70. package/dist/core/extensions/builtin/mcp/connection-types.d.ts +2 -0
  71. package/dist/core/extensions/builtin/mcp/expose/call.d.ts +12 -0
  72. package/dist/core/extensions/builtin/mcp/expose/call.js +60 -0
  73. package/dist/core/extensions/builtin/mcp/expose/proxy.js +16 -3
  74. package/dist/core/extensions/builtin/mcp/expose/register.d.ts +3 -1
  75. package/dist/core/extensions/builtin/mcp/expose/register.js +41 -50
  76. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +4 -0
  77. package/dist/core/extensions/builtin/mcp/expose/session.js +5 -1
  78. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +15 -4
  79. package/dist/core/extensions/builtin/mcp/index.js +5 -26
  80. package/dist/core/extensions/builtin/mcp/invocation.d.ts +42 -0
  81. package/dist/core/extensions/builtin/mcp/invocation.js +118 -0
  82. package/dist/core/extensions/builtin/mcp/service-connection.d.ts +3 -0
  83. package/dist/core/extensions/builtin/mcp/service-connection.js +6 -0
  84. package/dist/core/extensions/builtin/mcp/service-register.d.ts +4 -0
  85. package/dist/core/extensions/builtin/mcp/service-register.js +45 -1
  86. package/dist/core/extensions/builtin/mcp/service-tools-changed.js +26 -3
  87. package/dist/core/extensions/builtin/mcp/service-types.d.ts +6 -0
  88. package/dist/core/extensions/builtin/mcp/service.js +83 -49
  89. package/dist/core/extensions/builtin/mcp/shared-connection.js +17 -4
  90. package/dist/core/extensions/builtin/mcp/sharing-policy.js +1 -0
  91. package/dist/core/extensions/builtin/mcp/startup-race.js +47 -9
  92. package/dist/core/extensions/builtin/permission-system/dispatch-metadata.d.ts +8 -0
  93. package/dist/core/extensions/builtin/permission-system/dispatch-metadata.js +23 -0
  94. package/dist/core/extensions/builtin/permission-system/dispatch-policy.d.ts +14 -0
  95. package/dist/core/extensions/builtin/permission-system/dispatch-policy.js +53 -0
  96. package/dist/core/extensions/builtin/permission-system/dispatch.d.ts +33 -0
  97. package/dist/core/extensions/builtin/permission-system/dispatch.js +106 -0
  98. package/dist/core/extensions/builtin/permission-system/index.js +64 -17
  99. package/dist/core/extensions/builtin/permission-system/prompt.d.ts +1 -1
  100. package/dist/core/extensions/builtin/permission-system/prompt.js +3 -1
  101. package/dist/core/extensions/builtin/permission-system/service.d.ts +11 -1
  102. package/dist/core/extensions/builtin/permission-system/service.js +14 -4
  103. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.d.ts +1 -0
  104. package/dist/core/extensions/builtin/ttsr/detectors/collapse-near-duplicates.js +24 -5
  105. package/dist/index.d.ts +1 -1
  106. package/dist/index.js +1 -1
  107. package/dist/modes/interactive/interactive-mode.js +21 -4
  108. package/dist/modes/rpc/host-reservations.d.ts +1 -1
  109. package/dist/modes/rpc/host-reservations.js +9 -3
  110. package/dist/modes/rpc/rpc-client.js +14 -2
  111. package/dist/modes/rpc/rpc-request-deadline.d.ts +8 -0
  112. package/dist/modes/rpc/rpc-request-deadline.js +10 -0
  113. package/dist/modes/rpc/rpc-types.d.ts +7 -4
  114. package/dist/modes/rpc/session-binding.js +15 -1
  115. package/dist/modes/rpc/session-command-router.d.ts +1 -0
  116. package/dist/modes/rpc/session-command-router.js +16 -0
  117. package/dist/modes/rpc/session-registry-attach.js +8 -2
  118. package/dist/modes/rpc/session-registry.js +5 -7
  119. package/dist/modes/rpc/session-teardown.d.ts +6 -1
  120. package/dist/modes/rpc/session-teardown.js +26 -7
  121. package/dist/modes/rpc/session-worker-client.d.ts +2 -0
  122. package/dist/modes/rpc/session-worker-client.js +6 -0
  123. package/dist/modes/rpc/session-worker-protocol.d.ts +4 -0
  124. package/dist/modes/rpc/session-worker.js +6 -0
  125. package/dist/modes/rpc/worker-session-registry.js +6 -1
  126. package/docs/providers.md +3 -2
  127. package/docs/rpc.md +26 -10
  128. package/package.json +6 -6
  129. package/dist/bundle/chunks/chunk-RADHRQ4K.js +0 -7
  130. package/dist/bundle/chunks/chunk-USRAHAW4.js +0 -14
@@ -5,14 +5,15 @@ import{__export}from"./chunk-IKOFCODM.js";function parseTmuxKittyTerminalOverrid
5
5
  `))return"shift+enter";let legacySequenceKeyId=LEGACY_SEQUENCE_KEY_IDS[data];if(legacySequenceKeyId)return legacySequenceKeyId;if(data==="\x1B")return"escape";if(data==="")return"ctrl+\\";if(data==="")return"ctrl+]";if(data==="")return"ctrl+-";if(data==="\x1B\x1B")return"ctrl+alt+[";if(data==="\x1B")return"ctrl+alt+\\";if(data==="\x1B")return"ctrl+alt+]";if(data==="\x1B")return"ctrl+alt+-";if(data===" ")return"tab";if(data==="\r"||!_kittyProtocolActive&&data===`
6
6
  `||data==="\x1BOM")return"enter";if(data==="\0")return"ctrl+space";if(data===" ")return"space";if(data==="\x7F")return"backspace";if(data==="\b")return isWindowsTerminalSession()?"ctrl+backspace":"backspace";if(data==="\x1B[Z")return"shift+tab";if(!_kittyProtocolActive&&data==="\x1B\r")return"alt+enter";if(!_kittyProtocolActive&&data==="\x1B ")return"alt+space";if(data==="\x1B\x7F"||data==="\x1B\b")return"alt+backspace";if(!_kittyProtocolActive&&data==="\x1BB")return"alt+left";if(!_kittyProtocolActive&&data==="\x1BF")return"alt+right";if(!_kittyProtocolActive&&data.length===2&&data[0]==="\x1B"){let code=data.charCodeAt(1);if(code>=1&&code<=26)return`ctrl+alt+${String.fromCharCode(code+96)}`;let key=String.fromCharCode(code);if(code>=97&&code<=122||code>=48&&code<=57||SYMBOL_KEYS.has(key))return`alt+${key}`}if(data==="\x1B[A")return"up";if(data==="\x1B[B")return"down";if(data==="\x1B[C")return"right";if(data==="\x1B[D")return"left";if(data==="\x1B[H"||data==="\x1BOH")return"home";if(data==="\x1B[F"||data==="\x1BOF")return"end";if(data==="\x1B[3~")return"delete";if(data==="\x1B[5~")return"pageUp";if(data==="\x1B[6~")return"pageDown";if(data.length===1){let code=data.charCodeAt(0);if(code>=1&&code<=26)return`ctrl+${String.fromCharCode(code+96)}`;if(code>=32&&code<=126)return data}}var KITTY_CSI_U_REGEX=/^\x1b\[(\d+)(?::(\d*))?(?::(\d+))?(?:;(\d+))?(?::(\d+))?u$/,KITTY_PRINTABLE_ALLOWED_MODIFIERS=MODIFIERS.shift|LOCK_MASK;function decodeKittyPrintable(data){let match=data.match(KITTY_CSI_U_REGEX);if(!match)return;let codepoint=Number.parseInt(match[1]??"",10);if(!Number.isFinite(codepoint))return;let shiftedKey=match[2]&&match[2].length>0?Number.parseInt(match[2],10):void 0,modValue=match[4]?Number.parseInt(match[4],10):1,modifier=Number.isFinite(modValue)?modValue-1:0;if((modifier&~KITTY_PRINTABLE_ALLOWED_MODIFIERS)!==0||modifier&(MODIFIERS.alt|MODIFIERS.ctrl))return;let effectiveCodepoint=codepoint;if(modifier&MODIFIERS.shift&&typeof shiftedKey=="number"&&(effectiveCodepoint=shiftedKey),effectiveCodepoint=normalizeKittyFunctionalCodepoint(effectiveCodepoint),!(!Number.isFinite(effectiveCodepoint)||effectiveCodepoint<32))try{return String.fromCodePoint(effectiveCodepoint)}catch{return}}function decodeModifyOtherKeysPrintable(data){let parsed=parseModifyOtherKeysSequence(data);if(!(!parsed||(parsed.modifier&~LOCK_MASK&~MODIFIERS.shift)!==0)&&!(!Number.isFinite(parsed.codepoint)||parsed.codepoint<32))try{return String.fromCodePoint(parsed.codepoint)}catch{return}}function decodePrintableKey(data){return decodeKittyPrintable(data)??decodeModifyOtherKeysPrintable(data)}var TUI_KEYBINDINGS={"tui.editor.cursorUp":{defaultKeys:"up",description:"Move cursor up"},"tui.editor.cursorDown":{defaultKeys:"down",description:"Move cursor down"},"tui.editor.historyPrevious":{defaultKeys:[],description:"Select previous prompt history entry"},"tui.editor.historyNext":{defaultKeys:[],description:"Select next prompt history entry"},"tui.editor.cursorLeft":{defaultKeys:["left","ctrl+b"],description:"Move cursor left"},"tui.editor.cursorRight":{defaultKeys:["right","ctrl+f"],description:"Move cursor right"},"tui.editor.cursorWordLeft":{defaultKeys:["alt+left","ctrl+left","alt+b"],description:"Move cursor word left"},"tui.editor.cursorWordRight":{defaultKeys:["alt+right","ctrl+right","alt+f"],description:"Move cursor word right"},"tui.editor.cursorLineStart":{defaultKeys:["home","ctrl+home","ctrl+a"],description:"Move to line start"},"tui.editor.cursorLineEnd":{defaultKeys:["end","ctrl+end","ctrl+e"],description:"Move to line end"},"tui.editor.jumpForward":{defaultKeys:"ctrl+]",description:"Jump forward to character"},"tui.editor.jumpBackward":{defaultKeys:"ctrl+alt+]",description:"Jump backward to character"},"tui.editor.pageUp":{defaultKeys:["pageUp","ctrl+pageUp"],description:"Page up"},"tui.editor.pageDown":{defaultKeys:["pageDown","ctrl+pageDown"],description:"Page down"},"tui.editor.deleteCharBackward":{defaultKeys:"backspace",description:"Delete character backward"},"tui.editor.deleteCharForward":{defaultKeys:["delete","ctrl+d"],description:"Delete character forward"},"tui.editor.deleteWordBackward":{defaultKeys:["ctrl+w","alt+backspace"],description:"Delete word backward"},"tui.editor.deleteWordForward":{defaultKeys:["alt+d","alt+delete"],description:"Delete word forward"},"tui.editor.deleteToLineStart":{defaultKeys:"ctrl+u",description:"Delete to line start"},"tui.editor.deleteToLineEnd":{defaultKeys:"ctrl+k",description:"Delete to line end"},"tui.editor.yank":{defaultKeys:"ctrl+y",description:"Yank"},"tui.editor.yankPop":{defaultKeys:"alt+y",description:"Yank pop"},"tui.editor.undo":{defaultKeys:"ctrl+-",description:"Undo"},"tui.input.newLine":{defaultKeys:["shift+enter","ctrl+j"],description:"Insert newline"},"tui.input.submit":{defaultKeys:"enter",description:"Submit input"},"tui.input.tab":{defaultKeys:"tab",description:"Tab / autocomplete"},"tui.input.copy":{defaultKeys:"ctrl+c",description:"Copy selection"},"tui.select.up":{defaultKeys:"up",description:"Move selection up"},"tui.select.down":{defaultKeys:"down",description:"Move selection down"},"tui.select.pageUp":{defaultKeys:"pageUp",description:"Selection page up"},"tui.select.pageDown":{defaultKeys:"pageDown",description:"Selection page down"},"tui.select.confirm":{defaultKeys:"enter",description:"Confirm selection"},"tui.select.cancel":{defaultKeys:["escape","ctrl+c"],description:"Cancel selection"},"tui.altScreen.pageUp":{defaultKeys:"pageUp",description:"Scroll viewport up one page"},"tui.altScreen.pageDown":{defaultKeys:"pageDown",description:"Scroll viewport down one page"},"tui.altScreen.halfPageUp":{defaultKeys:[],description:"Scroll viewport up half a page"},"tui.altScreen.halfPageDown":{defaultKeys:[],description:"Scroll viewport down half a page"},"tui.altScreen.lineUp":{defaultKeys:[],description:"Scroll viewport up one line"},"tui.altScreen.lineDown":{defaultKeys:[],description:"Scroll viewport down one line"},"tui.altScreen.previousPrompt":{defaultKeys:["ctrl+shift+up","ctrl+up"],description:"Jump to previous semantic prompt"},"tui.altScreen.nextPrompt":{defaultKeys:["ctrl+shift+down","ctrl+down"],description:"Jump to next semantic prompt"},"tui.altScreen.search":{defaultKeys:"ctrl+shift+f",description:"Search the primary scroll view"},"tui.altScreen.searchNext":{defaultKeys:["enter","ctrl+g"],description:"Select the next search match"},"tui.altScreen.searchPrevious":{defaultKeys:["shift+enter","ctrl+shift+g"],description:"Select the previous search match"},"tui.altScreen.searchClose":{defaultKeys:"escape",description:"Close transcript search"},"tui.altScreen.top":{defaultKeys:"home",description:"Scroll viewport to top"},"tui.altScreen.bottom":{defaultKeys:"end",description:"Scroll viewport to bottom"}};function normalizeKeys(keys){if(keys===void 0)return[];let keyList=Array.isArray(keys)?keys:[keys],seen=new Set,result=[];for(let key of keyList)seen.has(key)||(seen.add(key),result.push(key));return result}var KeybindingsManager=class{constructor(definitions,userBindings={}){this.keysById=new Map,this.conflicts=[],this.definitions=definitions,this.userBindings=userBindings,this.rebuild()}rebuild(){this.keysById.clear(),this.conflicts=[];let userClaims=new Map;for(let[keybinding,keys]of Object.entries(this.userBindings))if(keybinding in this.definitions)for(let key of normalizeKeys(keys)){let claimants=userClaims.get(key)??new Set;claimants.add(keybinding),userClaims.set(key,claimants)}for(let[key,keybindings]of userClaims)keybindings.size>1&&this.conflicts.push({key,keybindings:[...keybindings]});for(let[id,definition]of Object.entries(this.definitions)){let userKeys=this.userBindings[id],keys=normalizeKeys(userKeys===void 0?definition.defaultKeys:userKeys);this.keysById.set(id,keys)}}matches(data,keybinding){let keys=this.keysById.get(keybinding)??[];for(let key of keys)if(matchesKey(data,key))return!0;return!1}getKeys(keybinding){return[...this.keysById.get(keybinding)??[]]}getDefinition(keybinding){return this.definitions[keybinding]}getConflicts(){return this.conflicts.map(conflict=>({...conflict,keybindings:[...conflict.keybindings]}))}setUserBindings(userBindings){this.userBindings=userBindings,this.rebuild()}getUserBindings(){return{...this.userBindings}}getResolvedBindings(){let resolved={};for(let id of Object.keys(this.definitions)){let keys=this.keysById.get(id)??[];resolved[id]=keys.length===1?keys[0]:[...keys]}return resolved}},globalKeybindings=null;function setKeybindings(keybindings){globalKeybindings=keybindings}function getKeybindings(){return globalKeybindings||(globalKeybindings=new KeybindingsManager(TUI_KEYBINDINGS)),globalKeybindings}var ambiguousRanges=[161,161,164,164,167,168,170,170,173,174,176,180,182,186,188,191,198,198,208,208,215,216,222,225,230,230,232,234,236,237,240,240,242,243,247,250,252,252,254,254,257,257,273,273,275,275,283,283,294,295,299,299,305,307,312,312,319,322,324,324,328,331,333,333,338,339,358,359,363,363,462,462,464,464,466,466,468,468,470,470,472,472,474,474,476,476,593,593,609,609,708,708,711,711,713,715,717,717,720,720,728,731,733,733,735,735,768,879,913,929,931,937,945,961,963,969,1025,1025,1040,1103,1105,1105,8208,8208,8211,8214,8216,8217,8220,8221,8224,8226,8228,8231,8240,8240,8242,8243,8245,8245,8251,8251,8254,8254,8308,8308,8319,8319,8321,8324,8364,8364,8451,8451,8453,8453,8457,8457,8467,8467,8470,8470,8481,8482,8486,8486,8491,8491,8531,8532,8539,8542,8544,8555,8560,8569,8585,8585,8592,8601,8632,8633,8658,8658,8660,8660,8679,8679,8704,8704,8706,8707,8711,8712,8715,8715,8719,8719,8721,8721,8725,8725,8730,8730,8733,8736,8739,8739,8741,8741,8743,8748,8750,8750,8756,8759,8764,8765,8776,8776,8780,8780,8786,8786,8800,8801,8804,8807,8810,8811,8814,8815,8834,8835,8838,8839,8853,8853,8857,8857,8869,8869,8895,8895,8978,8978,9312,9449,9451,9547,9552,9587,9600,9615,9618,9621,9632,9633,9635,9641,9650,9651,9654,9655,9660,9661,9664,9665,9670,9672,9675,9675,9678,9681,9698,9701,9711,9711,9733,9734,9737,9737,9742,9743,9756,9756,9758,9758,9792,9792,9794,9794,9824,9825,9827,9829,9831,9834,9836,9837,9839,9839,9886,9887,9919,9919,9926,9933,9935,9939,9941,9953,9955,9955,9960,9961,9963,9969,9972,9972,9974,9977,9979,9980,9982,9983,10045,10045,10102,10111,11094,11097,12872,12879,57344,63743,65024,65039,65533,65533,127232,127242,127248,127277,127280,127337,127344,127373,127375,127376,127387,127404,917760,917999,983040,1048573,1048576,1114109],fullwidthMinimalCodePoint=12288,fullwidthMaximumCodePoint=65510,fullwidthRanges=[12288,12288,65281,65376,65504,65510];var wideMinimalCodePoint=4352,wideMaximumCodePoint=262141,wideRanges=[4352,4447,8986,8987,9001,9002,9193,9196,9200,9200,9203,9203,9725,9726,9748,9749,9776,9783,9800,9811,9855,9855,9866,9871,9875,9875,9889,9889,9898,9899,9917,9918,9924,9925,9934,9934,9940,9940,9962,9962,9970,9971,9973,9973,9978,9978,9981,9981,9989,9989,9994,9995,10024,10024,10060,10060,10062,10062,10067,10069,10071,10071,10133,10135,10160,10160,10175,10175,11035,11036,11088,11088,11093,11093,11904,11929,11931,12019,12032,12245,12272,12287,12289,12350,12353,12438,12441,12543,12549,12591,12593,12686,12688,12773,12783,12830,12832,12871,12880,42124,42128,42182,43360,43388,44032,55203,63744,64255,65040,65049,65072,65106,65108,65126,65128,65131,94176,94180,94192,94198,94208,101594,101631,101664,101760,101874,101888,102801,102816,102866,110576,110579,110581,110587,110589,110590,110592,110888,110898,110898,110928,110930,110933,110933,110948,110952,110960,111355,119552,119638,119648,119670,126980,126980,127183,127183,127374,127374,127377,127386,127406,127406,127488,127490,127504,127547,127552,127560,127568,127569,127584,127589,127744,127776,127789,127797,127799,127868,127870,127891,127904,127946,127951,127955,127968,127984,127988,127988,127992,128062,128064,128064,128066,128252,128255,128317,128331,128334,128336,128359,128378,128378,128405,128406,128420,128420,128507,128591,128640,128709,128716,128716,128720,128722,128725,128729,128732,128735,128747,128748,128756,128764,128986,128986,128992,129003,129008,129008,129292,129338,129340,129349,129351,129535,129648,129660,129664,129734,129736,129736,129740,129757,129759,129771,129775,129786,131072,196605,196608,262141];var isInRange=(ranges,codePoint)=>{let low=0,high=Math.floor(ranges.length/2)-1;for(;low<=high;){let mid=Math.floor((low+high)/2),i=mid*2;if(codePoint<ranges[i])high=mid-1;else if(codePoint>ranges[i+1])low=mid+1;else return!0}return!1};var commonCjkCodePoint=19968,[wideFastPathStart,wideFastPathEnd]=findWideFastPathRange(wideRanges);function findWideFastPathRange(ranges){let fastPathStart=ranges[0],fastPathEnd=ranges[1];for(let index=0;index<ranges.length;index+=2){let start=ranges[index],end=ranges[index+1];if(commonCjkCodePoint>=start&&commonCjkCodePoint<=end)return[start,end];end-start>fastPathEnd-fastPathStart&&(fastPathStart=start,fastPathEnd=end)}return[fastPathStart,fastPathEnd]}var isAmbiguous=codePoint=>codePoint<161||codePoint>1114109?!1:isInRange(ambiguousRanges,codePoint),isFullwidth=codePoint=>codePoint<fullwidthMinimalCodePoint||codePoint>fullwidthMaximumCodePoint?!1:isInRange(fullwidthRanges,codePoint);var isWide=codePoint=>codePoint>=wideFastPathStart&&codePoint<=wideFastPathEnd?!0:codePoint<wideMinimalCodePoint||codePoint>wideMaximumCodePoint?!1:isInRange(wideRanges,codePoint);function validate(codePoint){if(!Number.isSafeInteger(codePoint))throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`)}function eastAsianWidth(codePoint,{ambiguousAsWide=!1}={}){return validate(codePoint),isFullwidth(codePoint)||isWide(codePoint)||ambiguousAsWide&&isAmbiguous(codePoint)?2:1}var graphemeSegmenter=new Intl.Segmenter(void 0,{granularity:"grapheme"}),wordSegmenter=new Intl.Segmenter(void 0,{granularity:"word"});function getGraphemeSegmenter(){return graphemeSegmenter}function getWordSegmenter(){return wordSegmenter}function couldBeEmoji(segment){let cp=segment.codePointAt(0);return cp>=126976&&cp<=130047||cp>=8960&&cp<=9215||cp>=9728&&cp<=10175||cp>=11088&&cp<=11093||segment.includes("\uFE0F")||segment.length>2}var zeroWidthRegex=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$","v"),leadingNonPrintingRegex=new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+","v"),nonPrintingCharRegex=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Mark}|\\p{Surrogate})$","v"),markCharRegex=new RegExp("^\\p{Mark}$","v"),terminalSpacingMarkRegex=new RegExp("^(?:[\\p{Spacing_Mark}--[\\u1734\\u302E\\u302F]]|[\\u065F\\u0F7F\\u102B\\u102C\\u1031\\u1033-\\u1035\\u1038\\u103A-\\u103E])+$","v"),rgiEmojiRegex=new RegExp("^\\p{RGI_Emoji}$","v"),WIDTH_CACHE_GENERATION_SIZE=2048,widthCacheCurrent=new Map,widthCachePrevious=new Map,widthCacheHits=0,widthCacheMisses=0;function rotateWidthCacheIfNeeded(){widthCacheCurrent.size>=WIDTH_CACHE_GENERATION_SIZE&&(widthCachePrevious=widthCacheCurrent,widthCacheCurrent=new Map)}function setWidthCache(str,width){widthCacheCurrent.set(str,width),rotateWidthCacheIfNeeded()}var cjkBreakRegex=/[\p{Script_Extensions=Han}\p{Script_Extensions=Hiragana}\p{Script_Extensions=Katakana}\p{Script_Extensions=Hangul}\p{Script_Extensions=Bopomofo}]/u,cjkPunctuationRegex=new RegExp(`(?:(?=\\p{Punctuation})${cjkBreakRegex.source}|[\uFF0C\uFF0E\uFF1A\uFF1B\uFF01\uFF1F\uFF08\uFF09\uFF3B\uFF3D\uFF5B\uFF5D\u201C\u201D\u2018\u2019\u2026\u2014])`,"u"),autocompleteSeparatorRegex=new RegExp(`(?:\\s|${cjkPunctuationRegex.source})`,"u"),autocompleteBoundaryRegex=new RegExp(`(?:^|${autocompleteSeparatorRegex.source})`,"u");function isPrintableAscii(str){for(let i=0;i<str.length;i++){let code=str.charCodeAt(i);if(code<32||code>126)return!1}return!0}function truncateFragmentToWidth(text,maxWidth){if(maxWidth<=0||text.length===0)return{text:"",width:0};if(isPrintableAscii(text)){let clipped=text.slice(0,maxWidth);return{text:clipped,width:clipped.length}}let hasAnsi=text.includes("\x1B"),hasTabs=text.includes(" ");if(!hasAnsi&&!hasTabs){let result2="",width2=0;for(let{segment}of graphemeSegmenter.segment(text)){let w=graphemeWidth(segment);if(width2+w>maxWidth)break;result2+=segment,width2+=w}return{text:result2,width:width2}}let result="",width=0,i=0,pendingAnsi="";for(;i<text.length;){let ansi=extractAnsiCode(text,i);if(ansi){pendingAnsi+=ansi.code,i+=ansi.length;continue}if(text[i]===" "){if(width+3>maxWidth)break;pendingAnsi&&(result+=pendingAnsi,pendingAnsi=""),result+=" ",width+=3,i++;continue}let end=i;for(;end<text.length&&text[end]!==" "&&!extractAnsiCode(text,end);)end++;for(let{segment}of graphemeSegmenter.segment(text.slice(i,end))){let w=graphemeWidth(segment);if(width+w>maxWidth)return{text:result,width};pendingAnsi&&(result+=pendingAnsi,pendingAnsi=""),result+=segment,width+=w}i=end}return{text:result,width}}function finalizeTruncatedResult(prefix,prefixWidth,ellipsis,ellipsisWidth,maxWidth,pad){let reset="\x1B[0m",hyperlinkClose=getActiveOsc8Close(prefix),visibleWidth2=prefixWidth+ellipsisWidth,result;return ellipsis.length>0?result=`${prefix}${hyperlinkClose}${reset}${ellipsis}${reset}`:result=`${prefix}${hyperlinkClose}${reset}`,pad?result+" ".repeat(Math.max(0,maxWidth-visibleWidth2)):result}function graphemeWidth(segment){if(segment.length===1){let code=segment.charCodeAt(0);if(code>=32&&code<=126)return 1;if(code===9)return 3}if(terminalSpacingMarkRegex.test(segment))return[...segment].length;if(zeroWidthRegex.test(segment))return 0;if(couldBeEmoji(segment)&&rgiEmojiRegex.test(segment))return 2;let base=segment.replace(leadingNonPrintingRegex,""),cp=base.codePointAt(0);if(cp===void 0)return 0;if(cp>=127462&&cp<=127487)return 2;let width=eastAsianWidth(cp),followsMark=!1,chars=[...base];for(let char of chars.slice(1))if(terminalSpacingMarkRegex.test(char))width+=1,followsMark=!1;else if(markCharRegex.test(char))followsMark=!0;else if(!nonPrintingCharRegex.test(char)){let c=char.codePointAt(0);followsMark||c>=65280&&c<=65519?width+=eastAsianWidth(c):(c===3635||c===3763)&&(width+=1),followsMark=!1}return width}function visibleWidth(str){if(str.length===0)return 0;let asciiWidth=asciiVisibleWidth(str);if(asciiWidth!==-1)return asciiWidth;let cachedCurrent=widthCacheCurrent.get(str);if(cachedCurrent!==void 0)return widthCacheHits++,cachedCurrent;let cachedPrevious=widthCachePrevious.get(str);if(cachedPrevious!==void 0)return widthCacheHits++,setWidthCache(str,cachedPrevious),cachedPrevious;widthCacheMisses++;let clean=str;str.includes(" ")&&(clean=clean.replace(/\t/g," "));let escapeIndex=clean.indexOf("\x1B");if(escapeIndex!==-1){let stripped="",copyFrom=0;for(;escapeIndex!==-1;){let length=ansiCodeLength(clean,escapeIndex);length>0?(stripped+=clean.slice(copyFrom,escapeIndex),escapeIndex+=length,copyFrom=escapeIndex):escapeIndex++,escapeIndex=clean.indexOf("\x1B",escapeIndex)}clean=stripped+clean.slice(copyFrom)}let width=0;for(let{segment}of graphemeSegmenter.segment(clean))width+=graphemeWidth(segment);return setWidthCache(str,width),width}function stripTerminalSequences(str){if(!str.includes("\x1B"))return str;let result="",i=0;for(;i<str.length;){let ansi=extractAnsiCode(str,i);if(ansi){i+=ansi.length;continue}result+=str[i],i++}return result}function getGraphemeCellRange(line,column){let currentCol=0,i=0;for(;i<line.length;){let ansi=extractAnsiCode(line,i);if(ansi){i+=ansi.length;continue}let textEnd=i;for(;textEnd<line.length&&!extractAnsiCode(line,textEnd);)textEnd++;for(let{segment}of graphemeSegmenter.segment(line.slice(i,textEnd))){let width=graphemeWidth(segment);if(width>0&&column>=currentCol&&column<currentCol+width)return{start:currentCol,end:currentCol+width};currentCol+=width}i=textEnd}}function getOsc8LinkAtColumn(line,column){let activeUrl,currentCol=0,i=0;for(;i<line.length;){let ansi=extractAnsiCode(line,i);if(ansi){let hyperlink2=/^\x1b\]8;[^;]*;([^\x07\x1b]*)(?:\x07|\x1b\\)$/.exec(ansi.code);hyperlink2&&(activeUrl=hyperlink2[1]||void 0),i+=ansi.length;continue}let textEnd=i;for(;textEnd<line.length&&!extractAnsiCode(line,textEnd);)textEnd++;for(let{segment}of graphemeSegmenter.segment(line.slice(i,textEnd))){let width=segment===" "?3:graphemeWidth(segment);if(column>=currentCol&&column<currentCol+width)return activeUrl;currentCol+=width}i=textEnd}}var THAI_LAO_AM_REGEX=/[\u0e33\u0eb3]/,THAI_LAO_AM_GLOBAL_REGEX=/[\u0e33\u0eb3]/g;function normalizeTerminalOutput(str){let normalized=str;if(THAI_LAO_AM_REGEX.test(normalized)&&(normalized=normalized.replace(THAI_LAO_AM_GLOBAL_REGEX,char=>char==="\u0E33"?"\u0E4D\u0E32":"\u0ECD\u0EB2")),!normalized.includes(" "))return normalized;let result="",i=0;for(;i<normalized.length;){let ansi=extractAnsiCode(normalized,i);if(ansi){result+=ansi.code,i+=ansi.length;continue}result+=normalized[i]===" "?" ":normalized[i],i++}return result}function extractAnsiCode(str,pos){let length=ansiCodeLength(str,pos);return length>0?{code:str.substring(pos,pos+length),length}:null}function asciiVisibleWidth(str){let width=0,i=0;for(;i<str.length;){let code=str.charCodeAt(i);if(code>=32&&code<=126)width++,i++;else if(code===9)width+=3,i++;else if(code===27){let length=ansiCodeLength(str,i);if(length===0)return-1;i+=length}else return-1}return width}function ansiCodeLength(str,pos){if(pos>=str.length||str.charCodeAt(pos)!==27)return 0;let next=str[pos+1];if(next==="["){for(let j=pos+2;j<str.length;j++){let c=str.charCodeAt(j);if(c===109||c===71||c===75||c===72||c===74)return j+1-pos}return 0}if(next==="P"){let j=pos+2;for(;j<str.length;){if(str.charCodeAt(j)===27){if(str[j+1]==="\\")return j+2-pos;if(str.charCodeAt(j+1)===27){j+=2;continue}}j++}return 0}if(next==="]"||next==="_"){for(let j=pos+2;j<str.length;j++){let c=str.charCodeAt(j);if(c===7)return j+1-pos;if(c===27&&str[j+1]==="\\")return j+2-pos}return 0}return 0}function parseOsc8Hyperlink(ansiCode){if(!ansiCode.startsWith("\x1B]8;"))return;let terminator=ansiCode.endsWith("\x07")?"\x07":"\x1B\\",body=ansiCode.slice(4,terminator==="\x07"?-1:-2),separatorIndex=body.indexOf(";");if(separatorIndex===-1)return;let params=body.slice(0,separatorIndex),url=body.slice(separatorIndex+1);return url?{params,url,terminator}:null}function formatOsc8Hyperlink(hyperlink2){return`\x1B]8;${hyperlink2.params};${hyperlink2.url}${hyperlink2.terminator}`}function formatOsc8Close(terminator){return`\x1B]8;;${terminator}`}function getActiveOsc8Close(prefix){if(!prefix.includes("\x1B]8;"))return"";let activeHyperlink=null,i=0;for(;i<prefix.length;){let ansi=extractAnsiCode(prefix,i);if(ansi){let hyperlink2=parseOsc8Hyperlink(ansi.code);hyperlink2!==void 0&&(activeHyperlink=hyperlink2),i+=ansi.length}else i++}return activeHyperlink?formatOsc8Close(activeHyperlink.terminator):""}var AnsiCodeTracker=class{constructor(){this.bold=!1,this.dim=!1,this.italic=!1,this.underline=!1,this.blink=!1,this.inverse=!1,this.hidden=!1,this.strikethrough=!1,this.fgColor=null,this.bgColor=null,this.activeHyperlink=null}process(ansiCode){let hyperlink2=parseOsc8Hyperlink(ansiCode);if(hyperlink2!==void 0){this.activeHyperlink=hyperlink2;return}if(!ansiCode.endsWith("m"))return;let match=ansiCode.match(/\x1b\[([\d;]*)m/);if(!match)return;let params=match[1];if(params===""||params==="0"){this.reset();return}let parts=params.split(";"),i=0;for(;i<parts.length;){let code=Number.parseInt(parts[i],10);if(code===38||code===48){if(parts[i+1]==="5"&&parts[i+2]!==void 0){let colorCode=`${parts[i]};${parts[i+1]};${parts[i+2]}`;code===38?this.fgColor=colorCode:this.bgColor=colorCode,i+=3;continue}else if(parts[i+1]==="2"&&parts[i+4]!==void 0){let colorCode=`${parts[i]};${parts[i+1]};${parts[i+2]};${parts[i+3]};${parts[i+4]}`;code===38?this.fgColor=colorCode:this.bgColor=colorCode,i+=5;continue}}switch(code){case 0:this.reset();break;case 1:this.bold=!0;break;case 2:this.dim=!0;break;case 3:this.italic=!0;break;case 4:this.underline=!0;break;case 5:this.blink=!0;break;case 7:this.inverse=!0;break;case 8:this.hidden=!0;break;case 9:this.strikethrough=!0;break;case 21:this.bold=!1;break;case 22:this.bold=!1,this.dim=!1;break;case 23:this.italic=!1;break;case 24:this.underline=!1;break;case 25:this.blink=!1;break;case 27:this.inverse=!1;break;case 28:this.hidden=!1;break;case 29:this.strikethrough=!1;break;case 39:this.fgColor=null;break;case 49:this.bgColor=null;break;default:code>=30&&code<=37||code>=90&&code<=97?this.fgColor=String(code):(code>=40&&code<=47||code>=100&&code<=107)&&(this.bgColor=String(code));break}i++}}reset(){this.bold=!1,this.dim=!1,this.italic=!1,this.underline=!1,this.blink=!1,this.inverse=!1,this.hidden=!1,this.strikethrough=!1,this.fgColor=null,this.bgColor=null}clear(){this.reset(),this.activeHyperlink=null}getActiveCodes(){let codes=[];this.bold&&codes.push("1"),this.dim&&codes.push("2"),this.italic&&codes.push("3"),this.underline&&codes.push("4"),this.blink&&codes.push("5"),this.inverse&&codes.push("7"),this.hidden&&codes.push("8"),this.strikethrough&&codes.push("9"),this.fgColor&&codes.push(this.fgColor),this.bgColor&&codes.push(this.bgColor);let result=codes.length>0?`\x1B[${codes.join(";")}m`:"";return this.activeHyperlink&&(result+=formatOsc8Hyperlink(this.activeHyperlink)),result}getActiveBackgroundCode(){return this.bgColor?`\x1B[${this.bgColor}m`:""}hasActiveCodes(){return this.bold||this.dim||this.italic||this.underline||this.blink||this.inverse||this.hidden||this.strikethrough||this.fgColor!==null||this.bgColor!==null||this.activeHyperlink!==null}getLineEndReset(){let result="";return this.underline&&(result+="\x1B[24m"),this.activeHyperlink&&(result+=formatOsc8Close(this.activeHyperlink.terminator)),result}};function updateTrackerFromText(text,tracker){let i=text.indexOf("\x1B");for(;i!==-1;){let length=ansiCodeLength(text,i);length>0?(tracker.process(text.substring(i,i+length)),i+=length):i++,i=text.indexOf("\x1B",i)}}function getActiveBackgroundAnsi(text){let tracker=new AnsiCodeTracker;return updateTrackerFromText(text,tracker),tracker.getActiveBackgroundCode()}function*graphemeSegments(text){for(let{segment}of graphemeSegmenter.segment(text))yield segment}function splitIntoTokensWithAnsi(text){let tokens=[],current="",pendingAnsi="",currentKind=null,i=0,flushCurrent=()=>{current&&(tokens.push(current),current="",currentKind=null)};for(;i<text.length;){let ansiResult=extractAnsiCode(text,i);if(ansiResult){pendingAnsi+=ansiResult.code,i+=ansiResult.length;continue}let end=text.indexOf("\x1B",i+1);for(;end!==-1&&ansiCodeLength(text,end)===0;)end=text.indexOf("\x1B",end+1);end===-1&&(end=text.length);let chunk=text.slice(i,end),ascii=isPrintableAscii(chunk);for(let segment of ascii?chunk:graphemeSegments(chunk)){let segmentIsSpace=segment===" ";if(!ascii&&!segmentIsSpace&&cjkBreakRegex.test(segment)){flushCurrent();let token=pendingAnsi+segment;pendingAnsi="",tokens.push(token);continue}let segmentKind=segmentIsSpace?"space":"word";current&&currentKind!==segmentKind&&flushCurrent(),pendingAnsi&&(current+=pendingAnsi,pendingAnsi=""),currentKind=segmentKind,current+=segment}i=end}return pendingAnsi&&(current?current+=pendingAnsi:tokens.length>0?tokens[tokens.length-1]+=pendingAnsi:current=pendingAnsi),current&&tokens.push(current),tokens}function flattenLines(lines){for(let line of lines)Number(line)}function wrapTextWithAnsi(text,width){if(!text)return[""];let inputLines=text.split(/\r\n|\r|\n/),result=[],tracker=new AnsiCodeTracker;for(let inputLine of inputLines){let prefix=result.length>0?tracker.getActiveCodes():"",wrappedLines=wrapSingleLine(prefix+inputLine,width);for(let wrappedLine of wrappedLines)result.push(wrappedLine);updateTrackerFromText(inputLine,tracker)}return result.length>0?result:[""]}function wrapSingleLine(line,width){if(!line)return[""];if(visibleWidth(line)<=width)return[line];let wrapped=[],tracker=new AnsiCodeTracker,tokens=splitIntoTokensWithAnsi(line),currentLine="",currentVisibleLength=0;for(let token of tokens){let tokenVisibleLength=visibleWidth(token),isWhitespace=token.trim()==="";if(tokenVisibleLength>width&&!isWhitespace){if(currentLine){let lineEndReset=tracker.getLineEndReset();lineEndReset&&(currentLine+=lineEndReset),wrapped.push(currentLine),currentLine="",currentVisibleLength=0}let broken=breakLongWord(token,width,tracker);for(let i=0;i<broken.length-1;i++)wrapped.push(broken[i]);currentLine=broken[broken.length-1],currentVisibleLength=visibleWidth(currentLine);continue}if(currentVisibleLength+tokenVisibleLength>width&&currentVisibleLength>0){let lineToWrap=currentLine.trimEnd(),lineEndReset=tracker.getLineEndReset();lineEndReset&&(lineToWrap+=lineEndReset),wrapped.push(lineToWrap),isWhitespace?(currentLine=tracker.getActiveCodes(),currentVisibleLength=0):(currentLine=tracker.getActiveCodes()+token,currentVisibleLength=tokenVisibleLength)}else currentLine+=token,currentVisibleLength+=tokenVisibleLength;updateTrackerFromText(token,tracker)}return currentLine&&wrapped.push(currentLine),wrapped.length>0?wrapped.map(line2=>line2.trimEnd()):[""]}var PUNCTUATION_REGEX=/[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;function isWhitespaceChar(char){return/\s/.test(char)}function breakLongWord(word,width,tracker){let lines=[],currentLine=tracker.getActiveCodes(),currentWidth=0,i=0,segments=[];for(;i<word.length;){let ansiResult=extractAnsiCode(word,i);if(ansiResult)segments.push({type:"ansi",value:ansiResult.code}),i+=ansiResult.length;else{let end=i;for(;end<word.length&&!extractAnsiCode(word,end);)end++;let textPortion=word.slice(i,end);for(let seg of graphemeSegmenter.segment(textPortion))segments.push({type:"grapheme",value:seg.segment});i=end}}for(let seg of segments){if(seg.type==="ansi"){currentLine+=seg.value,tracker.process(seg.value);continue}let grapheme=seg.value;if(!grapheme)continue;let graphemeWidth2=visibleWidth(grapheme);if(currentWidth+graphemeWidth2>width){let lineEndReset=tracker.getLineEndReset();lineEndReset&&(currentLine+=lineEndReset),lines.push(currentLine),currentLine=tracker.getActiveCodes(),currentWidth=0}currentLine+=grapheme,currentWidth+=graphemeWidth2}return currentLine&&lines.push(currentLine),lines.length>0?lines:[""]}function sgrLeavesDefaultBackground(params){if(params==="")return!0;let parts=params.split(";"),backgroundIsDefault=!1,index=0;for(;index<parts.length;){let part=parts[index]??"",code=part===""?0:Number.parseInt(part,10);if(Number.isNaN(code)){index++;continue}if(code===0||code===49){backgroundIsDefault=!0,index++;continue}if((code===38||code===48)&&parts[index+1]==="5"&&parts[index+2]!==void 0){code===48&&(backgroundIsDefault=!1),index+=3;continue}if((code===38||code===48)&&parts[index+1]==="2"&&parts[index+4]!==void 0){code===48&&(backgroundIsDefault=!1),index+=5;continue}(code>=40&&code<=47||code>=100&&code<=107)&&(backgroundIsDefault=!1),index++}return backgroundIsDefault}function applyBackgroundToLine(line,width,bgFn){let visibleLen=visibleWidth(line),paddingNeeded=Math.max(0,width-visibleLen),padding=" ".repeat(paddingNeeded),withPadding=line+padding,marker="pi-bg-marker",wrappedMarker=bgFn(marker),markerIndex=wrappedMarker.indexOf(marker);if(markerIndex===-1)return bgFn(withPadding);let bgStart=wrappedMarker.slice(0,markerIndex),bgEnd=wrappedMarker.slice(markerIndex+marker.length),restoredLine=line.replace(/\x1b\[([0-9;]*)m/g,(sequence,params)=>sgrLeavesDefaultBackground(params)?`${sequence}${bgStart}`:sequence),tracker=new AnsiCodeTracker;updateTrackerFromText(line,tracker);let restored=paddingNeeded>0&&tracker.hasActiveCodes()?`${restoredLine}\x1B[0m${tracker.getLineEndReset()}${bgStart}${padding}`:restoredLine+padding;return`${bgStart}${restored}${bgEnd}`}function truncateToWidth(text,maxWidth,ellipsis="...",pad=!1){if(maxWidth<=0)return"";if(text.length===0)return pad?" ".repeat(maxWidth):"";let ellipsisWidth=visibleWidth(ellipsis);if(ellipsisWidth>=maxWidth){let textWidth=visibleWidth(text);if(textWidth<=maxWidth)return pad?text+" ".repeat(maxWidth-textWidth):text;let clippedEllipsis=truncateFragmentToWidth(ellipsis,maxWidth);return clippedEllipsis.width===0?pad?" ".repeat(maxWidth):"":finalizeTruncatedResult("",0,clippedEllipsis.text,clippedEllipsis.width,maxWidth,pad)}if(isPrintableAscii(text)){if(text.length<=maxWidth)return pad?text+" ".repeat(maxWidth-text.length):text;let targetWidth2=maxWidth-ellipsisWidth;return finalizeTruncatedResult(text.slice(0,targetWidth2),targetWidth2,ellipsis,ellipsisWidth,maxWidth,pad)}let targetWidth=maxWidth-ellipsisWidth,result="",pendingAnsi="",visibleSoFar=0,keptWidth=0,keepContiguousPrefix=!0,overflowed=!1,exhaustedInput=!1,hasAnsi=text.includes("\x1B"),hasTabs=text.includes(" ");if(!hasAnsi&&!hasTabs){for(let{segment}of graphemeSegmenter.segment(text)){let width=graphemeWidth(segment);if(keepContiguousPrefix&&keptWidth+width<=targetWidth?(result+=segment,keptWidth+=width):keepContiguousPrefix=!1,visibleSoFar+=width,visibleSoFar>maxWidth){overflowed=!0;break}}exhaustedInput=!overflowed}else{let i=0;for(;i<text.length;){let ansi=extractAnsiCode(text,i);if(ansi){pendingAnsi+=ansi.code,i+=ansi.length;continue}if(text[i]===" "){if(keepContiguousPrefix&&keptWidth+3<=targetWidth?(pendingAnsi&&(result+=pendingAnsi,pendingAnsi=""),result+=" ",keptWidth+=3):(keepContiguousPrefix=!1,pendingAnsi=""),visibleSoFar+=3,visibleSoFar>maxWidth){overflowed=!0;break}i++;continue}let end=i;for(;end<text.length&&text[end]!==" "&&!extractAnsiCode(text,end);)end++;for(let{segment}of graphemeSegmenter.segment(text.slice(i,end))){let width=graphemeWidth(segment);if(keepContiguousPrefix&&keptWidth+width<=targetWidth?(pendingAnsi&&(result+=pendingAnsi,pendingAnsi=""),result+=segment,keptWidth+=width):(keepContiguousPrefix=!1,pendingAnsi=""),visibleSoFar+=width,visibleSoFar>maxWidth){overflowed=!0;break}}if(overflowed)break;i=end}exhaustedInput=i>=text.length}return!overflowed&&exhaustedInput?pad?text+" ".repeat(Math.max(0,maxWidth-visibleSoFar)):text:finalizeTruncatedResult(result,keptWidth,ellipsis,ellipsisWidth,maxWidth,pad)}function sliceByColumn(line,startCol,length,strict=!1){return sliceWithWidth(line,startCol,length,strict).text}function sliceWithWidth(line,startCol,length,strict=!1){if(length<=0)return{text:"",width:0};let endCol=startCol+length,result="",resultWidth=0,currentCol=0,i=0,pendingAnsi="";for(;i<line.length;){let ansi=extractAnsiCode(line,i);if(ansi){currentCol>=startCol&&currentCol<endCol?(result+=pendingAnsi+ansi.code,pendingAnsi=""):currentCol<startCol&&(pendingAnsi+=ansi.code),i+=ansi.length;continue}let textEnd=i;for(;textEnd<line.length&&!extractAnsiCode(line,textEnd);)textEnd++;for(let{segment}of graphemeSegmenter.segment(line.slice(i,textEnd))){let w=graphemeWidth(segment),inRange=currentCol>=startCol&&currentCol<endCol,fits=!strict||currentCol+w<=endCol;if(inRange&&fits&&(pendingAnsi&&(result+=pendingAnsi,pendingAnsi=""),result+=segment,resultWidth+=w),currentCol+=w,currentCol>=endCol)break}if(i=textEnd,currentCol>=endCol)break}return{text:result,width:resultWidth}}var pooledStyleTracker=new AnsiCodeTracker;function extractSegments(line,beforeEnd,afterStart,afterLen,strictAfter=!1){let before="",beforeWidth=0,after="",afterWidth=0,currentCol=0,i=0,pendingAnsiBefore="",afterStarted=!1,afterEnd=afterStart+afterLen;for(pooledStyleTracker.clear();i<line.length;){let ansi=extractAnsiCode(line,i);if(ansi){pooledStyleTracker.process(ansi.code),currentCol<beforeEnd?pendingAnsiBefore+=ansi.code:currentCol>=afterStart&&currentCol<afterEnd&&afterStarted&&(after+=ansi.code),i+=ansi.length;continue}let textEnd=i;for(;textEnd<line.length&&!extractAnsiCode(line,textEnd);)textEnd++;for(let{segment}of graphemeSegmenter.segment(line.slice(i,textEnd))){let w=graphemeWidth(segment);if(currentCol<beforeEnd&&currentCol+w<=beforeEnd?(pendingAnsiBefore&&(before+=pendingAnsiBefore,pendingAnsiBefore=""),before+=segment,beforeWidth+=w):currentCol>=afterStart&&currentCol<afterEnd&&(!strictAfter||currentCol+w<=afterEnd)&&(afterStarted||(after+=pooledStyleTracker.getActiveCodes(),afterStarted=!0),after+=segment,afterWidth+=w),currentCol+=w,afterLen<=0?currentCol>=beforeEnd:currentCol>=afterEnd)break}if(i=textEnd,afterLen<=0?currentCol>=beforeEnd:currentCol>=afterEnd)break}return{before,beforeWidth,after,afterWidth}}import{execFile}from"node:child_process";import*as fs from"node:fs";import*as os from"node:os";import*as path from"node:path";import{performance as performance2}from"node:perf_hooks";function isMultiplexerSession(env=process.env){return!!(env.TMUX||env.TMUX_PANE||env.STY||env.ZELLIJ)}function useLegacyMuxRender(){return process.env.PI_TUI_LEGACY_MUX_RENDER==="1"}function viewportRenderEnabled(){return process.env.PI_TUI_VIEWPORT_RENDER!=="0"}function hexToRgb(hex){let normalized=hex.startsWith("#")?hex.slice(1):hex,r=parseInt(normalized.slice(0,2),16),g=parseInt(normalized.slice(2,4),16),b2=parseInt(normalized.slice(4,6),16);return{r,g,b:b2}}function parseOscHexChannel(channel){if(!/^[0-9a-f]+$/i.test(channel))return;let max=16**channel.length-1;if(!(max<=0))return Math.round(parseInt(channel,16)/max*255)}var OSC_COLOR_RESPONSE_PATTERN=/^\x1b\](?:(1[01])|4;(\d{1,3}));([^\x07\x1b]*)(?:\x07|\x1b\\)$/i,COLOR_SCHEME_REPORT_PATTERN=/^(?:\x1b\[\?997;(1|2)n)+$/;function parseOscColorResponse(data){let match=data.match(OSC_COLOR_RESPONSE_PATTERN);return match?{target:match[1]==="10"?"foreground":match[1]==="11"?"background":Number.parseInt(match[2],10),rgb:parseOscColorValue(match[3])}:void 0}function parseOscColorValue(rawValue){let value=rawValue.trim();if(value.startsWith("#")){let hex=value.slice(1);if(/^[0-9a-f]{6}$/i.test(hex))return hexToRgb(value);if(/^[0-9a-f]{12}$/i.test(hex)){let r2=parseOscHexChannel(hex.slice(0,4)),g2=parseOscHexChannel(hex.slice(4,8)),b3=parseOscHexChannel(hex.slice(8,12));return r2!==void 0&&g2!==void 0&&b3!==void 0?{r:r2,g:g2,b:b3}:void 0}return}let rgbValue=value.replace(/^rgba?:/i,""),[red,green,blue]=rgbValue.split("/");if(red===void 0||green===void 0||blue===void 0)return;let r=parseOscHexChannel(red),g=parseOscHexChannel(green),b2=parseOscHexChannel(blue);return r!==void 0&&g!==void 0&&b2!==void 0?{r,g,b:b2}:void 0}function parseTerminalColorSchemeReport(data){let match=data.match(COLOR_SCHEME_REPORT_PATTERN);if(match)return match[1]==="2"?"light":"dark"}var ENABLE_FOCUS_REPORTING="\x1B[?1004h",DISABLE_FOCUS_REPORTING="\x1B[?1004l";function consumeTmuxFocusEvent(data){let focusIn=data.indexOf("\x1B[I"),focusOut=data.indexOf("\x1B[O"),index=focusIn===-1?focusOut:focusOut===-1?focusIn:Math.min(focusIn,focusOut);return index===-1?{event:null,data}:{event:index===focusIn?"in":"out",data:data.slice(0,index)+data.slice(index+3)}}var KITTY_SEQUENCE_PREFIX="\x1B_G",MAX_RENDER_WRITE_CHARS=1024*1024;function writeBounded(terminal,data){for(let offset=0;offset<data.length;offset+=MAX_RENDER_WRITE_CHARS){let end=Math.min(data.length,offset+MAX_RENDER_WRITE_CHARS);end<data.length&&data.charCodeAt(end-1)>=55296&&data.charCodeAt(end-1)<=56319&&data.charCodeAt(end)>=56320&&data.charCodeAt(end)<=57343&&end--,end===offset&&end++,terminal.write(data.slice(offset,end))}}function parseKittyImageHeader(line){let sequenceStart=line.indexOf(KITTY_SEQUENCE_PREFIX);if(sequenceStart===-1)return;let paramsStart=sequenceStart+KITTY_SEQUENCE_PREFIX.length,paramsEnd=line.indexOf(";",paramsStart);if(paramsEnd===-1)return;let ids=[],rows=1;for(let param of line.slice(paramsStart,paramsEnd).split(",")){let[key,value]=param.split("=",2);if(value===void 0)continue;let numberValue=Number(value);!Number.isInteger(numberValue)||numberValue<=0||numberValue>4294967295||(key==="i"?ids.push(numberValue):key==="r"&&(rows=numberValue))}return{ids,rows}}function extractKittyImageIds(line){return parseKittyImageHeader(line)?.ids??[]}function extractKittyImageRows(line){return parseKittyImageHeader(line)?.rows??1}function isTermuxSession(){return!!process.env.TERMUX_VERSION}function dispatchMouseEvent(component,event){let result=component.handleMouse?.(event);if(result){if("target"in result){let forwarded=result;return forwarded.focus&&component.handleInput?{...forwarded,focusTarget:component}:forwarded}if(!(!result.handled&&!result.capture&&!result.focus))return{...result,handled:!0,...result.focus?{focusTarget:component}:{},target:{component,originX:event.screenX-event.x,originY:event.screenY-event.y,width:event.width,height:event.height}}}}function retargetMouseEvent(event,target){return{...event,x:event.screenX-target.originX,y:event.screenY-target.originY,width:target.width,height:target.height}}var TERMINAL_PALETTE_SIZE=16,TERMINAL_COLOR_REPLY_COUNT=2+TERMINAL_PALETTE_SIZE,TERMINAL_COLOR_QUERY=`\x1B]10;?\x07\x1B]11;?\x07${Array.from({length:TERMINAL_PALETTE_SIZE},(_2,index)=>`\x1B]4;${index};?\x07`).join("")}\x1B[c`,DEVICE_ATTRIBUTES_RESPONSE_PATTERN=/^\x1b\[\?[\d;]*c$/;function isFocusable(component){return component!==null&&"focused"in component}function canReceiveKeys(component){return component!==null&&typeof component.handleInput=="function"}var CURSOR_MARKER="\x1B_pi:c\x07",FAKE_CURSOR_START="\x1B[7m",FAKE_CURSOR_END="\x1B[27m",FAKE_CURSOR_RESET="\x1B[0m";var renderErrorLoggedClasses=new Set,renderErrorLogWrites=0,renderDiagnosticLineScans=0,DIAGNOSTIC_LOG_MODE=384;function defaultDiagnosticLogDirectory(){return path.join(os.homedir(),".senpi","agent")}var renderErrorLogDirectory,VIEWPORT_RENDER_OVERSCAN=16,MAX_SCROLL_DIFF_ROWS=4,viewportRenderStats={lastNormalizedLines:0,lastKittyImageScannedLines:0,totalNormalizedLines:0,totalKittyImageScannedLines:0,boundedFrames:0,escapedFrames:0,fullFrames:0};function recordViewportRenderStats(normalizedLines,mode){viewportRenderStats.lastNormalizedLines=normalizedLines,viewportRenderStats.totalNormalizedLines+=normalizedLines,mode==="bounded"?viewportRenderStats.boundedFrames+=1:mode==="escaped"?viewportRenderStats.escapedFrames+=1:viewportRenderStats.fullFrames+=1}function recordKittyImageScanStats(scannedLines){viewportRenderStats.lastKittyImageScannedLines=scannedLines,viewportRenderStats.totalKittyImageScannedLines+=scannedLines}function componentRenderErrorName(component){return component.constructor.name||"AnonymousComponent"}function logRenderErrorOnce(component,error){let componentName=componentRenderErrorName(component);if(renderErrorLoggedClasses.has(componentName))return;renderErrorLoggedClasses.add(componentName),renderErrorLogWrites+=1;let errorText=error instanceof Error?`${error.name}: ${error.message}`:String(error),logPath=path.join(renderErrorLogDirectory??defaultDiagnosticLogDirectory(),"senpi-debug.log"),msg=`[${new Date().toISOString()}] render error: ${componentName}: ${errorText}
7
7
  `;appendRenderErrorLogBestEffort(logPath,msg)}function appendRenderErrorLogBestEffort(logPath,msg){try{fs.mkdirSync(path.dirname(logPath),{recursive:!0}),fs.appendFileSync(logPath,msg,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(logPath)}catch(error){if(error instanceof Error)return;throw error}}function writeRenderDiagnosticBestEffort(logPath,data){try{return fs.mkdirSync(path.dirname(logPath),{recursive:!0}),fs.writeFileSync(logPath,data,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(logPath),!0}catch(error){if(error instanceof Error)return!1;throw error}}function formatOverWideRenderDiagnostic(lines,terminalWidth,lineIndex,lineWidth){return renderDiagnosticLineScans+=lines.length,[`Crash at ${new Date().toISOString()}`,`Terminal width: ${terminalWidth}`,`Line ${lineIndex} visible width: ${lineWidth}`,"","=== All rendered lines ===",...lines.map((line,index)=>`[${index}] (w=${visibleWidth(line)}) ${line}`),""].join(`
8
- `)}function chmodDiagnosticLogBestEffort(logPath){try{fs.chmodSync(logPath,DIAGNOSTIC_LOG_MODE)}catch(error){if(error instanceof Error)return;throw error}}function parseSizeValue(value,referenceSize){if(value===void 0)return;if(typeof value=="number")return value;let match=value.match(/^(\d+(?:\.\d+)?)%$/);if(match)return Math.floor(referenceSize*parseFloat(match[1])/100)}var renderFrame={scrollbackRows:0,offset:0,next:void 0,mode:void 0,rows:0};function frameMode(){return renderFrame.mode}var DEFAULT_HISTORY_LINES=2e3,MAX_HISTORY_LINES=5e3,terminalScrollbackLines,scrollbackLookupGeneration=0;function readTerminalScrollbackLines(){let override=Number(process.env.PI_TUI_HISTORY_LINES);if(Number.isFinite(override)&&override>0)return Math.floor(override);if(!process.env.TMUX)return null;let generation=scrollbackLookupGeneration;try{execFile("tmux",["display-message","-p","#{history_limit}"],{encoding:"utf8",timeout:500},(error,stdout)=>{if(generation!==scrollbackLookupGeneration)return;let limit=Number(stdout.trim());!error&&Number.isFinite(limit)&&limit>0&&(terminalScrollbackLines=limit)})}catch{}return null}function mainScreenHistoryLines(rows=renderFrame.rows){terminalScrollbackLines===void 0&&(terminalScrollbackLines=readTerminalScrollbackLines());let preferred=Math.min(MAX_HISTORY_LINES,terminalScrollbackLines??DEFAULT_HISTORY_LINES);return Math.min(MAX_HISTORY_LINES,Math.max(2*Math.max(1,rows),preferred))}function resetMainScreenHistoryLines(){terminalScrollbackLines=void 0,scrollbackLookupGeneration+=1}function frameScrollbackRows(){return renderFrame.scrollbackRows}function claimFrameRow(component){if(renderFrame.next===component)return renderFrame.next=void 0,renderFrame.offset}function renderAtFrameRow(child,width,row){if(row===void 0)return child.render(width);let previousOffset=renderFrame.offset,previousNext=renderFrame.next;renderFrame.offset=row,renderFrame.next=child;try{return child.render(width)}finally{renderFrame.offset=previousOffset,renderFrame.next=previousNext}}var renderRevisionClock=0;function nextRenderRevision(){return renderRevisionClock+=1,renderRevisionClock}function currentRenderRevision(){return renderRevisionClock}var FRAME_LINE_BYTES_KEY=Symbol.for("senpi.tui.frame-line-bytes");function frameLineBytesState(){let existing=Reflect.get(globalThis,FRAME_LINE_BYTES_KEY);if(typeof existing=="object"&&existing!==null&&typeof Reflect.get(existing,"bytes")=="number")return existing;let created={bytes:0};return Reflect.set(globalThis,FRAME_LINE_BYTES_KEY,created),created}function frameLineBytesTotals(){return{previousLinesBytes:frameLineBytesState().bytes}}var CompositeRevision=class{constructor(){this.revision=nextRenderRevision(),this.children=[],this.childRevisions=[],this.checkedAt=-1}bump(){this.revision=nextRenderRevision()}read(children){let replaced=children.length!==this.children.length;for(let index=0;!replaced&&index<children.length;index++)children[index]!==this.children[index]&&(replaced=!0);if(!replaced&&this.checkedAt===renderRevisionClock)return this.revision;let revisions=[];for(let child of children){let revision=child.getRenderRevision?.();if(revision===void 0){this.children=[],this.childRevisions=[],this.checkedAt=-1;return}revisions.push(revision)}return(replaced||revisions.some((revision,index)=>revision!==this.childRevisions[index]))&&(this.revision=nextRenderRevision(),this.children=[...children]),this.childRevisions=revisions,this.checkedAt=renderRevisionClock,this.revision}},Container=class _Container{constructor(){this.children=[],this.disposed=!1,this.composite=new CompositeRevision}addChild(component){this.children.push(component),this.composite.bump()}removeChild(component){let index=this.children.indexOf(component);index!==-1&&(this.children.splice(index,1),this.composite.bump(),component.dispose?.())}detachChild(component){let index=this.children.indexOf(component);index!==-1&&(this.children.splice(index,1),this.composite.bump())}clear(){for(let child of this.children)child.dispose?.();this.children=[],this.composite.bump()}detachAll(){this.children=[],this.composite.bump()}dispose(){if(!this.disposed){this.disposed=!0;for(let child of this.children)child.dispose?.()}}invalidate(){this.composite.bump();for(let child of this.children)child.invalidate?.()}getRenderRevision(){return Object.getPrototypeOf(this)===_Container.prototype?this.childRenderRevision():void 0}childRenderRevision(){return this.composite.read(this.children)}bumpRenderRevision(){this.composite.bump()}handleMouse(event){if(event.y<0||event.y>=event.height)return;let mouseChildren=this.mouseLayout?.width===event.width?this.mouseLayout.children:this.children.map(component=>({component,height:component.render(event.width).length})),childY=0;for(let{component:child,height:childHeight}of mouseChildren){if(event.y>=childY&&event.y<childY+childHeight){let result=dispatchMouseEvent(child,{...event,y:event.y-childY,height:childHeight});return result?.focus&&this.handleInput?{...result,focusTarget:this}:result}childY+=childHeight}}render(width){let chunks=[],mouseChildren=[],row=claimFrameRow(this);for(let child of this.children){let childLines;try{childLines=renderAtFrameRow(child,width,row)}catch(error){logRenderErrorOnce(child,error),childLines=[`[render error: ${componentRenderErrorName(child)}]`]}mouseChildren.push({component:child,height:childLines.length}),chunks.push(childLines),row!==void 0&&(row+=childLines.length)}return this.mouseLayout={width,children:mouseChildren},joinLineArrays(chunks)}},JOIN_BATCH=1024;function joinLineArrays(chunks){if(chunks.length<=JOIN_BATCH)return[].concat(...chunks);let batches=[];for(let start=0;start<chunks.length;start+=JOIN_BATCH)batches.push([].concat(...chunks.slice(start,start+JOIN_BATCH)));return[].concat(...batches)}var SEGMENT_RESET="\x1B[0m\x1B]8;;\x07";function compositeTuiLine(baseLine,overlayLine,startCol,overlayWidth,totalWidth){if(isImageLine(baseLine)&&visibleWidth(baseLine)===0)return baseLine;let placeholderIndex=baseLine.indexOf("\u{10EEEE}"),protocolEnd=placeholderIndex===-1?-1:baseLine.lastIndexOf("\x1B\\",placeholderIndex),protocolPrefix=protocolEnd===-1?"":baseLine.slice(0,protocolEnd+2),afterStart=startCol+overlayWidth,base=extractSegments(baseLine,startCol,afterStart,totalWidth-afterStart,!0),overlay=sliceWithWidth(overlayLine,0,overlayWidth,!0),beforePad=Math.max(0,startCol-base.beforeWidth),overlayPad=Math.max(0,overlayWidth-overlay.width),actualBeforeWidth=Math.max(startCol,base.beforeWidth),actualOverlayWidth=Math.max(overlayWidth,overlay.width),afterTarget=Math.max(0,totalWidth-actualBeforeWidth-actualOverlayWidth),afterPad=Math.max(0,afterTarget-base.afterWidth),result=base.before+" ".repeat(beforePad)+SEGMENT_RESET+overlay.text+" ".repeat(overlayPad)+SEGMENT_RESET+base.after+" ".repeat(afterPad),composited=visibleWidth(result)<=totalWidth?result:sliceByColumn(result,0,totalWidth,!0);return protocolPrefix+composited}var VIEWPORT_TUI=Symbol.for("@earendil-works/pi-tui/viewport");function isViewportTUI(tui){return tui[VIEWPORT_TUI]===!0}var TuiBase=class extends Container{#minRenderIntervalMs;#lastCursorVisibility;get hasOverlayEntries(){return this.overlayStack.length>0}#muxDetector;constructor(terminal,options,logDirectory){super(),this.previousLines=[],this.previousRawLines=[],this.normalizeMemo=new Map,this.previousKittyImageIds=new Set,this.previousWidth=0,this.previousHeight=0,this.focusedComponent=null,this.inputListeners=new Set,this.renderRequested=!1,this.lastRenderAt=0,this.#minRenderIntervalMs=16,this.inputRenderPending=!1,this.cursorRow=0,this.hardwareCursorRow=0,this.showHardwareCursor=process.env.PI_HARDWARE_CURSOR==="1",this.clearOnShrink=process.env.PI_CLEAR_ON_SHRINK==="1",this.maxLinesRendered=0,this.previousViewportTop=0,this.fullRedrawCount=0,this.muxViewportRepaintCount=0,this.overWideCrashDumpWritten=!1,this.stopped=!1,this.pendingTerminalColorQueries=[],this.terminalColorSchemeListeners=new Set,this.terminalColorSchemeNotificationsEnabled=!1,this.focusOrderCounter=0,this.overlayStack=[],this.renderedOverlayLayouts=[],this.overlayFocusRestore={status:"inactive"},this.mouseLeases=new Map,this.mouseBlockers=new Set,this.placementEpoch=0,this.anchor={kind:"unknown",epoch:0,rows:0,columns:0},this.mouseCommittedLineCount=0,this.mouseAnchorPending=!1,this.mouseExternalWritePending=!1,this.frameLineBytes=0,this.terminal=terminal;let normalizedOptions=typeof options=="boolean"?{showHardwareCursor:options}:options??{};this.#muxDetector=normalizedOptions.muxDetector??isMultiplexerSession,this.logDirectory=logDirectory??defaultDiagnosticLogDirectory(),renderErrorLogDirectory=this.logDirectory,normalizedOptions.showHardwareCursor!==void 0&&(this.showHardwareCursor=normalizedOptions.showHardwareCursor)}acquireMouseCapture(reason){let token=Symbol(reason),first=this.mouseLeases.size===0;return this.mouseLeases.set(token,reason),first&&(this.mouseWriteUnsubscribe??=this.terminal.observeExternalWrites?.(()=>{this.placementEpoch++,this.mouseExternalWritePending=!0}),this.applyMouseTracking(this.mouseCaptureEnabled),this.calibrateMouseAnchor()),()=>{this.mouseLeases.delete(token)&&this.mouseLeases.size===0&&this.applyMouseTracking(!1)}}resetMouseCaptureState(){this.mouseLeases.clear(),this.mouseBlockers.clear(),this.mouseWriteUnsubscribe?.(),this.mouseWriteUnsubscribe=void 0,this.placementEpoch++}get mouseCaptureEnabled(){return this.mouseLeases.size>0&&this.mouseBlockers.size===0}applyMouseTracking(_enabled){}getMouseLayoutRoots(){return[...this.getMountedRoots(),...this.renderedOverlayLayouts.map(layout=>layout.entry.component)]}setMouseBlocker(name,on){this.mouseBlockers.has(name)!==on&&(on?this.mouseBlockers.add(name):this.mouseBlockers.delete(name),this.placementEpoch++,this.applyMouseTracking(this.mouseCaptureEnabled))}noteFullRender(clear){this.placementEpoch++,this.anchor={kind:clear?"cleared":"unknown",frameTopScreenRow:clear?0:void 0,epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns},this.mouseCommittedLineCount=this.previousLines.length,this.noteCommittedMouseFrame(),this.calibrateMouseAnchor()}noteCommittedMouseFrame(){if(this.mouseCommittedLineCount!==this.previousLines.length&&this.placementEpoch++,this.mouseCommittedLineCount=this.previousLines.length,this.previousLinesHaveImage()){this.placementEpoch++,this.anchor.kind="unknown";return}this.previousLines.length>=this.terminal.rows?this.anchor={kind:"viewport",epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns}:(this.anchor.epoch!==this.placementEpoch||this.anchor.rows!==this.terminal.rows||this.anchor.columns!==this.terminal.columns)&&(this.anchor={kind:"unknown",epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns})}calibrateMouseAnchor(){if(!this.mouseCaptureEnabled||this.stopped||this.mouseAnchorPending||this.mouseExternalWritePending||!this.terminal.queryCursorPosition||this.previousLines.length===0||this.previousLinesHaveImage()||this.anchor.kind!=="unknown"&&this.anchor.epoch===this.placementEpoch&&this.anchor.rows===this.terminal.rows&&this.anchor.columns===this.terminal.columns)return;let epoch=this.placementEpoch,rows=this.terminal.rows,columns=this.terminal.columns,hardwareCursorRow=this.hardwareCursorRow,lineCount=this.previousLines.length;this.mouseAnchorPending=!0,this.terminal.queryCursorPosition().then(position=>{if(this.mouseAnchorPending=!1,!position||this.stopped||!this.mouseCaptureEnabled||epoch!==this.placementEpoch||rows!==this.terminal.rows||columns!==this.terminal.columns||hardwareCursorRow!==this.hardwareCursorRow||lineCount!==this.previousLines.length)return;let top=position.row-1-hardwareCursorRow;!Number.isSafeInteger(top)||top<0||top+lineCount>rows||!Number.isSafeInteger(position.column)||position.column<1||position.column>columns+1||position.page!==void 0&&position.page!==1||(this.anchor={kind:"cpr",frameTopScreenRow:top,epoch,rows,columns})})}resolveFrameLine(screenRow){let anchor=this.anchor;if(anchor.kind==="unknown"||anchor.epoch!==this.placementEpoch||anchor.rows!==this.terminal.rows||anchor.columns!==this.terminal.columns||screenRow<1||screenRow>anchor.rows)return;let line=anchor.kind==="viewport"?this.previousViewportTop+screenRow-1:screenRow-1-(anchor.frameTopScreenRow??0);return line>=0&&line<this.previousLines.length?line:void 0}resetRenderState(){}beforeTerminalStart(){}afterTerminalStart(){}beforeTerminalStop(_options){}afterTerminalStop(_options){}get fullRedraws(){return this.fullRedrawCount}get muxViewportRepaints(){return this.muxViewportRepaintCount}getShowHardwareCursor(){return this.showHardwareCursor}setShowHardwareCursor(enabled){this.showHardwareCursor!==enabled&&(this.showHardwareCursor=enabled,this.requestRender())}getClearOnShrink(){return this.clearOnShrink}setClearOnShrink(enabled){this.clearOnShrink=enabled}getFocusedComponent(){return this.focusedComponent}setFocus(component){this.setFocusInternal({component,overlayFocusRestore:"clear"})}setFocusInternal({component,overlayFocusRestore}){let previousFocus=this.focusedComponent,nextFocus=component,previousFocusedOverlay=previousFocus?this.overlayStack.find(entry=>entry.component===previousFocus&&this.isOverlayVisible(entry)):void 0,nextFocusIsOverlay=nextFocus?this.overlayStack.some(entry=>entry.component===nextFocus):!1,restoreState=this.getVisibleOverlayFocusRestore();nextFocus&&!nextFocusIsOverlay?restoreState.status==="blocked"&&restoreState.blockedBy===previousFocus?restoreState.resume.status==="focus-target"||!this.isComponentMounted(restoreState.blockedBy)?nextFocus=this.resolveBlockedOverlayFocusResume(restoreState):this.overlayFocusRestore={status:"blocked",overlay:restoreState.overlay,blockedBy:nextFocus,resume:restoreState.resume}:previousFocusedOverlay&&restoreState.status!=="inactive"&&restoreState.overlay===previousFocusedOverlay&&!this.isOverlayFocusAncestor(previousFocusedOverlay,nextFocus)&&(this.overlayFocusRestore={status:"blocked",overlay:previousFocusedOverlay,blockedBy:nextFocus,resume:{status:"restore-overlay"}}):nextFocus===null&&(restoreState.status==="blocked"&&restoreState.blockedBy===previousFocus?nextFocus=this.resolveBlockedOverlayFocusResume(restoreState):overlayFocusRestore==="clear"&&this.clearOverlayFocusRestore()),isFocusable(this.focusedComponent)&&(this.focusedComponent.focused=!1),this.focusedComponent=nextFocus,isFocusable(nextFocus)&&(nextFocus.focused=!0);let focusedOverlay=nextFocus?this.overlayStack.find(entry=>entry.component===nextFocus&&this.isOverlayVisible(entry)):void 0;focusedOverlay&&(this.overlayFocusRestore={status:"eligible",overlay:focusedOverlay})}clearOverlayFocusRestore(){this.overlayFocusRestore={status:"inactive"}}clearOverlayFocusRestoreFor(overlay){this.overlayFocusRestore.status!=="inactive"&&this.overlayFocusRestore.overlay===overlay&&this.clearOverlayFocusRestore()}resolveBlockedOverlayFocusResume(restoreState){return restoreState.resume.status==="restore-overlay"?restoreState.overlay.component:(this.clearOverlayFocusRestore(),restoreState.resume.target)}getVisibleOverlayFocusRestore(){let restoreState=this.overlayFocusRestore;return restoreState.status==="inactive"?restoreState:!this.overlayStack.includes(restoreState.overlay)||!this.isOverlayVisible(restoreState.overlay)?{status:"inactive"}:restoreState}isOverlayFocusAncestor(entry,component){let visited=new Set,current=entry.preFocus;for(;current&&!visited.has(current);){if(visited.add(current),current===component)return!0;current=this.overlayStack.find(overlay=>overlay.component===current)?.preFocus??null}return!1}retargetOverlayPreFocus(removed){for(let overlay of this.overlayStack)overlay!==removed&&overlay.preFocus===removed.component&&(overlay.preFocus=removed.preFocus)}getMountedRoots(){return this.children}isComponentMounted(component){return this.getMountedRoots().some(child=>this.containsComponent(child,component))}containsComponent(root,target){return root===target?!0:root instanceof Container?root.children.some(child=>this.containsComponent(child,target)):!1}showOverlay(component,options){let entry={component,...options===void 0?{}:{options},preFocus:this.focusedComponent,hidden:!1,focusOrder:++this.focusOrderCounter};return this.overlayStack.push(entry),!options?.nonCapturing&&this.isOverlayVisible(entry)&&this.setFocus(component),this.#setCursorVisibility(!1),this.requestRender(),{hide:()=>{let index=this.overlayStack.indexOf(entry);if(index!==-1){if(this.clearOverlayFocusRestoreFor(entry),this.retargetOverlayPreFocus(entry),this.overlayStack.splice(index,1),this.focusedComponent===component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??entry.preFocus)}this.overlayStack.length===0&&this.#setCursorVisibility(!1),this.requestRender()}},setHidden:hidden=>{if(entry.hidden!==hidden){if(entry.hidden=hidden,hidden){if(this.clearOverlayFocusRestoreFor(entry),this.focusedComponent===component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??entry.preFocus)}}else!options?.nonCapturing&&this.isOverlayVisible(entry)&&(entry.focusOrder=++this.focusOrderCounter,this.setFocus(component));this.requestRender()}},isHidden:()=>entry.hidden,focus:()=>{!this.overlayStack.includes(entry)||!this.isOverlayVisible(entry)||(entry.focusOrder=++this.focusOrderCounter,this.setFocus(component),this.requestRender())},unfocus:unfocusOptions=>{let isFocused=this.focusedComponent===component,restoreState=this.overlayFocusRestore,hasPendingRestore=restoreState.status!=="inactive"&&restoreState.overlay===entry;if(!(!isFocused&&!hasPendingRestore)){if(restoreState.status==="blocked"&&restoreState.overlay===entry&&this.focusedComponent===restoreState.blockedBy){unfocusOptions?this.overlayFocusRestore={status:"blocked",overlay:entry,blockedBy:restoreState.blockedBy,resume:{status:"focus-target",target:unfocusOptions.target}}:this.clearOverlayFocusRestore(),this.requestRender();return}if(this.clearOverlayFocusRestoreFor(entry),isFocused||unfocusOptions){let topVisible=this.getTopmostVisibleOverlay(),fallbackTarget=topVisible&&topVisible!==entry?topVisible.component:entry.preFocus;this.setFocus(unfocusOptions?unfocusOptions.target:fallbackTarget)}this.requestRender()}},isFocused:()=>this.focusedComponent===component,getBounds:()=>{if(!(!this.overlayStack.includes(entry)||!this.isOverlayVisible(entry)||!entry.bounds))return{...entry.bounds}}}}hideOverlay(){let overlay=this.overlayStack[this.overlayStack.length-1];if(overlay){if(this.clearOverlayFocusRestoreFor(overlay),this.retargetOverlayPreFocus(overlay),this.overlayStack.pop(),this.focusedComponent===overlay.component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??overlay.preFocus)}this.overlayStack.length===0&&this.#setCursorVisibility(!1),this.requestRender()}}hasOverlay(){return this.overlayStack.some(o=>this.isOverlayVisible(o))}isOverlayFocused(){return this.overlayStack.some(entry=>entry.component===this.focusedComponent&&this.isOverlayVisible(entry))}resolveMouseFocusTarget(component){for(let index=this.overlayStack.length-1;index>=0;index--){let overlay=this.overlayStack[index];if(this.isOverlayVisible(overlay)&&this.containsComponent(overlay.component,component))return overlay.component}return canReceiveKeys(component)?component:this.findKeyFocusOwner(component)}findKeyFocusOwner(target){let path4=[],walk=node=>{if(path4.push(node),node===target)return!0;if(node instanceof Container){for(let child of node.children)if(walk(child))return!0}return path4.pop(),!1};for(let root of this.getMouseLayoutRoots())if(path4.length=0,!!walk(root)){for(let index=path4.length-2;index>=0;index--){let candidate=path4[index];if(canReceiveKeys(candidate))return candidate}return null}return null}dispatchMouseToOverlay(event){for(let index=this.renderedOverlayLayouts.length-1;index>=0;index--){let layout=this.renderedOverlayLayouts[index];if(event.screenX<layout.col||event.screenX>=layout.col+layout.width||event.screenY<layout.row||event.screenY>=layout.row+layout.height)continue;let result=dispatchMouseEvent(layout.entry.component,{...event,x:event.screenX-layout.col,y:event.screenY-layout.row,width:layout.width,height:layout.height});return result?{hit:!0,result:result.focus?{...result,focusTarget:layout.entry.component}:result}:{hit:!0}}return{hit:!1}}isOverlayVisible(entry){return entry.hidden?!1:entry.options?.visible?entry.options.visible(this.terminal.columns,this.terminal.rows):!0}getTopmostVisibleOverlay(){let topmost;for(let overlay of this.overlayStack)overlay.options?.nonCapturing||!this.isOverlayVisible(overlay)||(!topmost||overlay.focusOrder>topmost.focusOrder)&&(topmost=overlay);return topmost}invalidate(){for(let root of this.getMountedRoots())root.invalidate();for(let overlay of this.overlayStack)overlay.component.invalidate()}start(){this.stopped=!1,this.renderRequested=!1,this.inputRenderPending=!1,this.#lastCursorVisibility=void 0,this.beforeTerminalStart(),this.terminal.start(data=>this.handleTerminalInput(data),()=>this.requestRender()),this.afterTerminalStart(),process.env.TMUX&&this.terminal.write(ENABLE_FOCUS_REPORTING),this.#setCursorVisibility(!1),this.terminalColorSchemeNotificationsEnabled&&this.terminal.write("\x1B[?2031h"),this.queryCellSize(),this.requestRender()}addInputListener(listener){return this.inputListeners.add(listener),()=>{this.inputListeners.delete(listener)}}removeInputListener(listener){this.inputListeners.delete(listener)}onTerminalColorSchemeChange(listener){return this.terminalColorSchemeListeners.add(listener),()=>{this.terminalColorSchemeListeners.delete(listener)}}setTerminalColorSchemeNotifications(enabled){this.terminalColorSchemeNotificationsEnabled!==enabled&&(this.terminalColorSchemeNotificationsEnabled=enabled,this.stopped||this.terminal.write(enabled?"\x1B[?2031h":"\x1B[?2031l"))}queryCellSize(){getCapabilities().images&&this.terminal.write("\x1B[16t")}stop(options={}){if(this.stopped=!0,this.renderRequested=!1,this.inputRenderPending=!1,this.cancelRenderTimer(),this.terminalColorSchemeNotificationsEnabled&&this.terminal.write("\x1B[?2031l"),this.beforeTerminalStop(options),this.resetMouseCaptureState(),!options.preserveScreen&&this.previousLines.length>0){this.#lastCursorVisibility===!1&&this.terminal.write(" ");let lineDiff=this.previousLines.length-this.hardwareCursorRow;lineDiff>0?this.terminal.write(`\x1B[${lineDiff}B`):lineDiff<0&&this.terminal.write(`\x1B[${-lineDiff}A`),this.terminal.write(`\r
9
- `)}this.#lastCursorVisibility=void 0,this.#setCursorVisibility(!0),process.env.TMUX&&this.terminal.write(DISABLE_FOCUS_REPORTING),this.terminal.stop(),this.afterTerminalStop(options),this.resetRenderState(),this.#lastCursorVisibility=void 0,this.dropPreviousLines(),this.previousKittyImageIds.clear(),this.previousWidth=0,this.previousHeight=0,this.cursorRow=0,this.hardwareCursorRow=0,this.maxLinesRendered=0,this.previousViewportTop=0}renderNow(force=!1){force&&this.resetForcedRenderState(),this.renderRequested=!1,this.inputRenderPending=!1,this.cancelRenderTimer(),this.lastRenderAt=performance2.now(),this.doRender()}#setCursorVisibility(visible){!visible&&this.stopped||this.#lastCursorVisibility!==visible&&(visible?this.terminal.showCursor():this.terminal.hideCursor(),this.#lastCursorVisibility=visible)}requestRender(force=!1,source="unknown"){if(force){this.inputRenderPending=!1,this.resetForcedRenderState(),this.cancelRenderTimer(),this.renderRequested=!0,process.nextTick(()=>{this.stopped||!this.renderRequested||(this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender())});return}if(source==="input"||source==="editor.input"){this.inputRenderPending||(this.inputRenderPending=!0,this.renderRequested=!0,process.nextTick(()=>this.commitExpeditedRender()));return}this.renderRequested||(this.renderRequested=!0,process.nextTick(()=>this.scheduleRender()))}setMaxRenderFps(fps){let clamped=Math.min(120,Math.max(30,Math.round(fps)));this.#minRenderIntervalMs=Math.floor(1e3/clamped)}resetForcedRenderState(){this.resetRenderState(),this.dropPreviousLines(),this.previousWidth=-1,this.previousHeight=-1,this.cursorRow=0,this.hardwareCursorRow=0,this.maxLinesRendered=0,this.previousViewportTop=0}cancelRenderTimer(){this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=void 0)}scheduleRender(){if(this.stopped||this.renderTimer||!this.renderRequested)return;let elapsed=performance2.now()-this.lastRenderAt,delay=Math.max(0,this.#minRenderIntervalMs-elapsed);this.renderTimer=setTimeout(()=>{this.renderTimer=void 0,!(this.stopped||!this.renderRequested)&&(this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender(),this.renderRequested&&this.scheduleRender())},delay)}commitExpeditedRender(){this.inputRenderPending&&(this.inputRenderPending=!1,!(this.stopped||!this.renderRequested)&&(this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=void 0),this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender()))}handleTerminalInput(data){if(this.mode!=="fullscreen"){let focus=consumeTmuxFocusEvent(data);if(focus.event!==null){if(resetCapabilitiesCache(),this.invalidate(),this.requestRender(!0),focus.data.length===0)return;data=focus.data}}if(this.consumeTerminalColorResponse(data)||this.consumeTerminalColorSchemeReport(data))return;if(this.inputListeners.size>0){let current=data;for(let listener of this.inputListeners){let result=listener(current);if(result?.consume)return;result?.data!==void 0&&(current=result.data)}if(current.length===0)return;data=current}if(this.consumeCellSizeResponse(data))return;if(matchesKey(data,"shift+ctrl+d")&&this.onDebug){this.onDebug();return}let focusedOverlay=this.overlayStack.find(o=>o.component===this.focusedComponent);if(focusedOverlay&&!this.isOverlayVisible(focusedOverlay)){let topVisible=this.getTopmostVisibleOverlay();topVisible?this.setFocus(topVisible.component):this.setFocusInternal({component:focusedOverlay.preFocus,overlayFocusRestore:"preserve"})}if(!this.overlayStack.some(o=>o.component===this.focusedComponent)){let restoreState=this.getVisibleOverlayFocusRestore();restoreState.status==="eligible"?this.setFocus(restoreState.overlay.component):restoreState.status==="blocked"&&restoreState.blockedBy!==this.focusedComponent&&(restoreState.resume.status==="restore-overlay"?this.setFocus(restoreState.overlay.component):(this.clearOverlayFocusRestore(),this.setFocus(restoreState.resume.target)))}if(this.focusedComponent?.handleInput){if(isKeyRelease(data)&&!this.focusedComponent.wantsKeyRelease)return;this.focusedComponent.handleInput(data),this.requestRender(!1,"input")}}consumeTerminalColorResponse(data){let query=this.pendingTerminalColorQueries[0];if(!query)return!1;if(DEVICE_ATTRIBUTES_RESPONSE_PATTERN.test(data))return this.pendingTerminalColorQueries.shift(),this.completeTerminalColorQuery(query),!0;let response=parseOscColorResponse(data);if(!response)return!1;let{target,rgb}=response,key=String(target);return!query.deliver||query.replied.has(key)||(query.replied.add(key),target==="foreground"?query.foreground=rgb:target==="background"?query.background=rgb:target<TERMINAL_PALETTE_SIZE&&(query.palette[target]=rgb),query.replied.size===TERMINAL_COLOR_REPLY_COUNT&&this.completeTerminalColorQuery(query)),!0}terminalColorQueryResult(query){let palette=query.palette.every(color=>color!==void 0)?query.palette:void 0;return{foreground:query.foreground,background:query.background,palette}}completeTerminalColorQuery(query){let deliver=query.deliver;query.deliver=void 0,clearTimeout(query.timer),deliver?.(this.terminalColorQueryResult(query))}consumeTerminalColorSchemeReport(data){let scheme=parseTerminalColorSchemeReport(data);if(!scheme)return!1;for(let listener of this.terminalColorSchemeListeners)listener(scheme);return!0}consumeCellSizeResponse(data){let match=data.match(/^\x1b\[6;(\d+);(\d+)t$/);if(!match)return!1;let heightPx=parseInt(match[1],10),widthPx=parseInt(match[2],10);return heightPx<=0||widthPx<=0||(setCellDimensions({widthPx,heightPx}),this.invalidate(),this.requestRender()),!0}resolveOverlayLayout(options,overlayHeight,termWidth,termHeight){let opt=options??{},margin=typeof opt.margin=="number"?{top:opt.margin,right:opt.margin,bottom:opt.margin,left:opt.margin}:opt.margin??{},marginTop=Math.max(0,margin.top??0),marginRight=Math.max(0,margin.right??0),marginBottom=Math.max(0,margin.bottom??0),marginLeft=Math.max(0,margin.left??0),availWidth=Math.max(1,termWidth-marginLeft-marginRight),availHeight=Math.max(1,termHeight-marginTop-marginBottom),width=parseSizeValue(opt.width,termWidth)??Math.min(80,availWidth);opt.minWidth!==void 0&&(width=Math.max(width,opt.minWidth)),width=Math.max(1,Math.min(width,availWidth));let maxHeight=parseSizeValue(opt.maxHeight,termHeight);maxHeight!==void 0&&(maxHeight=Math.max(1,Math.min(maxHeight,availHeight)));let effectiveHeight=maxHeight!==void 0?Math.min(overlayHeight,maxHeight):overlayHeight,row,col;if(opt.row!==void 0)if(typeof opt.row=="string"){let match=opt.row.match(/^(\d+(?:\.\d+)?)%$/);if(match){let maxRow=Math.max(0,availHeight-effectiveHeight),percent=parseFloat(match[1])/100;row=marginTop+Math.floor(maxRow*percent)}else row=this.resolveAnchorRow("center",effectiveHeight,availHeight,marginTop)}else row=opt.row;else{let anchor=opt.anchor??"center";row=this.resolveAnchorRow(anchor,effectiveHeight,availHeight,marginTop)}if(opt.col!==void 0)if(typeof opt.col=="string"){let match=opt.col.match(/^(\d+(?:\.\d+)?)%$/);if(match){let maxCol=Math.max(0,availWidth-width),percent=parseFloat(match[1])/100;col=marginLeft+Math.floor(maxCol*percent)}else col=this.resolveAnchorCol("center",width,availWidth,marginLeft)}else col=opt.col;else{let anchor=opt.anchor??"center";col=this.resolveAnchorCol(anchor,width,availWidth,marginLeft)}return opt.offsetY!==void 0&&(row+=opt.offsetY),opt.offsetX!==void 0&&(col+=opt.offsetX),row=Math.max(marginTop,Math.min(row,termHeight-marginBottom-effectiveHeight)),col=Math.max(marginLeft,Math.min(col,termWidth-marginRight-width)),{width,row,col,maxHeight}}resolveAnchorRow(anchor,height,availHeight,marginTop){switch(anchor){case"top-left":case"top-center":case"top-right":return marginTop;case"bottom-left":case"bottom-center":case"bottom-right":return marginTop+availHeight-height;case"left-center":case"center":case"right-center":return marginTop+Math.floor((availHeight-height)/2)}}resolveAnchorCol(anchor,width,availWidth,marginLeft){switch(anchor){case"top-left":case"left-center":case"bottom-left":return marginLeft;case"top-right":case"right-center":case"bottom-right":return marginLeft+availWidth-width;case"top-center":case"center":case"bottom-center":return marginLeft+Math.floor((availWidth-width)/2)}}compositeOverlays(lines,termWidth,termHeight){if(this.overlayStack.length===0)return this.renderedOverlayLayouts=[],lines;let result=[...lines];for(let entry of this.overlayStack)entry.bounds=void 0;let rendered=[],minLinesNeeded=result.length,visibleEntries=this.overlayStack.filter(e=>this.isOverlayVisible(e));visibleEntries.sort((a,b2)=>a.focusOrder-b2.focusOrder);for(let entry of visibleEntries){let{component,options}=entry,{width,maxHeight}=this.resolveOverlayLayout(options,0,termWidth,termHeight),overlayLines=component.render(width);maxHeight!==void 0&&overlayLines.length>maxHeight&&(overlayLines=overlayLines.slice(0,maxHeight));let{row,col}=this.resolveOverlayLayout(options,overlayLines.length,termWidth,termHeight);entry.bounds={row,col,width,height:overlayLines.length},rendered.push({entry,overlayLines,row,col,w:width}),minLinesNeeded=Math.max(minLinesNeeded,row+overlayLines.length)}this.renderedOverlayLayouts=rendered.map(({entry,row,col,w,overlayLines})=>({entry,row,col,width:w,height:overlayLines.length}));let workingHeight=Math.max(result.length,termHeight,minLinesNeeded);for(;result.length<workingHeight;)result.push("");let viewportStart=Math.max(0,workingHeight-termHeight);for(let{overlayLines,row,col,w}of rendered)for(let i=0;i<overlayLines.length;i++){let idx=viewportStart+row+i;if(idx>=0&&idx<result.length){let truncatedOverlayLine=visibleWidth(overlayLines[i])>w?sliceByColumn(overlayLines[i],0,w,!0):overlayLines[i];result[idx]=this.compositeLineAt(result[idx],truncatedOverlayLine,col,w,termWidth)}}return result}static{this.SEGMENT_RESET="\x1B[0m\x1B]8;;\x07"}static{this.NORMALIZE_MEMO_MIN=4096}static{this.FRAME_BEGIN="\x1B[?2026h\x1B[?7l"}static{this.FRAME_END="\x1B[?7h\x1B[?2026l"}setPreviousLines(lines,rawLines){let state=frameLineBytesState();state.bytes-=this.frameLineBytes;let bytes=lines.length*8;for(let line of lines)bytes+=line.length*2;this.frameLineBytes=bytes,state.bytes+=bytes,this.previousLines=lines,this.previousRawLines=rawLines}dropPreviousLines(){this.previousLines.length===0&&this.previousRawLines.length===0&&this.frameLineBytes===0||this.setPreviousLines([],[])}previousLinesHaveImage(){let lines=this.previousLines;if(this.previousImageScan?.lines!==lines){let hint=this.normalizedImageHint?.lines===lines?this.normalizedImageHint.hasImage:void 0;this.previousImageScan={lines,hasImage:hint??lines.some(isImageLine)}}return this.previousImageScan.hasImage}hintNormalizedImages(lines,hasImage){this.normalizedImageHint=hasImage===void 0?void 0:{lines,hasImage}}normalizeLine(line){if(isImageLine(line))return{line,normalized:!1};let cached=this.normalizeMemo.get(line);if(cached!==void 0)return{line:cached,normalized:!1};let normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET;if(this.normalizeMemo.size>=Math.max(TUI.NORMALIZE_MEMO_MIN,this.previousRawLines.length*2)){let drop=this.normalizeMemo.size>>1;for(let key of this.normalizeMemo.keys()){if(drop--<=0)break;this.normalizeMemo.delete(key)}}return this.normalizeMemo.set(line,normalized),{line:normalized,normalized:!0}}applyLineResets(lines){return this.applyLineResetResult(lines).lines}applyLineResetResult(lines,mode="full"){let previousMemo=this.normalizeMemo,nextMemo=new Map,normalizedLines=[],normalizedCount=0,hasImage=!1;for(let i=0;i<lines.length;i++){let line=lines[i];if(isImageLine(line)){hasImage=!0,normalizedLines.push(line);continue}let normalized=nextMemo.get(line)??previousMemo.get(line);normalized===void 0&&(normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET,normalizedCount+=1),nextMemo.set(line,normalized),normalizedLines.push(normalized)}return this.normalizeMemo=nextMemo,this.hintNormalizedImages(normalizedLines,hasImage),recordViewportRenderStats(normalizedCount,mode),{lines:normalizedLines,firstRawChanged:0,compareEndExclusive:normalizedLines.length,bounded:!1}}applyViewportLineResets(rawLines,viewportTop,height,stableDimensions){if(!viewportRenderEnabled()||!stableDimensions||this.previousLines.length===0||this.previousRawLines.length!==this.previousLines.length)return this.applyLineResetResult(rawLines);if(this.previousRawLines.length!==rawLines.length)return this.applyResizedLineResets(rawLines);let windowStart=Math.max(0,viewportTop-VIEWPORT_RENDER_OVERSCAN),windowEnd=Math.min(rawLines.length,viewportTop+height+VIEWPORT_RENDER_OVERSCAN),firstRawChanged=-1;for(let i=0;i<rawLines.length;i++)if(rawLines[i]!==this.previousRawLines[i]&&(firstRawChanged===-1&&(firstRawChanged=i),i<windowStart||i>=windowEnd))return this.applyLineResetResult(rawLines,"escaped");let previousHadImage=this.previousLinesHaveImage(),lines=this.previousLines.slice(),normalizedCount=0,changedImage=!1;if(firstRawChanged!==-1)for(let i=windowStart;i<windowEnd;i++){if(rawLines[i]===this.previousRawLines[i])continue;let raw=rawLines[i]??"";isImageLine(raw)&&(changedImage=!0);let normalized=this.normalizeLine(raw);lines[i]=normalized.line,normalized.normalized&&(normalizedCount+=1)}return this.hintNormalizedImages(lines,previousHadImage?void 0:changedImage),recordViewportRenderStats(normalizedCount,"bounded"),{lines,firstRawChanged,compareEndExclusive:windowEnd,bounded:!0}}applyResizedLineResets(rawLines){let previousRaw=this.previousRawLines,sharedLength=Math.min(rawLines.length,previousRaw.length),firstRawChanged=0;for(;firstRawChanged<sharedLength&&rawLines[firstRawChanged]===previousRaw[firstRawChanged];)firstRawChanged++;let previousHadImage=this.previousLinesHaveImage(),lines=this.previousLines.slice(0,firstRawChanged),normalizedCount=0,tailImage=!1;for(let i=firstRawChanged;i<rawLines.length;i++){let line=rawLines[i]??"";if(isImageLine(line)){tailImage=!0,lines.push(line);continue}let normalized=this.normalizeMemo.get(line);normalized===void 0&&(normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET,normalizedCount+=1),lines.push(normalized)}return this.hintNormalizedImages(lines,previousHadImage?void 0:tailImage),recordViewportRenderStats(normalizedCount,"bounded"),{lines,firstRawChanged,compareEndExclusive:Math.max(rawLines.length,this.previousLines.length),bounded:!0}}collectKittyImageIds(lines){recordKittyImageScanStats(lines.length);let ids=new Set;for(let line of lines)for(let id of extractKittyImageIds(line))ids.add(id);return ids}deleteKittyImages(ids){let buffer="";for(let id of ids)buffer+=deleteKittyImage(id);return buffer}getKittyImageReservedRows(lines,index,maxIndex=lines.length-1){let rows=extractKittyImageRows(lines[index]??"");if(rows<=1)return 1;let maxRows=Math.min(rows,maxIndex-index+1,lines.length-index),reservedRows=1;for(;reservedRows<maxRows;){let line=lines[index+reservedRows]??"";if(isImageLine(line)||visibleWidth(line)>0)break;reservedRows++}return reservedRows}expandChangedRangeForKittyImages(firstChanged,lastChanged,newLines){let expandedFirstChanged=firstChanged,expandedLastChanged=lastChanged,expandForLines=lines=>{for(let i=0;i<lines.length;i++){if(extractKittyImageIds(lines[i]).length===0)continue;let blockEnd=i+this.getKittyImageReservedRows(lines,i)-1;(i>=firstChanged||i<=lastChanged&&blockEnd>=firstChanged)&&(expandedFirstChanged=Math.min(expandedFirstChanged,i),expandedLastChanged=Math.max(expandedLastChanged,blockEnd))}};return expandForLines(this.previousLines),expandForLines(newLines),{firstChanged:expandedFirstChanged,lastChanged:expandedLastChanged}}changedRangeNeedsKittyImageExpansion(lines,firstChanged,lastChanged){if(this.previousKittyImageIds.size>0)return!0;let start=Math.max(0,firstChanged),end=Math.min(lines.length-1,lastChanged),scannedLines=0;for(let i=start;i<=end;i++){scannedLines+=1;let line=lines[i]??"";if(isImageLine(line)||extractKittyImageIds(line).length>0)return recordKittyImageScanStats(scannedLines),!0}return recordKittyImageScanStats(scannedLines),!1}deleteChangedKittyImages(firstChanged,lastChanged){if(firstChanged<0||lastChanged<firstChanged)return"";let ids=new Set,maxLine=Math.min(lastChanged,this.previousLines.length-1);for(let i=firstChanged;i<=maxLine;i++)for(let id of extractKittyImageIds(this.previousLines[i]??""))ids.add(id);return this.deleteKittyImages(ids)}getViewportRows(lines,viewportTop,height){return Array.from({length:height},(_2,row)=>lines[viewportTop+row]??"")}shouldPreserveMuxScrollback(){return this.#muxDetector()&&!useLegacyMuxRender()}createViewportInsertScrollPlan(newLines,prevViewportTop,height,lineCountDelta){if(lineCountDelta<=0||lineCountDelta>=height||this.overlayStack.length>0)return;let maxViewportTop=Math.max(0,newLines.length-height),viewportTop=Math.min(maxViewportTop,prevViewportTop+lineCountDelta);if(viewportTop<=prevViewportTop)return;let previousVisible=this.getViewportRows(this.previousLines,prevViewportTop,height),nextVisible=this.getViewportRows(newLines,viewportTop,height);if(previousVisible.some(isImageLine)||nextVisible.some(isImageLine))return;let stableSuffixRows=0;for(;stableSuffixRows<height&&previousVisible[height-stableSuffixRows-1]===nextVisible[height-stableSuffixRows-1];)stableSuffixRows+=1;let regionHeight=height-stableSuffixRows;if(regionHeight<=0||regionHeight<lineCountDelta)return;let mutatedRows=[];for(let row=0;row<regionHeight-lineCountDelta;row++)if(previousVisible[row+lineCountDelta]!==nextVisible[row]&&(mutatedRows.push({screenRow:row,content:nextVisible[row]}),mutatedRows.length>MAX_SCROLL_DIFF_ROWS))return;return{viewportTop,regionBottom:regionHeight-1,insertedRows:nextVisible.slice(regionHeight-lineCountDelta,regionHeight),mutatedRows}}renderViewportInsertScroll(plan,newLines,rawLines,cursorPos,width,height){let buffer=TUI.FRAME_BEGIN,regionTop=0,regionBottom=plan.regionBottom;buffer+=`\x1B[${regionTop+1};${regionBottom+1}r`,buffer+=`\x1B[${regionBottom+1};1H`,buffer+=`
10
- `.repeat(plan.insertedRows.length),buffer+="\x1B[r";let firstInsertedScreenRow=regionBottom-plan.insertedRows.length+1,finalPaintedScreenRow=firstInsertedScreenRow+plan.insertedRows.length-1;for(let index=0;index<plan.insertedRows.length;index++){let screenRow=firstInsertedScreenRow+index;buffer+=`\x1B[${screenRow+1};1H\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=plan.insertedRows[index]??""}for(let row of plan.mutatedRows)buffer+=`\x1B[${row.screenRow+1};1H\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=row.content,finalPaintedScreenRow=row.screenRow;let finalCursorRow=plan.viewportTop+finalPaintedScreenRow;buffer=this.finishFrame(buffer,cursorPos,newLines.length,finalCursorRow),writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.previousViewportTop=plan.viewportTop,this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++}renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow){let buffer=TUI.FRAME_BEGIN;buffer+=this.deleteKittyImages(this.previousKittyImageIds),this.shouldPreserveMuxScrollback()||(buffer+="\x1B[3J");let currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop));currentScreenRow>0&&(buffer+=`\x1B[${currentScreenRow}A`);let bufferLength=Math.max(height,newLines.length);for(let row=0;row<bufferLength;row++)row>0&&(buffer+=`\r
11
- `),buffer+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=newLines[row]??"";buffer=this.finishFrame(buffer,cursorPos,newLines.length,bufferLength-1),writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=newLines.length,this.previousViewportTop=Math.max(0,bufferLength-height),this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++}renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop=Math.max(0,newLines.length-height)){let previousVisible=this.getViewportRows(this.previousLines,this.previousViewportTop,height),nextVisible=this.getViewportRows(newLines,viewportTop,height);if(previousVisible.some(isImageLine)||nextVisible.some(isImageLine))return!1;let buffer=TUI.FRAME_BEGIN,currentScreenRow=Math.max(0,Math.min(height-1,this.hardwareCursorRow-this.previousViewportTop));currentScreenRow>0&&(buffer+=`\x1B[${currentScreenRow}A`);for(let row=0;row<height;row++)row>0&&(buffer+=`\r
12
- `),buffer+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=newLines[viewportTop+row]??"";let finalCursorRow=viewportTop+Math.max(0,height-1);return buffer=this.finishFrame(buffer,cursorPos,newLines.length,finalCursorRow),writeBounded(this.terminal,buffer),this.muxViewportRepaintCount+=1,this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=newLines.length,this.previousViewportTop=viewportTop,this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++,!0}compositeLineAt(baseLine,overlayLine,startCol,overlayWidth,totalWidth){if(isImageLine(baseLine)&&visibleWidth(baseLine)===0)return baseLine;let placeholderIndex=baseLine.indexOf("\u{10EEEE}"),protocolEnd=placeholderIndex===-1?-1:baseLine.lastIndexOf("\x1B\\",placeholderIndex),protocolPrefix=protocolEnd===-1?"":baseLine.slice(0,protocolEnd+2),afterStart=startCol+overlayWidth,base=extractSegments(baseLine,startCol,afterStart,totalWidth-afterStart,!0),overlay=sliceWithWidth(overlayLine,0,overlayWidth,!0),beforePad=Math.max(0,startCol-base.beforeWidth),overlayPad=Math.max(0,overlayWidth-overlay.width),actualBeforeWidth=Math.max(startCol,base.beforeWidth),actualOverlayWidth=Math.max(overlayWidth,overlay.width),afterTarget=Math.max(0,totalWidth-actualBeforeWidth-actualOverlayWidth),afterPad=Math.max(0,afterTarget-base.afterWidth),r=TUI.SEGMENT_RESET,result=base.before+" ".repeat(beforePad)+r+overlay.text+" ".repeat(overlayPad)+r+base.after+" ".repeat(afterPad);return visibleWidth(result)<=totalWidth?protocolPrefix+result:protocolPrefix+sliceByColumn(result,0,totalWidth,!0)}extractCursorPosition(lines,height){let viewportTop=Math.max(0,lines.length-height);for(let row=lines.length-1;row>=viewportTop;row--){let line=lines[row],markerIndex=line.indexOf(CURSOR_MARKER);if(markerIndex!==-1){let beforeMarker=line.slice(0,markerIndex),col=visibleWidth(beforeMarker),afterMarker=line.slice(markerIndex+CURSOR_MARKER.length);if(this.showHardwareCursor&&afterMarker.startsWith(FAKE_CURSOR_START)){let fakeCursorEnd=afterMarker.indexOf(FAKE_CURSOR_END,FAKE_CURSOR_START.length),fakeCursorReset=afterMarker.indexOf(FAKE_CURSOR_RESET,FAKE_CURSOR_START.length);fakeCursorReset!==-1&&(fakeCursorEnd===-1||fakeCursorReset<fakeCursorEnd)?afterMarker=afterMarker.slice(FAKE_CURSOR_START.length):fakeCursorEnd!==-1&&(afterMarker=afterMarker.slice(FAKE_CURSOR_START.length,fakeCursorEnd)+afterMarker.slice(fakeCursorEnd+FAKE_CURSOR_END.length))}return lines[row]=beforeMarker+afterMarker,{row,col}}}return null}doRender(){if(this.stopped)return;let width=this.terminal.columns,height=this.terminal.rows,widthChanged=this.previousWidth!==0&&this.previousWidth!==width,heightChanged=this.previousHeight!==0&&this.previousHeight!==height;(widthChanged||heightChanged)&&this.placementEpoch++;let previousBufferLength=this.previousHeight>0?this.previousViewportTop+this.previousHeight:height,prevViewportTop=heightChanged?Math.max(0,previousBufferLength-height):this.previousViewportTop,viewportTop=prevViewportTop,hardwareCursorRow=this.hardwareCursorRow,computeLineDiff=targetRow=>{let currentScreenRow=hardwareCursorRow-prevViewportTop;return targetRow-viewportTop-currentScreenRow};renderFrame.scrollbackRows=this.mode==="regular"&&!widthChanged&&!heightChanged&&this.previousLines.length>0?prevViewportTop:0,renderFrame.mode=this.mode,renderFrame.rows=height;let newLines;try{newLines=renderAtFrameRow(this,width,0)}finally{renderFrame.scrollbackRows=0,renderFrame.mode=void 0}this.overlayStack.length>0&&(newLines=this.compositeOverlays(newLines,width,height));let cursorPos=this.extractCursorPosition(newLines,height),rawLines=newLines,normalizedLines=this.applyViewportLineResets(rawLines,prevViewportTop,height,!widthChanged&&!heightChanged);newLines=normalizedLines.lines;let preserveMuxScrollback=this.shouldPreserveMuxScrollback(),fullRender=(clear,clearScrollback=clear)=>{this.fullRedrawCount+=1;let buffer2=TUI.FRAME_BEGIN;clear?(buffer2+=this.deleteKittyImages(this.previousKittyImageIds),buffer2+="\x1B[2J\x1B[H",clearScrollback&&!preserveMuxScrollback&&process.platform!=="win32"&&(buffer2+="\x1B[3J")):buffer2+=`\r\x1B[2K${TUI.SEGMENT_RESET}`;for(let i=0;i<newLines.length;i++){i>0&&(buffer2+=`\r
8
+ `)}function chmodDiagnosticLogBestEffort(logPath){try{fs.chmodSync(logPath,DIAGNOSTIC_LOG_MODE)}catch(error){if(error instanceof Error)return;throw error}}function parseSizeValue(value,referenceSize){if(value===void 0)return;if(typeof value=="number")return value;let match=value.match(/^(\d+(?:\.\d+)?)%$/);if(match)return Math.floor(referenceSize*parseFloat(match[1])/100)}var renderFrame={scrollbackRows:0,offset:0,next:void 0,mode:void 0,rows:0};function frameMode(){return renderFrame.mode}var DEFAULT_HISTORY_LINES=2e3,MAX_HISTORY_LINES=5e3,terminalScrollbackLines,scrollbackLookupGeneration=0;function readTerminalScrollbackLines(){let override=Number(process.env.PI_TUI_HISTORY_LINES);if(Number.isFinite(override)&&override>0)return Math.floor(override);if(!process.env.TMUX)return null;let generation=scrollbackLookupGeneration;try{execFile("tmux",["display-message","-p","#{history_limit}"],{encoding:"utf8",timeout:500},(error,stdout)=>{if(generation!==scrollbackLookupGeneration)return;let limit=Number(stdout.trim());!error&&Number.isFinite(limit)&&limit>0&&(terminalScrollbackLines=limit)})}catch{}return null}function mainScreenHistoryLines(rows=renderFrame.rows){terminalScrollbackLines===void 0&&(terminalScrollbackLines=readTerminalScrollbackLines());let preferred=Math.min(MAX_HISTORY_LINES,terminalScrollbackLines??DEFAULT_HISTORY_LINES);return Math.min(MAX_HISTORY_LINES,Math.max(2*Math.max(1,rows),preferred))}function resetMainScreenHistoryLines(){terminalScrollbackLines=void 0,scrollbackLookupGeneration+=1}function frameScrollbackRows(){return renderFrame.scrollbackRows}function claimFrameRow(component){if(renderFrame.next===component)return renderFrame.next=void 0,renderFrame.offset}function renderAtFrameRow(child,width,row){if(row===void 0)return child.render(width);let previousOffset=renderFrame.offset,previousNext=renderFrame.next;renderFrame.offset=row,renderFrame.next=child;try{return child.render(width)}finally{renderFrame.offset=previousOffset,renderFrame.next=previousNext}}var renderRevisionClock=0;function nextRenderRevision(){return renderRevisionClock+=1,renderRevisionClock}function currentRenderRevision(){return renderRevisionClock}var FRAME_LINE_BYTES_KEY=Symbol.for("senpi.tui.frame-line-bytes");function frameLineBytesState(){let existing=Reflect.get(globalThis,FRAME_LINE_BYTES_KEY);if(typeof existing=="object"&&existing!==null&&typeof Reflect.get(existing,"bytes")=="number")return existing;let created={bytes:0};return Reflect.set(globalThis,FRAME_LINE_BYTES_KEY,created),created}function frameLineBytesTotals(){return{previousLinesBytes:frameLineBytesState().bytes}}var CompositeRevision=class{constructor(){this.revision=nextRenderRevision(),this.children=[],this.childRevisions=[],this.checkedAt=-1}bump(){this.revision=nextRenderRevision()}read(children){let replaced=children.length!==this.children.length;for(let index=0;!replaced&&index<children.length;index++)children[index]!==this.children[index]&&(replaced=!0);if(!replaced&&this.checkedAt===renderRevisionClock)return this.revision;let revisions=[];for(let child of children){let revision=child.getRenderRevision?.();if(revision===void 0){this.children=[],this.childRevisions=[],this.checkedAt=-1;return}revisions.push(revision)}return(replaced||revisions.some((revision,index)=>revision!==this.childRevisions[index]))&&(this.revision=nextRenderRevision(),this.children=[...children]),this.childRevisions=revisions,this.checkedAt=renderRevisionClock,this.revision}},Container=class _Container{constructor(){this.children=[],this.disposed=!1,this.composite=new CompositeRevision}addChild(component){this.children.push(component),this.composite.bump()}removeChild(component){let index=this.children.indexOf(component);index!==-1&&(this.children.splice(index,1),this.composite.bump(),component.dispose?.())}detachChild(component){let index=this.children.indexOf(component);index!==-1&&(this.children.splice(index,1),this.composite.bump())}clear(){for(let child of this.children)child.dispose?.();this.children=[],this.composite.bump()}detachAll(){this.children=[],this.composite.bump()}dispose(){if(!this.disposed){this.disposed=!0;for(let child of this.children)child.dispose?.()}}invalidate(){this.composite.bump();for(let child of this.children)child.invalidate?.()}getRenderRevision(){return Object.getPrototypeOf(this)===_Container.prototype?this.childRenderRevision():void 0}childRenderRevision(){return this.composite.read(this.children)}bumpRenderRevision(){this.composite.bump()}handleMouse(event){if(event.y<0||event.y>=event.height)return;let mouseChildren=this.mouseLayout?.width===event.width?this.mouseLayout.children:this.children.map(component=>({component,height:component.render(event.width).length})),childY=0;for(let{component:child,height:childHeight}of mouseChildren){if(event.y>=childY&&event.y<childY+childHeight){let result=dispatchMouseEvent(child,{...event,y:event.y-childY,height:childHeight});return result?.focus&&this.handleInput?{...result,focusTarget:this}:result}childY+=childHeight}}render(width){let chunks=[],mouseChildren=[],row=claimFrameRow(this);for(let child of this.children){let childLines;try{childLines=renderAtFrameRow(child,width,row)}catch(error){logRenderErrorOnce(child,error),childLines=[`[render error: ${componentRenderErrorName(child)}]`]}mouseChildren.push({component:child,height:childLines.length}),chunks.push(childLines),row!==void 0&&(row+=childLines.length)}return this.mouseLayout={width,children:mouseChildren},joinLineArrays(chunks)}},JOIN_BATCH=1024;function joinLineArrays(chunks){if(chunks.length<=JOIN_BATCH)return[].concat(...chunks);let batches=[];for(let start=0;start<chunks.length;start+=JOIN_BATCH)batches.push([].concat(...chunks.slice(start,start+JOIN_BATCH)));return[].concat(...batches)}var SEGMENT_RESET="\x1B[0m\x1B]8;;\x07";function compositeTuiLine(baseLine,overlayLine,startCol,overlayWidth,totalWidth){if(isImageLine(baseLine)&&visibleWidth(baseLine)===0)return baseLine;let placeholderIndex=baseLine.indexOf("\u{10EEEE}"),protocolEnd=placeholderIndex===-1?-1:baseLine.lastIndexOf("\x1B\\",placeholderIndex),protocolPrefix=protocolEnd===-1?"":baseLine.slice(0,protocolEnd+2),afterStart=startCol+overlayWidth,base=extractSegments(baseLine,startCol,afterStart,totalWidth-afterStart,!0),overlay=sliceWithWidth(overlayLine,0,overlayWidth,!0),beforePad=Math.max(0,startCol-base.beforeWidth),overlayPad=Math.max(0,overlayWidth-overlay.width),actualBeforeWidth=Math.max(startCol,base.beforeWidth),actualOverlayWidth=Math.max(overlayWidth,overlay.width),afterTarget=Math.max(0,totalWidth-actualBeforeWidth-actualOverlayWidth),afterPad=Math.max(0,afterTarget-base.afterWidth),result=base.before+" ".repeat(beforePad)+SEGMENT_RESET+overlay.text+" ".repeat(overlayPad)+SEGMENT_RESET+base.after+" ".repeat(afterPad),composited=visibleWidth(result)<=totalWidth?result:sliceByColumn(result,0,totalWidth,!0);return protocolPrefix+composited}var VIEWPORT_TUI=Symbol.for("@earendil-works/pi-tui/viewport");function isViewportTUI(tui){return tui[VIEWPORT_TUI]===!0}var TuiBase=class extends Container{#minRenderIntervalMs;#lastCursorVisibility;#holdScrollbackReplay;#releaseHoldOnInput;#scrollbackStale;#scrollbackCatchUpPending;get hasOverlayEntries(){return this.overlayStack.length>0}#muxDetector;constructor(terminal,options,logDirectory){super(),this.previousLines=[],this.previousRawLines=[],this.normalizeMemo=new Map,this.previousKittyImageIds=new Set,this.previousWidth=0,this.previousHeight=0,this.focusedComponent=null,this.inputListeners=new Set,this.renderRequested=!1,this.lastRenderAt=0,this.#minRenderIntervalMs=16,this.inputRenderPending=!1,this.cursorRow=0,this.hardwareCursorRow=0,this.showHardwareCursor=process.env.PI_HARDWARE_CURSOR==="1",this.clearOnShrink=process.env.PI_CLEAR_ON_SHRINK==="1",this.maxLinesRendered=0,this.previousViewportTop=0,this.fullRedrawCount=0,this.muxViewportRepaintCount=0,this.overWideCrashDumpWritten=!1,this.stopped=!1,this.pendingTerminalColorQueries=[],this.terminalColorSchemeListeners=new Set,this.terminalColorSchemeNotificationsEnabled=!1,this.#holdScrollbackReplay=!1,this.#releaseHoldOnInput=!1,this.#scrollbackStale=!1,this.#scrollbackCatchUpPending=!1,this.focusOrderCounter=0,this.overlayStack=[],this.renderedOverlayLayouts=[],this.overlayFocusRestore={status:"inactive"},this.mouseLeases=new Map,this.mouseBlockers=new Set,this.placementEpoch=0,this.anchor={kind:"unknown",epoch:0,rows:0,columns:0},this.mouseCommittedLineCount=0,this.mouseAnchorPending=!1,this.mouseExternalWritePending=!1,this.frameLineBytes=0,this.terminal=terminal;let normalizedOptions=typeof options=="boolean"?{showHardwareCursor:options}:options??{};this.#muxDetector=normalizedOptions.muxDetector??isMultiplexerSession,this.logDirectory=logDirectory??defaultDiagnosticLogDirectory(),renderErrorLogDirectory=this.logDirectory,normalizedOptions.showHardwareCursor!==void 0&&(this.showHardwareCursor=normalizedOptions.showHardwareCursor)}acquireMouseCapture(reason){let token=Symbol(reason),first=this.mouseLeases.size===0;return this.mouseLeases.set(token,reason),first&&(this.mouseWriteUnsubscribe??=this.terminal.observeExternalWrites?.(()=>{this.placementEpoch++,this.mouseExternalWritePending=!0}),this.applyMouseTracking(this.mouseCaptureEnabled),this.calibrateMouseAnchor()),()=>{this.mouseLeases.delete(token)&&this.mouseLeases.size===0&&this.applyMouseTracking(!1)}}resetMouseCaptureState(){this.mouseLeases.clear(),this.mouseBlockers.clear(),this.mouseWriteUnsubscribe?.(),this.mouseWriteUnsubscribe=void 0,this.placementEpoch++}get mouseCaptureEnabled(){return this.mouseLeases.size>0&&this.mouseBlockers.size===0}applyMouseTracking(_enabled){}getMouseLayoutRoots(){return[...this.getMountedRoots(),...this.renderedOverlayLayouts.map(layout=>layout.entry.component)]}setMouseBlocker(name,on){this.mouseBlockers.has(name)!==on&&(on?this.mouseBlockers.add(name):this.mouseBlockers.delete(name),this.placementEpoch++,this.applyMouseTracking(this.mouseCaptureEnabled))}noteFullRender(clear){this.placementEpoch++,this.anchor={kind:clear?"cleared":"unknown",frameTopScreenRow:clear?0:void 0,epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns},this.mouseCommittedLineCount=this.previousLines.length,this.noteCommittedMouseFrame(),this.calibrateMouseAnchor()}noteCommittedMouseFrame(){if(this.mouseCommittedLineCount!==this.previousLines.length&&this.placementEpoch++,this.mouseCommittedLineCount=this.previousLines.length,this.previousLinesHaveImage()){this.placementEpoch++,this.anchor.kind="unknown";return}this.previousLines.length>=this.terminal.rows?this.anchor={kind:"viewport",epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns}:(this.anchor.epoch!==this.placementEpoch||this.anchor.rows!==this.terminal.rows||this.anchor.columns!==this.terminal.columns)&&(this.anchor={kind:"unknown",epoch:this.placementEpoch,rows:this.terminal.rows,columns:this.terminal.columns})}calibrateMouseAnchor(){if(!this.mouseCaptureEnabled||this.stopped||this.mouseAnchorPending||this.mouseExternalWritePending||!this.terminal.queryCursorPosition||this.previousLines.length===0||this.previousLinesHaveImage()||this.anchor.kind!=="unknown"&&this.anchor.epoch===this.placementEpoch&&this.anchor.rows===this.terminal.rows&&this.anchor.columns===this.terminal.columns)return;let epoch=this.placementEpoch,rows=this.terminal.rows,columns=this.terminal.columns,hardwareCursorRow=this.hardwareCursorRow,lineCount=this.previousLines.length;this.mouseAnchorPending=!0,this.terminal.queryCursorPosition().then(position=>{if(this.mouseAnchorPending=!1,!position||this.stopped||!this.mouseCaptureEnabled||epoch!==this.placementEpoch||rows!==this.terminal.rows||columns!==this.terminal.columns||hardwareCursorRow!==this.hardwareCursorRow||lineCount!==this.previousLines.length)return;let top=position.row-1-hardwareCursorRow;!Number.isSafeInteger(top)||top<0||top+lineCount>rows||!Number.isSafeInteger(position.column)||position.column<1||position.column>columns+1||position.page!==void 0&&position.page!==1||(this.anchor={kind:"cpr",frameTopScreenRow:top,epoch,rows,columns})})}resolveFrameLine(screenRow){let anchor=this.anchor;if(anchor.kind==="unknown"||anchor.epoch!==this.placementEpoch||anchor.rows!==this.terminal.rows||anchor.columns!==this.terminal.columns||screenRow<1||screenRow>anchor.rows)return;let line=anchor.kind==="viewport"?this.previousViewportTop+screenRow-1:screenRow-1-(anchor.frameTopScreenRow??0);return line>=0&&line<this.previousLines.length?line:void 0}resetRenderState(){}beforeTerminalStart(){}afterTerminalStart(){}beforeTerminalStop(_options){}afterTerminalStop(_options){}get fullRedraws(){return this.fullRedrawCount}get muxViewportRepaints(){return this.muxViewportRepaintCount}getShowHardwareCursor(){return this.showHardwareCursor}setShowHardwareCursor(enabled){this.showHardwareCursor!==enabled&&(this.showHardwareCursor=enabled,this.requestRender())}getClearOnShrink(){return this.clearOnShrink}setClearOnShrink(enabled){this.clearOnShrink=enabled}getFocusedComponent(){return this.focusedComponent}setFocus(component){this.setFocusInternal({component,overlayFocusRestore:"clear"})}setFocusInternal({component,overlayFocusRestore}){let previousFocus=this.focusedComponent,nextFocus=component,previousFocusedOverlay=previousFocus?this.overlayStack.find(entry=>entry.component===previousFocus&&this.isOverlayVisible(entry)):void 0,nextFocusIsOverlay=nextFocus?this.overlayStack.some(entry=>entry.component===nextFocus):!1,restoreState=this.getVisibleOverlayFocusRestore();nextFocus&&!nextFocusIsOverlay?restoreState.status==="blocked"&&restoreState.blockedBy===previousFocus?restoreState.resume.status==="focus-target"||!this.isComponentMounted(restoreState.blockedBy)?nextFocus=this.resolveBlockedOverlayFocusResume(restoreState):this.overlayFocusRestore={status:"blocked",overlay:restoreState.overlay,blockedBy:nextFocus,resume:restoreState.resume}:previousFocusedOverlay&&restoreState.status!=="inactive"&&restoreState.overlay===previousFocusedOverlay&&!this.isOverlayFocusAncestor(previousFocusedOverlay,nextFocus)&&(this.overlayFocusRestore={status:"blocked",overlay:previousFocusedOverlay,blockedBy:nextFocus,resume:{status:"restore-overlay"}}):nextFocus===null&&(restoreState.status==="blocked"&&restoreState.blockedBy===previousFocus?nextFocus=this.resolveBlockedOverlayFocusResume(restoreState):overlayFocusRestore==="clear"&&this.clearOverlayFocusRestore()),isFocusable(this.focusedComponent)&&(this.focusedComponent.focused=!1),this.focusedComponent=nextFocus,isFocusable(nextFocus)&&(nextFocus.focused=!0);let focusedOverlay=nextFocus?this.overlayStack.find(entry=>entry.component===nextFocus&&this.isOverlayVisible(entry)):void 0;focusedOverlay&&(this.overlayFocusRestore={status:"eligible",overlay:focusedOverlay})}clearOverlayFocusRestore(){this.overlayFocusRestore={status:"inactive"}}clearOverlayFocusRestoreFor(overlay){this.overlayFocusRestore.status!=="inactive"&&this.overlayFocusRestore.overlay===overlay&&this.clearOverlayFocusRestore()}resolveBlockedOverlayFocusResume(restoreState){return restoreState.resume.status==="restore-overlay"?restoreState.overlay.component:(this.clearOverlayFocusRestore(),restoreState.resume.target)}getVisibleOverlayFocusRestore(){let restoreState=this.overlayFocusRestore;return restoreState.status==="inactive"?restoreState:!this.overlayStack.includes(restoreState.overlay)||!this.isOverlayVisible(restoreState.overlay)?{status:"inactive"}:restoreState}isOverlayFocusAncestor(entry,component){let visited=new Set,current=entry.preFocus;for(;current&&!visited.has(current);){if(visited.add(current),current===component)return!0;current=this.overlayStack.find(overlay=>overlay.component===current)?.preFocus??null}return!1}retargetOverlayPreFocus(removed){for(let overlay of this.overlayStack)overlay!==removed&&overlay.preFocus===removed.component&&(overlay.preFocus=removed.preFocus)}getMountedRoots(){return this.children}isComponentMounted(component){return this.getMountedRoots().some(child=>this.containsComponent(child,component))}containsComponent(root,target){return root===target?!0:root instanceof Container?root.children.some(child=>this.containsComponent(child,target)):!1}showOverlay(component,options){let entry={component,...options===void 0?{}:{options},preFocus:this.focusedComponent,hidden:!1,focusOrder:++this.focusOrderCounter};return this.overlayStack.push(entry),!options?.nonCapturing&&this.isOverlayVisible(entry)&&this.setFocus(component),this.#setCursorVisibility(!1),this.requestRender(),{hide:()=>{let index=this.overlayStack.indexOf(entry);if(index!==-1){if(this.clearOverlayFocusRestoreFor(entry),this.retargetOverlayPreFocus(entry),this.overlayStack.splice(index,1),this.focusedComponent===component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??entry.preFocus)}this.overlayStack.length===0&&this.#setCursorVisibility(!1),this.requestRender()}},setHidden:hidden=>{if(entry.hidden!==hidden){if(entry.hidden=hidden,hidden){if(this.clearOverlayFocusRestoreFor(entry),this.focusedComponent===component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??entry.preFocus)}}else!options?.nonCapturing&&this.isOverlayVisible(entry)&&(entry.focusOrder=++this.focusOrderCounter,this.setFocus(component));this.requestRender()}},isHidden:()=>entry.hidden,focus:()=>{!this.overlayStack.includes(entry)||!this.isOverlayVisible(entry)||(entry.focusOrder=++this.focusOrderCounter,this.setFocus(component),this.requestRender())},unfocus:unfocusOptions=>{let isFocused=this.focusedComponent===component,restoreState=this.overlayFocusRestore,hasPendingRestore=restoreState.status!=="inactive"&&restoreState.overlay===entry;if(!(!isFocused&&!hasPendingRestore)){if(restoreState.status==="blocked"&&restoreState.overlay===entry&&this.focusedComponent===restoreState.blockedBy){unfocusOptions?this.overlayFocusRestore={status:"blocked",overlay:entry,blockedBy:restoreState.blockedBy,resume:{status:"focus-target",target:unfocusOptions.target}}:this.clearOverlayFocusRestore(),this.requestRender();return}if(this.clearOverlayFocusRestoreFor(entry),isFocused||unfocusOptions){let topVisible=this.getTopmostVisibleOverlay(),fallbackTarget=topVisible&&topVisible!==entry?topVisible.component:entry.preFocus;this.setFocus(unfocusOptions?unfocusOptions.target:fallbackTarget)}this.requestRender()}},isFocused:()=>this.focusedComponent===component,getBounds:()=>{if(!(!this.overlayStack.includes(entry)||!this.isOverlayVisible(entry)||!entry.bounds))return{...entry.bounds}}}}hideOverlay(){let overlay=this.overlayStack[this.overlayStack.length-1];if(overlay){if(this.clearOverlayFocusRestoreFor(overlay),this.retargetOverlayPreFocus(overlay),this.overlayStack.pop(),this.focusedComponent===overlay.component){let topVisible=this.getTopmostVisibleOverlay();this.setFocus(topVisible?.component??overlay.preFocus)}this.overlayStack.length===0&&this.#setCursorVisibility(!1),this.requestRender()}}hasOverlay(){return this.overlayStack.some(o=>this.isOverlayVisible(o))}isOverlayFocused(){return this.overlayStack.some(entry=>entry.component===this.focusedComponent&&this.isOverlayVisible(entry))}resolveMouseFocusTarget(component){for(let index=this.overlayStack.length-1;index>=0;index--){let overlay=this.overlayStack[index];if(this.isOverlayVisible(overlay)&&this.containsComponent(overlay.component,component))return overlay.component}return canReceiveKeys(component)?component:this.findKeyFocusOwner(component)}findKeyFocusOwner(target){let path4=[],walk=node=>{if(path4.push(node),node===target)return!0;if(node instanceof Container){for(let child of node.children)if(walk(child))return!0}return path4.pop(),!1};for(let root of this.getMouseLayoutRoots())if(path4.length=0,!!walk(root)){for(let index=path4.length-2;index>=0;index--){let candidate=path4[index];if(canReceiveKeys(candidate))return candidate}return null}return null}dispatchMouseToOverlay(event){for(let index=this.renderedOverlayLayouts.length-1;index>=0;index--){let layout=this.renderedOverlayLayouts[index];if(event.screenX<layout.col||event.screenX>=layout.col+layout.width||event.screenY<layout.row||event.screenY>=layout.row+layout.height)continue;let result=dispatchMouseEvent(layout.entry.component,{...event,x:event.screenX-layout.col,y:event.screenY-layout.row,width:layout.width,height:layout.height});return result?{hit:!0,result:result.focus?{...result,focusTarget:layout.entry.component}:result}:{hit:!0}}return{hit:!1}}isOverlayVisible(entry){return entry.hidden?!1:entry.options?.visible?entry.options.visible(this.terminal.columns,this.terminal.rows):!0}getTopmostVisibleOverlay(){let topmost;for(let overlay of this.overlayStack)overlay.options?.nonCapturing||!this.isOverlayVisible(overlay)||(!topmost||overlay.focusOrder>topmost.focusOrder)&&(topmost=overlay);return topmost}invalidate(){for(let root of this.getMountedRoots())root.invalidate();for(let overlay of this.overlayStack)overlay.component.invalidate()}start(){this.stopped=!1,this.renderRequested=!1,this.inputRenderPending=!1,this.#lastCursorVisibility=void 0,this.beforeTerminalStart(),this.terminal.start(data=>this.handleTerminalInput(data),()=>this.requestRender()),this.afterTerminalStart(),process.env.TMUX&&this.terminal.write(ENABLE_FOCUS_REPORTING),this.#setCursorVisibility(!1),this.terminalColorSchemeNotificationsEnabled&&this.terminal.write("\x1B[?2031h"),this.queryCellSize(),this.requestRender()}addInputListener(listener){return this.inputListeners.add(listener),()=>{this.inputListeners.delete(listener)}}removeInputListener(listener){this.inputListeners.delete(listener)}onTerminalColorSchemeChange(listener){return this.terminalColorSchemeListeners.add(listener),()=>{this.terminalColorSchemeListeners.delete(listener)}}setTerminalColorSchemeNotifications(enabled){this.terminalColorSchemeNotificationsEnabled!==enabled&&(this.terminalColorSchemeNotificationsEnabled=enabled,this.stopped||this.terminal.write(enabled?"\x1B[?2031h":"\x1B[?2031l"))}queryCellSize(){getCapabilities().images&&this.terminal.write("\x1B[16t")}stop(options={}){if(this.stopped=!0,this.#scrollbackStale=!1,this.#scrollbackCatchUpPending=!1,this.renderRequested=!1,this.inputRenderPending=!1,this.cancelRenderTimer(),this.terminalColorSchemeNotificationsEnabled&&this.terminal.write("\x1B[?2031l"),this.beforeTerminalStop(options),this.resetMouseCaptureState(),!options.preserveScreen&&this.previousLines.length>0){this.#lastCursorVisibility===!1&&this.terminal.write(" ");let lineDiff=this.previousLines.length-this.hardwareCursorRow;lineDiff>0?this.terminal.write(`\x1B[${lineDiff}B`):lineDiff<0&&this.terminal.write(`\x1B[${-lineDiff}A`),this.terminal.write(`\r
9
+ `)}this.#lastCursorVisibility=void 0,this.#setCursorVisibility(!0),process.env.TMUX&&this.terminal.write(DISABLE_FOCUS_REPORTING),this.terminal.stop(),this.afterTerminalStop(options),this.resetRenderState(),this.#lastCursorVisibility=void 0,this.dropPreviousLines(),this.previousKittyImageIds.clear(),this.previousWidth=0,this.previousHeight=0,this.cursorRow=0,this.hardwareCursorRow=0,this.maxLinesRendered=0,this.previousViewportTop=0}setScrollbackReplayHold(hold){this.#holdScrollbackReplay=hold!==!1,this.#releaseHoldOnInput=hold==="until-input"}catchUpScrollback(){this.#scrollbackStale&&(this.#scrollbackStale=!1,this.#scrollbackCatchUpPending=!0,this.requestRender())}renderNow(force=!1){force&&this.resetForcedRenderState(),this.renderRequested=!1,this.inputRenderPending=!1,this.cancelRenderTimer(),this.lastRenderAt=performance2.now(),this.doRender()}#setCursorVisibility(visible){!visible&&this.stopped||this.#lastCursorVisibility!==visible&&(visible?this.terminal.showCursor():this.terminal.hideCursor(),this.#lastCursorVisibility=visible)}requestRender(force=!1,source="unknown"){if(force){this.inputRenderPending=!1,this.resetForcedRenderState(),this.cancelRenderTimer(),this.renderRequested=!0,process.nextTick(()=>{this.stopped||!this.renderRequested||(this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender())});return}if(source==="input"||source==="editor.input"){this.inputRenderPending||(this.inputRenderPending=!0,this.renderRequested=!0,process.nextTick(()=>this.commitExpeditedRender()));return}this.renderRequested||(this.renderRequested=!0,process.nextTick(()=>this.scheduleRender()))}setMaxRenderFps(fps){let clamped=Math.min(120,Math.max(30,Math.round(fps)));this.#minRenderIntervalMs=Math.floor(1e3/clamped)}resetForcedRenderState(){this.#scrollbackCatchUpPending=!1,this.resetRenderState(),this.dropPreviousLines(),this.previousWidth=-1,this.previousHeight=-1,this.cursorRow=0,this.hardwareCursorRow=0,this.maxLinesRendered=0,this.previousViewportTop=0}cancelRenderTimer(){this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=void 0)}scheduleRender(){if(this.stopped||this.renderTimer||!this.renderRequested)return;let elapsed=performance2.now()-this.lastRenderAt,delay=Math.max(0,this.#minRenderIntervalMs-elapsed);this.renderTimer=setTimeout(()=>{this.renderTimer=void 0,!(this.stopped||!this.renderRequested)&&(this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender(),this.renderRequested&&this.scheduleRender())},delay)}commitExpeditedRender(){this.inputRenderPending&&(this.inputRenderPending=!1,!(this.stopped||!this.renderRequested)&&(this.renderTimer&&(clearTimeout(this.renderTimer),this.renderTimer=void 0),this.renderRequested=!1,this.lastRenderAt=performance2.now(),this.doRender()))}handleTerminalInput(data){if(this.mode!=="fullscreen"){let focus=consumeTmuxFocusEvent(data);if(focus.event!==null){if(resetCapabilitiesCache(),this.invalidate(),this.requestRender(!0),focus.data.length===0)return;data=focus.data}}if(this.consumeTerminalColorResponse(data)||this.consumeTerminalColorSchemeReport(data))return;if(isTerminalReport(data)||(this.#releaseHoldOnInput&&(this.#releaseHoldOnInput=!1,this.#holdScrollbackReplay=!1),this.catchUpScrollback()),this.inputListeners.size>0){let current=data;for(let listener of this.inputListeners){let result=listener(current);if(result?.consume)return;result?.data!==void 0&&(current=result.data)}if(current.length===0)return;data=current}if(this.consumeCellSizeResponse(data))return;if(matchesKey(data,"shift+ctrl+d")&&this.onDebug){this.onDebug();return}let focusedOverlay=this.overlayStack.find(o=>o.component===this.focusedComponent);if(focusedOverlay&&!this.isOverlayVisible(focusedOverlay)){let topVisible=this.getTopmostVisibleOverlay();topVisible?this.setFocus(topVisible.component):this.setFocusInternal({component:focusedOverlay.preFocus,overlayFocusRestore:"preserve"})}if(!this.overlayStack.some(o=>o.component===this.focusedComponent)){let restoreState=this.getVisibleOverlayFocusRestore();restoreState.status==="eligible"?this.setFocus(restoreState.overlay.component):restoreState.status==="blocked"&&restoreState.blockedBy!==this.focusedComponent&&(restoreState.resume.status==="restore-overlay"?this.setFocus(restoreState.overlay.component):(this.clearOverlayFocusRestore(),this.setFocus(restoreState.resume.target)))}if(this.focusedComponent?.handleInput){if(isKeyRelease(data)&&!this.focusedComponent.wantsKeyRelease)return;this.focusedComponent.handleInput(data),this.requestRender(!1,"input")}}consumeTerminalColorResponse(data){let query=this.pendingTerminalColorQueries[0];if(!query)return!1;if(DEVICE_ATTRIBUTES_RESPONSE_PATTERN.test(data))return this.pendingTerminalColorQueries.shift(),this.completeTerminalColorQuery(query),!0;let response=parseOscColorResponse(data);if(!response)return!1;let{target,rgb}=response,key=String(target);return!query.deliver||query.replied.has(key)||(query.replied.add(key),target==="foreground"?query.foreground=rgb:target==="background"?query.background=rgb:target<TERMINAL_PALETTE_SIZE&&(query.palette[target]=rgb),query.replied.size===TERMINAL_COLOR_REPLY_COUNT&&this.completeTerminalColorQuery(query)),!0}terminalColorQueryResult(query){let palette=query.palette.every(color=>color!==void 0)?query.palette:void 0;return{foreground:query.foreground,background:query.background,palette}}completeTerminalColorQuery(query){let deliver=query.deliver;query.deliver=void 0,clearTimeout(query.timer),deliver?.(this.terminalColorQueryResult(query))}consumeTerminalColorSchemeReport(data){let scheme=parseTerminalColorSchemeReport(data);if(!scheme)return!1;for(let listener of this.terminalColorSchemeListeners)listener(scheme);return!0}consumeCellSizeResponse(data){let match=data.match(/^\x1b\[6;(\d+);(\d+)t$/);if(!match)return!1;let heightPx=parseInt(match[1],10),widthPx=parseInt(match[2],10);return heightPx<=0||widthPx<=0||(setCellDimensions({widthPx,heightPx}),this.invalidate(),this.requestRender()),!0}resolveOverlayLayout(options,overlayHeight,termWidth,termHeight){let opt=options??{},margin=typeof opt.margin=="number"?{top:opt.margin,right:opt.margin,bottom:opt.margin,left:opt.margin}:opt.margin??{},marginTop=Math.max(0,margin.top??0),marginRight=Math.max(0,margin.right??0),marginBottom=Math.max(0,margin.bottom??0),marginLeft=Math.max(0,margin.left??0),availWidth=Math.max(1,termWidth-marginLeft-marginRight),availHeight=Math.max(1,termHeight-marginTop-marginBottom),width=parseSizeValue(opt.width,termWidth)??Math.min(80,availWidth);opt.minWidth!==void 0&&(width=Math.max(width,opt.minWidth)),width=Math.max(1,Math.min(width,availWidth));let maxHeight=parseSizeValue(opt.maxHeight,termHeight);maxHeight!==void 0&&(maxHeight=Math.max(1,Math.min(maxHeight,availHeight)));let effectiveHeight=maxHeight!==void 0?Math.min(overlayHeight,maxHeight):overlayHeight,row,col;if(opt.row!==void 0)if(typeof opt.row=="string"){let match=opt.row.match(/^(\d+(?:\.\d+)?)%$/);if(match){let maxRow=Math.max(0,availHeight-effectiveHeight),percent=parseFloat(match[1])/100;row=marginTop+Math.floor(maxRow*percent)}else row=this.resolveAnchorRow("center",effectiveHeight,availHeight,marginTop)}else row=opt.row;else{let anchor=opt.anchor??"center";row=this.resolveAnchorRow(anchor,effectiveHeight,availHeight,marginTop)}if(opt.col!==void 0)if(typeof opt.col=="string"){let match=opt.col.match(/^(\d+(?:\.\d+)?)%$/);if(match){let maxCol=Math.max(0,availWidth-width),percent=parseFloat(match[1])/100;col=marginLeft+Math.floor(maxCol*percent)}else col=this.resolveAnchorCol("center",width,availWidth,marginLeft)}else col=opt.col;else{let anchor=opt.anchor??"center";col=this.resolveAnchorCol(anchor,width,availWidth,marginLeft)}return opt.offsetY!==void 0&&(row+=opt.offsetY),opt.offsetX!==void 0&&(col+=opt.offsetX),row=Math.max(marginTop,Math.min(row,termHeight-marginBottom-effectiveHeight)),col=Math.max(marginLeft,Math.min(col,termWidth-marginRight-width)),{width,row,col,maxHeight}}resolveAnchorRow(anchor,height,availHeight,marginTop){switch(anchor){case"top-left":case"top-center":case"top-right":return marginTop;case"bottom-left":case"bottom-center":case"bottom-right":return marginTop+availHeight-height;case"left-center":case"center":case"right-center":return marginTop+Math.floor((availHeight-height)/2)}}resolveAnchorCol(anchor,width,availWidth,marginLeft){switch(anchor){case"top-left":case"left-center":case"bottom-left":return marginLeft;case"top-right":case"right-center":case"bottom-right":return marginLeft+availWidth-width;case"top-center":case"center":case"bottom-center":return marginLeft+Math.floor((availWidth-width)/2)}}compositeOverlays(lines,termWidth,termHeight){if(this.overlayStack.length===0)return this.renderedOverlayLayouts=[],lines;let result=[...lines];for(let entry of this.overlayStack)entry.bounds=void 0;let rendered=[],minLinesNeeded=result.length,visibleEntries=this.overlayStack.filter(e=>this.isOverlayVisible(e));visibleEntries.sort((a,b2)=>a.focusOrder-b2.focusOrder);for(let entry of visibleEntries){let{component,options}=entry,{width,maxHeight}=this.resolveOverlayLayout(options,0,termWidth,termHeight),overlayLines=component.render(width);maxHeight!==void 0&&overlayLines.length>maxHeight&&(overlayLines=overlayLines.slice(0,maxHeight));let{row,col}=this.resolveOverlayLayout(options,overlayLines.length,termWidth,termHeight);entry.bounds={row,col,width,height:overlayLines.length},rendered.push({entry,overlayLines,row,col,w:width}),minLinesNeeded=Math.max(minLinesNeeded,row+overlayLines.length)}this.renderedOverlayLayouts=rendered.map(({entry,row,col,w,overlayLines})=>({entry,row,col,width:w,height:overlayLines.length}));let workingHeight=Math.max(result.length,termHeight,minLinesNeeded);for(;result.length<workingHeight;)result.push("");let viewportStart=Math.max(0,workingHeight-termHeight);for(let{overlayLines,row,col,w}of rendered)for(let i=0;i<overlayLines.length;i++){let idx=viewportStart+row+i;if(idx>=0&&idx<result.length){let truncatedOverlayLine=visibleWidth(overlayLines[i])>w?sliceByColumn(overlayLines[i],0,w,!0):overlayLines[i];result[idx]=this.compositeLineAt(result[idx],truncatedOverlayLine,col,w,termWidth)}}return result}static{this.SEGMENT_RESET="\x1B[0m\x1B]8;;\x07"}static{this.NORMALIZE_MEMO_MIN=4096}static{this.FRAME_BEGIN="\x1B[?2026h\x1B[?7l"}static{this.FRAME_END="\x1B[?7h\x1B[?2026l"}setPreviousLines(lines,rawLines){let state=frameLineBytesState();state.bytes-=this.frameLineBytes;let bytes=lines.length*8;for(let line of lines)bytes+=line.length*2;this.frameLineBytes=bytes,state.bytes+=bytes,this.previousLines=lines,this.previousRawLines=rawLines}dropPreviousLines(){this.previousLines.length===0&&this.previousRawLines.length===0&&this.frameLineBytes===0||this.setPreviousLines([],[])}previousLinesHaveImage(){let lines=this.previousLines;if(this.previousImageScan?.lines!==lines){let hint=this.normalizedImageHint?.lines===lines?this.normalizedImageHint.hasImage:void 0;this.previousImageScan={lines,hasImage:hint??lines.some(isImageLine)}}return this.previousImageScan.hasImage}hintNormalizedImages(lines,hasImage){this.normalizedImageHint=hasImage===void 0?void 0:{lines,hasImage}}normalizeLine(line){if(isImageLine(line))return{line,normalized:!1};let cached=this.normalizeMemo.get(line);if(cached!==void 0)return{line:cached,normalized:!1};let normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET;if(this.normalizeMemo.size>=Math.max(TUI.NORMALIZE_MEMO_MIN,this.previousRawLines.length*2)){let drop=this.normalizeMemo.size>>1;for(let key of this.normalizeMemo.keys()){if(drop--<=0)break;this.normalizeMemo.delete(key)}}return this.normalizeMemo.set(line,normalized),{line:normalized,normalized:!0}}applyLineResets(lines){return this.applyLineResetResult(lines).lines}applyLineResetResult(lines,mode="full"){let previousMemo=this.normalizeMemo,nextMemo=new Map,normalizedLines=[],normalizedCount=0,hasImage=!1;for(let i=0;i<lines.length;i++){let line=lines[i];if(isImageLine(line)){hasImage=!0,normalizedLines.push(line);continue}let normalized=nextMemo.get(line)??previousMemo.get(line);normalized===void 0&&(normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET,normalizedCount+=1),nextMemo.set(line,normalized),normalizedLines.push(normalized)}return this.normalizeMemo=nextMemo,this.hintNormalizedImages(normalizedLines,hasImage),recordViewportRenderStats(normalizedCount,mode),{lines:normalizedLines,firstRawChanged:0,compareEndExclusive:normalizedLines.length,bounded:!1}}applyViewportLineResets(rawLines,viewportTop,height,stableDimensions){if(!viewportRenderEnabled()||!stableDimensions||this.previousLines.length===0||this.previousRawLines.length!==this.previousLines.length)return this.applyLineResetResult(rawLines);if(this.previousRawLines.length!==rawLines.length)return this.applyResizedLineResets(rawLines);let windowStart=Math.max(0,viewportTop-VIEWPORT_RENDER_OVERSCAN),windowEnd=Math.min(rawLines.length,viewportTop+height+VIEWPORT_RENDER_OVERSCAN),firstRawChanged=-1;for(let i=0;i<rawLines.length;i++)if(rawLines[i]!==this.previousRawLines[i]&&(firstRawChanged===-1&&(firstRawChanged=i),i<windowStart||i>=windowEnd))return this.applyLineResetResult(rawLines,"escaped");let previousHadImage=this.previousLinesHaveImage(),lines=this.previousLines.slice(),normalizedCount=0,changedImage=!1;if(firstRawChanged!==-1)for(let i=windowStart;i<windowEnd;i++){if(rawLines[i]===this.previousRawLines[i])continue;let raw=rawLines[i]??"";isImageLine(raw)&&(changedImage=!0);let normalized=this.normalizeLine(raw);lines[i]=normalized.line,normalized.normalized&&(normalizedCount+=1)}return this.hintNormalizedImages(lines,previousHadImage?void 0:changedImage),recordViewportRenderStats(normalizedCount,"bounded"),{lines,firstRawChanged,compareEndExclusive:windowEnd,bounded:!0}}applyResizedLineResets(rawLines){let previousRaw=this.previousRawLines,sharedLength=Math.min(rawLines.length,previousRaw.length),firstRawChanged=0;for(;firstRawChanged<sharedLength&&rawLines[firstRawChanged]===previousRaw[firstRawChanged];)firstRawChanged++;let previousHadImage=this.previousLinesHaveImage(),lines=this.previousLines.slice(0,firstRawChanged),normalizedCount=0,tailImage=!1;for(let i=firstRawChanged;i<rawLines.length;i++){let line=rawLines[i]??"";if(isImageLine(line)){tailImage=!0,lines.push(line);continue}let normalized=this.normalizeMemo.get(line);normalized===void 0&&(normalized=normalizeTerminalOutput(line)+TUI.SEGMENT_RESET,normalizedCount+=1),lines.push(normalized)}return this.hintNormalizedImages(lines,previousHadImage?void 0:tailImage),recordViewportRenderStats(normalizedCount,"bounded"),{lines,firstRawChanged,compareEndExclusive:Math.max(rawLines.length,this.previousLines.length),bounded:!0}}collectKittyImageIds(lines){recordKittyImageScanStats(lines.length);let ids=new Set;for(let line of lines)for(let id of extractKittyImageIds(line))ids.add(id);return ids}deleteKittyImages(ids){let buffer="";for(let id of ids)buffer+=deleteKittyImage(id);return buffer}getKittyImageReservedRows(lines,index,maxIndex=lines.length-1){let rows=extractKittyImageRows(lines[index]??"");if(rows<=1)return 1;let maxRows=Math.min(rows,maxIndex-index+1,lines.length-index),reservedRows=1;for(;reservedRows<maxRows;){let line=lines[index+reservedRows]??"";if(isImageLine(line)||visibleWidth(line)>0)break;reservedRows++}return reservedRows}expandChangedRangeForKittyImages(firstChanged,lastChanged,newLines){let expandedFirstChanged=firstChanged,expandedLastChanged=lastChanged,expandForLines=lines=>{for(let i=0;i<lines.length;i++){if(extractKittyImageIds(lines[i]).length===0)continue;let blockEnd=i+this.getKittyImageReservedRows(lines,i)-1;(i>=firstChanged||i<=lastChanged&&blockEnd>=firstChanged)&&(expandedFirstChanged=Math.min(expandedFirstChanged,i),expandedLastChanged=Math.max(expandedLastChanged,blockEnd))}};return expandForLines(this.previousLines),expandForLines(newLines),{firstChanged:expandedFirstChanged,lastChanged:expandedLastChanged}}changedRangeNeedsKittyImageExpansion(lines,firstChanged,lastChanged){if(this.previousKittyImageIds.size>0)return!0;let start=Math.max(0,firstChanged),end=Math.min(lines.length-1,lastChanged),scannedLines=0;for(let i=start;i<=end;i++){scannedLines+=1;let line=lines[i]??"";if(isImageLine(line)||extractKittyImageIds(line).length>0)return recordKittyImageScanStats(scannedLines),!0}return recordKittyImageScanStats(scannedLines),!1}deleteChangedKittyImages(firstChanged,lastChanged){if(firstChanged<0||lastChanged<firstChanged)return"";let ids=new Set,maxLine=Math.min(lastChanged,this.previousLines.length-1);for(let i=firstChanged;i<=maxLine;i++)for(let id of extractKittyImageIds(this.previousLines[i]??""))ids.add(id);return this.deleteKittyImages(ids)}getViewportRows(lines,viewportTop,height){return Array.from({length:height},(_2,row)=>lines[viewportTop+row]??"")}shouldPreserveMuxScrollback(){return this.#muxDetector()&&!useLegacyMuxRender()}createViewportInsertScrollPlan(newLines,prevViewportTop,height,lineCountDelta){if(lineCountDelta<=0||lineCountDelta>=height||this.overlayStack.length>0)return;let maxViewportTop=Math.max(0,newLines.length-height),viewportTop=Math.min(maxViewportTop,prevViewportTop+lineCountDelta);if(viewportTop<=prevViewportTop)return;let previousVisible=this.getViewportRows(this.previousLines,prevViewportTop,height),nextVisible=this.getViewportRows(newLines,viewportTop,height);if(previousVisible.some(isImageLine)||nextVisible.some(isImageLine))return;let stableSuffixRows=0;for(;stableSuffixRows<height&&previousVisible[height-stableSuffixRows-1]===nextVisible[height-stableSuffixRows-1];)stableSuffixRows+=1;let regionHeight=height-stableSuffixRows;if(regionHeight<=0||regionHeight<lineCountDelta)return;let mutatedRows=[];for(let row=0;row<regionHeight-lineCountDelta;row++)if(previousVisible[row+lineCountDelta]!==nextVisible[row]&&(mutatedRows.push({screenRow:row,content:nextVisible[row]}),mutatedRows.length>MAX_SCROLL_DIFF_ROWS))return;return{viewportTop,regionBottom:regionHeight-1,insertedRows:nextVisible.slice(regionHeight-lineCountDelta,regionHeight),mutatedRows}}renderViewportInsertScroll(plan,newLines,rawLines,cursorPos,width,height){let buffer=TUI.FRAME_BEGIN,regionTop=0,regionBottom=plan.regionBottom;buffer+=`\x1B[${regionTop+1};${regionBottom+1}r`,buffer+=`\x1B[${regionBottom+1};1H`,buffer+=`
10
+ `.repeat(plan.insertedRows.length),buffer+="\x1B[r";let firstInsertedScreenRow=regionBottom-plan.insertedRows.length+1,finalPaintedScreenRow=firstInsertedScreenRow+plan.insertedRows.length-1;for(let index=0;index<plan.insertedRows.length;index++){let screenRow=firstInsertedScreenRow+index;buffer+=`\x1B[${screenRow+1};1H\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=plan.insertedRows[index]??""}for(let row of plan.mutatedRows)buffer+=`\x1B[${row.screenRow+1};1H\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=row.content,finalPaintedScreenRow=row.screenRow;let finalCursorRow=plan.viewportTop+finalPaintedScreenRow;buffer=this.finishFrame(buffer,cursorPos,newLines.length,finalCursorRow),writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.previousViewportTop=plan.viewportTop,this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++}renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow){this.#scrollbackStale=!1;let buffer=TUI.FRAME_BEGIN;buffer+=this.deleteKittyImages(this.previousKittyImageIds),this.shouldPreserveMuxScrollback()||(buffer+="\x1B[3J");let currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop));currentScreenRow>0&&(buffer+=`\x1B[${currentScreenRow}A`);let bufferLength=Math.max(height,newLines.length);for(let row=0;row<bufferLength;row++)row>0&&(buffer+=`\r
11
+ `),buffer+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=newLines[row]??"";buffer=this.finishFrame(buffer,cursorPos,newLines.length,bufferLength-1),writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=newLines.length,this.previousViewportTop=Math.max(0,bufferLength-height),this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++}renderHeldRepaint(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow){let start=Math.min(prevViewportTop,Math.max(0,newLines.length-height)),rowCount=Math.max(height,newLines.length-start),rows=Array.from({length:rowCount},(_2,index)=>newLines[start+index]??""),previousVisible=this.getViewportRows(this.previousLines,prevViewportTop,height);if(rows.some(isImageLine)||previousVisible.some(isImageLine))return!1;let buffer=TUI.FRAME_BEGIN,currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop));currentScreenRow>0&&(buffer+=`\x1B[${currentScreenRow}A`);for(let row=0;row<rows.length;row++)row>0&&(buffer+=`\r
12
+ `),buffer+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=rows[row];let lastRow=start+rows.length-1;return buffer=this.finishFrame(buffer,cursorPos,newLines.length,lastRow),writeBounded(this.terminal,buffer),this.#scrollbackStale=!0,this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=newLines.length,this.previousViewportTop=Math.max(0,lastRow+1-height),this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++,!0}renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop=Math.max(0,newLines.length-height)){let previousVisible=this.getViewportRows(this.previousLines,this.previousViewportTop,height),nextVisible=this.getViewportRows(newLines,viewportTop,height);if(previousVisible.some(isImageLine)||nextVisible.some(isImageLine))return!1;let buffer=TUI.FRAME_BEGIN,currentScreenRow=Math.max(0,Math.min(height-1,this.hardwareCursorRow-this.previousViewportTop));currentScreenRow>0&&(buffer+=`\x1B[${currentScreenRow}A`);for(let row=0;row<height;row++)row>0&&(buffer+=`\r
13
+ `),buffer+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer+=newLines[viewportTop+row]??"";let finalCursorRow=viewportTop+Math.max(0,height-1);return buffer=this.finishFrame(buffer,cursorPos,newLines.length,finalCursorRow),writeBounded(this.terminal,buffer),this.muxViewportRepaintCount+=1,this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=newLines.length,this.previousViewportTop=viewportTop,this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.placementEpoch++,!0}compositeLineAt(baseLine,overlayLine,startCol,overlayWidth,totalWidth){if(isImageLine(baseLine)&&visibleWidth(baseLine)===0)return baseLine;let placeholderIndex=baseLine.indexOf("\u{10EEEE}"),protocolEnd=placeholderIndex===-1?-1:baseLine.lastIndexOf("\x1B\\",placeholderIndex),protocolPrefix=protocolEnd===-1?"":baseLine.slice(0,protocolEnd+2),afterStart=startCol+overlayWidth,base=extractSegments(baseLine,startCol,afterStart,totalWidth-afterStart,!0),overlay=sliceWithWidth(overlayLine,0,overlayWidth,!0),beforePad=Math.max(0,startCol-base.beforeWidth),overlayPad=Math.max(0,overlayWidth-overlay.width),actualBeforeWidth=Math.max(startCol,base.beforeWidth),actualOverlayWidth=Math.max(overlayWidth,overlay.width),afterTarget=Math.max(0,totalWidth-actualBeforeWidth-actualOverlayWidth),afterPad=Math.max(0,afterTarget-base.afterWidth),r=TUI.SEGMENT_RESET,result=base.before+" ".repeat(beforePad)+r+overlay.text+" ".repeat(overlayPad)+r+base.after+" ".repeat(afterPad);return visibleWidth(result)<=totalWidth?protocolPrefix+result:protocolPrefix+sliceByColumn(result,0,totalWidth,!0)}extractCursorPosition(lines,height){let viewportTop=Math.max(0,lines.length-height);for(let row=lines.length-1;row>=viewportTop;row--){let line=lines[row],markerIndex=line.indexOf(CURSOR_MARKER);if(markerIndex!==-1){let beforeMarker=line.slice(0,markerIndex),col=visibleWidth(beforeMarker),afterMarker=line.slice(markerIndex+CURSOR_MARKER.length);if(this.showHardwareCursor&&afterMarker.startsWith(FAKE_CURSOR_START)){let fakeCursorEnd=afterMarker.indexOf(FAKE_CURSOR_END,FAKE_CURSOR_START.length),fakeCursorReset=afterMarker.indexOf(FAKE_CURSOR_RESET,FAKE_CURSOR_START.length);fakeCursorReset!==-1&&(fakeCursorEnd===-1||fakeCursorReset<fakeCursorEnd)?afterMarker=afterMarker.slice(FAKE_CURSOR_START.length):fakeCursorEnd!==-1&&(afterMarker=afterMarker.slice(FAKE_CURSOR_START.length,fakeCursorEnd)+afterMarker.slice(fakeCursorEnd+FAKE_CURSOR_END.length))}return lines[row]=beforeMarker+afterMarker,{row,col}}}return null}doRender(){if(this.stopped)return;let width=this.terminal.columns,height=this.terminal.rows,widthChanged=this.previousWidth!==0&&this.previousWidth!==width,heightChanged=this.previousHeight!==0&&this.previousHeight!==height;(widthChanged||heightChanged)&&this.placementEpoch++;let previousBufferLength=this.previousHeight>0?this.previousViewportTop+this.previousHeight:height,prevViewportTop=heightChanged?Math.max(0,previousBufferLength-height):this.previousViewportTop,viewportTop=prevViewportTop,hardwareCursorRow=this.hardwareCursorRow,computeLineDiff=targetRow=>{let currentScreenRow=hardwareCursorRow-prevViewportTop;return targetRow-viewportTop-currentScreenRow};renderFrame.scrollbackRows=this.mode==="regular"&&!widthChanged&&!heightChanged&&this.previousLines.length>0?prevViewportTop:0,renderFrame.mode=this.mode,renderFrame.rows=height;let newLines;try{newLines=renderAtFrameRow(this,width,0)}finally{renderFrame.scrollbackRows=0,renderFrame.mode=void 0}this.overlayStack.length>0&&(newLines=this.compositeOverlays(newLines,width,height));let cursorPos=this.extractCursorPosition(newLines,height),rawLines=newLines,normalizedLines=this.applyViewportLineResets(rawLines,prevViewportTop,height,!widthChanged&&!heightChanged);newLines=normalizedLines.lines;let preserveMuxScrollback=this.shouldPreserveMuxScrollback();if(this.#scrollbackCatchUpPending){if(this.#scrollbackCatchUpPending=!1,!preserveMuxScrollback&&!widthChanged&&!heightChanged){this.renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow);return}preserveMuxScrollback||(this.#scrollbackStale=!0)}let fullRender=(clear,clearScrollback=clear)=>{this.fullRedrawCount+=1;let buffer2=TUI.FRAME_BEGIN;clear?(clearScrollback&&(this.#scrollbackStale=!1),buffer2+=this.deleteKittyImages(this.previousKittyImageIds),buffer2+="\x1B[2J\x1B[H",clearScrollback&&!preserveMuxScrollback&&process.platform!=="win32"&&(buffer2+="\x1B[3J")):buffer2+=`\r\x1B[2K${TUI.SEGMENT_RESET}`;for(let i=0;i<newLines.length;i++){i>0&&(buffer2+=`\r
13
14
  `);let line=newLines[i],imageReservedRows=isImageLine(line)?this.getKittyImageReservedRows(newLines,i):1;if(imageReservedRows>1&&imageReservedRows<=height){for(let row=1;row<imageReservedRows;row++)buffer2+=`\r
14
15
  `;buffer2+=`\x1B[${imageReservedRows-1}A`,buffer2+=line,buffer2+=`\x1B[${imageReservedRows-1}B`,i+=imageReservedRows-1;continue}buffer2+=line}let finalCursorRow2=Math.max(0,newLines.length-1);buffer2=this.finishFrame(buffer2,cursorPos,newLines.length,finalCursorRow2),writeBounded(this.terminal,buffer2),this.cursorRow=Math.max(0,newLines.length-1),clear?this.maxLinesRendered=newLines.length:this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length);let bufferLength=Math.max(height,newLines.length);this.previousViewportTop=Math.max(0,bufferLength-height),this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.noteFullRender(clear)},debugRedraw=process.env.PI_DEBUG_REDRAW==="1",logRedraw=reason=>{if(!debugRedraw)return;let logPath=path.join(this.logDirectory,"pi-debug.log"),msg=`[${new Date().toISOString()}] fullRender: ${reason} (prev=${this.previousLines.length}, new=${newLines.length}, height=${height})
15
- `;fs.mkdirSync(path.dirname(logPath),{recursive:!0}),fs.appendFileSync(logPath,msg,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(logPath)};if(this.previousLines.length===0&&!widthChanged&&!heightChanged){logRedraw("first render"),fullRender(!1);return}if(widthChanged){logRedraw(`terminal width changed (${this.previousWidth} -> ${width})`),fullRender(!0,!preserveMuxScrollback);return}if(heightChanged&&!isTermuxSession()){logRedraw(`terminal height changed (${this.previousHeight} -> ${height})`),preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height)||fullRender(!0,!1):fullRender(!0);return}if(this.clearOnShrink&&newLines.length<this.maxLinesRendered&&this.overlayStack.length===0){logRedraw(`clearOnShrink (maxLinesRendered=${this.maxLinesRendered})`),fullRender(!0,!preserveMuxScrollback);return}let firstChanged=-1,lastChanged=-1,maxLines=Math.max(newLines.length,this.previousLines.length),diffScanStart=normalizedLines.bounded&&normalizedLines.firstRawChanged!==-1?normalizedLines.firstRawChanged:0,diffScanEndExclusive=normalizedLines.bounded?normalizedLines.compareEndExclusive:maxLines;for(let i=diffScanStart;i<diffScanEndExclusive;i++){let oldLine=i<this.previousLines.length?this.previousLines[i]:"",newLine=i<newLines.length?newLines[i]:"";oldLine!==newLine&&(firstChanged===-1&&(firstChanged=i),lastChanged=i)}let appendedLines=newLines.length>this.previousLines.length,lineCountDelta=newLines.length-this.previousLines.length;appendedLines&&(firstChanged===-1&&(firstChanged=this.previousLines.length),lastChanged=newLines.length-1);let needsKittyImageExpansion=firstChanged!==-1&&this.changedRangeNeedsKittyImageExpansion(newLines,firstChanged,lastChanged);if(needsKittyImageExpansion){let expandedRange=this.expandChangedRangeForKittyImages(firstChanged,lastChanged,newLines);firstChanged=expandedRange.firstChanged,lastChanged=expandedRange.lastChanged}let appendStart=appendedLines&&firstChanged===this.previousLines.length&&firstChanged>0,insertScrollPlan=this.createViewportInsertScrollPlan(newLines,prevViewportTop,height,lineCountDelta);if(firstChanged===-1){this.positionHardwareCursor(cursorPos,newLines.length),this.previousViewportTop=prevViewportTop,this.previousHeight=height;return}if(insertScrollPlan){this.renderViewportInsertScroll(insertScrollPlan,newLines,rawLines,cursorPos,width,height);return}if(firstChanged>=newLines.length){if(this.previousLines.length>newLines.length){let buffer2=TUI.FRAME_BEGIN;buffer2+=this.deleteChangedKittyImages(firstChanged,lastChanged);let targetRow=Math.max(0,newLines.length-1);if(targetRow<prevViewportTop){logRedraw(`deleted lines moved viewport up (${targetRow} < ${prevViewportTop})`),fullRender(!0,!preserveMuxScrollback);return}let lineDiff2=computeLineDiff(targetRow);lineDiff2>0?buffer2+=`\x1B[${lineDiff2}B`:lineDiff2<0&&(buffer2+=`\x1B[${-lineDiff2}A`),buffer2+="\r";let extraLines=this.previousLines.length-newLines.length;if(extraLines>height){logRedraw(`extraLines > height (${extraLines} > ${height})`),fullRender(!0,!preserveMuxScrollback);return}let clearStartOffset=newLines.length===0?0:1;extraLines>0&&clearStartOffset>0&&(buffer2+=`\x1B[${clearStartOffset}B`);for(let i=0;i<extraLines;i++)buffer2+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,i<extraLines-1&&(buffer2+="\x1B[1B");let moveBack=Math.max(0,extraLines-1+clearStartOffset);moveBack>0&&(buffer2+=`\x1B[${moveBack}A`),buffer2=this.finishFrame(buffer2,cursorPos,newLines.length,targetRow),writeBounded(this.terminal,buffer2),this.cursorRow=targetRow}else this.positionHardwareCursor(cursorPos,newLines.length);this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.previousViewportTop=prevViewportTop;return}if(firstChanged<prevViewportTop){if(newLines.length<this.previousLines.length&&(viewportTop=Math.max(0,newLines.length-height)),newLines.length>this.previousLines.length){let maxViewportTop=Math.max(0,newLines.length-height);viewportTop=Math.min(maxViewportTop,prevViewportTop+lineCountDelta)}let firstVisibleChanged=-1,lastVisibleChanged=-1;for(let row=0;row<height;row++){let previousLine=this.previousLines[prevViewportTop+row]??"",nextLine=newLines[viewportTop+row]??"";previousLine!==nextLine&&(firstVisibleChanged===-1&&(firstVisibleChanged=row),lastVisibleChanged=row)}if(firstVisibleChanged===-1){if(lineCountDelta!==0){preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop)||fullRender(!0,!1):this.renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow);return}this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.setPreviousLines(newLines,rawLines),this.previousWidth=width,this.previousHeight=height,this.previousViewportTop=viewportTop;return}if(viewportTop!==prevViewportTop){if(lineCountDelta!==0){preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop)||fullRender(!0,!1):this.renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow);return}let previousViewportBottom=Math.min(this.previousLines.length-1,prevViewportTop+height-1),buffer2=TUI.FRAME_BEGIN;buffer2+=this.deleteChangedKittyImages(prevViewportTop,previousViewportBottom);let currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop));currentScreenRow>0&&(buffer2+=`\x1B[${currentScreenRow}A`);for(let row=0;row<height;row++)row>0&&(buffer2+=`\r
16
+ `;fs.mkdirSync(path.dirname(logPath),{recursive:!0}),fs.appendFileSync(logPath,msg,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(logPath)};if(this.previousLines.length===0&&!widthChanged&&!heightChanged){logRedraw("first render"),fullRender(!1);return}if(widthChanged){logRedraw(`terminal width changed (${this.previousWidth} -> ${width})`),fullRender(!0,!preserveMuxScrollback);return}if(heightChanged&&!isTermuxSession()){logRedraw(`terminal height changed (${this.previousHeight} -> ${height})`),preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height)||fullRender(!0,!1):fullRender(!0);return}if(this.clearOnShrink&&newLines.length<this.maxLinesRendered&&this.overlayStack.length===0){logRedraw(`clearOnShrink (maxLinesRendered=${this.maxLinesRendered})`),fullRender(!0,!preserveMuxScrollback);return}let firstChanged=-1,lastChanged=-1,maxLines=Math.max(newLines.length,this.previousLines.length),diffScanStart=normalizedLines.bounded&&normalizedLines.firstRawChanged!==-1?normalizedLines.firstRawChanged:0,diffScanEndExclusive=normalizedLines.bounded?normalizedLines.compareEndExclusive:maxLines;for(let i=diffScanStart;i<diffScanEndExclusive;i++){let oldLine=i<this.previousLines.length?this.previousLines[i]:"",newLine=i<newLines.length?newLines[i]:"";oldLine!==newLine&&(firstChanged===-1&&(firstChanged=i),lastChanged=i)}let appendedLines=newLines.length>this.previousLines.length,lineCountDelta=newLines.length-this.previousLines.length;appendedLines&&(firstChanged===-1&&(firstChanged=this.previousLines.length),lastChanged=newLines.length-1);let needsKittyImageExpansion=firstChanged!==-1&&this.changedRangeNeedsKittyImageExpansion(newLines,firstChanged,lastChanged);if(needsKittyImageExpansion){let expandedRange=this.expandChangedRangeForKittyImages(firstChanged,lastChanged,newLines);firstChanged=expandedRange.firstChanged,lastChanged=expandedRange.lastChanged}let appendStart=appendedLines&&firstChanged===this.previousLines.length&&firstChanged>0,insertScrollPlan=this.createViewportInsertScrollPlan(newLines,prevViewportTop,height,lineCountDelta);if(firstChanged===-1){this.positionHardwareCursor(cursorPos,newLines.length),this.previousViewportTop=prevViewportTop,this.previousHeight=height;return}if(insertScrollPlan){this.renderViewportInsertScroll(insertScrollPlan,newLines,rawLines,cursorPos,width,height);return}if(firstChanged>=newLines.length){if(this.previousLines.length>newLines.length){let buffer2=TUI.FRAME_BEGIN;buffer2+=this.deleteChangedKittyImages(firstChanged,lastChanged);let targetRow=Math.max(0,newLines.length-1);if(targetRow<prevViewportTop){logRedraw(`deleted lines moved viewport up (${targetRow} < ${prevViewportTop})`),fullRender(!0,!preserveMuxScrollback);return}let lineDiff2=computeLineDiff(targetRow);lineDiff2>0?buffer2+=`\x1B[${lineDiff2}B`:lineDiff2<0&&(buffer2+=`\x1B[${-lineDiff2}A`),buffer2+="\r";let extraLines=this.previousLines.length-newLines.length;if(extraLines>height){logRedraw(`extraLines > height (${extraLines} > ${height})`),fullRender(!0,!preserveMuxScrollback);return}let clearStartOffset=newLines.length===0?0:1;extraLines>0&&clearStartOffset>0&&(buffer2+=`\x1B[${clearStartOffset}B`);for(let i=0;i<extraLines;i++)buffer2+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,i<extraLines-1&&(buffer2+="\x1B[1B");let moveBack=Math.max(0,extraLines-1+clearStartOffset);moveBack>0&&(buffer2+=`\x1B[${moveBack}A`),buffer2=this.finishFrame(buffer2,cursorPos,newLines.length,targetRow),writeBounded(this.terminal,buffer2),this.cursorRow=targetRow}else this.positionHardwareCursor(cursorPos,newLines.length);this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height,this.previousViewportTop=prevViewportTop;return}if(firstChanged<prevViewportTop){if(newLines.length<this.previousLines.length&&(viewportTop=Math.max(0,newLines.length-height)),newLines.length>this.previousLines.length){let maxViewportTop=Math.max(0,newLines.length-height);viewportTop=Math.min(maxViewportTop,prevViewportTop+lineCountDelta)}let firstVisibleChanged=-1,lastVisibleChanged=-1;for(let row=0;row<height;row++){let previousLine=this.previousLines[prevViewportTop+row]??"",nextLine=newLines[viewportTop+row]??"";previousLine!==nextLine&&(firstVisibleChanged===-1&&(firstVisibleChanged=row),lastVisibleChanged=row)}if(firstVisibleChanged===-1){if(lineCountDelta!==0){preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop)||fullRender(!0,!1):this.#holdScrollbackReplay&&this.renderHeldRepaint(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow)||this.renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow);return}this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.setPreviousLines(newLines,rawLines),this.previousWidth=width,this.previousHeight=height,this.previousViewportTop=viewportTop;return}if(viewportTop!==prevViewportTop){if(lineCountDelta!==0){preserveMuxScrollback?this.renderMuxViewportRepaint(newLines,rawLines,cursorPos,width,height,viewportTop)||fullRender(!0,!1):this.#holdScrollbackReplay&&this.renderHeldRepaint(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow)||this.renderScrollbackReplay(newLines,rawLines,cursorPos,width,height,prevViewportTop,hardwareCursorRow);return}let previousViewportBottom=Math.min(this.previousLines.length-1,prevViewportTop+height-1),buffer2=TUI.FRAME_BEGIN;buffer2+=this.deleteChangedKittyImages(prevViewportTop,previousViewportBottom);let currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop));currentScreenRow>0&&(buffer2+=`\x1B[${currentScreenRow}A`);for(let row=0;row<height;row++)row>0&&(buffer2+=`\r
16
17
  `),buffer2+=`\r\x1B[2K${TUI.SEGMENT_RESET}`,buffer2+=newLines[viewportTop+row]??"";let finalCursorRow2=viewportTop+Math.max(0,height-1);buffer2=this.finishFrame(buffer2,cursorPos,newLines.length,finalCursorRow2),writeBounded(this.terminal,buffer2),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.previousViewportTop=viewportTop,this.setPreviousLines(newLines,rawLines),this.previousKittyImageIds=this.collectKittyImageIds(newLines),this.previousWidth=width,this.previousHeight=height;return}firstChanged=viewportTop+firstVisibleChanged,lastChanged=Math.min(newLines.length-1,viewportTop+lastVisibleChanged)}let buffer=TUI.FRAME_BEGIN;buffer+=this.deleteChangedKittyImages(firstChanged,lastChanged);let prevViewportBottom=prevViewportTop+height-1,moveTargetRow=appendStart?firstChanged-1:firstChanged;if(moveTargetRow>prevViewportBottom){let currentScreenRow=Math.max(0,Math.min(height-1,hardwareCursorRow-prevViewportTop)),moveToBottom=height-1-currentScreenRow;moveToBottom>0&&(buffer+=`\x1B[${moveToBottom}B`);let scroll=moveTargetRow-prevViewportBottom;buffer+=`\r
17
18
  `.repeat(scroll),prevViewportTop+=scroll,viewportTop+=scroll,hardwareCursorRow=moveTargetRow}let lineDiff=computeLineDiff(moveTargetRow);lineDiff>0?buffer+=`\x1B[${lineDiff}B`:lineDiff<0&&(buffer+=`\x1B[${-lineDiff}A`),buffer+=appendStart?`\r
18
19
  `:"\r";let renderEnd=Math.min(lastChanged,newLines.length-1);for(let i=firstChanged;i<=renderEnd;i++){i>firstChanged&&(buffer+=`\r
@@ -20,7 +21,7 @@ import{__export}from"./chunk-IKOFCODM.js";function parseTmuxKittyTerminalOverrid
20
21
  \x1B[2K${TUI.SEGMENT_RESET}`;buffer+=`\x1B[${imageReservedRows-1}A`,buffer+=line,buffer+=`\x1B[${imageReservedRows-1}B`,i+=imageReservedRows-1;continue}buffer+=`\x1B[2K${TUI.SEGMENT_RESET}`;let lineWidth=visibleWidth(line);if(!isImage&&lineWidth>width){let crashLogPath=path.join(os.homedir(),".senpi","agent","senpi-crash.log"),strictRender=process.env.PI_TUI_STRICT_RENDER==="1";if(strictRender||!this.overWideCrashDumpWritten){let crashData=formatOverWideRenderDiagnostic(newLines,width,i,lineWidth);if(!strictRender)writeRenderDiagnosticBestEffort(crashLogPath,crashData),this.overWideCrashDumpWritten=!0;else{let crashDumpWritten=writeRenderDiagnosticBestEffort(crashLogPath,crashData);this.stop();let errorMsg=[`Rendered line ${i} exceeds terminal width (${lineWidth} > ${width}).`,"","This is likely caused by a custom TUI component not truncating its output.","Use visibleWidth() to measure and truncateToWidth() to truncate lines.","",crashDumpWritten?`Debug log written to: ${crashLogPath}`:`Debug log could not be written to: ${crashLogPath}`].join(`
21
22
  `);throw new Error(errorMsg)}}let truncatedLine=sliceByColumn(line,0,width,!0)+TUI.SEGMENT_RESET;newLines[i]=truncatedLine,buffer+=truncatedLine;continue}buffer+=line}let finalCursorRow=renderEnd;if(this.previousLines.length>newLines.length){if(renderEnd<newLines.length-1){let moveDown=newLines.length-1-renderEnd;buffer+=`\x1B[${moveDown}B`,finalCursorRow=newLines.length-1}let extraLines=this.previousLines.length-newLines.length;for(let i=newLines.length;i<this.previousLines.length;i++)buffer+=`\r
22
23
  \x1B[2K${TUI.SEGMENT_RESET}`;buffer+=`\x1B[${extraLines}A`}if(buffer=this.finishFrame(buffer,cursorPos,newLines.length,finalCursorRow),process.env.PI_TUI_DEBUG==="1"){let debugDir="/tmp/tui";fs.mkdirSync(debugDir,{recursive:!0});let debugPath=path.join(debugDir,`render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`),debugData=[`firstChanged: ${firstChanged}`,`viewportTop: ${viewportTop}`,`cursorRow: ${this.cursorRow}`,`height: ${height}`,`lineDiff: ${lineDiff}`,`hardwareCursorRow: ${hardwareCursorRow}`,`renderEnd: ${renderEnd}`,`finalCursorRow: ${finalCursorRow}`,`cursorPos: ${JSON.stringify(cursorPos)}`,`newLines.length: ${newLines.length}`,`previousLines.length: ${this.previousLines.length}`,"","=== newLines ===",JSON.stringify(newLines,null,2),"","=== previousLines ===",JSON.stringify(this.previousLines,null,2),"","=== buffer ===",JSON.stringify(buffer)].join(`
23
- `);fs.writeFileSync(debugPath,debugData,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(debugPath)}writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.previousViewportTop=Math.max(prevViewportTop,finalCursorRow-height+1),this.setPreviousLines(newLines,rawLines),needsKittyImageExpansion&&(this.previousKittyImageIds=this.collectKittyImageIds(newLines)),this.previousWidth=width,this.previousHeight=height}buildHardwareCursorSequence(cursorPos,totalLines){let buffer="";if(!cursorPos||totalLines<=0)this.#lastCursorVisibility!==!1&&(buffer+="\x1B[?25l",this.#lastCursorVisibility=!1);else{let targetRow=Math.max(0,Math.min(cursorPos.row,totalLines-1)),targetCol=Math.max(0,cursorPos.col),rowDelta=targetRow-this.hardwareCursorRow;rowDelta>0?buffer+=`\x1B[${rowDelta}B`:rowDelta<0&&(buffer+=`\x1B[${-rowDelta}A`),buffer+=`\x1B[${targetCol+1}G`,this.hardwareCursorRow=targetRow,this.#lastCursorVisibility!==this.showHardwareCursor&&(buffer+=this.showHardwareCursor?"\x1B[?25h":"\x1B[?25l",this.#lastCursorVisibility=this.showHardwareCursor)}return buffer}finishFrame(buffer,cursorPos,totalLines,hardwareCursorRow){return this.hardwareCursorRow=hardwareCursorRow,buffer+this.buildHardwareCursorSequence(cursorPos,totalLines)+TUI.FRAME_END}positionHardwareCursor(cursorPos,totalLines){let buffer=this.buildHardwareCursorSequence(cursorPos,totalLines);buffer&&this.terminal.write(TUI.FRAME_BEGIN+buffer+TUI.FRAME_END)}queryTerminalColors({timeoutMs,onLateReply}){return new Promise(resolve=>{let query={palette:Array.from({length:TERMINAL_PALETTE_SIZE},()=>{}),replied:new Set,deliver:resolve,timer:void 0};query.timer=setTimeout(()=>{query.deliver=onLateReply,resolve(this.terminalColorQueryResult(query))},timeoutMs),this.pendingTerminalColorQueries.push(query),this.terminal.write(TERMINAL_COLOR_QUERY)})}},TUI=class extends TuiBase{constructor(){super(...arguments),this.mode="regular"}};function isAsciiLetter(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=97&&code<=122}function isAsciiDigit(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57}function isWordBoundaryPrefix(char){switch(char){case" ":case" ":case`
24
+ `);fs.writeFileSync(debugPath,debugData,{encoding:"utf8",mode:DIAGNOSTIC_LOG_MODE}),chmodDiagnosticLogBestEffort(debugPath)}writeBounded(this.terminal,buffer),this.cursorRow=Math.max(0,newLines.length-1),this.maxLinesRendered=Math.max(this.maxLinesRendered,newLines.length),this.previousViewportTop=Math.max(prevViewportTop,finalCursorRow-height+1),this.setPreviousLines(newLines,rawLines),needsKittyImageExpansion&&(this.previousKittyImageIds=this.collectKittyImageIds(newLines)),this.previousWidth=width,this.previousHeight=height}buildHardwareCursorSequence(cursorPos,totalLines){let buffer="";if(!cursorPos||totalLines<=0)this.#lastCursorVisibility!==!1&&(buffer+="\x1B[?25l",this.#lastCursorVisibility=!1);else{let targetRow=Math.max(0,Math.min(cursorPos.row,totalLines-1)),targetCol=Math.max(0,cursorPos.col),rowDelta=targetRow-this.hardwareCursorRow;rowDelta>0?buffer+=`\x1B[${rowDelta}B`:rowDelta<0&&(buffer+=`\x1B[${-rowDelta}A`),buffer+=`\x1B[${targetCol+1}G`,this.hardwareCursorRow=targetRow,this.#lastCursorVisibility!==this.showHardwareCursor&&(buffer+=this.showHardwareCursor?"\x1B[?25h":"\x1B[?25l",this.#lastCursorVisibility=this.showHardwareCursor)}return buffer}finishFrame(buffer,cursorPos,totalLines,hardwareCursorRow){return this.hardwareCursorRow=hardwareCursorRow,buffer+this.buildHardwareCursorSequence(cursorPos,totalLines)+TUI.FRAME_END}positionHardwareCursor(cursorPos,totalLines){let buffer=this.buildHardwareCursorSequence(cursorPos,totalLines);buffer&&this.terminal.write(TUI.FRAME_BEGIN+buffer+TUI.FRAME_END)}queryTerminalColors({timeoutMs,onLateReply}){return new Promise(resolve=>{let query={palette:Array.from({length:TERMINAL_PALETTE_SIZE},()=>{}),replied:new Set,deliver:resolve,timer:void 0};query.timer=setTimeout(()=>{query.deliver=onLateReply,resolve(this.terminalColorQueryResult(query))},timeoutMs),this.pendingTerminalColorQueries.push(query),this.terminal.write(TERMINAL_COLOR_QUERY)})}};function isTerminalReport(data){return data.startsWith("\x1B[<")||data.startsWith("\x1B[M")||data.length>2&&(data.startsWith("\x1B]")||data.startsWith("\x1BP")||data.startsWith("\x1B_"))||data.startsWith("\x1B[?")||/^\x1b\[\d+(;\d+)*t$/.test(data)}var TUI=class extends TuiBase{constructor(){super(...arguments),this.mode="regular"}};function isAsciiLetter(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=97&&code<=122}function isAsciiDigit(char){if(!char)return!1;let code=char.charCodeAt(0);return code>=48&&code<=57}function isWordBoundaryPrefix(char){switch(char){case" ":case" ":case`
24
25
  `:case"\r":case"-":case"_":case".":case"/":case":":return!0;default:return!1}}function scoreMatch(queryLower,textLower){if(queryLower.length===0)return{matches:!0,score:0};if(queryLower.length>textLower.length)return{matches:!1,score:0};let queryIndex=0,score=0,lastMatchIndex=-1,consecutiveMatches=0;for(;queryIndex<queryLower.length;){let i=textLower.indexOf(queryLower[queryIndex],lastMatchIndex+1);if(i===-1)break;let isWordBoundary=i===0||isWordBoundaryPrefix(textLower[i-1]);lastMatchIndex===i-1?(consecutiveMatches++,score-=consecutiveMatches*5):(consecutiveMatches=0,lastMatchIndex>=0&&(score+=(i-lastMatchIndex-1)*2)),isWordBoundary&&(score-=10),score+=i*.1,lastMatchIndex=i,queryIndex++}return queryIndex<queryLower.length?{matches:!1,score:0}:(queryLower===textLower&&(score-=100),{matches:!0,score})}function addWholeTokenSwap(variants,queryLower){let splitIndex=0;for(;splitIndex<queryLower.length&&isAsciiLetter(queryLower[splitIndex]);)splitIndex++;if(splitIndex>0&&splitIndex<queryLower.length){let digitEnd=splitIndex;for(;digitEnd<queryLower.length&&isAsciiDigit(queryLower[digitEnd]);)digitEnd++;digitEnd===queryLower.length&&variants.add(queryLower.slice(splitIndex)+queryLower.slice(0,splitIndex))}for(splitIndex=0;splitIndex<queryLower.length&&isAsciiDigit(queryLower[splitIndex]);)splitIndex++;if(splitIndex>0&&splitIndex<queryLower.length){let letterEnd=splitIndex;for(;letterEnd<queryLower.length&&isAsciiLetter(queryLower[letterEnd]);)letterEnd++;letterEnd===queryLower.length&&variants.add(queryLower.slice(splitIndex)+queryLower.slice(0,splitIndex))}}function buildAlphanumericSwapQueries(queryLower){let variants=new Set;addWholeTokenSwap(variants,queryLower);for(let i=0;i<queryLower.length-1;i++){let current=queryLower[i],next=queryLower[i+1];(isAsciiLetter(current)&&isAsciiDigit(next)||isAsciiDigit(current)&&isAsciiLetter(next))&&variants.add(queryLower.slice(0,i)+next+current+queryLower.slice(i+2))}return[...variants]}function fuzzyMatch(query,text){return fuzzyMatchLower(query.toLowerCase(),text.toLowerCase())}function fuzzyMatchLower(queryLower,textLower){let direct=scoreMatch(queryLower,textLower);if(direct.matches)return direct;let bestSwap=null;for(let variant of buildAlphanumericSwapQueries(queryLower)){let match=scoreMatch(variant,textLower);if(!match.matches)continue;let score=match.score+5;(!bestSwap||score<bestSwap.score)&&(bestSwap={matches:!0,score})}return bestSwap??direct}function fuzzyFilter(items,query,getText){if(!query.trim())return items;let tokens=query.trim().split(/[\s/]+/).filter(t=>t.length>0);if(tokens.length===0)return items;let results=[];for(let item of items){let text=getText(item),totalScore=0,allMatch=!0;for(let token of tokens){let match=fuzzyMatch(token,text);if(match.matches)totalScore+=match.score;else{allMatch=!1;break}}allMatch&&results.push({item,totalScore})}return results.sort((a,b2)=>a.totalScore-b2.totalScore),results.map(r=>r.item)}import{spawn}from"child_process";import{readdirSync,statSync}from"fs";import{homedir as homedir3}from"os";import{basename,dirname as dirname2,join as join2}from"path";var SKILL_COMMAND_PREFIX="skill:",DOLLAR_QUERY_PATTERN=/^\$([a-zA-Z0-9:_-]*)$/,DOLLAR_MENTION_PATTERN=/(^|\s)\$([a-zA-Z][a-zA-Z0-9:_-]*)(?=\s|$)/g,COMMON_SHELL_VARIABLES=new Set(["CI","EDITOR","HOME","LANG","LC_ALL","NODE_ENV","OLDPWD","PATH","PWD","SHELL","SHLVL","TERM","TMPDIR","USER","VISUAL"]);function isDollarQueryCompletable(query){return query===""?!0:query.startsWith("-")||query.startsWith("_")||/^\d/.test(query)?!1:!COMMON_SHELL_VARIABLES.has(query)}function commandName(command){return"name"in command?command.name:command.value}function skillName(name){return name.startsWith(SKILL_COMMAND_PREFIX)&&name.slice(SKILL_COMMAND_PREFIX.length)||null}function commandDescription(command){let hint="argumentHint"in command&&command.argumentHint?command.argumentHint:void 0,description=command.description??"";return hint?description?`${hint} \u2014 ${description}`:hint:description||void 0}function findDollarSkillMentions(line,knownSkills){if(knownSkills.size===0)return[];let mentions=[];for(let match of line.matchAll(DOLLAR_MENTION_PATTERN)){let token=match[2]??"",name=token.startsWith(SKILL_COMMAND_PREFIX)?token.slice(SKILL_COMMAND_PREFIX.length):token;if(!knownSkills.has(name))continue;let start=match.index+(match[1]??"").length;mentions.push({start,end:start+token.length+1,name})}return mentions}function knownSkillNames(commands){return new Set(commands.flatMap(command=>{let name=skillName(commandName(command));return name?[name]:[]}))}function getDollarInvocationContext(textBeforeCursor,_cursorLine,commands){let tokenStart=textBeforeCursor.search(/\S+$/),token=tokenStart===-1?"":textBeforeCursor.slice(tokenStart),match=DOLLAR_QUERY_PATTERN.exec(token);if(!match)return null;let rawQuery=match[1]??"";if(!isDollarQueryCompletable(rawQuery))return null;let explicitSkillNamespace=rawQuery.startsWith(SKILL_COMMAND_PREFIX),query=explicitSkillNamespace?rawQuery.slice(SKILL_COMMAND_PREFIX.length):rawQuery;if(knownSkillNames(commands).has(query))return null;let isFirstToken=textBeforeCursor.slice(0,tokenStart).trim()==="";return{prefix:`$${rawQuery}`,query,skillsOnly:explicitSkillNamespace||!isFirstToken}}function getDollarInvocationSuggestions(commands,query,skillsOnly){let items=commands.flatMap(command=>{let name=commandName(command),skill=skillName(name);return skill?[{kind:"skill",value:`$${skill}`,label:`$${skill}`,searchText:skill,description:commandDescription(command)}]:skillsOnly?[]:[{kind:"command",value:`/${name}`,label:`/${name}`,searchText:name,description:commandDescription(command)}]});return fuzzyFilter(items,query,item=>item.searchText).map((item,index)=>({...item,index})).sort((left,right)=>left.kind!==right.kind?left.kind==="command"?-1:1:left.index-right.index).map(({index:_index,kind:_kind,searchText:_searchText,...item})=>item)}var SKILL_COMMAND_PREFIX2="skill:";function isSlashNamespaceItem(value){return value.endsWith(":")}function compareSlashCommandSuggestion(prefix,left,right){let leftExact=left.value===prefix,rightExact=right.value===prefix;if(leftExact!==rightExact)return leftExact?-1:1;let leftPrefix=left.value.startsWith(prefix),rightPrefix=right.value.startsWith(prefix);return leftPrefix!==rightPrefix?leftPrefix?-1:1:leftPrefix&&rightPrefix&&left.value.length!==right.value.length?right.value.length-left.value.length:left.index-right.index}function getSlashCommandSuggestions(commands,prefix){let normalizedPrefix=prefix.toLowerCase(),explicitSkillNamespace=normalizedPrefix.startsWith(SKILL_COMMAND_PREFIX2),hasSkillCommands=commands.some(cmd=>("name"in cmd?cmd.name:cmd.value).startsWith(SKILL_COMMAND_PREFIX2)),commandItems=commands.flatMap(cmd=>{let name="name"in cmd?cmd.name:cmd.value,isSkill=name.startsWith(SKILL_COMMAND_PREFIX2),skillName2=isSkill?name.slice(SKILL_COMMAND_PREFIX2.length):"";if(isSkill&&!explicitSkillNamespace&&(normalizedPrefix.length===0||!skillName2.toLowerCase().startsWith(normalizedPrefix)))return[];let hint="argumentHint"in cmd&&cmd.argumentHint?cmd.argumentHint:void 0,requiresArguments=("requiresArguments"in cmd?cmd.requiresArguments:void 0)??hint!==void 0,desc=cmd.description??"",fullDesc=hint?desc?`${hint} \u2014 ${desc}`:hint:desc;return[{name,label:name,description:fullDesc||void 0,searchText:isSkill&&!explicitSkillNamespace?skillName2:name,awaitsArguments:requiresArguments||"awaitsArguments"in cmd&&cmd.awaitsArguments===!0}]});return hasSkillCommands&&!explicitSkillNamespace&&normalizedPrefix.length>0&&SKILL_COMMAND_PREFIX2.startsWith(normalizedPrefix)&&commandItems.push({name:SKILL_COMMAND_PREFIX2,label:SKILL_COMMAND_PREFIX2,description:"Browse available skills",searchText:SKILL_COMMAND_PREFIX2,awaitsArguments:!1}),fuzzyFilter(commandItems,prefix,item=>item.searchText).map((item,index)=>({value:item.name,label:item.label,...item.description&&{description:item.description},...item.awaitsArguments&&{awaitsArguments:!0},index})).sort((left,right)=>compareSlashCommandSuggestion(normalizedPrefix,left,right)).map(({index:_index,...item})=>item)}var PATH_DELIMITERS=new Set([" "," ",'"',"'","="]),tokenStartRegex=new RegExp(`${autocompleteBoundaryRegex.source}$`,"u"),PATH_WRAPPERS={"(":")","[":"]","{":"}","<":">","`":"`"};function toDisplayPath(value){return value.replace(/\\/g,"/")}function escapeRegex(value){return value.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function buildFdPathQuery(query){let normalized=toDisplayPath(query);if(!normalized.includes("/"))return normalized;let hasTrailingSeparator=normalized.endsWith("/"),trimmed=normalized.replace(/^\/+|\/+$/g,"");if(!trimmed)return normalized;let separatorPattern="[\\\\/]",segments=trimmed.split("/").filter(Boolean).map(segment=>escapeRegex(segment));if(segments.length===0)return normalized;let pattern=segments.join(separatorPattern);return hasTrailingSeparator&&(pattern+=separatorPattern),pattern}function findLastDelimiter(text){let lastDelimiter=-1,index=0;for(let character of text)index+=character.length,(PATH_DELIMITERS.has(character)||autocompleteSeparatorRegex.test(character))&&(lastDelimiter=index-1);return lastDelimiter}function stripLeadingWrappers(token){let result=token;for(;result.length>0;){let closer=PATH_WRAPPERS[result[0]];if(!closer||result.includes(closer,1))break;result=result.slice(1)}return result}function findUnclosedQuoteStart(text){let inQuotes=!1,quoteStart=-1;for(let i=0;i<text.length;i+=1)text[i]==='"'&&(inQuotes=!inQuotes,inQuotes&&(quoteStart=i));return inQuotes?quoteStart:null}function isTokenStart(text,index){let start=index;for(;start>0&&PATH_WRAPPERS[text[start-1]];)start-=1;return PATH_DELIMITERS.has(text[start-1]??"")||tokenStartRegex.test(text.slice(0,start))}function extractQuotedPrefix(text){let quoteStart=findUnclosedQuoteStart(text);return quoteStart===null?null:quoteStart>0&&text[quoteStart-1]==="@"?isTokenStart(text,quoteStart-1)?text.slice(quoteStart-1):null:isTokenStart(text,quoteStart)?text.slice(quoteStart):null}function parsePathPrefix(prefix){return prefix.startsWith('@"')?{rawPrefix:prefix.slice(2),isAtPrefix:!0,isQuotedPrefix:!0}:prefix.startsWith('"')?{rawPrefix:prefix.slice(1),isAtPrefix:!1,isQuotedPrefix:!0}:prefix.startsWith("@")?{rawPrefix:prefix.slice(1),isAtPrefix:!0,isQuotedPrefix:!1}:{rawPrefix:prefix,isAtPrefix:!1,isQuotedPrefix:!1}}function buildCompletionValue(path4,options){let needsQuotes=options.isQuotedPrefix||autocompleteSeparatorRegex.test(path4),prefix=options.isAtPrefix?"@":"";return needsQuotes?`${`${prefix}"`}${path4}"`:`${prefix}${path4}`}async function walkDirectoryWithFd(baseDir,fdPath,query,maxResults,signal,maxDepth){let args=["--base-directory",baseDir,"--max-results",String(maxResults),"--type","f","--type","d","--follow","--hidden","--exclude",".git","--exclude",".git/*","--exclude",".git/**"];return maxDepth!==void 0&&args.push("--max-depth",String(maxDepth)),toDisplayPath(query).includes("/")&&args.push("--full-path"),query&&args.push(buildFdPathQuery(query)),await new Promise(resolve=>{if(signal.aborted){resolve([]);return}let child=spawn(fdPath,args,{stdio:["ignore","pipe","pipe"]}),stdout="",resolved=!1,finish=results=>{resolved||(resolved=!0,signal.removeEventListener("abort",onAbort),resolve(results))},onAbort=()=>{child.exitCode===null&&child.kill("SIGKILL")};signal.addEventListener("abort",onAbort,{once:!0}),child.stdout.setEncoding("utf-8"),child.stdout.on("data",chunk=>{stdout+=chunk}),child.on("error",()=>{finish([])}),child.on("close",code=>{if(signal.aborted||code!==0||!stdout){finish([]);return}let lines=stdout.trim().split(`
25
26
  `).filter(Boolean),results=[];for(let line of lines){let displayLine=toDisplayPath(line),hasTrailingSeparator=displayLine.endsWith("/"),normalizedPath=hasTrailingSeparator?displayLine.slice(0,-1):displayLine;normalizedPath===".git"||normalizedPath.startsWith(".git/")||normalizedPath.includes("/.git/")||results.push({path:displayLine,isDirectory:hasTrailingSeparator})}finish(results)})})}var CombinedAutocompleteProvider=class{constructor(commands=[],basePath,fdPath=null){this.commands=commands,this.basePath=basePath,this.fdPath=fdPath}getMentionRanges(line){return findDollarSkillMentions(line,knownSkillNames(this.commands)).map(({start,end})=>({start,end}))}async getSuggestions(lines,cursorLine,cursorCol,options){let textBeforeCursor=(lines[cursorLine]||"").slice(0,cursorCol),atPrefix=this.extractAtPrefix(textBeforeCursor);if(atPrefix){let{rawPrefix,isQuotedPrefix}=parsePathPrefix(atPrefix),suggestions2=await this.getFuzzyFileSuggestions(rawPrefix,{isQuotedPrefix,signal:options.signal});return suggestions2.length===0?null:{items:suggestions2,prefix:atPrefix}}let dollarContext=getDollarInvocationContext(textBeforeCursor,cursorLine,this.commands);if(dollarContext){let suggestions2=getDollarInvocationSuggestions(this.commands,dollarContext.query,dollarContext.skillsOnly);return suggestions2.length===0?null:{items:suggestions2,prefix:dollarContext.prefix}}let commandText=textBeforeCursor.trimStart();if(!options.force&&commandText.startsWith("/")){let spaceIndex=commandText.indexOf(" ");if(spaceIndex===-1){let prefix=commandText.slice(1),filtered=getSlashCommandSuggestions(this.commands,prefix);return filtered.length===0?null:{items:filtered,prefix:commandText}}let tokenStart=textBeforeCursor.search(/\S+$/),currentToken=tokenStart===-1?"":textBeforeCursor.slice(tokenStart);if(currentToken.startsWith("/skill:")&&this.isLeadingKnownSkillCommandRun(textBeforeCursor.slice(0,tokenStart))){let skillCommands=this.commands.filter(command2=>("name"in command2?command2.name:command2.value).startsWith("skill:")),filtered=getSlashCommandSuggestions(skillCommands,currentToken.slice(1));return filtered.length===0?null:{items:filtered,prefix:currentToken}}let commandName2=commandText.slice(1,spaceIndex),argumentText=commandText.slice(spaceIndex+1),command=this.commands.find(cmd=>("name"in cmd?cmd.name:cmd.value)===commandName2);if(!command||!("getArgumentCompletions"in command)||!command.getArgumentCompletions)return null;let argumentSuggestions=await command.getArgumentCompletions(argumentText);return!Array.isArray(argumentSuggestions)||argumentSuggestions.length===0?null:{items:argumentSuggestions,prefix:argumentText}}let pathMatch=this.extractPathPrefix(textBeforeCursor,options.force??!1);if(pathMatch===null)return null;let suggestions=this.getFileSuggestions(pathMatch);return suggestions.length===0?null:{items:suggestions,prefix:pathMatch}}applyCompletion(lines,cursorLine,cursorCol,item,prefix){let currentLine=lines[cursorLine]||"",beforePrefix=currentLine.slice(0,cursorCol-prefix.length),afterCursor=currentLine.slice(cursorCol),isQuotedPrefix=prefix.startsWith('"')||prefix.startsWith('@"'),hasLeadingQuoteAfterCursor=afterCursor.startsWith('"'),hasTrailingQuoteInItem=item.value.endsWith('"'),adjustedAfterCursor=isQuotedPrefix&&hasTrailingQuoteInItem&&hasLeadingQuoteAfterCursor?afterCursor.slice(1):afterCursor;if(prefix.startsWith("$")&&(item.value.startsWith("/")||item.value.startsWith("$"))){let newLine2=`${beforePrefix}${item.value} ${adjustedAfterCursor}`,newLines2=[...lines];return newLines2[cursorLine]=newLine2,{lines:newLines2,cursorLine,cursorCol:beforePrefix.length+item.value.length+1}}if(prefix.startsWith("/")&&!prefix.slice(1).includes("/")&&(beforePrefix.trim()===""||prefix.startsWith("/skill:")&&this.isLeadingKnownSkillCommandRun(beforePrefix))){let separator=isSlashNamespaceItem(item.value)?"":" ",newLine2=`${beforePrefix}/${item.value}${separator}${adjustedAfterCursor}`,newLines2=[...lines];return newLines2[cursorLine]=newLine2,{lines:newLines2,cursorLine,cursorCol:beforePrefix.length+1+item.value.length+separator.length}}if(prefix.startsWith("@")){let isDirectory2=item.label.endsWith("/"),suffix=isDirectory2?"":" ",newLine2=`${beforePrefix+item.value}${suffix}${adjustedAfterCursor}`,newLines2=[...lines];newLines2[cursorLine]=newLine2;let hasTrailingQuote2=item.value.endsWith('"'),cursorOffset2=isDirectory2&&hasTrailingQuote2?item.value.length-1:item.value.length;return{lines:newLines2,cursorLine,cursorCol:beforePrefix.length+cursorOffset2+suffix.length}}let textBeforeCursor=currentLine.slice(0,cursorCol);if(textBeforeCursor.includes("/")&&textBeforeCursor.includes(" ")){let newLine2=beforePrefix+item.value+adjustedAfterCursor,newLines2=[...lines];newLines2[cursorLine]=newLine2;let isDirectory2=item.label.endsWith("/"),hasTrailingQuote2=item.value.endsWith('"'),cursorOffset2=isDirectory2&&hasTrailingQuote2?item.value.length-1:item.value.length;return{lines:newLines2,cursorLine,cursorCol:beforePrefix.length+cursorOffset2}}let newLine=beforePrefix+item.value+adjustedAfterCursor,newLines=[...lines];newLines[cursorLine]=newLine;let isDirectory=item.label.endsWith("/"),hasTrailingQuote=item.value.endsWith('"'),cursorOffset=isDirectory&&hasTrailingQuote?item.value.length-1:item.value.length;return{lines:newLines,cursorLine,cursorCol:beforePrefix.length+cursorOffset}}isLeadingKnownSkillCommandRun(text){let tokens=text.trim().split(/\s+/);return tokens.length>0&&tokens.every(token=>{if(!token.startsWith("/skill:"))return!1;let commandName2=token.slice(1);return this.commands.some(command=>("name"in command?command.name:command.value)===commandName2)})}extractAtPrefix(text){let quotedPrefix=extractQuotedPrefix(text);if(quotedPrefix?.startsWith('@"'))return quotedPrefix;let lastDelimiterIndex=findLastDelimiter(text),token=stripLeadingWrappers(lastDelimiterIndex===-1?text:text.slice(lastDelimiterIndex+1));return token.startsWith("@")?token:null}extractPathPrefix(text,forceExtract=!1){let quotedPrefix=extractQuotedPrefix(text);if(quotedPrefix)return quotedPrefix;let lastDelimiterIndex=findLastDelimiter(text),pathPrefix=stripLeadingWrappers(lastDelimiterIndex===-1?text:text.slice(lastDelimiterIndex+1));return forceExtract||pathPrefix.includes("/")||pathPrefix.startsWith(".")||pathPrefix.startsWith("~/")||pathPrefix===""&&text!==""&&tokenStartRegex.test(text)?pathPrefix:null}expandHomePath(path4){if(path4.startsWith("~/")){let expandedPath=join2(homedir3(),path4.slice(2));return path4.endsWith("/")&&!expandedPath.endsWith("/")?`${expandedPath}/`:expandedPath}else if(path4==="~")return homedir3();return path4}resolveScopedFuzzyQuery(rawQuery){let normalizedQuery=toDisplayPath(rawQuery),slashIndex=normalizedQuery.lastIndexOf("/");if(slashIndex===-1)return null;let displayBase=normalizedQuery.slice(0,slashIndex+1),query=normalizedQuery.slice(slashIndex+1),baseDir;displayBase.startsWith("~/")?baseDir=this.expandHomePath(displayBase):displayBase.startsWith("/")?baseDir=displayBase:baseDir=join2(this.basePath,displayBase);try{if(!statSync(baseDir).isDirectory())return null}catch{return null}return{baseDir,query,displayBase}}scopedPathForDisplay(displayBase,relativePath){let normalizedRelativePath=toDisplayPath(relativePath);return displayBase==="/"?`/${normalizedRelativePath}`:`${toDisplayPath(displayBase)}${normalizedRelativePath}`}getFileSuggestions(prefix){try{let searchDir,searchPrefix,{rawPrefix,isAtPrefix,isQuotedPrefix}=parsePathPrefix(prefix),expandedPrefix=rawPrefix;if(expandedPrefix.startsWith("~")&&(expandedPrefix=this.expandHomePath(expandedPrefix)),rawPrefix===""||rawPrefix==="./"||rawPrefix==="../"||rawPrefix==="~"||rawPrefix==="~/"||rawPrefix==="/"||isAtPrefix&&rawPrefix==="")rawPrefix.startsWith("~")||expandedPrefix.startsWith("/")?searchDir=expandedPrefix:searchDir=join2(this.basePath,expandedPrefix),searchPrefix="";else if(rawPrefix.endsWith("/"))rawPrefix.startsWith("~")||expandedPrefix.startsWith("/")?searchDir=expandedPrefix:searchDir=join2(this.basePath,expandedPrefix),searchPrefix="";else{let dir=dirname2(expandedPrefix),file=basename(expandedPrefix);rawPrefix.startsWith("~")||expandedPrefix.startsWith("/")?searchDir=dir:searchDir=join2(this.basePath,dir),searchPrefix=file}let entries=readdirSync(searchDir,{withFileTypes:!0}),suggestions=[];for(let entry of entries){if(!entry.name.toLowerCase().startsWith(searchPrefix.toLowerCase()))continue;let isDirectory=entry.isDirectory();if(!isDirectory&&entry.isSymbolicLink())try{let fullPath=join2(searchDir,entry.name);isDirectory=statSync(fullPath).isDirectory()}catch{}let relativePath,name=entry.name,displayPrefix=rawPrefix;if(displayPrefix.endsWith("/"))relativePath=displayPrefix+name;else if(displayPrefix.includes("/")||displayPrefix.includes("\\"))if(displayPrefix.startsWith("~/")){let homeRelativeDir=displayPrefix.slice(2),dir=dirname2(homeRelativeDir);relativePath=`~/${dir==="."?name:join2(dir,name)}`}else if(displayPrefix.startsWith("/")){let dir=dirname2(displayPrefix);dir==="/"?relativePath=`/${name}`:relativePath=`${dir}/${name}`}else relativePath=join2(dirname2(displayPrefix),name),displayPrefix.startsWith("./")&&!relativePath.startsWith("./")&&(relativePath=`./${relativePath}`);else displayPrefix.startsWith("~")?relativePath=`~/${name}`:relativePath=name;relativePath=toDisplayPath(relativePath);let pathValue=isDirectory?`${relativePath}/`:relativePath,value=buildCompletionValue(pathValue,{isDirectory,isAtPrefix,isQuotedPrefix});suggestions.push({value,label:name+(isDirectory?"/":"")})}return suggestions.sort((a,b2)=>{let aIsDir=a.label.endsWith("/"),bIsDir=b2.label.endsWith("/");return aIsDir&&!bIsDir?-1:!aIsDir&&bIsDir?1:a.label.localeCompare(b2.label)}),suggestions}catch{return[]}}scoreEntry(filePath,query,isDirectory){let lowerFileName=basename(filePath).toLowerCase(),lowerQuery=query.toLowerCase(),score=0;return lowerFileName===lowerQuery?score=100:lowerFileName.startsWith(lowerQuery)?score=80:lowerFileName.includes(lowerQuery)?score=50:filePath.toLowerCase().includes(lowerQuery)&&(score=30),isDirectory&&score>0&&(score+=10),score}async getBaseDirSuggestions(baseDir,query,signal){return!this.fdPath||signal.aborted?[]:await walkDirectoryWithFd(baseDir,this.fdPath,query,100,signal,1)}async getFuzzyFileSuggestions(query,options){if(!this.fdPath||options.signal.aborted)return[];try{let scopedQuery=this.resolveScopedFuzzyQuery(query),fdBaseDir=scopedQuery?.baseDir??this.basePath,fdQuery=scopedQuery?.query??query,baseDirEntries=await this.getBaseDirSuggestions(fdBaseDir,fdQuery,options.signal),recursiveEntries=await walkDirectoryWithFd(fdBaseDir,this.fdPath,fdQuery,100,options.signal),seenPaths=new Set(baseDirEntries.map(entry=>entry.path)),entries=[...baseDirEntries,...recursiveEntries.filter(entry=>seenPaths.has(entry.path)?!1:(seenPaths.add(entry.path),!0))];if(options.signal.aborted)return[];let scoredEntries=entries.map(entry=>({...entry,score:fdQuery?this.scoreEntry(entry.path,fdQuery,entry.isDirectory):1})).filter(entry=>entry.score>0);scoredEntries.sort((a,b2)=>{let scoreDiff=b2.score-a.score;if(scoreDiff!==0)return scoreDiff;let aDepth=toDisplayPath(a.path).split("/").filter(Boolean).length,bDepth=toDisplayPath(b2.path).split("/").filter(Boolean).length,depthDiff=aDepth-bDepth;if(depthDiff!==0)return depthDiff;let lengthDiff=a.path.length-b2.path.length;return lengthDiff!==0?lengthDiff:a.path.localeCompare(b2.path)});let topEntries=scoredEntries.slice(0,20),suggestions=[];for(let{path:entryPath,isDirectory}of topEntries){let pathWithoutSlash=isDirectory?entryPath.slice(0,-1):entryPath,displayPath=scopedQuery?this.scopedPathForDisplay(scopedQuery.displayBase,pathWithoutSlash):pathWithoutSlash,entryName=basename(pathWithoutSlash),completionPath=isDirectory?`${displayPath}/`:displayPath,value=buildCompletionValue(completionPath,{isDirectory,isAtPrefix:!0,isQuotedPrefix:options.isQuotedPrefix});suggestions.push({value,label:entryName+(isDirectory?"/":""),description:displayPath})}return suggestions}catch{return[]}}shouldTriggerFileCompletion(lines,cursorLine,cursorCol){let textBeforeCursor=(lines[cursorLine]||"").slice(0,cursorCol);return!(textBeforeCursor.trim().startsWith("/")&&!textBeforeCursor.trim().includes(" "))}};var Text=class _Text{constructor(text="",paddingX=1,paddingY=1,customBgFn){this.revision=nextRenderRevision(),this.text=text,this.paddingX=paddingX,this.paddingY=paddingY,this.customBgFn=customBgFn}setText(text){text!==this.text&&this.markRevision(),this.text=text,this.cachedText=void 0,this.cachedWidth=void 0,this.cachedLines=void 0}setCustomBgFn(customBgFn){this.customBgFn=customBgFn,this.markRevision(),this.cachedText=void 0,this.cachedWidth=void 0,this.cachedLines=void 0}invalidate(){this.cachedText=void 0,this.cachedWidth=void 0,this.cachedLines=void 0,this.markRevision()}markRevision(){this.revision=this.getRenderRevision()===void 0?this.revision+1:nextRenderRevision()}getRenderRevision(){return Object.getPrototypeOf(this)===_Text.prototype?this.revision:void 0}textRenderRevision(){return this.revision}render(width){if(this.cachedLines&&this.cachedText===this.text&&this.cachedWidth===width)return this.cachedLines;if(!this.text||this.text.trim()===""){let result2=[];return this.cachedText=this.text,this.cachedWidth=width,this.cachedLines=result2,result2}let normalizedText=this.text.replace(/\t/g," "),paddingX=Math.min(this.paddingX,Math.max(0,Math.floor((width-1)/2))),contentWidth=Math.max(1,width-paddingX*2),wrappedLines=wrapTextWithAnsi(normalizedText,contentWidth),leftMargin=" ".repeat(paddingX),rightMargin=" ".repeat(paddingX),contentLines=[];for(let line of wrappedLines){let lineWithMargins=leftMargin+line+rightMargin;if(this.customBgFn)contentLines.push(applyBackgroundToLine(lineWithMargins,width,this.customBgFn));else{let visibleLen=visibleWidth(lineWithMargins),paddingNeeded=Math.max(0,width-visibleLen);contentLines.push(lineWithMargins+" ".repeat(paddingNeeded))}}let emptyLine=" ".repeat(width),emptyLines=[];for(let i=0;i<this.paddingY;i++){let line=this.customBgFn?applyBackgroundToLine(emptyLine,width,this.customBgFn):emptyLine;emptyLines.push(line)}let result=[...emptyLines,...contentLines,...emptyLines];return flattenLines(result),this.cachedText=this.text,this.cachedWidth=width,this.cachedLines=result,result.length>0?result:[""]}};var DEFAULT_PRIMARY_COLUMN_WIDTH=32,PRIMARY_COLUMN_GAP=2,MIN_DESCRIPTION_WIDTH=10,normalizeToSingleLine=text=>text.replace(/[\r\n]+/g," ").trim(),clamp=(value,min,max)=>Math.max(min,Math.min(value,max)),SelectList=class{constructor(items,maxVisible,theme,layout={}){this.items=[],this.filteredItems=[],this.selectedIndex=0,this.maxVisible=5,this.items=items,this.filteredItems=items,this.maxVisible=maxVisible,this.theme=theme,this.layout=layout}setFilter(filter){this.filteredItems=this.items.filter(item=>item.value.toLowerCase().startsWith(filter.toLowerCase())),this.selectedIndex=0}setSelectedIndex(index){this.selectedIndex=Math.max(0,Math.min(index,this.filteredItems.length-1))}invalidate(){}render(width){let lines=[];if(this.filteredItems.length===0)return lines.push(this.theme.noMatch(" No matching commands")),lines;let primaryColumnWidth=this.getPrimaryColumnWidth(),{startIndex,endIndex}=this.getVisibleRange();for(let i=startIndex;i<endIndex;i++){let item=this.filteredItems[i];if(!item)continue;let isSelected=i===this.selectedIndex,descriptionSingleLine=item.description?normalizeToSingleLine(item.description):void 0;lines.push(this.renderItem(item,isSelected,width,descriptionSingleLine,primaryColumnWidth))}if(startIndex>0||endIndex<this.filteredItems.length){let scrollText=` (${this.selectedIndex+1}/${this.filteredItems.length})`;lines.push(this.theme.scrollInfo(truncateToWidth(scrollText,width-2,"")))}return lines}handleMouse(event){if(this.filteredItems.length===0)return;if(event.type==="wheel"&&event.wheelDelta){let delta=event.wheelDelta<0?-1:1,previousIndex=this.selectedIndex;return this.selectedIndex=Math.max(0,Math.min(this.filteredItems.length-1,this.selectedIndex+delta)),this.selectedIndex!==previousIndex&&this.notifySelectionChange(),{handled:!0,render:this.selectedIndex!==previousIndex}}if(event.button!=="left"||event.type!=="press"&&event.type!=="click")return;let{startIndex,endIndex}=this.getVisibleRange(),itemIndex=startIndex+event.y;if(!(itemIndex<startIndex||itemIndex>=endIndex)){if(event.type==="press")return this.mousePressedIndex=itemIndex,this.selectedIndex!==itemIndex&&(this.selectedIndex=itemIndex,this.notifySelectionChange()),{handled:!0,focus:!0};if(event.type==="click"){let clickedIndex=this.mousePressedIndex??itemIndex;this.mousePressedIndex=void 0;let changed=this.selectedIndex!==clickedIndex;this.selectedIndex=clickedIndex,changed&&this.notifySelectionChange();let selectedItem=this.filteredItems[this.selectedIndex];return selectedItem&&this.onSelect?.(selectedItem),{handled:!0}}}}handleInput(keyData){let kb=getKeybindings();if(kb.matches(keyData,"tui.select.up"))this.selectedIndex=this.selectedIndex===0?this.filteredItems.length-1:this.selectedIndex-1,this.notifySelectionChange();else if(kb.matches(keyData,"tui.select.down"))this.selectedIndex=this.selectedIndex===this.filteredItems.length-1?0:this.selectedIndex+1,this.notifySelectionChange();else if(kb.matches(keyData,"tui.select.confirm")){let selectedItem=this.filteredItems[this.selectedIndex];selectedItem&&this.onSelect&&this.onSelect(selectedItem)}else kb.matches(keyData,"tui.select.cancel")&&this.onCancel&&this.onCancel()}getVisibleRange(){let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible));return{startIndex,endIndex:Math.min(startIndex+this.maxVisible,this.filteredItems.length)}}renderItem(item,isSelected,width,descriptionSingleLine,primaryColumnWidth){let prefix=isSelected?"\u2192 ":" ",prefixWidth=visibleWidth(prefix);if(descriptionSingleLine&&width>40){let effectivePrimaryColumnWidth=Math.max(1,Math.min(primaryColumnWidth,width-prefixWidth-4)),maxPrimaryWidth=Math.max(1,effectivePrimaryColumnWidth-PRIMARY_COLUMN_GAP),truncatedValue2=this.truncatePrimary(item,isSelected,maxPrimaryWidth,effectivePrimaryColumnWidth),truncatedValueWidth=visibleWidth(truncatedValue2),spacing=" ".repeat(Math.max(1,effectivePrimaryColumnWidth-truncatedValueWidth)),descriptionStart=prefixWidth+truncatedValueWidth+spacing.length,remainingWidth=width-descriptionStart-2;if(remainingWidth>MIN_DESCRIPTION_WIDTH){let truncatedDesc=truncateToWidth(descriptionSingleLine,remainingWidth,"");return this.composeRow(prefix,truncatedValue2,spacing+truncatedDesc,isSelected)}}let maxWidth=width-prefixWidth-2,truncatedValue=this.truncatePrimary(item,isSelected,maxWidth,maxWidth);return this.composeRow(prefix,truncatedValue,void 0,isSelected)}composeRow(prefix,primary,description,isSelected){return this.theme.renderRow?this.theme.renderRow({prefix:isSelected?this.theme.selectedPrefix(prefix):prefix,primary,description,isSelected}):isSelected?this.theme.selectedText(`${prefix}${primary}${description??""}`):prefix+primary+(description!==void 0?this.theme.description(description):"")}getPrimaryColumnWidth(){let{min,max}=this.getPrimaryColumnBounds(),widestPrimary=this.filteredItems.reduce((widest,item)=>Math.max(widest,visibleWidth(this.getDisplayValue(item))+PRIMARY_COLUMN_GAP),0);return clamp(widestPrimary,min,max)}getPrimaryColumnBounds(){let rawMin=this.layout.minPrimaryColumnWidth??this.layout.maxPrimaryColumnWidth??DEFAULT_PRIMARY_COLUMN_WIDTH,rawMax=this.layout.maxPrimaryColumnWidth??this.layout.minPrimaryColumnWidth??DEFAULT_PRIMARY_COLUMN_WIDTH;return{min:Math.max(1,Math.min(rawMin,rawMax)),max:Math.max(1,Math.max(rawMin,rawMax))}}truncatePrimary(item,isSelected,maxWidth,columnWidth){let displayValue=this.getDisplayValue(item),truncatedValue=this.layout.truncatePrimary?this.layout.truncatePrimary({text:displayValue,maxWidth,columnWidth,item,isSelected}):truncateToWidth(displayValue,maxWidth,"");return truncateToWidth(truncatedValue,maxWidth,"")}getDisplayValue(item){return item.label||item.value}notifySelectionChange(){let selectedItem=this.filteredItems[this.selectedIndex];selectedItem&&this.onSelectionChange&&this.onSelectionChange(selectedItem)}getSelectedItem(){return this.filteredItems[this.selectedIndex]||null}};function A(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=A();function U(l3){T=l3}var E={exec:()=>null};function I(l3){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),i=e[n];return i||(i=l3(n),e[n]=i),i}}function d(l3,e=""){let t=typeof l3=="string"?l3:l3.source,n={replace:(i,r)=>{let o=typeof r=="string"?r:r.source;return o=o.replace(m.caret,"$1"),t=t.replace(i,o),n},getRegex:()=>new RegExp(t,e)};return n}var we=((l3="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+l3)}catch{return!1}})(),m={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l3=>new RegExp(`^( {0,3}${l3})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:I(l3=>new RegExp(`^ {0,${l3}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:I(l3=>new RegExp(`^ {0,${l3}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:I(l3=>new RegExp(`^ {0,${l3}}(?:\`\`\`|~~~)`)),headingBeginRegex:I(l3=>new RegExp(`^ {0,${l3}}#`)),htmlBeginRegex:I(l3=>new RegExp(`^ {0,${l3}}(?:</?(?:${H})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,"i")),blockquoteBeginRegex:I(l3=>new RegExp(`^ {0,${l3}}>`))},ye=/^(?:[ \t]*(?:\n|$))+/,Pe=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Se=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,v=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,_e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,K=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,le=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ue=d(le).replace(/bull/g,K).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),$e=d(le).replace(/bull/g,K).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),W=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,Le=/^[^\n]+/,X=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,ze=d(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",X).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ee=d(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,K).getRegex(),H="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",J=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Me=d("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",J).replace("tag",H).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),pe=l3=>d(W).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list",l3).replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",H).getRegex(),Ae=pe(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),Ie=pe(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),Ce=d(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ie).getRegex(),V={blockquote:Ce,code:Pe,def:ze,fences:Se,heading:_e,hr:v,html:Me,lheading:ue,list:Ee,newline:ye,paragraph:Ae,table:E,text:Le},ie=d("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",H).getRegex(),Be={...V,lheading:$e,table:ie,paragraph:d(W).replace("hr",v).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ie).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",H).getRegex()},De={...V,html:d(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",J).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:E,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:d(W).replace("hr",v).replace("heading",` *#{1,6} *[^
26
27
  ]`).replace("lheading",ue).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},qe=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ve=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ce=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,He=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,_=/[\p{P}\p{S}]/u,C=/[\s\p{P}\p{S}]/u,Z=/[^\s\p{P}\p{S}]/u,Ze=d(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,C).getRegex(),Ge=/[\p{Pi}\p{Ps}"']/u,he=/(?!~)[\p{P}\p{S}]/u,Qe=/(?!~)[\s\p{P}\p{S}]/u,Ne=/(?:[^\s\p{P}\p{S}]|~)/u,je=d(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",we?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),de=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Ue=d(de,"u").replace(/punct/g,_).getRegex(),Fe=d(de,"u").replace(/punct/g,he).getRegex(),Ke=/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,We=d(Ke,"u").replace(/openQuote/g,Ge).replace(/punct/g,_).getRegex(),ke="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Xe=d(ke,"gu").replace(/notPunctSpace/g,Z).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),Je=d(ke,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Qe).replace(/punct/g,he).getRegex(),Ve="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)",Ye=d(Ve,"gu").replace(/notPunctSpace/g,Z).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),et=d("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Z).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),tt="^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)",nt=d(tt,"gu").replace(/notPunctSpace/g,Z).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),rt=d(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,_).getRegex(),st="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",it=d(st,"gu").replace(/notPunctSpace/g,Z).replace(/punctSpace/g,C).replace(/punct/g,_).getRegex(),ot=d(/\\(punct)/,"gu").replace(/punct/g,_).getRegex(),at=d(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),lt=d(J).replace("(?:-->|$)","-->").getRegex(),ut=d("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",lt).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ge=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,N=d(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets",ge).getRegex(),pt=d(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",N).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ct=d(/^!?\[(label)\]\[(ref)\]/).replace("label",N).replace("ref",X).getRegex(),ht=d(/^!?\[(ref)\](?:\[\])?/).replace("ref",X).getRegex(),oe=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,dt=d(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace("brackets",ge).getRegex(),kt=d("reflink|nolink(?!\\()","g").replace("reflink",d(/^!?\[(label)\]\[(ref)\]/).replace("label",dt).replace("ref",oe).getRegex()).replace("nolink",d(/^!?\[(ref)\](?:\[\])?/).replace("ref",oe).getRegex()).getRegex(),ae=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Y={_backpedal:E,anyPunctuation:ot,autolink:at,blockSkip:je,br:ce,code:ve,del:E,delLDelim:E,delRDelim:E,emStrongLDelim:Ue,emStrongRDelimAst:Xe,emStrongRDelimUnd:et,escape:qe,link:pt,nolink:ht,punctuation:Ze,reflink:ct,reflinkSearch:kt,tag:ut,text:He,url:E},gt={...Y,emStrongLDelim:We,emStrongRDelimAst:Ye,emStrongRDelimUnd:nt,link:d(/^!?\[(label)\]\((.*?)\)/).replace("label",N).getRegex(),reflink:d(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",N).getRegex()},F={...Y,emStrongRDelimAst:Je,emStrongLDelim:Fe,delLDelim:rt,delRDelim:it,url:d(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",ae).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:d(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",ae).getRegex()},ft={...F,br:d(ce).replace("{2,}","*").getRegex(),text:d(F.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},G={normal:V,gfm:Be,pedantic:De},B={normal:Y,gfm:F,breaks:ft,pedantic:gt},mt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},fe=l3=>mt[l3];function R(l3,e){if(e){if(m.escapeTest.test(l3))return l3.replace(m.escapeReplace,fe)}else if(m.escapeTestNoEncode.test(l3))return l3.replace(m.escapeReplaceNoEncode,fe);return l3}function ee(l3){try{l3=encodeURI(l3).replace(m.percentDecode,"%")}catch{return null}return l3}function te(l3,e){let t=l3.replace(m.findPipe,(r,o,s)=>{let u=!1,a=o;for(;--a>=0&&s[a]==="\\";)u=!u;return u?"|":" |"}),n=t.split(m.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push("");for(;i<n.length;i++)n[i]=n[i].trim().replace(m.slashPipe,"|");return n}function $(l3,e,t){let n=l3.length;if(n===0)return"";let i=0;for(;i<n;){let r=l3.charAt(n-i-1);if(r===e&&!t)i++;else if(r!==e&&t)i++;else break}return l3.slice(0,n-i)}function ne(l3){let e=l3.split(`