@chat-js/cli 0.6.1 → 0.6.3

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 (154) hide show
  1. package/dist/index.js +17065 -16667
  2. package/package.json +1 -1
  3. package/templates/chat-app/app/(auth)/login/page.tsx +3 -3
  4. package/templates/chat-app/app/(chat)/api/chat/route.ts +4 -60
  5. package/templates/chat-app/app/not-found.tsx +2 -2
  6. package/templates/chat-app/chat.config.ts +3 -0
  7. package/templates/chat-app/components/ai-elements/actions.tsx +44 -44
  8. package/templates/chat-app/components/ai-elements/artifact.tsx +92 -92
  9. package/templates/chat-app/components/ai-elements/code-block.tsx +143 -143
  10. package/templates/chat-app/components/ai-elements/context.tsx +313 -313
  11. package/templates/chat-app/components/ai-elements/conversation.tsx +65 -65
  12. package/templates/chat-app/components/ai-elements/extra/conversation-content-scroll-area.tsx +29 -29
  13. package/templates/chat-app/components/ai-elements/extra/mcp-tool-header.tsx +27 -27
  14. package/templates/chat-app/components/ai-elements/message.tsx +341 -344
  15. package/templates/chat-app/components/ai-elements/parseIncompleteMarkdown.tsx +122 -122
  16. package/templates/chat-app/components/ai-elements/prompt-input.tsx +1059 -1059
  17. package/templates/chat-app/components/ai-elements/reasoning.tsx +131 -131
  18. package/templates/chat-app/components/ai-elements/response.tsx +15 -12
  19. package/templates/chat-app/components/ai-elements/sandbox.tsx +84 -84
  20. package/templates/chat-app/components/ai-elements/shimmer.tsx +47 -47
  21. package/templates/chat-app/components/ai-elements/suggestion.tsx +33 -33
  22. package/templates/chat-app/components/ai-elements/tool.tsx +118 -118
  23. package/templates/chat-app/components/app-sidebar-history-conditional.tsx +3 -3
  24. package/templates/chat-app/components/app-sidebar.tsx +3 -3
  25. package/templates/chat-app/components/connectors-dropdown.tsx +6 -3
  26. package/templates/chat-app/components/deep-research-progress.tsx +1 -1
  27. package/templates/chat-app/components/header-breadcrumb.tsx +14 -11
  28. package/templates/chat-app/components/internal-link.tsx +73 -0
  29. package/templates/chat-app/components/login-form.tsx +5 -5
  30. package/templates/chat-app/components/message-parts.tsx +1 -71
  31. package/templates/chat-app/components/model-selector.tsx +3 -3
  32. package/templates/chat-app/components/new-chat-button.tsx +4 -4
  33. package/templates/chat-app/components/part/document-common.tsx +3 -3
  34. package/templates/chat-app/components/part/document-tool.tsx +3 -3
  35. package/templates/chat-app/components/part/message-annotations.tsx +2 -2
  36. package/templates/chat-app/components/part/tool-part.tsx +92 -0
  37. package/templates/chat-app/components/project-chat-item.tsx +2 -2
  38. package/templates/chat-app/components/research-progress.tsx +2 -2
  39. package/templates/chat-app/components/research-task.tsx +1 -1
  40. package/templates/chat-app/components/research-tasks.tsx +1 -1
  41. package/templates/chat-app/components/settings/connectors-settings.tsx +4 -4
  42. package/templates/chat-app/components/settings/mcp-details-page.tsx +5 -5
  43. package/templates/chat-app/components/settings/settings-nav.tsx +3 -3
  44. package/templates/chat-app/components/sidebar-chat-item.tsx +4 -12
  45. package/templates/chat-app/components/sidebar-project-item.tsx +4 -11
  46. package/templates/chat-app/components/sidebar-top-row.tsx +7 -7
  47. package/templates/chat-app/components/sidebar-user-nav.tsx +3 -3
  48. package/templates/chat-app/components/signup-form.tsx +8 -5
  49. package/templates/chat-app/components/source-badge.tsx +3 -9
  50. package/templates/chat-app/components/sources.tsx +1 -1
  51. package/templates/chat-app/components/ui/accordion.tsx +32 -32
  52. package/templates/chat-app/components/ui/alert-dialog.tsx +103 -103
  53. package/templates/chat-app/components/ui/alert.tsx +36 -36
  54. package/templates/chat-app/components/ui/avatar.tsx +28 -28
  55. package/templates/chat-app/components/ui/badge.tsx +22 -22
  56. package/templates/chat-app/components/ui/breadcrumb.tsx +72 -72
  57. package/templates/chat-app/components/ui/button-group.tsx +58 -58
  58. package/templates/chat-app/components/ui/button.tsx +45 -45
  59. package/templates/chat-app/components/ui/card.tsx +65 -65
  60. package/templates/chat-app/components/ui/checkbox.tsx +16 -16
  61. package/templates/chat-app/components/ui/collapsible.tsx +1 -1
  62. package/templates/chat-app/components/ui/command.tsx +137 -137
  63. package/templates/chat-app/components/ui/dialog.tsx +94 -94
  64. package/templates/chat-app/components/ui/drawer.tsx +68 -68
  65. package/templates/chat-app/components/ui/dropdown-menu.tsx +184 -184
  66. package/templates/chat-app/components/ui/empty.tsx +76 -76
  67. package/templates/chat-app/components/ui/extra/action-container.tsx +3 -3
  68. package/templates/chat-app/components/ui/extra/scroll-area-viewport-ref.tsx +24 -24
  69. package/templates/chat-app/components/ui/form.tsx +112 -112
  70. package/templates/chat-app/components/ui/hover-card.tsx +25 -25
  71. package/templates/chat-app/components/ui/input-group.tsx +126 -126
  72. package/templates/chat-app/components/ui/input.tsx +13 -13
  73. package/templates/chat-app/components/ui/label.tsx +12 -12
  74. package/templates/chat-app/components/ui/popover.tsx +25 -25
  75. package/templates/chat-app/components/ui/progress.tsx +19 -19
  76. package/templates/chat-app/components/ui/resizable.tsx +27 -27
  77. package/templates/chat-app/components/ui/scroll-area.tsx +30 -30
  78. package/templates/chat-app/components/ui/select.tsx +108 -108
  79. package/templates/chat-app/components/ui/separator.tsx +16 -16
  80. package/templates/chat-app/components/ui/sheet.tsx +91 -91
  81. package/templates/chat-app/components/ui/sidebar.tsx +615 -615
  82. package/templates/chat-app/components/ui/skeleton.tsx +7 -7
  83. package/templates/chat-app/components/ui/slider.tsx +50 -50
  84. package/templates/chat-app/components/ui/spinner.tsx +8 -8
  85. package/templates/chat-app/components/ui/switch.tsx +16 -16
  86. package/templates/chat-app/components/ui/table.tsx +71 -71
  87. package/templates/chat-app/components/ui/tabs.tsx +31 -31
  88. package/templates/chat-app/components/ui/textarea.tsx +10 -10
  89. package/templates/chat-app/components/ui/toggle.tsx +31 -31
  90. package/templates/chat-app/components/ui/tooltip.tsx +48 -48
  91. package/templates/chat-app/components/upgrade-cta/limit-display.tsx +7 -7
  92. package/templates/chat-app/components/upgrade-cta/login-cta-banner.tsx +3 -3
  93. package/templates/chat-app/components/upgrade-cta/login-prompt.tsx +3 -3
  94. package/templates/chat-app/hooks/use-mobile.ts +13 -13
  95. package/templates/chat-app/lib/ai/core-chat-agent.ts +25 -14
  96. package/templates/chat-app/lib/ai/eval-agent.ts +4 -5
  97. package/templates/chat-app/lib/ai/gateway-model-defaults.ts +24 -0
  98. package/templates/chat-app/lib/ai/installed-tools.ts +12 -0
  99. package/templates/chat-app/lib/ai/mcp/mcp-client.ts +2 -2
  100. package/templates/chat-app/lib/ai/models.generated.ts +4236 -4585
  101. package/templates/chat-app/lib/ai/tool-renderer-registry.ts +31 -0
  102. package/templates/chat-app/lib/ai/types.ts +15 -20
  103. package/templates/chat-app/lib/config-requirements.ts +11 -6
  104. package/templates/chat-app/lib/config-schema.ts +24 -0
  105. package/templates/chat-app/lib/stores/hooks-message-parts.ts +1 -1
  106. package/templates/chat-app/lib/utils.ts +157 -157
  107. package/templates/chat-app/package.json +1 -1
  108. package/templates/chat-app/scripts/check-env.ts +229 -2
  109. package/templates/chat-app/tools/chatjs/_shared/lib/tool-part.ts +5 -0
  110. package/templates/chat-app/{components/part/weather.tsx → tools/chatjs/get-weather/renderer.tsx} +24 -38
  111. package/templates/chat-app/{components/part/retrieve-url.tsx → tools/chatjs/retrieve-url/renderer.tsx} +20 -15
  112. package/templates/chat-app/{lib/ai/tools/retrieve-url.ts → tools/chatjs/retrieve-url/tool.ts} +46 -7
  113. package/templates/chat-app/tools/chatjs/tools.ts +16 -0
  114. package/templates/chat-app/tools/chatjs/ui.ts +17 -0
  115. package/templates/chat-app/tools/chatjs/word-count/renderer.tsx +50 -0
  116. package/templates/chat-app/tools/chatjs/word-count/tool.ts +30 -0
  117. package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.ts +3 -5
  118. package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/deep-research.ts +2 -3
  119. package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/pipeline.ts +1 -1
  120. package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/types.ts +1 -1
  121. package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/utils.ts +7 -7
  122. package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/types.ts +1 -1
  123. package/templates/chat-app/{lib/ai/tools → tools/platform}/generate-video.ts +4 -6
  124. package/templates/chat-app/{lib/ai/tools → tools/platform}/read-document.ts +2 -2
  125. package/templates/chat-app/{lib/ai/tools → tools/platform}/steps/multi-query-web-search.ts +1 -1
  126. package/templates/chat-app/{lib/ai/tools → tools/platform}/steps/web-search.ts +1 -1
  127. package/templates/chat-app/{lib/ai/tools → tools/platform}/tools.ts +54 -30
  128. package/templates/chat-app/{lib/ai/tools → tools/platform}/web-search.ts +7 -5
  129. package/templates/electron/CHANGELOG.md +16 -2
  130. package/templates/electron/package.json +1 -1
  131. package/templates/chat-app/lib/ai/tools/tools-definitions.ts +0 -83
  132. /package/templates/chat-app/{lib/ai/tools/get-weather.ts → tools/chatjs/get-weather/tool.ts} +0 -0
  133. /package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.javascript.ts +0 -0
  134. /package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.python.ts +0 -0
  135. /package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.shared.test.ts +0 -0
  136. /package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.shared.ts +0 -0
  137. /package/templates/chat-app/{lib/ai/tools → tools/platform}/code-execution.types.ts +0 -0
  138. /package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/configuration.ts +0 -0
  139. /package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/prompts.ts +0 -0
  140. /package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/researcher-agent.ts +0 -0
  141. /package/templates/chat-app/{lib/ai/tools → tools/platform}/deep-research/supervisor-agent.ts +0 -0
  142. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/code-guidelines.ts +0 -0
  143. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/create-code-document.ts +0 -0
  144. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/create-sheet-document.ts +0 -0
  145. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/create-text-document.ts +0 -0
  146. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/edit-code-document.ts +0 -0
  147. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/edit-sheet-document.ts +0 -0
  148. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/edit-text-document.ts +0 -0
  149. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/sheet-guidelines.ts +0 -0
  150. /package/templates/chat-app/{lib/ai/tools → tools/platform}/documents/text-guidelines.ts +0 -0
  151. /package/templates/chat-app/{lib/ai/tools → tools/platform}/generate-image.ts +0 -0
  152. /package/templates/chat-app/{lib/ai/tools → tools/platform}/research-updates-schema.ts +0 -0
  153. /package/templates/chat-app/{lib/ai/tools → tools/platform}/steps/search-utils.ts +0 -0
  154. /package/templates/chat-app/{lib/ai/tools → tools/platform}/types.ts +0 -0
