@sortedyuan/maybecode 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +166 -55
  2. package/README.zh-CN.md +267 -0
  3. package/dist/application.d.ts +40 -34
  4. package/dist/application.d.ts.map +1 -1
  5. package/dist/application.js +290 -170
  6. package/dist/application.js.map +1 -1
  7. package/dist/args.d.ts +2 -2
  8. package/dist/args.d.ts.map +1 -1
  9. package/dist/args.js +50 -27
  10. package/dist/args.js.map +1 -1
  11. package/dist/bin.js +82 -71
  12. package/dist/bin.js.map +4 -4
  13. package/dist/cli/chunk-3IORPKBL.js +3572 -0
  14. package/dist/cli/chunk-3IORPKBL.js.map +7 -0
  15. package/dist/cli/{chunk-LVTRXPDS.js → chunk-4B2Z6KW7.js} +1547 -1536
  16. package/dist/cli/chunk-4B2Z6KW7.js.map +7 -0
  17. package/dist/cli/{chunk-JT6VBKOM.js → chunk-4WG6JIJJ.js} +127 -33
  18. package/dist/cli/{chunk-JT6VBKOM.js.map → chunk-4WG6JIJJ.js.map} +3 -3
  19. package/dist/cli/{chunk-K5JWPNSY.js → chunk-5SLWALZK.js} +3521 -16164
  20. package/dist/cli/chunk-5SLWALZK.js.map +7 -0
  21. package/dist/cli/chunk-MNBYXL5Y.js +132 -0
  22. package/dist/cli/chunk-MNBYXL5Y.js.map +7 -0
  23. package/dist/cli/{chunk-F4XRPLUM.js → chunk-SLWLUEHQ.js} +226 -86
  24. package/dist/cli/chunk-SLWLUEHQ.js.map +7 -0
  25. package/dist/cli/chunk-UQDZ55LQ.js +199 -0
  26. package/dist/cli/chunk-UQDZ55LQ.js.map +7 -0
  27. package/dist/cli/{chunk-7ISOHFS7.js → chunk-WMSG5ZTR.js} +717 -388
  28. package/dist/cli/chunk-WMSG5ZTR.js.map +7 -0
  29. package/dist/cli/chunk-WVIRS76R.js +4057 -0
  30. package/dist/cli/chunk-WVIRS76R.js.map +7 -0
  31. package/dist/cli/{chunk-HOU5ITUK.js → chunk-XTEMRAQW.js} +1 -1
  32. package/dist/cli/chunk-XTEMRAQW.js.map +7 -0
  33. package/dist/cli/chunk-Z3BOPBVU.js +91 -0
  34. package/dist/cli/chunk-Z3BOPBVU.js.map +7 -0
  35. package/dist/cli/{configured-WHY3GGAJ.js → configured-ACNM6TRQ.js} +10 -9
  36. package/dist/cli/{file-type-R2T7TBHI.js → file-type-HLHPV7WC.js} +817 -13
  37. package/dist/cli/file-type-HLHPV7WC.js.map +7 -0
  38. package/dist/cli/mcp-auth-XD5U7WCV.js +74 -0
  39. package/dist/cli/mcp-auth-XD5U7WCV.js.map +7 -0
  40. package/dist/cli/onboarding-WQWCPYEO.js +530 -0
  41. package/dist/cli/onboarding-WQWCPYEO.js.map +7 -0
  42. package/dist/cli/onboarding-check-HRRI5OJ7.js +32 -0
  43. package/dist/cli/onboarding-check-HRRI5OJ7.js.map +7 -0
  44. package/dist/cli/{retained-tui-VJ3VX4R3.js → retained-tui-QF5VMYLC.js} +788 -332
  45. package/dist/cli/retained-tui-QF5VMYLC.js.map +7 -0
  46. package/dist/cli/{sixel-LWTCM76G.js → sixel-ISZ4FZ3U.js} +37 -37
  47. package/dist/cli/{sixel-LWTCM76G.js.map → sixel-ISZ4FZ3U.js.map} +1 -1
  48. package/dist/cli/{team-T7G7PPNN.js → team-O2I5BXHM.js} +7 -6
  49. package/dist/cli/{team-v2-JGBBQ7FR.js → team-v2-YYO2G7DJ.js} +816 -390
  50. package/dist/cli/team-v2-YYO2G7DJ.js.map +7 -0
  51. package/dist/cli/{web-server-FOMNPY7Q.js → web-server-SXMH6FGA.js} +55 -19
  52. package/dist/cli/web-server-SXMH6FGA.js.map +7 -0
  53. package/dist/cli/{web-ui-COB6PKC5.js → web-ui-UWQUFE4W.js} +7 -6
  54. package/dist/config-schema.json +337 -0
  55. package/dist/configured.d.ts +18 -11
  56. package/dist/configured.d.ts.map +1 -1
  57. package/dist/configured.js +213 -390
  58. package/dist/configured.js.map +1 -1
  59. package/dist/controller.d.ts +19 -18
  60. package/dist/controller.d.ts.map +1 -1
  61. package/dist/delegation-commands.d.ts +1 -1
  62. package/dist/delegation-commands.d.ts.map +1 -1
  63. package/dist/delegation-commands.js +8 -8
  64. package/dist/delegation-commands.js.map +1 -1
  65. package/dist/errors.d.ts +2 -1
  66. package/dist/errors.d.ts.map +1 -1
  67. package/dist/errors.js +2 -1
  68. package/dist/errors.js.map +1 -1
  69. package/dist/events.d.ts +8 -6
  70. package/dist/events.d.ts.map +1 -1
  71. package/dist/fork-picker.d.ts.map +1 -1
  72. package/dist/fork-picker.js +19 -5
  73. package/dist/fork-picker.js.map +1 -1
  74. package/dist/git-request.d.ts +6 -6
  75. package/dist/git-request.d.ts.map +1 -1
  76. package/dist/git-request.js +28 -15
  77. package/dist/git-request.js.map +1 -1
  78. package/dist/goal-commands.d.ts +1 -1
  79. package/dist/goal-commands.d.ts.map +1 -1
  80. package/dist/goal-commands.js +12 -5
  81. package/dist/goal-commands.js.map +1 -1
  82. package/dist/index.d.ts +5 -37
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +3 -36
  85. package/dist/index.js.map +1 -1
  86. package/dist/instructions.d.ts +2 -7
  87. package/dist/instructions.d.ts.map +1 -1
  88. package/dist/instructions.js +7 -15
  89. package/dist/instructions.js.map +1 -1
  90. package/dist/keymap.d.ts +2 -2
  91. package/dist/keymap.d.ts.map +1 -1
  92. package/dist/keymap.js +2 -2
  93. package/dist/keymap.js.map +1 -1
  94. package/dist/maybecode-config.schema.json +1765 -0
  95. package/dist/mcp-auth.d.ts +1 -1
  96. package/dist/mcp-auth.d.ts.map +1 -1
  97. package/dist/mcp-auth.js +11 -8
  98. package/dist/mcp-auth.js.map +1 -1
  99. package/dist/mcp-commands.d.ts.map +1 -1
  100. package/dist/mcp-commands.js +18 -4
  101. package/dist/mcp-commands.js.map +1 -1
  102. package/dist/mcp-interaction-ui.d.ts.map +1 -1
  103. package/dist/mcp-interaction-ui.js +11 -4
  104. package/dist/mcp-interaction-ui.js.map +1 -1
  105. package/dist/media-history.d.ts +1 -1
  106. package/dist/media-history.d.ts.map +1 -1
  107. package/dist/media-history.js +8 -2
  108. package/dist/media-history.js.map +1 -1
  109. package/dist/model-picker.d.ts.map +1 -1
  110. package/dist/model-picker.js +10 -11
  111. package/dist/model-picker.js.map +1 -1
  112. package/dist/model-transition.d.ts +11 -0
  113. package/dist/model-transition.d.ts.map +1 -0
  114. package/dist/model-transition.js +48 -0
  115. package/dist/model-transition.js.map +1 -0
  116. package/dist/model.d.ts +2 -2
  117. package/dist/model.d.ts.map +1 -1
  118. package/dist/model.js +8 -4
  119. package/dist/model.js.map +1 -1
  120. package/dist/onboarding-check.d.ts +3 -0
  121. package/dist/onboarding-check.d.ts.map +1 -0
  122. package/dist/onboarding-check.js +22 -0
  123. package/dist/onboarding-check.js.map +1 -0
  124. package/dist/onboarding.d.ts +6 -0
  125. package/dist/onboarding.d.ts.map +1 -0
  126. package/dist/onboarding.js +463 -0
  127. package/dist/onboarding.js.map +1 -0
  128. package/dist/plugins/application.d.ts +6 -4
  129. package/dist/plugins/application.d.ts.map +1 -1
  130. package/dist/plugins/application.js +106 -52
  131. package/dist/plugins/application.js.map +1 -1
  132. package/dist/plugins/instructions.d.ts +1 -1
  133. package/dist/plugins/instructions.d.ts.map +1 -1
  134. package/dist/plugins/instructions.js +24 -11
  135. package/dist/plugins/instructions.js.map +1 -1
  136. package/dist/plugins/resources.d.ts +2 -2
  137. package/dist/plugins/resources.d.ts.map +1 -1
  138. package/dist/plugins/resources.js +22 -12
  139. package/dist/plugins/resources.js.map +1 -1
  140. package/dist/policy.d.ts +1 -1
  141. package/dist/policy.d.ts.map +1 -1
  142. package/dist/policy.js +59 -11
  143. package/dist/policy.js.map +1 -1
  144. package/dist/run.d.ts +2 -0
  145. package/dist/run.d.ts.map +1 -1
  146. package/dist/run.js +38 -33
  147. package/dist/run.js.map +1 -1
  148. package/dist/runtime-instructions.d.ts +1 -1
  149. package/dist/runtime-instructions.d.ts.map +1 -1
  150. package/dist/runtime-instructions.js +15 -7
  151. package/dist/runtime-instructions.js.map +1 -1
  152. package/dist/session-navigation.d.ts +6 -0
  153. package/dist/session-navigation.d.ts.map +1 -0
  154. package/dist/session-navigation.js +64 -0
  155. package/dist/session-navigation.js.map +1 -0
  156. package/dist/session-picker.d.ts +1 -1
  157. package/dist/session-picker.d.ts.map +1 -1
  158. package/dist/session-picker.js +23 -32
  159. package/dist/session-picker.js.map +1 -1
  160. package/dist/settings.d.ts +718 -0
  161. package/dist/settings.d.ts.map +1 -0
  162. package/dist/settings.js +14 -0
  163. package/dist/settings.js.map +1 -0
  164. package/dist/skills.d.ts +1 -1
  165. package/dist/skills.d.ts.map +1 -1
  166. package/dist/skills.js +10 -12
  167. package/dist/skills.js.map +1 -1
  168. package/dist/slash-commands.d.ts +2 -2
  169. package/dist/slash-commands.d.ts.map +1 -1
  170. package/dist/slash-commands.js +149 -67
  171. package/dist/slash-commands.js.map +1 -1
  172. package/dist/team-execution.d.ts +10 -0
  173. package/dist/team-execution.d.ts.map +1 -0
  174. package/dist/team-execution.js +29 -0
  175. package/dist/team-execution.js.map +1 -0
  176. package/dist/team-patches.d.ts.map +1 -1
  177. package/dist/team-patches.js +149 -52
  178. package/dist/team-patches.js.map +1 -1
  179. package/dist/team-plan.d.ts +2 -2
  180. package/dist/team-plan.d.ts.map +1 -1
  181. package/dist/team-plan.js +115 -34
  182. package/dist/team-plan.js.map +1 -1
  183. package/dist/team-recovery.d.ts +1 -1
  184. package/dist/team-recovery.d.ts.map +1 -1
  185. package/dist/team-recovery.js +40 -10
  186. package/dist/team-recovery.js.map +1 -1
  187. package/dist/team-v2.d.ts.map +1 -1
  188. package/dist/team-v2.js +335 -104
  189. package/dist/team-v2.js.map +1 -1
  190. package/dist/team-verification.d.ts +4 -2
  191. package/dist/team-verification.d.ts.map +1 -1
  192. package/dist/team-verification.js +300 -97
  193. package/dist/team-verification.js.map +1 -1
  194. package/dist/team.d.ts +2 -2
  195. package/dist/team.d.ts.map +1 -1
  196. package/dist/team.js +172 -62
  197. package/dist/team.js.map +1 -1
  198. package/dist/terminal-web.d.ts +1 -0
  199. package/dist/terminal-web.d.ts.map +1 -1
  200. package/dist/terminal-web.js +28 -10
  201. package/dist/terminal-web.js.map +1 -1
  202. package/dist/ui/actions.d.ts.map +1 -1
  203. package/dist/ui/actions.js.map +1 -1
  204. package/dist/ui/retained-tui.d.ts.map +1 -1
  205. package/dist/ui/retained-tui.js +231 -173
  206. package/dist/ui/retained-tui.js.map +1 -1
  207. package/dist/ui/{prototype-view.d.ts → terminal-view.d.ts} +7 -7
  208. package/dist/ui/terminal-view.d.ts.map +1 -0
  209. package/dist/ui/{prototype-view.js → terminal-view.js} +185 -98
  210. package/dist/ui/terminal-view.js.map +1 -0
  211. package/dist/web-commands.d.ts.map +1 -1
  212. package/dist/web-commands.js +160 -57
  213. package/dist/web-commands.js.map +1 -1
  214. package/dist/web-extension.d.ts.map +1 -1
  215. package/dist/web-extension.js +14 -4
  216. package/dist/web-extension.js.map +1 -1
  217. package/dist/web-server.d.ts.map +1 -1
  218. package/dist/web-server.js +2 -1
  219. package/dist/web-server.js.map +1 -1
  220. package/dist/web-ui.d.ts.map +1 -1
  221. package/dist/web-ui.js +167 -40
  222. package/dist/web-ui.js.map +1 -1
  223. package/dist/workspace-configuration.d.ts +7 -0
  224. package/dist/workspace-configuration.d.ts.map +1 -0
  225. package/dist/workspace-configuration.js +134 -0
  226. package/dist/workspace-configuration.js.map +1 -0
  227. package/dist/workspace-state.d.ts +20 -0
  228. package/dist/workspace-state.d.ts.map +1 -0
  229. package/dist/workspace-state.js +2 -0
  230. package/dist/workspace-state.js.map +1 -0
  231. package/dist/workspace.d.ts +26 -43
  232. package/dist/workspace.d.ts.map +1 -1
  233. package/dist/workspace.js +261 -323
  234. package/dist/workspace.js.map +1 -1
  235. package/package.json +21 -31
  236. package/dist/cli/chunk-7ISOHFS7.js.map +0 -7
  237. package/dist/cli/chunk-F4XRPLUM.js.map +0 -7
  238. package/dist/cli/chunk-H7SNBFO4.js +0 -5522
  239. package/dist/cli/chunk-H7SNBFO4.js.map +0 -7
  240. package/dist/cli/chunk-HOU5ITUK.js.map +0 -7
  241. package/dist/cli/chunk-K5JWPNSY.js.map +0 -7
  242. package/dist/cli/chunk-LVTRXPDS.js.map +0 -7
  243. package/dist/cli/chunk-VAZMCNBB.js +0 -686
  244. package/dist/cli/chunk-VAZMCNBB.js.map +0 -7
  245. package/dist/cli/chunk-WOFEI42C.js +0 -7820
  246. package/dist/cli/chunk-WOFEI42C.js.map +0 -7
  247. package/dist/cli/file-type-R2T7TBHI.js.map +0 -7
  248. package/dist/cli/mcp-auth-UNRHSIKJ.js +0 -63
  249. package/dist/cli/mcp-auth-UNRHSIKJ.js.map +0 -7
  250. package/dist/cli/retained-tui-VJ3VX4R3.js.map +0 -7
  251. package/dist/cli/team-v2-JGBBQ7FR.js.map +0 -7
  252. package/dist/cli/tui-SA74DKMA.js +0 -1705
  253. package/dist/cli/tui-SA74DKMA.js.map +0 -7
  254. package/dist/cli/web-server-FOMNPY7Q.js.map +0 -7
  255. package/dist/delegation.d.ts +0 -2
  256. package/dist/delegation.d.ts.map +0 -1
  257. package/dist/delegation.js +0 -2
  258. package/dist/delegation.js.map +0 -1
  259. package/dist/history-memory.d.ts +0 -2
  260. package/dist/history-memory.d.ts.map +0 -1
  261. package/dist/history-memory.js +0 -2
  262. package/dist/history-memory.js.map +0 -1
  263. package/dist/subagent-budget.d.ts +0 -2
  264. package/dist/subagent-budget.d.ts.map +0 -1
  265. package/dist/subagent-budget.js +0 -2
  266. package/dist/subagent-budget.js.map +0 -1
  267. package/dist/subagent-files.d.ts +0 -2
  268. package/dist/subagent-files.d.ts.map +0 -1
  269. package/dist/subagent-files.js +0 -2
  270. package/dist/subagent-files.js.map +0 -1
  271. package/dist/subagent-host.d.ts +0 -2
  272. package/dist/subagent-host.d.ts.map +0 -1
  273. package/dist/subagent-host.js +0 -2
  274. package/dist/subagent-host.js.map +0 -1
  275. package/dist/subagent-instructions.d.ts +0 -2
  276. package/dist/subagent-instructions.d.ts.map +0 -1
  277. package/dist/subagent-instructions.js +0 -2
  278. package/dist/subagent-instructions.js.map +0 -1
  279. package/dist/subagents.d.ts +0 -2
  280. package/dist/subagents.d.ts.map +0 -1
  281. package/dist/subagents.js +0 -2
  282. package/dist/subagents.js.map +0 -1
  283. package/dist/summarizer.d.ts +0 -2
  284. package/dist/summarizer.d.ts.map +0 -1
  285. package/dist/summarizer.js +0 -2
  286. package/dist/summarizer.js.map +0 -1
  287. package/dist/tui.d.ts +0 -7
  288. package/dist/tui.d.ts.map +0 -1
  289. package/dist/tui.js +0 -1109
  290. package/dist/tui.js.map +0 -1
  291. package/dist/ui/prototype-view.d.ts.map +0 -1
  292. package/dist/ui/prototype-view.js.map +0 -1
  293. /package/dist/cli/{configured-WHY3GGAJ.js.map → configured-ACNM6TRQ.js.map} +0 -0
  294. /package/dist/cli/{team-T7G7PPNN.js.map → team-O2I5BXHM.js.map} +0 -0
  295. /package/dist/cli/{web-ui-COB6PKC5.js.map → web-ui-UWQUFE4W.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../packages/ui/tui/src/clipboard.ts", "../../../../packages/ui/tui/src/text.ts", "../../../../packages/ui/tui/src/text-selection.ts", "../../../../node_modules/.pnpm/ansi-styles@6.2.3/node_modules/ansi-styles/index.js", "../../../../node_modules/.pnpm/is-fullwidth-code-point@5.1.0/node_modules/is-fullwidth-code-point/index.js", "../../../../node_modules/.pnpm/slice-ansi@7.1.2/node_modules/slice-ansi/index.js", "../../../../node_modules/.pnpm/string-width@8.3.0/node_modules/string-width/index.js", "../../../../node_modules/.pnpm/wrap-ansi@10.0.2/node_modules/wrap-ansi/index.js", "../../../../packages/ui/tui/src/theme.ts", "../../../../packages/ui/tui/src/images.ts", "../../../../packages/ui/tui/src/agent/tool-renderers.ts", "../../../../packages/ui/tui/src/list-selection.ts", "../../../../packages/ui/tui/src/workspace-diff.ts", "../../../../packages/ui/tui/src/component.ts", "../../../../packages/ui/tui/src/screen-buffer.ts", "../../../../packages/ui/tui/src/renderer.ts", "../../../../packages/ui/tui/src/runtime.ts", "../../../../packages/ui/tui/src/terminal-driver.ts", "../../../../packages/ui/tui/src/agent/transcript-store.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/defaults.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/rules.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/helpers.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Tokenizer.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Lexer.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Renderer.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/TextRenderer.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Parser.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Hooks.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/Instance.ts", "../../../../node_modules/.pnpm/marked@18.0.11/node_modules/marked/src/marked.ts", "../../../../packages/ui/tui/src/markdown.ts", "../../../../packages/ui/tui/src/stack.ts", "../../../../packages/ui/tui/src/agent/transcript-view.ts", "../../../../packages/ui/tui/src/column.ts", "../../../../packages/ui/tui/src/editor-keymap.ts", "../../../../packages/ui/tui/src/editor.ts", "../../../../packages/ui/tui/src/focus.ts", "../../../../packages/ui/tui/src/session-fork.ts", "../../../../packages/ui/tui/src/markdown-excerpt.ts", "../../../../packages/ui/tui/src/overlay.ts", "../../../../packages/ui/tui/src/scroll-view.ts", "../../../../packages/ui/tui/src/select-list.ts", "../../src/mcp-interaction-ui.ts", "../../src/terminal-web.ts", "../../src/keymap.ts"],
4
- "sourcesContent": ["import clipboardy from \"clipboardy\";\nimport type { TerminalWriter } from \"./renderer.js\";\n\nexport interface Clipboard {\n readText(): Promise<string>;\n writeText(text: string): Promise<void>;\n}\n\nexport type ClipboardMode = \"auto\" | \"system\" | \"osc52\" | \"disabled\";\n\nexport interface TerminalClipboardOptions {\n readonly mode?: ClipboardMode;\n readonly output?: TerminalWriter;\n readonly env?: Readonly<Record<string, string | undefined>>;\n}\n\nexport class ClipboardUnavailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ClipboardUnavailableError\";\n }\n}\n\nexport class SystemClipboard implements Clipboard {\n async readText(): Promise<string> {\n return clipboardy.read();\n }\n\n async writeText(text: string): Promise<void> {\n await clipboardy.write(text);\n }\n}\n\nexport class Osc52Clipboard implements Clipboard {\n constructor(private readonly output: TerminalWriter) {}\n\n async readText(): Promise<string> {\n throw new ClipboardUnavailableError(\"OSC 52 clipboard reads are unavailable. Use your terminal's paste command.\");\n }\n\n async writeText(text: string): Promise<void> {\n this.output.write(`\\x1b]52;c;${Buffer.from(text, \"utf8\").toString(\"base64\")}\\x07`);\n }\n}\n\nclass UnavailableClipboard implements Clipboard {\n constructor(private readonly reason: string) {}\n\n async readText(): Promise<string> {\n throw new ClipboardUnavailableError(this.reason);\n }\n\n async writeText(_text: string): Promise<void> {\n throw new ClipboardUnavailableError(this.reason);\n }\n}\n\nexport function createTerminalClipboard(options: TerminalClipboardOptions = {}): Clipboard {\n const env = options.env ?? process.env;\n const mode = options.mode ?? env.MAY_CLIPBOARD ?? \"auto\";\n switch (mode) {\n case \"system\": return new SystemClipboard();\n case \"osc52\": return new Osc52Clipboard(options.output ?? process.stdout);\n case \"disabled\": return new UnavailableClipboard(\"Clipboard access is disabled by MAY_CLIPBOARD.\");\n case \"auto\":\n if (env.SSH_CONNECTION || env.SSH_CLIENT || env.SSH_TTY) {\n return new UnavailableClipboard(\n \"Remote clipboard access requires MAY_CLIPBOARD=osc52 and a terminal that permits OSC 52. Use your terminal's paste command to paste.\",\n );\n }\n return new SystemClipboard();\n default: throw new RangeError(`Unsupported MAY_CLIPBOARD value: ${mode}. Expected auto, system, osc52, or disabled.`);\n }\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport type { Component, RenderResult, RenderSize } from \"./component.js\";\nimport { renderTextDocument, type TextCopyRange } from \"./text-selection.js\";\nimport { styleText, type TextStyle } from \"./theme.js\";\n\nexport interface TextOptions {\n readonly wrap?: boolean;\n /** \u7EED\u884C\u7684\u6700\u5C11\u7F29\u8FDB\u5217\u6570\uFF0C\u540C\u65F6\u4FDD\u7559\u903B\u8F91\u884C\u5DF2\u6709\u7684\u7F29\u8FDB\u3002 */\n readonly continuationIndent?: number;\n readonly style?: TextStyle;\n readonly sourceId?: string;\n /** \u6309\u903B\u8F91\u884C\u6307\u5B9A\u53EF\u590D\u5236\u7684\u6587\u5B57\u8303\u56F4\uFF0C\u7D22\u5F15\u4F7F\u7528 UTF-16\u3002 */\n readonly copyRanges?: readonly (TextCopyRange | undefined)[];\n}\n\nexport class Text implements Component {\n constructor(\n private readonly value: string | (() => string),\n private readonly options: TextOptions = {},\n ) {}\n\n render(size: RenderSize): RenderResult {\n const value = typeof this.value === \"function\" ? this.value() : this.value;\n const document = value.split(/\\r?\\n/u).map((plainLine, index) => {\n const copy = this.options.copyRanges === undefined\n ? { start: 0, end: stripVTControlCharacters(plainLine).length }\n : this.options.copyRanges[index];\n return { value: styleText(plainLine, this.options.style), ...(copy === undefined ? {} : { copy }) };\n });\n return renderTextDocument(document, size, this.options);\n }\n}\n\n/** Neutralize terminal control sequences in model, tool, or user supplied text. */\nexport function sanitizeTerminalText(value: string): string {\n return value\n .replace(/\\r\\n?/gu, \"\\n\")\n .replace(/\\u001b/gu, \"\u241B\")\n .replace(\n /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001a\\u001c-\\u001f\\u007f-\\u009f]/gu,\n \"\uFFFD\",\n );\n}\n", "import { stripVTControlCharacters } from \"node:util\";\nimport sliceAnsi from \"slice-ansi\";\nimport stringWidth from \"string-width\";\nimport wrapAnsi from \"wrap-ansi\";\nimport type { RenderResult, RenderSize } from \"./component.js\";\n\nexport interface TextSpan {\n readonly x: number;\n readonly width: number;\n readonly start: number;\n readonly end: number;\n}\n\nexport interface TextRow {\n readonly sourceId: string;\n readonly source: string;\n readonly start: number;\n readonly end: number;\n readonly spans: readonly TextSpan[];\n}\n\nexport interface TextCopyRange {\n readonly start: number;\n readonly end: number;\n}\n\nexport interface TextDocumentLine {\n readonly value: string;\n /** \u672A\u63D0\u4F9B\u65F6\uFF0C\u8BE5\u884C\u7528\u4E8E\u754C\u9762\u88C5\u9970\uFF0C\u4E0D\u8FDB\u5165\u590D\u5236\u5185\u5BB9\u3002 */\n readonly copy?: TextCopyRange;\n}\n\nconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\n/** \u4F7F\u7528\u5E03\u5C40\u65F6\u7684\u6587\u5B57\u8303\u56F4\u8FDE\u63A5\u7EC8\u7AEF\u5217\u5750\u6807\u4E0E\u590D\u5236\u5185\u5BB9\u3002 */\nexport function renderTextDocument(\n document: readonly TextDocumentLine[],\n size: RenderSize,\n options: { readonly sourceId?: string; readonly wrap?: boolean; readonly continuationIndent?: number } = {},\n): RenderResult {\n if (options.continuationIndent !== undefined && (!Number.isSafeInteger(options.continuationIndent) || options.continuationIndent < 0)) {\n throw new RangeError(\"continuationIndent must be a non-negative safe integer\");\n }\n const source = options.sourceId === undefined ? \"\" : document.filter(line => line.copy !== undefined)\n .map(line => stripVTControlCharacters(line.value).slice(line.copy!.start, line.copy!.end))\n .join(\"\\n\");\n const lines: string[] = [];\n const textRows: Array<TextRow | undefined> = [];\n let sourceOffset = 0;\n for (const line of document) {\n const expanded = expandTabs(line.value);\n const indent = options.continuationIndent === undefined || options.wrap === false ? 0 : Math.min(\n Math.max(0, size.width - 2),\n Math.max(options.continuationIndent, /^ */u.exec(stripVTControlCharacters(expanded.value))![0].length),\n );\n const wrapped = options.wrap === false\n ? [sliceAnsi(expanded.value, 0, size.width)]\n : wrapAnsi(expanded.value, Math.max(1, size.width - indent), { hard: true, trim: false, wordWrap: true }).split(\"\\n\");\n let displayOffset = 0;\n for (const [rowIndex, value] of wrapped.entries()) {\n if (lines.length >= size.height) break;\n const rowIndent = rowIndex === 0 ? 0 : indent;\n lines.push(\" \".repeat(rowIndent) + value);\n const plain = stripVTControlCharacters(value);\n if (line.copy === undefined || options.sourceId === undefined) {\n textRows.push(undefined);\n } else {\n const copy = line.copy;\n const rowDisplayOffset = displayOffset;\n const rowSourceOffset = sourceOffset;\n let spans: readonly TextSpan[] | undefined;\n const start = sourceOffset + Math.max(0, Math.min(line.copy.end - line.copy.start, (expanded.starts?.[displayOffset] ?? displayOffset) - line.copy.start));\n const end = sourceOffset + Math.max(0, Math.min(line.copy.end - line.copy.start, (expanded.ends?.[displayOffset + plain.length] ?? displayOffset + plain.length) - line.copy.start));\n textRows.push({ sourceId: options.sourceId, source, start, end,\n get spans() {\n if (spans !== undefined) return spans;\n const values: TextSpan[] = [];\n let x = rowIndent;\n for (const part of segmenter.segment(plain)) {\n const displayStart = rowDisplayOffset + part.index;\n const displayEnd = displayStart + part.segment.length;\n const partStart = expanded.starts?.[displayStart] ?? displayStart;\n const partEnd = expanded.ends?.[displayEnd] ?? displayEnd;\n const width = stringWidth(part.segment);\n if (partStart >= copy.start && partEnd <= copy.end) {\n const span = { x, width, start: rowSourceOffset + partStart - copy.start,\n end: rowSourceOffset + partEnd - copy.start };\n const previous = values.at(-1);\n if (previous !== undefined && previous.end === span.end && previous.start === span.start) {\n values[values.length - 1] = { ...previous, width: previous.width + width };\n } else values.push(span);\n }\n x += width;\n }\n spans = values;\n return spans;\n },\n });\n }\n displayOffset += plain.length;\n }\n if (line.copy !== undefined) sourceOffset += line.copy.end - line.copy.start + 1;\n if (lines.length >= size.height) break;\n }\n return { lines, ...(options.sourceId === undefined ? {} : { textRows }) };\n}\n\nfunction expandTabs(value: string): { value: string; starts?: readonly number[]; ends?: readonly number[] } {\n if (!value.includes(\"\\t\")) return { value };\n const plain = stripVTControlCharacters(value);\n const starts = [0];\n const ends = [0];\n for (let index = 0; index < plain.length; index++) {\n if (plain[index] === \"\\t\") { starts.push(index); ends.push(index + 1); }\n starts.push(index + 1);\n ends.push(index + 1);\n }\n return { value: value.replaceAll(\"\\t\", \" \"), starts, ends };\n}\n\nexport function textRowOffset(row: TextRow, x: number): number {\n for (const span of row.spans) {\n if (x < span.x + span.width / 2) return span.start;\n if (x < span.x + span.width) return span.end;\n }\n return row.end;\n}\n\nexport function highlightTextRow(line: string, row: TextRow, start: number, end: number): string {\n if (row.end <= start || row.start >= end) return line;\n const spans = row.spans.filter(span => span.start < end && span.end > start);\n if (spans.length === 0) return line;\n const first = spans[0]!.x;\n const last = spans.at(-1)!;\n const after = last.x + last.width;\n return sliceAnsi(line, 0, first) + \"\\x1b[7m\" + stripVTControlCharacters(sliceAnsi(line, first, after)) + \"\\x1b[27m\" + sliceAnsi(line, after);\n}\n", "const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n", "import {\n\t_isFullWidth as isFullWidth,\n\t_isWide as isWide,\n} from 'get-east-asian-width';\n\nexport default function isFullwidthCodePoint(codePoint) {\n\tif (!Number.isInteger(codePoint)) {\n\t\treturn false;\n\t}\n\n\treturn isFullWidth(codePoint) || isWide(codePoint);\n}\n", "import ansiStyles from 'ansi-styles';\nimport isFullwidthCodePoint from 'is-fullwidth-code-point';\n\n// \\x1b and \\x9b\nconst ESCAPES = new Set([27, 155]);\n\nconst CODE_POINT_0 = '0'.codePointAt(0);\nconst CODE_POINT_9 = '9'.codePointAt(0);\n\nconst MAX_ANSI_SEQUENCE_LENGTH = 19;\n\nconst endCodesSet = new Set();\nconst endCodesMap = new Map();\nfor (const [start, end] of ansiStyles.codes) {\n\tendCodesSet.add(ansiStyles.color.ansi(end));\n\tendCodesMap.set(ansiStyles.color.ansi(start), ansiStyles.color.ansi(end));\n}\n\nfunction getEndCode(code) {\n\tif (endCodesSet.has(code)) {\n\t\treturn code;\n\t}\n\n\tif (endCodesMap.has(code)) {\n\t\treturn endCodesMap.get(code);\n\t}\n\n\tcode = code.slice(2);\n\tif (code.includes(';')) {\n\t\tcode = code[0] + '0';\n\t}\n\n\tconst returnValue = ansiStyles.codes.get(Number.parseInt(code, 10));\n\tif (returnValue) {\n\t\treturn ansiStyles.color.ansi(returnValue);\n\t}\n\n\treturn ansiStyles.reset.open;\n}\n\nfunction findNumberIndex(string) {\n\tfor (let index = 0; index < string.length; index++) {\n\t\tconst codePoint = string.codePointAt(index);\n\t\tif (codePoint >= CODE_POINT_0 && codePoint <= CODE_POINT_9) {\n\t\t\treturn index;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\nfunction parseAnsiCode(string, offset) {\n\tstring = string.slice(offset, offset + MAX_ANSI_SEQUENCE_LENGTH);\n\tconst startIndex = findNumberIndex(string);\n\tif (startIndex !== -1) {\n\t\tlet endIndex = string.indexOf('m', startIndex);\n\t\tif (endIndex === -1) {\n\t\t\tendIndex = string.length;\n\t\t}\n\n\t\treturn string.slice(0, endIndex + 1);\n\t}\n}\n\nfunction tokenize(string, endCharacter = Number.POSITIVE_INFINITY) {\n\tconst returnValue = [];\n\n\tlet index = 0;\n\tlet visibleCount = 0;\n\twhile (index < string.length) {\n\t\tconst codePoint = string.codePointAt(index);\n\n\t\tif (ESCAPES.has(codePoint)) {\n\t\t\tconst code = parseAnsiCode(string, index);\n\t\t\tif (code) {\n\t\t\t\treturnValue.push({\n\t\t\t\t\ttype: 'ansi',\n\t\t\t\t\tcode,\n\t\t\t\t\tendCode: getEndCode(code),\n\t\t\t\t});\n\t\t\t\tindex += code.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tconst isFullWidth = isFullwidthCodePoint(codePoint);\n\t\tconst character = String.fromCodePoint(codePoint);\n\n\t\treturnValue.push({\n\t\t\ttype: 'character',\n\t\t\tvalue: character,\n\t\t\tisFullWidth,\n\t\t});\n\n\t\tindex += character.length;\n\t\tvisibleCount += isFullWidth ? 2 : character.length;\n\n\t\tif (visibleCount >= endCharacter) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn returnValue;\n}\n\nfunction reduceAnsiCodes(codes) {\n\tlet returnValue = [];\n\n\tfor (const code of codes) {\n\t\tif (code.code === ansiStyles.reset.open) {\n\t\t\t// Reset code, disable all codes\n\t\t\treturnValue = [];\n\t\t} else if (endCodesSet.has(code.code)) {\n\t\t\t// This is an end code, disable all matching start codes\n\t\t\treturnValue = returnValue.filter(returnValueCode => returnValueCode.endCode !== code.code);\n\t\t} else {\n\t\t\t// This is a start code. Disable all styles this \"overrides\", then enable it\n\t\t\treturnValue = returnValue.filter(returnValueCode => returnValueCode.endCode !== code.endCode);\n\t\t\treturnValue.push(code);\n\t\t}\n\t}\n\n\treturn returnValue;\n}\n\nfunction undoAnsiCodes(codes) {\n\tconst reduced = reduceAnsiCodes(codes);\n\tconst endCodes = reduced.map(({endCode}) => endCode);\n\treturn endCodes.reverse().join('');\n}\n\nexport default function sliceAnsi(string, start, end) {\n\tconst tokens = tokenize(string, end);\n\tlet activeCodes = [];\n\tlet position = 0;\n\tlet returnValue = '';\n\tlet include = false;\n\n\tfor (const token of tokens) {\n\t\tif (end !== undefined && position >= end) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (token.type === 'ansi') {\n\t\t\tactiveCodes.push(token);\n\t\t\tif (include) {\n\t\t\t\treturnValue += token.code;\n\t\t\t}\n\t\t} else {\n\t\t\t// Character\n\t\t\tif (!include && position >= start) {\n\t\t\t\tinclude = true;\n\t\t\t\t// Simplify active codes\n\t\t\t\tactiveCodes = reduceAnsiCodes(activeCodes);\n\t\t\t\treturnValue = activeCodes.map(({code}) => code).join('');\n\t\t\t}\n\n\t\t\tif (include) {\n\t\t\t\treturnValue += token.value;\n\t\t\t}\n\n\t\t\tposition += token.isFullWidth ? 2 : token.value.length;\n\t\t}\n\t}\n\n\t// Disable active codes at the end\n\treturnValue += undoAnsiCodes(activeCodes);\n\treturn returnValue;\n}\n", "import stripAnsi from 'strip-ansi';\nimport {eastAsianWidth} from 'get-east-asian-width';\n\n/**\nLogic:\n- Segment graphemes to match how terminals render clusters.\n- Width rules:\n\t1. Skip non-printing clusters (Default_Ignorable, Control, pure nonspacing/enclosing Mark, lone Surrogates). Tabs are ignored by design.\n\t2. RGI emoji clusters (\\p{RGI_Emoji}) are double-width.\n\t3. Minimally-qualified/unqualified emoji clusters (ZWJ sequences with 2+ Extended_Pictographic, or keycap sequences) are double-width.\n\t4. Hangul jamo collapse each standard modern Hangul L+V or L+V+T syllable piece to width 2.\n\t Unmatched repeated leading/vowel/trailing jamo stay additive because that matches how the terminals we target render them.\n\t5. Otherwise use East Asian Width of the cluster's first visible code point, and add widths for trailing spacing marks and Halfwidth/Fullwidth Forms within the same cluster (e.g., dakuten/handakuten/prolonged sound mark).\n*/\n\nconst segmenter = new Intl.Segmenter();\n\n// Matches a visible (printing) character. Used to find the base scalar of a cluster (skipping leading Prepend/Format/Marks) and to detect whole-cluster zero-width.\n// Intentionally a single negated class without a quantifier: a repeated pattern like `^(?:\u2026|\u2026)+$` backtracks exponentially on overlapping properties, and even `^[\u2026]+$` overflows V8's backtrack stack (RangeError) on clusters with millions of marks.\nconst visibleCharacterRegex = /[^\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Nonspacing_Mark}\\p{Enclosing_Mark}\\p{Surrogate}]/v;\nconst spacingMarkRegex = /\\p{Spacing_Mark}/v;\n\n// RGI emoji sequences\nconst rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\n// Detect minimally-qualified/unqualified emoji sequences (missing VS16 but still render as double-width)\nconst unqualifiedKeycapRegex = /^[\\d#*]\\u20E3$/;\nconst extendedPictographicRegex = /\\p{Extended_Pictographic}/gu;\n\nfunction isDoubleWidthNonRgiEmojiSequence(segment) {\n\t// Real emoji clusters are < 30 chars; guard against pathological input\n\tif (segment.length > 50) {\n\t\treturn false;\n\t}\n\n\tif (unqualifiedKeycapRegex.test(segment)) {\n\t\treturn true;\n\t}\n\n\t// ZWJ sequences with 2+ Extended_Pictographic\n\tif (segment.includes('\\u200D')) {\n\t\tconst pictographics = segment.match(extendedPictographicRegex);\n\t\treturn pictographics !== null && pictographics.length >= 2;\n\t}\n\n\treturn false;\n}\n\n// Returns the cluster starting at its first visible character, or `undefined` if the whole cluster is zero-width.\nfunction baseVisible(segment) {\n\tconst index = segment.search(visibleCharacterRegex);\n\treturn index === -1 ? undefined : segment.slice(index);\n}\n\nfunction isHangulLeadingJamo(codePoint) {\n\treturn (codePoint >= 0x11_00 && codePoint <= 0x11_5F)\n\t\t|| (codePoint >= 0xA9_60 && codePoint <= 0xA9_7C);\n}\n\nfunction isHangulVowelJamo(codePoint) {\n\treturn (codePoint >= 0x11_60 && codePoint <= 0x11_A7)\n\t\t|| (codePoint >= 0xD7_B0 && codePoint <= 0xD7_C6);\n}\n\nfunction isHangulTrailingJamo(codePoint) {\n\treturn (codePoint >= 0x11_A8 && codePoint <= 0x11_FF)\n\t\t|| (codePoint >= 0xD7_CB && codePoint <= 0xD7_FB);\n}\n\nfunction isHangulJamo(codePoint) {\n\treturn isHangulLeadingJamo(codePoint)\n\t\t|| isHangulVowelJamo(codePoint)\n\t\t|| isHangulTrailingJamo(codePoint);\n}\n\nfunction hangulClusterWidth(visibleSegment, eastAsianWidthOptions) {\n\tconst codePoints = [];\n\n\tfor (const character of visibleSegment) {\n\t\tif (!visibleCharacterRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tcodePoints.push(character.codePointAt(0));\n\t}\n\n\tif (codePoints.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tlet width = 0;\n\n\tfor (let index = 0; index < codePoints.length; index++) {\n\t\tconst codePoint = codePoints[index];\n\t\tif (!isHangulJamo(codePoint)) {\n\t\t\tif (width === 0) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Mixed cluster (e.g., L + precomposed syllable): use EAW for non-jamo remainder\n\t\t\tfor (let remaining = index; remaining < codePoints.length; remaining++) {\n\t\t\t\twidth += eastAsianWidth(codePoints[remaining], eastAsianWidthOptions);\n\t\t\t}\n\n\t\t\treturn width;\n\t\t}\n\n\t\t// Modern Hangul L+V(+T) shapes as one syllable block. Unmatched jamo stay additive:\n\t\t// U+1100 U+1100 U+1161 => U+1100 + (U+1100 U+1161) => 2 + 2.\n\t\tif (\n\t\t\tisHangulLeadingJamo(codePoint)\n\t\t\t&& isHangulVowelJamo(codePoints[index + 1])\n\t\t) {\n\t\t\twidth += 2;\n\t\t\tindex += isHangulTrailingJamo(codePoints[index + 2]) ? 2 : 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n\nfunction trailingWidth(visibleSegment, eastAsianWidthOptions) {\n\tlet extra = 0;\n\tlet first = true;\n\n\tfor (const character of visibleSegment) {\n\t\tif (first) {\n\t\t\tfirst = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tspacingMarkRegex.test(character)\n\t\t\t|| (character >= '\\uFF00' && character <= '\\uFFEF')\n\t\t) {\n\t\t\textra += eastAsianWidth(character.codePointAt(0), eastAsianWidthOptions);\n\t\t}\n\t}\n\n\treturn extra;\n}\n\nexport default function stringWidth(input, options = {}) {\n\tif (typeof input !== 'string' || input.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tlet string = input;\n\n\t// Avoid calling stripAnsi when there are no ANSI escape sequences (ESC = 0x1B, CSI = 0x9B)\n\tif (!countAnsiEscapeCodes && (string.includes('\\u001B') || string.includes('\\u009B'))) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\t// Fast path: printable ASCII (0x20\u20130x7E) needs no segmenter, regex, or EAW lookup \u2014 width equals length.\n\tif (/^[\\u0020-\\u007E]*$/.test(string)) {\n\t\treturn string.length;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment} of segmenter.segment(string)) {\n\t\t// Zero-width / non-printing clusters\n\t\tconst visibleSegment = baseVisible(segment);\n\t\tif (visibleSegment === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Emoji width logic\n\t\tif (rgiEmojiRegex.test(segment) || isDoubleWidthNonRgiEmojiSequence(segment)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst hangulWidth = hangulClusterWidth(visibleSegment, eastAsianWidthOptions);\n\t\tif (hangulWidth !== undefined) {\n\t\t\twidth += hangulWidth;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Everything else: EAW of the cluster\u2019s first visible scalar\n\t\tconst codePoint = visibleSegment.codePointAt(0);\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\n\t\t// Add width for trailing spacing marks and Halfwidth/Fullwidth Forms (e.g., \uFF9E, \uFF9F, \uFF70)\n\t\twidth += trailingWidth(visibleSegment, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n", "import stringWidth from 'string-width';\nimport ansiStyles from 'ansi-styles';\n\nconst ANSI_ESCAPE = '\\u001B';\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst C1_CSI = '\\u009B';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_SGR_RESET = 0;\nconst ANSI_SGR_RESET_FOREGROUND = 39;\nconst ANSI_SGR_RESET_BACKGROUND = 49;\nconst ANSI_SGR_RESET_UNDERLINE_COLOR = 59;\nconst ANSI_SGR_FOREGROUND_EXTENDED = 38;\nconst ANSI_SGR_BACKGROUND_EXTENDED = 48;\nconst ANSI_SGR_UNDERLINE_COLOR_EXTENDED = 58;\nconst ANSI_SGR_COLOR_MODE_RGB = 2;\nconst ANSI_SGR_COLOR_MODE_256 = 5;\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;`;\n// The first character of every sequence we recognize.\nconst ESCAPES = new Set([\n\tANSI_ESCAPE,\n\tC1_CSI,\n]);\nconst ESCAPE_CHARACTERS = [...ESCAPES].join('');\n\nconst CSI_INTRODUCER = `(?:${ANSI_ESCAPE}\\\\${ANSI_CSI}|${C1_CSI})`;\nconst CSI_PARAMETERS = '[0-?]*[ -/]*[@-~]';\nconst SGR_PARAMETERS = `(?<sgr>[0-9;:]*)${ANSI_SGR_TERMINATOR}`;\nconst OSC_STRING_TERMINATOR = `(?:${ANSI_ESCAPE_BELL}|${ANSI_ESCAPE}\\\\\\\\)`;\nconst OSC_STRING_PAYLOAD = String.raw`[^\\u0000-\\u001F\\u007F-\\u009F]*`;\n// A hyperlink is `OSC 8 ; parameters ; URI ST`, where `parameters` is a possibly empty list of `key=value` pairs joined by `:`.\nconst LINK_PARAMETERS = String.raw`8;(?<parameters>[^;\\u0000-\\u001F\\u007F-\\u009F]*);(?<uri>${OSC_STRING_PAYLOAD})${OSC_STRING_TERMINATOR}`;\nconst OSC_STRING = `${OSC_STRING_PAYLOAD}${OSC_STRING_TERMINATOR}`;\n\n// Supported boundary: semicolon-delimited SGR styling, colon-delimited RGB/indexed colors, and OSC 8 hyperlinks are tracked, while ordinary CSI sequences and other complete 7-bit OSC commands are preserved as opaque zero-width units. This is intentionally not a terminal emulator, so other colon-delimited SGR semantics, C0 bytes inside sequences, DCS/SOS/PM/APC control strings, cancellations, generic ESC sequences, and 8-bit control-string forms are unsupported. Newlines always delimit input lines before ANSI parsing.\nconst ANSI_ESCAPE_REGEX = new RegExp(\n\t`${CSI_INTRODUCER}(?:${SGR_PARAMETERS}|${CSI_PARAMETERS})`\n\t+ `|${ANSI_ESCAPE}\\\\${ANSI_OSC}(?:${LINK_PARAMETERS}|${OSC_STRING})`,\n\t'y',\n);\n\nconst ANSI_SGR_MODIFIER_CLOSE_CODES = new Set(ansiStyles.codes.values());\nANSI_SGR_MODIFIER_CLOSE_CODES.delete(ANSI_SGR_RESET);\n\nconst segmenter = new Intl.Segmenter();\n// Complete ANSI sequences have already been removed before measuring these strings. Avoid string-width's ANSI scan so malformed sequences are not rescanned.\nconst getStringWidth = string => stringWidth(string, {countAnsiEscapeCodes: true});\nconst TAB_SIZE = 8;\n\n// Finds the next character that could introduce a sequence, so plain text is skipped in one native step.\nconst ESCAPE_INTRODUCER_REGEX = new RegExp(`[${ESCAPE_CHARACTERS}]`, 'g');\n// The final pass only cares about sequences and row boundaries, so it skips everything else in one native step.\nconst ROW_BOUNDARY_REGEX = new RegExp(`[\\\\n${ESCAPE_CHARACTERS}]`, 'g');\n// Every printable ASCII character is its own grapheme cluster of width one, which lets the segmenter be skipped.\nconst ASCII_PRINTABLE_REGEX = /^[ -~]*$/;\n\nconst wrapAnsiCode = code => `${ANSI_ESCAPE}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = (url, parameters = '') => `${ANSI_ESCAPE}${ANSI_ESCAPE_LINK}${parameters};${url}${ANSI_ESCAPE_BELL}`;\n\n// Match a complete escape sequence starting at `index`, or return `undefined` when none starts there.\nconst matchAnsiEscape = (string, index) => {\n\tif (!ESCAPES.has(string[index])) {\n\t\treturn;\n\t}\n\n\tANSI_ESCAPE_REGEX.lastIndex = index;\n\treturn ANSI_ESCAPE_REGEX.exec(string) ?? undefined;\n};\n\n// Walk a string as alternating plain text runs and complete escape sequences.\n// A character that looks like an introducer but does not start a valid sequence stays plain text.\nconst forEachSegment = (string, onPlainText, onEscape = () => {}) => {\n\tlet plainStart = 0;\n\tlet index = 0;\n\n\twhile (index < string.length) {\n\t\tESCAPE_INTRODUCER_REGEX.lastIndex = index;\n\t\tconst introducer = ESCAPE_INTRODUCER_REGEX.exec(string);\n\n\t\tif (!introducer) {\n\t\t\tbreak;\n\t\t}\n\n\t\tconst escape = matchAnsiEscape(string, introducer.index);\n\n\t\tif (!escape) {\n\t\t\tindex = introducer.index + 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (introducer.index > plainStart) {\n\t\t\tonPlainText(string.slice(plainStart, introducer.index));\n\t\t}\n\n\t\tonEscape(escape[0]);\n\t\tindex = introducer.index + escape[0].length;\n\t\tplainStart = index;\n\t}\n\n\tif (plainStart < string.length) {\n\t\tonPlainText(string.slice(plainStart));\n\t}\n};\n\n// The visible width of a string, ignoring escape sequences.\nconst getWidth = string => {\n\tlet plainText = '';\n\n\tforEachSegment(string, part => {\n\t\tplainText += part;\n\t});\n\n\treturn getStringWidth(plainText);\n};\n\n// Split a string into escape sequences, which are zero width and must never be split, and grapheme clusters.\n// The supported boundary is between grapheme clusters and ANSI sequences; ANSI inserted inside a cluster is treated as separate segments.\nconst getTokens = string => {\n\tconst tokens = [];\n\n\tforEachSegment(string, plainText => {\n\t\tif (ASCII_PRINTABLE_REGEX.test(plainText)) {\n\t\t\tfor (const character of plainText) {\n\t\t\t\ttokens.push({value: character, width: 1});\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const {segment} of segmenter.segment(plainText)) {\n\t\t\ttokens.push({value: segment, width: getStringWidth(segment)});\n\t\t}\n\t}, escape => {\n\t\ttokens.push({value: escape, width: 0});\n\t});\n\n\treturn tokens;\n};\n\n// Split on spaces, ignoring spaces that appear inside a recognized sequence.\nconst splitWords = string => {\n\tlet currentWord = {value: '', plainText: ''};\n\tconst words = [currentWord];\n\n\tforEachSegment(string, plainText => {\n\t\tconst parts = plainText.split(' ');\n\t\tcurrentWord.value += parts[0];\n\t\tcurrentWord.plainText += parts[0];\n\n\t\tfor (let index = 1; index < parts.length; index++) {\n\t\t\tcurrentWord = {value: parts[index], plainText: parts[index]};\n\t\t\twords.push(currentWord);\n\t\t}\n\t}, escape => {\n\t\tcurrentWord.value += escape;\n\t});\n\n\t// Measured once per word rather than per run, so a grapheme cluster split by an escape still counts once.\n\tfor (const word of words) {\n\t\tword.width = getStringWidth(word.plainText);\n\t}\n\n\treturn words;\n};\n\nconst getColonColorToken = parameter => {\n\tconst parts = parameter.split(':');\n\tconst code = Number.parseInt(parts[0], 10);\n\tconst mode = Number.parseInt(parts[1], 10);\n\n\tif (![ANSI_SGR_FOREGROUND_EXTENDED, ANSI_SGR_BACKGROUND_EXTENDED, ANSI_SGR_UNDERLINE_COLOR_EXTENDED].includes(code)) {\n\t\treturn;\n\t}\n\n\tif (mode === ANSI_SGR_COLOR_MODE_256 && parts.length === 3 && /^\\d+$/.test(parts[2])) {\n\t\treturn {code, open: parameter, hasArguments: true};\n\t}\n\n\tif (mode !== ANSI_SGR_COLOR_MODE_RGB) {\n\t\treturn;\n\t}\n\n\tconst components = parts.length === 6 ? parts.slice(3) : parts.slice(2);\n\tconst colorSpace = parts.length === 6 ? parts[2] : undefined;\n\tif (components.length === 3 && components.every(component => /^\\d+$/.test(component)) && (colorSpace === undefined || /^\\d*$/.test(colorSpace))) {\n\t\treturn {code, open: parameter, hasArguments: true};\n\t}\n};\n\nconst getSgrTokens = sgrParameters => {\n\tconst parameters = sgrParameters.split(';');\n\tconst sgrTokens = [];\n\n\tfor (let index = 0; index < parameters.length; index++) {\n\t\tconst parameter = parameters[index];\n\t\tif (parameter.includes(':')) {\n\t\t\tconst colonColorToken = getColonColorToken(parameter);\n\t\t\tif (colonColorToken) {\n\t\t\t\tsgrTokens.push(colonColorToken);\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst code = parameter === '' ? ANSI_SGR_RESET : Number.parseInt(parameter, 10);\n\n\t\tif (!Number.isFinite(code)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (code === ANSI_SGR_FOREGROUND_EXTENDED || code === ANSI_SGR_BACKGROUND_EXTENDED || code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED) {\n\t\t\tif (index + 1 >= parameters.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst mode = Number.parseInt(parameters[index + 1], 10);\n\t\t\tconst colorIndex = Number.parseInt(parameters[index + 2], 10);\n\t\t\tif (mode === ANSI_SGR_COLOR_MODE_256 && Number.isFinite(colorIndex)) {\n\t\t\t\tsgrTokens.push({code, open: [code, mode, colorIndex].join(';'), hasArguments: true});\n\t\t\t\tindex += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst red = Number.parseInt(parameters[index + 2], 10);\n\t\t\tconst green = Number.parseInt(parameters[index + 3], 10);\n\t\t\tconst blue = Number.parseInt(parameters[index + 4], 10);\n\t\t\tif (mode === ANSI_SGR_COLOR_MODE_RGB && Number.isFinite(red) && Number.isFinite(green) && Number.isFinite(blue)) {\n\t\t\t\tsgrTokens.push({code, open: [code, mode, red, green, blue].join(';'), hasArguments: true});\n\t\t\t\tindex += 4;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tsgrTokens.push({code, open: String(code), hasArguments: false});\n\t}\n\n\treturn sgrTokens;\n};\n\nconst removeActiveStyle = (activeStyles, family) => {\n\tconst activeStyleIndex = activeStyles.findIndex(activeStyle => activeStyle.family === family);\n\n\tif (activeStyleIndex !== -1) {\n\t\tactiveStyles.splice(activeStyleIndex, 1);\n\t}\n};\n\nconst upsertActiveStyle = (activeStyles, nextActiveStyle) => {\n\tremoveActiveStyle(activeStyles, nextActiveStyle.family);\n\tactiveStyles.push(nextActiveStyle);\n};\n\nconst removeModifierStylesByClose = (activeStyles, closeCode) => {\n\tfor (let index = activeStyles.length - 1; index >= 0; index--) {\n\t\tconst activeStyle = activeStyles[index];\n\t\tif (activeStyle.family.startsWith('modifier-') && activeStyle.close === closeCode) {\n\t\t\tactiveStyles.splice(index, 1);\n\t\t}\n\t}\n};\n\nconst getColorStyle = sgrToken => {\n\tconst {code, open, hasArguments} = sgrToken;\n\tif ((code >= 30 && code <= 37) || (code >= 90 && code <= 97) || (code === ANSI_SGR_FOREGROUND_EXTENDED && hasArguments)) {\n\t\treturn {\n\t\t\tfamily: 'foreground',\n\t\t\topen,\n\t\t\tclose: ANSI_SGR_RESET_FOREGROUND,\n\t\t};\n\t}\n\n\tif ((code >= 40 && code <= 47) || (code >= 100 && code <= 107) || (code === ANSI_SGR_BACKGROUND_EXTENDED && hasArguments)) {\n\t\treturn {\n\t\t\tfamily: 'background',\n\t\t\topen,\n\t\t\tclose: ANSI_SGR_RESET_BACKGROUND,\n\t\t};\n\t}\n\n\tif (code === ANSI_SGR_UNDERLINE_COLOR_EXTENDED && hasArguments) {\n\t\treturn {\n\t\t\tfamily: 'underlineColor',\n\t\t\topen,\n\t\t\tclose: ANSI_SGR_RESET_UNDERLINE_COLOR,\n\t\t};\n\t}\n};\n\nconst applySgrResetCode = (code, activeStyles) => {\n\tif (code === ANSI_SGR_RESET) {\n\t\tactiveStyles.length = 0;\n\t\treturn true;\n\t}\n\n\tif (code === ANSI_SGR_RESET_FOREGROUND) {\n\t\tremoveActiveStyle(activeStyles, 'foreground');\n\t\treturn true;\n\t}\n\n\tif (code === ANSI_SGR_RESET_BACKGROUND) {\n\t\tremoveActiveStyle(activeStyles, 'background');\n\t\treturn true;\n\t}\n\n\tif (code === ANSI_SGR_RESET_UNDERLINE_COLOR) {\n\t\tremoveActiveStyle(activeStyles, 'underlineColor');\n\t\treturn true;\n\t}\n\n\tif (ANSI_SGR_MODIFIER_CLOSE_CODES.has(code)) {\n\t\tremoveModifierStylesByClose(activeStyles, code);\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nconst applySgrToken = (sgrToken, activeStyles) => {\n\tconst {code} = sgrToken;\n\n\tif (applySgrResetCode(code, activeStyles)) {\n\t\treturn;\n\t}\n\n\tconst colorStyle = getColorStyle(sgrToken);\n\tif (colorStyle) {\n\t\tupsertActiveStyle(activeStyles, colorStyle);\n\t\treturn;\n\t}\n\n\tconst close = ansiStyles.codes.get(code);\n\tif (close !== undefined && close !== ANSI_SGR_RESET) {\n\t\tupsertActiveStyle(activeStyles, {\n\t\t\tfamily: `modifier-${code}`,\n\t\t\topen: sgrToken.open,\n\t\t\tclose,\n\t\t});\n\t}\n};\n\nconst applySgrParameters = (sgrParameters, activeStyles) => {\n\tfor (const sgrToken of getSgrTokens(sgrParameters)) {\n\t\tapplySgrToken(sgrToken, activeStyles);\n\t}\n};\n\nconst applySgrResets = (sgrParameters, activeStyles) => {\n\tfor (const {code} of getSgrTokens(sgrParameters)) {\n\t\tapplySgrResetCode(code, activeStyles);\n\t}\n};\n\nconst applyLeadingSgrResets = (string, startIndex, activeStyles) => {\n\tlet index = startIndex;\n\n\twhile (index < string.length) {\n\t\tconst match = matchAnsiEscape(string, index);\n\t\tif (!match) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (match.groups.sgr !== undefined) {\n\t\t\tapplySgrResets(match.groups.sgr, activeStyles);\n\t\t}\n\n\t\tindex += match[0].length;\n\t}\n};\n\nconst getClosingSgrSequence = activeStyles => [...activeStyles].reverse().map(activeStyle => wrapAnsiCode(activeStyle.close)).join('');\nconst getOpeningSgrSequence = activeStyles => activeStyles.map(activeStyle => wrapAnsiCode(activeStyle.open)).join('');\n\n// Wrap a long word across multiple rows\n// ANSI escape codes do not count towards length\n// Takes the visible width of the last row and returns the width of the row the word ends on, so callers never have to measure the rows themselves.\nconst wrapWord = (rows, word, columns, rowWidth) => {\n\tconst tokens = getTokens(word);\n\n\tlet visible = rowWidth;\n\n\tfor (let index = 0; index < tokens.length; index++) {\n\t\tconst token = tokens[index];\n\n\t\t// Escape sequences and combining marks are zero width, so they always stay on the current row.\n\t\tif (token.width > 0 && visible > 0 && visible + token.width > columns) {\n\t\t\trows.push('');\n\t\t\tvisible = 0;\n\t\t}\n\n\t\trows[rows.length - 1] += token.value;\n\t\tvisible += token.width;\n\n\t\tif (visible === columns && index < tokens.length - 1) {\n\t\t\trows.push('');\n\t\t\tvisible = 0;\n\t\t}\n\t}\n\n\t// It's possible that the last row we copy over is only\n\t// ANSI escape characters, handle this edge-case\n\tif (!visible && rows.at(-1).length > 0 && rows.length > 1) {\n\t\trows[rows.length - 2] += rows.pop();\n\t}\n\n\t// The tokens are measured one by one, so a grapheme cluster that an escape sequence splits is counted once per part rather than once as a whole. Only the finished row tells the true width, and it is at most one row long to measure.\n\treturn getWidth(rows.at(-1));\n};\n\n// Trims spaces from a string ignoring invisible sequences\nconst stringVisibleTrimSpacesRight = string => {\n\tif (!string.includes(' ')) {\n\t\treturn string;\n\t}\n\n\tconst segments = [];\n\tforEachSegment(string, plainText => {\n\t\tsegments.push({value: plainText, isEscape: false});\n\t}, escape => {\n\t\tsegments.push({value: escape, isEscape: true});\n\t});\n\n\t// Drop the spaces that trail the last visible character, but keep the invisible sequences among them.\n\tfor (let index = segments.length - 1; index >= 0; index--) {\n\t\tconst segment = segments[index];\n\n\t\tif (segment.isEscape) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Scanned rather than matched with a regex, as a trailing-space pattern backtracks quadratically.\n\t\tlet end = segment.value.length;\n\t\twhile (end > 0 && segment.value[end - 1] === ' ') {\n\t\t\tend--;\n\t\t}\n\n\t\tsegment.value = segment.value.slice(0, end);\n\n\t\tif (getStringWidth(segment.value) > 0) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn segments.map(segment => segment.value).join('');\n};\n\nconst expandTabs = line => {\n\tif (!line.includes('\\t')) {\n\t\treturn line;\n\t}\n\n\tlet visible = 0;\n\tlet expandedLine = '';\n\tlet plainTextSinceTab = '';\n\n\tconst expandPlainText = plainText => {\n\t\tconst segments = plainText.split('\\t');\n\n\t\tfor (const [index, segment] of segments.entries()) {\n\t\t\texpandedLine += segment;\n\t\t\tplainTextSinceTab += segment;\n\n\t\t\tif (index < segments.length - 1) {\n\t\t\t\tvisible += getStringWidth(plainTextSinceTab);\n\t\t\t\tplainTextSinceTab = '';\n\t\t\t\tconst spaces = TAB_SIZE - (visible % TAB_SIZE);\n\t\t\t\texpandedLine += ' '.repeat(spaces);\n\t\t\t\tvisible += spaces;\n\t\t\t}\n\t\t}\n\t};\n\n\tforEachSegment(line, expandPlainText, escape => {\n\t\texpandedLine += escape;\n\t});\n\n\treturn expandedLine;\n};\n\n// Close the active styles and hyperlink before every row break and reopen them after, so each row stands on its own.\n// Only sequences and newlines matter here, so the string is scanned directly rather than split into grapheme clusters.\nconst restoreStylesAcrossRows = preString => {\n\tlet returnValue = '';\n\tlet activeHyperlink;\n\tconst activeStyles = [];\n\tlet index = 0;\n\tlet copiedIndex = 0;\n\n\twhile (index < preString.length) {\n\t\tROW_BOUNDARY_REGEX.lastIndex = index;\n\t\tconst boundary = ROW_BOUNDARY_REGEX.exec(preString);\n\n\t\tif (!boundary) {\n\t\t\tbreak;\n\t\t}\n\n\t\tindex = boundary.index;\n\n\t\tif (boundary[0] !== '\\n') {\n\t\t\tconst escape = matchAnsiEscape(preString, index);\n\n\t\t\tif (!escape) {\n\t\t\t\tindex++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst {groups} = escape;\n\t\t\tif (groups.sgr !== undefined) {\n\t\t\t\tapplySgrParameters(groups.sgr, activeStyles);\n\t\t\t} else if (groups.uri !== undefined) {\n\t\t\t\tactiveHyperlink = groups.uri.length === 0 ? undefined : {parameters: groups.parameters, uri: groups.uri};\n\t\t\t}\n\n\t\t\tindex += escape[0].length;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Everything up to the row break is copied verbatim, sequences included.\n\t\treturnValue += preString.slice(copiedIndex, index);\n\n\t\t// An empty row never reopened anything, so there is nothing to close.\n\t\tif (index > copiedIndex) {\n\t\t\tif (activeHyperlink) {\n\t\t\t\treturnValue += wrapAnsiHyperlink('');\n\t\t\t}\n\n\t\t\treturnValue += getClosingSgrSequence(activeStyles);\n\t\t}\n\n\t\treturnValue += '\\n';\n\t\tindex++;\n\t\tcopiedIndex = index;\n\n\t\t// An empty row has nothing to style, so the styles stay closed until the next row with content. A trailing row break leaves no row at all.\n\t\tif (index < preString.length && preString[index] !== '\\n') {\n\t\t\tconst openingStyles = [...activeStyles];\n\t\t\tapplyLeadingSgrResets(preString, index, openingStyles);\n\t\t\treturnValue += getOpeningSgrSequence(openingStyles);\n\n\t\t\tif (activeHyperlink) {\n\t\t\t\treturnValue += wrapAnsiHyperlink(activeHyperlink.uri, activeHyperlink.parameters);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn returnValue + preString.slice(copiedIndex);\n};\n\n// The wrap-ansi module can be invoked in either 'hard' or 'soft' wrap mode.\n//\n// 'hard' will never allow a string to take up more than columns characters.\n//\n// 'soft' allows long words to expand past the column length.\nconst exec = (string, columns, options = {}) => {\n\tif (options.trim !== false && string.trim() === '') {\n\t\treturn '';\n\t}\n\n\tconst words = splitWords(string);\n\tlet rows = [''];\n\t// Tracked as rows are built. Remeasuring the row for every word makes wrapping quadratic in the line length.\n\tlet rowLength = 0;\n\t// Words are only ever appended, so a row that already starts with content can never become trimmable again. Retrimming it for every word makes wrapping quadratic in the line length.\n\tlet trimmedRowIndex = -1;\n\n\tlet isFirstWord = true;\n\n\tfor (const word of words) {\n\t\tconst rowIndex = rows.length - 1;\n\n\t\tif (options.trim !== false && trimmedRowIndex !== rowIndex) {\n\t\t\tconst row = rows[rowIndex];\n\t\t\tconst trimmedRow = row.trimStart();\n\n\t\t\tif (trimmedRow.length !== row.length) {\n\t\t\t\trows[rowIndex] = trimmedRow;\n\t\t\t\trowLength = getWidth(trimmedRow);\n\t\t\t}\n\n\t\t\tif (trimmedRow.length > 0) {\n\t\t\t\ttrimmedRowIndex = rowIndex;\n\t\t\t}\n\t\t}\n\n\t\tif (isFirstWord) {\n\t\t\tisFirstWord = false;\n\t\t} else {\n\t\t\tif (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {\n\t\t\t\t// If we start with a new word but the current row length equals the length of the columns, add a new row\n\t\t\t\trows.push('');\n\t\t\t\trowLength = 0;\n\t\t\t}\n\n\t\t\tif (rowLength > 0 || options.trim === false) {\n\t\t\t\trows[rows.length - 1] += ' ';\n\t\t\t\trowLength++;\n\t\t\t}\n\t\t}\n\n\t\t// In 'hard' wrap mode, the length of a line is never allowed to extend past 'columns'\n\t\tif (options.hard && options.wordWrap !== false && word.width > columns) {\n\t\t\tconst remainingColumns = columns - rowLength;\n\t\t\tconst breaksStartingThisLine = 1 + Math.floor((word.width - remainingColumns - 1) / columns);\n\t\t\tconst breaksStartingNextLine = Math.floor((word.width - 1) / columns);\n\t\t\tif (breaksStartingNextLine < breaksStartingThisLine) {\n\t\t\t\trows.push('');\n\t\t\t\trowLength = 0;\n\t\t\t}\n\n\t\t\trowLength = wrapWord(rows, word.value, columns, rowLength);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (rowLength + word.width > columns && rowLength > 0 && word.width > 0) {\n\t\t\tif (options.wordWrap === false && rowLength < columns) {\n\t\t\t\trowLength = wrapWord(rows, word.value, columns, rowLength);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trows.push('');\n\t\t\trowLength = 0;\n\t\t}\n\n\t\tif (rowLength + word.width > columns && options.wordWrap === false) {\n\t\t\trowLength = wrapWord(rows, word.value, columns, rowLength);\n\t\t\tcontinue;\n\t\t}\n\n\t\trows[rows.length - 1] += word.value;\n\t\trowLength += word.width;\n\t}\n\n\tif (options.trim !== false) {\n\t\trows = rows.map(row => stringVisibleTrimSpacesRight(row));\n\t}\n\n\treturn restoreStylesAcrossRows(rows.join('\\n'));\n};\n\n// Normalize the text, but not the sequences: a combining mark that follows a sequence composes with its last character and destroys it.\nconst normalizeText = string => {\n\tlet normalizedString = '';\n\n\tforEachSegment(string, plainText => {\n\t\tnormalizedString += plainText.normalize();\n\t}, escape => {\n\t\tnormalizedString += escape;\n\t});\n\n\treturn normalizedString;\n};\n\n// For each newline, invoke the method separately.\nexport default function wrapAnsi(string, columns, options) {\n\treturn normalizeText(String(string))\n\t\t.replaceAll('\\r\\n', '\\n')\n\t\t.split('\\n')\n\t\t.map(line => exec(expandTabs(line), columns, options))\n\t\t.join('\\n');\n}\n", "export type TerminalColor =\n | \"black\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"blue\"\n | \"magenta\"\n | \"cyan\"\n | \"white\"\n | \"brightBlack\"\n | \"brightRed\"\n | \"brightGreen\"\n | \"brightYellow\"\n | \"brightBlue\"\n | \"brightMagenta\"\n | \"brightCyan\"\n | \"brightWhite\"\n | `#${string}`\n | number\n | \"\";\n\nexport interface TextStyle {\n readonly foreground?: TerminalColor;\n readonly background?: TerminalColor;\n readonly bold?: boolean;\n readonly dim?: boolean;\n readonly italic?: boolean;\n readonly underline?: boolean;\n readonly inverse?: boolean;\n readonly strikethrough?: boolean;\n}\n\nexport interface MarkdownTheme {\n readonly heading: TextStyle;\n readonly link: TextStyle;\n readonly linkUrl: TextStyle;\n readonly code: TextStyle;\n readonly codeBlock: TextStyle;\n readonly codeBlockBorder: TextStyle;\n readonly quote: TextStyle;\n readonly quoteBorder: TextStyle;\n readonly horizontalRule: TextStyle;\n readonly listBullet: TextStyle;\n}\n\n/** Semantic tokens shared by May-owned terminal applications. */\nexport interface TuiTheme {\n readonly name: string;\n readonly text: TextStyle;\n readonly accent: TextStyle;\n readonly muted: TextStyle;\n readonly dim: TextStyle;\n readonly success: TextStyle;\n readonly warning: TextStyle;\n readonly error: TextStyle;\n readonly border: TextStyle;\n readonly borderAccent: TextStyle;\n readonly selected: TextStyle;\n readonly userMessage: TextStyle;\n readonly assistantLabel: TextStyle;\n readonly thinking: TextStyle;\n readonly toolTitle: TextStyle;\n readonly toolOutput: TextStyle;\n readonly toolPending: TextStyle;\n readonly toolSuccess: TextStyle;\n readonly toolError: TextStyle;\n readonly diffAdded: TextStyle;\n readonly diffRemoved: TextStyle;\n readonly diffContext: TextStyle;\n readonly markdown: MarkdownTheme;\n}\n\nexport const DEFAULT_DARK_THEME: TuiTheme = {\n name: \"may-dark\",\n text: {},\n accent: { foreground: \"brightCyan\", bold: true },\n muted: { foreground: \"brightBlack\" },\n dim: { foreground: \"brightBlack\", dim: true },\n success: { foreground: \"brightGreen\" },\n warning: { foreground: \"brightYellow\" },\n error: { foreground: \"brightRed\" },\n border: { foreground: \"brightBlack\" },\n borderAccent: { foreground: \"brightCyan\" },\n selected: { foreground: \"brightWhite\", background: 237, bold: true },\n userMessage: { foreground: \"brightWhite\", bold: true },\n assistantLabel: { foreground: \"brightCyan\", bold: true },\n thinking: { foreground: \"brightBlack\", italic: true },\n toolTitle: { foreground: \"brightBlue\", bold: true },\n toolOutput: { foreground: \"white\" },\n toolPending: { foreground: \"brightYellow\" },\n toolSuccess: { foreground: \"brightGreen\" },\n toolError: { foreground: \"brightRed\" },\n diffAdded: { foreground: \"brightGreen\" },\n diffRemoved: { foreground: \"brightRed\" },\n diffContext: { foreground: \"brightBlack\" },\n markdown: {\n heading: { foreground: \"brightCyan\", bold: true },\n link: { foreground: \"brightBlue\", underline: true },\n linkUrl: { foreground: \"brightBlack\" },\n code: { foreground: \"brightYellow\" },\n codeBlock: { foreground: \"white\" },\n codeBlockBorder: { foreground: \"brightBlack\" },\n quote: { foreground: \"white\", italic: true },\n quoteBorder: { foreground: \"brightBlack\" },\n horizontalRule: { foreground: \"brightBlack\" },\n listBullet: { foreground: \"brightCyan\" },\n },\n};\n\n/** Apply framework-generated SGR styles without accepting raw escape codes. */\nexport function styleText(value: string, style: TextStyle | undefined): string {\n if (value === \"\" || style === undefined) return value;\n const open: number[] = [];\n const close: number[] = [];\n appendColor(open, close, style.foreground, false);\n appendColor(open, close, style.background, true);\n appendEffect(open, close, style.bold, 1, 22);\n appendEffect(open, close, style.dim, 2, 22);\n appendEffect(open, close, style.italic, 3, 23);\n appendEffect(open, close, style.underline, 4, 24);\n appendEffect(open, close, style.inverse, 7, 27);\n appendEffect(open, close, style.strikethrough, 9, 29);\n if (open.length === 0) return value;\n return `\\x1b[${open.join(\";\")}m${value}\\x1b[${[...new Set(close.reverse())].join(\";\")}m`;\n}\n\nexport function mergeTextStyles(\n base: TextStyle,\n overrides: TextStyle,\n): TextStyle {\n return { ...base, ...overrides };\n}\n\nfunction appendEffect(\n open: number[],\n close: number[],\n enabled: boolean | undefined,\n openCode: number,\n closeCode: number,\n): void {\n if (!enabled) return;\n open.push(openCode);\n close.push(closeCode);\n}\n\nfunction appendColor(\n open: number[],\n close: number[],\n color: TerminalColor | undefined,\n background: boolean,\n): void {\n if (color === undefined || color === \"\") return;\n const prefix = background ? 48 : 38;\n const reset = background ? 49 : 39;\n if (typeof color === \"number\") {\n open.push(prefix, 5, clampByte(color));\n close.push(reset);\n return;\n }\n if (color.startsWith(\"#\")) {\n const rgb = parseHexColor(color);\n if (rgb === undefined) throw new Error(`Invalid terminal color: ${color}`);\n open.push(prefix, 2, rgb.red, rgb.green, rgb.blue);\n close.push(reset);\n return;\n }\n const code = NAMED_COLORS[color as keyof typeof NAMED_COLORS];\n open.push(code + (background ? 10 : 0));\n close.push(reset);\n}\n\nfunction parseHexColor(value: string): {\n readonly red: number;\n readonly green: number;\n readonly blue: number;\n} | undefined {\n const short = /^#([\\da-f])([\\da-f])([\\da-f])$/iu.exec(value);\n if (short !== null) {\n return {\n red: Number.parseInt(short[1]! + short[1]!, 16),\n green: Number.parseInt(short[2]! + short[2]!, 16),\n blue: Number.parseInt(short[3]! + short[3]!, 16),\n };\n }\n const full = /^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})$/iu.exec(value);\n return full === null\n ? undefined\n : {\n red: Number.parseInt(full[1]!, 16),\n green: Number.parseInt(full[2]!, 16),\n blue: Number.parseInt(full[3]!, 16),\n };\n}\n\nfunction clampByte(value: number): number {\n if (!Number.isFinite(value)) throw new RangeError(\"ANSI color index must be finite\");\n return Math.min(255, Math.max(0, Math.trunc(value)));\n}\n\nconst NAMED_COLORS: Readonly<Record<Exclude<TerminalColor, number | `#${string}` | \"\">, number>> = {\n black: 30,\n red: 31,\n green: 32,\n yellow: 33,\n blue: 34,\n magenta: 35,\n cyan: 36,\n white: 37,\n brightBlack: 90,\n brightRed: 91,\n brightGreen: 92,\n brightYellow: 93,\n brightBlue: 94,\n brightMagenta: 95,\n brightCyan: 96,\n brightWhite: 97,\n};\n", "import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ContentPart, MediaSource } from \"@sortedyuan/core\";\nimport { FileMediaStore, imageAttachment, imagePng, readEmbeddedImage, type SavedImage } from \"@sortedyuan/media\";\nimport type { Jimp } from \"jimp\";\nimport { terminalImageProtocol, type ImageProtocol, type TerminalCellSize } from \"./image-support.js\";\nimport type { Component, ImagePlacement, RenderResult, RenderSize } from \"./component.js\";\nimport { Text, sanitizeTerminalText } from \"./text.js\";\n\nexport { terminalImageProtocol, type ImageProtocol } from \"./image-support.js\";\n\nexport interface TerminalImagesOptions {\n readonly cellSize?: () => TerminalCellSize | undefined;\n}\n\ntype PreparedImage = SavedImage & { png: string; raster?: Awaited<ReturnType<typeof Jimp.read>>; frame?: { key: string; sixel: string } };\n\nexport class TerminalImages {\n private readonly values = new Map<string, PreparedImage>();\n private sixel: typeof import(\"./sixel.js\") | undefined;\n private version = 0;\n constructor(readonly store = new FileMediaStore(join(homedir(), \".may\", \"media\")), readonly protocol: ImageProtocol = terminalImageProtocol(), private readonly options: TerminalImagesOptions = {}) {}\n get revision(): string {\n const cell = this.options.cellSize?.();\n return `${this.version}:${cell?.width}:${cell?.height}`;\n }\n async prepare(content: readonly ContentPart[]): Promise<void> {\n for (const part of content) if (part.type === \"image\" && (part.source.type === \"base64\" || this.store.read !== readEmbeddedImage)) {\n const id = imageAttachment(part.source).id;\n if (this.values.has(id)) continue;\n const image = await this.store.save(part.source);\n const png = this.protocol === \"none\" ? Buffer.alloc(0) : await imagePng(image);\n if (this.protocol === \"sixel\") this.sixel ??= await import(\"./sixel.js\");\n const raster = this.protocol === \"sixel\" ? await this.sixel!.Jimp.read(png) : undefined;\n if (raster && (raster.width > 1280 || raster.height > 768)) raster.scaleToFit({ w: 1280, h: 768 });\n this.values.set(id, { ...image, png: png.toString(\"base64\"), ...(raster ? { raster } : {}) });\n this.version++;\n }\n }\n component(source: MediaSource, sourceId?: string): Component { return { render: size => this.render(source, size, sourceId) }; }\n render(source: MediaSource, size: RenderSize, sourceId?: string): RenderResult {\n const attachment = imageAttachment(source), image = this.values.get(attachment.id);\n const caption = image ? `\u56FE\u7247 ${image.width}\u00D7${image.height} \u00B7 ${image.mediaType} \u00B7 ${image.data.byteLength} bytes\\n${image.path}`\n : attachment.url ? `\u56FE\u7247\u94FE\u63A5\uFF1A${attachment.url}` : `\u56FE\u7247 ${attachment.id}\uFF08\u5A92\u4F53\u8BFB\u53D6\u63A5\u53E3\u672A\u63D0\u4F9B\u6B64\u8D44\u6E90\uFF09`;\n const label = new Text(sanitizeTerminalText(caption), sourceId === undefined ? {} : { sourceId }).render(size);\n if (!image || this.protocol === \"none\") return label;\n if (this.protocol === \"sixel\") return this.renderSixel(image, label, size);\n const columns = Math.max(1, Math.min(size.width, 80));\n const rows = Math.max(1, Math.min(12, Math.ceil(columns * image.height / image.width / 2)));\n if (rows + label.lines.length > size.height) return label;\n const width = Math.max(1, Math.min(columns, Math.round(rows * 2 * image.width / image.height)));\n return { ...label, lines: [...label.lines, ...Array.from({ length: rows }, () => \"\")], images: [{ id: image.id, png: image.png, protocol: this.protocol, x: 0, y: label.lines.length, columns: width, rows }] };\n }\n\n private renderSixel(image: PreparedImage, label: RenderResult, size: RenderSize): RenderResult {\n const cell = this.options.cellSize?.();\n if (!cell) return label;\n if (![cell.width, cell.height].every(value => Number.isInteger(value) && value > 0)) throw new RangeError(\"Terminal cell dimensions must be positive integers\");\n const raster = image.raster;\n if (!raster) throw new Error(\"Sixel image was not prepared\");\n if (!this.sixel) throw new Error(\"Sixel encoder was not loaded\");\n const { Jimp, FINALIZER, introducer, sixelEncode, applyPaletteSync, buildPaletteSync, utils } = this.sixel;\n const maxWidth = Math.min(1280, Math.min(80, size.width) * cell.width);\n const maxHeight = Math.floor(Math.min(768, 12 * cell.height) / 6) * 6;\n const scale = Math.min(1, maxWidth / raster.width, maxHeight / raster.height);\n const width = Math.max(1, Math.floor(raster.width * scale));\n const height = Math.max(1, Math.floor(raster.height * scale));\n const rows = Math.ceil(Math.ceil(height / 6) * 6 / cell.height);\n if (rows + label.lines.length > size.height) return label;\n const key = `${width}:${height}`;\n if (image.frame?.key !== key) {\n const resized = raster.clone().resize({ w: width, h: height });\n const bitmap = new Jimp({ width, height, color: 0xffffffff }).composite(resized, 0, 0).bitmap;\n const pixels = utils.PointContainer.fromUint8Array(new Uint8Array(bitmap.data), width, height);\n const palette = buildPaletteSync([pixels], { colors: 256, paletteQuantization: \"wuquant\", colorDistanceFormula: \"euclidean\" });\n const quantized = applyPaletteSync(pixels, palette, { imageQuantization: \"floyd-steinberg\", colorDistanceFormula: \"euclidean\" });\n const data = new Uint8Array(quantized.toUint8Array());\n image.frame = { key, sixel: introducer(1) + sixelEncode(data, width, height, Array.from(palette.getPointContainer().toUint32Array())) + FINALIZER };\n }\n return {\n ...label,\n lines: [...label.lines, ...Array.from({ length: rows }, () => \"\")],\n images: [{ id: image.id, png: image.png, protocol: \"sixel\", sixel: image.frame.sixel, x: 0, y: label.lines.length, columns: Math.ceil(width / cell.width), rows }],\n };\n }\n}\n\nexport function encodeImage(image: ImagePlacement): string {\n if (image.protocol === \"sixel\") return `\\x1b[?80;8452s\\x1b[?80l\\x1b[?8452h${image.sixel}\\x1b[?80;8452r`;\n if (image.protocol === \"iterm2\") return `\\x1b]1337;File=inline=1;width=${image.columns};height=${image.rows};preserveAspectRatio=1:${image.png}\\x07`;\n const chunks: string[] = [];\n for (let offset = 0; offset < image.png.length; offset += 4096) {\n const last = offset + 4096 >= image.png.length;\n chunks.push(`\\x1b_G${offset === 0 ? `a=T,f=100,q=2,C=1,c=${image.columns},r=${image.rows},` : \"q=2,\"}m=${last ? 0 : 1};${image.png.slice(offset, offset + 4096)}\\x1b\\\\`);\n }\n return chunks.join(\"\");\n}\n", "import { sanitizeTerminalText } from \"../text.js\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport type { TextDocumentLine } from \"../text-selection.js\";\nimport { styleText, type TuiTheme } from \"../theme.js\";\nimport type { ToolTranscriptItem } from \"./transcript-store.js\";\n\nexport interface ToolTranscriptRenderOptions {\n readonly expanded: boolean;\n readonly selected?: boolean;\n readonly maximumOutputCharacters: number;\n readonly theme: TuiTheme;\n readonly detailsHint?: string;\n}\n\nexport interface ToolTranscriptRenderer {\n render(\n item: ToolTranscriptItem,\n options: ToolTranscriptRenderOptions,\n ): string;\n renderDocument?(item: ToolTranscriptItem, options: ToolTranscriptRenderOptions): readonly TextDocumentLine[];\n}\n\n/** Instance-scoped registry: applications can replace presentation without global state. */\nexport class ToolRendererRegistry {\n private readonly renderers = new Map<string, ToolTranscriptRenderer>();\n private generation = 0;\n get revision(): number { return this.generation; }\n\n constructor(private readonly fallback: ToolTranscriptRenderer = genericRenderer) {}\n\n register(name: string, renderer: ToolTranscriptRenderer): this {\n const normalized = name.trim();\n if (normalized === \"\") throw new Error(\"Tool renderer name cannot be empty\");\n this.renderers.set(normalized, renderer);\n this.generation++;\n return this;\n }\n\n render(\n item: ToolTranscriptItem,\n options: ToolTranscriptRenderOptions,\n ): string {\n return this.renderDocument(item, options).map(line => line.value).join(\"\\n\");\n }\n\n renderDocument(item: ToolTranscriptItem, options: ToolTranscriptRenderOptions): readonly TextDocumentLine[] {\n const renderer = this.renderers.get(item.call.name) ?? this.fallback;\n return renderer.renderDocument?.(item, options) ?? renderer.render(item, options).split(\"\\n\").map(line => copyLine(line));\n }\n}\n\n/** Create renderers for the standard May coding tools. */\nexport function createCodingToolRendererRegistry(): ToolRendererRegistry {\n return new ToolRendererRegistry()\n .register(\"shell\", shellRenderer)\n .register(\"bash\", shellRenderer)\n .register(\"read\", readRenderer)\n .register(\"edit\", fileChangeRenderer)\n .register(\"write\", fileChangeRenderer);\n}\n\nconst shellRenderer = documentRenderer((item, options) => {\n const command = stringField(item.call.input, \"command\") ?? inputSummary(item.call.input);\n const lines = [header(item, options, command)];\n appendProgress(lines, item, options);\n\n const output = objectValue(item.output);\n const stdout = stringField(output, \"stdout\") ?? item.streamedOutput;\n const stderr = stringField(output, \"stderr\") ?? \"\";\n if (stdout !== \"\") appendOutput(lines, stdout, options);\n if (stderr !== \"\") {\n lines.push(copyLine(styleText(\" stderr\", options.theme.error), 2));\n appendOutput(lines, stderr, options, options.theme.error);\n }\n if (item.status === \"completed\") {\n const exitCode = primitiveField(output, \"exitCode\");\n const signal = primitiveField(output, \"signal\");\n const result = exitCode === undefined ? \"completed\" : `exit ${String(exitCode)}`;\n lines.push(copyLine(styleText(\n ` \u2514\u2500 ${result}${signal == null ? \"\" : ` \u00B7 ${String(signal)}`}`,\n exitCode === 0 || exitCode === undefined\n ? options.theme.muted\n : options.theme.warning,\n ), 5));\n }\n appendFailure(lines, item, options);\n return lines;\n});\n\nconst readRenderer = documentRenderer((item, options) => {\n const inputPath = stringField(item.call.input, \"path\") ?? \"<unknown>\";\n const output = objectValue(item.output);\n const path = stringField(output, \"path\") ?? inputPath;\n const start = numberField(output, \"startLine\");\n const end = numberField(output, \"endLine\");\n const total = numberField(output, \"totalLines\");\n const range = start === undefined || end === undefined ? \"\" : `:${start}-${end}`;\n const lines = [header(item, options, `${path}${range}`)];\n appendProgress(lines, item, options);\n if (options.expanded) {\n const content = stringField(output, \"content\");\n if (content !== undefined && content !== \"\") {\n appendOutput(lines, content, options, options.theme.toolOutput, true, start ?? 1);\n }\n } else if (total !== undefined) {\n const count = start === undefined || end === undefined ? 0 : Math.max(0, end - start + 1);\n const description = `${count} of ${total} lines`;\n lines.push(copyLine(styleText(\n ` \u2514\u2500 ${count} of ${total} lines${options.detailsHint === undefined ? \"\" : ` \u00B7 ${options.detailsHint}`}`,\n options.theme.muted,\n ), 5, 5 + description.length));\n }\n appendFailure(lines, item, options);\n return lines;\n});\n\nconst fileChangeRenderer = documentRenderer((item, options) => {\n const inputPath = stringField(item.call.input, \"path\") ?? \"<unknown>\";\n const preview = item.preview;\n const detail = preview?.status === \"ready\"\n ? `${preview.path} +${preview.additions} -${preview.deletions}`\n : inputPath;\n const lines = [header(item, options, detail)];\n appendProgress(lines, item, options);\n\n if (preview?.status === \"ready\") {\n if (options.expanded && preview.diff !== \"\") {\n lines.push(...renderDiff(preview.diff, options.theme));\n } else {\n const hint = options.detailsHint === undefined ? \"\" : ` \u00B7 ${options.detailsHint}`;\n lines.push(copyLine(styleText(` \u2514\u2500 ${preview.kind}${hint}`, options.theme.muted), 5, 5 + preview.kind.length));\n }\n } else if (preview?.status === \"unavailable\") {\n lines.push(copyLine(styleText(\n ` Diff unavailable: ${sanitizeTerminalText(preview.reason)}`,\n options.theme.warning,\n ), 2));\n }\n if (item.status === \"completed\" && preview === undefined) {\n appendOutput(lines, stringify(item.output), options);\n }\n appendFailure(lines, item, options);\n return lines;\n});\n\nconst genericRenderer = documentRenderer((item, options) => {\n const lines = [header(item, options, inputSummary(item.call.input))];\n appendProgress(lines, item, options);\n const output = item.streamedOutput !== \"\"\n ? item.streamedOutput\n : item.status === \"completed\"\n ? stringify(item.output)\n : \"\";\n if (output !== \"\") appendOutput(lines, output, options);\n appendFailure(lines, item, options);\n return lines;\n});\n\nfunction documentRenderer(\n renderDocument: (item: ToolTranscriptItem, options: ToolTranscriptRenderOptions) => readonly TextDocumentLine[],\n): ToolTranscriptRenderer {\n return { renderDocument, render: (item, options) => renderDocument(item, options).map(line => line.value).join(\"\\n\") };\n}\n\nfunction header(\n item: ToolTranscriptItem,\n options: ToolTranscriptRenderOptions,\n detail: string,\n): TextDocumentLine {\n const marker = item.status === \"completed\" ? \"\u2713\" : item.status === \"failed\" ? \"\u2717\" : \"\u25CF\";\n const markerStyle = item.status === \"completed\"\n ? options.theme.toolSuccess\n : item.status === \"failed\"\n ? options.theme.toolError\n : options.theme.toolPending;\n const safeDetail = sanitizeTerminalText(detail).replace(/\\s+/gu, \" \").trim();\n const selection = options.selected === true\n ? styleText(\"\u25B8\", options.theme.accent)\n : \" \";\n return copyLine(`${selection} ${styleText(marker, markerStyle)} ` +\n `${styleText(sanitizeTerminalText(item.call.name), options.theme.toolTitle)}` +\n `${safeDetail === \"\" ? \"\" : ` ${safeDetail}`}`, 4);\n}\n\nfunction appendProgress(\n lines: TextDocumentLine[],\n item: ToolTranscriptItem,\n options: ToolTranscriptRenderOptions,\n): void {\n for (const progress of item.progress.slice(options.expanded ? 0 : -2)) {\n lines.push(copyLine(styleText(` \u21B3 ${sanitizeTerminalText(progress)}`, options.theme.muted), 4));\n }\n}\n\nfunction appendOutput(\n lines: TextDocumentLine[],\n value: string,\n options: ToolTranscriptRenderOptions,\n outputStyle = options.theme.toolOutput,\n forceExpanded = false,\n numberFrom?: number,\n): void {\n const safe = sanitizeTerminalText(value).replace(/\\s+$/gu, \"\");\n if (safe === \"\") return;\n const maximumLines = options.expanded || forceExpanded ? Number.POSITIVE_INFINITY : 4;\n const limitedCharacters = truncateCharacters(safe, options.maximumOutputCharacters);\n const allLines = limitedCharacters.split(\"\\n\");\n const displayed = allLines.slice(0, maximumLines);\n const numberWidth = String((numberFrom ?? 1) + allLines.length - 1).length;\n for (const [index, line] of displayed.entries()) {\n const label = numberFrom === undefined ? \"\" : `${String(numberFrom + index).padStart(numberWidth)} \u2502 `;\n lines.push(copyLine(`${styleText(\" \u2502\", options.theme.border)} ${styleText(label + line, outputStyle)}`, 4 + label.length));\n }\n const omittedLines = allLines.length - displayed.length;\n if (omittedLines > 0) {\n const hint = options.detailsHint === undefined ? \"\" : ` \u00B7 ${options.detailsHint}`;\n lines.push({ value: styleText(` \u2026 ${omittedLines} more lines${hint}`, options.theme.muted) });\n } else if (limitedCharacters.endsWith(\"\u2026\") && safe !== limitedCharacters) {\n lines.push({ value: styleText(\" \u2026 output truncated\", options.theme.muted) });\n }\n}\n\nfunction appendFailure(\n lines: TextDocumentLine[],\n item: ToolTranscriptItem,\n options: ToolTranscriptRenderOptions,\n): void {\n if (item.status === \"failed\" && item.error !== undefined) {\n lines.push(copyLine(styleText(` ${sanitizeTerminalText(item.error)}`, options.theme.error), 2));\n }\n}\n\nexport function renderDiff(diff: string, theme: TuiTheme): TextDocumentLine[] {\n return sanitizeTerminalText(diff).split(\"\\n\").map((line) => {\n const style = line.startsWith(\"+++\") || line.startsWith(\"---\") || line.startsWith(\"@@\")\n ? theme.muted\n : line.startsWith(\"+\")\n ? theme.diffAdded\n : line.startsWith(\"-\")\n ? theme.diffRemoved\n : theme.diffContext;\n return copyLine(`${styleText(\" \u2502\", theme.border)} ${styleText(line, style)}`, 4);\n });\n}\n\nfunction copyLine(value: string, start = 0, end = stripVTControlCharacters(value).length): TextDocumentLine {\n return { value, copy: { start, end } };\n}\n\nfunction inputSummary(input: unknown): string {\n if (input === undefined) return \"\";\n const value = stringify(input).replace(/\\s+/gu, \" \");\n return value === \"{}\" ? \"\" : truncateCharacters(value, 160);\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null\n ? value as Record<string, unknown>\n : undefined;\n}\n\nfunction stringField(value: unknown, name: string): string | undefined {\n const object = objectValue(value);\n return typeof object?.[name] === \"string\" ? object[name] : undefined;\n}\n\nfunction numberField(value: unknown, name: string): number | undefined {\n const object = objectValue(value);\n return typeof object?.[name] === \"number\" ? object[name] : undefined;\n}\n\nfunction primitiveField(\n value: unknown,\n name: string,\n): string | number | boolean | null | undefined {\n const object = objectValue(value);\n const field = object?.[name];\n return field === null || [\"string\", \"number\", \"boolean\"].includes(typeof field)\n ? field as string | number | boolean | null\n : undefined;\n}\n\nfunction truncateCharacters(value: string, maximum: number): string {\n return value.length <= maximum\n ? value\n : `${value.slice(0, Math.max(0, maximum - 1)).replace(/[\\uD800-\\uDBFF]$/u, \"\")}\u2026`;\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\n\nexport type ListNavigationAction =\n | \"up\"\n | \"down\"\n | \"page-up\"\n | \"page-down\"\n | \"home\"\n | \"end\";\n\nexport interface ListSelectionOptions<Item> {\n readonly initialIndex?: number;\n readonly pageSize?: number;\n readonly filter?: (item: Item, normalizedQuery: string) => boolean;\n}\n\n/** Reusable selection and search state for retained or line-oriented pickers. */\nexport class ListSelectionModel<Item> {\n private source: Item[];\n private readonly pageSize: number;\n private readonly filter: ((item: Item, normalizedQuery: string) => boolean) | undefined;\n private queryValue = \"\";\n private index: number;\n\n constructor(items: readonly Item[], options: ListSelectionOptions<Item> = {}) {\n this.source = [...items];\n this.pageSize = positiveInteger(options.pageSize ?? 10, \"pageSize\");\n this.filter = options.filter;\n this.index = clampListIndex(options.initialIndex ?? 0, this.items.length);\n }\n\n get query(): string {\n return this.queryValue;\n }\n\n get items(): readonly Item[] {\n const normalized = this.queryValue.trim().toLowerCase();\n return normalized === \"\" || this.filter === undefined\n ? this.source\n : this.source.filter((item) => this.filter!(item, normalized));\n }\n\n get selectedIndex(): number {\n return this.index;\n }\n\n get selected(): Item | undefined {\n return this.items[this.index];\n }\n\n setItems(items: readonly Item[]): void {\n this.source = [...items];\n this.index = clampListIndex(this.index, this.items.length);\n }\n\n setQuery(query: string): void {\n this.queryValue = query;\n this.index = 0;\n }\n\n appendQuery(text: string): void {\n if (text === \"\") return;\n this.setQuery(this.queryValue + text);\n }\n\n backspaceQuery(): void {\n this.setQuery(removeLastCodePoint(this.queryValue));\n }\n\n clearQuery(): void {\n this.setQuery(\"\");\n }\n\n move(action: ListNavigationAction): void {\n const count = this.items.length;\n if (count === 0) {\n this.index = 0;\n return;\n }\n switch (action) {\n case \"up\":\n this.index = this.index === 0 ? count - 1 : this.index - 1;\n break;\n case \"down\":\n this.index = this.index === count - 1 ? 0 : this.index + 1;\n break;\n case \"page-up\":\n this.index = Math.max(0, this.index - this.pageSize);\n break;\n case \"page-down\":\n this.index = Math.min(count - 1, this.index + this.pageSize);\n break;\n case \"home\":\n this.index = 0;\n break;\n case \"end\":\n this.index = count - 1;\n break;\n }\n }\n}\n\nexport function resolveListInput<Item>(\n items: readonly Item[],\n input: string,\n value: (item: Item) => string,\n): Item | undefined {\n const numeric = Number(input);\n return Number.isSafeInteger(numeric) && numeric > 0\n ? items[numeric - 1]\n : items.find((item) => value(item) === input);\n}\n\nexport function printableKeyText(stroke: KeyStroke): string | undefined {\n if (stroke.ctrl || stroke.alt || stroke.meta) return undefined;\n return stroke.text !== undefined && stroke.text.length > 0\n ? stroke.text\n : undefined;\n}\n\nexport function clampListIndex(index: number, count: number): number {\n return count === 0 ? 0 : Math.min(Math.max(index, 0), count - 1);\n}\n\nexport function removeLastCodePoint(value: string): string {\n return [...value].slice(0, -1).join(\"\");\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new RangeError(`${name} must be a positive safe integer`);\n }\n return value;\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport type { InteractiveComponent, RenderResult, RenderSize } from \"./component.js\";\nimport { renderDiff } from \"./agent/tool-renderers.js\";\nimport { ListSelectionModel, printableKeyText, removeLastCodePoint } from \"./list-selection.js\";\nimport { Text, sanitizeTerminalText } from \"./text.js\";\nimport { DEFAULT_DARK_THEME, styleText, type TuiTheme } from \"./theme.js\";\n\nexport interface WorkspaceDiffFile {\n readonly path: string;\n readonly status: string;\n readonly binary: boolean;\n readonly additions: number;\n readonly deletions: number;\n readonly patch: string;\n}\nexport interface WorkspaceDiff {\n readonly runId?: string;\n readonly restorePreviewId?: string;\n readonly title: string;\n readonly from?: string;\n readonly to?: string;\n readonly uncommitted: boolean;\n readonly files: readonly WorkspaceDiffFile[];\n}\n\n/** \u6587\u4EF6\u5217\u8868\u4E0E unified diff \u4F7F\u7528\u76F8\u540C\u7684\u5DE5\u5177\u53D8\u5316\u989C\u8272\uFF0C\u4FDD\u7559\u952E\u76D8\u6EDA\u52A8\u548C\u641C\u7D22\u3002 */\nexport class WorkspaceDiffViewer implements InteractiveComponent {\n private readonly selection: ListSelectionModel<WorkspaceDiffFile>;\n private mode: \"files\" | \"patch\" | \"search\" = \"files\";\n private offset = 0;\n private pageSize = 10;\n private query = \"\";\n private notice = \"\";\n private pending: Promise<void> = Promise.resolve();\n private busy = false;\n constructor(private diff: WorkspaceDiff, private readonly options: { readonly theme?: TuiTheme; readonly onClose: () => void; readonly onRestore?: (path: string) => Promise<WorkspaceDiff>; readonly onApply?: (previewId: string) => Promise<void>; readonly onInvalidate?: () => void }) {\n this.selection = new ListSelectionModel(diff.files, { pageSize: 10 });\n }\n get selectedFile() { return this.selection.selected; }\n get scrollOffset() { return this.offset; }\n waitForPending(): Promise<void> { return this.pending; }\n handleKey(stroke: KeyStroke): boolean {\n if (this.busy) return true;\n if (stroke.ctrl && stroke.key === \"c\") { this.options.onClose(); return true; }\n const commandKey = !stroke.ctrl && !stroke.alt && !stroke.meta;\n if (commandKey && this.mode !== \"search\" && this.diff.restorePreviewId && stroke.key === \"y\" && this.options.onApply) {\n this.perform(async () => { await this.options.onApply!(this.diff.restorePreviewId!); this.options.onClose(); });\n return true;\n }\n if (commandKey && this.mode !== \"search\" && stroke.key === \"r\" && !this.diff.restorePreviewId && this.selection.selected && this.options.onRestore) {\n const path = this.selection.selected.path;\n this.perform(async () => { this.diff = await this.options.onRestore!(path); this.selection.setItems(this.diff.files); this.selection.move(\"home\"); this.mode = \"patch\"; this.offset = 0; this.query = \"\"; });\n return true;\n }\n if (this.mode === \"search\") {\n if (stroke.key === \"escape\") { this.mode = \"patch\"; this.query = \"\"; }\n else if (stroke.key === \"enter\") { this.mode = \"patch\"; this.find(false); }\n else if (stroke.key === \"backspace\") this.query = removeLastCodePoint(this.query);\n else if (stroke.ctrl && stroke.key === \"u\") this.query = \"\";\n else { const text = printableKeyText(stroke); if (text) this.query += text; }\n return true;\n }\n if (stroke.key === \"escape\") { if (this.mode === \"patch\") { this.mode = \"files\"; this.offset = 0; } else this.options.onClose(); return true; }\n if (this.mode === \"files\") {\n const action = navigation(stroke.key);\n if (action) this.selection.move(action);\n if (stroke.key === \"enter\" && this.selection.selected) { this.mode = \"patch\"; this.offset = 0; this.query = \"\"; }\n return true;\n }\n const file = this.selection.selected;\n const lines = file?.patch.split(\"\\n\") ?? [];\n const maximum = Math.max(0, lines.length - this.pageSize);\n if (stroke.key === \"up\") this.offset = Math.max(0, this.offset - 1);\n else if (stroke.key === \"down\") this.offset = Math.min(maximum, this.offset + 1);\n else if (stroke.key === \"pageup\") this.offset = Math.max(0, this.offset - this.pageSize);\n else if (stroke.key === \"pagedown\") this.offset = Math.min(maximum, this.offset + this.pageSize);\n else if (stroke.key === \"home\") this.offset = 0;\n else if (stroke.key === \"end\") this.offset = maximum;\n else if (stroke.key === \"/\" || stroke.text === \"/\") this.mode = \"search\";\n else if (stroke.key === \"n\") this.find(true);\n else if (stroke.key === \"]\" || stroke.text === \"]\") {\n const changes = lines.flatMap((line, index) => line.startsWith(\"@@\") ? [index] : []);\n this.offset = changes.find(index => index > this.offset) ?? changes[0] ?? this.offset;\n }\n return true;\n }\n render(size: RenderSize): RenderResult {\n const theme = this.options.theme ?? DEFAULT_DARK_THEME;\n this.pageSize = Math.max(1, size.height - 5);\n const totals = this.diff.files.reduce((value, file) => ({ additions: value.additions + file.additions, deletions: value.deletions + file.deletions }), { additions: 0, deletions: 0 });\n const header = [sanitizeTerminalText(this.diff.title), `${this.diff.from?.slice(0, 12) ?? \"\u521D\u59CB\u7248\u672C\"} \u2192 ${this.diff.uncommitted ? \"\u5F53\u524D\u672A\u63D0\u4EA4\u53D8\u5316\" : this.diff.to?.slice(0, 12) ?? \"\u76EE\u6807\u7248\u672C\"} \u00B7 ${this.diff.files.length} \u4E2A\u6587\u4EF6 \u00B7 +${totals.additions} -${totals.deletions}`, \"\"];\n let body: string[];\n if (this.mode === \"files\") {\n const start = Math.floor(this.selection.selectedIndex / this.pageSize) * this.pageSize;\n body = this.diff.files.slice(start, start + this.pageSize).map((file, index) => styleText(`${start + index === this.selection.selectedIndex ? \"\u25B8\" : \" \"} ${sanitizeTerminalText(file.path)} \u00B7 ${file.status} \u00B7 ${file.binary ? \"\u4E8C\u8FDB\u5236\u6587\u4EF6\" : `+${file.additions} -${file.deletions}`}`, start + index === this.selection.selectedIndex ? theme.accent : theme.text));\n if (!body.length) body.push(\"\u6CA1\u6709\u6587\u4EF6\u53D8\u5316\u3002\");\n } else {\n const file = this.selection.selected;\n body = file?.binary ? [\"\u4E8C\u8FDB\u5236\u6587\u4EF6\u65E0\u6CD5\u663E\u793A\u6587\u672C diff\u3002\"] : renderDiff(file?.patch ?? \"\", theme).slice(this.offset, this.offset + this.pageSize).map(line => line.value);\n header[2] = `${sanitizeTerminalText(file?.path ?? \"\")} \u00B7 \u7B2C ${this.offset + 1} \u884C`;\n }\n const footer = this.diff.restorePreviewId ? \"\u6062\u590D\u9884\u89C8 \u00B7 Y \u786E\u8BA4\u6062\u590D\u6587\u4EF6 \u00B7 Esc \u8FD4\u56DE\u6216\u53D6\u6D88\" : this.mode === \"files\" ? `\u2191\u2193 \u9009\u62E9\u6587\u4EF6 \u00B7 Enter \u67E5\u770B diff${this.options.onRestore ? \" \u00B7 R \u9884\u89C8\u6062\u590D\" : \"\"} \u00B7 Esc \u5173\u95ED` : this.mode === \"search\" ? `\u641C\u7D22\uFF1A${sanitizeTerminalText(this.query)} \u00B7 Enter \u67E5\u627E \u00B7 Esc \u53D6\u6D88` : `\u2191\u2193 \u6EDA\u52A8 \u00B7 PgUp/PgDn \u7FFB\u9875 \u00B7 / \u641C\u7D22 \u00B7 N \u4E0B\u4E00\u5904\u5339\u914D \u00B7 ] \u4E0B\u4E00\u5904\u4FEE\u6539${this.options.onRestore ? \" \u00B7 R \u9884\u89C8\u6062\u590D\" : \"\"} \u00B7 Esc \u6587\u4EF6\u5217\u8868`;\n return new Text([...header, ...body, footer, this.busy ? \"\u6B63\u5728\u5904\u7406\u6587\u4EF6\u7248\u672C\u2026\" : sanitizeTerminalText(this.notice)].join(\"\\n\"), { wrap: false }).render(size);\n }\n private find(next: boolean) {\n if (!this.query) return;\n const lines = this.selection.selected?.patch.split(\"\\n\") ?? [];\n const matches = lines.flatMap((line, index) => line.toLocaleLowerCase().includes(this.query.toLocaleLowerCase()) ? [index] : []);\n const target = (next ? matches.find(index => index > this.offset) : undefined) ?? matches[0];\n if (target === undefined) this.notice = \"\u6CA1\u6709\u5339\u914D\u7684\u5185\u5BB9\u3002\";\n else { this.offset = target; this.notice = \"\"; }\n }\n private perform(work: () => Promise<void>) {\n this.busy = true;\n this.pending = work().catch(error => { this.notice = error instanceof Error ? error.message : \"\u6587\u4EF6\u7248\u672C\u64CD\u4F5C\u5931\u8D25\u3002\"; }).finally(() => { this.busy = false; this.options.onInvalidate?.(); });\n this.options.onInvalidate?.();\n }\n}\n\nfunction navigation(key: string): \"up\" | \"down\" | \"page-up\" | \"page-down\" | \"home\" | \"end\" | undefined {\n if (key === \"up\" || key === \"down\" || key === \"home\" || key === \"end\") return key;\n if (key === \"pageup\") return \"page-up\";\n if (key === \"pagedown\") return \"page-down\";\n return undefined;\n}\n\nexport function workspaceGitLabel(workspace: { readonly status: string; readonly branch?: string; readonly detached?: boolean; readonly commit?: string; readonly autoCommit?: boolean; readonly error?: string }): string {\n if (workspace.status === \"error\") return `Git \u9519\u8BEF${workspace.error ? `\uFF1A${sanitizeTerminalText(workspace.error)}` : \"\"}`;\n if (workspace.status === \"initializing\") return \"Git \u5C1A\u672A\u51C6\u5907\";\n const version = workspace.detached ? `detached HEAD \u00B7 ${workspace.commit?.slice(0, 12) ?? \"\u65E0 commit\"}` : workspace.branch ?? \"Git \u5C1A\u65E0 commit\";\n return sanitizeTerminalText(`${version}${workspace.autoCommit === false ? \" \u00B7 \u81EA\u52A8\u63D0\u4EA4\u5173\u95ED\" : \"\"}`);\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport type { TextRow } from \"./text-selection.js\";\n\nexport interface RenderSize {\n readonly width: number;\n readonly height: number;\n}\n\nexport interface CursorPosition {\n /** Zero-based display column. */\n readonly x: number;\n /** Zero-based row within the rendered frame. */\n readonly y: number;\n readonly visible?: boolean;\n}\n\nexport interface RenderResult {\n readonly textRows?: readonly (TextRow | undefined)[];\n readonly images?: readonly ImagePlacement[];\n readonly lines: readonly string[];\n readonly cursor?: CursorPosition;\n}\n\nexport type ImagePlacement = {\n readonly id: string;\n readonly png: string;\n readonly x: number;\n readonly y: number;\n readonly columns: number;\n readonly rows: number;\n} & ({ readonly protocol: \"kitty\" | \"iterm2\" } | { readonly protocol: \"sixel\"; readonly sixel: string });\n\nexport function placeImages(images: readonly ImagePlacement[] | undefined, y: number, height: number): ImagePlacement[] {\n return (images ?? []).map(image => ({ ...image, y: image.y + y })).filter(image => image.y >= 0 && image.y + image.rows <= height);\n}\n\nexport interface Component {\n render(size: RenderSize): RenderResult;\n handlePointer?(event: PointerEvent): boolean;\n dispose?(): void;\n}\n\nexport interface PointerEvent {\n readonly type: \"down\" | \"move\" | \"up\";\n readonly x: number;\n readonly y: number;\n readonly button: number;\n readonly ctrl: boolean;\n readonly alt: boolean;\n readonly shift: boolean;\n}\n\nexport interface KeyHandlingResult {\n readonly consumed: boolean;\n readonly redraw: boolean;\n}\n\nexport interface InteractiveComponent extends Component {\n /** \u8FD4\u56DE\u6309\u952E\u662F\u5426\u5DF2\u5904\u7406\uFF1B\u6CA1\u6709\u6539\u53D8\u5185\u5BB9\u7684\u8FB9\u754C\u64CD\u4F5C\u4E5F\u5E94\u8FD4\u56DE true\u3002 */\n handleKey(stroke: KeyStroke): boolean;\n handleKeyResult?(stroke: KeyStroke): KeyHandlingResult;\n}\n\nexport interface FocusTarget {\n setFocused(focused: boolean): void;\n handleKey(stroke: KeyStroke): boolean;\n}\n\nexport function renderComponent(\n component: Component,\n size: RenderSize,\n): RenderResult {\n assertRenderSize(size);\n return component.render(size);\n}\n\nexport function assertRenderSize(size: RenderSize): void {\n if (!Number.isInteger(size.width) || size.width < 1) {\n throw new RangeError(\"Render width must be a positive integer\");\n }\n if (!Number.isInteger(size.height) || size.height < 1) {\n throw new RangeError(\"Render height must be a positive integer\");\n }\n}\n", "import sliceAnsi from \"slice-ansi\";\nimport stringWidth from \"string-width\";\nimport type { CursorPosition, RenderResult, RenderSize } from \"./component.js\";\nimport { assertRenderSize } from \"./component.js\";\n\nexport class ScreenBuffer {\n readonly width: number;\n readonly height: number;\n readonly lines: readonly string[];\n readonly cursor: CursorPosition | undefined;\n\n private constructor(\n size: RenderSize,\n lines: readonly string[],\n cursor: CursorPosition | undefined,\n ) {\n this.width = size.width;\n this.height = size.height;\n this.lines = lines;\n this.cursor = cursor;\n }\n\n static from(result: RenderResult, size: RenderSize): ScreenBuffer {\n assertRenderSize(size);\n const lines = result.lines\n .slice(0, size.height)\n .map((line) => normalizeLine(line, size.width));\n const cursor = normalizeCursor(result.cursor, size);\n return new ScreenBuffer(size, lines, cursor);\n }\n\n lineAt(row: number): string {\n return this.lines[row] ?? \"\";\n }\n}\n\nfunction normalizeLine(line: string, width: number): string {\n if (line.includes(\"\\n\") || line.includes(\"\\r\")) {\n throw new Error(\"A rendered screen line cannot contain a newline\");\n }\n return stringWidth(line) <= width ? line : sliceAnsi(line, 0, width);\n}\n\nfunction normalizeCursor(\n cursor: CursorPosition | undefined,\n size: RenderSize,\n): CursorPosition | undefined {\n if (cursor === undefined) return undefined;\n const y = clampInteger(cursor.y, 0, Math.max(0, size.height - 1));\n const x = clampInteger(cursor.x, 0, size.width - 1);\n return { x, y, visible: cursor.visible ?? true };\n}\n\nfunction clampInteger(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum;\n return Math.min(maximum, Math.max(minimum, Math.trunc(value)));\n}\n", "import type { RenderResult, RenderSize } from \"./component.js\";\nimport { ScreenBuffer } from \"./screen-buffer.js\";\nimport { encodeImage } from \"./images.js\";\nimport { placeImages, type ImagePlacement } from \"./component.js\";\n\nexport interface TerminalWriter {\n write(value: string): unknown;\n}\n\nexport interface FullscreenRendererOptions {\n /** Hide the terminal cursor when a frame does not declare one. */\n readonly hideCursorByDefault?: boolean;\n}\n\n/**\n * Renders a retained frame at the top-left of the current terminal screen.\n * Callers should normally pair this with an alternate-screen terminal driver.\n */\nexport class FullscreenRenderer {\n private previous: ScreenBuffer | undefined;\n private images: readonly ImagePlacement[] = [];\n private readonly hideCursorByDefault: boolean;\n\n constructor(\n private readonly terminal: TerminalWriter,\n options: FullscreenRendererOptions = {},\n ) {\n this.hideCursorByDefault = options.hideCursorByDefault ?? true;\n }\n\n render(result: RenderResult, size: RenderSize): void {\n const next = ScreenBuffer.from(result, size);\n const previous = this.previous;\n const images = placeImages(result.images, 0, size.height);\n const imagesChanged = images.length !== this.images.length || images.some((image, index) => {\n const old = this.images[index];\n return !old || image.id !== old.id || image.y !== old.y || image.x !== old.x || image.rows !== old.rows || image.columns !== old.columns || image.protocol !== old.protocol || (image.protocol === \"sixel\" && old.protocol === \"sixel\" && image.sixel !== old.sixel);\n });\n const resized = previous !== undefined &&\n (previous.width !== next.width || previous.height !== next.height);\n let output = \"\\x1b[?25l\";\n\n if (previous === undefined || resized || imagesChanged) {\n if (this.images.some(image => image.protocol === \"kitty\")) output += \"\\x1b_Ga=d,d=A,q=2\\x1b\\\\\";\n output += \"\\x1b[2J\";\n }\n\n const rowCount = previous === undefined || resized\n ? next.lines.length\n : Math.max(next.lines.length, previous.lines.length);\n const erasedRows = new Set<number>();\n for (let row = 0; row < rowCount; row++) {\n const line = next.lineAt(row);\n if (!resized && !imagesChanged && previous?.lineAt(row) === line) continue;\n output += moveTo(row, 0);\n output += `\\x1b[2K${line}\\x1b[0m`;\n erasedRows.add(row);\n }\n\n for (const image of images) {\n const erased = image.protocol === \"sixel\" && Array.from({ length: image.rows }, (_, index) => image.y + index).some(row => erasedRows.has(row));\n if (imagesChanged || resized || previous === undefined || erased) output += moveTo(image.y, image.x) + encodeImage(image);\n }\n this.images = images;\n const cursor = next.cursor;\n if (cursor !== undefined) {\n output += moveTo(cursor.y, cursor.x);\n output += cursor.visible === false ? \"\\x1b[?25l\" : \"\\x1b[?25h\";\n } else if (this.hideCursorByDefault) {\n output += \"\\x1b[?25l\";\n } else {\n output += \"\\x1b[?25h\";\n }\n\n this.terminal.write(output);\n this.previous = next;\n }\n\n invalidate(): void {\n this.previous = undefined;\n }\n\n dispose(options: { readonly clear?: boolean } = {}): void {\n this.previous = undefined;\n this.terminal.write(\n `${this.images.some(image => image.protocol === \"kitty\") ? \"\\x1b_Ga=d,d=A,q=2\\x1b\\\\\" : \"\"}${options.clear === true || this.images.length ? \"\\x1b[2J\\x1b[H\" : \"\"}\\x1b[0m\\x1b[?25h`,\n );\n this.images = [];\n }\n}\n\nfunction moveTo(row: number, column: number): string {\n return `\\x1b[${row + 1};${column + 1}H`;\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport type {\n InteractiveComponent,\n PointerEvent,\n RenderResult,\n RenderSize,\n} from \"./component.js\";\nimport type { TerminalWriter } from \"./renderer.js\";\nimport type { TerminalImageSupport } from \"./image-support.js\";\n\nexport interface RuntimeTerminal extends TerminalWriter {\n readonly imageSupport?: TerminalImageSupport;\n readonly size: RenderSize;\n start(): void;\n close(): void;\n enterAlternateScreen?(): void;\n onKey(listener: (stroke: KeyStroke) => void): () => void;\n onPointer?(listener: (event: PointerEvent) => void): () => void;\n onResize(listener: (size: RenderSize) => void): () => void;\n}\n\nexport interface RuntimeRenderer {\n render(result: RenderResult, size: RenderSize): void;\n invalidate(): void;\n dispose(options?: { readonly clear?: boolean }): void;\n}\n\nexport interface TuiRuntimeOptions {\n readonly terminal: RuntimeTerminal;\n readonly renderer: RuntimeRenderer;\n readonly root: InteractiveComponent;\n readonly alternateScreen?: boolean;\n readonly onError?: (error: unknown) => void;\n}\n\n/** Owns terminal lifecycle, key dispatch, resize handling, and render batching. */\nexport class TuiRuntime {\n private readonly terminal: RuntimeTerminal;\n private readonly renderer: RuntimeRenderer;\n private root: InteractiveComponent;\n private readonly alternateScreen: boolean;\n private readonly onError: (error: unknown) => void;\n private disposeKey: (() => void) | undefined;\n private disposeResize: (() => void) | undefined;\n private disposePointer: (() => void) | undefined;\n private scheduled = false;\n private running = false;\n private disposed = false;\n\n constructor(options: TuiRuntimeOptions) {\n this.terminal = options.terminal;\n this.renderer = options.renderer;\n this.root = options.root;\n this.alternateScreen = options.alternateScreen ?? true;\n this.onError = options.onError ?? ((error) => {\n queueMicrotask(() => { throw error; });\n });\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n\n start(): void {\n this.assertActive();\n if (this.running) return;\n let terminalStarted = false;\n try {\n this.terminal.start();\n terminalStarted = true;\n if (this.alternateScreen) this.terminal.enterAlternateScreen?.();\n this.disposeKey = this.terminal.onKey(this.handleKey);\n this.disposeResize = this.terminal.onResize(this.handleResize);\n this.disposePointer = this.terminal.onPointer?.(this.handlePointer);\n this.running = true;\n this.renderNow();\n } catch (error) {\n this.release(terminalStarted);\n throw error;\n }\n }\n\n setRoot(root: InteractiveComponent): void {\n this.assertActive();\n if (this.root === root) return;\n this.root.dispose?.();\n this.root = root;\n this.renderer.invalidate();\n this.requestRender();\n }\n\n requestRender(): void {\n if (!this.running || this.scheduled) return;\n this.scheduled = true;\n queueMicrotask(() => {\n this.scheduled = false;\n if (this.running) this.safeRender();\n });\n }\n\n renderNow(): void {\n if (!this.running) return;\n this.renderer.render(this.root.render(this.terminal.size), this.terminal.size);\n }\n\n stop(): void {\n if (this.disposed) return;\n this.release(this.running);\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error(\"TuiRuntime has stopped. Create a new runtime and root component to start again.\");\n }\n\n private release(terminalStarted: boolean): void {\n this.disposed = true;\n this.running = false;\n this.scheduled = false;\n this.disposeKey?.();\n this.disposeResize?.();\n this.disposePointer?.();\n this.disposeKey = undefined;\n this.disposeResize = undefined;\n this.disposePointer = undefined;\n try {\n this.root.dispose?.();\n } finally {\n try {\n if (terminalStarted) this.renderer.dispose();\n } finally { this.terminal.close(); }\n }\n }\n\n private readonly handleKey = (stroke: KeyStroke): void => {\n try {\n const redraw = this.root.handleKeyResult\n ? this.root.handleKeyResult(stroke).redraw\n : this.root.handleKey(stroke);\n if (redraw) this.requestRender();\n } catch (error) {\n this.fail(error);\n }\n };\n\n private readonly handlePointer = (event: PointerEvent): void => {\n try {\n if (this.root.handlePointer?.(event)) this.requestRender();\n } catch (error) {\n this.fail(error);\n }\n };\n\n private readonly handleResize = (): void => {\n this.renderer.invalidate();\n this.requestRender();\n };\n\n private safeRender(): void {\n try {\n this.renderNow();\n } catch (error) {\n this.fail(error);\n }\n }\n\n private fail(error: unknown): void {\n this.stop();\n this.onError(error);\n }\n}\n", "import { emitKeypressEvents } from \"node:readline\";\nimport { PassThrough, type Writable } from \"node:stream\";\nimport TerminalEvents from \"tty-events\";\nimport { keyStroke, type KeyStroke } from \"@sortedyuan/keybindings\";\nimport type { PointerEvent, RenderSize } from \"./component.js\";\nimport type { TerminalWriter } from \"./renderer.js\";\nimport { TerminalImageSupport } from \"./image-support.js\";\n\nexport interface TerminalInput extends NodeJS.ReadableStream {\n readonly isTTY?: boolean;\n readonly isRaw?: boolean;\n setRawMode?(enabled: boolean): this;\n ref?(): this;\n unref?(): this;\n}\n\nexport interface TerminalOutput extends NodeJS.WritableStream {\n readonly isTTY?: boolean;\n readonly columns?: number;\n readonly rows?: number;\n}\n\nexport interface NodeTerminalDriverOptions {\n readonly input?: TerminalInput;\n readonly output?: TerminalOutput;\n readonly requireTTY?: boolean;\n}\n\ntype KeyListener = (stroke: KeyStroke) => void;\ntype ResizeListener = (size: RenderSize) => void;\ntype PointerListener = (event: PointerEvent) => void;\n\nconst BRACKETED_PASTE_START = Buffer.from(\"\\x1b[200~\");\nconst BRACKETED_PASTE_END = Buffer.from(\"\\x1b[201~\");\nconst ESCAPE_PREFIX_TIMEOUT_MS = 25;\n\nexport class NodeTerminalDriver implements TerminalWriter {\n readonly imageSupport: TerminalImageSupport;\n private readonly input: TerminalInput;\n private readonly output: TerminalOutput;\n private readonly requireTTY: boolean;\n private readonly decodedInput = new PassThrough();\n private readonly pointerInput = new PassThrough();\n private pointerDecoder: TerminalEvents | undefined;\n private readonly inputDecoder = new BracketedPasteDecoder(\n (value) => this.pointerInput.write(value),\n (value) => this.emitPaste(value),\n );\n private readonly keyListeners = new Set<KeyListener>();\n private readonly resizeListeners = new Set<ResizeListener>();\n private readonly pointerListeners = new Set<PointerListener>();\n private started = false;\n private alternateScreen = false;\n private previousRawMode = false;\n private inputWasPaused = true;\n private keypressInitialized = false;\n private bracketedPaste = false;\n\n constructor(options: NodeTerminalDriverOptions = {}) {\n this.input = options.input ?? process.stdin;\n this.output = options.output ?? process.stdout;\n this.requireTTY = options.requireTTY ?? true;\n this.imageSupport = new TerminalImageSupport(this.output);\n this.imageSupport.onChange(() => {\n for (const listener of this.resizeListeners) listener(this.size);\n });\n }\n\n get size(): RenderSize {\n return {\n width: Math.max(1, this.output.columns ?? 80),\n height: Math.max(1, this.output.rows ?? 24),\n };\n }\n\n start(): void {\n if (this.started) return;\n if (this.requireTTY &&\n (this.input.isTTY !== true || this.output.isTTY !== true)) {\n throw new Error(\"The TUI requires an interactive terminal\");\n }\n this.previousRawMode = this.input.isRaw === true;\n this.inputWasPaused = this.input.isPaused();\n if (!this.keypressInitialized) {\n emitKeypressEvents(this.decodedInput, { escapeCodeTimeout: 30 } as unknown as Parameters<typeof emitKeypressEvents>[1]);\n this.keypressInitialized = true;\n }\n this.inputDecoder.reset();\n this.decodedInput.on(\"keypress\", this.handleKeypress);\n this.pointerDecoder = new TerminalEvents(this.pointerInput, this.output as Writable, { timeout: 30 });\n this.pointerDecoder.on(\"keypress\", (key) => this.decodedInput.write(key.sequence));\n this.pointerDecoder.on(\"unknownSequence\", (sequence) => {\n if (!this.imageSupport.consume(sequence)) this.decodedInput.write(sequence);\n });\n this.pointerDecoder.on(\"wheel\", (event) => {\n if (!this.alternateScreen) return;\n const stroke = keyStroke(event.direction === -1 ? \"wheelup\" : \"wheeldown\", {\n ctrl: event.ctrl,\n alt: event.alt,\n shift: event.shift,\n });\n for (const listener of this.keyListeners) listener(stroke);\n });\n this.pointerDecoder.on(\"mousedown\", (event) => this.emitPointer(\"down\", event));\n this.pointerDecoder.on(\"mousemove\", (event) => this.emitPointer(\"move\", event));\n this.pointerDecoder.on(\"mouseup\", (event) => this.emitPointer(\"up\", event));\n this.input.on(\"data\", this.handleData);\n this.output.on(\"resize\", this.handleResize);\n this.input.ref?.();\n this.input.setRawMode?.(true);\n this.input.resume();\n this.write(\"\\x1b[?2004h\");\n this.bracketedPaste = true;\n this.started = true;\n this.imageSupport.query();\n }\n\n enterAlternateScreen(): void {\n if (this.alternateScreen) return;\n this.write(\"\\x1b[?1049h\\x1b[2J\\x1b[H\\x1b[?1000h\\x1b[?1002h\\x1b[?1006h\");\n this.alternateScreen = true;\n }\n\n leaveAlternateScreen(): void {\n if (!this.alternateScreen) return;\n this.write(\"\\x1b[?1002l\\x1b[?1000l\\x1b[?1006l\\x1b[0m\\x1b[?25h\\x1b[?1049l\");\n this.alternateScreen = false;\n }\n\n onKey(listener: KeyListener): () => void {\n this.keyListeners.add(listener);\n return () => this.keyListeners.delete(listener);\n }\n\n onResize(listener: ResizeListener): () => void {\n this.resizeListeners.add(listener);\n return () => this.resizeListeners.delete(listener);\n }\n\n onPointer(listener: PointerListener): () => void {\n this.pointerListeners.add(listener);\n return () => this.pointerListeners.delete(listener);\n }\n\n write(value: string): void {\n this.output.write(value);\n }\n\n close(): void {\n if (this.bracketedPaste) {\n this.write(\"\\x1b[?2004l\");\n this.bracketedPaste = false;\n }\n if (this.alternateScreen) this.leaveAlternateScreen();\n if (!this.started) return;\n this.inputDecoder.reset();\n this.pointerDecoder?.pause();\n this.pointerDecoder?.removeAllListeners();\n this.pointerDecoder = undefined;\n this.input.removeListener(\"data\", this.handleData);\n this.decodedInput.removeListener(\"keypress\", this.handleKeypress);\n this.output.removeListener(\"resize\", this.handleResize);\n this.input.setRawMode?.(this.previousRawMode);\n if (this.inputWasPaused) this.input.pause();\n this.input.unref?.();\n this.started = false;\n }\n\n private readonly handleKeypress = (\n value: string | undefined,\n key: NodeKey = {},\n ): void => {\n const stroke = toKeyStroke(value, key);\n for (const listener of this.keyListeners) listener(stroke);\n };\n\n private readonly handleData = (value: Buffer | string): void => {\n this.inputDecoder.push(value);\n };\n\n private readonly handleResize = (): void => {\n this.imageSupport.query();\n const size = this.size;\n for (const listener of this.resizeListeners) listener(size);\n };\n\n private emitPaste(value: string): void {\n if (value === \"\") return;\n const stroke = keyStroke(\"paste\", { text: value });\n for (const listener of this.keyListeners) listener(stroke);\n }\n\n private emitPointer(type: PointerEvent[\"type\"], event: TerminalEvents.MouseEvent): void {\n if (!this.alternateScreen) return;\n const pointer: PointerEvent = {\n type,\n x: event.x - 1,\n y: event.y - 1,\n button: event.button === undefined ? -1 : event.button - 1,\n ctrl: event.ctrl,\n alt: event.alt,\n shift: event.shift,\n };\n for (const listener of this.pointerListeners) listener(pointer);\n }\n}\n\ninterface NodeKey {\n readonly name?: string;\n readonly ctrl?: boolean;\n readonly meta?: boolean;\n readonly shift?: boolean;\n}\n\nfunction toKeyStroke(value: string | undefined, key: NodeKey): KeyStroke {\n if (value === \"\\n\") return keyStroke(\"j\", { ctrl: true });\n const name = key.name ?? value ?? \"unknown\";\n const printable = value !== undefined && value.length > 0 &&\n key.ctrl !== true && key.meta !== true;\n return keyStroke(name, {\n ctrl: key.ctrl === true,\n alt: key.meta === true && name !== \"escape\",\n shift: key.shift === true,\n ...(printable ? { text: value } : {}),\n });\n}\n\nclass BracketedPasteDecoder {\n private pending = Buffer.alloc(0);\n private paste = false;\n private prefixTimer: NodeJS.Timeout | undefined;\n\n constructor(\n private readonly onInput: (value: Buffer) => void,\n private readonly onPaste: (value: string) => void,\n ) {}\n\n push(value: Buffer | string): void {\n this.clearPrefixTimer();\n const incoming = Buffer.from(value);\n this.pending = this.pending.length === 0\n ? incoming\n : Buffer.concat([this.pending, incoming]);\n this.process();\n }\n\n reset(): void {\n this.clearPrefixTimer();\n this.pending = Buffer.alloc(0);\n this.paste = false;\n }\n\n private process(): void {\n while (this.pending.length > 0) {\n const marker = this.paste\n ? BRACKETED_PASTE_END\n : BRACKETED_PASTE_START;\n const markerIndex = this.pending.indexOf(marker);\n if (markerIndex >= 0) {\n this.emit(this.pending.subarray(0, markerIndex));\n this.pending = this.pending.subarray(markerIndex + marker.length);\n this.paste = !this.paste;\n continue;\n }\n\n if (this.paste) return;\n const retained = markerPrefixLength(this.pending, marker);\n const inputEnd = this.pending.length - retained;\n if (inputEnd > 0) this.onInput(this.pending.subarray(0, inputEnd));\n this.pending = this.pending.subarray(inputEnd);\n if (this.pending.length > 0) this.schedulePrefixFlush();\n return;\n }\n }\n\n private emit(value: Buffer): void {\n if (value.length === 0) return;\n if (this.paste) this.onPaste(value.toString(\"utf8\"));\n else this.onInput(value);\n }\n\n private schedulePrefixFlush(): void {\n this.prefixTimer = setTimeout(() => {\n this.prefixTimer = undefined;\n const pending = this.pending;\n this.pending = Buffer.alloc(0);\n if (pending.length > 0) this.onInput(pending);\n }, ESCAPE_PREFIX_TIMEOUT_MS);\n this.prefixTimer.unref?.();\n }\n\n private clearPrefixTimer(): void {\n if (this.prefixTimer !== undefined) clearTimeout(this.prefixTimer);\n this.prefixTimer = undefined;\n }\n}\n\nfunction markerPrefixLength(value: Buffer, marker: Buffer): number {\n const maximum = Math.min(value.length, marker.length - 1);\n for (let length = maximum; length > 0; length--) {\n if (value.subarray(value.length - length).equals(marker.subarray(0, length))) {\n return length;\n }\n }\n return 0;\n}\n", "import type {\n AssistantMessage,\n ContentPart,\n MayEvent,\n ToolCall,\n UserMessage,\n} from \"@sortedyuan/core\";\nimport type {\n ApprovalDecision,\n ApprovalRequest,\n PermissionEvent,\n} from \"@sortedyuan/permissions\";\nimport type { SessionEvent } from \"@sortedyuan/session\";\nimport {\n decodeToolChangePreviewPresentation,\n type ToolChangePreview,\n} from \"@sortedyuan/coding-tools/change-preview\";\n\nexport type TranscriptItem =\n | UserTranscriptItem\n | AssistantTranscriptItem\n | ToolTranscriptItem\n | ApprovalTranscriptItem\n | NoticeTranscriptItem;\n\nexport interface UserTranscriptItem {\n readonly id: string;\n readonly kind: \"user\";\n readonly text: string;\n readonly timestamp: number;\n}\n\nexport interface AssistantTranscriptItem {\n readonly content?: readonly ContentPart[];\n readonly id: string;\n readonly kind: \"assistant\";\n readonly runId: string;\n readonly step: number;\n readonly text: string;\n readonly reasoning: string;\n readonly status: \"streaming\" | \"completed\";\n readonly timestamp: number;\n}\n\nexport interface ToolTranscriptItem {\n readonly content?: readonly ContentPart[];\n readonly id: string;\n readonly kind: \"tool\";\n readonly runId: string;\n readonly step: number;\n readonly call: ToolCall;\n readonly status: \"running\" | \"completed\" | \"failed\";\n readonly streamedOutput: string;\n readonly progress: readonly string[];\n readonly output?: unknown;\n readonly error?: string;\n readonly preview?: ToolChangePreview;\n readonly timestamp: number;\n}\n\nexport interface ApprovalTranscriptItem {\n readonly id: string;\n readonly kind: \"approval\";\n readonly requestId: string;\n readonly toolName: string;\n readonly input: unknown;\n readonly status: \"pending\" | \"resolved\" | \"cancelled\";\n readonly decision?: ApprovalDecision;\n readonly scopeDescription?: string;\n readonly scopeId?: string;\n readonly reason?: string;\n readonly timestamp: number;\n}\n\nexport interface NoticeTranscriptItem {\n readonly id: string;\n readonly kind: \"notice\";\n readonly level: \"info\" | \"warning\" | \"error\";\n readonly text: string;\n readonly timestamp: number;\n}\n\nexport type TranscriptListener = (store: TranscriptStore) => void;\n\n/**\n * Mutable terminal projection of durable session history and live May events.\n *\n * Product-specific events stay outside this package: applications can reset the\n * projection and append notices or coding change previews through the explicit\n * methods below.\n */\nexport class TranscriptStore {\n private values: TranscriptItem[] = [];\n private readonly listeners = new Set<TranscriptListener>();\n private localSequence = 0;\n private currentSessionId: string | undefined;\n private latestReplyId: string | undefined;\n private readonly steeringInputs = new Map<string, UserMessage>();\n\n /** \u5F53\u524D\u8F6E\u6B21\u5B8C\u6210\u540E\u53EF\u4F9B\u9605\u8BFB\u7684\u6700\u7EC8\u6B63\u6587\u3002 */\n get latestReply(): AssistantTranscriptItem | undefined {\n const item = this.values.find((item) => item.id === this.latestReplyId);\n return item?.kind === \"assistant\" && (item.text.trim() !== \"\" || item.content?.some(part => part.type === \"image\")) ? item : undefined;\n }\n\n get items(): readonly TranscriptItem[] {\n return this.values;\n }\n\n get sessionId(): string | undefined {\n return this.currentSessionId;\n }\n\n subscribe(listener: TranscriptListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n reset(sessionId?: string): void {\n this.values = [];\n this.latestReplyId = undefined;\n this.steeringInputs.clear();\n this.currentSessionId = sessionId;\n this.changed();\n }\n\n appendUser(message: string | UserMessage, timestamp = Date.now()): void {\n this.latestReplyId = undefined;\n const text = typeof message === \"string\"\n ? message\n : contentText(message.content, \"text\");\n this.append({\n id: `user:local:${++this.localSequence}`,\n kind: \"user\",\n text,\n timestamp,\n });\n this.changed();\n }\n\n appendNotice(\n level: NoticeTranscriptItem[\"level\"],\n text: string,\n timestamp = Date.now(),\n ): void {\n this.appendNoticeItem(\n `notice:local:${++this.localSequence}`,\n level,\n text,\n timestamp,\n );\n this.changed();\n }\n\n /** Attach an application-produced coding change preview to a tool call. */\n appendChangePreview(\n runId: string,\n step: number,\n toolCallId: string,\n preview: ToolChangePreview,\n timestamp = Date.now(),\n ): void {\n this.projectChangePreview(runId, step, toolCallId, preview, timestamp);\n this.changed();\n }\n\n loadHistory(events: readonly SessionEvent[]): void {\n this.values = [];\n this.latestReplyId = undefined;\n this.steeringInputs.clear();\n this.currentSessionId = events[0]?.sessionId ?? this.currentSessionId;\n for (const event of events) this.projectSessionEvent(event);\n this.changed();\n }\n\n applyMayEvent(event: MayEvent): void {\n this.projectMayEvent(event);\n this.changed();\n }\n\n applyPermissionEvent(event: PermissionEvent): void {\n this.projectPermissionEvent(event);\n this.changed();\n }\n\n applySessionEvent(event: SessionEvent): void {\n this.currentSessionId = event.sessionId;\n this.projectSessionEvent(event);\n this.changed();\n }\n\n private projectMayEvent(event: MayEvent): void {\n switch (event.type) {\n case \"run.started\":\n this.latestReplyId = undefined;\n break;\n case \"input.received\":\n this.appendSteering(event.runId, event.step, event.messages, event.timestamp);\n break;\n case \"run.completed\":\n this.completeReply(event);\n break;\n case \"model.started\":\n this.ensureAssistant(event);\n break;\n case \"model.text.delta\":\n this.updateAssistant(event, (item) => ({ ...item, text: item.text + event.delta }));\n break;\n case \"model.reasoning.delta\":\n this.updateAssistant(event, (item) => ({\n ...item,\n reasoning: item.reasoning + event.delta,\n }));\n break;\n case \"model.completed\": {\n const completed = assistantContent(event.message);\n this.updateAssistant(event, (item) => ({\n ...item,\n text: completed.text || item.text,\n content: completed.content,\n reasoning: completed.reasoning || item.reasoning,\n status: \"completed\",\n }));\n break;\n }\n case \"model.retrying\":\n this.appendNoticeItem(\n `retry:${event.runId}:${event.seq}`,\n \"warning\",\n `Model request failed: ${event.error.message}; retrying ` +\n `${event.attempt}/${event.maxAttempts}`,\n event.timestamp,\n );\n break;\n case \"tool.started\":\n this.ensureTool(event.runId, event.step, event.call, event.timestamp);\n break;\n case \"tool.output.delta\":\n this.updateTool(event.runId, event.call.id, (item) => ({\n ...item,\n streamedOutput: (item.streamedOutput + event.delta).slice(-65_536).replace(/^[\\uDC00-\\uDFFF]/u, \"\"),\n }), event.step, event.call, event.timestamp);\n break;\n case \"tool.progress\":\n this.updateTool(event.runId, event.call.id, (item) => ({\n ...item,\n progress: [...item.progress.slice(-63), event.message.slice(0, 4096)],\n }), event.step, event.call, event.timestamp);\n break;\n case \"tool.completed\":\n this.updateTool(event.runId, event.call.id, (item) => ({\n ...item,\n status: \"completed\",\n output: event.output,\n content: event.content,\n }), event.step, event.call, event.timestamp);\n break;\n case \"tool.failed\":\n this.updateTool(event.runId, event.call.id, (item) => ({\n ...item,\n status: \"failed\",\n error: event.error.message,\n }), event.step, event.call, event.timestamp);\n break;\n case \"run.failed\":\n this.appendNoticeItem(\n `run:${event.runId}:failed`,\n \"error\",\n `Run failed: ${event.error.message}`,\n event.timestamp,\n );\n break;\n case \"run.cancelled\":\n this.appendNoticeItem(\n `run:${event.runId}:cancelled`,\n \"warning\",\n `Run cancelled${event.reason === undefined ? \"\" : `: ${event.reason}`}`,\n event.timestamp,\n );\n break;\n case \"step.started\":\n case \"step.completed\":\n case \"run.yielded\":\n break;\n }\n }\n\n private projectPermissionEvent(event: PermissionEvent): void {\n if (event.type === \"approval.requested\") {\n this.append(approvalItem(event.request, event.timestamp));\n return;\n }\n if (event.type !== \"approval.resolved\" && event.type !== \"approval.cancelled\") return;\n this.replace(`approval:${event.requestId}`, (item) => {\n if (item.kind !== \"approval\") return item;\n return event.type === \"approval.resolved\"\n ? { ...item, status: \"resolved\", decision: event.decision }\n : {\n ...item,\n status: \"cancelled\",\n ...(event.reason === undefined ? {} : { reason: event.reason }),\n };\n });\n }\n\n private projectChangePreview(\n runId: string,\n step: number,\n toolCallId: string,\n preview: ToolChangePreview,\n timestamp: number,\n ): void {\n const id = toolId(runId, toolCallId);\n if (!this.replace(id, (item) => item.kind === \"tool\" ? { ...item, preview } : item)) {\n this.append({\n id,\n kind: \"tool\",\n runId,\n step,\n call: { id: toolCallId, name: preview.tool, input: { path: preview.path } },\n status: \"running\",\n streamedOutput: \"\",\n progress: [],\n preview,\n timestamp,\n });\n }\n }\n\n private projectSessionEvent(event: SessionEvent): void {\n switch (event.type) {\n case \"run.started\":\n this.latestReplyId = undefined;\n break;\n case \"run.completed\":\n this.completeReply(event);\n break;\n case \"run.interrupted\":\n for (const item of event.recoveries) {\n this.appendHistoryTool(historyTool({ ...event, type: \"tool.failed\", step: item.step, call: item.call,\n error: { name: \"InterruptedToolError\", message: item.status === \"unknown\" ? \"Outcome unknown; inspect /recovery before continuing\" : \"Not executed before interruption\" } }, \"failed\"));\n }\n this.appendNoticeItem(`history:${event.seq}`, \"warning\", \"Run interrupted. Inspect /recovery for unresolved tool outcomes.\", event.timestamp);\n break;\n case \"recovery.resolved\":\n case \"input.submitted\":\n if (event.type === \"input.submitted\" && event.inputId !== undefined) this.steeringInputs.delete(event.inputId);\n this.latestReplyId = undefined;\n this.append({\n id: `history:${event.seq}`,\n kind: \"user\",\n text: contentText(event.message.content, \"text\"),\n timestamp: event.timestamp,\n });\n break;\n case \"input.steering.queued\":\n this.steeringInputs.set(event.input.inputId, event.input.message);\n break;\n case \"input.steering.delivered\": {\n const messages = event.inputIds.map(inputId => {\n const message = this.steeringInputs.get(inputId);\n if (message === undefined) throw new Error(`Missing steering input in transcript history: ${inputId}`);\n this.steeringInputs.delete(inputId);\n return message;\n });\n this.appendSteering(event.runId, event.step, messages, event.timestamp);\n break;\n }\n case \"input.steering.finished\":\n if (event.status === \"cancelled\") for (const inputId of event.inputIds) this.steeringInputs.delete(inputId);\n break;\n case \"assistant.completed\": {\n const content = assistantContent(event.message);\n this.append({\n id: assistantId(event.runId, event.step),\n kind: \"assistant\",\n runId: event.runId,\n step: event.step,\n text: content.text,\n content: content.content,\n reasoning: content.reasoning,\n status: \"completed\",\n timestamp: event.timestamp,\n });\n break;\n }\n case \"tool.completed\":\n this.appendHistoryTool(historyTool(event, \"completed\"));\n break;\n case \"tool.failed\":\n this.appendHistoryTool(historyTool(event, \"failed\"));\n break;\n case \"tool.presentation\": {\n const preview = decodeToolChangePreviewPresentation(\n event.kind,\n event.version,\n event.data,\n );\n if (preview !== undefined) {\n this.projectChangePreview(\n event.runId,\n event.step,\n event.toolCallId,\n preview,\n event.timestamp,\n );\n }\n break;\n }\n case \"approval.requested\":\n this.append({\n id: `approval:${event.request.id}`,\n kind: \"approval\",\n requestId: event.request.id,\n toolName: event.request.tool.name,\n input: event.request.input,\n ...(event.request.persistent === undefined ? {} : { scopeDescription: event.request.persistent.description, scopeId: event.request.persistent.scopeId }),\n status: \"pending\",\n timestamp: event.timestamp,\n });\n break;\n case \"approval.resolved\":\n case \"approval.cancelled\":\n this.applyHistoryApproval(event);\n break;\n case \"context.compacted\":\n this.appendNoticeItem(\n `history:${event.seq}`,\n \"info\",\n `Context compacted with ${event.strategy}: ` +\n `${event.beforeMessageCount} \u2192 ${event.afterMessageCount} messages`,\n event.timestamp,\n );\n break;\n case \"run.failed\":\n this.appendNoticeItem(\n `history:${event.seq}`,\n \"error\",\n `Run failed: ${event.error.message}`,\n event.timestamp,\n );\n break;\n case \"run.cancelled\":\n this.appendNoticeItem(\n `history:${event.seq}`,\n \"warning\",\n `Run cancelled${event.reason === undefined ? \"\" : `: ${event.reason}`}`,\n event.timestamp,\n );\n break;\n case \"session.created\":\n case \"run.yielded\":\n break;\n }\n }\n\n private applyHistoryApproval(\n event: Extract<SessionEvent, { type: \"approval.resolved\" | \"approval.cancelled\" }>,\n ): void {\n this.replace(`approval:${event.requestId}`, (item) => {\n if (item.kind !== \"approval\") return item;\n return event.type === \"approval.resolved\"\n ? { ...item, status: \"resolved\", decision: event.decision }\n : {\n ...item,\n status: \"cancelled\",\n ...(event.reason === undefined ? {} : { reason: event.reason }),\n };\n });\n }\n\n private appendSteering(runId: string, step: number, messages: readonly UserMessage[], timestamp: number): void {\n this.latestReplyId = undefined;\n for (const [index, message] of messages.entries()) {\n this.append({ id: `steering:${runId}:${step}:${index}`, kind: \"user\", text: contentText(message.content, \"text\"), timestamp });\n }\n }\n\n private completeReply(event: Extract<MayEvent | SessionEvent, { type: \"run.completed\" }>): void {\n const step = event.result.steps;\n const content = assistantContent(event.result.message);\n this.updateAssistant({ ...event, step }, (item) => ({\n ...item,\n text: content.text || item.text,\n content: content.content,\n reasoning: content.reasoning || item.reasoning,\n status: \"completed\",\n }));\n this.latestReplyId = assistantId(event.runId, step);\n }\n\n private ensureAssistant(event: { runId: string; step: number; timestamp: number }): void {\n const id = assistantId(event.runId, event.step);\n if (this.values.some((item) => item.id === id)) return;\n this.append({\n id,\n kind: \"assistant\",\n runId: event.runId,\n step: event.step,\n text: \"\",\n reasoning: \"\",\n status: \"streaming\",\n timestamp: event.timestamp,\n });\n }\n\n private updateAssistant(\n event: { runId: string; step: number; timestamp: number },\n update: (item: AssistantTranscriptItem) => AssistantTranscriptItem,\n ): void {\n this.ensureAssistant(event);\n this.replace(assistantId(event.runId, event.step), (item) =>\n item.kind === \"assistant\" ? update(item) : item\n );\n }\n\n private ensureTool(\n runId: string,\n step: number,\n call: ToolCall,\n timestamp: number,\n ): void {\n const id = toolId(runId, call.id);\n if (this.values.some((item) => item.id === id)) return;\n this.append({\n id,\n kind: \"tool\",\n runId,\n step,\n call,\n status: \"running\",\n streamedOutput: \"\",\n progress: [],\n timestamp,\n });\n }\n\n private updateTool(\n runId: string,\n callId: string,\n update: (item: ToolTranscriptItem) => ToolTranscriptItem,\n step: number,\n call: ToolCall,\n timestamp: number,\n ): void {\n this.ensureTool(runId, step, call, timestamp);\n this.replace(toolId(runId, callId), (item) =>\n item.kind === \"tool\" ? update(item) : item\n );\n }\n\n private appendNoticeItem(\n id: string,\n level: NoticeTranscriptItem[\"level\"],\n text: string,\n timestamp: number,\n ): void {\n this.append({ id, kind: \"notice\", level, text, timestamp });\n }\n\n private appendHistoryTool(item: ToolTranscriptItem): void {\n const existing = this.values.find((value) => value.id === item.id);\n this.append(\n existing?.kind === \"tool\" && existing.preview !== undefined\n ? { ...item, preview: existing.preview }\n : item,\n );\n }\n\n private append(item: TranscriptItem): void {\n const index = this.values.findIndex((value) => value.id === item.id);\n if (index >= 0) this.values[index] = item;\n else this.values.push(item);\n }\n\n private replace(\n id: string,\n update: (item: TranscriptItem) => TranscriptItem,\n ): boolean {\n const index = this.values.findIndex((item) => item.id === id);\n if (index < 0) return false;\n this.values[index] = update(this.values[index]!);\n return true;\n }\n\n private changed(): void {\n for (const listener of this.listeners) listener(this);\n }\n}\n\nfunction approvalItem(request: ApprovalRequest, timestamp: number): ApprovalTranscriptItem {\n return {\n id: `approval:${request.id}`,\n kind: \"approval\",\n requestId: request.id,\n toolName: request.tool.name,\n input: request.input,\n ...(request.persistent === undefined ? {} : { scopeDescription: request.persistent.description, scopeId: request.persistent.scopeId }),\n status: \"pending\",\n timestamp,\n };\n}\n\nfunction historyTool(\n event: Extract<SessionEvent, { type: \"tool.completed\" | \"tool.failed\" }>,\n status: \"completed\" | \"failed\",\n): ToolTranscriptItem {\n return {\n id: toolId(event.runId, event.call.id),\n kind: \"tool\",\n runId: event.runId,\n step: event.step,\n call: event.call,\n status,\n streamedOutput: \"\",\n progress: [],\n ...(event.type === \"tool.completed\"\n ? { output: event.output, ...(event.content ? { content: event.content } : {}) }\n : { error: event.error.message }),\n timestamp: event.timestamp,\n };\n}\n\nfunction assistantContent(message: AssistantMessage): {\n readonly content: readonly ContentPart[];\n readonly text: string;\n readonly reasoning: string;\n} {\n return {\n content: message.content,\n text: contentText(message.content, \"text\"),\n reasoning: contentText(message.content, \"reasoning\"),\n };\n}\n\nfunction contentText(\n content: readonly ContentPart[],\n type: \"text\" | \"reasoning\",\n): string {\n return content.flatMap((part) => part.type === type ? [part.text] : []).join(\"\");\n}\n\nfunction assistantId(runId: string, step: number): string {\n return `assistant:${runId}:${step}`;\n}\n\nfunction toolId(runId: string, callId: string): string {\n return `tool:${runId}:${callId}`;\n}\n", "import type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Gets the original marked default options.\n */\nexport function _getDefaults<ParserOutput = string, RendererOutput = string>(): MarkedOptions<ParserOutput, RendererOutput> {\n return {\n async: false,\n breaks: false,\n extensions: null,\n gfm: true,\n hooks: null,\n pedantic: false,\n renderer: null,\n silent: false,\n tokenizer: null,\n walkTokens: null,\n };\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport let _defaults: MarkedOptions<any, any> = _getDefaults();\n\nexport function changeDefaults<ParserOutput = string, RendererOutput = string>(newDefaults: MarkedOptions<ParserOutput, RendererOutput>) {\n _defaults = newDefaults;\n}\n", "const noopTest = { exec: () => null } as unknown as RegExp;\n\nfunction cachedIndentRegex(createRegex: (indent: number) => RegExp) {\n const cache: RegExp[] = [];\n return (indent: number) => {\n const cacheIndex = Math.max(0, Math.min(3, indent - 1));\n let regex = cache[cacheIndex];\n if (!regex) {\n regex = createRegex(cacheIndex);\n cache[cacheIndex] = regex;\n }\n return regex;\n };\n}\n\nfunction edit(regex: string | RegExp, opt = '') {\n let source = typeof regex === 'string' ? regex : regex.source;\n const obj = {\n replace: (name: string | RegExp, val: string | RegExp) => {\n let valSource = typeof val === 'string' ? val : val.source;\n valSource = valSource.replace(other.caret, '$1');\n source = source.replace(name, valSource);\n return obj;\n },\n getRegex: () => {\n return new RegExp(source, opt);\n },\n };\n return obj;\n}\n\n// use a default variable to ensure the regex is evaluated on client an not removed by minifiers\nconst supportsLookbehind = ((a = '') => {\ntry {\n return !!new RegExp('(?<=1)(?<!1)' + a);\n} catch {\n // See browser support here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Regular_expressions/Lookbehind_assertion\n return false;\n}\n})();\n\nexport const other = {\n codeRemoveIndent: /^(?: {1,4}| {0,3}\\t)/gm,\n outputLinkReplace: /\\\\([\\[\\]])/g,\n indentCodeCompensation: /^(\\s+)(?:```)/,\n beginningSpace: /^\\s+/,\n endingHash: /#$/,\n startingSpaceChar: /^ /,\n endingSpaceChar: / $/,\n nonSpaceChar: /[^ ]/,\n newLineCharGlobal: /\\n/g,\n tabCharGlobal: /\\t/g,\n multipleSpaceGlobal: /\\s+/g,\n blankLine: /^[ \\t]*$/,\n doubleBlankLine: /\\n[ \\t]*\\n[ \\t]*$/,\n blockquoteStart: /^ {0,3}>/,\n blockquoteSetextReplace: /\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,\n blockquoteSetextReplace2: /^ {0,3}>[ \\t]?/gm,\n listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g,\n listIsTask: /^\\[[ xX]\\] +\\S/,\n listReplaceTask: /^\\[[ xX]\\] +/,\n listTaskCheckbox: /\\[[ xX]\\]/,\n anyLine: /\\n.*\\n/,\n hrefBrackets: /^<(.*)>$/,\n tableDelimiter: /[:|]/,\n tableAlignChars: /^\\||\\| *$/g,\n tableRowBlankLine: /\\n[ \\t]*$/,\n tableAlignRight: /^ *-+: *$/,\n tableAlignCenter: /^ *:-+: *$/,\n tableAlignLeft: /^ *:-+ *$/,\n startATag: /^<a /i,\n endATag: /^<\\/a>/i,\n startPreScriptTag: /^<(pre|code|kbd|script)(\\s|>)/i,\n endPreScriptTag: /^<\\/(pre|code|kbd|script)(\\s|>)/i,\n startAngleBracket: /^</,\n endAngleBracket: />$/,\n pedanticHrefTitle: /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,\n unicodeAlphaNumeric: /[\\p{L}\\p{N}]/u,\n escapeTest: /[&<>\"']/,\n escapeReplace: /[&<>\"']/g,\n escapeTestNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,\n escapeReplaceNoEncode: /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,\n caret: /(^|[^\\[])\\^/g,\n percentDecode: /%25/g,\n findPipe: /\\|/g,\n splitPipe: / \\|/,\n slashPipe: /\\\\\\|/g,\n carriageReturn: /\\r\\n|\\r/g,\n spaceLine: /^ +$/gm,\n notSpaceStart: /^\\S*/,\n endingNewline: /\\n$/,\n listItemRegex: (bull: string) => new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`),\n nextBulletRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`)),\n hrRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`)),\n fencesBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}(?:\\`\\`\\`|~~~)`)),\n headingBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}#`)),\n htmlBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}<(?:[a-z].*>|!--)`, 'i')),\n blockquoteBeginRegex: cachedIndentRegex((indent: number) => new RegExp(`^ {0,${indent}}>`)),\n};\n\n/**\n * Block-Level Grammar\n */\n\nconst newline = /^(?:[ \\t]*(?:\\n|$))+/;\nconst blockCode = /^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/;\nconst fences = /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/;\nconst hr = /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/;\nconst heading = /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/;\nconst bullet = / {0,3}(?:[*+-]|\\d{1,9}[.)])/;\nconst lheadingCore = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/;\nconst lheading = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/\\|table/g, '') // table not in commonmark\n .getRegex();\nconst lheadingGfm = edit(lheadingCore)\n .replace(/bull/g, bullet) // lists can interrupt\n .replace(/blockCode/g, /(?: {4}| {0,3}\\t)/) // indented code blocks can interrupt\n .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt\n .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt\n .replace(/heading/g, / {0,3}#{1,6}(?:\\s|$)/) // ATX heading can interrupt\n .replace(/html/g, / {0,3}<[^\\n>]+>\\n/) // block html can interrupt\n .replace(/table/g, / {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/) // table can interrupt\n .getRegex();\nconst _paragraph = /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/;\nconst blockText = /^[^\\n]+/;\nconst _blockLabel = /(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/;\nconst def = edit(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/)\n .replace('label', _blockLabel)\n .replace('title', /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/)\n .getRegex();\n\nconst list = edit(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/)\n .replace(/bull/g, bullet)\n .getRegex();\n\nconst _tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title'\n + '|tr|track|ul';\nconst _comment = /<!--(?:-?>|[\\s\\S]*?(?:-->|$))/;\nconst html = edit(\n '^ {0,3}(?:' // optional indentation\n+ '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)' // (1)\n+ '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n+ '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)' // (3)\n+ '|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)' // (4)\n+ '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)' // (5)\n+ '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (6)\n+ '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) open tag\n+ '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \\t]*)+\\\\n|$)' // (7) closing tag\n+ ')', 'i')\n .replace('comment', _comment)\n .replace('tag', _tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst createParagraph = (listInterrupt: RegExp) => edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', listInterrupt)\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\n// only non-empty lists starting from 1 can interrupt paragraphs\nconst paragraph = createParagraph(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/);\n// inside a blockquote a bare list marker (any number) starts a sibling list,\n// so it must not be lazily continued as paragraph text (unlike a top level\n// paragraph, where an empty list cannot interrupt)\nconst blockquoteParagraph = createParagraph(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/);\n\nconst blockquote = edit(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/)\n .replace('paragraph', blockquoteParagraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nconst blockNormal = {\n blockquote,\n code: blockCode,\n def,\n fences,\n heading,\n hr,\n html,\n lheading,\n list,\n newline,\n paragraph,\n table: noopTest,\n text: blockText,\n};\n\ntype BlockKeys = keyof typeof blockNormal;\n\n/**\n * GFM Block Grammar\n */\n\nconst gfmTable = edit(\n '^ *([^\\\\n ].*)\\\\n' // Header\n+ ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n+ '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)') // Cells\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('blockquote', ' {0,3}>')\n .replace('code', '(?: {4}| {0,3}\\t)[^\\\\n]')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]') // any bullet ends the table rows\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // tables can be interrupted by type (6) html blocks\n .getRegex();\n\nconst blockGfm: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n lheading: lheadingGfm,\n table: gfmTable,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs\n .replace('table', gfmTable) // interrupt paragraphs with table\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)')\n .replace('list', ' {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]') // only non-empty lists starting from 1 can interrupt\n .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n .replace('tag', _tag) // pars can be interrupted by type (6) html blocks\n .getRegex(),\n};\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nconst blockPedantic: Record<BlockKeys, RegExp> = {\n ...blockNormal,\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', _comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n paragraph: edit(_paragraph)\n .replace('hr', hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', lheading)\n .replace('|table', '')\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .replace('|tag', '')\n .getRegex(),\n};\n\n/**\n * Inline-Level Grammar\n */\n\nconst escape = /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/;\nconst inlineCode = /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/;\nconst br = /^( {2,}|\\\\)\\n(?!\\s*$)/;\nconst inlineText = /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/;\n\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\nconst _punctuation = /[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpace = /[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpace = /[^\\s\\p{P}\\p{S}]/u;\nconst punctuation = edit(/^((?![*_])punctSpace)/, 'u')\n .replace(/punctSpace/g, _punctuationOrSpace).getRegex();\n\n/**\n * Opening punct/quotes excluded from pedantic LDelim nextChar so\n * `aa**\"A\"**bb` / `aa**(A)**bb` can start strong (Pi + Ps + ASCII straight quotes).\n */\nconst _openQuote = /[\\p{Pi}\\p{Ps}\"']/u;\n\n// GFM allows ~ inside strong and em for strikethrough\nconst _punctuationGfmStrongEm = /(?!~)[\\p{P}\\p{S}]/u;\nconst _punctuationOrSpaceGfmStrongEm = /(?!~)[\\s\\p{P}\\p{S}]/u;\nconst _notPunctuationOrSpaceGfmStrongEm = /(?:[^\\s\\p{P}\\p{S}]|~)/u;\n\n// sequences em should skip over [title](link), `code`, <html>\nconst blockSkip = edit(/link|precode-code|html/, 'g')\n .replace('link', /\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/)\n .replace('precode-', supportsLookbehind ? '(?<!`)()' : '(^^|[^`])')\n .replace('code', /(?<b>`+)[^`]+\\k<b>(?!`)/)\n .replace('html', /<(?! )[^<>]*?>/)\n .getRegex();\n\nconst emStrongLDelimCore = /^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/;\n\nconst emStrongLDelim = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongLDelimGfm = edit(emStrongLDelimCore, 'u')\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: do not treat opening punct/quotes as left-delim punct (e.g. **( / **\").\nconst emStrongLDelimPedanticCore = /^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/;\n\nconst emStrongLDelimPedantic = edit(emStrongLDelimPedanticCore, 'u')\n .replace(/openQuote/g, _openQuote)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)' // (3) #***a, ***a can only be Left Delimiter\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?=notPunctSpace)'; // (6) a***a can be either Left or Right Delimiter\n\nconst emStrongRDelimAst = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst emStrongRDelimAstGfm = edit(emStrongRDelimAstCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpaceGfmStrongEm)\n .replace(/punctSpace/g, _punctuationOrSpaceGfmStrongEm)\n .replace(/punct/g, _punctuationGfmStrongEm)\n .getRegex();\n\n// Pedantic: rule 3 requires whitespace before left delim; rule 6 allows punct before close (e.g. `:**bar`).\nconst emStrongRDelimAstPedanticCore =\n '^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)' // Skip orphan inside strong\n+ '|[^*]+(?=[^*])' // Consume to delim\n+ '|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)' // (1) #*** can only be a Right Delimiter\n+ '|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)' // (2) a***#, a*** can only be a Right Delimiter\n+ '|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)' // (3) ***a can only be Left Delimiter (whitespace required; not #***a)\n+ '|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)' // (4) ***# can only be Left Delimiter\n+ '|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)' // (5) #***# can be either Left or Right Delimiter\n+ '|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)'; // (6) a***a, #***a, and :** (e.g. **foo:**bar)\n\nconst emStrongRDelimAstPedantic = edit(emStrongRDelimAstPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Normal: no rule 6 for _ (a___a cannot close as emphasis).\nconst emStrongRDelimUnd = edit(\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)punctSpace(_+)(?=notPunctSpace)' // (3) #___a, ___a can only be Left Delimiter\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)', 'gu') // (5) #___# can be either Left or Right Delimiter\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Pedantic: same rule 3/6 adjustments as emStrongRDelimAstPedantic (e.g. `_foo:_bar`).\nconst emStrongRDelimUndPedanticCore =\n '^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)' // Skip orphan inside strong\n+ '|[^_]+(?=[^_])' // Consume to delim\n+ '|(?!_)punct(_+)(?=[\\\\s]|$)' // (1) #___ can only be a Right Delimiter\n+ '|notPunctSpace(_+)(?!_)(?=punctSpace|$)' // (2) a___#, a___ can only be a Right Delimiter\n+ '|(?!_)[\\\\s](_+)(?=notPunctSpace)' // (3) ___a can only be Left Delimiter (whitespace required; not #___a)\n+ '|[\\\\s](_+)(?!_)(?=punct)' // (4) ___# can only be Left Delimiter\n+ '|(?!_)punct(_+)(?!_)(?=punct)' // (5) #___# can be either Left or Right Delimiter\n+ '|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)'; // (6) a___a, #___a, and :__ (e.g. _foo:_bar)\n\nconst emStrongRDelimUndPedantic = edit(emStrongRDelimUndPedanticCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde left delimiter for strikethrough (similar to emStrongLDelim for asterisk)\nconst delLDelim = edit(/^~~?(?:((?!~)punct)|[^\\s~])/, 'u')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\n// Tilde delimiter patterns for strikethrough (similar to asterisk)\nconst delRDelimCore =\n '^[^~]+(?=[^~])' // Consume to delim\n+ '|(?!~)punct(~~?)(?=[\\\\s]|$)' // (1) #~~ can only be a Right Delimiter\n+ '|notPunctSpace(~~?)(?!~)(?=punctSpace|$)' // (2) a~~#, a~~ can only be a Right Delimiter\n+ '|(?!~)punctSpace(~~?)(?=notPunctSpace)' // (3) #~~a, ~~a can only be Left Delimiter\n+ '|[\\\\s](~~?)(?!~)(?=punct)' // (4) ~~# can only be Left Delimiter\n+ '|(?!~)punct(~~?)(?!~)(?=punct)' // (5) #~~# can be either Left or Right Delimiter\n+ '|notPunctSpace(~~?)(?=notPunctSpace)'; // (6) a~~a can be either Left or Right Delimiter\n\nconst delRDelim = edit(delRDelimCore, 'gu')\n .replace(/notPunctSpace/g, _notPunctuationOrSpace)\n .replace(/punctSpace/g, _punctuationOrSpace)\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst anyPunctuation = edit(/\\\\(punct)/, 'gu')\n .replace(/punct/g, _punctuation)\n .getRegex();\n\nconst autolink = edit(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/)\n .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/)\n .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])?)+(?![-_])/)\n .getRegex();\n\nconst _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex();\nconst tag = edit(\n '^comment'\n + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>') // CDATA section\n .replace('comment', _inlineComment)\n .replace('attribute', /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nconst _inlineLabel = /(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/;\n\nconst link = edit(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?\\s*\\)/)\n .replace('label', _inlineLabel)\n .replace('href', /<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/)\n .replace('title', /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/)\n .getRegex();\n\nconst reflink = edit(/^!?\\[(label)\\]\\[(ref)\\]/)\n .replace('label', _inlineLabel)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst nolink = edit(/^!?\\[(ref)\\](?:\\[\\])?/)\n .replace('ref', _blockLabel)\n .getRegex();\n\nconst reflinkSearch = edit('reflink|nolink(?!\\\\()', 'g')\n .replace('reflink', reflink)\n .replace('nolink', nolink)\n .getRegex();\n\nconst _caseInsensitiveProtocol = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;\n\n/**\n * Normal Inline Grammar\n */\n\nconst inlineNormal = {\n _backpedal: noopTest, // only used for GFM url\n anyPunctuation,\n autolink,\n blockSkip,\n br,\n code: inlineCode,\n del: noopTest,\n delLDelim: noopTest,\n delRDelim: noopTest,\n emStrongLDelim,\n emStrongRDelimAst,\n emStrongRDelimUnd,\n escape,\n link,\n nolink,\n punctuation,\n reflink,\n reflinkSearch,\n tag,\n text: inlineText,\n url: noopTest,\n};\n\ntype InlineKeys = keyof typeof inlineNormal;\n\n/**\n * Pedantic Inline Grammar\n */\n\nconst inlinePedantic: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongLDelim: emStrongLDelimPedantic,\n emStrongRDelimAst: emStrongRDelimAstPedantic,\n emStrongRDelimUnd: emStrongRDelimUndPedantic,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', _inlineLabel)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', _inlineLabel)\n .getRegex(),\n};\n\n/**\n * GFM Inline Grammar\n */\n\nconst inlineGfm: Record<InlineKeys, RegExp> = {\n ...inlineNormal,\n emStrongRDelimAst: emStrongRDelimAstGfm,\n emStrongLDelim: emStrongLDelimGfm,\n delLDelim,\n delRDelim,\n url: edit(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/)\n .replace('protocol', _caseInsensitiveProtocol)\n .replace('email', /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/)\n .getRegex(),\n _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n del: /^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,\n text: edit(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/)\n .replace('protocol', _caseInsensitiveProtocol)\n .getRegex(),\n};\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\nconst inlineBreaks: Record<InlineKeys, RegExp> = {\n ...inlineGfm,\n br: edit(br).replace('{2,}', '*').getRegex(),\n text: edit(inlineGfm.text)\n .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n .replace(/\\{2,\\}/g, '*')\n .getRegex(),\n};\n\n/**\n * exports\n */\n\nexport const block = {\n normal: blockNormal,\n gfm: blockGfm,\n pedantic: blockPedantic,\n};\n\nexport const inline = {\n normal: inlineNormal,\n gfm: inlineGfm,\n breaks: inlineBreaks,\n pedantic: inlinePedantic,\n};\n\nexport interface Rules {\n other: typeof other\n block: Record<BlockKeys, RegExp>\n inline: Record<InlineKeys, RegExp>\n}\n", "import { other } from './rules.ts';\n\n/**\n * Helpers\n */\nconst escapeReplacements: { [index: string]: string } = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string) => escapeReplacements[ch];\n\nexport function escapeHtmlEntities(html: string, encode?: boolean) {\n if (encode) {\n if (other.escapeTest.test(html)) {\n return html.replace(other.escapeReplace, getEscapeReplacement);\n }\n } else {\n if (other.escapeTestNoEncode.test(html)) {\n return html.replace(other.escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nexport function cleanUrl(href: string) {\n try {\n href = encodeURI(href).replace(other.percentDecode, '%');\n } catch {\n return null;\n }\n return href;\n}\n\nexport function splitCells(tableRow: string, count?: number) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(other.findPipe, (match, offset, str) => {\n let escaped = false;\n let curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(other.splitPipe);\n let i = 0;\n\n // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n if (!cells[0].trim()) {\n cells.shift();\n }\n if (cells.length > 0 && !cells.at(-1)?.trim()) {\n cells.pop();\n }\n\n if (count) {\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(other.slashPipe, '|');\n }\n return cells;\n}\n\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nexport function rtrim(str: string, c: string, invert?: boolean) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.slice(0, l - suffLen);\n}\n\nexport function trimTrailingBlankLines(str: string) {\n const lines = str.split('\\n');\n let end = lines.length - 1;\n while (end >= 0 && other.blankLine.test(lines[end])) {\n end--;\n }\n if (lines.length - end <= 2) {\n // we want to keep single trailing blank lines\n return str;\n }\n\n return lines.slice(0, end + 1).join('\\n');\n}\n\nexport function findClosingBracket(str: string, b: string) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n\n let level = 0;\n for (let i = 0; i < str.length; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n if (level > 0) {\n return -2;\n }\n\n return -1;\n}\n\nexport function expandTabs(line: string, indent = 0) {\n let col = indent;\n let expanded = '';\n for (const char of line) {\n if (char === '\\t') {\n const added = 4 - (col % 4);\n expanded += ' '.repeat(added);\n col += added;\n } else {\n expanded += char;\n col++;\n }\n }\n\n return expanded;\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n rtrim,\n splitCells,\n findClosingBracket,\n expandTabs,\n trimTrailingBlankLines,\n} from './helpers.ts';\nimport type { Rules } from './rules.ts';\nimport type { _Lexer } from './Lexer.ts';\nimport type { Links, Tokens, Token } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\nfunction outputLink(cap: string[], link: Pick<Tokens.Link, 'href' | 'title'>, raw: string, lexer: _Lexer, rules: Rules): Tokens.Link | Tokens.Image | undefined {\n const href = link.href;\n const title = link.title || null;\n const text = cap[1].replace(rules.other.outputLinkReplace, '$1');\n const isImage = cap[0].charAt(0) === '!';\n\n lexer.state.inLink = true;\n const outerLinkEmitted = lexer.state.linkEmitted;\n const outerInRawBlock = lexer.state.inRawBlock;\n lexer.state.linkEmitted = false;\n const tokens = lexer.inlineTokens(text);\n const textHasLink = lexer.state.linkEmitted;\n lexer.state.linkEmitted = outerLinkEmitted;\n lexer.state.inLink = false;\n\n if (!isImage) {\n // CommonMark: \"Links may not contain other links, at any level of nesting.\"\n // Bail so the caller falls through to text and the inner link is the one kept.\n // Images are exempt: their text is flattened into an alt attribute.\n if (textHasLink) {\n // these tokens are discarded, so undo the raw-block state they opened;\n // leaving it set would suppress escaping for the text that is re-scanned\n lexer.state.inRawBlock = outerInRawBlock;\n return;\n }\n lexer.state.linkEmitted = true;\n }\n\n return {\n type: isImage ? 'image' : 'link',\n raw,\n href,\n title,\n text,\n tokens,\n };\n}\n\nfunction indentCodeCompensation(raw: string, text: string, rules: Rules) {\n const matchIndentToCode = raw.match(rules.other.indentCodeCompensation);\n\n if (matchIndentToCode === null) {\n return text;\n }\n\n const indentToCode = matchIndentToCode[1];\n\n return text\n .split('\\n')\n .map(node => {\n const matchIndentInNode = node.match(rules.other.beginningSpace);\n if (matchIndentInNode === null) {\n return node;\n }\n\n const [indentInNode] = matchIndentInNode;\n\n if (indentInNode.length >= indentToCode.length) {\n return node.slice(indentToCode.length);\n }\n\n return node;\n })\n .join('\\n');\n}\n\n/**\n * Tokenizer\n */\nexport class _Tokenizer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n rules!: Rules; // set by the lexer\n lexer!: _Lexer<ParserOutput, RendererOutput>; // set by the lexer\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(src: string): Tokens.Space | undefined {\n const cap = this.rules.block.newline.exec(src);\n if (cap && cap[0].length > 0) {\n return {\n type: 'space',\n raw: cap[0],\n };\n }\n }\n\n code(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.code.exec(src);\n if (cap) {\n const raw = this.options.pedantic\n ? cap[0]\n : trimTrailingBlankLines(cap[0]);\n const text = raw.replace(this.rules.other.codeRemoveIndent, '');\n return {\n type: 'code',\n raw,\n codeBlockStyle: 'indented',\n text,\n };\n }\n }\n\n fences(src: string): Tokens.Code | undefined {\n const cap = this.rules.block.fences.exec(src);\n if (cap) {\n const raw = cap[0];\n const text = indentCodeCompensation(raw, cap[3] || '', this.rules);\n\n return {\n type: 'code',\n raw,\n lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2],\n text,\n };\n }\n }\n\n heading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.heading.exec(src);\n if (cap) {\n let text = cap[2].trim();\n\n // remove trailing #s\n if (this.rules.other.endingHash.test(text)) {\n const trimmed = rtrim(text, '#');\n if (this.options.pedantic) {\n text = trimmed.trim();\n } else if (!trimmed || this.rules.other.endingSpaceChar.test(trimmed)) {\n // CommonMark requires space before trailing #s\n text = trimmed.trim();\n }\n }\n\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[1].length,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n hr(src: string): Tokens.Hr | undefined {\n const cap = this.rules.block.hr.exec(src);\n if (cap) {\n return {\n type: 'hr',\n raw: rtrim(cap[0], '\\n'),\n };\n }\n }\n\n blockquote(src: string): Tokens.Blockquote | undefined {\n const cap = this.rules.block.blockquote.exec(src);\n if (cap) {\n let lines = rtrim(cap[0], '\\n').split('\\n');\n let raw = '';\n let text = '';\n const tokens: Token[] = [];\n\n while (lines.length > 0) {\n let inBlockquote = false;\n const currentLines = [];\n\n let i;\n for (i = 0; i < lines.length; i++) {\n // get lines up to a continuation\n if (this.rules.other.blockquoteStart.test(lines[i])) {\n currentLines.push(lines[i]);\n inBlockquote = true;\n } else if (!inBlockquote) {\n currentLines.push(lines[i]);\n } else {\n break;\n }\n }\n lines = lines.slice(i);\n\n const currentRaw = currentLines.join('\\n');\n const currentText = currentRaw\n // precede setext continuation with 4 spaces so it isn't a setext\n .replace(this.rules.other.blockquoteSetextReplace, '\\n $1')\n .replace(this.rules.other.blockquoteSetextReplace2, '');\n raw = raw ? `${raw}\\n${currentRaw}` : currentRaw;\n text = text ? `${text}\\n${currentText}` : currentText;\n\n // parse blockquote lines as top level tokens\n // merge paragraphs if this is a continuation\n const top = this.lexer.state.top;\n this.lexer.state.top = true;\n this.lexer.blockTokens(currentText, tokens, true);\n this.lexer.state.top = top;\n\n // if there is no continuation then we are done\n if (lines.length === 0) {\n break;\n }\n\n const lastToken = tokens.at(-1);\n\n if (lastToken?.type === 'code') {\n // blockquote continuation cannot be preceded by a code block\n break;\n } else if (lastToken?.type === 'blockquote') {\n // include continuation in nested blockquote\n const oldToken = lastToken as Tokens.Blockquote;\n // The continuation lines belong to the same nesting frame as the\n // nested blockquote, which already had one '>' marker stripped, so\n // strip one marker from them too. Otherwise a restated marker after a\n // lazy line is re-parsed as a spurious deeper blockquote.\n const continuation = lines.join('\\n');\n const newText = oldToken.raw + '\\n' + continuation.replace(this.rules.other.blockquoteSetextReplace2, '');\n const newToken = this.blockquote(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = `${raw}\\n${continuation}`;\n text = text.substring(0, text.length - oldToken.text.length) + newToken.text;\n break;\n } else if (lastToken?.type === 'list') {\n // include continuation in nested list\n const oldToken = lastToken as Tokens.List;\n const newText = oldToken.raw + '\\n' + lines.join('\\n');\n const newToken = this.list(newText)!;\n tokens[tokens.length - 1] = newToken;\n\n raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw;\n text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw;\n lines = newText.substring(tokens.at(-1)!.raw.length).split('\\n');\n continue;\n }\n }\n\n return {\n type: 'blockquote',\n raw,\n tokens,\n text,\n };\n }\n }\n\n list(src: string): Tokens.List | undefined {\n let cap = this.rules.block.list.exec(src);\n if (cap) {\n let bull = cap[1].trim();\n const isordered = bull.length > 1;\n\n const list: Tokens.List = {\n type: 'list',\n raw: '',\n ordered: isordered,\n start: isordered ? +bull.slice(0, -1) : '',\n loose: false,\n items: [],\n };\n\n bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n\n if (this.options.pedantic) {\n bull = isordered ? bull : '[*+-]';\n }\n\n // Get next list item\n const itemRegex = this.rules.other.listItemRegex(bull);\n let endsWithBlankLine = false;\n // Check if current bullet point can start a new List Item\n while (src) {\n let endEarly = false;\n let raw = '';\n let itemContents = '';\n if (!(cap = itemRegex.exec(src))) {\n break;\n }\n\n if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n break;\n }\n\n raw = cap[0];\n src = src.substring(raw.length);\n\n let line = expandTabs(cap[2].split('\\n', 1)[0], cap[1].length);\n let nextLine = src.split('\\n', 1)[0];\n let blankLine = !line.trim();\n\n let indent = 0;\n if (this.options.pedantic) {\n indent = 2;\n itemContents = line.trimStart();\n } else if (blankLine) {\n indent = cap[1].length + 1;\n } else {\n indent = line.search(this.rules.other.nonSpaceChar); // Find first non-space char\n indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n itemContents = line.slice(indent);\n indent += cap[1].length;\n }\n\n if (blankLine && this.rules.other.blankLine.test(nextLine)) { // Items begin with at most one blank line\n raw += nextLine + '\\n';\n src = src.substring(nextLine.length + 1);\n endEarly = true;\n }\n\n if (!endEarly) {\n const nextBulletRegex = this.rules.other.nextBulletRegex(indent);\n const hrRegex = this.rules.other.hrRegex(indent);\n const fencesBeginRegex = this.rules.other.fencesBeginRegex(indent);\n const headingBeginRegex = this.rules.other.headingBeginRegex(indent);\n const htmlBeginRegex = this.rules.other.htmlBeginRegex(indent);\n const blockquoteBeginRegex = this.rules.other.blockquoteBeginRegex(indent);\n\n // Check if following lines should be included in List Item\n while (src) {\n const rawLine = src.split('\\n', 1)[0];\n let nextLineWithoutTabs;\n nextLine = rawLine;\n\n // Re-align to follow commonmark nesting rules\n if (this.options.pedantic) {\n nextLine = nextLine.replace(this.rules.other.listReplaceNesting, ' ');\n nextLineWithoutTabs = nextLine;\n } else {\n nextLineWithoutTabs = nextLine.replace(this.rules.other.tabCharGlobal, ' ');\n }\n\n // End list item if found code fences\n if (fencesBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new heading\n if (headingBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of html block\n if (htmlBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of blockquote\n if (blockquoteBeginRegex.test(nextLine)) {\n break;\n }\n\n // End list item if found start of new bullet\n if (nextBulletRegex.test(nextLine)) {\n break;\n }\n\n // Horizontal rule found\n if (hrRegex.test(nextLine)) {\n break;\n }\n\n if (nextLineWithoutTabs.search(this.rules.other.nonSpaceChar) >= indent || !nextLine.trim()) { // Dedent if possible\n itemContents += '\\n' + nextLineWithoutTabs.slice(indent);\n } else {\n // not enough indentation\n if (blankLine) {\n break;\n }\n\n // paragraph continuation unless last line was a different block level element\n if (line.replace(this.rules.other.tabCharGlobal, ' ').search(this.rules.other.nonSpaceChar) >= 4) { // indented code block\n break;\n }\n if (fencesBeginRegex.test(line)) {\n break;\n }\n if (headingBeginRegex.test(line)) {\n break;\n }\n if (hrRegex.test(line)) {\n break;\n }\n\n itemContents += '\\n' + nextLine;\n }\n\n blankLine = !nextLine.trim();\n\n raw += rawLine + '\\n';\n src = src.substring(rawLine.length + 1);\n line = nextLineWithoutTabs.slice(indent);\n }\n }\n\n if (!list.loose) {\n // If the previous item ended with a blank line, the list is loose\n if (endsWithBlankLine) {\n list.loose = true;\n } else if (this.rules.other.doubleBlankLine.test(raw)) {\n endsWithBlankLine = true;\n }\n }\n\n list.items.push({\n type: 'list_item',\n raw,\n task: !!this.options.gfm && this.rules.other.listIsTask.test(itemContents),\n loose: false,\n text: itemContents,\n tokens: [],\n });\n\n list.raw += raw;\n }\n\n // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n const lastItem = list.items.at(-1);\n if (lastItem) {\n lastItem.raw = lastItem.raw.trimEnd();\n lastItem.text = lastItem.text.trimEnd();\n } else {\n // not a list since there were no items\n return;\n }\n list.raw = list.raw.trimEnd();\n\n // Item child tokens handled here at end because we needed to have the final item to trim it first\n // First pass: tokenize items and finalize list.loose from spacers before placing checkboxes\n for (const item of list.items) {\n this.lexer.state.top = false;\n item.tokens = this.lexer.blockTokens(item.text, []);\n\n if (!list.loose) {\n // Check if list should be loose\n const spacers = item.tokens.filter(t => t.type === 'space');\n const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => this.rules.other.anyLine.test(t.raw));\n\n list.loose = hasMultipleLineBreaks;\n }\n }\n\n // Second pass: place task checkboxes using the final list.loose\n for (const item of list.items) {\n const itemToken = item.tokens[0];\n if (item.task && (itemToken?.type === 'text' || itemToken?.type === 'paragraph')) {\n // Remove checkbox markdown from item tokens\n item.text = item.text.replace(this.rules.other.listReplaceTask, '');\n itemToken.raw = itemToken.raw.replace(this.rules.other.listReplaceTask, '');\n itemToken.text = itemToken.text.replace(this.rules.other.listReplaceTask, '');\n for (let i = this.lexer.inlineQueue.length - 1; i >= 0; i--) {\n if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[i].src)) {\n this.lexer.inlineQueue[i].src = this.lexer.inlineQueue[i].src.replace(this.rules.other.listReplaceTask, '');\n break;\n }\n }\n\n const taskRaw = this.rules.other.listTaskCheckbox.exec(item.raw);\n if (taskRaw) {\n const checkboxToken: Tokens.Checkbox = {\n type: 'checkbox',\n raw: taskRaw[0] + ' ',\n checked: taskRaw[0] !== '[ ]',\n };\n item.checked = checkboxToken.checked;\n if (list.loose) {\n if (item.tokens[0] && ['paragraph', 'text'].includes(item.tokens[0].type) && 'tokens' in item.tokens[0] && item.tokens[0].tokens) {\n item.tokens[0].raw = checkboxToken.raw + item.tokens[0].raw;\n item.tokens[0].text = checkboxToken.raw + item.tokens[0].text;\n item.tokens[0].tokens.unshift(checkboxToken);\n } else {\n item.tokens.unshift({\n type: 'paragraph',\n raw: checkboxToken.raw,\n text: checkboxToken.raw,\n tokens: [checkboxToken],\n });\n }\n } else {\n item.tokens.unshift(checkboxToken);\n }\n }\n } else if (item.task) {\n item.task = false;\n }\n }\n\n // Set all items to loose if list is loose\n if (list.loose) {\n for (const item of list.items) {\n item.loose = true;\n for (const token of item.tokens) {\n if (token.type === 'text') {\n token.type = 'paragraph';\n }\n }\n }\n }\n\n return list;\n }\n }\n\n html(src: string): Tokens.HTML | undefined {\n const cap = this.rules.block.html.exec(src);\n if (cap) {\n const raw = trimTrailingBlankLines(cap[0]);\n const token: Tokens.HTML = {\n type: 'html',\n block: true,\n raw,\n pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n text: raw,\n };\n return token;\n }\n }\n\n def(src: string): Tokens.Def | undefined {\n const cap = this.rules.block.def.exec(src);\n if (cap) {\n const tag = cap[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, ' ');\n const href = cap[2] ? cap[2].replace(this.rules.other.hrefBrackets, '$1').replace(this.rules.inline.anyPunctuation, '$1') : '';\n const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3];\n return {\n type: 'def',\n tag,\n raw: rtrim(cap[0], '\\n'),\n href,\n title,\n };\n }\n }\n\n table(src: string): Tokens.Table | undefined {\n const cap = this.rules.block.table.exec(src);\n if (!cap) {\n return;\n }\n\n if (!this.rules.other.tableDelimiter.test(cap[2])) {\n // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n return;\n }\n\n const headers = splitCells(cap[1]);\n const aligns = cap[2].replace(this.rules.other.tableAlignChars, '').split('|');\n const rows = cap[3]?.trim() ? cap[3].replace(this.rules.other.tableRowBlankLine, '').split('\\n') : [];\n\n const item: Tokens.Table = {\n type: 'table',\n raw: rtrim(cap[0], '\\n'),\n header: [],\n align: [],\n rows: [],\n };\n\n if (headers.length !== aligns.length) {\n // header and align columns must be equal, rows can be different.\n return;\n }\n\n for (const align of aligns) {\n if (this.rules.other.tableAlignRight.test(align)) {\n item.align.push('right');\n } else if (this.rules.other.tableAlignCenter.test(align)) {\n item.align.push('center');\n } else if (this.rules.other.tableAlignLeft.test(align)) {\n item.align.push('left');\n } else {\n item.align.push(null);\n }\n }\n\n for (let i = 0; i < headers.length; i++) {\n item.header.push({\n text: headers[i],\n tokens: this.lexer.inline(headers[i]),\n header: true,\n align: item.align[i],\n });\n }\n\n for (const row of rows) {\n item.rows.push(splitCells(row, item.header.length).map((cell, i) => {\n return {\n text: cell,\n tokens: this.lexer.inline(cell),\n header: false,\n align: item.align[i],\n };\n }));\n }\n\n return item;\n }\n\n lheading(src: string): Tokens.Heading | undefined {\n const cap = this.rules.block.lheading.exec(src);\n if (cap) {\n const text = cap[1].trim();\n return {\n type: 'heading',\n raw: rtrim(cap[0], '\\n'),\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n paragraph(src: string): Tokens.Paragraph | undefined {\n const cap = this.rules.block.paragraph.exec(src);\n if (cap) {\n const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1];\n return {\n type: 'paragraph',\n raw: cap[0],\n text,\n tokens: this.lexer.inline(text),\n };\n }\n }\n\n text(src: string): Tokens.Text | undefined {\n const cap = this.rules.block.text.exec(src);\n if (cap) {\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n tokens: this.lexer.inline(cap[0]),\n };\n }\n }\n\n escape(src: string): Tokens.Escape | undefined {\n const cap = this.rules.inline.escape.exec(src);\n if (cap) {\n return {\n type: 'escape',\n raw: cap[0],\n text: cap[1],\n };\n }\n }\n\n tag(src: string): Tokens.Tag | undefined {\n const cap = this.rules.inline.tag.exec(src);\n if (cap) {\n if (!this.lexer.state.inLink && this.rules.other.startATag.test(cap[0])) {\n this.lexer.state.inLink = true;\n } else if (this.lexer.state.inLink && this.rules.other.endATag.test(cap[0])) {\n this.lexer.state.inLink = false;\n }\n if (!this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = true;\n } else if (this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(cap[0])) {\n this.lexer.state.inRawBlock = false;\n }\n\n return {\n type: 'html',\n raw: cap[0],\n inLink: this.lexer.state.inLink,\n inRawBlock: this.lexer.state.inRawBlock,\n block: false,\n text: cap[0],\n };\n }\n }\n\n link(src: string): Tokens.Link | Tokens.Image | undefined {\n const cap = this.rules.inline.link.exec(src);\n if (cap) {\n const trimmedUrl = cap[2].trim();\n if (!this.options.pedantic && this.rules.other.startAngleBracket.test(trimmedUrl)) {\n // commonmark requires matching angle brackets\n if (!(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n return;\n }\n\n // ending angle bracket cannot be escaped\n const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n return;\n }\n } else {\n // find closing parenthesis\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex === -2) {\n // more open parens than closed\n return;\n }\n\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n }\n let href = cap[2];\n let title = '';\n if (this.options.pedantic) {\n // split pedantic href and title\n const link = this.rules.other.pedanticHrefTitle.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n\n href = href.trim();\n if (this.rules.other.startAngleBracket.test(href)) {\n if (this.options.pedantic && !(this.rules.other.endAngleBracket.test(trimmedUrl))) {\n // pedantic allows starting angle bracket without ending angle bracket\n href = href.slice(1);\n } else {\n href = href.slice(1, -1);\n }\n }\n return outputLink(cap, {\n href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href,\n title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title,\n }, cap[0], this.lexer, this.rules);\n }\n }\n\n reflink(src: string, links: Links): Tokens.Link | Tokens.Image | Tokens.Text | undefined {\n let cap;\n if ((cap = this.rules.inline.reflink.exec(src))\n || (cap = this.rules.inline.nolink.exec(src))) {\n const linkString = (cap[2] || cap[1]).replace(this.rules.other.multipleSpaceGlobal, ' ');\n const link = links[linkString.toLowerCase()];\n if (!link) {\n const text = cap[0].charAt(0);\n return {\n type: 'text',\n raw: text,\n text,\n };\n }\n return outputLink(cap, link, cap[0], this.lexer, this.rules);\n }\n }\n\n emStrong(src: string, maskedSrc: string, prevChar = ''): Tokens.Em | Tokens.Strong | undefined {\n let match = this.rules.inline.emStrongLDelim.exec(src);\n if (!match) return;\n if (!match[1] && !match[2] && !match[3] && !match[4]) return;\n\n // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n if (match[4] && prevChar.match(this.rules.other.unicodeAlphaNumeric)) return;\n\n const nextChar = match[1] || match[3] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n\n const delimChar = match[0][0];\n // A mid-run opener (for example the second star of an unmatched `**`) must\n // only pair with a delimiter that can only close, otherwise it steals the\n // opener of a later span (`**a*b*c` must be `**a<em>b</em>c`).\n const midRun = prevChar === delimChar;\n const endReg = delimChar === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src (move to lexer?)\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue; // skip single * in __abc*abc__\n\n rLength = [...rDelim].length;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n } else if (match[5] || match[6]) { // either Left or Right Delim\n if (lLength % 3 && !((lLength + rLength) % 3)) {\n midDelimTotal += rLength;\n continue; // CommonMark Emphasis Rules 9-10\n }\n if (midRun) {\n // A mid-run opener cannot close against an ambiguous delimiter that\n // can also open; that delimiter opens its own emphasis span instead.\n break;\n }\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters. *a*** -> *a*\n rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n // char length can be >1 for unicode characters;\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create `em` if smallest delimiter has odd char count. *a***\n if (Math.min(lLength, rLength) % 2) {\n const text = raw.slice(1, -1);\n return {\n type: 'em',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n\n // Create 'strong' if smallest delimiter has even char count. **a***\n const text = raw.slice(2, -2);\n return {\n type: 'strong',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n codespan(src: string): Tokens.Codespan | undefined {\n const cap = this.rules.inline.code.exec(src);\n if (cap) {\n let text = cap[2].replace(this.rules.other.newLineCharGlobal, ' ');\n const hasNonSpaceChars = this.rules.other.nonSpaceChar.test(text);\n const hasSpaceCharsOnBothEnds = this.rules.other.startingSpaceChar.test(text) && this.rules.other.endingSpaceChar.test(text);\n if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n text = text.substring(1, text.length - 1);\n }\n return {\n type: 'codespan',\n raw: cap[0],\n text,\n };\n }\n }\n\n br(src: string): Tokens.Br | undefined {\n const cap = this.rules.inline.br.exec(src);\n if (cap) {\n return {\n type: 'br',\n raw: cap[0],\n };\n }\n }\n\n del(src: string, maskedSrc: string, prevChar = ''): Tokens.Del | undefined {\n let match = this.rules.inline.delLDelim.exec(src);\n if (!match) return;\n\n const nextChar = match[1] || '';\n\n if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n // unicode Regex counts emoji as 1 char; spread into array for proper count\n const lLength = [...match[0]].length - 1;\n let rDelim, rLength, delimTotal = lLength;\n\n const endReg = this.rules.inline.delRDelim;\n endReg.lastIndex = 0;\n\n // Clip maskedSrc to same section of string as src\n maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n\n while ((match = endReg.exec(maskedSrc)) !== null) {\n rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n\n if (!rDelim) continue;\n\n rLength = [...rDelim].length;\n\n if (rLength !== lLength) continue;\n\n if (match[3] || match[4]) { // found another Left Delim\n delimTotal += rLength;\n continue;\n }\n\n delimTotal -= rLength;\n\n if (delimTotal > 0) continue; // Haven't found enough closing delimiters\n\n // Remove extra characters\n rLength = Math.min(rLength, rLength + delimTotal);\n // char length can be >1 for unicode characters\n const lastCharLength = [...match[0]][0].length;\n const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n\n // Create del token - only single ~ or double ~~ supported\n const text = raw.slice(lLength, -lLength);\n return {\n type: 'del',\n raw,\n text,\n tokens: this.lexer.inlineTokens(text),\n };\n }\n }\n }\n\n autolink(src: string): Tokens.Link | undefined {\n const cap = this.rules.inline.autolink.exec(src);\n if (cap) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[1];\n href = 'mailto:' + text;\n } else {\n text = cap[1];\n href = text;\n }\n\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n url(src: string): Tokens.Link | undefined {\n let cap;\n if (cap = this.rules.inline.url.exec(src)) {\n let text, href;\n if (cap[2] === '@') {\n text = cap[0];\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n let prevCapZero;\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? '';\n } while (prevCapZero !== cap[0]);\n text = cap[0];\n if (cap[1] === 'www.') {\n href = 'http://' + cap[0];\n } else {\n href = cap[0];\n }\n }\n return {\n type: 'link',\n raw: cap[0],\n text,\n href,\n tokens: [\n {\n type: 'text',\n raw: text,\n text,\n },\n ],\n };\n }\n }\n\n inlineText(src: string): Tokens.Text | undefined {\n const cap = this.rules.inline.text.exec(src);\n if (cap) {\n const escaped = this.lexer.state.inRawBlock;\n return {\n type: 'text',\n raw: cap[0],\n text: cap[0],\n escaped,\n };\n }\n }\n}\n", "import { _Tokenizer } from './Tokenizer.ts';\nimport { _defaults } from './defaults.ts';\nimport { other, block, inline } from './rules.ts';\nimport type { Token, TokensList, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Block Lexer\n */\nexport class _Lexer<ParserOutput = string, RendererOutput = string> {\n tokens: TokensList;\n options: MarkedOptions<ParserOutput, RendererOutput>;\n state: {\n inLink: boolean;\n inRawBlock: boolean;\n /** a link was produced in the inline run currently being scanned */\n linkEmitted: boolean;\n top: boolean;\n };\n\n public inlineQueue: { src: string, tokens: Token[] }[];\n\n private tokenizer: _Tokenizer<ParserOutput, RendererOutput>;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n // TokenList cannot be created in one go\n this.tokens = [] as unknown as TokensList;\n this.tokens.links = Object.create(null);\n this.options = options || _defaults;\n this.options.tokenizer = this.options.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>();\n this.tokenizer = this.options.tokenizer;\n this.tokenizer.options = this.options;\n this.tokenizer.lexer = this;\n this.inlineQueue = [];\n this.state = {\n inLink: false,\n inRawBlock: false,\n linkEmitted: false,\n top: true,\n };\n\n const rules = {\n other,\n block: block.normal,\n inline: inline.normal,\n };\n\n if (this.options.pedantic) {\n rules.block = block.pedantic;\n rules.inline = inline.pedantic;\n } else if (this.options.gfm) {\n rules.block = block.gfm;\n if (this.options.breaks) {\n rules.inline = inline.breaks;\n } else {\n rules.inline = inline.gfm;\n }\n }\n this.tokenizer.rules = rules;\n }\n\n /**\n * Expose Rules\n */\n static get rules() {\n return {\n block,\n inline,\n };\n }\n\n /**\n * Static Lex Method\n */\n static lex<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.lex(src);\n }\n\n /**\n * Static Lex Inline Method\n */\n static lexInline<ParserOutput = string, RendererOutput = string>(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const lexer = new _Lexer<ParserOutput, RendererOutput>(options);\n return lexer.inlineTokens(src);\n }\n\n /**\n * Preprocessing\n */\n lex(src: string) {\n src = src.replace(other.carriageReturn, '\\n');\n\n this.blockTokens(src, this.tokens);\n\n for (let i = 0; i < this.inlineQueue.length; i++) {\n const next = this.inlineQueue[i];\n this.inlineTokens(next.src, next.tokens);\n }\n this.inlineQueue = [];\n\n return this.tokens;\n }\n\n /**\n * Lexing\n */\n blockTokens(src: string, tokens?: Token[], lastParagraphClipped?: boolean): Token[];\n blockTokens(src: string, tokens?: TokensList, lastParagraphClipped?: boolean): TokensList;\n blockTokens(src: string, tokens: Token[] = [], lastParagraphClipped = false) {\n this.tokenizer.lexer = this;\n if (this.options.pedantic) {\n src = src.replace(other.tabCharGlobal, ' ').replace(other.spaceLine, '');\n }\n\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n let token: Tokens.Generic | undefined;\n\n if (this.options.extensions?.block?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // newline\n if (token = this.tokenizer.space(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.raw.length === 1 && lastToken !== undefined) {\n // if there's a single \\n as a spacer, it's terminating the last line,\n // so move it there so that we don't get unnecessary paragraph tags\n lastToken.raw += '\\n';\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // code\n if (token = this.tokenizer.code(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // fences\n if (token = this.tokenizer.fences(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // heading\n if (token = this.tokenizer.heading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // hr\n if (token = this.tokenizer.hr(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // blockquote\n if (token = this.tokenizer.blockquote(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // list\n if (token = this.tokenizer.list(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // html\n if (token = this.tokenizer.html(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // def\n if (token = this.tokenizer.def(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'paragraph' || lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.raw;\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else if (!this.tokens.links[token.tag]) {\n this.tokens.links[token.tag] = {\n href: token.href,\n title: token.title,\n };\n tokens.push(token);\n }\n continue;\n }\n\n // table (gfm)\n if (token = this.tokenizer.table(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // lheading\n if (token = this.tokenizer.lheading(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // top-level paragraph\n // prevent paragraph consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startBlock) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startBlock.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n const lastToken = tokens.at(-1);\n if (lastParagraphClipped && lastToken?.type === 'paragraph') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n lastParagraphClipped = cutSrc.length !== src.length;\n src = src.substring(token.raw.length);\n continue;\n }\n\n // text\n if (token = this.tokenizer.text(src)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += (lastToken.raw.endsWith('\\n') ? '' : '\\n') + token.raw;\n lastToken.text += '\\n' + token.text;\n this.inlineQueue.pop();\n this.inlineQueue.at(-1)!.src = lastToken.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n this.state.top = true;\n return tokens;\n }\n\n inline(src: string, tokens: Token[] = []) {\n this.inlineQueue.push({ src, tokens });\n return tokens;\n }\n\n /**\n * Does this link text hold a link already? An image does not count: an image\n * may hold a link, a link may not.\n */\n private linkInText(text: string): boolean {\n if (!text.includes('[')) {\n return false;\n }\n\n const linkRule = this.tokenizer.rules.inline.link;\n for (const match of text.matchAll(this.tokenizer.rules.inline.blockSkip)) {\n // blockSkip also matches code spans and html, and the `!` of an image is\n // left out of the match, so read the character before it.\n if (linkRule.test(match[0]) && text.charAt(match.index - 1) !== '!') {\n return true;\n }\n }\n\n for (const match of text.matchAll(this.tokenizer.rules.inline.reflinkSearch)) {\n const match0 = match[0];\n const refStart = match0.lastIndexOf('[');\n if (match0.charAt(0) === '!' || !Object.hasOwn(this.tokens.links, match0.slice(refStart + 1, -1))) {\n continue;\n }\n // a candidate holding a link is not a link either, so it does not count\n if (refStart > 1 && this.linkInText(match0.slice(1, refStart - 1))) {\n continue;\n }\n return true;\n }\n\n return false;\n }\n\n /**\n * Lexing/Compiling\n */\n inlineTokens(src: string, tokens: Token[] = []): Token[] {\n this.tokenizer.lexer = this;\n // String with links masked to avoid interference with em and strong\n let maskedSrc = src;\n\n // Mask out reflinks\n if (this.tokens.links && src.includes('[')) {\n const reflinkSearch = this.tokenizer.rules.inline.reflinkSearch;\n const maskReflink = (match0: string): string => {\n const refStart = match0.lastIndexOf('[');\n if (!Object.hasOwn(this.tokens.links, match0.slice(refStart + 1, -1))) {\n return match0;\n }\n // CommonMark: \"Links may not contain other links, at any level of\n // nesting.\" A candidate whose text already holds one never becomes a\n // link, so flattening the whole span would hide the emphasis that\n // does still apply inside it. Mask the links it holds instead.\n // Images are exempt: their text is flattened into an alt attribute.\n if (refStart > 1 && match0.charAt(0) !== '!') {\n const text = match0.slice(1, refStart - 1);\n if (this.linkInText(text)) {\n return '[' + text.replace(reflinkSearch, maskReflink)\n + '][' + 'a'.repeat(match0.length - refStart - 2) + ']';\n }\n }\n return '[' + 'a'.repeat(match0.length - 2) + ']';\n };\n maskedSrc = maskedSrc.replace(reflinkSearch, maskReflink);\n }\n\n // Mask out escaped characters.\n // Every mask must keep the length it replaces: emStrong and del line\n // maskedSrc up with src by slicing from the end. `anyPunctuation` matches\n // unicode punctuation, so an escaped astral character is 3 code units.\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.anyPunctuation, match0 => '+'.repeat(match0.length));\n\n // Mask out other blocks\n maskedSrc = maskedSrc.replace(this.tokenizer.rules.inline.blockSkip, (match0, _link, context) => {\n const offset = context ? context.length : 0;\n return match0.slice(0, offset) + '[' + 'a'.repeat(match0.length - offset - 2) + ']';\n });\n\n // Mask out blocks from extensions\n maskedSrc = this.options.hooks?.emStrongMask?.call({ lexer: this }, maskedSrc) ?? maskedSrc;\n\n let keepPrevChar = false;\n let prevChar = '';\n let srcLength = Infinity;\n while (src) {\n if (src.length < srcLength) {\n srcLength = src.length;\n } else {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n\n if (!keepPrevChar) {\n prevChar = '';\n }\n keepPrevChar = false;\n\n let token: Tokens.Generic | undefined;\n\n // extensions\n if (this.options.extensions?.inline?.some((extTokenizer) => {\n if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n return true;\n }\n return false;\n })) {\n continue;\n }\n\n // escape\n if (token = this.tokenizer.escape(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // tag\n if (token = this.tokenizer.tag(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // link\n if (token = this.tokenizer.link(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // reflink, nolink\n if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n src = src.substring(token.raw.length);\n const lastToken = tokens.at(-1);\n if (token.type === 'text' && lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n // em & strong\n if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // code\n if (token = this.tokenizer.codespan(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // br\n if (token = this.tokenizer.br(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // del (gfm)\n if (token = this.tokenizer.del(src, maskedSrc, prevChar)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // autolink\n if (token = this.tokenizer.autolink(src)) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // url (gfm)\n if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n src = src.substring(token.raw.length);\n tokens.push(token);\n continue;\n }\n\n // text\n // prevent inlineText consuming extensions by clipping 'src' to extension start\n let cutSrc = src;\n if (this.options.extensions?.startInline) {\n let startIndex = Infinity;\n const tempSrc = src.slice(1);\n let tempStart;\n this.options.extensions.startInline.forEach((getStartIndex) => {\n tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n if (typeof tempStart === 'number' && tempStart >= 0) {\n startIndex = Math.min(startIndex, tempStart);\n }\n });\n if (startIndex < Infinity && startIndex >= 0) {\n cutSrc = src.substring(0, startIndex + 1);\n }\n }\n if (token = this.tokenizer.inlineText(cutSrc)) {\n src = src.substring(token.raw.length);\n if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n prevChar = token.raw.slice(-1);\n }\n keepPrevChar = true;\n const lastToken = tokens.at(-1);\n if (lastToken?.type === 'text') {\n lastToken.raw += token.raw;\n lastToken.text += token.text;\n } else {\n tokens.push(token);\n }\n continue;\n }\n\n if (src) {\n this.infiniteLoopError(src.charCodeAt(0));\n break;\n }\n }\n\n return tokens;\n }\n\n private infiniteLoopError(byte: number) {\n const errMsg = 'Infinite loop on byte: ' + byte;\n if (this.options.silent) {\n console.error(errMsg);\n } else {\n throw new Error(errMsg);\n }\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport {\n cleanUrl,\n escapeHtmlEntities,\n} from './helpers.ts';\nimport { other } from './rules.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Tokens } from './Tokens.ts';\nimport type { _Parser } from './Parser.ts';\n\n/**\n * Renderer\n */\nexport class _Renderer<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n parser!: _Parser<ParserOutput, RendererOutput>; // set by the parser\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n space(token: Tokens.Space): RendererOutput {\n return '' as RendererOutput;\n }\n\n code({ text, lang, escaped }: Tokens.Code): RendererOutput {\n const langString = (lang || '').match(other.notSpaceStart)?.[0];\n\n const code = text.replace(other.endingNewline, '') + '\\n';\n\n if (!langString) {\n return '<pre><code>'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n return '<pre><code class=\"language-'\n + escapeHtmlEntities(langString)\n + '\">'\n + (escaped ? code : escapeHtmlEntities(code, true))\n + '</code></pre>\\n' as RendererOutput;\n }\n\n blockquote({ tokens }: Tokens.Blockquote): RendererOutput {\n const body = this.parser.parse(tokens);\n return `<blockquote>\\n${body}</blockquote>\\n` as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n def(token: Tokens.Def): RendererOutput {\n return '' as RendererOutput;\n }\n\n heading({ tokens, depth }: Tokens.Heading): RendererOutput {\n return `<h${depth}>${this.parser.parseInline(tokens)}</h${depth}>\\n` as RendererOutput;\n }\n\n hr(token: Tokens.Hr): RendererOutput {\n return '<hr>\\n' as RendererOutput;\n }\n\n list(token: Tokens.List): RendererOutput {\n const ordered = token.ordered;\n const start = token.start;\n\n let body = '';\n for (let j = 0; j < token.items.length; j++) {\n const item = token.items[j];\n body += this.listitem(item);\n }\n\n const type = ordered ? 'ol' : 'ul';\n const startAttr = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startAttr + '>\\n' + body + '</' + type + '>\\n' as RendererOutput;\n }\n\n listitem(item: Tokens.ListItem): RendererOutput {\n return `<li>${this.parser.parse(item.tokens)}</li>\\n` as RendererOutput;\n }\n\n checkbox({ checked }: Tokens.Checkbox): RendererOutput {\n return '<input '\n + (checked ? 'checked=\"\" ' : '')\n + 'disabled=\"\" type=\"checkbox\"> ' as RendererOutput;\n }\n\n paragraph({ tokens }: Tokens.Paragraph): RendererOutput {\n return `<p>${this.parser.parseInline(tokens)}</p>\\n` as RendererOutput;\n }\n\n table(token: Tokens.Table): RendererOutput {\n let header = '';\n\n // header\n let cell = '';\n for (let j = 0; j < token.header.length; j++) {\n cell += this.tablecell(token.header[j]);\n }\n header += this.tablerow({ text: cell as ParserOutput });\n\n let body = '';\n for (let j = 0; j < token.rows.length; j++) {\n const row = token.rows[j];\n\n cell = '';\n for (let k = 0; k < row.length; k++) {\n cell += this.tablecell(row[k]);\n }\n\n body += this.tablerow({ text: cell as ParserOutput });\n }\n if (body) body = `<tbody>${body}</tbody>`;\n\n return '<table>\\n'\n + '<thead>\\n'\n + header\n + '</thead>\\n'\n + body\n + '</table>\\n' as RendererOutput;\n }\n\n tablerow({ text }: Tokens.TableRow<ParserOutput>): RendererOutput {\n return `<tr>\\n${text}</tr>\\n` as RendererOutput;\n }\n\n tablecell(token: Tokens.TableCell): RendererOutput {\n const content = this.parser.parseInline(token.tokens);\n const type = token.header ? 'th' : 'td';\n const tag = token.align\n ? `<${type} align=\"${token.align}\">`\n : `<${type}>`;\n return tag + content + `</${type}>\\n` as RendererOutput;\n }\n\n /**\n * span level renderer\n */\n strong({ tokens }: Tokens.Strong): RendererOutput {\n return `<strong>${this.parser.parseInline(tokens)}</strong>` as RendererOutput;\n }\n\n em({ tokens }: Tokens.Em): RendererOutput {\n return `<em>${this.parser.parseInline(tokens)}</em>` as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return `<code>${escapeHtmlEntities(text, true)}</code>` as RendererOutput;\n }\n\n br(token: Tokens.Br): RendererOutput {\n return '<br>' as RendererOutput;\n }\n\n del({ tokens }: Tokens.Del): RendererOutput {\n return `<del>${this.parser.parseInline(tokens)}</del>` as RendererOutput;\n }\n\n link({ href, title, tokens }: Tokens.Link): RendererOutput {\n const text = this.parser.parseInline(tokens) as string;\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return text as RendererOutput;\n }\n href = cleanHref;\n let out = '<a href=\"' + href + '\"';\n if (title) {\n out += ' title=\"' + (escapeHtmlEntities(title)) + '\"';\n }\n out += '>' + text + '</a>';\n return out as RendererOutput;\n }\n\n image({ href, title, text, tokens }: Tokens.Image): RendererOutput {\n if (tokens) {\n text = this.parser.parseInline(tokens, this.parser.textRenderer) as string;\n }\n const cleanHref = cleanUrl(href);\n if (cleanHref === null) {\n return escapeHtmlEntities(text) as RendererOutput;\n }\n href = cleanHref;\n\n let out = `<img src=\"${href}\" alt=\"${escapeHtmlEntities(text)}\"`;\n if (title) {\n out += ` title=\"${escapeHtmlEntities(title)}\"`;\n }\n out += '>';\n return out as RendererOutput;\n }\n\n text(token: Tokens.Text | Tokens.Escape): RendererOutput {\n return 'tokens' in token && token.tokens\n ? this.parser.parseInline(token.tokens) as unknown as RendererOutput\n : ('escaped' in token && token.escaped ? token.text as RendererOutput : escapeHtmlEntities(token.text) as RendererOutput);\n }\n}\n", "import type { Tokens } from './Tokens.ts';\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nexport class _TextRenderer<RendererOutput = string> {\n // no need for block level renderers\n strong({ text }: Tokens.Strong): RendererOutput {\n return text as RendererOutput;\n }\n\n em({ text }: Tokens.Em): RendererOutput {\n return text as RendererOutput;\n }\n\n codespan({ text }: Tokens.Codespan): RendererOutput {\n return text as RendererOutput;\n }\n\n del({ text }: Tokens.Del): RendererOutput {\n return text as RendererOutput;\n }\n\n html({ text }: Tokens.HTML | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n text({ text }: Tokens.Text | Tokens.Escape | Tokens.Tag): RendererOutput {\n return text as RendererOutput;\n }\n\n link({ text }: Tokens.Link): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n image({ text }: Tokens.Image): RendererOutput {\n return '' + text as RendererOutput;\n }\n\n br(): RendererOutput {\n return '' as RendererOutput;\n }\n\n checkbox({ raw }: Tokens.Checkbox): RendererOutput {\n return raw as RendererOutput;\n }\n}\n", "import { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _defaults } from './defaults.ts';\nimport type { MarkedToken, Token, Tokens } from './Tokens.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\n\n/**\n * Parsing & Compiling\n */\nexport class _Parser<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n renderer: _Renderer<ParserOutput, RendererOutput>;\n textRenderer: _TextRenderer<RendererOutput>;\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n this.options.renderer = this.options.renderer || new _Renderer<ParserOutput, RendererOutput>();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.renderer.parser = this;\n this.textRenderer = new _TextRenderer<RendererOutput>();\n }\n\n /**\n * Static Parse Method\n */\n static parse<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parse(tokens);\n }\n\n /**\n * Static Parse Inline Method\n */\n static parseInline<ParserOutput = string, RendererOutput = string>(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n const parser = new _Parser<ParserOutput, RendererOutput>(options);\n return parser.parseInline(tokens);\n }\n\n /**\n * Parse Loop\n */\n parse(tokens: Token[]): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const genericToken = anyToken as Tokens.Generic;\n const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'checkbox', 'html', 'def', 'paragraph', 'text'].includes(genericToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'space': {\n out += this.renderer.space(token);\n break;\n }\n case 'hr': {\n out += this.renderer.hr(token);\n break;\n }\n case 'heading': {\n out += this.renderer.heading(token);\n break;\n }\n case 'code': {\n out += this.renderer.code(token);\n break;\n }\n case 'table': {\n out += this.renderer.table(token);\n break;\n }\n case 'blockquote': {\n out += this.renderer.blockquote(token);\n break;\n }\n case 'list': {\n out += this.renderer.list(token);\n break;\n }\n case 'checkbox': {\n out += this.renderer.checkbox(token);\n break;\n }\n case 'html': {\n out += this.renderer.html(token);\n break;\n }\n case 'def': {\n out += this.renderer.def(token);\n break;\n }\n case 'paragraph': {\n out += this.renderer.paragraph(token);\n break;\n }\n case 'text': {\n out += this.renderer.text(token);\n break;\n }\n\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n\n return out as ParserOutput;\n }\n\n /**\n * Parse Inline Tokens\n */\n parseInline(tokens: Token[], renderer: _Renderer<ParserOutput, RendererOutput> | _TextRenderer<RendererOutput> = this.renderer): ParserOutput {\n this.renderer.parser = this;\n let out = '';\n\n for (let i = 0; i < tokens.length; i++) {\n const anyToken = tokens[i];\n\n // Run any renderer extensions\n if (this.options.extensions?.renderers?.[anyToken.type]) {\n const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken);\n if (ret !== false || !['escape', 'html', 'link', 'image', 'checkbox', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) {\n out += ret || '';\n continue;\n }\n }\n\n const token = anyToken as MarkedToken;\n\n switch (token.type) {\n case 'escape': {\n out += renderer.text(token);\n break;\n }\n case 'html': {\n out += renderer.html(token);\n break;\n }\n case 'link': {\n out += renderer.link(token);\n break;\n }\n case 'image': {\n out += renderer.image(token);\n break;\n }\n case 'checkbox': {\n out += renderer.checkbox(token);\n break;\n }\n case 'strong': {\n out += renderer.strong(token);\n break;\n }\n case 'em': {\n out += renderer.em(token);\n break;\n }\n case 'codespan': {\n out += renderer.codespan(token);\n break;\n }\n case 'br': {\n out += renderer.br(token);\n break;\n }\n case 'del': {\n out += renderer.del(token);\n break;\n }\n case 'text': {\n out += renderer.text(token);\n break;\n }\n default: {\n const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n if (this.options.silent) {\n console.error(errMsg);\n return '' as ParserOutput;\n } else {\n throw new Error(errMsg);\n }\n }\n }\n }\n return out as ParserOutput;\n }\n}\n", "import { _defaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport type { MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\n\nexport class _Hooks<ParserOutput = string, RendererOutput = string> {\n options: MarkedOptions<ParserOutput, RendererOutput>;\n block?: boolean;\n\n constructor(options?: MarkedOptions<ParserOutput, RendererOutput>) {\n this.options = options || _defaults;\n }\n\n static passThroughHooks = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n 'emStrongMask',\n ]);\n\n static passThroughHooksRespectAsync = new Set([\n 'preprocess',\n 'postprocess',\n 'processAllTokens',\n ]);\n\n /**\n * Process markdown before marked\n */\n preprocess(markdown: string) {\n return markdown;\n }\n\n /**\n * Process HTML after marked is finished\n */\n postprocess(html: ParserOutput) {\n return html;\n }\n\n /**\n * Process all tokens before walk tokens\n */\n processAllTokens(tokens: Token[] | TokensList) {\n return tokens;\n }\n\n /**\n * Mask contents that should not be interpreted as em/strong delimiters\n */\n emStrongMask(src: string) {\n return src;\n }\n\n /**\n * Provide function to tokenize markdown\n */\n provideLexer(block = this.block) {\n return block ? _Lexer.lex : _Lexer.lexInline;\n }\n\n /**\n * Provide function to parse tokens\n */\n provideParser(block = this.block) {\n return block ? _Parser.parse<ParserOutput, RendererOutput> : _Parser.parseInline<ParserOutput, RendererOutput>;\n }\n}\n", "import { _getDefaults } from './defaults.ts';\nimport { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { escapeHtmlEntities } from './helpers.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, Tokens, TokensList } from './Tokens.ts';\n\nexport type MaybePromise = void | Promise<void>;\n\ntype UnknownFunction = (...args: unknown[]) => unknown;\ntype GenericRendererFunction = (...args: unknown[]) => string | false;\n\nexport class Marked<ParserOutput = string, RendererOutput = string> {\n defaults = _getDefaults<ParserOutput, RendererOutput>();\n options = this.setOptions;\n\n /**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parse = this.parseMarkdown(true);\n\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a separate `Marked`\n * instance and use `Marked#use` instead of passing them on each call.\n */\n parseInline = this.parseMarkdown(false);\n\n Parser = _Parser<ParserOutput, RendererOutput>;\n Renderer = _Renderer<ParserOutput, RendererOutput>;\n TextRenderer = _TextRenderer<RendererOutput>;\n Lexer = _Lexer;\n Tokenizer = _Tokenizer<ParserOutput, RendererOutput>;\n Hooks = _Hooks<ParserOutput, RendererOutput>;\n\n constructor(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n this.use(...args);\n }\n\n /**\n * Run callback for every token\n */\n walkTokens(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n let values: MaybePromise[] = [];\n for (const token of tokens) {\n values = values.concat(callback.call(this, token));\n switch (token.type) {\n case 'table': {\n const tableToken = token as Tokens.Table;\n for (const cell of tableToken.header) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n for (const row of tableToken.rows) {\n for (const cell of row) {\n values = values.concat(this.walkTokens(cell.tokens, callback));\n }\n }\n break;\n }\n case 'list': {\n const listToken = token as Tokens.List;\n values = values.concat(this.walkTokens(listToken.items, callback));\n break;\n }\n default: {\n const genericToken = token as Tokens.Generic;\n if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n const tokens = genericToken[childTokens].flat(Infinity) as Token[] | TokensList;\n values = values.concat(this.walkTokens(tokens, callback));\n });\n } else if (genericToken.tokens) {\n values = values.concat(this.walkTokens(genericToken.tokens, callback));\n }\n }\n }\n }\n return values;\n }\n\n /**\n * Registers extensions with this Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this method when supplying only some hook methods.\n */\n use(...args: MarkedExtension<ParserOutput, RendererOutput>[]) {\n const extensions: MarkedOptions<ParserOutput, RendererOutput>['extensions'] = this.defaults.extensions || { renderers: {}, childTokens: {} };\n\n args.forEach((pack) => {\n // copy options to new object\n const opts = { ...pack } as MarkedOptions<ParserOutput, RendererOutput>;\n\n // set async to true if it was set to true before\n opts.async = this.defaults.async || opts.async || false;\n\n // ==-- Parse \"addon\" extensions --== //\n if (pack.extensions) {\n pack.extensions.forEach((ext) => {\n if (!ext.name) {\n throw new Error('extension name required');\n }\n if ('renderer' in ext) { // Renderer extensions\n const prevRenderer = extensions.renderers[ext.name];\n if (prevRenderer) {\n // Replace extension with func to run new extension but fall back if false\n extensions.renderers[ext.name] = function(...args) {\n let ret = ext.renderer.apply(this, args);\n if (ret === false) {\n ret = prevRenderer.apply(this, args);\n }\n return ret;\n };\n } else {\n extensions.renderers[ext.name] = ext.renderer;\n }\n }\n if ('tokenizer' in ext) { // Tokenizer Extensions\n if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n throw new Error(\"extension level must be 'block' or 'inline'\");\n }\n const extLevel = extensions[ext.level];\n if (extLevel) {\n extLevel.unshift(ext.tokenizer);\n } else {\n extensions[ext.level] = [ext.tokenizer];\n }\n if (ext.start) { // Function to check for start of token\n if (ext.level === 'block') {\n if (extensions.startBlock) {\n extensions.startBlock.push(ext.start);\n } else {\n extensions.startBlock = [ext.start];\n }\n } else if (ext.level === 'inline') {\n if (extensions.startInline) {\n extensions.startInline.push(ext.start);\n } else {\n extensions.startInline = [ext.start];\n }\n }\n }\n }\n if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n extensions.childTokens[ext.name] = ext.childTokens;\n }\n });\n opts.extensions = extensions;\n }\n\n // ==-- Parse \"overwrite\" extensions --== //\n if (pack.renderer) {\n const renderer = this.defaults.renderer || new _Renderer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.renderer) {\n if (!(prop in renderer)) {\n throw new Error(`renderer '${prop}' does not exist`);\n }\n if (['options', 'parser'].includes(prop)) {\n // ignore options property\n continue;\n }\n const rendererProp = prop as Exclude<keyof _Renderer<ParserOutput, RendererOutput>, 'options' | 'parser'>;\n const rendererFunc = pack.renderer[rendererProp] as GenericRendererFunction;\n const prevRenderer = renderer[rendererProp] as GenericRendererFunction;\n // Replace renderer with func to run extension, but fall back if false\n renderer[rendererProp] = (...args: unknown[]) => {\n let ret = rendererFunc.apply(renderer, args);\n if (ret === false) {\n ret = prevRenderer.apply(renderer, args);\n }\n return (ret || '') as RendererOutput;\n };\n }\n opts.renderer = renderer;\n }\n if (pack.tokenizer) {\n const tokenizer = this.defaults.tokenizer || new _Tokenizer<ParserOutput, RendererOutput>(this.defaults);\n for (const prop in pack.tokenizer) {\n if (!(prop in tokenizer)) {\n throw new Error(`tokenizer '${prop}' does not exist`);\n }\n if (['options', 'rules', 'lexer'].includes(prop)) {\n // ignore options, rules, and lexer properties\n continue;\n }\n const tokenizerProp = prop as Exclude<keyof _Tokenizer<ParserOutput, RendererOutput>, 'options' | 'rules' | 'lexer'>;\n const tokenizerFunc = pack.tokenizer[tokenizerProp] as UnknownFunction;\n const prevTokenizer = tokenizer[tokenizerProp] as UnknownFunction;\n // Replace tokenizer with func to run extension, but fall back if false\n // @ts-expect-error cannot type tokenizer function dynamically\n tokenizer[tokenizerProp] = (...args: unknown[]) => {\n let ret = tokenizerFunc.apply(tokenizer, args);\n if (ret === false) {\n ret = prevTokenizer.apply(tokenizer, args);\n }\n return ret;\n };\n }\n opts.tokenizer = tokenizer;\n }\n\n // ==-- Parse Hooks extensions --== //\n if (pack.hooks) {\n const hooks = this.defaults.hooks || new _Hooks<ParserOutput, RendererOutput>();\n for (const prop in pack.hooks) {\n if (!(prop in hooks)) {\n throw new Error(`hook '${prop}' does not exist`);\n }\n if (['options', 'block'].includes(prop)) {\n // ignore options and block properties\n continue;\n }\n const hooksProp = prop as Exclude<keyof _Hooks<ParserOutput, RendererOutput>, 'options' | 'block'>;\n const hooksFunc = pack.hooks[hooksProp] as UnknownFunction;\n const prevHook = hooks[hooksProp] as UnknownFunction;\n if (_Hooks.passThroughHooks.has(prop)) {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (arg: unknown) => {\n if (this.defaults.async && _Hooks.passThroughHooksRespectAsync.has(prop)) {\n return (async() => {\n const ret = await hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n })();\n }\n\n const ret = hooksFunc.call(hooks, arg);\n return prevHook.call(hooks, ret);\n };\n } else {\n // @ts-expect-error cannot type hook function dynamically\n hooks[hooksProp] = (...args: unknown[]) => {\n if (this.defaults.async) {\n return (async() => {\n let ret = await hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = await prevHook.apply(hooks, args);\n }\n return ret;\n })();\n }\n\n let ret = hooksFunc.apply(hooks, args);\n if (ret === false) {\n ret = prevHook.apply(hooks, args);\n }\n return ret;\n };\n }\n }\n opts.hooks = hooks;\n }\n\n // ==-- Parse WalkTokens extensions --== //\n if (pack.walkTokens) {\n const walkTokens = this.defaults.walkTokens;\n const packWalktokens = pack.walkTokens;\n opts.walkTokens = function(token) {\n let values: MaybePromise[] = [];\n values.push(packWalktokens.call(this, token));\n if (walkTokens) {\n values = values.concat(walkTokens.call(this, token));\n }\n return values;\n };\n }\n\n this.defaults = { ...this.defaults, ...opts };\n });\n\n return this;\n }\n\n setOptions(opt: MarkedOptions<ParserOutput, RendererOutput>) {\n this.defaults = { ...this.defaults, ...opt };\n return this;\n }\n\n lexer(src: string, options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Lexer.lex(src, options ?? this.defaults);\n }\n\n parser(tokens: Token[], options?: MarkedOptions<ParserOutput, RendererOutput>) {\n return _Parser.parse<ParserOutput, RendererOutput>(tokens, options ?? this.defaults);\n }\n\n private parseMarkdown(blockType: boolean) {\n type overloadedParse = {\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: true }): Promise<ParserOutput>;\n (src: string, options: MarkedOptions<ParserOutput, RendererOutput> & { async: false }): ParserOutput;\n (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): ParserOutput | Promise<ParserOutput>;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const parse: overloadedParse = (src: string, options?: MarkedOptions<ParserOutput, RendererOutput> | null): any => {\n const origOpt = { ...options };\n const opt = { ...this.defaults, ...origOpt };\n\n const throwError = this.onError(!!opt.silent, !!opt.async);\n\n // throw error if an extension set async to true but parse was called with async: false\n if (this.defaults.async === true && origOpt.async === false) {\n return throwError(new Error('marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.'));\n }\n\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n return throwError(new Error('marked(): input parameter is undefined or null'));\n }\n if (typeof src !== 'string') {\n return throwError(new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected'));\n }\n\n if (opt.hooks) {\n opt.hooks.options = opt;\n opt.hooks.block = blockType;\n }\n\n if (opt.async) {\n return (async() => {\n const processedSrc = opt.hooks ? await opt.hooks.preprocess(src) : src;\n const lexer = opt.hooks ? await opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n const tokens = await lexer(processedSrc, opt);\n const processedTokens = opt.hooks ? await opt.hooks.processAllTokens(tokens) : tokens;\n if (opt.walkTokens) {\n await Promise.all(this.walkTokens(processedTokens, opt.walkTokens));\n }\n const parser = opt.hooks ? await opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n const html = await parser(processedTokens, opt);\n return opt.hooks ? await opt.hooks.postprocess(html) : html;\n })().catch(throwError);\n }\n\n try {\n if (opt.hooks) {\n src = opt.hooks.preprocess(src) as string;\n }\n const lexer = opt.hooks ? opt.hooks.provideLexer(blockType) : (blockType ? _Lexer.lex : _Lexer.lexInline);\n let tokens = lexer(src, opt);\n if (opt.hooks) {\n tokens = opt.hooks.processAllTokens(tokens);\n }\n if (opt.walkTokens) {\n this.walkTokens(tokens, opt.walkTokens);\n }\n const parser = opt.hooks ? opt.hooks.provideParser(blockType) : (blockType ? _Parser.parse : _Parser.parseInline);\n let html = parser(tokens, opt);\n if (opt.hooks) {\n html = opt.hooks.postprocess(html);\n }\n return html;\n } catch(e) {\n return throwError(e as Error);\n }\n };\n\n return parse;\n }\n\n private onError(silent: boolean, async: boolean) {\n return (e: Error): string | Promise<string> => {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n\n if (silent) {\n const msg = '<p>An error occurred:</p><pre>'\n + escapeHtmlEntities(e.message + '', true)\n + '</pre>';\n if (async) {\n return Promise.resolve(msg);\n }\n return msg;\n }\n\n if (async) {\n return Promise.reject(e);\n }\n throw e;\n };\n }\n}\n", "import { _Lexer } from './Lexer.ts';\nimport { _Parser } from './Parser.ts';\nimport { _Tokenizer } from './Tokenizer.ts';\nimport { _Renderer } from './Renderer.ts';\nimport { _TextRenderer } from './TextRenderer.ts';\nimport { _Hooks } from './Hooks.ts';\nimport { Marked } from './Instance.ts';\nimport {\n _getDefaults,\n changeDefaults,\n _defaults,\n} from './defaults.ts';\nimport type { MarkedExtension, MarkedOptions } from './MarkedOptions.ts';\nimport type { Token, TokensList } from './Tokens.ts';\nimport type { MaybePromise } from './Instance.ts';\n\nconst markedInstance = new Marked();\n\n/**\n * Compiles markdown to HTML asynchronously.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options, having async: true\n * @return Promise of string of compiled HTML\n */\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\n\n/**\n * Compiles markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Optional hash of options\n * @return String of compiled HTML. Will be a Promise of string if async is set to true by any extensions.\n */\nexport function marked(src: string, options: MarkedOptions & { async: false }): string;\nexport function marked(src: string, options: MarkedOptions & { async: true }): Promise<string>;\nexport function marked(src: string, options?: MarkedOptions | null): string | Promise<string>;\nexport function marked(src: string, opt?: MarkedOptions | null): string | Promise<string> {\n return markedInstance.parse(src, opt);\n}\n\nexport declare namespace marked {\n /**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\n let parseInline: typeof markedInstance.parseInline;\n\n /**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n */\n let use: (...args: MarkedExtension[]) => typeof marked;\n}\n\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n marked.setOptions = function(options: MarkedOptions) {\n markedInstance.setOptions(options);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n };\n\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\n\nmarked.defaults = _defaults;\n\n/**\n * Registers extensions with the default Marked instance.\n *\n * The `renderer`, `tokenizer`, and `hooks` objects may each contain only the\n * methods that should be overridden. Their methods are merged with built-in\n * behavior and extensions registered by earlier calls.\n *\n * Use this function when supplying only some hook methods.\n *\n * @param args Extensions to register\n * @return The `marked` function\n */\nfunction useExtension(...args: MarkedExtension[]) {\n markedInstance.use(...args);\n marked.defaults = markedInstance.defaults;\n changeDefaults(marked.defaults);\n return marked;\n}\n\nmarked.use = useExtension;\n\n/**\n * Run callback for every token\n */\n\nmarked.walkTokens = function(tokens: Token[] | TokensList, callback: (token: Token) => MaybePromise | MaybePromise[]) {\n return markedInstance.walkTokens(tokens, callback);\n};\n\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\n\nexport const options = marked.options;\nexport const setOptions = marked.setOptions;\nexport const walkTokens = marked.walkTokens;\n/**\n * Compiles inline markdown to HTML.\n *\n * To configure hooks, a renderer, or a tokenizer, create a `Marked` instance\n * and use `Marked#use` instead of passing them as options on each call.\n */\nexport const parseInline = marked.parseInline;\nexport const parse = marked;\nexport const parser = _Parser.parse;\nexport const lexer = _Lexer.lex;\nexport { _defaults as defaults, _getDefaults as getDefaults } from './defaults.ts';\nexport { _Lexer as Lexer } from './Lexer.ts';\nexport { _Parser as Parser } from './Parser.ts';\nexport { _Tokenizer as Tokenizer } from './Tokenizer.ts';\nexport { _Renderer as Renderer } from './Renderer.ts';\nexport { _TextRenderer as TextRenderer } from './TextRenderer.ts';\nexport { _Hooks as Hooks } from './Hooks.ts';\nexport { Marked } from './Instance.ts';\nexport { useExtension as use };\nexport type * from './MarkedOptions.ts';\nexport type * from './Tokens.ts';\n", "import { lexer, type Token, type Tokens } from \"marked\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport type { Component, RenderResult, RenderSize } from \"./component.js\";\nimport { sanitizeTerminalText } from \"./text.js\";\nimport { renderTextDocument, type TextDocumentLine } from \"./text-selection.js\";\nimport {\n DEFAULT_DARK_THEME,\n styleText,\n type MarkdownTheme,\n type TextStyle,\n} from \"./theme.js\";\n\nexport interface MarkdownOptions {\n readonly colors?: boolean;\n readonly theme?: MarkdownTheme;\n readonly sourceId?: string;\n}\n\n/** Safe terminal Markdown rendering backed by Marked's lexer, not its HTML output. */\nexport class Markdown implements Component {\n constructor(\n private readonly value: string | (() => string),\n private readonly options: MarkdownOptions = {},\n ) {}\n\n render(size: RenderSize): RenderResult {\n const source = typeof this.value === \"function\" ? this.value() : this.value;\n return renderTextDocument(markdownDocument(source, this.options), size, this.options);\n }\n}\n\nexport function renderTerminalMarkdown(\n source: string,\n options: MarkdownOptions = {},\n): string {\n return markdownDocument(source, options).map(line => line.value).join(\"\\n\");\n}\n\nfunction markdownDocument(source: string, options: MarkdownOptions): TextDocumentLine[] {\n const colors = options.colors ?? true;\n const theme = options.theme ?? DEFAULT_DARK_THEME.markdown;\n const tokens = lexer(sanitizeTerminalText(source), { gfm: true, breaks: false });\n const document = renderBlocks(tokens, colors, theme);\n while (document.at(-1)?.value === \"\") document.pop();\n const last = document.at(-1);\n if (last !== undefined) {\n const value = last.value.trimEnd();\n document[document.length - 1] = { value, ...(last.copy === undefined ? {} : {\n copy: { start: last.copy.start, end: Math.min(last.copy.end, stripVTControlCharacters(value).length) },\n }) };\n }\n return document.length === 0 ? [{ value: \"\", copy: { start: 0, end: 0 } }] : document;\n}\n\nfunction renderBlocks(\n tokens: readonly Token[],\n colors: boolean,\n theme: MarkdownTheme,\n): TextDocumentLine[] {\n const blocks: TextDocumentLine[][] = [];\n for (const token of tokens) {\n let block: TextDocumentLine[] | undefined;\n switch (token.type) {\n case \"space\":\n case \"def\":\n break;\n case \"heading\": {\n const heading = token as Tokens.Heading;\n const marker = heading.depth <= 2 ? `${\"#\".repeat(heading.depth)} ` : \"\";\n block = copyLines(style(\n `${marker}${renderInline(heading.tokens, colors, theme)}`,\n theme.heading,\n colors,\n ));\n break;\n }\n case \"paragraph\":\n block = copyLines(renderInline((token as Tokens.Paragraph).tokens, colors, theme));\n break;\n case \"text\": {\n const text = token as Tokens.Text;\n block = copyLines(text.tokens === undefined\n ? text.text\n : renderInline(text.tokens, colors, theme));\n break;\n }\n case \"code\": {\n const code = token as Tokens.Code;\n const language = code.lang === undefined ? \"\" : ` [${code.lang}]`;\n const label = style(`\u250C\u2500 code${language}`, theme.codeBlockBorder, colors);\n const body = code.text.split(\"\\n\").map((line) => ({\n value: `${style(\"\u2502\", theme.codeBlockBorder, colors)} ${style(line, theme.codeBlock, colors)}`,\n copy: { start: 2, end: 2 + line.length },\n }));\n block = [{ value: label }, ...body];\n break;\n }\n case \"blockquote\": {\n const quote = renderBlocks((token as Tokens.Blockquote).tokens, colors, theme);\n block = quote.map(line => ({\n value: `${style(\"\u2502\", theme.quoteBorder, colors)} ${style(line.value, theme.quote, colors)}`,\n ...(line.copy === undefined ? {} : { copy: { start: line.copy.start + 2, end: line.copy.end + 2 } }),\n }));\n break;\n }\n case \"list\":\n block = renderList(token as Tokens.List, colors, theme);\n break;\n case \"hr\":\n block = [{ value: style(\"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\", theme.horizontalRule, colors) }];\n break;\n case \"table\":\n block = renderTable(token as Tokens.Table, colors, theme);\n break;\n case \"html\":\n block = copyLines(stripHtml((token as Tokens.HTML).text));\n break;\n default:\n block = \"raw\" in token ? copyLines(sanitizeTerminalText(String(token.raw))) : undefined;\n break;\n }\n if (block !== undefined && block.some(line => line.value !== \"\")) blocks.push(block);\n }\n return blocks.flatMap((block, index) => index === 0 ? block : [{ value: \"\", copy: { start: 0, end: 0 } }, ...block]);\n}\n\nfunction renderInline(\n tokens: readonly Token[],\n colors: boolean,\n theme: MarkdownTheme,\n): string {\n return tokens.map((token) => {\n switch (token.type) {\n case \"text\": {\n const text = token as Tokens.Text;\n return text.tokens === undefined\n ? text.text\n : renderInline(text.tokens, colors, theme);\n }\n case \"escape\":\n return (token as Tokens.Escape).text;\n case \"strong\":\n return style(\n renderInline((token as Tokens.Strong).tokens, colors, theme),\n { bold: true },\n colors,\n );\n case \"em\":\n return style(\n renderInline((token as Tokens.Em).tokens, colors, theme),\n { italic: true },\n colors,\n );\n case \"del\":\n return style(\n renderInline((token as Tokens.Del).tokens, colors, theme),\n { strikethrough: true },\n colors,\n );\n case \"codespan\":\n return style((token as Tokens.Codespan).text, theme.code, colors);\n case \"br\":\n return \"\\n\";\n case \"link\": {\n const link = token as Tokens.Link;\n const label = style(renderInline(link.tokens, colors, theme), theme.link, colors);\n return link.href === link.text\n ? label\n : `${label} ${style(`(${link.href})`, theme.linkUrl, colors)}`;\n }\n case \"image\": {\n const image = token as Tokens.Image;\n return `[image: ${image.text || \"unnamed\"}] (${image.href})`;\n }\n case \"html\":\n return stripHtml((token as Tokens.Tag).text);\n default:\n return \"raw\" in token ? sanitizeTerminalText(String(token.raw)) : \"\";\n }\n }).join(\"\");\n}\n\nfunction renderList(\n list: Tokens.List,\n colors: boolean,\n theme: MarkdownTheme,\n): TextDocumentLine[] {\n const start = typeof list.start === \"number\" ? list.start : 1;\n return list.items.flatMap((item, index) => {\n const task = item.task ? `[${item.checked ? \"x\" : \" \"}] ` : \"\";\n const marker = list.ordered ? `${start + index}. ` : \"\u2022 \";\n const body = renderBlocks(item.tokens, colors, theme);\n const continuation = \" \".repeat(marker.length + task.length);\n return body.map((line, lineIndex) => {\n const prefix = lineIndex === 0 ? `${style(marker, theme.listBullet, colors)}${task}` : continuation;\n return { value: prefix + line.value, ...(line.copy === undefined ? {} : {\n copy: { start: line.copy.start === 0 ? 0 : line.copy.start + continuation.length, end: line.copy.end + continuation.length },\n }) };\n });\n });\n}\n\nfunction renderTable(\n table: Tokens.Table,\n colors: boolean,\n theme: MarkdownTheme,\n): TextDocumentLine[] {\n const row = (cells: readonly Tokens.TableCell[]) =>\n `| ${cells.map((cell) => renderInline(cell.tokens, colors, theme)).join(\" | \")} |`;\n const header = row(table.header);\n const divider = `| ${table.header.map(() => \"---\").join(\" | \")} |`;\n return [...copyLines(header), { value: divider }, ...table.rows.flatMap(cells => copyLines(row(cells)))];\n}\n\nfunction copyLines(value: string): TextDocumentLine[] {\n return value.split(\"\\n\").map(line => ({ value: line, copy: { start: 0, end: stripVTControlCharacters(line).length } }));\n}\n\nfunction style(value: string, textStyle: TextStyle, enabled: boolean): string {\n return enabled ? styleText(value, textStyle) : value;\n}\n\nfunction stripHtml(value: string): string {\n return sanitizeTerminalText(value.replace(/<[^>]*>/gu, \"\"));\n}\n", "import type {\n Component,\n CursorPosition,\n RenderResult,\n RenderSize,\n PointerEvent,\n} from \"./component.js\";\nimport { placeImages, type ImagePlacement } from \"./component.js\";\nimport type { TextRow } from \"./text-selection.js\";\n\nexport interface StackOptions {\n readonly gap?: number;\n}\n\nexport class Stack implements Component {\n private readonly gap: number;\n private bounds: Array<{ child: Component; y: number; height: number }> = [];\n private captured: { child: Component; y: number } | undefined;\n\n constructor(\n private readonly children: readonly Component[],\n options: StackOptions = {},\n ) {\n this.gap = options.gap ?? 0;\n if (!Number.isInteger(this.gap) || this.gap < 0) {\n throw new RangeError(\"Stack gap must be a non-negative integer\");\n }\n }\n\n render(size: RenderSize): RenderResult {\n const lines: string[] = [];\n const images: ImagePlacement[] = [];\n const textRows: Array<TextRow | undefined> = [];\n this.bounds = [];\n let cursor: CursorPosition | undefined;\n\n for (const child of this.children) {\n if (lines.length >= size.height) break;\n if (lines.length > 0 && this.gap > 0) {\n const count = Math.min(this.gap, size.height - lines.length);\n lines.push(...Array.from({ length: count }, () => \"\"));\n textRows.push(...Array.from({ length: count }, () => undefined));\n }\n if (lines.length >= size.height) break;\n\n const offset = lines.length;\n const result = child.render({\n width: size.width,\n height: size.height - lines.length,\n });\n lines.push(...result.lines.slice(0, size.height - lines.length));\n textRows.push(...result.lines.map((_, index) => result.textRows?.[index]));\n this.bounds.push({ child, y: offset, height: result.lines.length });\n if (this.captured?.child === child) this.captured.y = offset;\n images.push(...placeImages(result.images, offset, size.height));\n if (cursor === undefined && result.cursor !== undefined) {\n cursor = { ...result.cursor, y: result.cursor.y + offset };\n }\n }\n\n return {\n lines,\n ...(textRows.some(row => row !== undefined) ? { textRows } : {}),\n ...(images.length ? { images } : {}),\n ...(cursor === undefined ? {} : { cursor }),\n };\n }\n\n handlePointer(event: PointerEvent): boolean {\n const target = event.type === \"down\"\n ? this.bounds.find(bound => event.y >= bound.y && event.y < bound.y + bound.height)\n : this.bounds.find(bound => bound.child === this.captured?.child);\n if (event.type === \"down\") this.captured = undefined;\n if (target === undefined || !(\"handlePointer\" in target.child) || typeof target.child.handlePointer !== \"function\") return false;\n const consumed = target.child.handlePointer({ ...event, y: event.y - target.y }) as boolean;\n if (event.type === \"down\" && consumed) this.captured = { child: target.child, y: target.y };\n if (event.type === \"up\") this.captured = undefined;\n return consumed;\n }\n\n dispose(): void {\n this.captured = undefined;\n this.bounds = [];\n for (const child of this.children) child.dispose?.();\n }\n}\n", "import { Keymap, mergeKeyBindings, type KeyBindingDefinition, type KeyStroke } from \"@sortedyuan/keybindings\";\nimport { diffChars, type Change } from \"diff\";\nimport type {\n Component,\n FocusTarget,\n InteractiveComponent,\n RenderResult,\n RenderSize,\n PointerEvent,\n} from \"../component.js\";\nimport { Markdown } from \"../markdown.js\";\nimport { placeImages, type ImagePlacement } from \"../component.js\";\nimport type { TerminalImages } from \"../images.js\";\nimport type { ScrollRegion } from \"../scroll-view.js\";\nimport { Stack } from \"../stack.js\";\nimport { sanitizeTerminalText, Text } from \"../text.js\";\nimport { DEFAULT_DARK_THEME, styleText, type TuiTheme } from \"../theme.js\";\nimport { highlightTextRow, renderTextDocument, textRowOffset, type TextRow } from \"../text-selection.js\";\nimport type {\n ApprovalTranscriptItem,\n AssistantTranscriptItem,\n NoticeTranscriptItem,\n TranscriptItem,\n TranscriptStore,\n UserTranscriptItem,\n} from \"./transcript-store.js\";\nimport {\n createCodingToolRendererRegistry,\n type ToolRendererRegistry,\n} from \"./tool-renderers.js\";\n\nexport interface TranscriptViewOptions {\n readonly keybindings?: readonly KeyBindingDefinition[];\n readonly images?: TerminalImages;\n readonly showReasoning?: boolean;\n readonly showToolDetails?: boolean;\n readonly selected?: boolean;\n readonly maximumToolOutputCharacters?: number;\n readonly theme?: TuiTheme;\n readonly toolRenderers?: ToolRendererRegistry;\n /** Label shown above assistant messages. Defaults to \"May\". */\n readonly assistantLabel?: string;\n /** Label shown above user messages. Defaults to \"You\". */\n readonly userLabel?: string;\n readonly emptyMessage?: string;\n readonly selectedToolDetailsHint?: string;\n readonly toolDetailsHint?: string;\n}\n\nexport const TRANSCRIPT_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n { context: \"transcript\", keys: \"j\", action: \"tool.next\" },\n { context: \"transcript\", keys: \"k\", action: \"tool.previous\" },\n { context: \"transcript\", keys: \"enter\", action: \"tool.toggle\" },\n { context: \"transcript\", keys: \"space\", action: \"tool.toggle\" },\n];\n\nexport class TranscriptView implements InteractiveComponent, FocusTarget {\n private readonly keymap: Keymap;\n private textRows: readonly (TextRow | undefined)[] = [];\n private readonly sources = new Map<string, readonly TextRow[]>();\n private selectionStart: TextAnchor | undefined;\n private selectionEnd: TextAnchor | undefined;\n private dragging = false;\n private reasoningVisible: boolean;\n private toolDetailsVisible: boolean;\n private focused = false;\n private selectedToolId: string | undefined;\n private readonly toolDetailOverrides = new Map<string, boolean>();\n private readonly toolAnchors = new Map<string, ScrollRegion>();\n private revealedReplyId: string | undefined;\n private replyAnchor: ScrollRegion | undefined;\n private readonly theme: TuiTheme;\n private readonly toolRenderers: ToolRendererRegistry;\n private tailCache = new WeakMap<TranscriptItem, {\n key: string;\n lines: readonly string[];\n images?: readonly ImagePlacement[];\n replyStart?: number;\n textRows?: readonly (TextRow | undefined)[];\n }>();\n\n constructor(\n private readonly store: TranscriptStore,\n private readonly options: TranscriptViewOptions = {},\n ) {\n this.keymap = new Keymap(mergeKeyBindings(TRANSCRIPT_KEYBINDINGS, options.keybindings), {\n actions: TRANSCRIPT_KEYBINDINGS.map(binding => binding.action),\n });\n this.reasoningVisible = options.showReasoning ?? true;\n this.toolDetailsVisible = options.showToolDetails ?? false;\n this.theme = options.theme ?? DEFAULT_DARK_THEME;\n this.toolRenderers = options.toolRenderers ?? createCodingToolRendererRegistry();\n }\n\n get showReasoning(): boolean {\n return this.reasoningVisible;\n }\n\n get hasSelection(): boolean {\n return this.selectedText !== \"\";\n }\n\n get selectedText(): string {\n const range = this.selectionRange();\n if (range === undefined) return \"\";\n return range.sources.slice(range.startIndex, range.endIndex + 1).map((source, index) => {\n const start = index === 0 ? range.start.offset : 0;\n const end = index === range.endIndex - range.startIndex ? range.end.offset : source.source.length;\n return source.source.slice(start, end);\n }).join(\"\\n\\n\");\n }\n\n clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.dragging = false;\n }\n\n dispose(): void {\n this.clearSelection();\n this.textRows = [];\n this.sources.clear();\n this.toolAnchors.clear();\n this.tailCache = new WeakMap();\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (event.type === \"down\" && event.button !== 0) return false;\n if (event.type !== \"down\" && !this.dragging) return false;\n const anchor = this.pointerAnchor(event.x, event.y);\n if (anchor === undefined) {\n if (event.type === \"down\") this.clearSelection();\n if (event.type === \"up\") this.dragging = false;\n return false;\n }\n if (event.type === \"down\") {\n if (!event.shift || this.selectionStart === undefined) this.selectionStart = anchor;\n this.dragging = true;\n }\n this.selectionEnd = anchor;\n if (event.type === \"up\") this.dragging = false;\n return true;\n }\n\n get showToolDetails(): boolean {\n return this.toolDetailsVisible;\n }\n\n get toolDetailsMode(): \"all\" | \"off\" | \"custom\" {\n if (this.toolDetailOverrides.size > 0) return \"custom\";\n return this.toolDetailsVisible ? \"all\" : \"off\";\n }\n\n get selectedToolAnchor(): ScrollRegion | undefined {\n return this.selectedToolId === undefined\n ? undefined\n : this.toolAnchors.get(this.selectedToolId);\n }\n\n /** \u6700\u8FD1\u4E00\u6B21\u6E32\u67D3\u4E2D\uFF0C\u5F53\u524D\u6700\u7EC8\u56DE\u590D\u6B63\u6587\u7684\u7B2C\u4E00\u884C\u3002 */\n get latestReplyAnchor(): ScrollRegion | undefined {\n return this.revealedReplyId === this.store.latestReply?.id ? this.replyAnchor : undefined;\n }\n\n /** \u4FDD\u7559\u6700\u7EC8\u56DE\u590D\u7684\u5B8C\u6574\u6B63\u6587\uFF0C\u4F7F\u5176\u5F00\u5934\u53EF\u4EE5\u901A\u8FC7\u6EDA\u52A8\u5B9A\u4F4D\u3002 */\n revealLatestReply(): boolean {\n const reply = this.store.latestReply;\n if (reply === undefined) return false;\n this.revealedReplyId = reply.id;\n return true;\n }\n\n setFocused(focused: boolean): void {\n if (this.focused !== focused) this.keymap.reset();\n this.focused = focused;\n if (focused) this.ensureSelectedTool();\n }\n\n handleKey(stroke: KeyStroke): boolean {\n if (!this.focused) return false;\n const result = this.keymap.resolve(stroke, [\"transcript\"]);\n if (result.type !== \"action\") return result.type === \"pending\";\n if (result.action === \"tool.next\") return this.moveToolSelection(1);\n if (result.action === \"tool.previous\") return this.moveToolSelection(-1);\n return this.toggleSelectedTool();\n }\n\n toggleReasoning(): boolean {\n this.reasoningVisible = !this.reasoningVisible;\n return this.reasoningVisible;\n }\n\n toggleToolDetails(): boolean {\n this.toolDetailsVisible = !this.toolDetailsVisible;\n this.toolDetailOverrides.clear();\n return this.toolDetailsVisible;\n }\n\n toggleSelectedTool(): boolean {\n this.ensureSelectedTool();\n const id = this.selectedToolId;\n if (id === undefined) return false;\n this.toolDetailOverrides.set(id, !this.isToolExpanded(id));\n return true;\n }\n\n render(size: RenderSize): RenderResult {\n return this.highlightSelection(this.renderItems(size, false));\n }\n\n /** ScrollView hook: retain the latest rows when the bounded buffer overflows. */\n renderTail(size: RenderSize): RenderResult {\n return this.highlightSelection(this.renderItems(size, true));\n }\n\n private pointerAnchor(x: number, y: number): TextAnchor | undefined {\n if (this.textRows.length === 0) return undefined;\n const rowIndex = Math.max(0, Math.min(this.textRows.length - 1, y));\n const row = this.textRows[rowIndex];\n if (row !== undefined) return { sourceId: row.sourceId, offset: textRowOffset(row, x) };\n for (let index = rowIndex + 1; index < this.textRows.length; index++) {\n const next = this.textRows[index];\n if (next !== undefined) return { sourceId: next.sourceId, offset: next.start };\n }\n for (let index = rowIndex - 1; index >= 0; index--) {\n const previous = this.textRows[index];\n if (previous !== undefined) return { sourceId: previous.sourceId, offset: previous.end };\n }\n return undefined;\n }\n\n private selectionRange() {\n const sources = this.store.items.flatMap(item => this.sources.get(item.id) ?? []);\n const first = this.selectionStart;\n const last = this.selectionEnd;\n if (first === undefined || last === undefined) return undefined;\n const firstIndex = sources.findIndex(row => row.sourceId === first.sourceId);\n const lastIndex = sources.findIndex(row => row.sourceId === last.sourceId);\n if (firstIndex < 0 || lastIndex < 0) return undefined;\n const forward = firstIndex < lastIndex || (firstIndex === lastIndex && first.offset <= last.offset);\n return { sources, start: forward ? first : last, end: forward ? last : first,\n startIndex: forward ? firstIndex : lastIndex, endIndex: forward ? lastIndex : firstIndex };\n }\n\n private rememberSources(item: TranscriptItem, result: RenderResult): void {\n const unique = new Map<string, TextRow>();\n for (const row of result.textRows ?? []) if (row !== undefined) unique.set(row.sourceId, row);\n for (const previous of this.sources.get(item.id) ?? []) {\n const current = unique.get(previous.sourceId);\n if (current === undefined || current.source.startsWith(previous.source)) continue;\n const range = this.selectionRange();\n if (range === undefined || (this.selectionStart?.sourceId !== current.sourceId && this.selectionEnd?.sourceId !== current.sourceId)) continue;\n const changes = diffChars(previous.source, current.source);\n const update = (anchor: TextAnchor | undefined): TextAnchor | undefined => anchor?.sourceId !== current.sourceId ? anchor\n : { ...anchor, offset: changedOffset(changes, anchor.offset, anchor === range.start ? \"right\" : \"left\") };\n this.selectionStart = update(this.selectionStart);\n this.selectionEnd = update(this.selectionEnd);\n }\n this.sources.set(item.id, [...unique.values()]);\n }\n\n private highlightSelection(result: RenderResult): RenderResult {\n this.textRows = result.textRows ?? [];\n const ids = new Set(this.store.items.map(item => item.id));\n for (const id of this.sources.keys()) if (!ids.has(id)) this.sources.delete(id);\n const range = this.selectionRange();\n if (range === undefined) return result;\n const sources = new Map(range.sources.map((source, index) => [source.sourceId, index]));\n return { ...result, lines: result.lines.map((line, index) => {\n const row = this.textRows[index];\n const sourceIndex = row === undefined ? undefined : sources.get(row.sourceId);\n if (row === undefined || sourceIndex === undefined || sourceIndex < range.startIndex || sourceIndex > range.endIndex) return line;\n return highlightTextRow(line, row, sourceIndex === range.startIndex ? range.start.offset : 0,\n sourceIndex === range.endIndex ? range.end.offset : row.source.length);\n }) };\n }\n\n private renderItems(size: RenderSize, retainTail: boolean): RenderResult {\n this.replyAnchor = undefined;\n if (this.store.items.length === 0) {\n return new Text(sanitizeTerminalText(this.options.emptyMessage ?? \"No messages yet.\"), {\n style: this.theme.dim,\n }).render(size);\n }\n this.ensureSelectedTool();\n this.toolAnchors.clear();\n if (retainTail) return this.renderTailItems(size);\n const lines: string[] = [];\n const images: ImagePlacement[] = [];\n const textRows: Array<TextRow | undefined> = [];\n for (const item of this.store.items) {\n if (lines.length >= size.height) break;\n if (lines.length > 0) { lines.push(\"\"); textRows.push(undefined); }\n if (lines.length >= size.height) break;\n const start = lines.length;\n const selected = item.kind === \"tool\" && this.focused && item.id === this.selectedToolId;\n const result = new TranscriptItemView(item, {\n ...(this.options.images ? { images: this.options.images } : {}),\n showReasoning: this.reasoningVisible,\n showToolDetails: item.kind === \"tool\"\n ? this.isToolExpanded(item.id)\n : this.toolDetailsVisible,\n selected,\n maximumToolOutputCharacters: this.options.maximumToolOutputCharacters ?? 8_000,\n theme: this.theme,\n toolRenderers: this.toolRenderers,\n ...(this.options.assistantLabel === undefined\n ? {}\n : { assistantLabel: this.options.assistantLabel }),\n ...(this.options.userLabel === undefined\n ? {}\n : { userLabel: this.options.userLabel }),\n ...(this.options.selectedToolDetailsHint === undefined\n ? {}\n : { selectedToolDetailsHint: this.options.selectedToolDetailsHint }),\n ...(this.options.toolDetailsHint === undefined\n ? {}\n : { toolDetailsHint: this.options.toolDetailsHint }),\n }).render({ width: size.width, height: size.height - lines.length });\n lines.push(...result.lines.slice(0, size.height - lines.length));\n textRows.push(...result.lines.map((_, index) => result.textRows?.[index]));\n this.rememberSources(item, result);\n images.push(...placeImages(result.images, start, size.height));\n if (item.kind === \"tool\") {\n this.toolAnchors.set(item.id, { start, end: start });\n }\n }\n return { lines, textRows, ...(images.length ? { images } : {}) };\n }\n\n private renderTailItems(size: RenderSize): RenderResult {\n const chunks: Array<{\n readonly item: TranscriptItem;\n readonly lines: readonly string[];\n readonly images?: readonly ImagePlacement[];\n readonly replyStart?: number;\n readonly textRows?: readonly (TextRow | undefined)[];\n }> = [];\n let remaining = size.height;\n const latestReply = this.store.latestReply;\n const revealedIndex = latestReply?.id === this.revealedReplyId\n ? this.store.items.findIndex((item) => item.id === this.revealedReplyId)\n : -1;\n for (let index = this.store.items.length - 1; index >= 0; index--) {\n const item = this.store.items[index]!;\n const separator = chunks.length === 0 ? 0 : 1;\n const available = remaining - separator;\n const revealReply = item.kind === \"assistant\" && index === revealedIndex;\n const keepForReply = revealedIndex >= 0 && index >= revealedIndex;\n if (available <= 0 && !keepForReply) break;\n const key = `${this.options.images?.revision}:${this.toolRenderers.revision}:${size.width}:${size.height}:${this.reasoningVisible}:${item.kind === \"tool\" && this.isToolExpanded(item.id)}:${this.focused && item.id === this.selectedToolId}:${revealReply}`;\n let cached = this.tailCache.get(item);\n if (cached?.key !== key) {\n const result = this.renderItem(item, size.width, Number.MAX_SAFE_INTEGER);\n this.rememberSources(item, result);\n const lines = result.lines;\n const bodyLines = revealReply\n ? item.kind === \"assistant\" && item.content?.some(part => part.type === \"image\")\n ? this.renderItem({ ...item, reasoning: \"\" }, size.width, Number.MAX_SAFE_INTEGER).lines.length - 1\n : new Markdown(item.text, { theme: this.theme.markdown }).render({ width: size.width, height: Number.MAX_SAFE_INTEGER }).lines.length\n : undefined;\n cached = { key, lines, ...(result.images ? { images: result.images } : {}),\n ...(result.textRows ? { textRows: result.textRows } : {}),\n ...(bodyLines === undefined ? {} : { replyStart: lines.length - bodyLines }) };\n this.tailCache.set(item, cached);\n }\n const rendered = cached.lines;\n const replyStart = cached.replyStart;\n const cut = keepForReply && !revealReply ? 0\n : Math.max(0, Math.min(rendered.length - available, replyStart ?? rendered.length));\n const visible = rendered.slice(cut);\n chunks.unshift({ item, lines: visible, ...(cached.images ? { images: placeImages(cached.images, -cut, visible.length) } : {}),\n ...(cached.textRows ? { textRows: cached.textRows.slice(cut) } : {}),\n ...(replyStart === undefined ? {} : { replyStart: replyStart - cut }) });\n remaining -= visible.length + separator;\n if (visible.length < rendered.length && (revealedIndex < 0 || index <= revealedIndex)) break;\n }\n\n const lines: string[] = [];\n const images: ImagePlacement[] = [];\n const textRows: Array<TextRow | undefined> = [];\n for (const chunk of chunks) {\n if (lines.length > 0) { lines.push(\"\"); textRows.push(undefined); }\n const start = lines.length;\n lines.push(...chunk.lines);\n textRows.push(...chunk.lines.map((_, index) => chunk.textRows?.[index]));\n images.push(...placeImages(chunk.images, start, Number.MAX_SAFE_INTEGER));\n if (chunk.item.kind === \"tool\") {\n this.toolAnchors.set(chunk.item.id, { start, end: start });\n }\n if (chunk.replyStart !== undefined) {\n this.replyAnchor = { start: start + chunk.replyStart, end: start + chunk.replyStart };\n }\n }\n return { lines, textRows, ...(images.length ? { images } : {}) };\n }\n\n private renderItem(\n item: TranscriptItem,\n width: number,\n height: number,\n ): RenderResult {\n const selected = item.kind === \"tool\" && this.focused &&\n item.id === this.selectedToolId;\n return new TranscriptItemView(item, {\n ...(this.options.images ? { images: this.options.images } : {}),\n showReasoning: this.reasoningVisible,\n showToolDetails: item.kind === \"tool\"\n ? this.isToolExpanded(item.id)\n : this.toolDetailsVisible,\n selected,\n maximumToolOutputCharacters: this.options.maximumToolOutputCharacters ??\n 8_000,\n theme: this.theme,\n toolRenderers: this.toolRenderers,\n ...(this.options.assistantLabel === undefined\n ? {}\n : { assistantLabel: this.options.assistantLabel }),\n ...(this.options.userLabel === undefined\n ? {}\n : { userLabel: this.options.userLabel }),\n ...(this.options.selectedToolDetailsHint === undefined\n ? {}\n : { selectedToolDetailsHint: this.options.selectedToolDetailsHint }),\n ...(this.options.toolDetailsHint === undefined\n ? {}\n : { toolDetailsHint: this.options.toolDetailsHint }),\n }).render({ width, height });\n }\n\n private isToolExpanded(id: string): boolean {\n return this.toolDetailOverrides.get(id) ?? this.toolDetailsVisible;\n }\n\n private ensureSelectedTool(): void {\n const tools = this.store.items.filter((item) => item.kind === \"tool\");\n if (tools.length === 0) {\n this.selectedToolId = undefined;\n return;\n }\n if (tools.some((item) => item.id === this.selectedToolId)) return;\n this.selectedToolId = tools.at(-1)!.id;\n }\n\n private moveToolSelection(direction: -1 | 1): boolean {\n const tools = this.store.items.filter((item) => item.kind === \"tool\");\n if (tools.length === 0) return false;\n this.ensureSelectedTool();\n const current = tools.findIndex((item) => item.id === this.selectedToolId);\n const next = Math.min(tools.length - 1, Math.max(0, current + direction));\n this.selectedToolId = tools[next]!.id;\n return true;\n }\n}\n\ninterface TextAnchor {\n readonly sourceId: string;\n readonly offset: number;\n}\n\nfunction changedOffset(changes: readonly Change[], offset: number, affinity: \"left\" | \"right\"): number {\n let previous = 0;\n let current = 0;\n for (const change of changes) {\n if (change.added) {\n if (previous === offset && affinity === \"left\") return current;\n current += change.value.length;\n continue;\n }\n const end = previous + change.value.length;\n if (offset < end || (offset === end && affinity === \"left\")) {\n return current + (change.removed ? 0 : offset - previous);\n }\n previous = end;\n if (!change.removed) current += change.value.length;\n }\n return current;\n}\n\ninterface TranscriptItemViewOptions {\n readonly images?: TerminalImages;\n readonly showReasoning: boolean;\n readonly showToolDetails: boolean;\n readonly selected: boolean;\n readonly maximumToolOutputCharacters: number;\n readonly theme: TuiTheme;\n readonly toolRenderers: ToolRendererRegistry;\n readonly assistantLabel: string;\n readonly userLabel: string;\n readonly selectedToolDetailsHint: string;\n readonly toolDetailsHint: string;\n}\n\nexport class TranscriptItemView implements Component {\n constructor(\n private readonly item: TranscriptItem,\n private readonly options: TranscriptViewOptions = {},\n ) {}\n\n render(size: RenderSize): RenderResult {\n const options = normalizeOptions(this.options);\n switch (this.item.kind) {\n case \"assistant\":\n return renderAssistantView(this.item, options, size);\n case \"tool\": {\n const descriptionDocument = options.toolRenderers.renderDocument(this.item, {\n expanded: options.showToolDetails,\n selected: options.selected,\n maximumOutputCharacters: options.maximumToolOutputCharacters,\n theme: options.theme,\n detailsHint: options.selected\n ? options.selectedToolDetailsHint\n : options.toolDetailsHint,\n });\n const description: Component = {\n render: size => renderTextDocument(descriptionDocument, size, { sourceId: `${this.item.id}:tool` }),\n };\n const images = this.item.content?.filter(part => part.type === \"image\") ?? [];\n return new Stack([description, ...images.map((part, index) => options.images?.component(part.source, `${this.item.id}:image:${index}`) ?? new Text(\"\u56FE\u7247\u9644\u4EF6\uFF1A\u5BBF\u4E3B\u672A\u914D\u7F6E TerminalImages\u3002\"))]).render(size);\n }\n case \"user\":\n return new Text(renderUser(this.item, options), {\n sourceId: `${this.item.id}:user`,\n copyRanges: [undefined, ...sanitizeTerminalText(this.item.text).split(\"\\n\").map(line => ({ start: 2, end: line.length + 2 }))],\n }).render(size);\n case \"approval\":\n return new Text(renderApproval(this.item, options.theme), { sourceId: `${this.item.id}:approval` }).render(size);\n case \"notice\":\n return new Text(renderNotice(this.item, options.theme), {\n continuationIndent: 2,\n sourceId: `${this.item.id}:notice`,\n copyRanges: sanitizeTerminalText(this.item.text).split(\"\\n\").map((line, index) => ({ start: index === 0 ? 2 : 0, end: line.length + (index === 0 ? 2 : 0) })),\n }).render(size);\n }\n }\n}\n\nfunction normalizeOptions(options: TranscriptViewOptions): TranscriptItemViewOptions {\n return {\n ...(options.images ? { images: options.images } : {}),\n showReasoning: options.showReasoning ?? true,\n showToolDetails: options.showToolDetails ?? false,\n selected: options.selected ?? false,\n maximumToolOutputCharacters: options.maximumToolOutputCharacters ?? 8_000,\n theme: options.theme ?? DEFAULT_DARK_THEME,\n toolRenderers: options.toolRenderers ?? createCodingToolRendererRegistry(),\n assistantLabel: options.assistantLabel ?? \"May\",\n userLabel: options.userLabel ?? \"You\",\n selectedToolDetailsHint: options.selectedToolDetailsHint ?? \"Enter details\",\n toolDetailsHint: options.toolDetailsHint ?? \"Toggle details\",\n };\n}\n\nfunction renderAssistantView(\n item: AssistantTranscriptItem,\n options: TranscriptItemViewOptions,\n size: RenderSize,\n): RenderResult {\n const children: Component[] = [];\n if (options.showReasoning && item.reasoning !== \"\") {\n children.push(new Text(\"thinking\", { style: options.theme.thinking }));\n children.push(new Text(indent(sanitizeTerminalText(item.reasoning)), {\n style: options.theme.thinking,\n sourceId: `${item.id}:reasoning`,\n copyRanges: sanitizeTerminalText(item.reasoning).split(\"\\n\").map(line => ({ start: 2, end: line.length + 2 })),\n }));\n }\n const value = item.text === \"\" && item.status === \"streaming\" ? \"\u2026\" : item.text;\n if (value !== \"\" || item.content?.some(part => part.type === \"image\")) {\n children.push(new Text(\n `${styleText(\"\u25C6\", options.theme.accent)} ` +\n styleText(\n sanitizeTerminalText(options.assistantLabel),\n options.theme.assistantLabel,\n ),\n ));\n if (item.content?.some(part => part.type === \"image\")) {\n for (const [index, part] of item.content.entries()) {\n if (part.type === \"text\") children.push(new Markdown(part.text, { theme: options.theme.markdown, sourceId: `${item.id}:text:${index}` }));\n else if (part.type === \"image\") children.push(options.images?.component(part.source, `${item.id}:image:${index}`) ?? new Text(\"\u56FE\u7247\u9644\u4EF6\uFF1A\u5BBF\u4E3B\u672A\u914D\u7F6E TerminalImages\u3002\"));\n }\n } else children.push(new Markdown(value, { theme: options.theme.markdown, sourceId: `${item.id}:text:0` }));\n }\n return new Stack(children).render(size);\n}\n\nfunction renderUser(\n item: UserTranscriptItem,\n options: TranscriptItemViewOptions,\n): string {\n const safe = sanitizeTerminalText(item.text);\n const label = sanitizeTerminalText(options.userLabel);\n return `${styleText(\"\u203A\", options.theme.accent)} ` +\n `${styleText(label, options.theme.userMessage)}\\n` +\n styleLines(indent(safe), options.theme.text);\n}\n\nfunction renderApproval(item: ApprovalTranscriptItem, theme: TuiTheme): string {\n const scope = item.scopeDescription === undefined ? \"\" : `\\n\u6301\u7EED\u6388\u6743\u8303\u56F4\uFF1A${sanitizeTerminalText(item.scopeDescription)}${item.scopeId === undefined ? \"\" : `\\n\u8303\u56F4\u8EAB\u4EFD\uFF1A${sanitizeTerminalText(item.scopeId)}`}`;\n if (item.status === \"pending\") {\n return `${styleText(\"?\", theme.warning)} Approval required for ` +\n styleText(sanitizeTerminalText(item.toolName), theme.toolTitle) + scope;\n }\n if (item.status === \"resolved\") {\n return `${styleText(\"\u2713\", theme.success)} Permission: ${item.decision ?? \"resolved\"}` + scope;\n }\n return `${styleText(\"!\", theme.warning)} Permission cancelled` +\n (item.reason === undefined ? \"\" : `: ${sanitizeTerminalText(item.reason)}`) + scope;\n}\n\nfunction renderNotice(item: NoticeTranscriptItem, theme: TuiTheme): string {\n const marker = item.level === \"error\" ? \"\u2717\" : item.level === \"warning\" ? \"!\" : \"\u2022\";\n const markerStyle = item.level === \"error\"\n ? theme.error\n : item.level === \"warning\"\n ? theme.warning\n : theme.accent;\n return `${styleText(marker, markerStyle)} ${styleLines(sanitizeTerminalText(item.text), theme.muted)}`;\n}\n\nfunction indent(value: string): string {\n return value.split(\"\\n\").map((line) => ` ${line}`).join(\"\\n\");\n}\n\nfunction styleLines(value: string, style: TuiTheme[\"text\"]): string {\n return value.split(\"\\n\").map((line) => styleText(line, style)).join(\"\\n\");\n}\n", "import type {\n Component,\n CursorPosition,\n RenderResult,\n RenderSize,\n PointerEvent,\n} from \"./component.js\";\nimport { placeImages, type ImagePlacement } from \"./component.js\";\nimport type { TextRow } from \"./text-selection.js\";\n\nexport interface ColumnItem {\n readonly component: Component;\n /** Exact preferred row count. Fixed regions are allocated before flex regions. */\n readonly height?: number;\n /** Relative share of rows left after fixed regions. Defaults to 1. */\n readonly flex?: number;\n readonly minHeight?: number;\n}\n\nexport interface ColumnOptions {\n readonly gap?: number;\n}\n\n/** Fixed/flexible vertical region layout with stable footer placement. */\nexport class Column implements Component {\n private readonly gap: number;\n private regions: { component: Component; y: number; height: number }[] = [];\n private captured: Component | undefined;\n\n constructor(\n private items: readonly ColumnItem[],\n options: ColumnOptions = {},\n ) {\n this.gap = integer(options.gap ?? 0, \"Column gap\");\n for (const item of items) {\n if (item.height !== undefined && item.flex !== undefined) {\n throw new Error(\"A column item cannot define both height and flex\");\n }\n if (item.height !== undefined) integer(item.height, \"Column item height\");\n if (item.minHeight !== undefined) integer(item.minHeight, \"Column item minHeight\");\n if (item.flex !== undefined && (!Number.isFinite(item.flex) || item.flex <= 0)) {\n throw new RangeError(\"Column item flex must be positive\");\n }\n }\n }\n\n setItems(items: readonly ColumnItem[]): void {\n for (const item of items) {\n if (item.height !== undefined && item.flex !== undefined) throw new Error(\"A column item cannot define both height and flex\");\n if (item.height !== undefined) integer(item.height, \"Column item height\");\n if (item.minHeight !== undefined) integer(item.minHeight, \"Column item minHeight\");\n if (item.flex !== undefined && (!Number.isFinite(item.flex) || item.flex <= 0)) throw new RangeError(\"Column item flex must be positive\");\n }\n this.items = items;\n if (this.captured !== undefined && !items.some(item => item.component === this.captured)) this.captured = undefined;\n }\n\n render(size: RenderSize): RenderResult {\n this.regions = [];\n if (this.items.length === 0) return { lines: [] };\n const totalGap = this.gap * Math.max(0, this.items.length - 1);\n const available = Math.max(0, size.height - totalGap);\n const heights = allocateHeights(this.items, available);\n const lines: string[] = [];\n const images: ImagePlacement[] = [];\n const textRows: Array<TextRow | undefined> = [];\n let cursor: CursorPosition | undefined;\n\n for (let index = 0; index < this.items.length; index++) {\n const item = this.items[index]!;\n const height = heights[index]!;\n if (index > 0) {\n lines.push(...blankLines(Math.min(this.gap, size.height - lines.length)));\n }\n if (height <= 0 || lines.length >= size.height) continue;\n const offset = lines.length;\n this.regions.push({ component: item.component, y: offset, height });\n const result = item.component.render({ width: size.width, height });\n const visible = result.lines.slice(0, height);\n images.push(...placeImages(placeImages(result.images, 0, height), offset, size.height));\n lines.push(...visible, ...blankLines(height - visible.length));\n while (textRows.length < offset) textRows.push(undefined);\n textRows.push(...Array.from({ length: height }, (_, row) => result.textRows?.[row]));\n if (cursor === undefined && result.cursor !== undefined) {\n cursor = { ...result.cursor, y: result.cursor.y + offset };\n }\n }\n\n return {\n lines: lines.slice(0, size.height),\n ...(images.length ? { images } : {}),\n ...(textRows.some(row => row !== undefined) ? { textRows: textRows.slice(0, size.height) } : {}),\n ...(cursor === undefined ? {} : { cursor }),\n };\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (event.type === \"down\") this.captured = undefined;\n const region = this.regions.find(region => this.captured === undefined\n ? event.y >= region.y && event.y < region.y + region.height\n : region.component === this.captured);\n if (region === undefined) {\n if (event.type === \"up\") this.captured = undefined;\n return false;\n }\n const handled = region.component.handlePointer?.({ ...event, y: event.y - region.y }) ?? false;\n if (event.type === \"down\" && handled) this.captured = region.component;\n if (event.type === \"up\") this.captured = undefined;\n return handled;\n }\n\n dispose(): void {\n this.captured = undefined;\n for (const item of this.items) item.component.dispose?.();\n }\n}\n\nfunction allocateHeights(items: readonly ColumnItem[], available: number): number[] {\n const heights = items.map((item) => item.height ?? item.minHeight ?? 0);\n let remaining = available - heights.reduce((sum, value) => sum + value, 0);\n\n if (remaining < 0) {\n const order = items.map((_, index) => index).sort((a, b) =>\n Number(items[a]!.height !== undefined) - Number(items[b]!.height !== undefined) || a - b);\n for (const index of order) {\n if (remaining >= 0) break;\n const reduction = Math.min(heights[index]!, -remaining);\n heights[index] = heights[index]! - reduction;\n remaining += reduction;\n }\n return heights;\n }\n\n const flexItems = items\n .map((item, index) => ({ index, weight: item.height === undefined ? item.flex ?? 1 : 0 }))\n .filter((item) => item.weight > 0);\n let totalWeight = flexItems.reduce((sum, item) => sum + item.weight, 0);\n for (const item of flexItems) {\n const share = totalWeight === item.weight\n ? remaining\n : Math.floor(remaining * item.weight / totalWeight);\n heights[item.index] = heights[item.index]! + share;\n remaining -= share;\n totalWeight -= item.weight;\n }\n return heights;\n}\n\nfunction blankLines(count: number): string[] {\n return Array.from({ length: Math.max(0, count) }, () => \"\");\n}\n\nfunction integer(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${label} must be a non-negative integer`);\n }\n return value;\n}\n", "import {\n Keymap,\n mergeKeyBindings,\n type KeyBindingDefinition,\n} from \"@sortedyuan/keybindings\";\n\nexport const EDITOR_ACTIONS = {\n left: \"editor.left\",\n right: \"editor.right\",\n up: \"editor.up\",\n down: \"editor.down\",\n lineStart: \"editor.line.start\",\n lineEnd: \"editor.line.end\",\n start: \"editor.start\",\n end: \"editor.end\",\n wordLeft: \"editor.word.left\",\n wordRight: \"editor.word.right\",\n selectLeft: \"editor.select.left\",\n selectRight: \"editor.select.right\",\n selectUp: \"editor.select.up\",\n selectDown: \"editor.select.down\",\n selectLineStart: \"editor.select.line.start\",\n selectLineEnd: \"editor.select.line.end\",\n selectStart: \"editor.select.start\",\n selectEnd: \"editor.select.end\",\n selectWordLeft: \"editor.select.word.left\",\n selectWordRight: \"editor.select.word.right\",\n selectAll: \"editor.select.all\",\n copy: \"editor.copy\",\n cut: \"editor.cut\",\n paste: \"editor.paste\",\n backspace: \"editor.backspace\",\n delete: \"editor.delete\",\n deleteWord: \"editor.delete.word\",\n submit: \"editor.submit\",\n newline: \"editor.newline\",\n tab: \"editor.tab\",\n} as const;\n\nexport type EditorAction = typeof EDITOR_ACTIONS[keyof typeof EDITOR_ACTIONS];\n\nexport const DEFAULT_EDITOR_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n bind(\"left\", EDITOR_ACTIONS.left),\n bind(\"right\", EDITOR_ACTIONS.right),\n bind(\"up\", EDITOR_ACTIONS.up),\n bind(\"down\", EDITOR_ACTIONS.down),\n bind(\"home\", EDITOR_ACTIONS.lineStart),\n bind(\"end\", EDITOR_ACTIONS.lineEnd),\n bind(\"ctrl+e\", EDITOR_ACTIONS.lineEnd),\n bind(\"ctrl+home\", EDITOR_ACTIONS.start),\n bind(\"ctrl+end\", EDITOR_ACTIONS.end),\n bind(\"ctrl+left\", EDITOR_ACTIONS.wordLeft),\n bind(\"alt+left\", EDITOR_ACTIONS.wordLeft),\n bind(\"ctrl+right\", EDITOR_ACTIONS.wordRight),\n bind(\"alt+right\", EDITOR_ACTIONS.wordRight),\n bind(\"shift+left\", EDITOR_ACTIONS.selectLeft),\n bind(\"shift+right\", EDITOR_ACTIONS.selectRight),\n bind(\"shift+up\", EDITOR_ACTIONS.selectUp),\n bind(\"shift+down\", EDITOR_ACTIONS.selectDown),\n bind(\"shift+home\", EDITOR_ACTIONS.selectLineStart),\n bind(\"shift+end\", EDITOR_ACTIONS.selectLineEnd),\n bind(\"ctrl+shift+home\", EDITOR_ACTIONS.selectStart),\n bind(\"ctrl+shift+end\", EDITOR_ACTIONS.selectEnd),\n bind(\"ctrl+shift+left\", EDITOR_ACTIONS.selectWordLeft),\n bind(\"alt+shift+left\", EDITOR_ACTIONS.selectWordLeft),\n bind(\"ctrl+shift+right\", EDITOR_ACTIONS.selectWordRight),\n bind(\"alt+shift+right\", EDITOR_ACTIONS.selectWordRight),\n bind(\"ctrl+a\", EDITOR_ACTIONS.selectAll),\n bind(\"ctrl+c\", EDITOR_ACTIONS.copy, \"editor.selection\"),\n bind(\"ctrl+x\", EDITOR_ACTIONS.cut, \"editor.selection\"),\n bind(\"ctrl+v\", EDITOR_ACTIONS.paste),\n bind(\"shift+insert\", EDITOR_ACTIONS.paste),\n bind(\"backspace\", EDITOR_ACTIONS.backspace),\n bind(\"delete\", EDITOR_ACTIONS.delete),\n bind(\"ctrl+w\", EDITOR_ACTIONS.deleteWord),\n bind(\"ctrl+backspace\", EDITOR_ACTIONS.deleteWord),\n bind(\"alt+backspace\", EDITOR_ACTIONS.deleteWord),\n bind(\"enter\", EDITOR_ACTIONS.submit),\n bind(\"shift+enter\", EDITOR_ACTIONS.newline),\n bind(\"tab\", EDITOR_ACTIONS.tab),\n];\n\nexport function createEditorKeymap(\n overrides: readonly KeyBindingDefinition[] = [],\n): Keymap {\n const actions = new Set<string>(Object.values(EDITOR_ACTIONS));\n for (const binding of overrides) {\n if (binding.context !== \"editor\" && binding.context !== \"editor.selection\") {\n throw new Error(`Unknown editor keybinding context: ${binding.context}`);\n }\n if (!actions.has(binding.action)) {\n throw new Error(`Unknown editor keybinding action: ${binding.action}`);\n }\n }\n return new Keymap(mergeKeyBindings(DEFAULT_EDITOR_KEYBINDINGS, overrides), { actions: [...actions] });\n}\n\nfunction bind(keys: string, action: EditorAction, context = \"editor\"): KeyBindingDefinition {\n return { keys, action, context };\n}\n", "import type { KeyBindingDefinition, KeyStroke } from \"@sortedyuan/keybindings\";\nimport sliceAnsi from \"slice-ansi\";\nimport stringWidth from \"string-width\";\nimport type {\n CursorPosition,\n FocusTarget,\n InteractiveComponent,\n PointerEvent,\n RenderResult,\n RenderSize,\n} from \"./component.js\";\nimport type { Clipboard } from \"./clipboard.js\";\nimport { createEditorKeymap, EDITOR_ACTIONS, type EditorAction } from \"./editor-keymap.js\";\nimport { styleText, type TextStyle } from \"./theme.js\";\n\nexport interface EditorOptions {\n readonly value?: string;\n readonly prompt?: string;\n readonly continuationPrompt?: string;\n readonly placeholder?: string;\n readonly promptStyle?: TextStyle;\n readonly placeholderStyle?: TextStyle;\n readonly history?: EditorHistory;\n readonly onChange?: (value: string) => void;\n readonly clipboard?: Clipboard;\n readonly onInvalidate?: () => void;\n readonly onError?: (error: unknown) => void;\n readonly keybindings?: readonly KeyBindingDefinition[];\n readonly selectionStyle?: TextStyle;\n /** \u672A\u63D0\u4F9B\u65F6\uFF0CEnter \u63D2\u5165\u6362\u884C\u3002Shift+Enter \u59CB\u7EC8\u63D2\u5165\u6362\u884C\u3002 */\n readonly onSubmit?: (value: string) => void;\n}\n\nexport interface EditorHistoryOptions {\n readonly entries?: readonly string[];\n readonly maximumEntries?: number;\n}\n\n/** In-process command history that can be shared with or replaced by a UI. */\nexport class EditorHistory {\n private readonly maximumEntries: number;\n private entries: string[];\n private index: number;\n private draft = \"\";\n\n constructor(options: EditorHistoryOptions = {}) {\n this.maximumEntries = positiveInteger(\n options.maximumEntries ?? 100,\n \"maximumEntries\",\n );\n this.entries = (options.entries ?? [])\n .map(normalizeValue)\n .filter((value) => value.trim() !== \"\")\n .slice(-this.maximumEntries);\n this.index = this.entries.length;\n }\n\n get values(): readonly string[] {\n return [...this.entries];\n }\n\n record(value: string): void {\n const normalized = normalizeValue(value);\n if (\n normalized.trim() !== \"\" &&\n this.entries.at(-1) !== normalized\n ) {\n this.entries.push(normalized);\n if (this.entries.length > this.maximumEntries) {\n this.entries.splice(0, this.entries.length - this.maximumEntries);\n }\n }\n this.reset();\n }\n\n previous(current: string): string | undefined {\n if (this.entries.length === 0 || this.index === 0) return undefined;\n if (this.index === this.entries.length) this.draft = current;\n this.index -= 1;\n return this.entries[this.index];\n }\n\n next(): string | undefined {\n if (this.index >= this.entries.length) return undefined;\n this.index += 1;\n return this.index === this.entries.length\n ? this.draft\n : this.entries[this.index];\n }\n\n reset(): void {\n this.index = this.entries.length;\n this.draft = \"\";\n }\n}\n\nexport class Editor implements InteractiveComponent, FocusTarget {\n private graphemes: string[];\n private cursorIndex: number;\n private selectionAnchor: number | undefined;\n private focused = false;\n private readonly prompt: string;\n private readonly continuationPrompt: string;\n private readonly keymap;\n private revision = 0;\n private layout: EditorLayout | undefined;\n private renderSize: RenderSize | undefined;\n private viewportStart = 0;\n private preferredColumn: number | undefined;\n private dragging = false;\n private dragPointer: PointerEvent | undefined;\n private dragTimer: ReturnType<typeof setInterval> | undefined;\n private disposed = false;\n private pendingClipboard: Promise<void> = Promise.resolve();\n\n constructor(private readonly options: EditorOptions = {}) {\n this.graphemes = segment(normalizeValue(options.value ?? \"\"));\n this.cursorIndex = this.graphemes.length;\n this.keymap = createEditorKeymap(options.keybindings);\n this.prompt = styleText(options.prompt ?? \"> \", options.promptStyle);\n this.continuationPrompt = styleText(\n options.continuationPrompt ?? \" \",\n options.promptStyle,\n );\n }\n\n get value(): string {\n return this.graphemes.join(\"\");\n }\n\n get cursor(): number {\n return this.cursorIndex;\n }\n\n get hasSelection(): boolean {\n return this.selectionAnchor !== undefined && this.selectionAnchor !== this.cursorIndex;\n }\n\n get selectedText(): string {\n const [start, end] = this.selectionRange();\n return this.graphemes.slice(start, end).join(\"\");\n }\n\n clearSelection(): void {\n if (this.selectionAnchor === undefined) return;\n this.selectionAnchor = undefined;\n this.revision += 1;\n }\n\n selectAll(): void {\n this.selectionAnchor = 0;\n this.moveTo(this.graphemes.length, true);\n this.revision += 1;\n }\n\n resetKeybindings(): void {\n this.keymap.reset();\n }\n\n waitForPendingClipboard(): Promise<void> {\n return this.pendingClipboard;\n }\n\n setValue(value: string, cursor = segment(normalizeValue(value)).length): void {\n this.graphemes = segment(normalizeValue(value));\n this.cursorIndex = clamp(cursor, 0, this.graphemes.length);\n this.clearSelection();\n this.preferredColumn = undefined;\n this.stopDragging();\n this.keymap.reset();\n this.options.history?.reset();\n this.changed();\n }\n\n setFocused(focused: boolean): void {\n if (this.focused === focused) return;\n this.focused = focused;\n this.stopDragging();\n this.keymap.reset();\n this.revision += 1;\n }\n\n handleKey(stroke: KeyStroke): boolean {\n if (!this.focused || this.disposed) return false;\n this.stopDragging();\n if (stroke.key === \"paste\") {\n this.keymap.reset();\n if (stroke.text === undefined) return false;\n this.insert(stroke.text);\n return true;\n }\n const match = this.keymap.resolve(stroke, this.hasSelection\n ? [\"editor\", \"editor.selection\"]\n : [\"editor\"]);\n if (match.type === \"pending\") return true;\n if (match.type === \"action\") {\n this.performAction(match.action as EditorAction);\n return true;\n }\n if (stroke.text === undefined || stroke.ctrl || stroke.alt || stroke.meta) return false;\n this.insert(stroke.text);\n return true;\n }\n\n handleKeyResult(stroke: KeyStroke): { readonly consumed: boolean; readonly redraw: boolean } {\n const revision = this.revision;\n const consumed = this.handleKey(stroke);\n return { consumed, redraw: this.revision !== revision };\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (this.disposed || this.layout === undefined || this.renderSize === undefined) return false;\n if (event.type === \"down\") {\n if (event.button !== 0) return false;\n this.setFocused(true);\n this.keymap.reset();\n this.moveTo(this.pointerIndex(event.x, event.y), event.shift);\n if (this.selectionAnchor === undefined) this.selectionAnchor = this.cursorIndex;\n this.dragging = true;\n return true;\n }\n if (!this.dragging) return false;\n this.moveTo(this.pointerIndex(event.x, event.y), true);\n if (event.type === \"up\") this.stopDragging();\n else this.updateDragScroll(event);\n return true;\n }\n\n dispose(): void {\n this.disposed = true;\n this.stopDragging();\n this.keymap.reset();\n this.revision += 1;\n }\n\n render(size: RenderSize): RenderResult {\n const rendered = layoutEditor(\n this.graphemes,\n size.width,\n this.prompt,\n this.continuationPrompt,\n this.selectionRange(),\n this.options.selectionStyle ?? { inverse: true },\n );\n this.layout = rendered;\n this.renderSize = size;\n let lines = rendered.lines;\n let cursor = rendered.positions[this.cursorIndex]!;\n if (this.graphemes.length === 0 && this.options.placeholder !== undefined) {\n const prefix = fitPrefix(this.prompt, size.width);\n lines = [sliceAnsi(\n `${prefix}${styleText(this.options.placeholder.replace(/[\\r\\n]+/gu, \" \"), this.options.placeholderStyle)}`,\n 0,\n size.width,\n )];\n cursor = { x: stringWidth(prefix), y: 0 };\n }\n\n this.viewportStart = clamp(\n this.viewportStart,\n Math.max(0, cursor.y - size.height + 1),\n cursor.y,\n );\n this.viewportStart = Math.min(this.viewportStart, Math.max(0, lines.length - size.height));\n const visibleLines = lines.slice(this.viewportStart, this.viewportStart + size.height);\n return {\n lines: visibleLines,\n cursor: {\n x: cursor.x,\n y: cursor.y - this.viewportStart,\n visible: this.focused,\n },\n };\n }\n\n performAction(action: EditorAction): void {\n switch (action) {\n case EDITOR_ACTIONS.left: this.moveCursor(-1); break;\n case EDITOR_ACTIONS.right: this.moveCursor(1); break;\n case EDITOR_ACTIONS.selectLeft: this.moveCursor(-1, true); break;\n case EDITOR_ACTIONS.selectRight: this.moveCursor(1, true); break;\n case EDITOR_ACTIONS.up: this.moveVertical(-1); break;\n case EDITOR_ACTIONS.down: this.moveVertical(1); break;\n case EDITOR_ACTIONS.selectUp: this.moveVertical(-1, true); break;\n case EDITOR_ACTIONS.selectDown: this.moveVertical(1, true); break;\n case EDITOR_ACTIONS.lineStart: this.moveTo(lineStart(this.graphemes, this.cursorIndex)); break;\n case EDITOR_ACTIONS.lineEnd: this.moveTo(lineEnd(this.graphemes, this.cursorIndex)); break;\n case EDITOR_ACTIONS.selectLineStart: this.moveTo(lineStart(this.graphemes, this.cursorIndex), true); break;\n case EDITOR_ACTIONS.selectLineEnd: this.moveTo(lineEnd(this.graphemes, this.cursorIndex), true); break;\n case EDITOR_ACTIONS.start: this.moveTo(0); break;\n case EDITOR_ACTIONS.end: this.moveTo(this.graphemes.length); break;\n case EDITOR_ACTIONS.selectStart: this.moveTo(0, true); break;\n case EDITOR_ACTIONS.selectEnd: this.moveTo(this.graphemes.length, true); break;\n case EDITOR_ACTIONS.wordLeft: this.moveWord(-1); break;\n case EDITOR_ACTIONS.wordRight: this.moveWord(1); break;\n case EDITOR_ACTIONS.selectWordLeft: this.moveWord(-1, true); break;\n case EDITOR_ACTIONS.selectWordRight: this.moveWord(1, true); break;\n case EDITOR_ACTIONS.selectAll: this.selectAll(); break;\n case EDITOR_ACTIONS.copy: this.copy(false); break;\n case EDITOR_ACTIONS.cut: this.copy(true); break;\n case EDITOR_ACTIONS.paste: this.paste(); break;\n case EDITOR_ACTIONS.backspace: this.backspace(); break;\n case EDITOR_ACTIONS.delete: this.deleteForward(); break;\n case EDITOR_ACTIONS.deleteWord: this.deleteWordBackward(); break;\n case EDITOR_ACTIONS.newline: this.insert(\"\\n\"); break;\n case EDITOR_ACTIONS.tab: this.insert(\"\\t\"); break;\n case EDITOR_ACTIONS.submit:\n if (this.options.onSubmit === undefined) this.insert(\"\\n\");\n else {\n const value = this.value;\n this.options.history?.record(value);\n this.options.onSubmit(value);\n }\n break;\n default: throw new Error(`Unknown editor action: ${action}`);\n }\n }\n\n private insert(value: string): boolean {\n const inserted = segment(normalizeValue(value));\n if (inserted.length === 0) return false;\n const [start, end] = this.selectionRange();\n this.graphemes.splice(start, end - start, ...inserted);\n this.cursorIndex = start + inserted.length;\n this.selectionAnchor = undefined;\n this.preferredColumn = undefined;\n this.changed();\n return true;\n }\n\n private backspace(): boolean {\n if (this.deleteSelection()) return true;\n if (this.cursorIndex === 0) return false;\n this.selectionAnchor = undefined;\n this.graphemes.splice(this.cursorIndex - 1, 1);\n this.cursorIndex -= 1;\n this.changed();\n return true;\n }\n\n private deleteForward(): boolean {\n if (this.deleteSelection()) return true;\n if (this.cursorIndex >= this.graphemes.length) return false;\n this.selectionAnchor = undefined;\n this.graphemes.splice(this.cursorIndex, 1);\n this.changed();\n return true;\n }\n\n private moveCursor(offset: number, extend = false): void {\n const [start, end] = this.selectionRange();\n this.moveTo(!extend && this.hasSelection\n ? offset < 0 ? start : end\n : this.cursorIndex + offset, extend);\n }\n\n private moveTo(next: number, extend = false, preserveColumn = false): void {\n const previous = this.cursorIndex;\n const anchor = this.selectionAnchor;\n if (extend) this.selectionAnchor ??= previous;\n else this.selectionAnchor = undefined;\n this.cursorIndex = clamp(next, 0, this.graphemes.length);\n if (!preserveColumn) this.preferredColumn = undefined;\n if (this.cursorIndex !== previous || this.selectionAnchor !== anchor) this.revision += 1;\n }\n\n private moveVertical(direction: -1 | 1, extend = false): void {\n const hadSelection = this.hasSelection;\n if (this.layout !== undefined) {\n const position = this.layout.positions[this.cursorIndex]!;\n const nextRow = position.y + direction;\n if (nextRow >= 0 && nextRow < this.layout.rows.length) {\n this.preferredColumn ??= position.x;\n this.moveTo(indexAt(this.layout.rows[nextRow]!, this.preferredColumn), extend, true);\n return;\n }\n this.moveTo(this.cursorIndex, extend, true);\n if (!extend && !hadSelection) this.navigateHistory(direction);\n return;\n }\n const start = lineStart(this.graphemes, this.cursorIndex);\n const column = this.graphemes.slice(start, this.cursorIndex).reduce((width, value) => width + stringWidth(displayGrapheme(value)), 0);\n if (direction < 0) {\n if (start > 0) {\n this.moveTo(indexAtColumn(this.graphemes, lineStart(this.graphemes, start - 1), start - 1, column), extend);\n return;\n }\n } else {\n const end = lineEnd(this.graphemes, this.cursorIndex);\n if (end < this.graphemes.length) {\n this.moveTo(indexAtColumn(this.graphemes, end + 1, lineEnd(this.graphemes, end + 1), column), extend);\n return;\n }\n }\n this.moveTo(this.cursorIndex, extend);\n if (!extend && !hadSelection) this.navigateHistory(direction);\n }\n\n private moveWord(direction: -1 | 1, extend = false): void {\n const next = direction < 0\n ? previousWordBoundary(this.graphemes, this.cursorIndex)\n : nextWordBoundary(this.graphemes, this.cursorIndex);\n this.moveTo(next, extend);\n }\n\n private deleteWordBackward(): boolean {\n if (this.deleteSelection()) return true;\n const start = previousWordBoundary(this.graphemes, this.cursorIndex);\n if (start === this.cursorIndex) return false;\n this.selectionAnchor = undefined;\n this.graphemes.splice(start, this.cursorIndex - start);\n this.cursorIndex = start;\n this.changed();\n return true;\n }\n\n private navigateHistory(direction: -1 | 1): boolean {\n const history = this.options.history;\n if (history === undefined) return false;\n const value = direction < 0\n ? history.previous(this.value)\n : history.next();\n if (value === undefined) return false;\n this.graphemes = segment(value);\n this.cursorIndex = this.graphemes.length;\n this.selectionAnchor = undefined;\n this.preferredColumn = undefined;\n this.changed();\n return true;\n }\n\n private changed(): void {\n this.revision += 1;\n this.preferredColumn = undefined;\n this.layout = undefined;\n if (this.renderSize !== undefined) this.render(this.renderSize);\n this.options.onChange?.(this.value);\n }\n\n private selectionRange(): readonly [number, number] {\n const anchor = this.selectionAnchor ?? this.cursorIndex;\n return [Math.min(anchor, this.cursorIndex), Math.max(anchor, this.cursorIndex)];\n }\n\n private deleteSelection(): boolean {\n if (!this.hasSelection) return false;\n const [start, end] = this.selectionRange();\n this.graphemes.splice(start, end - start);\n this.cursorIndex = start;\n this.selectionAnchor = undefined;\n this.preferredColumn = undefined;\n this.changed();\n return true;\n }\n\n private copy(cut: boolean): void {\n if (!this.hasSelection) return;\n const clipboard = this.requireClipboard();\n const text = this.selectedText;\n const revision = this.revision;\n this.runClipboard(async () => {\n await clipboard.writeText(text);\n if (cut && this.revision === revision) {\n this.deleteSelection();\n this.options.onInvalidate?.();\n }\n });\n }\n\n private paste(): void {\n const clipboard = this.requireClipboard();\n const revision = this.revision;\n this.runClipboard(async () => {\n const text = await clipboard.readText();\n if (this.revision !== revision) return;\n this.insert(text);\n this.options.onInvalidate?.();\n });\n }\n\n private requireClipboard(): Clipboard {\n if (this.options.clipboard === undefined) throw new Error(\"Editor clipboard is not configured\");\n return this.options.clipboard;\n }\n\n private runClipboard(operation: () => Promise<void>): void {\n this.pendingClipboard = this.pendingClipboard.then(operation, operation);\n void this.pendingClipboard.catch((error: unknown) => {\n if (this.options.onError !== undefined) this.options.onError(error);\n else queueMicrotask(() => { throw error; });\n });\n }\n\n private pointerIndex(x: number, y: number): number {\n const layout = this.layout!;\n const size = this.renderSize!;\n if (y < 0) this.viewportStart = Math.max(0, this.viewportStart - 1);\n else if (y >= size.height) this.viewportStart = Math.min(Math.max(0, layout.rows.length - size.height), this.viewportStart + 1);\n const row = clamp(this.viewportStart + clamp(y, 0, size.height - 1), 0, layout.rows.length - 1);\n return indexAt(layout.rows[row]!, x);\n }\n\n private updateDragScroll(event: PointerEvent): void {\n this.dragPointer = event;\n const height = this.renderSize!.height;\n if (event.y >= 0 && event.y < height) {\n if (this.dragTimer !== undefined) clearInterval(this.dragTimer);\n this.dragTimer = undefined;\n return;\n }\n this.dragTimer ??= setInterval(() => {\n const pointer = this.dragPointer;\n if (!this.dragging || pointer === undefined || this.renderSize === undefined) return;\n const revision = this.revision;\n this.moveTo(this.pointerIndex(pointer.x, pointer.y), true);\n if (this.revision !== revision) {\n this.render(this.renderSize);\n this.options.onInvalidate?.();\n }\n }, 60);\n this.dragTimer.unref();\n }\n\n private stopDragging(): void {\n this.dragging = false;\n this.dragPointer = undefined;\n if (this.dragTimer !== undefined) clearInterval(this.dragTimer);\n this.dragTimer = undefined;\n }\n}\n\ninterface EditorCell {\n readonly index: number;\n readonly x: number;\n readonly width: number;\n}\n\ninterface EditorRow {\n readonly start: number;\n readonly end: number;\n readonly cells: readonly EditorCell[];\n}\n\ninterface EditorLayout {\n readonly lines: readonly string[];\n readonly rows: readonly EditorRow[];\n readonly positions: readonly CursorPosition[];\n}\n\nfunction layoutEditor(\n graphemes: readonly string[],\n width: number,\n firstPrompt: string,\n continuationPrompt: string,\n selection: readonly [number, number],\n selectionStyle: TextStyle,\n): EditorLayout {\n const lines: string[] = [];\n const rows: EditorRow[] = [];\n const positions: CursorPosition[] = [];\n let prompt = fitPrefix(firstPrompt, width);\n let line = prompt;\n let lineWidth = stringWidth(prompt);\n let promptWidth = lineWidth;\n let rowStart = 0;\n let cells: EditorCell[] = [];\n\n const nextLine = (end: number, start = end): void => {\n lines.push(line);\n rows.push({ start: rowStart, end, cells });\n rowStart = start;\n cells = [];\n prompt = fitPrefix(continuationPrompt, width);\n line = prompt;\n lineWidth = stringWidth(prompt);\n promptWidth = lineWidth;\n };\n\n for (let index = 0; index < graphemes.length; index++) {\n const grapheme = graphemes[index]!;\n if (grapheme === \"\\n\") {\n positions[index] = { x: Math.min(lineWidth, width - 1), y: lines.length };\n if (index >= selection[0] && index < selection[1] && lineWidth < width) {\n line += styleText(\" \", selectionStyle);\n }\n nextLine(index, index + 1);\n continue;\n }\n let displayed = displayGrapheme(grapheme);\n let graphemeWidth = stringWidth(displayed);\n if (lineWidth + graphemeWidth > width && lineWidth > promptWidth) nextLine(index);\n if (lineWidth + graphemeWidth > width) {\n displayed = \"\uFFFD\";\n graphemeWidth = 1;\n }\n positions[index] = { x: lineWidth, y: lines.length };\n cells.push({ index, x: lineWidth, width: graphemeWidth });\n line += index >= selection[0] && index < selection[1]\n ? styleText(displayed, selectionStyle)\n : displayed;\n lineWidth += graphemeWidth;\n }\n if (lineWidth >= width) nextLine(graphemes.length);\n positions[graphemes.length] = { x: lineWidth, y: lines.length };\n lines.push(line);\n rows.push({ start: rowStart, end: graphemes.length, cells });\n return { lines, rows, positions };\n}\n\nfunction indexAt(row: EditorRow, column: number): number {\n for (const cell of row.cells) {\n if (column < cell.x + cell.width / 2) return cell.index;\n }\n return row.end;\n}\n\nfunction indexAtColumn(graphemes: readonly string[], start: number, end: number, column: number): number {\n let width = 0;\n for (let index = start; index < end; index++) {\n const next = stringWidth(displayGrapheme(graphemes[index]!));\n if (column < width + next / 2) return index;\n width += next;\n }\n return end;\n}\n\nfunction fitPrefix(value: string, width: number): string {\n if (width <= 1) return \"\";\n return sliceAnsi(value.replace(/[\\r\\n]/gu, \"\"), 0, width - 1);\n}\n\nfunction displayGrapheme(value: string): string {\n if (value === \"\\t\") return \" \";\n if (/^[\\u0000-\\u001f\\u007f-\\u009f]$/u.test(value)) return \"\uFFFD\";\n return value;\n}\n\nfunction normalizeValue(value: string): string {\n return value.replace(/\\r\\n?/gu, \"\\n\");\n}\n\nfunction segment(value: string): string[] {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n return [...segmenter.segment(value)].map((part) => part.segment);\n}\n\nfunction lineStart(graphemes: readonly string[], cursor: number): number {\n for (let index = cursor - 1; index >= 0; index--) {\n if (graphemes[index] === \"\\n\") return index + 1;\n }\n return 0;\n}\n\nfunction lineEnd(graphemes: readonly string[], cursor: number): number {\n for (let index = cursor; index < graphemes.length; index++) {\n if (graphemes[index] === \"\\n\") return index;\n }\n return graphemes.length;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, Math.trunc(value)));\n}\n\nfunction previousWordBoundary(graphemes: readonly string[], cursor: number): number {\n let index = cursor;\n while (index > 0 && wordClass(graphemes[index - 1]!) === \"space\") index -= 1;\n if (index === 0) return index;\n const kind = wordClass(graphemes[index - 1]!);\n while (index > 0 && wordClass(graphemes[index - 1]!) === kind) index -= 1;\n return index;\n}\n\nfunction nextWordBoundary(graphemes: readonly string[], cursor: number): number {\n let index = cursor;\n while (index < graphemes.length && wordClass(graphemes[index]!) === \"space\") {\n index += 1;\n }\n if (index >= graphemes.length) return index;\n const kind = wordClass(graphemes[index]!);\n while (index < graphemes.length && wordClass(graphemes[index]!) === kind) {\n index += 1;\n }\n return index;\n}\n\nfunction wordClass(value: string): \"space\" | \"word\" | \"punctuation\" {\n if (/^\\s+$/u.test(value)) return \"space\";\n return /^[\\p{Letter}\\p{Number}\\p{Mark}_]+$/u.test(value)\n ? \"word\"\n : \"punctuation\";\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new RangeError(`${name} must be a positive safe integer`);\n }\n return value;\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport type { FocusTarget } from \"./component.js\";\n\ninterface FocusEntry {\n readonly id: string;\n readonly target: FocusTarget;\n}\n\n/** Explicit, UI-framework-level focus order without application globals. */\nexport class FocusManager {\n private readonly entries: FocusEntry[] = [];\n private activeId: string | undefined;\n\n get focusedId(): string | undefined {\n return this.activeId;\n }\n\n register(id: string, target: FocusTarget): () => void {\n if (id.trim() === \"\") throw new Error(\"Focus target id cannot be empty\");\n if (this.entries.some((entry) => entry.id === id)) {\n throw new Error(`Duplicate focus target: ${id}`);\n }\n this.entries.push({ id, target });\n if (this.activeId === undefined) this.focus(id);\n else target.setFocused(false);\n return () => this.unregister(id);\n }\n\n focus(id: string): boolean {\n const next = this.entries.find((entry) => entry.id === id);\n if (next === undefined || this.activeId === id) return next !== undefined;\n this.current()?.target.setFocused(false);\n this.activeId = id;\n next.target.setFocused(true);\n return true;\n }\n\n focusNext(): boolean {\n return this.move(1);\n }\n\n focusPrevious(): boolean {\n return this.move(-1);\n }\n\n dispatch(stroke: KeyStroke): boolean {\n return this.current()?.target.handleKey(stroke) ?? false;\n }\n\n clear(): void {\n this.current()?.target.setFocused(false);\n this.entries.splice(0, this.entries.length);\n this.activeId = undefined;\n }\n\n private unregister(id: string): void {\n const index = this.entries.findIndex((entry) => entry.id === id);\n if (index < 0) return;\n const wasActive = this.activeId === id;\n this.entries[index]!.target.setFocused(false);\n this.entries.splice(index, 1);\n if (!wasActive) return;\n this.activeId = undefined;\n const next = this.entries[Math.min(index, this.entries.length - 1)];\n if (next !== undefined) this.focus(next.id);\n }\n\n private move(offset: number): boolean {\n if (this.entries.length === 0) return false;\n const currentIndex = this.entries.findIndex((entry) =>\n entry.id === this.activeId\n );\n const index = currentIndex < 0\n ? 0\n : (currentIndex + offset + this.entries.length) % this.entries.length;\n return this.focus(this.entries[index]!.id);\n }\n\n private current(): FocusEntry | undefined {\n return this.entries.find((entry) => entry.id === this.activeId);\n }\n}\n", "import { Keymap, type KeyStroke } from \"@sortedyuan/keybindings\";\nimport type { InteractiveComponent, RenderResult, RenderSize } from \"./component.js\";\nimport { ListSelectionModel, printableKeyText } from \"./list-selection.js\";\nimport { Text, sanitizeTerminalText } from \"./text.js\";\nimport { DEFAULT_DARK_THEME, styleText, type TuiTheme } from \"./theme.js\";\n\nexport interface SessionForkPoint {\n readonly id: string;\n readonly sessionId: string;\n readonly runId: string;\n readonly createdAt: number;\n readonly userPreview: string;\n readonly assistantPreview: string;\n readonly available: boolean;\n readonly reason?: string;\n readonly parentPointId?: string;\n readonly branch?: string;\n readonly commit?: string;\n readonly worktreeAvailable?: boolean;\n}\n\nexport interface SessionForkSelection {\n readonly pointId: string;\n readonly mode: \"current\" | \"worktree\";\n}\n\ninterface TreeRow { readonly point: SessionForkPoint; readonly depth: number; readonly children: boolean }\n\n/** \u5386\u53F2\u7236\u5B50\u5173\u7CFB\u4FDD\u7559 Session \u6765\u6E90\uFF0C\u53EF\u901A\u8FC7\u952E\u76D8\u6D4F\u89C8\u3001\u641C\u7D22\u548C\u9884\u89C8\u3002 */\nexport class SessionForkTree {\n private readonly rows: readonly TreeRow[];\n private readonly collapsed = new Set<string>();\n private readonly selection: ListSelectionModel<TreeRow>;\n constructor(points: readonly SessionForkPoint[], currentSessionId?: string) {\n const byId = new Map<string, SessionForkPoint>();\n for (const point of points) {\n if (byId.has(point.id)) throw new Error(`Duplicate history position: ${point.id}`);\n byId.set(point.id, point);\n }\n const children = new Map<string | undefined, SessionForkPoint[]>();\n for (const point of points) {\n const parent = point.parentPointId && byId.has(point.parentPointId) ? point.parentPointId : undefined;\n const siblings = children.get(parent) ?? []; siblings.push(point); children.set(parent, siblings);\n }\n for (const siblings of children.values()) siblings.sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id));\n const rows: TreeRow[] = [], visited = new Set<string>();\n const visit = (point: SessionForkPoint, depth: number) => {\n if (visited.has(point.id)) throw new Error(`Circular history relation: ${point.id}`);\n visited.add(point.id);\n const descendants = children.get(point.id) ?? [];\n rows.push({ point, depth, children: descendants.length > 0 });\n for (const descendant of descendants) visit(descendant, depth + 1);\n };\n for (const point of children.get(undefined) ?? []) visit(point, 0);\n if (visited.size !== points.length) throw new Error(\"History relations contain a cycle\");\n this.rows = rows;\n const newest = rows.filter(row => row.point.available && (!currentSessionId || row.point.sessionId === currentSessionId)).sort((a, b) => b.point.createdAt - a.point.createdAt)[0];\n this.selection = new ListSelectionModel(rows, { initialIndex: newest ? rows.indexOf(newest) : 0, pageSize: 8, filter: (row, query) => [row.point.id, row.point.sessionId, row.point.userPreview, row.point.assistantPreview, row.point.branch, row.point.commit].some(value => value?.toLocaleLowerCase().includes(query)) });\n }\n get items() { return this.selection.items; }\n get selected() { return this.selection.selected?.point; }\n get selectedIndex() { return this.selection.selectedIndex; }\n get query() { return this.selection.query; }\n move(action: Parameters<ListSelectionModel<TreeRow>[\"move\"]>[0]) { this.selection.move(action); }\n appendQuery(text: string) { this.selection.setItems(this.rows); this.selection.appendQuery(text); }\n backspaceQuery() { this.selection.backspaceQuery(); }\n clearQuery() { const preferred = this.selected?.id; this.selection.clearQuery(); this.refresh(preferred ?? \"\"); }\n isCollapsed(id: string) { return this.collapsed.has(id); }\n collapse() {\n const row = this.selection.selected;\n if (!row) return;\n if (row.children && !this.collapsed.has(row.point.id)) this.collapsed.add(row.point.id);\n else if (row.point.parentPointId) { this.refresh(row.point.parentPointId); return; }\n this.refresh(row.point.id);\n }\n expand() { const point = this.selected; if (point) { this.collapsed.delete(point.id); this.refresh(point.id); } }\n private select(id: string) { const index = this.items.findIndex(row => row.point.id === id); if (index < 0) return; this.selection.move(\"home\"); for (let step = 0; step < index; step++) this.selection.move(\"down\"); }\n private refresh(preferred: string) {\n let hiddenBelow: number | undefined;\n const visible = this.rows.filter(row => {\n if (hiddenBelow !== undefined && row.depth > hiddenBelow) return false;\n hiddenBelow = this.collapsed.has(row.point.id) ? row.depth : undefined; return true;\n });\n this.selection.setItems(this.query ? this.rows : visible); this.select(preferred);\n }\n}\n\nconst bindings = [\n [\"up\", \"up\"], [\"down\", \"down\"], [\"pageup\", \"page-up\"], [\"pagedown\", \"page-down\"],\n [\"home\", \"home\"], [\"end\", \"end\"], [\"left\", \"collapse\"], [\"right\", \"expand\"],\n [\"space\", \"preview\"], [\"/\", \"search\"], [\"enter\", \"accept\"], [\"escape\", \"cancel\"], [\"ctrl+c\", \"cancel\"],\n].map(([keys, action]) => ({ context: \"fork\", keys: keys!, action: action! }));\n\nexport class SessionForkPicker implements InteractiveComponent {\n readonly tree: SessionForkTree;\n private readonly keymap = new Keymap(bindings, { actions: bindings.map(binding => binding.action) });\n private mode: \"history\" | \"search\" | \"workspace\" = \"history\";\n private workspaceIndex = 0;\n private preview = false;\n private previewOffset = 0;\n private previewPageSize = 5;\n private previewLength = 0;\n private notice = \"\";\n constructor(points: readonly SessionForkPoint[], private readonly options: { readonly currentSessionId?: string; readonly theme?: TuiTheme; readonly onComplete: (selection?: SessionForkSelection) => void }) {\n this.tree = new SessionForkTree(points, options.currentSessionId);\n }\n handleKey(stroke: KeyStroke): boolean {\n const action = this.keymap.resolve(stroke, [\"fork\"]);\n const value = action.type === \"action\" ? action.action : undefined;\n if (this.mode === \"search\") {\n if (stroke.key === \"escape\") { this.tree.clearQuery(); this.mode = \"history\"; }\n else if (stroke.key === \"enter\") this.mode = \"history\";\n else if (stroke.key === \"backspace\") this.tree.backspaceQuery();\n else if (stroke.ctrl && stroke.key === \"u\") this.tree.clearQuery();\n else if (value === \"up\" || value === \"down\" || value === \"page-up\" || value === \"page-down\") this.tree.move(value);\n else if (stroke.ctrl && stroke.key === \"c\") this.options.onComplete();\n else { const text = printableKeyText(stroke); if (text) this.tree.appendQuery(text); }\n return true;\n }\n if (value === \"cancel\") { if (this.mode === \"workspace\" && !stroke.ctrl) this.mode = \"history\"; else this.options.onComplete(); return true; }\n if (this.mode === \"workspace\") {\n if (value === \"up\" || value === \"down\" || value === \"collapse\" || value === \"expand\") this.workspaceIndex = 1 - this.workspaceIndex;\n if (value === \"accept\") {\n const point = this.tree.selected;\n if (point && (this.workspaceIndex === 0 || point.worktreeAvailable)) this.options.onComplete({ pointId: point.id, mode: this.workspaceIndex === 0 ? \"current\" : \"worktree\" });\n }\n return true;\n }\n if (this.preview && (value === \"page-up\" || value === \"page-down\")) this.previewOffset = Math.max(0, Math.min(Math.max(0, this.previewLength - this.previewPageSize), this.previewOffset + (value === \"page-up\" ? -this.previewPageSize : this.previewPageSize)));\n else if (value === \"up\" || value === \"down\" || value === \"page-up\" || value === \"page-down\" || value === \"home\" || value === \"end\") { this.tree.move(value); this.previewOffset = 0; }\n else if (value === \"collapse\") this.tree.collapse();\n else if (value === \"expand\") this.tree.expand();\n else if (value === \"preview\") { this.preview = !this.preview; this.previewOffset = 0; }\n else if (value === \"search\") this.mode = \"search\";\n else if (value === \"accept\") {\n const point = this.tree.selected;\n if (point?.available) { this.mode = \"workspace\"; this.workspaceIndex = 0; this.notice = \"\"; }\n else this.notice = point?.reason ?? \"\u8BE5\u5386\u53F2\u4F4D\u7F6E\u65E0\u6CD5\u6062\u590D\u3002\";\n }\n return true;\n }\n render(size: RenderSize): RenderResult {\n const theme = this.options.theme ?? DEFAULT_DARK_THEME;\n const selected = this.tree.selected;\n if (this.mode === \"workspace\") return new Text([\n \"\u9009\u62E9\u5206\u652F\u5DE5\u4F5C\u533A\", \"\", `${this.workspaceIndex === 0 ? \"\u25B8\" : \" \"} \u5F53\u524D\u5DE5\u4F5C\u533A`, \" \u4FDD\u7559\u5F53\u524D\u6587\u4EF6\u5185\u5BB9\u548C Git branch\u3002\",\n `${this.workspaceIndex === 1 ? \"\u25B8\" : \" \"} \u65B0\u5EFA worktree${selected?.worktreeAvailable ? \"\" : \"\uFF08\u6587\u4EF6\u7248\u672C\u4E0D\u53EF\u7528\uFF09\"}`,\n ` \u4F7F\u7528\u5386\u53F2 commit ${selected?.commit?.slice(0, 12) ?? \"\u4E0D\u53EF\u7528\"}\u3002`, \"\", \"\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u521B\u5EFA \u00B7 Esc \u8FD4\u56DE\",\n ].join(\"\\n\")).render(size);\n const previewBudget = this.preview ? Math.max(0, Math.min(9, Math.floor(size.height / 2))) : 0;\n const budget = Math.max(1, size.height - previewBudget - 4);\n const start = Math.floor(this.tree.selectedIndex / budget) * budget;\n const lines = this.tree.items.slice(start, start + budget).map((row, offset) => {\n const point = row.point;\n const marker = row.children ? this.tree.isCollapsed(point.id) ? \"\u25B8\" : \"\u25BE\" : \"\u00B7\";\n const label = sanitizeTerminalText(point.userPreview).replace(/\\s+/gu, \" \");\n return styleText(`${start + offset === this.tree.selectedIndex ? \"\u25B8\" : \" \"} ${\" \".repeat(Math.min(row.depth, 8))}${marker} ${new Date(point.createdAt).toLocaleString()} \u00B7 ${label} \u00B7 ${point.commit?.slice(0, 8) ?? \"\u65E0\u6587\u4EF6\u7248\u672C\"}${point.available ? \"\" : \" \u00B7 \u65E0\u6CD5\u6062\u590D\"}`, start + offset === this.tree.selectedIndex ? theme.accent : theme.text);\n });\n if (!lines.length) lines.push(\"\u6CA1\u6709\u5339\u914D\u7684\u5386\u53F2\u4F4D\u7F6E\u3002\");\n lines.unshift(`\u5386\u53F2\u4F4D\u7F6E${this.tree.query ? ` \u00B7 \u641C\u7D22\uFF1A${sanitizeTerminalText(this.tree.query)}` : \"\"}`, \"\");\n if (previewBudget && selected) {\n const previewLines = new Text(`Session ${sanitizeTerminalText(selected.sessionId)}\\n\u8BF7\u6C42\uFF1A${sanitizeTerminalText(selected.userPreview)}\\n\u56DE\u590D\uFF1A${sanitizeTerminalText(selected.assistantPreview)}\\n\u7248\u672C\uFF1A${sanitizeTerminalText(selected.branch ?? \"\")} ${selected.commit?.slice(0, 12) ?? \"\u4E0D\u53EF\u7528\"}`).render({ width: size.width, height: 100_000 }).lines;\n this.previewLength = previewLines.length; this.previewPageSize = Math.max(1, previewBudget - 1);\n lines.push(\"\", ...previewLines.slice(this.previewOffset, this.previewOffset + this.previewPageSize));\n }\n if (this.notice) lines.push(styleText(sanitizeTerminalText(this.notice), theme.warning));\n lines.push(\"\", this.mode === \"search\" ? \"\u8F93\u5165\u641C\u7D22\u5185\u5BB9 \u00B7 Enter \u5B8C\u6210 \u00B7 Esc \u6E05\u9664\u641C\u7D22\" : `\u2191\u2193 \u9009\u62E9 \u00B7 \u2190\u2192 \u5C55\u5F00\u6216\u6536\u8D77 \u00B7 / \u641C\u7D22 \u00B7 Space \u9884\u89C8${this.preview ? \" \u00B7 PgUp/PgDn \u9884\u89C8\u7FFB\u9875\" : \"\"} \u00B7 Enter \u7EE7\u7EED \u00B7 Esc \u53D6\u6D88`);\n return new Text(lines.join(\"\\n\"), { wrap: false }).render(size);\n }\n}\n", "import { lexer, type Token, type Tokens } from \"marked\";\nimport { sanitizeTerminalText } from \"./text.js\";\n\nexport interface MarkdownExcerptOptions {\n /** \u5305\u542B\u7701\u7565\u53F7\u7684\u6700\u5927\u53EF\u89C1\u5B57\u7B26\u6570\u91CF\uFF0C\u6309 grapheme \u8BA1\u7B97\uFF1B\u6362\u884C\u4E0D\u8BA1\u6570\u3002 */\n readonly maxCharacters?: number;\n /** \u81EA\u52A8\u6362\u884C\u4E4B\u524D\u7684\u6700\u5927\u903B\u8F91\u884C\u6570\uFF0C\u5305\u542B\u7A7A\u884C\u3002 */\n readonly maxLines?: number;\n}\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\n/** \u5B8C\u6574\u89E3\u6790 Markdown \u540E\u751F\u6210\u7EAF\u6587\u672C\u8282\u9009\uFF0C\u4FDD\u7559\u4EE3\u7801\u5185\u5BB9\u548C Unicode \u5B57\u7B26\u3002 */\nexport function renderMarkdownExcerpt(source: string, options: MarkdownExcerptOptions = {}): string {\n const maxCharacters = options.maxCharacters ?? 400;\n const maxLines = options.maxLines ?? 6;\n for (const [name, value] of Object.entries({ maxCharacters, maxLines })) {\n if (!Number.isSafeInteger(value) || value < 1) throw new RangeError(`${name} must be a positive safe integer`);\n }\n const plain = blocks(lexer(sanitizeTerminalText(source), { gfm: true, breaks: false }));\n const lines: string[] = [];\n for (const line of plain.split(\"\\n\")) {\n const value = line.trimEnd();\n if (value === \"\" && (lines.length === 0 || lines.at(-1) === \"\")) continue;\n lines.push(value);\n }\n while (lines.at(-1) === \"\") lines.pop();\n const segments = Array.from(graphemes.segment(lines.join(\"\\n\")), part => part.segment);\n const visibleCount = segments.filter(value => value !== \"\\n\").length;\n if (visibleCount <= maxCharacters && lines.length <= maxLines) return lines.join(\"\\n\");\n\n let result = \"\";\n let characters = 0;\n let lineCount = 1;\n for (const segment of segments) {\n if (segment === \"\\n\") {\n if (lineCount === maxLines) break;\n lineCount++;\n } else {\n if (characters === maxCharacters - 1) break;\n characters++;\n }\n result += segment;\n }\n return `${result.trimEnd()}\u2026`;\n}\n\nfunction blocks(tokens: readonly Token[]): string {\n return tokens.map(token => {\n switch (token.type) {\n case \"space\":\n case \"def\":\n case \"hr\":\n case \"checkbox\":\n return \"\";\n case \"heading\":\n case \"paragraph\":\n return inline((token as Tokens.Heading | Tokens.Paragraph).tokens);\n case \"text\": {\n const text = token as Tokens.Text;\n return text.tokens === undefined ? text.text : inline(text.tokens);\n }\n case \"code\":\n return (token as Tokens.Code).text;\n case \"html\":\n return (token as Tokens.HTML).text;\n case \"blockquote\":\n return blocks((token as Tokens.Blockquote).tokens);\n case \"list\": {\n const list = token as Tokens.List;\n const start = typeof list.start === \"number\" ? list.start : 1;\n return list.items.map((item, index) => {\n const prefix = `${list.ordered ? `${start + index}.` : \"\u2022\"} ${item.task ? `[${item.checked ? \"x\" : \" \"}] ` : \"\"}`;\n return blocks(item.tokens).split(\"\\n\")\n .map((line, lineIndex) => `${lineIndex === 0 ? prefix : \" \".repeat(prefix.length)}${line}`).join(\"\\n\");\n }).join(\"\\n\");\n }\n case \"table\": {\n const table = token as Tokens.Table;\n const headers = table.header.map(cell => inline(cell.tokens).replace(/\\n/gu, \" \"));\n if (table.rows.length === 0) return headers.join(\"; \");\n return table.rows.map(row => row.map((cell, index) => {\n const value = inline(cell.tokens).replace(/\\n/gu, \" \");\n return headers[index] ? `${headers[index]}: ${value}` : value;\n }).join(\"; \")).join(\"\\n\");\n }\n default:\n throw new Error(`Unsupported Markdown block: ${token.type}`);\n }\n }).filter(value => value !== \"\").join(\"\\n\\n\");\n}\n\nfunction inline(tokens: readonly Token[]): string {\n return tokens.map(token => {\n switch (token.type) {\n case \"text\": {\n const text = token as Tokens.Text;\n return text.tokens === undefined ? text.text : inline(text.tokens);\n }\n case \"escape\":\n case \"codespan\":\n case \"html\":\n return (token as Tokens.Escape | Tokens.Codespan | Tokens.Tag).text;\n case \"strong\":\n case \"em\":\n case \"del\":\n return inline((token as Tokens.Strong | Tokens.Em | Tokens.Del).tokens);\n case \"br\":\n return \"\\n\";\n case \"checkbox\":\n return \"\";\n case \"link\": {\n const link = token as Tokens.Link;\n const label = inline(link.tokens);\n return label === link.href ? label : `${label} (${link.href})`;\n }\n case \"image\": {\n const image = token as Tokens.Image;\n const label = inline(image.tokens);\n return label ? `${label} (${image.href})` : image.href;\n }\n default:\n throw new Error(`Unsupported Markdown inline token: ${token.type}`);\n }\n }).join(\"\");\n}\n", "import type { KeyStroke } from \"@sortedyuan/keybindings\";\nimport { placeImages } from \"./component.js\";\nimport sliceAnsi from \"slice-ansi\";\nimport stringWidth from \"string-width\";\nimport type {\n Component,\n InteractiveComponent,\n RenderResult,\n RenderSize,\n PointerEvent,\n} from \"./component.js\";\nimport { styleText, type TextStyle } from \"./theme.js\";\n\nexport interface OverlayOptions {\n readonly width?: number;\n readonly height?: number;\n readonly horizontal?: \"left\" | \"center\" | \"right\";\n readonly vertical?: \"top\" | \"center\" | \"bottom\";\n}\n\nexport class Overlay implements Component {\n private bounds: { left: number; top: number; width: number; height: number } | undefined;\n private captured = false;\n constructor(\n private readonly base: Component,\n private readonly foreground: Component,\n private readonly options: OverlayOptions = {},\n ) {}\n\n render(size: RenderSize): RenderResult {\n const base = this.base.render(size);\n const width = clamp(this.options.width ?? Math.min(60, size.width), 1, size.width);\n const height = clamp(this.options.height ?? Math.min(12, size.height), 1, size.height);\n const left = alignmentOffset(size.width, width, this.options.horizontal ?? \"center\");\n const top = alignmentOffset(size.height, height, this.options.vertical ?? \"center\");\n this.bounds = { left, top, width, height };\n const foreground = this.foreground.render({ width, height });\n const lines = Array.from({ length: size.height }, (_, row) =>\n fitLine(base.lines[row] ?? \"\", size.width)\n );\n\n for (let row = 0; row < height; row++) {\n lines[top + row] = replaceColumns(\n lines[top + row]!,\n left,\n width,\n foreground.lines[row] ?? \"\",\n size.width,\n );\n }\n return {\n lines,\n ...(foreground.cursor === undefined\n ? {}\n : {\n cursor: {\n ...foreground.cursor,\n x: foreground.cursor.x + left,\n y: foreground.cursor.y + top,\n },\n }),\n };\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (event.type === \"down\") this.captured = false;\n const bounds = this.bounds;\n if (bounds === undefined) return false;\n const inside = event.x >= bounds.left && event.x < bounds.left + bounds.width &&\n event.y >= bounds.top && event.y < bounds.top + bounds.height;\n if (!inside && !this.captured) return false;\n const handled = this.foreground.handlePointer?.({ ...event, x: event.x - bounds.left, y: event.y - bounds.top }) ?? false;\n if (event.type === \"down\" && handled) this.captured = true;\n if (event.type === \"up\") this.captured = false;\n return handled;\n }\n}\n\nexport interface PanelOptions {\n readonly title?: string;\n readonly borderStyle?: TextStyle;\n readonly titleStyle?: TextStyle;\n}\n\nexport class Panel implements Component {\n private size: RenderSize | undefined;\n private captured = false;\n constructor(\n private readonly child: Component,\n private readonly options: PanelOptions = {},\n ) {}\n\n render(size: RenderSize): RenderResult {\n this.size = size;\n if (size.width < 2 || size.height < 2) {\n return { lines: Array.from({ length: size.height }, () => \"\u00B7\") };\n }\n const innerWidth = size.width - 2;\n const innerHeight = size.height - 2;\n const child = innerWidth > 0 && innerHeight > 0\n ? this.child.render({ width: innerWidth, height: innerHeight })\n : { lines: [] };\n const title = this.options.title === undefined\n ? \"\"\n : ` ${singleLine(this.options.title)} `;\n const top = styleText(`\u250C${fitLine(title, innerWidth, \"\u2500\")}\u2510`, this.options.borderStyle);\n const bottom = styleText(`\u2514${\"\u2500\".repeat(innerWidth)}\u2518`, this.options.borderStyle);\n const side = styleText(\"\u2502\", this.options.borderStyle);\n const body = Array.from({ length: innerHeight }, (_, row) =>\n `${side}${fitLine(child.lines[row] ?? \"\", innerWidth)}${side}`\n );\n const styledTop = title === \"\" || this.options.titleStyle === undefined\n ? top\n : replaceTitleStyle(top, sliceAnsi(title, 0, innerWidth), this.options.titleStyle, this.options.borderStyle);\n return {\n lines: [styledTop, ...body, bottom],\n ...(child.textRows === undefined ? {} : { textRows: [undefined,\n ...Array.from({ length: innerHeight }, (_, index) => {\n const row = child.textRows?.[index];\n return row === undefined ? undefined : { ...row, spans: row.spans.map(span => ({ ...span, x: span.x + 1 })) };\n }), undefined] }),\n ...(child.images?.length ? { images: placeImages(child.images, 1, size.height - 1).map(image => ({ ...image, x: image.x + 1 })) } : {}),\n ...(child.cursor === undefined\n ? {}\n : { cursor: { ...child.cursor, x: child.cursor.x + 1, y: child.cursor.y + 1 } }),\n };\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (event.type === \"down\") this.captured = false;\n const size = this.size;\n if (size === undefined || size.width < 3 || size.height < 3) return false;\n const inside = event.x >= 1 && event.x < size.width - 1 && event.y >= 1 && event.y < size.height - 1;\n if (!inside && !this.captured) return false;\n const handled = this.child.handlePointer?.({ ...event, x: event.x - 1, y: event.y - 1 }) ?? false;\n if (event.type === \"down\" && handled) this.captured = true;\n if (event.type === \"up\") this.captured = false;\n return handled;\n }\n\n dispose(): void { this.captured = false; this.child.dispose?.(); }\n}\n\nexport interface DialogOptions extends OverlayOptions, PanelOptions {\n readonly open?: boolean;\n readonly dismissOnEscape?: boolean;\n readonly onClose?: () => void;\n}\n\n/** Modal input routing plus a bordered overlay. */\nexport class Dialog implements InteractiveComponent {\n private opened: boolean;\n private readonly overlay: Overlay;\n\n constructor(\n private readonly base: InteractiveComponent,\n private readonly content: InteractiveComponent,\n private readonly options: DialogOptions = {},\n ) {\n this.opened = options.open ?? false;\n this.overlay = new Overlay(base, new Panel(content, options), options);\n }\n\n get isOpen(): boolean {\n return this.opened;\n }\n\n open(): boolean {\n if (this.opened) return false;\n this.opened = true;\n return true;\n }\n\n close(): boolean {\n if (!this.opened) return false;\n this.opened = false;\n this.options.onClose?.();\n return true;\n }\n\n handleKey(stroke: KeyStroke): boolean {\n if (!this.opened) return this.base.handleKey(stroke);\n if (stroke.key === \"escape\" && (this.options.dismissOnEscape ?? true)) {\n return this.close();\n }\n return this.content.handleKey(stroke);\n }\n\n render(size: RenderSize): RenderResult {\n if (!this.opened) return this.base.render(size);\n return this.overlay.render(size);\n }\n\n handlePointer(event: PointerEvent): boolean {\n return this.opened ? this.overlay.handlePointer(event) : this.base.handlePointer?.(event) ?? false;\n }\n\n dispose(): void {\n this.content.dispose?.();\n }\n}\n\nfunction replaceColumns(\n base: string,\n start: number,\n width: number,\n replacement: string,\n totalWidth: number,\n): string {\n const before = fitLine(sliceAnsi(base, 0, start), start);\n const middle = fitLine(replacement, width);\n const after = sliceAnsi(base, start + width, totalWidth);\n return fitLine(`${before}${middle}${after}`, totalWidth);\n}\n\nfunction fitLine(value: string, width: number, fill = \" \"): string {\n const clipped = sliceAnsi(value.replace(/[\\r\\n]/gu, \"\"), 0, width);\n return `${clipped}${fill.repeat(Math.max(0, width - stringWidth(clipped)))}`;\n}\n\nfunction alignmentOffset(\n available: number,\n used: number,\n alignment: \"left\" | \"center\" | \"right\" | \"top\" | \"bottom\",\n): number {\n if (alignment === \"left\" || alignment === \"top\") return 0;\n if (alignment === \"right\" || alignment === \"bottom\") return available - used;\n return Math.floor((available - used) / 2);\n}\n\nfunction singleLine(value: string): string {\n return value.replace(/\\s+/gu, \" \").trim();\n}\n\nfunction replaceTitleStyle(\n line: string,\n title: string,\n titleStyle: TextStyle,\n borderStyle?: TextStyle,\n): string {\n const start = 1;\n const before = sliceAnsi(line, 0, start);\n const after = sliceAnsi(line, start + stringWidth(title));\n return `${before}${styleText(title, titleStyle)}${styleText(after, borderStyle)}`;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum;\n return Math.min(maximum, Math.max(minimum, Math.trunc(value)));\n}\n", "import { Keymap, mergeKeyBindings, type KeyBindingDefinition, type KeyStroke } from \"@sortedyuan/keybindings\";\nimport type {\n Component,\n FocusTarget,\n InteractiveComponent,\n RenderResult,\n RenderSize,\n PointerEvent,\n KeyHandlingResult,\n} from \"./component.js\";\nimport { placeImages } from \"./component.js\";\n\nexport interface ScrollViewOptions {\n readonly followEnd?: boolean;\n readonly maxContentLines?: number;\n readonly onInvalidate?: () => void;\n readonly keybindings?: readonly KeyBindingDefinition[];\n}\n\nexport const DEFAULT_SCROLL_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n { context: \"scroll\", keys: \"wheelup\", action: \"scroll.wheelUp\" },\n { context: \"scroll\", keys: \"wheeldown\", action: \"scroll.wheelDown\" },\n { context: \"scroll\", keys: \"up\", action: \"scroll.up\" },\n { context: \"scroll\", keys: \"down\", action: \"scroll.down\" },\n { context: \"scroll\", keys: \"pageup\", action: \"scroll.pageUp\" },\n { context: \"scroll\", keys: \"pagedown\", action: \"scroll.pageDown\" },\n { context: \"scroll\", keys: \"home\", action: \"scroll.start\" },\n { context: \"scroll\", keys: \"end\", action: \"scroll.end\" },\n];\n\nexport interface ScrollRegion {\n /** Inclusive zero-based content row. */\n readonly start: number;\n /** Inclusive zero-based content row. */\n readonly end: number;\n}\n\n/** A viewport over a child component's rendered lines. */\nexport class ScrollView implements InteractiveComponent, FocusTarget {\n private offset = 0;\n private followEnd: boolean;\n private readonly maxContentLines: number;\n private focused = false;\n private lastMaximumOffset = 0;\n private lastPageSize = 1;\n private pendingAnchor: PendingScrollAnchor | undefined;\n private topAnchor: (() => ScrollRegion | undefined) | undefined;\n private alignedToStart = false;\n private readonly keymap: Keymap;\n private readonly onInvalidate: (() => void) | undefined;\n private pointer: PointerEvent | undefined;\n private dragTimer: ReturnType<typeof setInterval> | undefined;\n private viewportAnchor: { sourceId: string; offset: number; screenRow: number } | undefined;\n\n constructor(\n private readonly child: Component,\n options: ScrollViewOptions = {},\n ) {\n this.followEnd = options.followEnd ?? false;\n this.maxContentLines = options.maxContentLines ?? 10_000;\n this.onInvalidate = options.onInvalidate;\n this.keymap = new Keymap(mergeKeyBindings(DEFAULT_SCROLL_KEYBINDINGS, options.keybindings), {\n actions: DEFAULT_SCROLL_KEYBINDINGS.map(binding => binding.action),\n });\n if (!Number.isInteger(this.maxContentLines) || this.maxContentLines < 1) {\n throw new RangeError(\"maxContentLines must be a positive integer\");\n }\n }\n\n get scrollOffset(): number {\n return this.offset;\n }\n\n /** \u5728\u6E32\u67D3\u540E\u5C06\u76EE\u6807\u7B2C\u4E00\u884C\u7F6E\u4E8E\u9876\u90E8\uFF0C\u5E76\u5728\u5185\u5BB9\u53D8\u5316\u65F6\u4FDD\u6301\u8BE5\u4F4D\u7F6E\u3002 */\n scrollToAnchor(resolveAfterRender: () => ScrollRegion | undefined): void {\n this.viewportAnchor = undefined;\n this.followEnd = false;\n this.pendingAnchor = undefined;\n this.topAnchor = resolveAfterRender;\n this.alignedToStart = true;\n }\n\n setFocused(focused: boolean): void {\n if (this.focused !== focused) this.keymap.reset();\n this.focused = focused;\n if (isFocusTarget(this.child)) this.child.setFocused(focused);\n }\n\n /** Stop following appended content without changing the current viewport. */\n detachFromEnd(): void {\n this.followEnd = false;\n }\n\n /** Keep a logical content row at its current screen row across the next render. */\n preserveAnchor(\n region: ScrollRegion,\n resolveAfterRender: () => ScrollRegion | undefined,\n ): void {\n if (this.topAnchor !== undefined) return;\n this.viewportAnchor = undefined;\n this.followEnd = false;\n if (region.start < this.offset || region.start >= this.offset + this.lastPageSize) {\n this.pendingAnchor = undefined;\n return;\n }\n this.pendingAnchor = {\n screenRow: region.start - this.offset,\n resolveAfterRender,\n };\n }\n\n ensureVisible(region: ScrollRegion, margin = 1): boolean {\n this.viewportAnchor = undefined;\n this.topAnchor = undefined;\n this.alignedToStart = false;\n const safeMargin = Math.max(0, Math.min(Math.trunc(margin), this.lastPageSize - 1));\n let next = this.offset;\n if (region.start < this.offset + safeMargin) {\n next = region.start - safeMargin;\n } else if (region.end >= this.offset + this.lastPageSize - safeMargin) {\n next = region.end - this.lastPageSize + safeMargin + 1;\n }\n next = clamp(next, 0, this.lastMaximumOffset);\n if (next === this.offset && !this.followEnd) return false;\n this.offset = next;\n this.followEnd = false;\n return true;\n }\n\n scrollBy(lines: number): boolean {\n this.viewportAnchor = undefined;\n this.topAnchor = undefined;\n const next = clamp(this.offset + Math.trunc(lines), 0, Math.max(this.offset, this.lastMaximumOffset));\n if (next === this.offset) return false;\n this.offset = next;\n this.followEnd = this.offset === this.lastMaximumOffset;\n return true;\n }\n\n scrollToStart(): boolean {\n this.viewportAnchor = undefined;\n this.topAnchor = undefined;\n this.alignedToStart = false;\n if (this.offset === 0 && !this.followEnd) return false;\n this.offset = 0;\n this.followEnd = false;\n return true;\n }\n\n scrollToEnd(): boolean {\n this.viewportAnchor = undefined;\n this.topAnchor = undefined;\n this.alignedToStart = false;\n if (this.offset === this.lastMaximumOffset && this.followEnd) return false;\n this.offset = this.lastMaximumOffset;\n this.followEnd = true;\n return true;\n }\n\n handleKey(stroke: KeyStroke): boolean {\n return this.handleKeyResult(stroke).consumed;\n }\n\n handleKeyResult(stroke: KeyStroke): KeyHandlingResult {\n if (!this.focused) return { consumed: false, redraw: false };\n if (isInteractive(this.child) && this.child.handleKey(stroke)) {\n this.followEnd = false;\n return { consumed: true, redraw: true };\n }\n const result = this.keymap.resolve(stroke, [\"scroll\"]);\n if (result.type !== \"action\") return { consumed: result.type === \"pending\", redraw: false };\n let redraw: boolean;\n switch (result.action) {\n case \"scroll.wheelUp\": redraw = this.scrollBy(-3); break;\n case \"scroll.wheelDown\": redraw = this.scrollBy(3); break;\n case \"scroll.up\": redraw = this.scrollBy(-1); break;\n case \"scroll.down\": redraw = this.scrollBy(1); break;\n case \"scroll.pageUp\": redraw = this.scrollBy(-this.lastPageSize); break;\n case \"scroll.pageDown\": redraw = this.scrollBy(this.lastPageSize); break;\n case \"scroll.start\": redraw = this.scrollToStart(); break;\n case \"scroll.end\": redraw = this.scrollToEnd(); break;\n default: throw new Error(`Unknown scroll action: ${result.action}`);\n }\n return { consumed: true, redraw };\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (this.child.handlePointer === undefined) return false;\n if (event.type !== \"down\" && this.pointer === undefined) return false;\n const consumed = this.child.handlePointer({ ...event,\n y: this.offset + clamp(event.y, 0, this.lastPageSize - 1) });\n if (event.type === \"down\" && consumed) {\n this.followEnd = false;\n this.topAnchor = undefined;\n this.alignedToStart = false;\n this.pointer = event;\n } else if (this.pointer !== undefined) this.pointer = event;\n if (event.type === \"up\") this.stopDragging();\n else if (this.pointer !== undefined) this.updateAutoScroll();\n return consumed;\n }\n\n clearPointerSelection(): void {\n this.stopDragging();\n if (\"clearSelection\" in this.child && typeof this.child.clearSelection === \"function\") this.child.clearSelection();\n }\n\n dispose(): void {\n this.stopDragging();\n this.child.dispose?.();\n }\n\n private stopDragging(): void {\n this.pointer = undefined;\n if (this.dragTimer !== undefined) clearInterval(this.dragTimer);\n this.dragTimer = undefined;\n }\n\n private updateAutoScroll(): void {\n const pointer = this.pointer;\n const atEdge = pointer !== undefined && (pointer.y <= 0 || pointer.y >= this.lastPageSize - 1);\n if (!atEdge && this.dragTimer !== undefined) {\n clearInterval(this.dragTimer);\n this.dragTimer = undefined;\n } else if (atEdge && this.dragTimer === undefined) {\n this.dragTimer = setInterval(() => {\n const event = this.pointer;\n if (event === undefined) return;\n const direction = event.y <= 0 ? -1 : 1;\n if (!this.scrollBy(direction)) return;\n this.followEnd = false;\n this.child.handlePointer?.({ ...event, type: \"move\", y: this.offset + clamp(event.y, 0, this.lastPageSize - 1) });\n this.onInvalidate?.();\n }, 60);\n this.dragTimer.unref?.();\n }\n }\n\n render(size: RenderSize): RenderResult {\n const renderSize = {\n width: size.width,\n height: this.maxContentLines,\n };\n const content = isTailRenderable(this.child)\n ? this.child.renderTail(renderSize)\n : this.child.render(renderSize);\n this.lastPageSize = size.height;\n this.lastMaximumOffset = Math.max(0, content.lines.length - size.height);\n const pendingAnchor = this.pendingAnchor;\n this.pendingAnchor = undefined;\n const anchoredRegion = pendingAnchor?.resolveAfterRender();\n const topRegion = this.topAnchor?.();\n const maximumOffset = this.alignedToStart\n ? Math.max(0, content.lines.length - 1)\n : this.lastMaximumOffset;\n const anchor = this.viewportAnchor;\n const anchorIndex = anchor === undefined ? -1 : (content.textRows ?? []).findIndex(row => row?.sourceId === anchor.sourceId &&\n row.start <= anchor.offset && row.end > anchor.offset);\n this.offset = topRegion !== undefined\n ? clamp(topRegion.start, 0, maximumOffset)\n : anchoredRegion !== undefined && pendingAnchor !== undefined\n ? clamp(anchoredRegion.start - pendingAnchor.screenRow, 0, this.lastMaximumOffset)\n : this.followEnd\n ? this.lastMaximumOffset\n : anchorIndex >= 0 && anchor !== undefined\n ? clamp(anchorIndex - anchor.screenRow, 0, maximumOffset)\n : clamp(this.offset, 0, maximumOffset);\n\n this.viewportAnchor = undefined;\n for (let index = this.offset; index < Math.min(content.lines.length, this.offset + size.height); index++) {\n const row = content.textRows?.[index];\n if (row !== undefined && row.end > row.start) {\n this.viewportAnchor = { sourceId: row.sourceId, offset: row.start, screenRow: index - this.offset };\n break;\n }\n }\n\n const cursor = content.cursor;\n const cursorVisible = cursor !== undefined &&\n cursor.y >= this.offset && cursor.y < this.offset + size.height;\n return {\n lines: content.lines.slice(this.offset, this.offset + size.height),\n ...(content.textRows ? { textRows: content.textRows.slice(this.offset, this.offset + size.height) } : {}),\n ...(content.images?.length ? { images: placeImages(content.images, -this.offset, size.height) } : {}),\n ...(cursorVisible\n ? {\n cursor: {\n ...cursor,\n y: cursor.y - this.offset,\n visible: this.focused && cursor.visible !== false,\n },\n }\n : {}),\n };\n }\n}\n\ninterface TailRenderableComponent extends Component {\n /** Render the newest bounded content instead of truncating appended rows. */\n renderTail(size: RenderSize): RenderResult;\n}\n\nfunction isTailRenderable(component: Component): component is TailRenderableComponent {\n return \"renderTail\" in component && typeof component.renderTail === \"function\";\n}\n\ninterface PendingScrollAnchor {\n readonly screenRow: number;\n readonly resolveAfterRender: () => ScrollRegion | undefined;\n}\n\nfunction isInteractive(component: Component): component is InteractiveComponent {\n return \"handleKey\" in component && typeof component.handleKey === \"function\";\n}\n\nfunction isFocusTarget(component: Component): component is Component & FocusTarget {\n return \"setFocused\" in component && typeof component.setFocused === \"function\";\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, value));\n}\n", "import { Keymap, mergeKeyBindings, type KeyStroke, type KeyBindingDefinition } from \"@sortedyuan/keybindings\";\nimport sliceAnsi from \"slice-ansi\";\nimport stringWidth from \"string-width\";\nimport type {\n FocusTarget,\n InteractiveComponent,\n RenderResult,\n RenderSize,\n PointerEvent,\n} from \"./component.js\";\nimport { styleText, type TextStyle } from \"./theme.js\";\nimport { sanitizeTerminalText } from \"./text.js\";\n\nexport interface SelectItem<T = string> {\n readonly value: T;\n readonly label: string;\n readonly description?: string;\n readonly disabled?: boolean;\n}\n\nexport interface SelectListOptions<T> {\n readonly keybindings?: readonly KeyBindingDefinition[];\n readonly selectedIndex?: number;\n readonly emptyLabel?: string;\n readonly onSelect?: (item: SelectItem<T>, index: number) => void;\n readonly onCancel?: () => void;\n readonly selectedStyle?: TextStyle;\n readonly descriptionStyle?: TextStyle;\n readonly disabledStyle?: TextStyle;\n readonly markerStyle?: TextStyle;\n}\n\nexport const SELECT_LIST_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n { context: \"select\", keys: \"up\", action: \"list.up\" },\n { context: \"select\", keys: \"down\", action: \"list.down\" },\n { context: \"select\", keys: \"pageup\", action: \"list.pageUp\" },\n { context: \"select\", keys: \"pagedown\", action: \"list.pageDown\" },\n { context: \"select\", keys: \"home\", action: \"list.home\" },\n { context: \"select\", keys: \"end\", action: \"list.end\" },\n { context: \"select\", keys: \"enter\", action: \"list.accept\" },\n { context: \"select\", keys: \"escape\", action: \"list.cancel\" },\n];\n\nexport class SelectList<T = string>\n implements InteractiveComponent, FocusTarget {\n private items: readonly SelectItem<T>[];\n private index: number;\n private offset = 0;\n private pageSize = 1;\n private focused = false;\n private readonly keymap: Keymap;\n\n constructor(\n items: readonly SelectItem<T>[],\n private readonly options: SelectListOptions<T> = {},\n ) {\n this.items = [...items];\n this.index = firstEnabled(this.items, options.selectedIndex ?? 0);\n this.keymap = new Keymap(mergeKeyBindings(SELECT_LIST_KEYBINDINGS, options.keybindings), {\n actions: SELECT_LIST_KEYBINDINGS.map(binding => binding.action),\n });\n }\n\n get selectedIndex(): number {\n return this.index;\n }\n\n get selectedItem(): SelectItem<T> | undefined {\n return this.index < 0 ? undefined : this.items[this.index];\n }\n\n setItems(items: readonly SelectItem<T>[]): void {\n this.items = [...items];\n this.index = firstEnabled(this.items, Math.max(0, this.index));\n this.offset = 0;\n }\n\n setFocused(focused: boolean): void {\n if (focused !== this.focused) this.keymap.reset();\n this.focused = focused;\n }\n\n handleKey(stroke: KeyStroke): boolean {\n if (!this.focused) return false;\n const result = this.keymap.resolve(stroke, [\"select\"]);\n if (result.type !== \"action\") return result.type === \"pending\";\n return this.performAction(result.action);\n }\n\n performAction(action: string): boolean {\n switch (action) {\n case \"list.up\": this.move(-1); return true;\n case \"list.down\": this.move(1); return true;\n case \"list.pageUp\": this.move(-this.pageSize); return true;\n case \"list.pageDown\": this.move(this.pageSize); return true;\n case \"list.home\": this.moveTo(firstEnabled(this.items, 0)); return true;\n case \"list.end\": this.moveTo(lastEnabled(this.items)); return true;\n case \"list.accept\": {\n const item = this.selectedItem;\n if (item === undefined) return false;\n this.options.onSelect?.(item, this.index);\n return true;\n }\n case \"list.cancel\":\n this.options.onCancel?.();\n return this.options.onCancel !== undefined;\n default:\n return false;\n }\n }\n\n handlePointer(event: PointerEvent): boolean {\n if (event.button !== 0 || event.type !== \"down\" || event.y < 0 || event.y >= this.pageSize) return false;\n const index = this.offset + event.y;\n if (this.items[index] === undefined || this.items[index]!.disabled) return false;\n this.moveTo(index);\n return true;\n }\n\n render(size: RenderSize): RenderResult {\n if (this.items.length === 0) {\n return {\n lines: [sliceAnsi(\n sanitizeTerminalText(this.options.emptyLabel ?? \"No items\"),\n 0,\n size.width,\n )],\n };\n }\n this.pageSize = size.height;\n if (this.index >= 0) {\n if (this.index < this.offset) this.offset = this.index;\n if (this.index >= this.offset + size.height) {\n this.offset = this.index - size.height + 1;\n }\n }\n const maximumOffset = Math.max(0, this.items.length - size.height);\n this.offset = clamp(this.offset, 0, maximumOffset);\n\n return {\n lines: this.items\n .slice(this.offset, this.offset + size.height)\n .map((item, relativeIndex) => {\n const index = this.offset + relativeIndex;\n const marker = index === this.index ? (this.focused ? \"> \" : \"\u00B7 \") : \" \";\n const disabled = item.disabled === true ? \" (disabled)\" : \"\";\n const plainDescription = item.description === undefined\n ? \"\"\n : ` \u2014 ${singleLine(item.description)}`;\n if (index === this.index) {\n const clipped = sliceAnsi(\n `${marker}${singleLine(item.label)}${disabled}${plainDescription}`,\n 0,\n size.width,\n );\n const padded = `${clipped}${\" \".repeat(Math.max(0, size.width - stringWidth(clipped)))}`;\n return styleText(padded, this.options.selectedStyle);\n }\n const description = styleText(plainDescription, this.options.descriptionStyle);\n const line = `${styleText(marker, this.options.markerStyle)}` +\n `${singleLine(item.label)}${disabled}${description}`;\n return sliceAnsi(styleText(\n line,\n item.disabled === true ? this.options.disabledStyle : undefined,\n ), 0, size.width);\n }),\n };\n }\n\n private move(offset: number): boolean {\n if (this.index < 0 || this.items.length === 0) return false;\n const direction = offset < 0 ? -1 : 1;\n let remaining = Math.max(1, Math.abs(offset));\n let next = this.index;\n while (remaining > 0) {\n const candidate = nextEnabled(this.items, next, direction);\n if (candidate === next) break;\n next = candidate;\n remaining -= 1;\n }\n return this.moveTo(next);\n }\n\n private moveTo(index: number): boolean {\n if (index < 0 || index === this.index) return false;\n this.index = index;\n return true;\n }\n}\n\nfunction firstEnabled<T>(items: readonly SelectItem<T>[], start: number): number {\n for (let index = clamp(start, 0, Math.max(0, items.length - 1)); index < items.length; index++) {\n if (items[index]!.disabled !== true) return index;\n }\n for (let index = 0; index < start && index < items.length; index++) {\n if (items[index]!.disabled !== true) return index;\n }\n return -1;\n}\n\nfunction lastEnabled<T>(items: readonly SelectItem<T>[]): number {\n for (let index = items.length - 1; index >= 0; index--) {\n if (items[index]!.disabled !== true) return index;\n }\n return -1;\n}\n\nfunction nextEnabled<T>(\n items: readonly SelectItem<T>[],\n current: number,\n direction: -1 | 1,\n): number {\n for (let index = current + direction; index >= 0 && index < items.length; index += direction) {\n if (items[index]!.disabled !== true) return index;\n }\n return current;\n}\n\nfunction singleLine(value: string): string {\n return sanitizeTerminalText(value).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.min(maximum, Math.max(minimum, Math.trunc(value)));\n}\n", "import { sanitizeTerminalText } from \"@sortedyuan/tui\";\nimport type { McpInteractionRequest } from \"@sortedyuan/mcp\";\nimport type { MaybeCodeController } from \"./controller.js\";\n\n/** Shared ephemeral UI flow: no history, default acceptance, navigation, or model calls. */\nexport async function presentMcpInteraction(\n request: McpInteractionRequest,\n app: MaybeCodeController,\n ask: (prompt: string, signal: AbortSignal) => Promise<string | undefined>,\n signal: AbortSignal,\n): Promise<void> {\n if (app.respondMcpInteraction === undefined) return;\n const header = sanitizeTerminalText(`MCP server: ${request.serverId}\\nSession: ${request.owner.sessionId}\\n` +\n `Request: ${request.requestId}\\n${request.params.message}\\n`);\n const question = async (prompt: string) => {\n signal.throwIfAborted();\n const answer = await ask(sanitizeTerminalText(prompt), signal);\n signal.throwIfAborted();\n return answer;\n };\n let error = \"\";\n while (!signal.aborted) {\n if (request.params.mode === \"review\") {\n let data = request.params.data;\n let edited = false;\n for (;;) {\n const choice = (await question(`${header}\\nHost review: ${request.params.kind}\\n${JSON.stringify(data, null, 2)}\\n${error}` +\n `Type allow to approve${request.params.editable ? \", edit to change the JSON\" : \"\"}, decline, or cancel: `))?.trim().toLowerCase();\n if (choice === \"edit\" && request.params.editable) {\n try {\n const input = await question(`${header}\\nEnter the replacement JSON document (reviewed again before sending), or cancel: `);\n if (input === undefined || input.trim() === \"cancel\") { app.respondMcpInteraction(request.id, { action: \"cancel\" }); return; }\n if (Buffer.byteLength(input) > 48 * 1024) throw new Error();\n data = JSON.parse(input); edited = true; error = \"\";\n } catch { error = \"Invalid JSON or document too large.\\n\"; }\n continue;\n }\n app.respondMcpInteraction(request.id, { action: choice === \"allow\" ? \"accept\" : choice === \"decline\" ? \"decline\" : \"cancel\",\n ...(choice !== \"allow\" || !edited ? {} : { content: { json: JSON.stringify(data) } }),\n }); return;\n }\n }\n if (request.params.mode === \"url\") {\n let url: URL;\n try {\n url = new URL(request.params.url);\n if (![\"https:\", \"http:\"].includes(url.protocol) || url.username || url.password) throw new Error(\"Unsafe URL\");\n } catch { app.respondMcpInteraction(request.id, { action: \"decline\" }); return; }\n const consent = await question(`${header}\\nExternal host: ${url.host}\\nURL: ${request.params.url}\\n` +\n \"This is an untrusted external website, not MCP client login. Nothing opens automatically.\\n\" +\n \"Type accept to consent, decline to refuse, or cancel to dismiss: \");\n if (consent?.trim().toLowerCase() !== \"accept\") {\n app.respondMcpInteraction(request.id, { action: consent?.trim().toLowerCase() === \"decline\" ? \"decline\" : \"cancel\" }); return;\n }\n const resume = await question(`${header}\\nOpen the displayed URL yourself if you wish.\\n` +\n \"After interacting with the website, type retry to resume the original request, or cancel: \");\n app.respondMcpInteraction(request.id, { action: resume?.trim().toLowerCase() === \"retry\" ? \"accept\" : \"cancel\" }); return;\n }\n const answer = await question(`${header}\\nNever enter passwords, API keys, tokens or payment credentials.\\n` +\n `Requested form (untrusted):\\n${JSON.stringify(request.params.requestedSchema, null, 2)}\\n${error}` +\n \"Enter a JSON object, decline, or cancel: \");\n if (answer === undefined || [\"decline\", \"cancel\"].includes(answer.trim().toLowerCase())) {\n app.respondMcpInteraction(request.id, { action: answer?.trim().toLowerCase() === \"decline\" ? \"decline\" : \"cancel\" }); return;\n }\n let content: Record<string, string | number | boolean | string[]>;\n try {\n if (Buffer.byteLength(answer) > 64 * 1024) throw new Error();\n const parsed: unknown = JSON.parse(answer);\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error();\n content = parsed as typeof content;\n } catch { error = \"Invalid JSON object or response too large.\\n\"; continue; }\n const review = await question(`${header}\\nReview what will be sent ONLY to this server:\\n${JSON.stringify(content, null, 2)}\\n` +\n \"Type send to submit, edit to replace, decline, or cancel: \");\n const action = review?.trim().toLowerCase();\n if (action === \"edit\") continue;\n if (action !== \"send\") {\n app.respondMcpInteraction(request.id, { action: action === \"decline\" ? \"decline\" : \"cancel\" }); return;\n }\n try { app.respondMcpInteraction(request.id, { action: \"accept\", content }); return; }\n catch { error = \"The response does not satisfy the form; please correct it.\\n\"; }\n }\n}\n", "import { randomBytes } from \"node:crypto\";\nimport open from \"open\";\nimport { AsyncEventQueue, isStreamingMayEvent } from \"@sortedyuan/core\";\nimport type { MaybeCodeController } from \"./controller.js\";\nimport type { MaybeCodeEvent } from \"./events.js\";\nimport { createMaybeCodeWebHost, startMaybeCodeWebServer } from \"./web-ui.js\";\n\nfunction eventQueue() {\n return new AsyncEventQueue<MaybeCodeEvent>({\n maxBufferedValues: 1024,\n isDroppable: event => event.type === \"mcp.resource.updated\" || event.type === \"run.event\" && isStreamingMayEvent(event.event),\n });\n}\n\nexport class MaybeCodeTerminalWeb {\n private readonly terminalEvents = eventQueue();\n private readonly webEvents = eventQueue();\n private readonly host;\n private readonly relay: Promise<void>;\n private failure: unknown;\n private starting: ReturnType<typeof startMaybeCodeWebServer> | undefined;\n private closing: Promise<void> | undefined;\n readonly events: AsyncIterable<MaybeCodeEvent>;\n\n constructor(private readonly app: MaybeCodeController, private readonly exit?: () => void) {\n this.host = createMaybeCodeWebHost(app, { events: this.webEvents, closeApplication: false, terminal: true });\n this.events = this.readTerminalEvents();\n this.relay = this.forwardEvents().catch(error => { this.failure = error; });\n }\n\n private async forwardEvents(): Promise<void> {\n try {\n for await (const event of this.app.events) {\n this.terminalEvents.push(event);\n this.webEvents.push(event);\n }\n } catch (error) {\n this.failure = error;\n throw error;\n } finally {\n this.terminalEvents.close();\n this.webEvents.close();\n }\n }\n\n private async *readTerminalEvents(): AsyncIterable<MaybeCodeEvent> {\n for await (const event of this.terminalEvents) yield event;\n if (this.failure !== undefined) throw this.failure;\n }\n\n async open(): Promise<string> {\n const server = await this.startServer();\n const url = server.createLoginUrl();\n try {\n await open(url);\n } catch {\n throw new Error(\"\u65E0\u6CD5\u6253\u5F00\u9ED8\u8BA4\u6D4F\u89C8\u5668\uFF0C\u8BF7\u68C0\u67E5\u7CFB\u7EDF\u6D4F\u89C8\u5668\u8BBE\u7F6E\u540E\u91CD\u65B0\u6267\u884C /web\u3002\");\n }\n return server.url;\n }\n\n async startServer(): ReturnType<typeof startMaybeCodeWebServer> {\n if (this.closing) throw new Error(\"MaybeCode \u6B63\u5728\u5173\u95ED\u3002\");\n this.starting ??= startMaybeCodeWebServer(this.host, { token: randomBytes(32).toString(\"base64url\"), port: 0, browserLogin: true, exit: () => { if (this.exit) this.exit(); else void this.close(); } });\n const server = await this.starting;\n if (this.closing) throw new Error(\"MaybeCode \u6B63\u5728\u5173\u95ED\u3002\");\n return server;\n }\n\n close(): Promise<void> {\n return this.closing ??= this.closeOwnedResources();\n }\n\n private async closeOwnedResources(): Promise<void> {\n const results = await Promise.allSettled([\n this.app.close(),\n this.starting ? this.starting.then(server => server.close()) : this.host.close(),\n ]);\n await this.relay;\n const failures = results.flatMap(result => result.status === \"rejected\" ? [result.reason] : []);\n if (this.failure !== undefined) failures.push(this.failure);\n if (failures.length) throw new AggregateError(failures, \"\u5173\u95ED MaybeCode \u65F6\u53D1\u751F\u9519\u8BEF\u3002\");\n }\n}\n", "import { Keymap, formatKeySequence, mergeKeyBindings, parseKeySequence, type KeyBindingDefinition } from \"@sortedyuan/keybindings\";\nimport { DEFAULT_EDITOR_KEYBINDINGS } from \"@sortedyuan/tui\";\n\nexport const MAYBECODE_KEY_ACTIONS = [\n \"app.interrupt\",\n \"app.tools.toggle\",\n \"app.thinking.toggle\",\n \"app.reply.start\",\n \"app.focus.next\",\n \"app.focus.previous\",\n \"app.selection.copy\",\n \"list.up\",\n \"list.down\",\n \"list.pageUp\",\n \"list.pageDown\",\n \"list.home\",\n \"list.end\",\n \"list.accept\",\n \"list.cancel\",\n \"preview.toggle\",\n \"search.start\",\n \"search.finish\",\n \"text.backspace\",\n \"text.clear\",\n \"session.rename.start\",\n \"session.rename.accept\",\n \"session.delete.request\",\n \"session.delete.accept\",\n \"session.delete.cancel\",\n \"model.default.set\",\n \"approval.allow\",\n \"approval.allowSession\",\n \"approval.deny\",\n \"request.cancel\",\n \"request.pageUp\",\n \"request.pageDown\",\n \"request.scrollUp\",\n \"request.scrollDown\",\n] as const;\n\nexport type MaybeCodeKeyAction = typeof MAYBECODE_KEY_ACTIONS[number];\n\nexport const MAYBECODE_EDITOR_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n { context: \"editor\", keys: \"ctrl+j\", action: \"editor.newline\" },\n];\n\nexport const MAYBECODE_DEFAULT_KEYBINDINGS: readonly KeyBindingDefinition[] = [\n { context: \"global\", keys: \"ctrl+c\", action: \"app.interrupt\" },\n { context: \"dialog\", keys: \"ctrl+c\", action: \"app.interrupt\" },\n { context: \"global\", keys: \"<leader> d\", action: \"app.tools.toggle\" },\n { context: \"global\", keys: \"<leader> t\", action: \"app.thinking.toggle\" },\n { context: \"global\", keys: \"<leader> r\", action: \"app.reply.start\" },\n { context: \"global\", keys: \"tab\", action: \"app.focus.next\" },\n { context: \"global\", keys: \"shift+tab\", action: \"app.focus.previous\" },\n { context: \"transcript.selection\", keys: \"ctrl+c\", action: \"app.selection.copy\" },\n { context: \"select\", keys: \"up\", action: \"list.up\" },\n { context: \"select\", keys: \"down\", action: \"list.down\" },\n { context: \"select\", keys: \"pageup\", action: \"list.pageUp\" },\n { context: \"select\", keys: \"pagedown\", action: \"list.pageDown\" },\n { context: \"select\", keys: \"home\", action: \"list.home\" },\n { context: \"select\", keys: \"end\", action: \"list.end\" },\n { context: \"select\", keys: \"enter\", action: \"list.accept\" },\n { context: \"select\", keys: \"escape\", action: \"list.cancel\" },\n\n { context: \"sessionPicker\", keys: \"space\", action: \"preview.toggle\" },\n { context: \"sessionPicker\", keys: \"/\", action: \"search.start\" },\n { context: \"sessionPicker\", keys: \"d\", action: \"session.delete.request\" },\n { context: \"sessionPicker\", keys: \"r\", action: \"session.rename.start\" },\n\n { context: \"modelPicker\", keys: \"d\", action: \"model.default.set\" },\n\n { context: \"approval\", keys: \"a\", action: \"approval.allow\" },\n { context: \"approval\", keys: \"s\", action: \"approval.allowSession\" },\n { context: \"approval\", keys: \"d\", action: \"approval.deny\" },\n\n { context: \"mcpInput\", keys: \"escape\", action: \"request.cancel\" },\n { context: \"mcpInput\", keys: \"pageup\", action: \"request.pageUp\" },\n { context: \"mcpInput\", keys: \"pagedown\", action: \"request.pageDown\" },\n { context: \"mcpInput\", keys: \"wheelup\", action: \"request.scrollUp\" },\n { context: \"mcpInput\", keys: \"wheeldown\", action: \"request.scrollDown\" },\n\n { context: \"sessionSearch\", keys: \"escape\", action: \"list.cancel\" },\n { context: \"sessionSearch\", keys: \"enter\", action: \"search.finish\" },\n { context: \"sessionSearch\", keys: \"backspace\", action: \"text.backspace\" },\n { context: \"sessionSearch\", keys: \"ctrl+u\", action: \"text.clear\" },\n { context: \"sessionSearch\", keys: \"up\", action: \"list.up\" },\n { context: \"sessionSearch\", keys: \"down\", action: \"list.down\" },\n { context: \"sessionSearch\", keys: \"pageup\", action: \"list.pageUp\" },\n { context: \"sessionSearch\", keys: \"pagedown\", action: \"list.pageDown\" },\n\n { context: \"sessionRename\", keys: \"escape\", action: \"list.cancel\" },\n { context: \"sessionRename\", keys: \"enter\", action: \"session.rename.accept\" },\n { context: \"sessionRename\", keys: \"backspace\", action: \"text.backspace\" },\n { context: \"sessionRename\", keys: \"ctrl+u\", action: \"text.clear\" },\n\n { context: \"sessionDelete\", keys: \"y\", action: \"session.delete.accept\" },\n { context: \"sessionDelete\", keys: \"n\", action: \"session.delete.cancel\" },\n { context: \"sessionDelete\", keys: \"escape\", action: \"session.delete.cancel\" },\n];\n\nexport interface MaybeCodeKeymapOptions {\n readonly leader?: string;\n readonly bindings?: readonly KeyBindingDefinition[];\n}\n\nexport function createMaybeCodeKeymap(options: MaybeCodeKeymapOptions = {}): Keymap {\n const leader = options.leader ?? \"ctrl+g\";\n const sequence = parseKeySequence(leader);\n if (sequence.length !== 1 || (!sequence[0]!.ctrl && !sequence[0]!.alt && !sequence[0]!.meta)) {\n throw new Error(\"MaybeCode leader must be one modified key, for example ctrl+g\");\n }\n const leaderKey = formatKeySequence(sequence);\n if (mergeKeyBindings(DEFAULT_EDITOR_KEYBINDINGS, MAYBECODE_EDITOR_KEYBINDINGS).some(binding =>\n formatKeySequence(parseKeySequence(binding.keys)) === leaderKey)) {\n throw new Error(\"MaybeCode leader conflicts with a text editing shortcut\");\n }\n return new Keymap(mergeKeyBindings(MAYBECODE_DEFAULT_KEYBINDINGS, options.bindings, { leader }), {\n actions: MAYBECODE_KEY_ACTIONS,\n leader,\n chordTimeoutMs: null,\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["stripVTControlCharacters", "style", "integer", "isFullWidth", "segment", "stringWidth", "ESCAPES", "segmenter", "stringWidth", "segment", "open", "segmenter", "expandTabs", "indent", "x", "style", "open", "open", "stripVTControlCharacters", "stripVTControlCharacters", "style", "stripVTControlCharacters", "header", "y", "y", "x", "_", "TerminalEvents", "item", "_getDefaults", "_defaults", "changeDefaults", "newDefaults", "noopTest", "cachedIndentRegex", "createRegex", "cache", "indent", "cacheIndex", "regex", "edit", "opt", "source", "obj", "name", "val", "valSource", "other", "supportsLookbehind", "a", "bull", "newline", "blockCode", "fences", "hr", "heading", "bullet", "lheadingCore", "lheading", "lheadingGfm", "_paragraph", "blockText", "_blockLabel", "def", "list", "_tag", "_comment", "html", "createParagraph", "listInterrupt", "paragraph", "blockquoteParagraph", "blockquote", "blockNormal", "gfmTable", "blockGfm", "blockPedantic", "escape", "inlineCode", "br", "inlineText", "_punctuation", "_punctuationOrSpace", "_notPunctuationOrSpace", "punctuation", "_openQuote", "_punctuationGfmStrongEm", "_punctuationOrSpaceGfmStrongEm", "_notPunctuationOrSpaceGfmStrongEm", "blockSkip", "emStrongLDelimCore", "emStrongLDelim", "emStrongLDelimGfm", "emStrongLDelimPedanticCore", "emStrongLDelimPedantic", "emStrongRDelimAstCore", "emStrongRDelimAst", "emStrongRDelimAstGfm", "emStrongRDelimAstPedanticCore", "emStrongRDelimAstPedantic", "emStrongRDelimUnd", "emStrongRDelimUndPedanticCore", "emStrongRDelimUndPedantic", "delLDelim", "delRDelimCore", "delRDelim", "anyPunctuation", "autolink", "_inlineComment", "tag", "_inlineLabel", "link", "reflink", "nolink", "reflinkSearch", "_caseInsensitiveProtocol", "inlineNormal", "inlinePedantic", "inlineGfm", "inlineBreaks", "block", "inline", "escapeReplacements", "getEscapeReplacement", "ch", "escapeHtmlEntities", "encode", "cleanUrl", "href", "splitCells", "tableRow", "count", "row", "match", "offset", "str", "escaped", "curr", "cells", "i", "rtrim", "c", "invert", "l", "suffLen", "currChar", "trimTrailingBlankLines", "lines", "end", "findClosingBracket", "b", "level", "expandTabs", "line", "col", "expanded", "char", "added", "outputLink", "cap", "raw", "lexer", "rules", "title", "text", "isImage", "outerLinkEmitted", "outerInRawBlock", "tokens", "textHasLink", "indentCodeCompensation", "matchIndentToCode", "indentToCode", "node", "matchIndentInNode", "indentInNode", "_Tokenizer", "options", "src", "trimmed", "inBlockquote", "currentLines", "currentRaw", "currentText", "top", "lastToken", "oldToken", "continuation", "newText", "newToken", "isordered", "itemRegex", "endsWithBlankLine", "endEarly", "itemContents", "nextLine", "blankLine", "nextBulletRegex", "hrRegex", "fencesBeginRegex", "headingBeginRegex", "htmlBeginRegex", "blockquoteBeginRegex", "rawLine", "nextLineWithoutTabs", "lastItem", "item", "spacers", "t", "hasMultipleLineBreaks", "itemToken", "taskRaw", "checkboxToken", "token", "headers", "aligns", "rows", "align", "cell", "trimmedUrl", "rtrimSlash", "lastParenIndex", "linkLen", "links", "linkString", "maskedSrc", "prevChar", "lLength", "rDelim", "rLength", "delimTotal", "midDelimTotal", "delimChar", "midRun", "endReg", "lastCharLength", "hasNonSpaceChars", "hasSpaceCharsOnBothEnds", "prevCapZero", "_Lexer", "__Lexer", "next", "lastParagraphClipped", "srcLength", "extTokenizer", "cutSrc", "startIndex", "tempSrc", "tempStart", "getStartIndex", "linkRule", "match0", "refStart", "maskReflink", "_link", "context", "keepPrevChar", "byte", "errMsg", "_Renderer", "lang", "langString", "code", "depth", "ordered", "start", "body", "j", "type", "startAttr", "checked", "header", "k", "content", "cleanHref", "out", "_TextRenderer", "_Parser", "__Parser", "anyToken", "genericToken", "ret", "renderer", "_Hooks", "markdown", "Marked", "args", "callback", "values", "tableToken", "listToken", "childTokens", "extensions", "pack", "opts", "ext", "prevRenderer", "extLevel", "prop", "rendererProp", "rendererFunc", "tokenizer", "tokenizerProp", "tokenizerFunc", "prevTokenizer", "hooks", "hooksProp", "hooksFunc", "prevHook", "arg", "walkTokens", "packWalktokens", "blockType", "origOpt", "throwError", "processedSrc", "processedTokens", "e", "silent", "async", "msg", "markedInstance", "marked", "useExtension", "setOptions", "parseInline", "parser", "_Parser", "lexer", "_Lexer", "stripVTControlCharacters", "stripVTControlCharacters", "header", "_", "x", "y", "_", "lines", "size", "style", "_", "region", "b", "positiveInteger", "x", "y", "graphemes", "segmenter", "b", "clamp", "_", "clamp", "clamp", "singleLine", "header"]
7
- }