@dungle-scrubs/tallow 0.9.4 → 0.9.7

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 (212) hide show
  1. package/dist/cli.js +8 -5
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -1
  4. package/dist/config.js +1 -1
  5. package/dist/interactive-mode-patch.d.ts +24 -12
  6. package/dist/interactive-mode-patch.d.ts.map +1 -1
  7. package/dist/interactive-mode-patch.js +229 -146
  8. package/dist/interactive-mode-patch.js.map +1 -1
  9. package/dist/interactive-reset.d.ts +49 -0
  10. package/dist/interactive-reset.d.ts.map +1 -0
  11. package/dist/interactive-reset.js +40 -0
  12. package/dist/interactive-reset.js.map +1 -0
  13. package/dist/pi-tui-editor-patch.d.ts +10 -0
  14. package/dist/pi-tui-editor-patch.d.ts.map +1 -0
  15. package/dist/pi-tui-editor-patch.js +159 -0
  16. package/dist/pi-tui-editor-patch.js.map +1 -0
  17. package/dist/pi-tui-patch.d.ts +2 -0
  18. package/dist/pi-tui-patch.d.ts.map +1 -0
  19. package/dist/pi-tui-patch.js +563 -0
  20. package/dist/pi-tui-patch.js.map +1 -0
  21. package/dist/pi-tui-settings-list-patch.d.ts +11 -0
  22. package/dist/pi-tui-settings-list-patch.d.ts.map +1 -0
  23. package/dist/pi-tui-settings-list-patch.js +38 -0
  24. package/dist/pi-tui-settings-list-patch.js.map +1 -0
  25. package/dist/process-cleanup.js +1 -1
  26. package/dist/process-cleanup.js.map +1 -1
  27. package/dist/reset-diagnostics.d.ts +69 -0
  28. package/dist/reset-diagnostics.d.ts.map +1 -0
  29. package/dist/reset-diagnostics.js +41 -0
  30. package/dist/reset-diagnostics.js.map +1 -0
  31. package/dist/sdk.d.ts +7 -23
  32. package/dist/sdk.d.ts.map +1 -1
  33. package/dist/sdk.js +211 -174
  34. package/dist/sdk.js.map +1 -1
  35. package/dist/workspace-transition-interactive.d.ts +1 -0
  36. package/dist/workspace-transition-interactive.d.ts.map +1 -1
  37. package/dist/workspace-transition-interactive.js +8 -18
  38. package/dist/workspace-transition-interactive.js.map +1 -1
  39. package/extensions/__integration__/audit-findings.test.ts +4 -5
  40. package/extensions/_icons/index.ts +2 -4
  41. package/extensions/_shared/__tests__/image-metadata.test.ts +33 -0
  42. package/extensions/_shared/__tests__/shell-policy.test.ts +19 -0
  43. package/extensions/_shared/__tests__/terminal-links.test.ts +18 -0
  44. package/extensions/_shared/image-metadata.ts +99 -0
  45. package/extensions/_shared/inline-preview.ts +1 -1
  46. package/extensions/_shared/shell-policy.ts +121 -1
  47. package/extensions/_shared/terminal-links.ts +22 -0
  48. package/extensions/ask-user-question-tool/index.ts +0 -3
  49. package/extensions/clear/__tests__/clear.test.ts +269 -2
  50. package/extensions/command-expansion/index.ts +9 -3
  51. package/extensions/context-files/index.ts +5 -1
  52. package/extensions/context-fork/__tests__/context-fork.test.ts +94 -1
  53. package/extensions/context-fork/extension.json +1 -1
  54. package/extensions/context-fork/frontmatter-index.ts +6 -1
  55. package/extensions/context-fork/index.ts +32 -0
  56. package/extensions/edit-tool-enhanced/index.ts +2 -1
  57. package/extensions/git-status/__tests__/git-status.test.ts +65 -2
  58. package/extensions/git-status/index.ts +268 -98
  59. package/extensions/hooks/index.ts +33 -11
  60. package/extensions/loop/index.ts +14 -1
  61. package/extensions/lsp/index.ts +64 -13
  62. package/extensions/lsp/package.json +2 -2
  63. package/extensions/minimal-skill-display/index.ts +7 -1
  64. package/extensions/random-spinner/index.ts +7 -642
  65. package/extensions/read-tool-enhanced/index.ts +13 -10
  66. package/extensions/render-stabilizer/__tests__/render-stabilizer.test.ts +2 -3
  67. package/extensions/render-stabilizer/index.ts +6 -6
  68. package/extensions/rewind/__tests__/session-files.test.ts +115 -0
  69. package/extensions/rewind/__tests__/snapshots.test.ts +23 -0
  70. package/extensions/rewind/index.ts +5 -0
  71. package/extensions/rewind/session-files.ts +138 -0
  72. package/extensions/rewind/snapshots.ts +104 -5
  73. package/extensions/skill-commands/index.ts +6 -1
  74. package/extensions/slash-command-bridge/__tests__/slash-command-bridge.test.ts +26 -0
  75. package/extensions/slash-command-bridge/index.ts +14 -2
  76. package/extensions/subagent-tool/model-resolver.ts +274 -7
  77. package/extensions/subagent-tool/schema.ts +1 -2
  78. package/extensions/tasks/commands/register-tasks-extension.ts +9 -9
  79. package/extensions/teams-tool/tools/register-extension.ts +1 -3
  80. package/extensions/teams-tool/tools/teammate-tools.ts +1 -2
  81. package/extensions/web-search-tool/index.ts +2 -1
  82. package/extensions/wezterm-pane-control/index.ts +1 -2
  83. package/extensions/write-tool-enhanced/index.ts +2 -1
  84. package/node_modules/@mariozechner/pi-tui/README.md +56 -34
  85. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts +18 -13
  86. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.d.ts.map +1 -1
  87. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js +182 -113
  88. package/node_modules/@mariozechner/pi-tui/dist/autocomplete.js.map +1 -1
  89. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js +3 -3
  90. package/node_modules/@mariozechner/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  91. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts +45 -36
  92. package/node_modules/@mariozechner/pi-tui/dist/components/editor.d.ts.map +1 -1
  93. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js +489 -325
  94. package/node_modules/@mariozechner/pi-tui/dist/components/editor.js.map +1 -1
  95. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts +1 -99
  96. package/node_modules/@mariozechner/pi-tui/dist/components/image.d.ts.map +1 -1
  97. package/node_modules/@mariozechner/pi-tui/dist/components/image.js +17 -192
  98. package/node_modules/@mariozechner/pi-tui/dist/components/image.js.map +1 -1
  99. package/node_modules/@mariozechner/pi-tui/dist/components/input.d.ts.map +1 -1
  100. package/node_modules/@mariozechner/pi-tui/dist/components/input.js +57 -60
  101. package/node_modules/@mariozechner/pi-tui/dist/components/input.js.map +1 -1
  102. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts +2 -69
  103. package/node_modules/@mariozechner/pi-tui/dist/components/loader.d.ts.map +1 -1
  104. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js +5 -102
  105. package/node_modules/@mariozechner/pi-tui/dist/components/loader.js.map +1 -1
  106. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.d.ts.map +1 -1
  107. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js +111 -53
  108. package/node_modules/@mariozechner/pi-tui/dist/components/markdown.js.map +1 -1
  109. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts +19 -1
  110. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.d.ts.map +1 -1
  111. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js +78 -67
  112. package/node_modules/@mariozechner/pi-tui/dist/components/select-list.js.map +1 -1
  113. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts +1 -25
  114. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  115. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js +13 -50
  116. package/node_modules/@mariozechner/pi-tui/dist/components/settings-list.js.map +1 -1
  117. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts +8 -10
  118. package/node_modules/@mariozechner/pi-tui/dist/index.d.ts.map +1 -1
  119. package/node_modules/@mariozechner/pi-tui/dist/index.js +6 -9
  120. package/node_modules/@mariozechner/pi-tui/dist/index.js.map +1 -1
  121. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts +108 -238
  122. package/node_modules/@mariozechner/pi-tui/dist/keybindings.d.ts.map +1 -1
  123. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js +108 -365
  124. package/node_modules/@mariozechner/pi-tui/dist/keybindings.js.map +1 -1
  125. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts +33 -48
  126. package/node_modules/@mariozechner/pi-tui/dist/keys.d.ts.map +1 -1
  127. package/node_modules/@mariozechner/pi-tui/dist/keys.js +239 -155
  128. package/node_modules/@mariozechner/pi-tui/dist/keys.js.map +1 -1
  129. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts +14 -94
  130. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.d.ts.map +1 -1
  131. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js +44 -186
  132. package/node_modules/@mariozechner/pi-tui/dist/terminal-image.js.map +1 -1
  133. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts +13 -58
  134. package/node_modules/@mariozechner/pi-tui/dist/terminal.d.ts.map +1 -1
  135. package/node_modules/@mariozechner/pi-tui/dist/terminal.js +78 -111
  136. package/node_modules/@mariozechner/pi-tui/dist/terminal.js.map +1 -1
  137. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts +24 -110
  138. package/node_modules/@mariozechner/pi-tui/dist/tui.d.ts.map +1 -1
  139. package/node_modules/@mariozechner/pi-tui/dist/tui.js +188 -435
  140. package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -1
  141. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts +0 -18
  142. package/node_modules/@mariozechner/pi-tui/dist/utils.d.ts.map +1 -1
  143. package/node_modules/@mariozechner/pi-tui/dist/utils.js +251 -119
  144. package/node_modules/@mariozechner/pi-tui/dist/utils.js.map +1 -1
  145. package/node_modules/@mariozechner/pi-tui/package.json +6 -6
  146. package/node_modules/@mariozechner/pi-tui/src/__tests__/__snapshots__/render.test.ts.snap +3 -40
  147. package/node_modules/@mariozechner/pi-tui/src/__tests__/image-component.test.ts +71 -81
  148. package/node_modules/@mariozechner/pi-tui/src/__tests__/render.test.ts +0 -33
  149. package/node_modules/@mariozechner/pi-tui/src/__tests__/terminal-image.test.ts +93 -334
  150. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-render-scheduling.test.ts +1 -1
  151. package/node_modules/@mariozechner/pi-tui/src/__tests__/utils.test.ts +11 -196
  152. package/node_modules/@mariozechner/pi-tui/src/autocomplete.ts +228 -142
  153. package/node_modules/@mariozechner/pi-tui/src/components/cancellable-loader.ts +3 -3
  154. package/node_modules/@mariozechner/pi-tui/src/components/editor.ts +624 -390
  155. package/node_modules/@mariozechner/pi-tui/src/components/image.ts +17 -227
  156. package/node_modules/@mariozechner/pi-tui/src/components/input.ts +71 -63
  157. package/node_modules/@mariozechner/pi-tui/src/components/loader.ts +5 -137
  158. package/node_modules/@mariozechner/pi-tui/src/components/markdown.ts +143 -52
  159. package/node_modules/@mariozechner/pi-tui/src/components/select-list.ts +136 -70
  160. package/node_modules/@mariozechner/pi-tui/src/components/settings-list.ts +12 -51
  161. package/node_modules/@mariozechner/pi-tui/src/index.ts +17 -36
  162. package/node_modules/@mariozechner/pi-tui/src/keybindings.ts +148 -421
  163. package/node_modules/@mariozechner/pi-tui/src/keys.ts +253 -181
  164. package/node_modules/@mariozechner/pi-tui/src/terminal-image.ts +51 -252
  165. package/node_modules/@mariozechner/pi-tui/src/terminal.ts +78 -133
  166. package/node_modules/@mariozechner/pi-tui/src/tui.ts +202 -478
  167. package/node_modules/@mariozechner/pi-tui/src/utils.ts +289 -125
  168. package/node_modules/@mariozechner/pi-tui/tsconfig.build.json +1 -0
  169. package/package.json +13 -13
  170. package/packages/tallow-tui/node_modules/@types/mime-types/README.md +8 -2
  171. package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +6 -0
  172. package/packages/tallow-tui/node_modules/@types/mime-types/package.json +9 -3
  173. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup-data.js +18 -0
  174. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +116 -384
  175. package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +5 -4
  176. package/packages/tallow-tui/node_modules/get-east-asian-width/utilities.js +24 -0
  177. package/packages/tallow-tui/node_modules/marked/README.md +5 -4
  178. package/packages/tallow-tui/node_modules/marked/bin/main.js +10 -8
  179. package/packages/tallow-tui/node_modules/marked/bin/marked.js +2 -1
  180. package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +156 -125
  181. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +67 -2179
  182. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +3 -3
  183. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +67 -2201
  184. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +3 -3
  185. package/packages/tallow-tui/node_modules/marked/man/marked.1 +4 -2
  186. package/packages/tallow-tui/node_modules/marked/man/marked.1.md +2 -1
  187. package/packages/tallow-tui/node_modules/marked/package.json +26 -34
  188. package/skills/tallow-expert/SKILL.md +3 -5
  189. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts +0 -32
  190. package/node_modules/@mariozechner/pi-tui/dist/border-styles.d.ts.map +0 -1
  191. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js +0 -46
  192. package/node_modules/@mariozechner/pi-tui/dist/border-styles.js.map +0 -1
  193. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts +0 -52
  194. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.d.ts.map +0 -1
  195. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js +0 -89
  196. package/node_modules/@mariozechner/pi-tui/dist/components/bordered-box.js.map +0 -1
  197. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts +0 -14
  198. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.d.ts.map +0 -1
  199. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js +0 -55
  200. package/node_modules/@mariozechner/pi-tui/dist/test-utils/capability-env.js.map +0 -1
  201. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-change-listener.test.ts +0 -121
  202. package/node_modules/@mariozechner/pi-tui/src/__tests__/editor-ghost-text.test.ts +0 -112
  203. package/node_modules/@mariozechner/pi-tui/src/__tests__/mouse-events.test.ts +0 -134
  204. package/node_modules/@mariozechner/pi-tui/src/__tests__/settings-list.test.ts +0 -81
  205. package/node_modules/@mariozechner/pi-tui/src/__tests__/tui-diff-regression.test.ts +0 -555
  206. package/node_modules/@mariozechner/pi-tui/src/border-styles.ts +0 -60
  207. package/node_modules/@mariozechner/pi-tui/src/components/bordered-box.ts +0 -113
  208. package/node_modules/@mariozechner/pi-tui/src/test-utils/capability-env.ts +0 -56
  209. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +0 -2211
  210. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +0 -7
  211. package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +0 -728
  212. package/packages/tallow-tui/node_modules/marked/marked.min.js +0 -69