@@ -4,141 +4,141 @@
4
4
  * of links, images, bold, and italic formatting during streaming.
5
5
  */
6
6
  export function parseIncompleteMarkdown(text: string): string {
7
- if (!text || typeof text !== "string") {
8
- return text;
9
- }
7
+ if (!text || typeof text !== "string") {
8
+ return text;
9
+ }
10
10
 
11
- let result = text;
11
+ let result = text;
12
12
 
13
- // Handle incomplete links and images
14
- // Pattern: [...] or ![...] where the closing ] is missing
15
- const linkImagePattern = /(!?\[)([^\]]*?)$/;
16
- const linkMatch = result.match(linkImagePattern);
17
- if (linkMatch) {
18
- // If we have an unterminated [ or ![, remove it and everything after
19
- const startIndex = result.lastIndexOf(linkMatch[1]);
20
- result = result.substring(0, startIndex);
21
- }
13
+ // Handle incomplete links and images
14
+ // Pattern: [...] or ![...] where the closing ] is missing
15
+ const linkImagePattern = /(!?\[)([^\]]*?)$/;
16
+ const linkMatch = result.match(linkImagePattern);
17
+ if (linkMatch) {
18
+ // If we have an unterminated [ or ![, remove it and everything after
19
+ const startIndex = result.lastIndexOf(linkMatch[1]);
20
+ result = result.substring(0, startIndex);
21
+ }
22
22
 
23
- // Handle incomplete bold formatting (**)
24
- const boldPattern = /(\*\*)([^*]*?)$/;
25
- const boldMatch = result.match(boldPattern);
26
- if (boldMatch) {
27
- // Count the number of ** in the entire string
28
- const asteriskPairs = (result.match(/\*\*/g) || []).length;
29
- // If odd number of **, we have an incomplete bold - complete it
30
- if (asteriskPairs % 2 === 1) {
31
- result = `${result}**`;
32
- }
33
- }
23
+ // Handle incomplete bold formatting (**)
24
+ const boldPattern = /(\*\*)([^*]*?)$/;
25
+ const boldMatch = result.match(boldPattern);
26
+ if (boldMatch) {
27
+ // Count the number of ** in the entire string
28
+ const asteriskPairs = (result.match(/\*\*/g) || []).length;
29
+ // If odd number of **, we have an incomplete bold - complete it
30
+ if (asteriskPairs % 2 === 1) {
31
+ result = `${result}**`;
32
+ }
33
+ }
34
34
 
35
- // Handle incomplete italic formatting (__)
36
- const italicPattern = /(__)([^_]*?)$/;
37
- const italicMatch = result.match(italicPattern);
38
- if (italicMatch) {
39
- // Count the number of __ in the entire string
40
- const underscorePairs = (result.match(/__/g) || []).length;
41
- // If odd number of __, we have an incomplete italic - complete it
42
- if (underscorePairs % 2 === 1) {
43
- result = `${result}__`;
44
- }
45
- }
35
+ // Handle incomplete italic formatting (__)
36
+ const italicPattern = /(__)([^_]*?)$/;
37
+ const italicMatch = result.match(italicPattern);
38
+ if (italicMatch) {
39
+ // Count the number of __ in the entire string
40
+ const underscorePairs = (result.match(/__/g) || []).length;
41
+ // If odd number of __, we have an incomplete italic - complete it
42
+ if (underscorePairs % 2 === 1) {
43
+ result = `${result}__`;
44
+ }
45
+ }
46
46
 
47
- // Handle incomplete single asterisk italic (*)
48
- const singleAsteriskPattern = /(\*)([^*]*?)$/;
49
- const singleAsteriskMatch = result.match(singleAsteriskPattern);
50
- if (singleAsteriskMatch) {
51
- // Count single asterisks that aren't part of **
52
- const singleAsterisks = result.split("").reduce((acc, char, index) => {
53
- if (char === "*") {
54
- // Check if it's part of a ** pair
55
- const prevChar = result[index - 1];
56
- const nextChar = result[index + 1];
57
- if (prevChar !== "*" && nextChar !== "*") {
58
- return acc + 1;
59
- }
60
- }
61
- return acc;
62
- }, 0);
47
+ // Handle incomplete single asterisk italic (*)
48
+ const singleAsteriskPattern = /(\*)([^*]*?)$/;
49
+ const singleAsteriskMatch = result.match(singleAsteriskPattern);
50
+ if (singleAsteriskMatch) {
51
+ // Count single asterisks that aren't part of **
52
+ const singleAsterisks = result.split("").reduce((acc, char, index) => {
53
+ if (char === "*") {
54
+ // Check if it's part of a ** pair
55
+ const prevChar = result[index - 1];
56
+ const nextChar = result[index + 1];
57
+ if (prevChar !== "*" && nextChar !== "*") {
58
+ return acc + 1;
59
+ }
60
+ }
61
+ return acc;
62
+ }, 0);
63
63
 
64
- // If odd number of single *, we have an incomplete italic - complete it
65
- if (singleAsterisks % 2 === 1) {
66
- result = `${result}*`;
67
- }
68
- }
64
+ // If odd number of single *, we have an incomplete italic - complete it
65
+ if (singleAsterisks % 2 === 1) {
66
+ result = `${result}*`;
67
+ }
68
+ }
69
69
 
70
- // Handle incomplete single underscore italic (_)
71
- const singleUnderscorePattern = /(_)([^_]*?)$/;
72
- const singleUnderscoreMatch = result.match(singleUnderscorePattern);
73
- if (singleUnderscoreMatch) {
74
- // Count single underscores that aren't part of __
75
- const singleUnderscores = result.split("").reduce((acc, char, index) => {
76
- if (char === "_") {
77
- // Check if it's part of a __ pair
78
- const prevChar = result[index - 1];
79
- const nextChar = result[index + 1];
80
- if (prevChar !== "_" && nextChar !== "_") {
81
- return acc + 1;
82
- }
83
- }
84
- return acc;
85
- }, 0);
70
+ // Handle incomplete single underscore italic (_)
71
+ const singleUnderscorePattern = /(_)([^_]*?)$/;
72
+ const singleUnderscoreMatch = result.match(singleUnderscorePattern);
73
+ if (singleUnderscoreMatch) {
74
+ // Count single underscores that aren't part of __
75
+ const singleUnderscores = result.split("").reduce((acc, char, index) => {
76
+ if (char === "_") {
77
+ // Check if it's part of a __ pair
78
+ const prevChar = result[index - 1];
79
+ const nextChar = result[index + 1];
80
+ if (prevChar !== "_" && nextChar !== "_") {
81
+ return acc + 1;
82
+ }
83
+ }
84
+ return acc;
85
+ }, 0);
86
86
 
87
- // If odd number of single _, we have an incomplete italic - complete it
88
- if (singleUnderscores % 2 === 1) {
89
- result = `${result}_`;
90
- }
91
- }
87
+ // If odd number of single _, we have an incomplete italic - complete it
88
+ if (singleUnderscores % 2 === 1) {
89
+ result = `${result}_`;
90
+ }
91
+ }
92
92
 
93
- // Handle incomplete inline code blocks (`) - but avoid code blocks (```)
94
- const inlineCodePattern = /(`)([^`]*?)$/;
95
- const inlineCodeMatch = result.match(inlineCodePattern);
96
- if (inlineCodeMatch) {
97
- // Check if we're dealing with a code block (triple backticks)
98
- const _hasCodeBlockStart = result.includes("```");
99
- const codeBlockPattern = /```[\s\S]*?```/g;
100
- const _completeCodeBlocks = (result.match(codeBlockPattern) || []).length;
101
- const allTripleBackticks = (result.match(/```/g) || []).length;
93
+ // Handle incomplete inline code blocks (`) - but avoid code blocks (```)
94
+ const inlineCodePattern = /(`)([^`]*?)$/;
95
+ const inlineCodeMatch = result.match(inlineCodePattern);
96
+ if (inlineCodeMatch) {
97
+ // Check if we're dealing with a code block (triple backticks)
98
+ const _hasCodeBlockStart = result.includes("```");
99
+ const codeBlockPattern = /```[\s\S]*?```/g;
100
+ const _completeCodeBlocks = (result.match(codeBlockPattern) || []).length;
101
+ const allTripleBackticks = (result.match(/```/g) || []).length;
102
102
 
103
- // If we have an odd number of ``` sequences, we're inside an incomplete code block
104
- // In this case, don't complete inline code
105
- const insideIncompleteCodeBlock = allTripleBackticks % 2 === 1;
103
+ // If we have an odd number of ``` sequences, we're inside an incomplete code block
104
+ // In this case, don't complete inline code
105
+ const insideIncompleteCodeBlock = allTripleBackticks % 2 === 1;
106
106
 
107
- if (!insideIncompleteCodeBlock) {
108
- // Count the number of single backticks that are NOT part of triple backticks
109
- let singleBacktickCount = 0;
110
- for (let i = 0; i < result.length; i++) {
111
- if (result[i] === "`") {
112
- // Check if this backtick is part of a triple backtick sequence
113
- const isTripleStart = result.substring(i, i + 3) === "```";
114
- const isTripleMiddle =
115
- i > 0 && result.substring(i - 1, i + 2) === "```";
116
- const isTripleEnd = i > 1 && result.substring(i - 2, i + 1) === "```";
107
+ if (!insideIncompleteCodeBlock) {
108
+ // Count the number of single backticks that are NOT part of triple backticks
109
+ let singleBacktickCount = 0;
110
+ for (let i = 0; i < result.length; i++) {
111
+ if (result[i] === "`") {
112
+ // Check if this backtick is part of a triple backtick sequence
113
+ const isTripleStart = result.substring(i, i + 3) === "```";
114
+ const isTripleMiddle =
115
+ i > 0 && result.substring(i - 1, i + 2) === "```";
116
+ const isTripleEnd = i > 1 && result.substring(i - 2, i + 1) === "```";
117
117
 
118
- if (!(isTripleStart || isTripleMiddle || isTripleEnd)) {
119
- singleBacktickCount++;
120
- }
121
- }
122
- }
118
+ if (!(isTripleStart || isTripleMiddle || isTripleEnd)) {
119
+ singleBacktickCount++;
120
+ }
121
+ }
122
+ }
123
123
 
124
- // If odd number of single backticks, we have an incomplete inline code - complete it
125
- if (singleBacktickCount % 2 === 1) {
126
- result = `${result}\``;
127
- }
128
- }
129
- }
124
+ // If odd number of single backticks, we have an incomplete inline code - complete it
125
+ if (singleBacktickCount % 2 === 1) {
126
+ result = `${result}\``;
127
+ }
128
+ }
129
+ }
130
130
 
131
- // Handle incomplete strikethrough formatting (~~)
132
- const strikethroughPattern = /(~~)([^~]*?)$/;
133
- const strikethroughMatch = result.match(strikethroughPattern);
134
- if (strikethroughMatch) {
135
- // Count the number of ~~ in the entire string
136
- const tildePairs = (result.match(/~~/g) || []).length;
137
- // If odd number of ~~, we have an incomplete strikethrough - complete it
138
- if (tildePairs % 2 === 1) {
139
- result = `${result}~~`;
140
- }
141
- }
131
+ // Handle incomplete strikethrough formatting (~~)
132
+ const strikethroughPattern = /(~~)([^~]*?)$/;
133
+ const strikethroughMatch = result.match(strikethroughPattern);
134
+ if (strikethroughMatch) {
135
+ // Count the number of ~~ in the entire string
136
+ const tildePairs = (result.match(/~~/g) || []).length;
137
+ // If odd number of ~~, we have an incomplete strikethrough - complete it
138
+ if (tildePairs % 2 === 1) {
139
+ result = `${result}~~`;
140
+ }
141
+ }
142
142
 
143
- return result;
143
+ return result;
144
144
  }