decocms 2.302.7 → 2.304.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 (209) hide show
  1. package/dist/client/assets/{AlertCircle-CG9syR30.js → AlertCircle-BeiDn4Fp.js} +1 -1
  2. package/dist/client/assets/{ArrowNarrowLeft-BoVSDn9e.js → ArrowNarrowLeft-hulNygQd.js} +1 -1
  3. package/dist/client/assets/{ArrowUpRight-BdaniATT.js → ArrowUpRight-lTwxwkJA.js} +1 -1
  4. package/dist/client/assets/{CheckCircle-DenMuCVF.js → CheckCircle-3TB25Bcb.js} +1 -1
  5. package/dist/client/assets/{ChevronDown-C3Ygm425.js → ChevronDown-_b59faTm.js} +1 -1
  6. package/dist/client/assets/{ChevronRight-ZWCM92t_.js → ChevronRight-DEybByBs.js} +1 -1
  7. package/dist/client/assets/{ChevronUp-D2rVf06n.js → ChevronUp-B_td_jK6.js} +1 -1
  8. package/dist/client/assets/{Container-D7Azh5xu.js → Container-d8d36LPk.js} +1 -1
  9. package/dist/client/assets/{DotsVertical-CLHEpDSq.js → DotsVertical-9AuPT8gf.js} +1 -1
  10. package/dist/client/assets/{LinkExternal01-DxXEJ52C.js → LinkExternal01-BMrJcbl6.js} +1 -1
  11. package/dist/client/assets/{Lock01-BguDy0uh.js → Lock01-C5rgxGgu.js} +1 -1
  12. package/dist/client/assets/{Palette-BYEIR3m2.js → Palette-DfnmIo6d.js} +1 -1
  13. package/dist/client/assets/{Play-Bwjd77ev.js → Play-BGW505UY.js} +1 -1
  14. package/dist/client/assets/{Plus-DTn86Odk.js → Plus-DlISHBLe.js} +1 -1
  15. package/dist/client/assets/{RefreshCcw01-BHf_tfWd.js → RefreshCcw01-Dbq2QLAC.js} +1 -1
  16. package/dist/client/assets/{SearchMd-a6724p0Y.js → SearchMd-C8WDOhfc.js} +1 -1
  17. package/dist/client/assets/{Settings02-CrnanDsL.js → Settings02-BIpL5e3f.js} +1 -1
  18. package/dist/client/assets/{Shield01-DtxRf8Qj.js → Shield01-DCoI7_zY.js} +1 -1
  19. package/dist/client/assets/{Star01-BFmiet3n.js → Star01-Chns_B29.js} +1 -1
  20. package/dist/client/assets/{Sun-CRJFmy5s.js → Sun-CgSsJ8OX.js} +1 -1
  21. package/dist/client/assets/{Tool01-9otovhMh.js → Tool01-B8RjIhe4.js} +1 -1
  22. package/dist/client/assets/{Trash01-re7YiF5g.js → Trash01-CFncShuD.js} +1 -1
  23. package/dist/client/assets/{User01-BgnyFNdJ.js → User01-Bq8r53VC.js} +1 -1
  24. package/dist/client/assets/{Users03-BPGIuPOi.js → Users03-qD8JWxak.js} +1 -1
  25. package/dist/client/assets/{X-DlTdh5jK.js → X-BNOerUAB.js} +1 -1
  26. package/dist/client/assets/{XCircle-BE4LAsf8.js → XCircle-B-JS14_e.js} +1 -1
  27. package/dist/client/assets/{XClose-CDyDeDuF.js → XClose-vOlmnMjZ.js} +1 -1
  28. package/dist/client/assets/{Zap-DE6pD70D.js → Zap-BPHOFmqu.js} +1 -1
  29. package/dist/client/assets/{ZapSquare-FWH2wtfn.js → ZapSquare-CX9zqrxv.js} +1 -1
  30. package/dist/client/assets/{accordion-BubDFUkM.js → accordion-DIyksd99.js} +1 -1
  31. package/dist/client/assets/{agent-icon-DzVM2Y3D.js → agent-icon-CLQAOsUE.js} +1 -1
  32. package/dist/client/assets/{agents-list-ClVNGy3h.js → agents-list-D0BQglaf.js} +1 -1
  33. package/dist/client/assets/ai-providers-BnclkXxt.js +1 -0
  34. package/dist/client/assets/{alert-dialog-Cp4KelsS.js → alert-dialog-BWduFhy-.js} +1 -1
  35. package/dist/client/assets/{auth-catchall-DAjGP-X3.js → auth-catchall-D-v4q1Qx.js} +1 -1
  36. package/dist/client/assets/{automation-list-row-DP5TESrt.js → automation-list-row-DPkrb87t.js} +1 -1
  37. package/dist/client/assets/{automations-BKKclzI8.js → automations-BCzY9gmM.js} +1 -1
  38. package/dist/client/assets/{avatar-D56WFjQj.js → avatar-C6HNjGDg.js} +1 -1
  39. package/dist/client/assets/{badge-Brrebgj_.js → badge-CZCn9Wwi.js} +1 -1
  40. package/dist/client/assets/{brand-context-B9KleYrA.js → brand-context-DcqBJ41j.js} +1 -1
  41. package/dist/client/assets/{card-CbtqsNyF.js → card-oNblR0HO.js} +1 -1
  42. package/dist/client/assets/{chat-context-D8pNmIoM.js → chat-context-RcvBJBC7.js} +1 -1
  43. package/dist/client/assets/{checkbox-A-1sOL7a.js → checkbox-JSEUVCMB.js} +1 -1
  44. package/dist/client/assets/{collection-detail-BiV7gm_U.js → collection-detail-C5pV1mWu.js} +1 -1
  45. package/dist/client/assets/{collection-display-button-hDD2VNh1.js → collection-display-button-DQSPcJBz.js} +1 -1
  46. package/dist/client/assets/{collection-search-TTX5BBhb.js → collection-search-CLoorkFj.js} +1 -1
  47. package/dist/client/assets/{collection-search-BtNt6NZG.js → collection-search-DGO6_1o7.js} +1 -1
  48. package/dist/client/assets/{collection-table-wrapper-RDfR0u8g.js → collection-table-wrapper-P7sXgSq0.js} +1 -1
  49. package/dist/client/assets/{collection-tabs-BYirFRax.js → collection-tabs-6c5Oz0MD.js} +1 -1
  50. package/dist/client/assets/{collections-DY4I1w_a.js → collections-CcBlrCx6.js} +1 -1
  51. package/dist/client/assets/{command-DzkZTofz.js → command-C666DFpg.js} +1 -1
  52. package/dist/client/assets/{connection-card-iSBKdQg9.js → connection-card-DbGlMaON.js} +1 -1
  53. package/dist/client/assets/{connection-detail-DeALevd5.js → connection-detail-DOFWK_LZ.js} +1 -1
  54. package/dist/client/assets/{connection-form-helpers-Cad-A9NK.js → connection-form-helpers-S9iwzj4v.js} +1 -1
  55. package/dist/client/assets/{connections-BhCBByIk.js → connections-DZgnlfnc.js} +1 -1
  56. package/dist/client/assets/{constants-BXUJyD1c.js → constants-B22iOAkD.js} +1 -1
  57. package/dist/client/assets/{constants-9TBj0Gaa.js → constants-DRQ2x-Dp.js} +1 -1
  58. package/dist/client/assets/{dialog-DpgNnjBX.js → dialog-ReVTOuxu.js} +1 -1
  59. package/dist/client/assets/{domain-settings-CfEXVZxs.js → domain-settings-_aY4XST2.js} +1 -1
  60. package/dist/client/assets/{drawer-LAm5-sL1.js → drawer-BYHJ-8Om.js} +1 -1
  61. package/dist/client/assets/{dropdown-menu-CSBZWMuU.js → dropdown-menu-y8iKrNsS.js} +1 -1
  62. package/dist/client/assets/{dynamic-plugin-layout-YqPG32No.js → dynamic-plugin-layout-BxzD5223.js} +1 -1
  63. package/dist/client/assets/{empty-state-D8Ji8JRa.js → empty-state-B4rhh1dc.js} +1 -1
  64. package/dist/client/assets/{empty-state-C3GO5RSf.js → empty-state-ByRM_QUo.js} +1 -1
  65. package/dist/client/assets/{extract-connection-data-cbAHcCfh.js → extract-connection-data-CbVt8VgN.js} +1 -1
  66. package/dist/client/assets/{features-D_II3j_j.js → features-BMKDqpeL.js} +1 -1
  67. package/dist/client/assets/{form-DFO_5Fzm.js → form-D8QDPjk9.js} +1 -1
  68. package/dist/client/assets/{general-By1woa8E.js → general-WpQ82n-X.js} +1 -1
  69. package/dist/client/assets/index-BB2bR64l.js +1 -0
  70. package/dist/client/assets/{index-B2vPEOVc.js → index-BET8kMZe.js} +1 -1
  71. package/dist/client/assets/{index-ImhE7zFL.js → index-Bi-e-UKp.js} +1 -1
  72. package/dist/client/assets/{index-DSoRyzSx.js → index-Bpod-O0_.js} +1 -1
  73. package/dist/client/assets/{index-D2mitOSe.js → index-BuLwXk3-.js} +4 -4
  74. package/dist/client/assets/{index-CHNVhIMp.js → index-CPmmcxsi.js} +1 -1
  75. package/dist/client/assets/{index-DF5x0d60.js → index-CTWz6nN8.js} +1 -1
  76. package/dist/client/assets/{index-XLC4yiSV.js → index-CeC26NPv.js} +1 -1
  77. package/dist/client/assets/{index-tSJy2IW6.js → index-Cf5saV1q.js} +1 -1
  78. package/dist/client/assets/{index-Br3d5-Cj.js → index-CgURykwj.js} +1 -1
  79. package/dist/client/assets/{index-CQ4D5GAP.js → index-D4IWA9IU.js} +2 -2
  80. package/dist/client/assets/{index-DYIl7M2a.js → index-D8dvMQZl.js} +1 -1
  81. package/dist/client/assets/{index-swcvm5Z1.js → index-D9Q6YnJH.js} +1 -1
  82. package/dist/client/assets/{index-2dOrl4x0.js → index-DBj2qw-o.js} +1 -1
  83. package/dist/client/assets/{index-C4QwSWi9.js → index-DXXI9MyH.js} +1 -1
  84. package/dist/client/assets/{index-r9i7ABND.js → index-U5YmU8lc.js} +1 -1
  85. package/dist/client/assets/{infiniteQueryObserver-CxkHF-jm.js → infiniteQueryObserver-ClYEJj89.js} +1 -1
  86. package/dist/client/assets/{input-6Sf2hB_F.js → input-DhXllgVP.js} +1 -1
  87. package/dist/client/assets/{integration-icon-8lhkAaq5.js → integration-icon-CNQIPioy.js} +1 -1
  88. package/dist/client/assets/{label-DoJDMV6i.js → label-BDcPRk17.js} +1 -1
  89. package/dist/client/assets/{layout-BHQ_c4RM.js → layout-DBK70FJ7.js} +1 -1
  90. package/dist/client/assets/{lean-canvas-recruit-modal-CDcr9qCt.js → lean-canvas-recruit-modal-Cosr7uB6.js} +1 -1
  91. package/dist/client/assets/{login-Am3HfZgi.js → login-uRApKgz7.js} +1 -1
  92. package/dist/client/assets/{members-yGwdGYMP.js → members-CgYS1Zxe.js} +1 -1
  93. package/dist/client/assets/{monaco-editor-CglgsbP6.js → monaco-editor-D34bkcWL.js} +1 -1
  94. package/dist/client/assets/{monitoring-stats-row-C64ix0dR.js → monitoring-stats-row-Rw8mxMr8.js} +1 -1
  95. package/dist/client/assets/{oauth-callback-YaQtgy3B.js → oauth-callback-DLWU7IjL.js} +1 -1
  96. package/dist/client/assets/{oauth-callback-ai-provider-DXuTlaTS.js → oauth-callback-ai-provider-5FDIcGBj.js} +1 -1
  97. package/dist/client/assets/{onboarding-WnwwsOhD.js → onboarding-jyaCV8uq.js} +1 -1
  98. package/dist/client/assets/{org-layout-DCXUX3EB.js → org-layout-DxW3YApR.js} +1 -1
  99. package/dist/client/assets/{org-plugin-layout-Dsb_WQsm.js → org-plugin-layout-B-uqLn5y.js} +1 -1
  100. package/dist/client/assets/{pair-B01JdgFS.js → pair-CM7Z5dgt.js} +1 -1
  101. package/dist/client/assets/{plugin-empty-state-D3CO3AdB.js → plugin-empty-state-C-o1hhqY.js} +1 -1
  102. package/dist/client/assets/{plugin-header-aeJUAm2h.js → plugin-header-BTFD2Tcj.js} +1 -1
  103. package/dist/client/assets/{plugin-layout-CP1Bb1gU.js → plugin-layout-BiJEtvKW.js} +1 -1
  104. package/dist/client/assets/{popover-BajibMdr.js → popover-DQq9bf6V.js} +1 -1
  105. package/dist/client/assets/{profile-DDe57pOS.js → profile-PICkTEdT.js} +1 -1
  106. package/dist/client/assets/{project-app-view-AKSh-WqN.js → project-app-view-B1QcPr4W.js} +1 -1
  107. package/dist/client/assets/registry-Dr9Q687k.js +2 -0
  108. package/dist/client/assets/{registry-layout-QiSXnsNM.js → registry-layout-DGmSzwah.js} +1 -1
  109. package/dist/client/assets/{required-auth-layout-jdQgts2c.js → required-auth-layout-CfAoaltR.js} +1 -1
  110. package/dist/client/assets/{reset-password-BN5V7l8r.js → reset-password-NMO08kVP.js} +1 -1
  111. package/dist/client/assets/{roles-HeW5UUYX.js → roles-CCaqodZQ.js} +1 -1
  112. package/dist/client/assets/{scroll-area-SGeY9dE-.js → scroll-area-AhoYMTSF.js} +1 -1
  113. package/dist/client/assets/{search-input-D6oau9hI.js → search-input-BSmmjMtR.js} +1 -1
  114. package/dist/client/assets/{select-DeRvPFq1.js → select-dTphD0ES.js} +1 -1
  115. package/dist/client/assets/{select-model-Di1os-Ub.js → select-model-D2H_jWcd.js} +1 -1
  116. package/dist/client/assets/{settings-layout-Ds_Ffodp.js → settings-layout-Bn3d6rRU.js} +1 -1
  117. package/dist/client/assets/{settings-section-RBLHL8gf.js → settings-section-DkPpouMA.js} +1 -1
  118. package/dist/client/assets/{shell-layout-BBGXUnLn.js → shell-layout-DLX5f9iI.js} +1 -1
  119. package/dist/client/assets/{skeleton-BAo1ij7j.js → skeleton-DCMX-VkN.js} +1 -1
  120. package/dist/client/assets/{sso-CKN-2e5M.js → sso-BeQadTWm.js} +1 -1
  121. package/dist/client/assets/{store-hnD4E6ii.js → store-D-lrayyv.js} +1 -1
  122. package/dist/client/assets/store-registry-dKQp57q_.js +2 -0
  123. package/dist/client/assets/{switch-BGrAKUyr.js → switch-D9uEYoPa.js} +1 -1
  124. package/dist/client/assets/{table-0gEoBFzX.js → table-BIcJswmk.js} +1 -1
  125. package/dist/client/assets/{tabs-ChLvcDIf.js → tabs-Bbs5xG17.js} +1 -1
  126. package/dist/client/assets/{task-status-B0G255I6.js → task-status-1zFON5T4.js} +1 -1
  127. package/dist/client/assets/{textarea-CDageIb2.js → textarea-BMU9fnHG.js} +1 -1
  128. package/dist/client/assets/{toggle-group-BUN1pnfF.js → toggle-group-juphd3c4.js} +1 -1
  129. package/dist/client/assets/{tools-list-DIvrgoIa.js → tools-list-BP78dRI3.js} +1 -1
  130. package/dist/client/assets/{tooltip-pBgOajzM.js → tooltip-B5FrLY14.js} +1 -1
  131. package/dist/client/assets/{types-wSZC8rz7.js → types-DmM_J5U9.js} +1 -1
  132. package/dist/client/assets/{use-ai-providers-DVEz2NmK.js → use-ai-providers-CVAGId9e.js} +1 -1
  133. package/dist/client/assets/{use-collections-DV5bwdGb.js → use-collections-DKWG5Tun.js} +1 -1
  134. package/dist/client/assets/{use-connection-fs-HjrZ7.js → use-connection-Dy5vq_5j.js} +1 -1
  135. package/dist/client/assets/{use-copy-lIGig9yc.js → use-copy-BSYEct5q.js} +1 -1
  136. package/dist/client/assets/{use-create-virtual-mcp-Bz4IDcO1.js → use-create-virtual-mcp-ifW0Pllw.js} +1 -1
  137. package/dist/client/assets/{use-decopilot-events-B38OLSFm.js → use-decopilot-events-DVXCv4R8.js} +1 -1
  138. package/dist/client/assets/{use-delete-connection-CORGK4Oi.js → use-delete-connection-CRe3MUPe.js} +1 -1
  139. package/dist/client/assets/{use-infinite-scroll-C0wp7W5X.js → use-infinite-scroll-4DQHfv5o.js} +1 -1
  140. package/dist/client/assets/{use-list-state-DWVI_yIs.js → use-list-state-CihFBhY3.js} +1 -1
  141. package/dist/client/assets/{use-mcp-tools-C-hABbHm.js → use-mcp-tools-Bog3rGRX.js} +1 -1
  142. package/dist/client/assets/{use-members-DbWcRqMH.js → use-members-eWVl2b1I.js} +1 -1
  143. package/dist/client/assets/{use-navigate-to-agent-37f-6W2B.js → use-navigate-to-agent--7ajKHhy.js} +1 -1
  144. package/dist/client/assets/{use-org-auth-client-5_rgl0KN.js → use-org-auth-client-C-BGwXKo.js} +1 -1
  145. package/dist/client/assets/{use-org-sso-CFxSE_n9.js → use-org-sso-2mlDJ8c4.js} +1 -1
  146. package/dist/client/assets/{use-organization-roles-Cy74Gv9v.js → use-organization-roles-PByiiFjp.js} +1 -1
  147. package/dist/client/assets/{use-organization-settings-B3AsJEWq.js → use-organization-settings-DngIHmBy.js} +1 -1
  148. package/dist/client/assets/{use-registry-connections-C9X2yrii.js → use-registry-connections-CDM-gpri.js} +1 -1
  149. package/dist/client/assets/{use-status-sounds-DuT0KslZ.js → use-status-sounds-BzXaoVC8.js} +1 -1
  150. package/dist/client/assets/{use-tasks-Bg4m_k7S.js → use-tasks-M1RmMNT7.js} +1 -1
  151. package/dist/client/assets/{use-view-mode-_U7GAKYn.js → use-view-mode-DRDlksJe.js} +1 -1
  152. package/dist/client/assets/{use-virtual-mcp-CwGnYHPH.js → use-virtual-mcp-CDCK02Yj.js} +1 -1
  153. package/dist/client/assets/useInfiniteQuery-DtJBa4_2.js +1 -0
  154. package/dist/client/assets/useSuspenseInfiniteQuery-G-zitmER.js +1 -0
  155. package/dist/client/assets/{user-CpC285Qu.js → user-WYGHhGxH.js} +1 -1
  156. package/dist/client/assets/{view-mode-toggle-zrlQPSP1.js → view-mode-toggle-CK1VLDTo.js} +1 -1
  157. package/dist/client/assets/{workflow-D77PbtT7.js → workflow-DkcKupEW.js} +1 -1
  158. package/dist/client/assets/workflow-detail-BtHvU2Pd.js +1 -0
  159. package/dist/client/index.html +1 -1
  160. package/dist/server/cli.js +544 -489
  161. package/dist/server/node_modules/slice-ansi/index.d.ts +19 -0
  162. package/dist/server/node_modules/slice-ansi/index.js +260 -0
  163. package/dist/server/node_modules/{environment → slice-ansi}/license +1 -0
  164. package/dist/server/node_modules/slice-ansi/package.json +59 -0
  165. package/dist/server/node_modules/slice-ansi/readme.md +54 -0
  166. package/dist/server/node_modules/slice-ansi/tokenize-ansi.js +752 -0
  167. package/dist/server/server.js +87 -44
  168. package/package.json +2 -1
  169. package/dist/client/assets/ai-providers-CCNzjFxx.js +0 -1
  170. package/dist/client/assets/index-B13jh3-s.js +0 -1
  171. package/dist/client/assets/registry-BEeKP9Pe.js +0 -2
  172. package/dist/client/assets/store-registry-s8CHypuf.js +0 -2
  173. package/dist/client/assets/useInfiniteQuery-DGrk4ASG.js +0 -1
  174. package/dist/client/assets/useSuspenseInfiniteQuery-cV09mkra.js +0 -1
  175. package/dist/client/assets/workflow-detail-DAtCF7t1.js +0 -1
  176. package/dist/server/node_modules/environment/index.d.ts +0 -74
  177. package/dist/server/node_modules/environment/index.js +0 -47
  178. package/dist/server/node_modules/environment/package.json +0 -74
  179. package/dist/server/node_modules/environment/readme.md +0 -94
  180. package/dist/server/node_modules/escape-string-regexp/index.d.ts +0 -18
  181. package/dist/server/node_modules/escape-string-regexp/index.js +0 -11
  182. package/dist/server/node_modules/escape-string-regexp/license +0 -9
  183. package/dist/server/node_modules/escape-string-regexp/package.json +0 -43
  184. package/dist/server/node_modules/escape-string-regexp/readme.md +0 -29
  185. package/dist/server/node_modules/is-fullwidth-code-point/index.d.ts +0 -17
  186. package/dist/server/node_modules/is-fullwidth-code-point/index.js +0 -12
  187. package/dist/server/node_modules/is-fullwidth-code-point/license +0 -9
  188. package/dist/server/node_modules/is-fullwidth-code-point/package.json +0 -53
  189. package/dist/server/node_modules/is-fullwidth-code-point/readme.md +0 -31
  190. package/dist/server/node_modules/is-unicode-supported/index.d.ts +0 -12
  191. package/dist/server/node_modules/is-unicode-supported/index.js +0 -21
  192. package/dist/server/node_modules/is-unicode-supported/license +0 -9
  193. package/dist/server/node_modules/is-unicode-supported/package.json +0 -47
  194. package/dist/server/node_modules/is-unicode-supported/readme.md +0 -35
  195. package/dist/server/node_modules/pg-pool/LICENSE +0 -21
  196. package/dist/server/node_modules/pg-pool/README.md +0 -357
  197. package/dist/server/node_modules/pg-pool/esm/index.mjs +0 -5
  198. package/dist/server/node_modules/pg-pool/index.js +0 -517
  199. package/dist/server/node_modules/pg-pool/package.json +0 -51
  200. package/dist/server/node_modules/restore-cursor/index.d.ts +0 -11
  201. package/dist/server/node_modules/restore-cursor/index.js +0 -11
  202. package/dist/server/node_modules/restore-cursor/license +0 -9
  203. package/dist/server/node_modules/restore-cursor/package.json +0 -55
  204. package/dist/server/node_modules/restore-cursor/readme.md +0 -31
  205. package/dist/server/node_modules/string-width/index.d.ts +0 -39
  206. package/dist/server/node_modules/string-width/index.js +0 -82
  207. package/dist/server/node_modules/string-width/license +0 -9
  208. package/dist/server/node_modules/string-width/package.json +0 -64
  209. package/dist/server/node_modules/string-width/readme.md +0 -66