@@ -39,6 +39,117 @@ const rgiEmojiRegex = /^\p{RGI_Emoji}$/v;
39
39
  const WIDTH_CACHE_SIZE = 512;
40
40
  const widthCache = new Map<string, number>();
41
41
 
42
+ function isPrintableAscii(str: string): boolean {
43
+ for (let i = 0; i < str.length; i++) {
44
+ const code = str.charCodeAt(i);
45
+ if (code < 0x20 || code > 0x7e) {
46
+ return false;
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+
52
+ function truncateFragmentToWidth(text: string, maxWidth: number): { text: string; width: number } {
53
+ if (maxWidth <= 0 || text.length === 0) {
54
+ return { text: "", width: 0 };
55
+ }
56
+
57
+ if (isPrintableAscii(text)) {
58
+ const clipped = text.slice(0, maxWidth);
59
+ return { text: clipped, width: clipped.length };
60
+ }
61
+
62
+ const hasAnsi = text.includes("\x1b");
63
+ const hasTabs = text.includes("\t");
64
+ if (!hasAnsi && !hasTabs) {
65
+ let result = "";
66
+ let width = 0;
67
+ for (const { segment } of segmenter.segment(text)) {
68
+ const w = graphemeWidth(segment);
69
+ if (width + w > maxWidth) {
70
+ break;
71
+ }
72
+ result += segment;
73
+ width += w;
74
+ }
75
+ return { text: result, width };
76
+ }
77
+
78
+ let result = "";
79
+ let width = 0;
80
+ let i = 0;
81
+ let pendingAnsi = "";
82
+
83
+ while (i < text.length) {
84
+ const ansi = extractAnsiCode(text, i);
85
+ if (ansi) {
86
+ pendingAnsi += ansi.code;
87
+ i += ansi.length;
88
+ continue;
89
+ }
90
+
91
+ if (text[i] === "\t") {
92
+ if (width + 3 > maxWidth) {
93
+ break;
94
+ }
95
+ if (pendingAnsi) {
96
+ result += pendingAnsi;
97
+ pendingAnsi = "";
98
+ }
99
+ result += "\t";
100
+ width += 3;
101
+ i++;
102
+ continue;
103
+ }
104
+
105
+ let end = i;
106
+ while (end < text.length && text[end] !== "\t") {
107
+ const nextAnsi = extractAnsiCode(text, end);
108
+ if (nextAnsi) {
109
+ break;
110
+ }
111
+ end++;
112
+ }
113
+
114
+ for (const { segment } of segmenter.segment(text.slice(i, end))) {
115
+ const w = graphemeWidth(segment);
116
+ if (width + w > maxWidth) {
117
+ return { text: result, width };
118
+ }
119
+ if (pendingAnsi) {
120
+ result += pendingAnsi;
121
+ pendingAnsi = "";
122
+ }
123
+ result += segment;
124
+ width += w;
125
+ }
126
+ i = end;
127
+ }
128
+
129
+ return { text: result, width };
130
+ }
131
+
132
+ function finalizeTruncatedResult(
133
+ prefix: string,
134
+ prefixWidth: number,
135
+ ellipsis: string,
136
+ ellipsisWidth: number,
137
+ maxWidth: number,
138
+ pad: boolean
139
+ ): string {
140
+ const reset = "\x1b[0m";
141
+ const visibleWidth = prefixWidth + ellipsisWidth;
142
+ let result: string;
143
+
144
+ if (ellipsis.length > 0) {
145
+ result = `${prefix}${reset}${ellipsis}${reset}`;
146
+ } else {
147
+ result = `${prefix}${reset}`;
148
+ }
149
+
150
+ return pad ? result + " ".repeat(Math.max(0, maxWidth - visibleWidth)) : result;
151
+ }
152
+
42
153
  /**
43
154
  * Calculate the terminal width of a single grapheme cluster.
44
155
  * Based on code from the string-width library, but includes a possible-emoji
@@ -62,6 +173,13 @@ function graphemeWidth(segment: string): number {
62
173
  return 0;
63
174
  }
64
175
 
176
+ // Regional indicator symbols (U+1F1E6..U+1F1FF) are often rendered as
177
+ // full-width emoji in terminals, even when isolated during streaming.
178
+ // Keep width conservative (2) to avoid terminal auto-wrap drift artifacts.
179
+ if (cp >= 0x1f1e6 && cp <= 0x1f1ff) {
180
+ return 2;
181
+ }
182
+
65
183
  let width = eastAsianWidth(cp);
66
184
 
67
185
  // Trailing halfwidth/fullwidth forms
@@ -86,15 +204,7 @@ export function visibleWidth(str: string): number {
86
204
  }
87
205
 
88
206
  // Fast path: pure ASCII printable
89
- let isPureAscii = true;
90
- for (let i = 0; i < str.length; i++) {
91
- const code = str.charCodeAt(i);
92
- if (code < 0x20 || code > 0x7e) {
93
- isPureAscii = false;
94
- break;
95
- }
96
- }
97
- if (isPureAscii) {
207
+ if (isPrintableAscii(str)) {
98
208
  return str.length;
99
209
  }
100
210
 
@@ -110,22 +220,21 @@ export function visibleWidth(str: string): number {
110
220
  clean = clean.replace(/\t/g, " ");
111
221
  }
112
222
  if (clean.includes("\x1b")) {
113
- // Order matters: strip OSC/APC BEFORE CSI. Unterminated OSC sequences
114
- // use [^\x07\x1b]* which stops at the next ESC byte. If CSI sequences
115
- // (like \x1b[39m) are stripped first, the ESC boundary disappears and
116
- // the unterminated OSC consumes visible text that followed the CSI.
117
- //
118
- // Strip all OSC sequences: \x1b]...\x07 or \x1b]...\x1b\\
119
- // Also handles unterminated OSC sequences (no BEL/ST) that run to
120
- // the next ESC or end-of-string. Programs like bun test emit bare
121
- // \x1b]1337;SetUserVar=... without a terminator.
122
- clean = clean.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)?/g, "");
123
- // Strip APC sequences: \x1b_...\x07 or \x1b_...\x1b\\
124
- // Also handles unterminated APC sequences.
125
- clean = clean.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)?/g, "");
126
- // Strip all CSI sequences: ESC [ (optional ?/!/>) params final-byte (0x40-0x7E)
127
- // Covers SGR (m), cursor movement (A-H), erase (J/K), DEC private mode (?25l/h), etc.
128
- clean = clean.replace(/\x1b\[[?!>]?[0-9;]*[\x40-\x7e]/g, "");
223
+ // Strip supported ANSI/OSC/APC escape sequences in one pass.
224
+ // This covers CSI styling/cursor codes, OSC hyperlinks and prompt markers,
225
+ // and APC sequences like CURSOR_MARKER.
226
+ let stripped = "";
227
+ let i = 0;
228
+ while (i < clean.length) {
229
+ const ansi = extractAnsiCode(clean, i);
230
+ if (ansi) {
231
+ i += ansi.length;
232
+ continue;
233
+ }
234
+ stripped += clean[i];
235
+ i++;
236
+ }
237
+ clean = stripped;
129
238
  }
130
239
 
131
240
  // Calculate width
@@ -154,19 +263,11 @@ export function extractAnsiCode(str: string, pos: number): { code: string; lengt
154
263
 
155
264
  const next = str[pos + 1];
156
265
 
157
- // CSI sequence: ESC [ (optional ?/!/>) digits/semicolons then final byte (0x40-0x7E)
158
- // Covers SGR, cursor movement, erase, DEC private mode, etc.
266
+ // CSI sequence: ESC [ ... m/G/K/H/J
159
267
  if (next === "[") {
160
268
  let j = pos + 2;
161
- // Skip optional DEC private mode prefix (?, !, >)
162
- if (j < str.length && (str[j] === "?" || str[j] === "!" || str[j] === ">")) j++;
163
- // Skip parameter bytes (digits and semicolons)
164
- while (j < str.length && /[0-9;]/.test(str[j]!)) j++;
165
- // Must end with a final byte in the 0x40-0x7E range (@ through ~)
166
- const code = str.charCodeAt(j);
167
- if (j < str.length && code >= 0x40 && code <= 0x7e) {
168
- return { code: str.substring(pos, j + 1), length: j + 1 - pos };
169
- }
269
+ while (j < str.length && !/[mGKHJ]/.test(str[j]!)) j++;
270
+ if (j < str.length) return { code: str.substring(pos, j + 1), length: j + 1 - pos };
170
271
  return null;
171
272
  }
172
273
 
@@ -214,8 +315,16 @@ class AnsiCodeTracker {
214
315
  private strikethrough = false;
215
316
  private fgColor: string | null = null; // Stores the full code like "31" or "38;5;240"
216
317
  private bgColor: string | null = null; // Stores the full code like "41" or "48;5;240"
318
+ private activeHyperlink: string | null = null; // Active OSC 8 hyperlink URL, or null
217
319
 
218
320
  process(ansiCode: string): void {
321
+ // OSC 8 hyperlink: \x1b]8;;<url>\x1b\\ (open) or \x1b]8;;\x1b\\ (close)
322
+ if (ansiCode.startsWith("\x1b]8;")) {
323
+ const m = ansiCode.match(/^\x1b\]8;[^;]*;([^\x1b\x07]*)/);
324
+ this.activeHyperlink = m?.[1] ? m[1] : null;
325
+ return;
326
+ }
327
+
219
328
  if (!ansiCode.endsWith("m")) {
220
329
  return;
221
330
  }
@@ -350,11 +459,13 @@ class AnsiCodeTracker {
350
459
  this.strikethrough = false;
351
460
  this.fgColor = null;
352
461
  this.bgColor = null;
462
+ // SGR reset does not affect OSC 8 hyperlink state
353
463
  }
354
464
 
355
465
  /** Clear all state for reuse. */
356
466
  clear(): void {
357
467
  this.reset();
468
+ this.activeHyperlink = null;
358
469
  }
359
470
 
360
471
  getActiveCodes(): string {
@@ -370,8 +481,11 @@ class AnsiCodeTracker {
370
481
  if (this.fgColor) codes.push(this.fgColor);
371
482
  if (this.bgColor) codes.push(this.bgColor);
372
483
 
373
- if (codes.length === 0) return "";
374
- return `\x1b[${codes.join(";")}m`;
484
+ let result = codes.length > 0 ? `\x1b[${codes.join(";")}m` : "";
485
+ if (this.activeHyperlink) {
486
+ result += `\x1b]8;;${this.activeHyperlink}\x1b\\`;
487
+ }
488
+ return result;
375
489
  }
376
490
 
377
491
  hasActiveCodes(): boolean {
@@ -385,22 +499,26 @@ class AnsiCodeTracker {
385
499
  this.hidden ||
386
500
  this.strikethrough ||
387
501
  this.fgColor !== null ||
388
- this.bgColor !== null
502
+ this.bgColor !== null ||
503
+ this.activeHyperlink !== null
389
504
  );
390
505
  }
391
506
 
392
507
  /**
393
- * Get reset codes for attributes that need to be turned off at line end,
394
- * specifically underline which bleeds into padding.
395
- * Returns empty string if no problematic attributes are active.
508
+ * Get reset codes for attributes that need to be turned off at line end.
509
+ * Underline must be closed to prevent bleeding into padding.
510
+ * Active OSC 8 hyperlinks must be closed and re-opened on the next line.
511
+ * Returns empty string if no attributes need closing.
396
512
  */
397
513
  getLineEndReset(): string {
398
- // Only underline causes visual bleeding into padding
399
- // Other attributes like colors don't visually bleed to padding
514
+ let result = "";
400
515
  if (this.underline) {
401
- return "\x1b[24m"; // Underline off only
516
+ result += "\x1b[24m"; // Underline off only
402
517
  }
403
- return "";
518
+ if (this.activeHyperlink) {
519
+ result += "\x1b]8;;\x1b\\"; // Close hyperlink; re-opened at line start via getActiveCodes()
520
+ }
521
+ return result;
404
522
  }
405
523
  }
406
524
 
@@ -705,77 +823,150 @@ export function truncateToWidth(
705
823
  ellipsis: string = "...",
706
824
  pad: boolean = false
707
825
  ): string {
708
- const textVisibleWidth = visibleWidth(text);
826
+ if (maxWidth <= 0) {
827
+ return "";
828
+ }
709
829
 
710
- if (textVisibleWidth <= maxWidth) {
711
- return pad ? text + " ".repeat(maxWidth - textVisibleWidth) : text;
830
+ if (text.length === 0) {
831
+ return pad ? " ".repeat(maxWidth) : "";
712
832
  }
713
833
 
714
834
  const ellipsisWidth = visibleWidth(ellipsis);
715
- const targetWidth = maxWidth - ellipsisWidth;
835
+ if (ellipsisWidth >= maxWidth) {
836
+ const textWidth = visibleWidth(text);
837
+ if (textWidth <= maxWidth) {
838
+ return pad ? text + " ".repeat(maxWidth - textWidth) : text;
839
+ }
840
+
841
+ const clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);
842
+ if (clippedEllipsis.width === 0) {
843
+ return pad ? " ".repeat(maxWidth) : "";
844
+ }
845
+ return finalizeTruncatedResult(
846
+ "",
847
+ 0,
848
+ clippedEllipsis.text,
849
+ clippedEllipsis.width,
850
+ maxWidth,
851
+ pad
852
+ );
853
+ }
716
854
 
717
- if (targetWidth <= 0) {
718
- return ellipsis.substring(0, maxWidth);
855
+ if (isPrintableAscii(text)) {
856
+ if (text.length <= maxWidth) {
857
+ return pad ? text + " ".repeat(maxWidth - text.length) : text;
858
+ }
859
+ const targetWidth = maxWidth - ellipsisWidth;
860
+ return finalizeTruncatedResult(
861
+ text.slice(0, targetWidth),
862
+ targetWidth,
863
+ ellipsis,
864
+ ellipsisWidth,
865
+ maxWidth,
866
+ pad
867
+ );
719
868
  }
720
869
 
721
- // Separate ANSI codes from visible content using grapheme segmentation
722
- let i = 0;
723
- const segments: Array<{ type: "ansi" | "grapheme"; value: string }> = [];
870
+ const targetWidth = maxWidth - ellipsisWidth;
871
+ let result = "";
872
+ let pendingAnsi = "";
873
+ let visibleSoFar = 0;
874
+ let keptWidth = 0;
875
+ let keepContiguousPrefix = true;
876
+ let overflowed = false;
877
+ let exhaustedInput = false;
878
+ const hasAnsi = text.includes("\x1b");
879
+ const hasTabs = text.includes("\t");
880
+
881
+ if (!hasAnsi && !hasTabs) {
882
+ for (const { segment } of segmenter.segment(text)) {
883
+ const width = graphemeWidth(segment);
884
+ if (keepContiguousPrefix && keptWidth + width <= targetWidth) {
885
+ result += segment;
886
+ keptWidth += width;
887
+ } else {
888
+ keepContiguousPrefix = false;
889
+ }
890
+ visibleSoFar += width;
891
+ if (visibleSoFar > maxWidth) {
892
+ overflowed = true;
893
+ break;
894
+ }
895
+ }
896
+ exhaustedInput = !overflowed;
897
+ } else {
898
+ let i = 0;
899
+ while (i < text.length) {
900
+ const ansi = extractAnsiCode(text, i);
901
+ if (ansi) {
902
+ pendingAnsi += ansi.code;
903
+ i += ansi.length;
904
+ continue;
905
+ }
906
+
907
+ if (text[i] === "\t") {
908
+ if (keepContiguousPrefix && keptWidth + 3 <= targetWidth) {
909
+ if (pendingAnsi) {
910
+ result += pendingAnsi;
911
+ pendingAnsi = "";
912
+ }
913
+ result += "\t";
914
+ keptWidth += 3;
915
+ } else {
916
+ keepContiguousPrefix = false;
917
+ pendingAnsi = "";
918
+ }
919
+ visibleSoFar += 3;
920
+ if (visibleSoFar > maxWidth) {
921
+ overflowed = true;
922
+ break;
923
+ }
924
+ i++;
925
+ continue;
926
+ }
724
927
 
725
- while (i < text.length) {
726
- const ansiResult = extractAnsiCode(text, i);
727
- if (ansiResult) {
728
- segments.push({ type: "ansi", value: ansiResult.code });
729
- i += ansiResult.length;
730
- } else {
731
- // Find the next ANSI code or end of string
732
928
  let end = i;
733
- while (end < text.length) {
929
+ while (end < text.length && text[end] !== "\t") {
734
930
  const nextAnsi = extractAnsiCode(text, end);
735
- if (nextAnsi) break;
931
+ if (nextAnsi) {
932
+ break;
933
+ }
736
934
  end++;
737
935
  }
738
- // Segment this non-ANSI portion into graphemes
739
- const textPortion = text.slice(i, end);
740
- for (const seg of segmenter.segment(textPortion)) {
741
- segments.push({ type: "grapheme", value: seg.segment });
936
+
937
+ for (const { segment } of segmenter.segment(text.slice(i, end))) {
938
+ const width = graphemeWidth(segment);
939
+ if (keepContiguousPrefix && keptWidth + width <= targetWidth) {
940
+ if (pendingAnsi) {
941
+ result += pendingAnsi;
942
+ pendingAnsi = "";
943
+ }
944
+ result += segment;
945
+ keptWidth += width;
946
+ } else {
947
+ keepContiguousPrefix = false;
948
+ pendingAnsi = "";
949
+ }
950
+
951
+ visibleSoFar += width;
952
+ if (visibleSoFar > maxWidth) {
953
+ overflowed = true;
954
+ break;
955
+ }
956
+ }
957
+ if (overflowed) {
958
+ break;
742
959
  }
743
960
  i = end;
744
961
  }
962
+ exhaustedInput = i >= text.length;
745
963
  }
746
964
 
747
- // Build truncated string from segments
748
- let result = "";
749
- let currentWidth = 0;
750
-
751
- for (const seg of segments) {
752
- if (seg.type === "ansi") {
753
- result += seg.value;
754
- continue;
755
- }
756
-
757
- const grapheme = seg.value;
758
- // Skip empty graphemes to avoid issues with string-width calculation
759
- if (!grapheme) continue;
760
-
761
- const graphemeWidth = visibleWidth(grapheme);
762
-
763
- if (currentWidth + graphemeWidth > targetWidth) {
764
- break;
765
- }
766
-
767
- result += grapheme;
768
- currentWidth += graphemeWidth;
965
+ if (!overflowed && exhaustedInput) {
966
+ return pad ? text + " ".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;
769
967
  }
770
968
 
771
- // Reset AFTER ellipsis so it inherits the line's current ANSI state
772
- // (e.g. red/green foreground on diff lines) but doesn't leak into subsequent content
773
- const truncated = `${result}${ellipsis}\x1b[0m`;
774
- if (pad) {
775
- const truncatedWidth = visibleWidth(truncated);
776
- return truncated + " ".repeat(Math.max(0, maxWidth - truncatedWidth));
777
- }
778
- return truncated;
969
+ return finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);
779
970
  }
780
971
 
781
972
  /**
@@ -919,30 +1110,3 @@ export function extractSegments(
919
1110
 
920
1111
  return { before, beforeWidth, after, afterWidth };
921
1112
  }
922
-
923
- // ─── OSC 8 Hyperlinks ────────────────────────────────────────────────────────
924
-
925
- /**
926
- * Wrap visible text in an OSC 8 terminal hyperlink.
927
- * The text remains visible; clicking it opens the URL in the terminal's handler.
928
- *
929
- * @param url - Target URL (e.g. "file:///path/to/file", "https://...")
930
- * @param text - Visible text to display
931
- * @returns Text wrapped in OSC 8 escape sequences
932
- */
933
- export function hyperlink(url: string, text: string): string {
934
- return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
935
- }
936
-
937
- /**
938
- * Wrap a file path in an OSC 8 hyperlink using the file:// protocol.
939
- * The display text is the path itself (or a custom label).
940
- *
941
- * @param filePath - Absolute file path
942
- * @param displayText - Optional display text (defaults to filePath)
943
- * @returns Path wrapped in a file:// OSC 8 hyperlink
944
- */
945
- export function fileLink(filePath: string, displayText?: string): string {
946
- const url = `file://${encodeURI(filePath)}`;
947
- return hyperlink(url, displayText ?? filePath);
948
- }
@@ -4,6 +4,7 @@
4
4
  "module": "ES2022",
5
5
  "moduleResolution": "bundler",
6
6
  "lib": ["ES2024"],
7
+ "types": ["node"],
7
8
  "declaration": true,
8
9
  "declarationMap": true,
9
10
  "sourceMap": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dungle-scrubs/tallow",
3
- "version": "0.9.4",
3
+ "version": "0.9.7",
4
4
  "description": "An opinionated coding agent. Built on pi.",
5
5
  "piConfig": {
6
6
  "name": "tallow",
@@ -73,26 +73,26 @@
73
73
  ]
74
74
  },
75
75
  "dependencies": {
76
- "@clack/prompts": "^1.1.0",
76
+ "@clack/prompts": "^1.2.0",
77
77
  "@dungle-scrubs/synapse": "0.1.8",
78
- "@mariozechner/pi-coding-agent": "^0.64.0",
79
- "@mariozechner/pi-tui": "^0.62.0",
80
- "@opentelemetry/api": "^1.9.0",
81
- "@sinclair/typebox": "0.34.48",
82
- "ai": "^6.0.116",
78
+ "@mariozechner/pi-coding-agent": "^0.70.0",
79
+ "@mariozechner/pi-tui": "^0.70.0",
80
+ "@opentelemetry/api": "^1.9.1",
81
+ "@sinclair/typebox": "0.34.49",
82
+ "ai": "^6.0.162",
83
83
  "commander": "^14.0.3",
84
- "unpdf": "^1.4.0",
84
+ "unpdf": "^1.6.0",
85
85
  "vscode-jsonrpc": "8.2.1",
86
86
  "vscode-languageserver-protocol": "3.17.5"
87
87
  },
88
88
  "devDependencies": {
89
- "@biomejs/biome": "2.4.2",
90
- "@mariozechner/pi-agent-core": "^0.64.0",
91
- "@mariozechner/pi-ai": "^0.64.0",
92
- "@types/node": "25.2.3",
89
+ "@biomejs/biome": "2.4.12",
90
+ "@mariozechner/pi-agent-core": "^0.70.0",
91
+ "@mariozechner/pi-ai": "^0.70.0",
92
+ "@types/node": "25.6.0",
93
93
  "husky": "^9.1.7",
94
94
  "lint-staged": "^16.4.0",
95
- "typescript": "^5.9.3"
95
+ "typescript": "^6.0.2"
96
96
  },
97
97
  "engines": {
98
98
  "node": ">=22"
@@ -9,20 +9,26 @@ Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree
9
9
  ## [index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mime-types/index.d.ts)
10
10
  ````ts
11
11
  export function lookup(filenameOrExt: string): string | false;
12
+
12
13
  export function contentType(filenameOrExt: string): string | false;
14
+
13
15
  export function extension(typeString: string): string | false;
16
+
14
17
  export function charset(typeString: string): string | false;
18
+
15
19
  export namespace charsets {
16
20
  const lookup: typeof charset;
17
21
  }
22
+
18
23
  export const types: { [key: string]: string };
24
+
19
25
  export const extensions: { [key: string]: string[] };
20
26
 
21
27
  ````
22
28
 
23
29
  ### Additional Details
24
- * Last updated: Tue, 07 Nov 2023 09:09:39 GMT
30
+ * Last updated: Sat, 07 Jun 2025 02:15:25 GMT
25
31
  * Dependencies: none
26
32
 
27
33
  # Credits
28
- These definitions were written by [Gyusun Yeom](https://github.com/Perlmint).
34
+ These definitions were written by [Gyusun Yeom](https://github.com/Perlmint), and [Sebastian Beltran](https://github.com/bjohansebas).
@@ -1,9 +1,15 @@
1
1
  export function lookup(filenameOrExt: string): string | false;
2
+
2
3
  export function contentType(filenameOrExt: string): string | false;
4
+
3
5
  export function extension(typeString: string): string | false;
6
+
4
7
  export function charset(typeString: string): string | false;
8
+
5
9
  export namespace charsets {
6
10
  const lookup: typeof charset;
7
11
  }
12
+
8
13
  export const types: { [key: string]: string };
14
+
9
15
  export const extensions: { [key: string]: string[] };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@types/mime-types",
3
- "version": "2.1.4",
3
+ "version": "3.0.1",
4
4
  "description": "TypeScript definitions for mime-types",
5
5
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/mime-types",
6
6
  "license": "MIT",
@@ -9,6 +9,11 @@
9
9
  "name": "Gyusun Yeom",
10
10
  "githubUsername": "Perlmint",
11
11
  "url": "https://github.com/Perlmint"
12
+ },
13
+ {
14
+ "name": "Sebastian Beltran",
15
+ "githubUsername": "bjohansebas",
16
+ "url": "https://github.com/bjohansebas"
12
17
  }
13
18
  ],
14
19
  "main": "",
@@ -20,6 +25,7 @@
20
25
  },
21
26
  "scripts": {},
22
27
  "dependencies": {},
23
- "typesPublisherContentHash": "4fc952c6b156849cee9d95c0ab6082b55a05cd04a2e69589aab53982b696da9c",
24
- "typeScriptVersion": "4.5"
28
+ "peerDependencies": {},
29
+ "typesPublisherContentHash": "a40f1b8ad7a6df5e0c5217e98b92e81fb5d70013ac677ddd1dd4203cfbb7f7a3",
30
+ "typeScriptVersion": "5.1"
25
31
  }
@@ -0,0 +1,18 @@
1
+ // Generated by scripts/build.js
2
+
3
+ // prettier-ignore
4
+ const ambiguousRanges = [161, 161, 164, 164, 167, 168, 170, 170, 173, 174, 176, 180, 182, 186, 188, 191, 198, 198, 208, 208, 215, 216, 222, 225, 230, 230, 232, 234, 236, 237, 240, 240, 242, 243, 247, 250, 252, 252, 254, 254, 257, 257, 273, 273, 275, 275, 283, 283, 294, 295, 299, 299, 305, 307, 312, 312, 319, 322, 324, 324, 328, 331, 333, 333, 338, 339, 358, 359, 363, 363, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 593, 593, 609, 609, 708, 708, 711, 711, 713, 715, 717, 717, 720, 720, 728, 731, 733, 733, 735, 735, 768, 879, 913, 929, 931, 937, 945, 961, 963, 969, 1025, 1025, 1040, 1103, 1105, 1105, 8208, 8208, 8211, 8214, 8216, 8217, 8220, 8221, 8224, 8226, 8228, 8231, 8240, 8240, 8242, 8243, 8245, 8245, 8251, 8251, 8254, 8254, 8308, 8308, 8319, 8319, 8321, 8324, 8364, 8364, 8451, 8451, 8453, 8453, 8457, 8457, 8467, 8467, 8470, 8470, 8481, 8482, 8486, 8486, 8491, 8491, 8531, 8532, 8539, 8542, 8544, 8555, 8560, 8569, 8585, 8585, 8592, 8601, 8632, 8633, 8658, 8658, 8660, 8660, 8679, 8679, 8704, 8704, 8706, 8707, 8711, 8712, 8715, 8715, 8719, 8719, 8721, 8721, 8725, 8725, 8730, 8730, 8733, 8736, 8739, 8739, 8741, 8741, 8743, 8748, 8750, 8750, 8756, 8759, 8764, 8765, 8776, 8776, 8780, 8780, 8786, 8786, 8800, 8801, 8804, 8807, 8810, 8811, 8814, 8815, 8834, 8835, 8838, 8839, 8853, 8853, 8857, 8857, 8869, 8869, 8895, 8895, 8978, 8978, 9312, 9449, 9451, 9547, 9552, 9587, 9600, 9615, 9618, 9621, 9632, 9633, 9635, 9641, 9650, 9651, 9654, 9655, 9660, 9661, 9664, 9665, 9670, 9672, 9675, 9675, 9678, 9681, 9698, 9701, 9711, 9711, 9733, 9734, 9737, 9737, 9742, 9743, 9756, 9756, 9758, 9758, 9792, 9792, 9794, 9794, 9824, 9825, 9827, 9829, 9831, 9834, 9836, 9837, 9839, 9839, 9886, 9887, 9919, 9919, 9926, 9933, 9935, 9939, 9941, 9953, 9955, 9955, 9960, 9961, 9963, 9969, 9972, 9972, 9974, 9977, 9979, 9980, 9982, 9983, 10045, 10045, 10102, 10111, 11094, 11097, 12872, 12879, 57344, 63743, 65024, 65039, 65533, 65533, 127232, 127242, 127248, 127277, 127280, 127337, 127344, 127373, 127375, 127376, 127387, 127404, 917760, 917999, 983040, 1048573, 1048576, 1114109];
5
+
6
+ // prettier-ignore
7
+ const fullwidthRanges = [12288, 12288, 65281, 65376, 65504, 65510];
8
+
9
+ // prettier-ignore
10
+ const halfwidthRanges = [8361, 8361, 65377, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65512, 65518];
11
+
12
+ // prettier-ignore
13
+ const narrowRanges = [32, 126, 162, 163, 165, 166, 172, 172, 175, 175, 10214, 10221, 10629, 10630];
14
+
15
+ // prettier-ignore
16
+ const wideRanges = [4352, 4447, 8986, 8987, 9001, 9002, 9193, 9196, 9200, 9200, 9203, 9203, 9725, 9726, 9748, 9749, 9776, 9783, 9800, 9811, 9855, 9855, 9866, 9871, 9875, 9875, 9889, 9889, 9898, 9899, 9917, 9918, 9924, 9925, 9934, 9934, 9940, 9940, 9962, 9962, 9970, 9971, 9973, 9973, 9978, 9978, 9981, 9981, 9989, 9989, 9994, 9995, 10024, 10024, 10060, 10060, 10062, 10062, 10067, 10069, 10071, 10071, 10133, 10135, 10160, 10160, 10175, 10175, 11035, 11036, 11088, 11088, 11093, 11093, 11904, 11929, 11931, 12019, 12032, 12245, 12272, 12287, 12289, 12350, 12353, 12438, 12441, 12543, 12549, 12591, 12593, 12686, 12688, 12773, 12783, 12830, 12832, 12871, 12880, 42124, 42128, 42182, 43360, 43388, 44032, 55203, 63744, 64255, 65040, 65049, 65072, 65106, 65108, 65126, 65128, 65131, 94176, 94180, 94192, 94198, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 119552, 119638, 119648, 119670, 126980, 126980, 127183, 127183, 127374, 127374, 127377, 127386, 127488, 127490, 127504, 127547, 127552, 127560, 127568, 127569, 127584, 127589, 127744, 127776, 127789, 127797, 127799, 127868, 127870, 127891, 127904, 127946, 127951, 127955, 127968, 127984, 127988, 127988, 127992, 128062, 128064, 128064, 128066, 128252, 128255, 128317, 128331, 128334, 128336, 128359, 128378, 128378, 128405, 128406, 128420, 128420, 128507, 128591, 128640, 128709, 128716, 128716, 128720, 128722, 128725, 128728, 128732, 128735, 128747, 128748, 128756, 128764, 128992, 129003, 129008, 129008, 129292, 129338, 129340, 129349, 129351, 129535, 129648, 129660, 129664, 129674, 129678, 129734, 129736, 129736, 129741, 129756, 129759, 129770, 129775, 129784, 131072, 196605, 196608, 262141];
17
+
18
+ export {ambiguousRanges, fullwidthRanges, halfwidthRanges, narrowRanges, wideRanges};