@@ -0,0 +1,752 @@
1
+ import ansiStyles from 'ansi-styles';
2
+ import isFullwidthCodePoint from 'is-fullwidth-code-point';
3
+
4
+ const ESCAPE_CODE_POINT = 27;
5
+ const C1_DCS_CODE_POINT = 144;
6
+ const C1_SOS_CODE_POINT = 152;
7
+ const C1_CSI_CODE_POINT = 155;
8
+ const C1_ST_CODE_POINT = 156;
9
+ const C1_OSC_CODE_POINT = 157;
10
+ const C1_PM_CODE_POINT = 158;
11
+ const C1_APC_CODE_POINT = 159;
12
+ const ESCAPES = new Set([
13
+ ESCAPE_CODE_POINT,
14
+ C1_DCS_CODE_POINT,
15
+ C1_SOS_CODE_POINT,
16
+ C1_CSI_CODE_POINT,
17
+ C1_ST_CODE_POINT,
18
+ C1_OSC_CODE_POINT,
19
+ C1_PM_CODE_POINT,
20
+ C1_APC_CODE_POINT,
21
+ ]);
22
+
23
+ const ESCAPE = '\u001B';
24
+ const ANSI_BELL = '\u0007';
25
+ const ANSI_CSI = '[';
26
+ const ANSI_OSC = ']';
27
+ const ANSI_DCS = 'P';
28
+ const ANSI_SOS = 'X';
29
+ const ANSI_PM = '^';
30
+ const ANSI_APC = '_';
31
+ const ANSI_SGR_TERMINATOR = 'm';
32
+ const ANSI_OSC_TERMINATOR = '\\';
33
+ const ANSI_STRING_TERMINATOR = `${ESCAPE}${ANSI_OSC_TERMINATOR}`;
34
+ const C1_OSC = '\u009D';
35
+ const C1_STRING_TERMINATOR = '\u009C';
36
+ const ANSI_HYPERLINK_ESC_PREFIX = `${ESCAPE}${ANSI_OSC}8;`;
37
+ const ANSI_HYPERLINK_C1_PREFIX = `${C1_OSC}8;`;
38
+ const ANSI_HYPERLINK_ESC_CLOSE = `${ANSI_HYPERLINK_ESC_PREFIX};`;
39
+ const ANSI_HYPERLINK_C1_CLOSE = `${ANSI_HYPERLINK_C1_PREFIX};`;
40
+
41
+ const CODE_POINT_0 = '0'.codePointAt(0);
42
+ const CODE_POINT_9 = '9'.codePointAt(0);
43
+ const CODE_POINT_SEMICOLON = ';'.codePointAt(0);
44
+ const CODE_POINT_COLON = ':'.codePointAt(0);
45
+ // ECMA-48 CSI format: parameter bytes 0x30-0x3F, intermediates 0x20-0x2F, final 0x40-0x7E.
46
+ const CODE_POINT_CSI_PARAMETER_START = '0'.codePointAt(0);
47
+ const CODE_POINT_CSI_PARAMETER_END = '?'.codePointAt(0);
48
+ const CODE_POINT_CSI_INTERMEDIATE_START = ' '.codePointAt(0);
49
+ const CODE_POINT_CSI_INTERMEDIATE_END = '/'.codePointAt(0);
50
+ const CODE_POINT_CSI_FINAL_START = '@'.codePointAt(0);
51
+ const CODE_POINT_CSI_FINAL_END = '~'.codePointAt(0);
52
+ const REGIONAL_INDICATOR_SYMBOL_LETTER_A = 127_462;
53
+ const REGIONAL_INDICATOR_SYMBOL_LETTER_Z = 127_487;
54
+ const SGR_RESET_CODE = 0;
55
+ const SGR_EXTENDED_FOREGROUND_CODE = 38;
56
+ const SGR_DEFAULT_FOREGROUND_CODE = 39;
57
+ const SGR_EXTENDED_BACKGROUND_CODE = 48;
58
+ const SGR_DEFAULT_BACKGROUND_CODE = 49;
59
+ const SGR_COLOR_TYPE_ANSI_256 = 5;
60
+ const SGR_COLOR_TYPE_TRUECOLOR = 2;
61
+ const SGR_ANSI_256_FRAGMENT_LENGTH = 3;
62
+ const SGR_TRUECOLOR_FRAGMENT_LENGTH = 5;
63
+ const SGR_ANSI_256_LAST_PARAMETER_OFFSET = 2;
64
+ const SGR_TRUECOLOR_LAST_PARAMETER_OFFSET = 4;
65
+ const VARIATION_SELECTOR_16_CODE_POINT = 65_039;
66
+ const COMBINING_ENCLOSING_KEYCAP_CODE_POINT = 8419;
67
+ const EMOJI_PRESENTATION_GRAPHEME_REGEX = /\p{Emoji_Presentation}/u;
68
+ const GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, {granularity: 'grapheme'});
69
+
70
+ const endCodeNumbers = new Set();
71
+ for (const [, end] of ansiStyles.codes) {
72
+ endCodeNumbers.add(end);
73
+ }
74
+
75
+ function isSgrParameterCharacter(codePoint) {
76
+ return (
77
+ (codePoint >= CODE_POINT_0 && codePoint <= CODE_POINT_9)
78
+ || codePoint === CODE_POINT_SEMICOLON
79
+ || codePoint === CODE_POINT_COLON
80
+ );
81
+ }
82
+
83
+ function isCsiParameterCharacter(codePoint) {
84
+ return codePoint >= CODE_POINT_CSI_PARAMETER_START && codePoint <= CODE_POINT_CSI_PARAMETER_END;
85
+ }
86
+
87
+ function isCsiIntermediateCharacter(codePoint) {
88
+ return codePoint >= CODE_POINT_CSI_INTERMEDIATE_START && codePoint <= CODE_POINT_CSI_INTERMEDIATE_END;
89
+ }
90
+
91
+ function isCsiFinalCharacter(codePoint) {
92
+ return codePoint >= CODE_POINT_CSI_FINAL_START && codePoint <= CODE_POINT_CSI_FINAL_END;
93
+ }
94
+
95
+ function isRegionalIndicatorCodePoint(codePoint) {
96
+ return codePoint >= REGIONAL_INDICATOR_SYMBOL_LETTER_A && codePoint <= REGIONAL_INDICATOR_SYMBOL_LETTER_Z;
97
+ }
98
+
99
+ function createControlParseResult(code, endIndex) {
100
+ return {
101
+ token: {
102
+ type: 'control',
103
+ code,
104
+ },
105
+ endIndex,
106
+ };
107
+ }
108
+
109
+ function isEmojiStyleGrapheme(grapheme) {
110
+ if (EMOJI_PRESENTATION_GRAPHEME_REGEX.test(grapheme)) {
111
+ return true;
112
+ }
113
+
114
+ for (const character of grapheme) {
115
+ const codePoint = character.codePointAt(0);
116
+ if (
117
+ codePoint === VARIATION_SELECTOR_16_CODE_POINT
118
+ || codePoint === COMBINING_ENCLOSING_KEYCAP_CODE_POINT
119
+ ) {
120
+ return true;
121
+ }
122
+ }
123
+
124
+ return false;
125
+ }
126
+
127
+ function getGraphemeWidth(grapheme) {
128
+ let regionalIndicatorCount = 0;
129
+ for (const character of grapheme) {
130
+ const codePoint = character.codePointAt(0);
131
+ if (isFullwidthCodePoint(codePoint)) {
132
+ return 2;
133
+ }
134
+
135
+ if (isRegionalIndicatorCodePoint(codePoint)) {
136
+ regionalIndicatorCount++;
137
+ }
138
+ }
139
+
140
+ if (regionalIndicatorCount >= 1) {
141
+ return 2;
142
+ }
143
+
144
+ if (isEmojiStyleGrapheme(grapheme)) {
145
+ return 2;
146
+ }
147
+
148
+ return 1;
149
+ }
150
+
151
+ function getSgrPrefix(code) {
152
+ if (code.startsWith('\u009B')) {
153
+ return '\u009B';
154
+ }
155
+
156
+ return `${ESCAPE}${ANSI_CSI}`;
157
+ }
158
+
159
+ function createSgrCode(prefix, values) {
160
+ return `${prefix}${values.join(';')}${ANSI_SGR_TERMINATOR}`;
161
+ }
162
+
163
+ function getSgrFragments(code) {
164
+ const fragments = [];
165
+ const sgrPrefix = getSgrPrefix(code);
166
+ let parameterString;
167
+
168
+ if (code.startsWith(`${ESCAPE}${ANSI_CSI}`)) {
169
+ parameterString = code.slice(2, -1);
170
+ } else if (code.startsWith('\u009B')) {
171
+ parameterString = code.slice(1, -1);
172
+ } else {
173
+ return fragments;
174
+ }
175
+
176
+ const rawCodes = parameterString.length === 0 ? [String(SGR_RESET_CODE)] : parameterString.split(';');
177
+ let index = 0;
178
+ while (index < rawCodes.length) {
179
+ const codeNumber = Number.parseInt(rawCodes[index], 10);
180
+ if (Number.isNaN(codeNumber)) {
181
+ index++;
182
+ continue;
183
+ }
184
+
185
+ if (codeNumber === SGR_RESET_CODE) {
186
+ fragments.push({type: 'reset'});
187
+ index++;
188
+ continue;
189
+ }
190
+
191
+ if (codeNumber === SGR_EXTENDED_FOREGROUND_CODE || codeNumber === SGR_EXTENDED_BACKGROUND_CODE) {
192
+ const colorType = Number.parseInt(rawCodes[index + 1], 10);
193
+ if (colorType === SGR_COLOR_TYPE_ANSI_256 && index + SGR_ANSI_256_LAST_PARAMETER_OFFSET < rawCodes.length) {
194
+ const openCode = createSgrCode(sgrPrefix, rawCodes.slice(index, index + SGR_ANSI_256_FRAGMENT_LENGTH));
195
+ fragments.push({
196
+ type: 'start',
197
+ code: openCode,
198
+ endCode: ansiStyles.color.ansi(codeNumber === SGR_EXTENDED_FOREGROUND_CODE ? SGR_DEFAULT_FOREGROUND_CODE : SGR_DEFAULT_BACKGROUND_CODE),
199
+ });
200
+ index += SGR_ANSI_256_FRAGMENT_LENGTH;
201
+ continue;
202
+ }
203
+
204
+ if (colorType === SGR_COLOR_TYPE_TRUECOLOR && index + SGR_TRUECOLOR_LAST_PARAMETER_OFFSET < rawCodes.length) {
205
+ const openCode = createSgrCode(sgrPrefix, rawCodes.slice(index, index + SGR_TRUECOLOR_FRAGMENT_LENGTH));
206
+ fragments.push({
207
+ type: 'start',
208
+ code: openCode,
209
+ endCode: ansiStyles.color.ansi(codeNumber === SGR_EXTENDED_FOREGROUND_CODE ? SGR_DEFAULT_FOREGROUND_CODE : SGR_DEFAULT_BACKGROUND_CODE),
210
+ });
211
+ index += SGR_TRUECOLOR_FRAGMENT_LENGTH;
212
+ continue;
213
+ }
214
+
215
+ const openCode = createSgrCode(sgrPrefix, [rawCodes[index]]);
216
+ fragments.push({
217
+ type: 'start',
218
+ code: openCode,
219
+ endCode: ansiStyles.color.ansi(codeNumber === SGR_EXTENDED_FOREGROUND_CODE ? SGR_DEFAULT_FOREGROUND_CODE : SGR_DEFAULT_BACKGROUND_CODE),
220
+ });
221
+ index++;
222
+ continue;
223
+ }
224
+
225
+ if (endCodeNumbers.has(codeNumber)) {
226
+ fragments.push({
227
+ type: 'end',
228
+ endCode: ansiStyles.color.ansi(codeNumber),
229
+ });
230
+ index++;
231
+ continue;
232
+ }
233
+
234
+ const mappedEndCode = ansiStyles.codes.get(codeNumber);
235
+ if (mappedEndCode !== undefined) {
236
+ const openCode = createSgrCode(sgrPrefix, [rawCodes[index]]);
237
+ fragments.push({
238
+ type: 'start',
239
+ code: openCode,
240
+ endCode: ansiStyles.color.ansi(mappedEndCode),
241
+ });
242
+ index++;
243
+ continue;
244
+ }
245
+
246
+ const openCode = createSgrCode(sgrPrefix, [rawCodes[index]]);
247
+ fragments.push({
248
+ type: 'start',
249
+ code: openCode,
250
+ endCode: ansiStyles.reset.open,
251
+ });
252
+ index++;
253
+ }
254
+
255
+ if (fragments.length === 0) {
256
+ fragments.push({type: 'reset'});
257
+ }
258
+
259
+ return fragments;
260
+ }
261
+
262
+ function parseCsiCode(string, index) {
263
+ const escapeCodePoint = string.codePointAt(index);
264
+ let sequenceStartIndex;
265
+
266
+ if (escapeCodePoint === ESCAPE_CODE_POINT) {
267
+ if (string[index + 1] !== ANSI_CSI) {
268
+ return;
269
+ }
270
+
271
+ sequenceStartIndex = index + 2;
272
+ } else if (escapeCodePoint === C1_CSI_CODE_POINT) {
273
+ sequenceStartIndex = index + 1;
274
+ } else {
275
+ return;
276
+ }
277
+
278
+ let hasCanonicalSgrParameters = true;
279
+ for (let sequenceIndex = sequenceStartIndex; sequenceIndex < string.length; sequenceIndex++) {
280
+ const codePoint = string.codePointAt(sequenceIndex);
281
+
282
+ if (isCsiFinalCharacter(codePoint)) {
283
+ const code = string.slice(index, sequenceIndex + 1);
284
+ if (string[sequenceIndex] !== ANSI_SGR_TERMINATOR || !hasCanonicalSgrParameters) {
285
+ return createControlParseResult(code, sequenceIndex + 1);
286
+ }
287
+
288
+ return {
289
+ token: {
290
+ type: 'sgr',
291
+ code,
292
+ fragments: getSgrFragments(code),
293
+ },
294
+ endIndex: sequenceIndex + 1,
295
+ };
296
+ }
297
+
298
+ if (isCsiParameterCharacter(codePoint)) {
299
+ if (!isSgrParameterCharacter(codePoint)) {
300
+ hasCanonicalSgrParameters = false;
301
+ }
302
+
303
+ continue;
304
+ }
305
+
306
+ if (isCsiIntermediateCharacter(codePoint)) {
307
+ hasCanonicalSgrParameters = false;
308
+ continue;
309
+ }
310
+
311
+ const endIndex = sequenceIndex;
312
+ return createControlParseResult(string.slice(index, endIndex), endIndex);
313
+ }
314
+
315
+ return createControlParseResult(string.slice(index), string.length);
316
+ }
317
+
318
+ function parseHyperlinkCode(string, index) {
319
+ let hyperlinkPrefix;
320
+ let hyperlinkClose;
321
+ const codePoint = string.codePointAt(index);
322
+
323
+ if (
324
+ codePoint === ESCAPE_CODE_POINT
325
+ && string.startsWith(ANSI_HYPERLINK_ESC_PREFIX, index)
326
+ ) {
327
+ hyperlinkPrefix = ANSI_HYPERLINK_ESC_PREFIX;
328
+ hyperlinkClose = ANSI_HYPERLINK_ESC_CLOSE;
329
+ } else if (
330
+ codePoint === C1_OSC_CODE_POINT
331
+ && string.startsWith(ANSI_HYPERLINK_C1_PREFIX, index)
332
+ ) {
333
+ hyperlinkPrefix = ANSI_HYPERLINK_C1_PREFIX;
334
+ hyperlinkClose = ANSI_HYPERLINK_C1_CLOSE;
335
+ } else {
336
+ return;
337
+ }
338
+
339
+ const uriStart = string.indexOf(';', index + hyperlinkPrefix.length);
340
+ if (uriStart === -1) {
341
+ return createControlParseResult(string.slice(index), string.length);
342
+ }
343
+
344
+ for (let sequenceIndex = uriStart + 1; sequenceIndex < string.length; sequenceIndex++) {
345
+ const character = string[sequenceIndex];
346
+
347
+ if (character === ANSI_BELL) {
348
+ const code = string.slice(index, sequenceIndex + 1);
349
+ const action = sequenceIndex === uriStart + 1 ? 'close' : 'open';
350
+ return {
351
+ token: {
352
+ type: 'hyperlink',
353
+ code,
354
+ action,
355
+ closePrefix: hyperlinkClose,
356
+ terminator: ANSI_BELL,
357
+ },
358
+ endIndex: sequenceIndex + 1,
359
+ };
360
+ }
361
+
362
+ if (
363
+ character === ESCAPE
364
+ && string[sequenceIndex + 1] === ANSI_OSC_TERMINATOR
365
+ ) {
366
+ const code = string.slice(index, sequenceIndex + 2);
367
+ const action = sequenceIndex === uriStart + 1 ? 'close' : 'open';
368
+ return {
369
+ token: {
370
+ type: 'hyperlink',
371
+ code,
372
+ action,
373
+ closePrefix: hyperlinkClose,
374
+ terminator: ANSI_STRING_TERMINATOR,
375
+ },
376
+ endIndex: sequenceIndex + 2,
377
+ };
378
+ }
379
+
380
+ if (character === C1_STRING_TERMINATOR) {
381
+ const code = string.slice(index, sequenceIndex + 1);
382
+ const action = sequenceIndex === uriStart + 1 ? 'close' : 'open';
383
+ return {
384
+ token: {
385
+ type: 'hyperlink',
386
+ code,
387
+ action,
388
+ closePrefix: hyperlinkClose,
389
+ terminator: C1_STRING_TERMINATOR,
390
+ },
391
+ endIndex: sequenceIndex + 1,
392
+ };
393
+ }
394
+ }
395
+
396
+ return createControlParseResult(string.slice(index), string.length);
397
+ }
398
+
399
+ function parseControlStringCode(string, index) {
400
+ const codePoint = string.codePointAt(index);
401
+ let sequenceStartIndex;
402
+ let supportsBellTerminator = false;
403
+
404
+ switch (codePoint) {
405
+ case ESCAPE_CODE_POINT: {
406
+ const command = string[index + 1];
407
+ switch (command) {
408
+ case ANSI_OSC: {
409
+ // OSC accepts ST (ECMA-48) and BEL (xterm compatibility extension).
410
+ sequenceStartIndex = index + 2;
411
+ supportsBellTerminator = true;
412
+ break;
413
+ }
414
+
415
+ case ANSI_DCS:
416
+ case ANSI_SOS:
417
+ case ANSI_PM:
418
+ case ANSI_APC: {
419
+ sequenceStartIndex = index + 2;
420
+ break;
421
+ }
422
+
423
+ case ANSI_OSC_TERMINATOR: {
424
+ return createControlParseResult(ANSI_STRING_TERMINATOR, index + 2);
425
+ }
426
+
427
+ default: {
428
+ return;
429
+ }
430
+ }
431
+
432
+ break;
433
+ }
434
+
435
+ case C1_OSC_CODE_POINT: {
436
+ sequenceStartIndex = index + 1;
437
+ supportsBellTerminator = true;
438
+ break;
439
+ }
440
+
441
+ case C1_DCS_CODE_POINT:
442
+ case C1_SOS_CODE_POINT:
443
+ case C1_PM_CODE_POINT:
444
+ case C1_APC_CODE_POINT: {
445
+ sequenceStartIndex = index + 1;
446
+ break;
447
+ }
448
+
449
+ case C1_ST_CODE_POINT: {
450
+ return createControlParseResult(C1_STRING_TERMINATOR, index + 1);
451
+ }
452
+
453
+ default: {
454
+ return;
455
+ }
456
+ }
457
+
458
+ for (let sequenceIndex = sequenceStartIndex; sequenceIndex < string.length; sequenceIndex++) {
459
+ if (supportsBellTerminator && string[sequenceIndex] === ANSI_BELL) {
460
+ return createControlParseResult(string.slice(index, sequenceIndex + 1), sequenceIndex + 1);
461
+ }
462
+
463
+ if (
464
+ string[sequenceIndex] === ESCAPE
465
+ && string[sequenceIndex + 1] === ANSI_OSC_TERMINATOR
466
+ ) {
467
+ return createControlParseResult(string.slice(index, sequenceIndex + 2), sequenceIndex + 2);
468
+ }
469
+
470
+ if (string[sequenceIndex] === C1_STRING_TERMINATOR) {
471
+ return createControlParseResult(string.slice(index, sequenceIndex + 1), sequenceIndex + 1);
472
+ }
473
+ }
474
+
475
+ return createControlParseResult(string.slice(index), string.length);
476
+ }
477
+
478
+ function parseAnsiCode(string, index) {
479
+ const codePoint = string.codePointAt(index);
480
+ if (codePoint === ESCAPE_CODE_POINT || codePoint === C1_OSC_CODE_POINT) {
481
+ const hyperlinkCode = parseHyperlinkCode(string, index);
482
+ if (hyperlinkCode) {
483
+ return hyperlinkCode;
484
+ }
485
+ }
486
+
487
+ const controlStringCode = parseControlStringCode(string, index);
488
+ if (controlStringCode) {
489
+ return controlStringCode;
490
+ }
491
+
492
+ return parseCsiCode(string, index);
493
+ }
494
+
495
+ function appendTrailingAnsiTokens(string, index, tokens) {
496
+ while (index < string.length) {
497
+ const nextCodePoint = string.codePointAt(index);
498
+ if (!ESCAPES.has(nextCodePoint)) {
499
+ break;
500
+ }
501
+
502
+ const escapeCode = parseAnsiCode(string, index);
503
+ if (!escapeCode) {
504
+ break;
505
+ }
506
+
507
+ tokens.push(escapeCode.token);
508
+ index = escapeCode.endIndex;
509
+ }
510
+
511
+ return index;
512
+ }
513
+
514
+ function parseCharacterTokenWithRawSegmentation(string, index, graphemeSegments) {
515
+ const segment = graphemeSegments.containing(index);
516
+ if (!segment || segment.index !== index) {
517
+ return;
518
+ }
519
+
520
+ return {
521
+ token: {
522
+ type: 'character',
523
+ // Intentionally preserve UAX29 behavior (GB3): CRLF is one grapheme cluster.
524
+ value: segment.segment,
525
+ visibleWidth: getGraphemeWidth(segment.segment),
526
+ isGraphemeContinuation: false,
527
+ },
528
+ endIndex: index + segment.segment.length,
529
+ };
530
+ }
531
+
532
+ function collectVisibleCharacters(string) {
533
+ const visibleCharacters = [];
534
+ let index = 0;
535
+
536
+ while (index < string.length) {
537
+ const codePoint = string.codePointAt(index);
538
+ if (ESCAPES.has(codePoint)) {
539
+ const code = parseAnsiCode(string, index);
540
+ if (code) {
541
+ index = code.endIndex;
542
+ continue;
543
+ }
544
+ }
545
+
546
+ const value = String.fromCodePoint(codePoint);
547
+ visibleCharacters.push({
548
+ value,
549
+ visibleWidth: 1,
550
+ isGraphemeContinuation: false,
551
+ });
552
+ index += value.length;
553
+ }
554
+
555
+ return visibleCharacters;
556
+ }
557
+
558
+ function applyGraphemeMetadata(visibleCharacters) {
559
+ if (visibleCharacters.length === 0) {
560
+ return;
561
+ }
562
+
563
+ const visibleString = visibleCharacters.map(({value}) => value).join('');
564
+ const scalarOffsets = [];
565
+ let scalarOffset = 0;
566
+
567
+ for (const visibleCharacter of visibleCharacters) {
568
+ scalarOffsets.push(scalarOffset);
569
+ scalarOffset += visibleCharacter.value.length;
570
+ }
571
+
572
+ let scalarIndex = 0;
573
+ for (const segment of GRAPHEME_SEGMENTER.segment(visibleString)) {
574
+ while (
575
+ scalarIndex < visibleCharacters.length
576
+ && scalarOffsets[scalarIndex] < segment.index
577
+ ) {
578
+ scalarIndex++;
579
+ }
580
+
581
+ let graphemeIndex = scalarIndex;
582
+ let isFirstInGrapheme = true;
583
+ while (
584
+ graphemeIndex < visibleCharacters.length
585
+ && scalarOffsets[graphemeIndex] < segment.index + segment.segment.length
586
+ ) {
587
+ visibleCharacters[graphemeIndex].visibleWidth = isFirstInGrapheme ? getGraphemeWidth(segment.segment) : 0;
588
+ visibleCharacters[graphemeIndex].isGraphemeContinuation = !isFirstInGrapheme;
589
+ isFirstInGrapheme = false;
590
+ graphemeIndex++;
591
+ }
592
+
593
+ scalarIndex = graphemeIndex;
594
+ }
595
+ }
596
+
597
+ function tokenizeAnsiWithVisibleSegmentation(string, {endCharacter = Number.POSITIVE_INFINITY} = {}) {
598
+ const tokens = [];
599
+ const visibleCharacters = collectVisibleCharacters(string);
600
+ applyGraphemeMetadata(visibleCharacters);
601
+
602
+ let index = 0;
603
+ let visibleCharacterIndex = 0;
604
+ let visibleCount = 0;
605
+ while (index < string.length) {
606
+ const codePoint = string.codePointAt(index);
607
+
608
+ if (ESCAPES.has(codePoint)) {
609
+ const code = parseAnsiCode(string, index);
610
+ if (code) {
611
+ tokens.push(code.token);
612
+ index = code.endIndex;
613
+ continue;
614
+ }
615
+ }
616
+
617
+ const value = String.fromCodePoint(codePoint);
618
+ const visibleCharacter = visibleCharacters[visibleCharacterIndex];
619
+ let visibleWidth = isFullwidthCodePoint(codePoint) ? 2 : value.length;
620
+ if (visibleCharacter) {
621
+ visibleWidth = visibleCharacter.visibleWidth;
622
+ }
623
+
624
+ const token = {
625
+ type: 'character',
626
+ value,
627
+ visibleWidth,
628
+ isGraphemeContinuation: visibleCharacter ? visibleCharacter.isGraphemeContinuation : false,
629
+ };
630
+
631
+ tokens.push(token);
632
+ index += value.length;
633
+ visibleCharacterIndex++;
634
+ visibleCount += token.visibleWidth;
635
+
636
+ if (visibleCount >= endCharacter) {
637
+ const nextVisibleCharacter = visibleCharacters[visibleCharacterIndex];
638
+ if (
639
+ !nextVisibleCharacter
640
+ || !nextVisibleCharacter.isGraphemeContinuation
641
+ ) {
642
+ index = appendTrailingAnsiTokens(string, index, tokens);
643
+ break;
644
+ }
645
+ }
646
+ }
647
+
648
+ return tokens;
649
+ }
650
+
651
+ function areValuesInSameGrapheme(leftValue, rightValue) {
652
+ const pair = `${leftValue}${rightValue}`;
653
+ const splitIndex = leftValue.length;
654
+
655
+ for (const segment of GRAPHEME_SEGMENTER.segment(pair)) {
656
+ if (segment.index === splitIndex) {
657
+ return false;
658
+ }
659
+
660
+ if (segment.index > splitIndex) {
661
+ return true;
662
+ }
663
+ }
664
+
665
+ return true;
666
+ }
667
+
668
+ function hasAnsiSplitContinuationAhead(string, startIndex, previousVisibleValue, graphemeSegments) {
669
+ if (!previousVisibleValue) {
670
+ return false;
671
+ }
672
+
673
+ let index = startIndex;
674
+ let hasAnsiCode = false;
675
+ while (index < string.length) {
676
+ const codePoint = string.codePointAt(index);
677
+ if (ESCAPES.has(codePoint)) {
678
+ const code = parseAnsiCode(string, index);
679
+ if (code) {
680
+ hasAnsiCode = true;
681
+ index = code.endIndex;
682
+ continue;
683
+ }
684
+ }
685
+
686
+ if (!hasAnsiCode) {
687
+ return false;
688
+ }
689
+
690
+ const characterToken = parseCharacterTokenWithRawSegmentation(string, index, graphemeSegments);
691
+ if (!characterToken) {
692
+ return true;
693
+ }
694
+
695
+ return areValuesInSameGrapheme(previousVisibleValue, characterToken.token.value);
696
+ }
697
+
698
+ return false;
699
+ }
700
+
701
+ export default function tokenizeAnsi(string, {endCharacter = Number.POSITIVE_INFINITY} = {}) {
702
+ const tokens = [];
703
+ const graphemeSegments = GRAPHEME_SEGMENTER.segment(string);
704
+
705
+ let index = 0;
706
+ let visibleCount = 0;
707
+ let previousVisibleValue;
708
+ let hasAnsiSinceLastVisible = false;
709
+ while (index < string.length) {
710
+ const codePoint = string.codePointAt(index);
711
+
712
+ if (ESCAPES.has(codePoint)) {
713
+ const code = parseAnsiCode(string, index);
714
+ if (code) {
715
+ tokens.push(code.token);
716
+ index = code.endIndex;
717
+ hasAnsiSinceLastVisible = true;
718
+ continue;
719
+ }
720
+ }
721
+
722
+ const characterToken = parseCharacterTokenWithRawSegmentation(string, index, graphemeSegments);
723
+ if (!characterToken) {
724
+ return tokenizeAnsiWithVisibleSegmentation(string, {endCharacter});
725
+ }
726
+
727
+ if (
728
+ hasAnsiSinceLastVisible
729
+ && previousVisibleValue
730
+ && areValuesInSameGrapheme(previousVisibleValue, characterToken.token.value)
731
+ ) {
732
+ return tokenizeAnsiWithVisibleSegmentation(string, {endCharacter});
733
+ }
734
+
735
+ tokens.push(characterToken.token);
736
+ index = characterToken.endIndex;
737
+ visibleCount += characterToken.token.visibleWidth;
738
+ hasAnsiSinceLastVisible = false;
739
+ previousVisibleValue = characterToken.token.value;
740
+
741
+ if (visibleCount >= endCharacter) {
742
+ if (hasAnsiSplitContinuationAhead(string, index, previousVisibleValue, graphemeSegments)) {
743
+ return tokenizeAnsiWithVisibleSegmentation(string, {endCharacter});
744
+ }
745
+
746
+ index = appendTrailingAnsiTokens(string, index, tokens);
747
+ break;
748
+ }
749
+ }
750
+
751
+ return tokens;
752
+ }