@nanocollective/nanocoder 1.13.6 → 1.13.8

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 (244) hide show
  1. package/LICENSE.md +16 -3
  2. package/README.md +1 -1
  3. package/dist/app/hooks/useAppInitialization.d.ts.map +1 -1
  4. package/dist/app/hooks/useAppInitialization.js +1 -1
  5. package/dist/app/hooks/useAppInitialization.js.map +1 -1
  6. package/dist/app/hooks/useAppState.d.ts.map +1 -1
  7. package/dist/app/hooks/useAppState.js.map +1 -1
  8. package/dist/app/hooks/useChatHandler.d.ts.map +1 -1
  9. package/dist/app/hooks/useChatHandler.js +9 -3
  10. package/dist/app/hooks/useChatHandler.js.map +1 -1
  11. package/dist/app/hooks/useDirectoryTrust.js.map +1 -1
  12. package/dist/app/hooks/useModeHandlers.d.ts.map +1 -1
  13. package/dist/app/hooks/useModeHandlers.js.map +1 -1
  14. package/dist/app/hooks/useToolHandler.d.ts +1 -1
  15. package/dist/app/hooks/useToolHandler.d.ts.map +1 -1
  16. package/dist/app/hooks/useToolHandler.js +3 -1
  17. package/dist/app/hooks/useToolHandler.js.map +1 -1
  18. package/dist/app/utils/appUtils.d.ts.map +1 -1
  19. package/dist/app/utils/appUtils.js.map +1 -1
  20. package/dist/app/utils/conversationState.d.ts.map +1 -1
  21. package/dist/app.js.map +1 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/client-factory.d.ts.map +1 -1
  24. package/dist/client-factory.js.map +1 -1
  25. package/dist/command-parser.d.ts.map +1 -1
  26. package/dist/commands/clear.d.ts.map +1 -1
  27. package/dist/commands/clear.js.map +1 -1
  28. package/dist/commands/custom-commands.d.ts.map +1 -1
  29. package/dist/commands/custom-commands.js.map +1 -1
  30. package/dist/commands/debug.d.ts.map +1 -1
  31. package/dist/commands/debug.js.map +1 -1
  32. package/dist/commands/exit.d.ts.map +1 -1
  33. package/dist/commands/exit.js.map +1 -1
  34. package/dist/commands/export.d.ts.map +1 -1
  35. package/dist/commands/export.js.map +1 -1
  36. package/dist/commands/help.d.ts.map +1 -1
  37. package/dist/commands/help.js.map +1 -1
  38. package/dist/commands/index.d.ts +14 -14
  39. package/dist/commands/index.d.ts.map +1 -1
  40. package/dist/commands/index.js +14 -14
  41. package/dist/commands/index.js.map +1 -1
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js.map +1 -1
  44. package/dist/commands/mcp.d.ts.map +1 -1
  45. package/dist/commands/mcp.js.map +1 -1
  46. package/dist/commands/model.d.ts.map +1 -1
  47. package/dist/commands/provider.d.ts.map +1 -1
  48. package/dist/commands/recommendations.d.ts.map +1 -1
  49. package/dist/commands/recommendations.js +12 -10
  50. package/dist/commands/recommendations.js.map +1 -1
  51. package/dist/commands/status.d.ts.map +1 -1
  52. package/dist/commands/theme.d.ts.map +1 -1
  53. package/dist/commands/update.d.ts.map +1 -1
  54. package/dist/commands/update.js.map +1 -1
  55. package/dist/commands.d.ts.map +1 -1
  56. package/dist/commands.js.map +1 -1
  57. package/dist/components/assistant-message.d.ts.map +1 -1
  58. package/dist/components/assistant-message.js.map +1 -1
  59. package/dist/components/bash-execution-indicator.d.ts.map +1 -1
  60. package/dist/components/bash-execution-indicator.js.map +1 -1
  61. package/dist/components/cancelling-indicator.js.map +1 -1
  62. package/dist/components/chat-queue.d.ts.map +1 -1
  63. package/dist/components/chat-queue.js +14 -43
  64. package/dist/components/chat-queue.js.map +1 -1
  65. package/dist/components/config-error-message.js.map +1 -1
  66. package/dist/components/custom-commands.d.ts.map +1 -1
  67. package/dist/components/custom-commands.js.map +1 -1
  68. package/dist/components/error-message.js.map +1 -1
  69. package/dist/components/info-message.js.map +1 -1
  70. package/dist/components/model-selector.d.ts.map +1 -1
  71. package/dist/components/model-selector.js.map +1 -1
  72. package/dist/components/provider-selector.js.map +1 -1
  73. package/dist/components/security-disclaimer.js.map +1 -1
  74. package/dist/components/status.d.ts.map +1 -1
  75. package/dist/components/status.js.map +1 -1
  76. package/dist/components/success-message.js.map +1 -1
  77. package/dist/components/theme-selector.d.ts.map +1 -1
  78. package/dist/components/theme-selector.js.map +1 -1
  79. package/dist/components/thinking-indicator.js.map +1 -1
  80. package/dist/components/tool-confirmation.d.ts.map +1 -1
  81. package/dist/components/tool-confirmation.js.map +1 -1
  82. package/dist/components/tool-execution-indicator.d.ts.map +1 -1
  83. package/dist/components/tool-execution-indicator.js.map +1 -1
  84. package/dist/components/tool-message.js.map +1 -1
  85. package/dist/components/update-message.js +3 -3
  86. package/dist/components/update-message.js.map +1 -1
  87. package/dist/components/user-input.d.ts.map +1 -1
  88. package/dist/components/user-input.js +27 -22
  89. package/dist/components/user-input.js.map +1 -1
  90. package/dist/components/user-message.d.ts.map +1 -1
  91. package/dist/components/user-message.js +0 -5
  92. package/dist/components/user-message.js.map +1 -1
  93. package/dist/components/welcome-message.js.map +1 -1
  94. package/dist/config/env-substitution.js +1 -1
  95. package/dist/config/env-substitution.js.map +1 -1
  96. package/dist/config/index.d.ts.map +1 -1
  97. package/dist/config/index.js +10 -10
  98. package/dist/config/index.js.map +1 -1
  99. package/dist/config/logging.d.ts.map +1 -1
  100. package/dist/config/logging.js +1 -1
  101. package/dist/config/logging.js.map +1 -1
  102. package/dist/config/preferences.d.ts.map +1 -1
  103. package/dist/config/preferences.js +2 -2
  104. package/dist/config/preferences.js.map +1 -1
  105. package/dist/config/themes.d.ts.map +1 -1
  106. package/dist/custom-commands/executor.d.ts.map +1 -1
  107. package/dist/custom-commands/executor.js +1 -1
  108. package/dist/custom-commands/executor.js.map +1 -1
  109. package/dist/custom-commands/index.d.ts +3 -3
  110. package/dist/custom-commands/index.d.ts.map +1 -1
  111. package/dist/custom-commands/index.js +3 -3
  112. package/dist/custom-commands/index.js.map +1 -1
  113. package/dist/custom-commands/loader.d.ts.map +1 -1
  114. package/dist/custom-commands/loader.js +1 -1
  115. package/dist/custom-commands/loader.js.map +1 -1
  116. package/dist/custom-commands/parser.d.ts.map +1 -1
  117. package/dist/custom-commands/parser.js.map +1 -1
  118. package/dist/hooks/useInputState.d.ts +10 -3
  119. package/dist/hooks/useInputState.d.ts.map +1 -1
  120. package/dist/hooks/useInputState.js +154 -15
  121. package/dist/hooks/useInputState.js.map +1 -1
  122. package/dist/hooks/useInputState.spec.d.ts +2 -0
  123. package/dist/hooks/useInputState.spec.d.ts.map +1 -0
  124. package/dist/hooks/useInputState.spec.js +163 -0
  125. package/dist/hooks/useInputState.spec.js.map +1 -0
  126. package/dist/hooks/useTheme.d.ts.map +1 -1
  127. package/dist/hooks/useTheme.js.map +1 -1
  128. package/dist/hooks/useUIState.d.ts +0 -2
  129. package/dist/hooks/useUIState.d.ts.map +1 -1
  130. package/dist/hooks/useUIState.js +1 -11
  131. package/dist/hooks/useUIState.js.map +1 -1
  132. package/dist/init/agents-template-generator.d.ts +2 -2
  133. package/dist/init/agents-template-generator.d.ts.map +1 -1
  134. package/dist/init/agents-template-generator.js +1 -1
  135. package/dist/init/agents-template-generator.js.map +1 -1
  136. package/dist/init/project-analyzer.d.ts +2 -2
  137. package/dist/init/project-analyzer.d.ts.map +1 -1
  138. package/dist/init/project-analyzer.js +3 -3
  139. package/dist/init/project-analyzer.js.map +1 -1
  140. package/dist/integration/paste-roundtrip.spec.d.ts +2 -0
  141. package/dist/integration/paste-roundtrip.spec.d.ts.map +1 -0
  142. package/dist/integration/paste-roundtrip.spec.js +327 -0
  143. package/dist/integration/paste-roundtrip.spec.js.map +1 -0
  144. package/dist/langgraph-client.d.ts.map +1 -1
  145. package/dist/langgraph-client.js +4 -2
  146. package/dist/langgraph-client.js.map +1 -1
  147. package/dist/mcp/mcp-client.d.ts.map +1 -1
  148. package/dist/mcp/mcp-client.js.map +1 -1
  149. package/dist/mcp/mcp-tool-adapter.d.ts +1 -1
  150. package/dist/mcp/mcp-tool-adapter.d.ts.map +1 -1
  151. package/dist/mcp/mcp-tool-adapter.js.map +1 -1
  152. package/dist/message-handler.d.ts.map +1 -1
  153. package/dist/prompt-history.d.ts +9 -3
  154. package/dist/prompt-history.d.ts.map +1 -1
  155. package/dist/prompt-history.js +56 -14
  156. package/dist/prompt-history.js.map +1 -1
  157. package/dist/recommendations/model-database.d.ts.map +1 -1
  158. package/dist/recommendations/model-engine.d.ts.map +1 -1
  159. package/dist/recommendations/model-engine.js +1 -1
  160. package/dist/recommendations/model-engine.js.map +1 -1
  161. package/dist/recommendations/recommendation-engine.d.ts.map +1 -1
  162. package/dist/recommendations/recommendation-engine.js +9 -3
  163. package/dist/recommendations/recommendation-engine.js.map +1 -1
  164. package/dist/system/detector.d.ts.map +1 -1
  165. package/dist/tool-calling/index.d.ts +1 -1
  166. package/dist/tool-calling/index.d.ts.map +1 -1
  167. package/dist/tool-calling/index.js +1 -1
  168. package/dist/tool-calling/index.js.map +1 -1
  169. package/dist/tool-calling/json-parser.d.ts.map +1 -1
  170. package/dist/tool-calling/json-parser.js +1 -1
  171. package/dist/tool-calling/json-parser.js.map +1 -1
  172. package/dist/tool-calling/xml-parser.d.ts.map +1 -1
  173. package/dist/tools/create-file.d.ts.map +1 -1
  174. package/dist/tools/create-file.js.map +1 -1
  175. package/dist/tools/delete-lines.d.ts.map +1 -1
  176. package/dist/tools/delete-lines.js.map +1 -1
  177. package/dist/tools/execute-bash.d.ts.map +1 -1
  178. package/dist/tools/execute-bash.js.map +1 -1
  179. package/dist/tools/fetch-url.d.ts.map +1 -1
  180. package/dist/tools/fetch-url.js.map +1 -1
  181. package/dist/tools/index.d.ts.map +1 -1
  182. package/dist/tools/index.js +10 -10
  183. package/dist/tools/index.js.map +1 -1
  184. package/dist/tools/insert-lines.d.ts.map +1 -1
  185. package/dist/tools/insert-lines.js.map +1 -1
  186. package/dist/tools/read-file.d.ts.map +1 -1
  187. package/dist/tools/read-file.js.map +1 -1
  188. package/dist/tools/read-many-files.d.ts.map +1 -1
  189. package/dist/tools/read-many-files.js.map +1 -1
  190. package/dist/tools/replace-lines.d.ts.map +1 -1
  191. package/dist/tools/replace-lines.js.map +1 -1
  192. package/dist/tools/search-files.d.ts.map +1 -1
  193. package/dist/tools/search-files.js.map +1 -1
  194. package/dist/tools/tool-manager.d.ts.map +1 -1
  195. package/dist/tools/tool-manager.js +1 -1
  196. package/dist/tools/tool-manager.js.map +1 -1
  197. package/dist/tools/web-search.d.ts.map +1 -1
  198. package/dist/tools/web-search.js.map +1 -1
  199. package/dist/types/app.d.ts.map +1 -1
  200. package/dist/types/commands.d.ts +1 -1
  201. package/dist/types/commands.d.ts.map +1 -1
  202. package/dist/types/components.d.ts +2 -4
  203. package/dist/types/components.d.ts.map +1 -1
  204. package/dist/types/config.d.ts +1 -1
  205. package/dist/types/config.d.ts.map +1 -1
  206. package/dist/types/hooks.d.ts +29 -0
  207. package/dist/types/hooks.d.ts.map +1 -1
  208. package/dist/types/hooks.js +10 -1
  209. package/dist/types/hooks.js.map +1 -1
  210. package/dist/types/index.d.ts +11 -11
  211. package/dist/types/index.d.ts.map +1 -1
  212. package/dist/types/index.js +11 -11
  213. package/dist/types/index.js.map +1 -1
  214. package/dist/utils/atomic-deletion.d.ts +17 -0
  215. package/dist/utils/atomic-deletion.d.ts.map +1 -0
  216. package/dist/utils/atomic-deletion.js +89 -0
  217. package/dist/utils/atomic-deletion.js.map +1 -0
  218. package/dist/utils/atomic-deletion.spec.d.ts +2 -0
  219. package/dist/utils/atomic-deletion.spec.d.ts.map +1 -0
  220. package/dist/utils/atomic-deletion.spec.js +153 -0
  221. package/dist/utils/atomic-deletion.spec.js.map +1 -0
  222. package/dist/utils/message-queue.d.ts.map +1 -1
  223. package/dist/utils/message-queue.js.map +1 -1
  224. package/dist/utils/paste-detection.d.ts +36 -0
  225. package/dist/utils/paste-detection.d.ts.map +1 -0
  226. package/dist/utils/paste-detection.js +83 -0
  227. package/dist/utils/paste-detection.js.map +1 -0
  228. package/dist/utils/paste-utils.d.ts +3 -0
  229. package/dist/utils/paste-utils.d.ts.map +1 -0
  230. package/dist/utils/paste-utils.js +33 -0
  231. package/dist/utils/paste-utils.js.map +1 -0
  232. package/dist/utils/prompt-assembly.spec.d.ts +2 -0
  233. package/dist/utils/prompt-assembly.spec.d.ts.map +1 -0
  234. package/dist/utils/prompt-assembly.spec.js +80 -0
  235. package/dist/utils/prompt-assembly.spec.js.map +1 -0
  236. package/dist/utils/prompt-processor.d.ts +12 -1
  237. package/dist/utils/prompt-processor.d.ts.map +1 -1
  238. package/dist/utils/prompt-processor.js +117 -1
  239. package/dist/utils/prompt-processor.js.map +1 -1
  240. package/dist/utils/update-checker.d.ts.map +1 -1
  241. package/dist/utils/update-checker.js +1 -1
  242. package/dist/utils/update-checker.js.map +1 -1
  243. package/package.json +14 -8
  244. package/source/app/prompts/main-prompt.md +515 -37
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Detect if a text change represents a deletion that should be atomic
3
+ * Returns the modified InputState if atomic deletion occurred, null otherwise
4
+ */
5
+ export function handleAtomicDeletion(previousState, newText) {
6
+ const previousText = previousState.displayValue;
7
+ // Only handle deletions (text getting shorter)
8
+ if (newText.length >= previousText.length) {
9
+ return null;
10
+ }
11
+ // Find what was deleted
12
+ const deletedChars = previousText.length - newText.length;
13
+ // Find where the deletion occurred
14
+ let deletionStart = -1;
15
+ for (let i = 0; i < Math.min(previousText.length, newText.length); i++) {
16
+ if (previousText[i] !== newText[i]) {
17
+ deletionStart = i;
18
+ break;
19
+ }
20
+ }
21
+ // If no difference found in common part, deletion was at the end
22
+ if (deletionStart === -1) {
23
+ deletionStart = newText.length;
24
+ }
25
+ // Check if any placeholder was affected by this deletion
26
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
27
+ let match;
28
+ while ((match = placeholderRegex.exec(previousText)) !== null) {
29
+ const placeholderStart = match.index;
30
+ const placeholderEnd = placeholderStart + match[0].length;
31
+ const placeholderId = match[1];
32
+ // Check if deletion overlaps with this placeholder
33
+ const deletionEnd = deletionStart + deletedChars;
34
+ if ((deletionStart >= placeholderStart && deletionStart < placeholderEnd) ||
35
+ (deletionEnd > placeholderStart && deletionEnd <= placeholderEnd) ||
36
+ (deletionStart <= placeholderStart && deletionEnd >= placeholderEnd)) {
37
+ // Deletion affects this placeholder - remove it atomically
38
+ const newDisplayValue = previousText.replace(match[0], '');
39
+ const newPlaceholderContent = { ...previousState.placeholderContent };
40
+ delete newPlaceholderContent[placeholderId];
41
+ return {
42
+ displayValue: newDisplayValue,
43
+ placeholderContent: newPlaceholderContent,
44
+ };
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * Find placeholder at cursor position
51
+ * Returns placeholder ID if cursor is within a placeholder, null otherwise
52
+ */
53
+ export function findPlaceholderAtPosition(text, position) {
54
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
55
+ let match;
56
+ while ((match = placeholderRegex.exec(text)) !== null) {
57
+ const placeholderStart = match.index;
58
+ const placeholderEnd = placeholderStart + match[0].length;
59
+ if (position >= placeholderStart && position <= placeholderEnd) {
60
+ return match[1]; // Return the placeholder ID
61
+ }
62
+ }
63
+ return null;
64
+ }
65
+ /**
66
+ * Check if a deletion would partially affect a placeholder
67
+ * Used to prevent partial placeholder deletions
68
+ */
69
+ export function wouldPartiallyDeletePlaceholder(text, deletionStart, deletionLength) {
70
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
71
+ let match;
72
+ while ((match = placeholderRegex.exec(text)) !== null) {
73
+ const placeholderStart = match.index;
74
+ const placeholderEnd = placeholderStart + match[0].length;
75
+ const deletionEnd = deletionStart + deletionLength;
76
+ // Check for overlap
77
+ const overlapsStart = deletionStart >= placeholderStart && deletionStart < placeholderEnd;
78
+ const overlapsEnd = deletionEnd > placeholderStart && deletionEnd <= placeholderEnd;
79
+ const spansPast = deletionStart < placeholderStart && deletionEnd > placeholderStart;
80
+ const spansOver = deletionStart < placeholderEnd && deletionEnd > placeholderEnd;
81
+ const hasOverlap = overlapsStart || overlapsEnd || spansPast || spansOver;
82
+ const completeOverlap = deletionStart <= placeholderStart && deletionEnd >= placeholderEnd;
83
+ if (hasOverlap && !completeOverlap) {
84
+ return true;
85
+ }
86
+ }
87
+ return false;
88
+ }
89
+ //# sourceMappingURL=atomic-deletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-deletion.js","sourceRoot":"","sources":["../../source/utils/atomic-deletion.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CACnC,aAAyB,EACzB,OAAe;IAEf,MAAM,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAEhD,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE1D,mCAAmC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxE,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,aAAa,GAAG,CAAC,CAAC;YAClB,MAAM;QACP,CAAC;IACF,CAAC;IAED,iEAAiE;IACjE,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,yDAAyD;IACzD,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;IACxD,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/D,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/B,mDAAmD;QACnD,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;QAEjD,IACC,CAAC,aAAa,IAAI,gBAAgB,IAAI,aAAa,GAAG,cAAc,CAAC;YACrE,CAAC,WAAW,GAAG,gBAAgB,IAAI,WAAW,IAAI,cAAc,CAAC;YACjE,CAAC,aAAa,IAAI,gBAAgB,IAAI,WAAW,IAAI,cAAc,CAAC,EACnE,CAAC;YACF,2DAA2D;YAC3D,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,MAAM,qBAAqB,GAAG,EAAC,GAAG,aAAa,CAAC,kBAAkB,EAAC,CAAC;YACpE,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;YAE5C,OAAO;gBACN,YAAY,EAAE,eAAe;gBAC7B,kBAAkB,EAAE,qBAAqB;aACzC,CAAC;QACH,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACxC,IAAY,EACZ,QAAgB;IAEhB,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;IACxD,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAE1D,IAAI,QAAQ,IAAI,gBAAgB,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;YAChE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B;QAC9C,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC9C,IAAY,EACZ,aAAqB,EACrB,cAAsB;IAEtB,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;IACxD,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,MAAM,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;QAEnD,oBAAoB;QACpB,MAAM,aAAa,GAClB,aAAa,IAAI,gBAAgB,IAAI,aAAa,GAAG,cAAc,CAAC;QACrE,MAAM,WAAW,GAChB,WAAW,GAAG,gBAAgB,IAAI,WAAW,IAAI,cAAc,CAAC;QACjE,MAAM,SAAS,GACd,aAAa,GAAG,gBAAgB,IAAI,WAAW,GAAG,gBAAgB,CAAC;QACpE,MAAM,SAAS,GACd,aAAa,GAAG,cAAc,IAAI,WAAW,GAAG,cAAc,CAAC;QAEhE,MAAM,UAAU,GAAG,aAAa,IAAI,WAAW,IAAI,SAAS,IAAI,SAAS,CAAC;QAC1E,MAAM,eAAe,GACpB,aAAa,IAAI,gBAAgB,IAAI,WAAW,IAAI,cAAc,CAAC;QAEpE,IAAI,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=atomic-deletion.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-deletion.spec.d.ts","sourceRoot":"","sources":["../../source/utils/atomic-deletion.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ import test from 'ava';
2
+ import { handleAtomicDeletion, findPlaceholderAtPosition, wouldPartiallyDeletePlaceholder, } from './atomic-deletion.js';
3
+ import { PlaceholderType } from '../types/hooks.js';
4
+ // Tests for atomic placeholder deletion
5
+ test('handleAtomicDeletion removes placeholder when backspaced', t => {
6
+ const previousState = {
7
+ displayValue: 'Analyze this: [Paste #123: 500 chars] code',
8
+ placeholderContent: {
9
+ '123': {
10
+ type: PlaceholderType.PASTE,
11
+ displayText: '[Paste #123: 500 chars]',
12
+ content: 'console.log("hello world");',
13
+ originalSize: 500,
14
+ },
15
+ },
16
+ };
17
+ // Simulate backspacing from the end of the placeholder
18
+ const newText = 'Analyze this: [Paste #123: 500 char code';
19
+ const result = handleAtomicDeletion(previousState, newText);
20
+ t.truthy(result);
21
+ t.is(result.displayValue, 'Analyze this: code');
22
+ t.deepEqual(result.placeholderContent, {});
23
+ });
24
+ test('handleAtomicDeletion removes placeholder when deleted from middle', t => {
25
+ const previousState = {
26
+ displayValue: 'Before [Paste #456: 200 chars] after',
27
+ placeholderContent: {
28
+ '456': {
29
+ type: PlaceholderType.PASTE,
30
+ displayText: '[Paste #456: 200 chars]',
31
+ content: 'function test() { return true; }',
32
+ originalSize: 200,
33
+ },
34
+ },
35
+ };
36
+ // Simulate deleting part of the placeholder
37
+ const newText = 'Before [Paste #456: 200 ch after';
38
+ const result = handleAtomicDeletion(previousState, newText);
39
+ t.truthy(result);
40
+ t.is(result.displayValue, 'Before after');
41
+ t.deepEqual(result.placeholderContent, {});
42
+ });
43
+ test('handleAtomicDeletion preserves other placeholders', t => {
44
+ const previousState = {
45
+ displayValue: 'First [Paste #111: 100 chars] second [Paste #222: 200 chars]',
46
+ placeholderContent: {
47
+ '111': {
48
+ type: PlaceholderType.PASTE,
49
+ displayText: '[Paste #111: 100 chars]',
50
+ content: 'first content',
51
+ originalSize: 100,
52
+ },
53
+ '222': {
54
+ type: PlaceholderType.PASTE,
55
+ displayText: '[Paste #222: 200 chars]',
56
+ content: 'second content',
57
+ originalSize: 200,
58
+ },
59
+ },
60
+ };
61
+ // Delete part of first placeholder
62
+ const newText = 'First [Paste #111: 100 ch second [Paste #222: 200 chars]';
63
+ const result = handleAtomicDeletion(previousState, newText);
64
+ t.truthy(result);
65
+ t.is(result.displayValue, 'First second [Paste #222: 200 chars]');
66
+ t.deepEqual(result.placeholderContent, {
67
+ '222': {
68
+ type: PlaceholderType.PASTE,
69
+ displayText: '[Paste #222: 200 chars]',
70
+ content: 'second content',
71
+ originalSize: 200,
72
+ },
73
+ });
74
+ });
75
+ test('handleAtomicDeletion returns null for normal deletions', t => {
76
+ const previousState = {
77
+ displayValue: 'Normal text here',
78
+ placeholderContent: {},
79
+ };
80
+ const newText = 'Normal text her';
81
+ const result = handleAtomicDeletion(previousState, newText);
82
+ t.is(result, null);
83
+ });
84
+ test('handleAtomicDeletion returns null for additions', t => {
85
+ const previousState = {
86
+ displayValue: 'Short text',
87
+ placeholderContent: {},
88
+ };
89
+ const newText = 'Short text with more';
90
+ const result = handleAtomicDeletion(previousState, newText);
91
+ t.is(result, null);
92
+ });
93
+ test('findPlaceholderAtPosition finds placeholder ID', t => {
94
+ const text = 'Before [Paste #789: 300 chars] after';
95
+ // Position inside the placeholder
96
+ const result1 = findPlaceholderAtPosition(text, 10); // Inside "[Paste #789: 300 chars]"
97
+ t.is(result1, '789');
98
+ // Position outside the placeholder
99
+ const result2 = findPlaceholderAtPosition(text, 0); // In "Before"
100
+ t.is(result2, null);
101
+ // Position after placeholder
102
+ const result3 = findPlaceholderAtPosition(text, 35); // In "after"
103
+ t.is(result3, null);
104
+ });
105
+ test('wouldPartiallyDeletePlaceholder detects partial deletion', t => {
106
+ const text = 'Text [Paste #123: 100 chars] more';
107
+ // 01234567890123456789012345678901234
108
+ // 0 1 2 3
109
+ // Placeholder is at position 5-28 (length 23)
110
+ // Partial deletion from middle of placeholder
111
+ const result1 = wouldPartiallyDeletePlaceholder(text, 8, 5); // Delete "Paste"
112
+ t.true(result1);
113
+ // Complete deletion of placeholder - delete from position 5, length 23
114
+ const result2 = wouldPartiallyDeletePlaceholder(text, 5, 23); // Delete entire "[Paste #123: 100 chars]"
115
+ t.false(result2);
116
+ // Deletion outside placeholder
117
+ const result3 = wouldPartiallyDeletePlaceholder(text, 0, 4); // Delete "Text"
118
+ t.false(result3);
119
+ });
120
+ // Integration test showing complete flow
121
+ test('atomic deletion works with multiple placeholders', t => {
122
+ const previousState = {
123
+ displayValue: 'Compare [Paste #111: 50 chars] with [Paste #222: 100 chars] output',
124
+ placeholderContent: {
125
+ '111': {
126
+ type: PlaceholderType.PASTE,
127
+ displayText: '[Paste #111: 50 chars]',
128
+ content: 'first code block',
129
+ originalSize: 50,
130
+ },
131
+ '222': {
132
+ type: PlaceholderType.PASTE,
133
+ displayText: '[Paste #222: 100 chars]',
134
+ content: 'second code block with more content',
135
+ originalSize: 100,
136
+ },
137
+ },
138
+ };
139
+ // Delete part of second placeholder
140
+ const newText = 'Compare [Paste #111: 50 chars] with [Paste #222: 100 ch output';
141
+ const result = handleAtomicDeletion(previousState, newText);
142
+ t.truthy(result);
143
+ t.is(result.displayValue, 'Compare [Paste #111: 50 chars] with output');
144
+ t.deepEqual(result.placeholderContent, {
145
+ '111': {
146
+ type: PlaceholderType.PASTE,
147
+ displayText: '[Paste #111: 50 chars]',
148
+ content: 'first code block',
149
+ originalSize: 50,
150
+ },
151
+ });
152
+ });
153
+ //# sourceMappingURL=atomic-deletion.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atomic-deletion.spec.js","sourceRoot":"","sources":["../../source/utils/atomic-deletion.spec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../source/utils/message-queue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAC,WAAW,EAAmB,MAAM,mBAAmB,CAAC;AAOrE,wBAAgB,qBAAqB,CACpC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,QAGpD;AASD,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAc,QA6BvB;AAGD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAE/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAEhE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAElE"}
1
+ {"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../source/utils/message-queue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAC,WAAW,EAAmB,MAAM,eAAe,CAAC;AAOjE,wBAAgB,qBAAqB,CACpC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,QAGpD;AASD,wBAAgB,iBAAiB,CAChC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAc,QA6BvB;AAGD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAE/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAEhE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAElE"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-queue.js","sourceRoot":"","sources":["../../source/utils/message-queue.tsx"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAC1D,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAG9D,+DAA+D;AAC/D,IAAI,oBAAoB,GAAkD,IAAI,CAAC;AAC/E,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAE5B,qCAAqC;AACrC,MAAM,UAAU,qBAAqB,CACpC,cAAoD;IAEpD,oBAAoB,GAAG,cAAc,CAAC;AACvC,CAAC;AAED,0CAA0C;AAC1C,SAAS,UAAU;IAClB,mBAAmB,EAAE,CAAC;IACtB,OAAO,cAAc,mBAAmB,EAAE,CAAC;AAC5C,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,iBAAiB,CAChC,IAAiB,EACjB,OAAe,EACf,UAAmB,IAAI;IAEvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3B,6CAA6C;QAC7C,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,SAA0B,CAAC;IAE/B,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,OAAO;YACX,SAAS,GAAG,CACX,KAAC,YAAY,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAC9D,CAAC;YACF,MAAM;QACP,KAAK,SAAS;YACb,SAAS,GAAG,CACX,KAAC,cAAc,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAChE,CAAC;YACF,MAAM;QACP,KAAK,MAAM,CAAC;QACZ;YACC,SAAS,GAAG,KAAC,WAAW,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAAC;YAC1E,MAAM;IACR,CAAC;IAED,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,UAAmB,IAAI;IAC/D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,UAAmB,IAAI;IAChE,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,UAAmB,IAAI;IAClE,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"message-queue.js","sourceRoot":"","sources":["../../source/utils/message-queue.tsx"],"names":[],"mappings":";AACA,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAG1D,+DAA+D;AAC/D,IAAI,oBAAoB,GAAkD,IAAI,CAAC;AAC/E,IAAI,mBAAmB,GAAG,CAAC,CAAC;AAE5B,qCAAqC;AACrC,MAAM,UAAU,qBAAqB,CACpC,cAAoD;IAEpD,oBAAoB,GAAG,cAAc,CAAC;AACvC,CAAC;AAED,0CAA0C;AAC1C,SAAS,UAAU;IAClB,mBAAmB,EAAE,CAAC;IACtB,OAAO,cAAc,mBAAmB,EAAE,CAAC;AAC5C,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,iBAAiB,CAChC,IAAiB,EACjB,OAAe,EACf,UAAmB,IAAI;IAEvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3B,6CAA6C;QAC7C,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,IAAI,SAA0B,CAAC;IAE/B,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,OAAO;YACX,SAAS,GAAG,CACX,KAAC,YAAY,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAC9D,CAAC;YACF,MAAM;QACP,KAAK,SAAS;YACb,SAAS,GAAG,CACX,KAAC,cAAc,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAChE,CAAC;YACF,MAAM;QACP,KAAK,MAAM,CAAC;QACZ;YACC,SAAS,GAAG,KAAC,WAAW,IAAW,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAvC,GAAG,CAAwC,CAAC;YAC1E,MAAM;IACR,CAAC;IAED,oBAAoB,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,UAAmB,IAAI;IAC/D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,UAAmB,IAAI;IAChE,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,UAAmB,IAAI;IAClE,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,36 @@
1
+ export interface PasteDetectionOptions {
2
+ timeThreshold: number;
3
+ charThreshold: number;
4
+ lineThreshold: number;
5
+ }
6
+ export declare const DEFAULT_PASTE_OPTIONS: PasteDetectionOptions;
7
+ export declare class PasteDetector {
8
+ private lastInputTime;
9
+ private lastInputLength;
10
+ /**
11
+ * Detect if a text change is likely a paste operation
12
+ * @param newText The new text content
13
+ * @param options Detection thresholds
14
+ * @returns Object with detection result and details
15
+ */
16
+ detectPaste(newText: string, options?: PasteDetectionOptions): {
17
+ isPaste: boolean;
18
+ method: 'rate' | 'size' | 'lines' | 'none';
19
+ addedText: string;
20
+ details: {
21
+ timeElapsed: number;
22
+ charsAdded: number;
23
+ linesAdded: number;
24
+ };
25
+ };
26
+ /**
27
+ * Reset the detector state (call when input is cleared or submitted)
28
+ */
29
+ reset(): void;
30
+ /**
31
+ * Update detector state without triggering detection
32
+ * Useful for manual input changes that shouldn't be considered pastes
33
+ */
34
+ updateState(text: string): void;
35
+ }
36
+ //# sourceMappingURL=paste-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-detection.d.ts","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IAErC,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,EAAE,qBAInC,CAAC;AAEF,qBAAa,aAAa;IACzB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAK;IAE5B;;;;;OAKG;IACH,WAAW,CACV,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,qBAA6C,GACpD;QACF,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;QAC3C,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE;YACR,WAAW,EAAE,MAAM,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC;SACnB,CAAC;KACF;IA4DD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAI/B"}
@@ -0,0 +1,83 @@
1
+ // CLI Paste Detection Utilities
2
+ // Since CLI applications don't receive direct paste events, we use heuristics
3
+ export const DEFAULT_PASTE_OPTIONS = {
4
+ timeThreshold: 16, // ~1 frame at 60fps
5
+ charThreshold: 50, // Characters added in single change
6
+ lineThreshold: 2, // Multiple lines added instantly
7
+ };
8
+ export class PasteDetector {
9
+ lastInputTime = 0;
10
+ lastInputLength = 0;
11
+ /**
12
+ * Detect if a text change is likely a paste operation
13
+ * @param newText The new text content
14
+ * @param options Detection thresholds
15
+ * @returns Object with detection result and details
16
+ */
17
+ detectPaste(newText, options = DEFAULT_PASTE_OPTIONS) {
18
+ const currentTime = Date.now();
19
+ const timeElapsed = currentTime - this.lastInputTime;
20
+ const charsAdded = newText.length - this.lastInputLength;
21
+ const linesAdded = newText.split('\n').length - 1;
22
+ // Get the added text (assuming it's at the end)
23
+ const addedText = newText.slice(this.lastInputLength);
24
+ // Update tracking
25
+ this.lastInputTime = currentTime;
26
+ this.lastInputLength = newText.length;
27
+ const details = {
28
+ timeElapsed,
29
+ charsAdded,
30
+ linesAdded,
31
+ };
32
+ // Method 1: Rate-based detection (fast input)
33
+ if (timeElapsed < options.timeThreshold &&
34
+ charsAdded > options.charThreshold) {
35
+ return {
36
+ isPaste: true,
37
+ method: 'rate',
38
+ addedText,
39
+ details,
40
+ };
41
+ }
42
+ // Method 2: Size-based detection (large single input)
43
+ if (charsAdded > options.charThreshold * 2) {
44
+ return {
45
+ isPaste: true,
46
+ method: 'size',
47
+ addedText,
48
+ details,
49
+ };
50
+ }
51
+ // Method 3: Multi-line detection
52
+ if (linesAdded >= options.lineThreshold) {
53
+ return {
54
+ isPaste: true,
55
+ method: 'lines',
56
+ addedText,
57
+ details,
58
+ };
59
+ }
60
+ return {
61
+ isPaste: false,
62
+ method: 'none',
63
+ addedText,
64
+ details,
65
+ };
66
+ }
67
+ /**
68
+ * Reset the detector state (call when input is cleared or submitted)
69
+ */
70
+ reset() {
71
+ this.lastInputTime = 0;
72
+ this.lastInputLength = 0;
73
+ }
74
+ /**
75
+ * Update detector state without triggering detection
76
+ * Useful for manual input changes that shouldn't be considered pastes
77
+ */
78
+ updateState(text) {
79
+ this.lastInputTime = Date.now();
80
+ this.lastInputLength = text.length;
81
+ }
82
+ }
83
+ //# sourceMappingURL=paste-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-detection.js","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8EAA8E;AAW9E,MAAM,CAAC,MAAM,qBAAqB,GAA0B;IAC3D,aAAa,EAAE,EAAE,EAAE,oBAAoB;IACvC,aAAa,EAAE,EAAE,EAAE,oCAAoC;IACvD,aAAa,EAAE,CAAC,EAAE,iCAAiC;CACnD,CAAC;AAEF,MAAM,OAAO,aAAa;IACjB,aAAa,GAAG,CAAC,CAAC;IAClB,eAAe,GAAG,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,WAAW,CACV,OAAe,EACf,UAAiC,qBAAqB;QAWtD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACzD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAElD,gDAAgD;QAChD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAEtD,kBAAkB;QAClB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;QAEtC,MAAM,OAAO,GAAG;YACf,WAAW;YACX,UAAU;YACV,UAAU;SACV,CAAC;QAEF,8CAA8C;QAC9C,IACC,WAAW,GAAG,OAAO,CAAC,aAAa;YACnC,UAAU,GAAG,OAAO,CAAC,aAAa,EACjC,CAAC;YACF,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,SAAS;gBACT,OAAO;aACP,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,IAAI,UAAU,GAAG,OAAO,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAC5C,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;gBACd,SAAS;gBACT,OAAO;aACP,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAI,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,OAAO;gBACf,SAAS;gBACT,OAAO;aACP,CAAC;QACH,CAAC;QAED,OAAO;YACN,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,SAAS;YACT,OAAO;SACP,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,IAAY;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,CAAC;CACD"}
@@ -0,0 +1,3 @@
1
+ import { InputState, PlaceholderContent } from '../types/hooks.js';
2
+ export declare function handlePaste(pastedText: string, currentDisplayValue: string, currentPlaceholderContent: Record<string, PlaceholderContent>, detectionMethod?: 'rate' | 'size' | 'multiline'): InputState | null;
3
+ //# sourceMappingURL=paste-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-utils.d.ts","sourceRoot":"","sources":["../../source/utils/paste-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,UAAU,EAEV,kBAAkB,EAElB,MAAM,mBAAmB,CAAC;AAE3B,wBAAgB,WAAW,CAC1B,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,MAAM,EAC3B,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC7D,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAC7C,UAAU,GAAG,IAAI,CAqCnB"}
@@ -0,0 +1,33 @@
1
+ import { PlaceholderType, } from '../types/hooks.js';
2
+ export function handlePaste(pastedText, currentDisplayValue, currentPlaceholderContent, detectionMethod) {
3
+ const THRESHOLD = 80; // characters
4
+ if (pastedText.length < THRESHOLD) {
5
+ return null;
6
+ }
7
+ // Generate simple incrementing ID based on existing paste placeholders
8
+ const existingPasteCount = Object.values(currentPlaceholderContent).filter(content => content.type === PlaceholderType.PASTE).length;
9
+ const pasteId = (existingPasteCount + 1).toString();
10
+ const placeholder = `[Paste #${pasteId}: ${pastedText.length} chars]`;
11
+ const pasteContent = {
12
+ type: PlaceholderType.PASTE,
13
+ displayText: placeholder,
14
+ content: pastedText,
15
+ originalSize: pastedText.length,
16
+ detectionMethod,
17
+ timestamp: Date.now(),
18
+ };
19
+ const newPlaceholderContent = {
20
+ ...currentPlaceholderContent,
21
+ [pasteId]: pasteContent,
22
+ };
23
+ // For CLI paste detection, we need to replace the pasted text in the display value
24
+ // If the pasted text is at the end, replace it. Otherwise append the placeholder.
25
+ const newDisplayValue = currentDisplayValue.includes(pastedText)
26
+ ? currentDisplayValue.replace(pastedText, placeholder)
27
+ : currentDisplayValue + placeholder;
28
+ return {
29
+ displayValue: newDisplayValue,
30
+ placeholderContent: newPlaceholderContent,
31
+ };
32
+ }
33
+ //# sourceMappingURL=paste-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-utils.js","sourceRoot":"","sources":["../../source/utils/paste-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,eAAe,GACf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,WAAW,CAC1B,UAAkB,EAClB,mBAA2B,EAC3B,yBAA6D,EAC7D,eAA+C;IAE/C,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC,aAAa;IACnC,IAAI,UAAU,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,MAAM,CACzE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,eAAe,CAAC,KAAK,CACjD,CAAC,MAAM,CAAC;IACT,MAAM,OAAO,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,WAAW,OAAO,KAAK,UAAU,CAAC,MAAM,SAAS,CAAC;IAEtE,MAAM,YAAY,GAA4B;QAC7C,IAAI,EAAE,eAAe,CAAC,KAAK;QAC3B,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,UAAU,CAAC,MAAM;QAC/B,eAAe;QACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IAEF,MAAM,qBAAqB,GAAG;QAC7B,GAAG,yBAAyB;QAC5B,CAAC,OAAO,CAAC,EAAE,YAAY;KACvB,CAAC;IAEF,mFAAmF;IACnF,kFAAkF;IAClF,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/D,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC;QACtD,CAAC,CAAC,mBAAmB,GAAG,WAAW,CAAC;IAErC,OAAO;QACN,YAAY,EAAE,eAAe;QAC7B,kBAAkB,EAAE,qBAAqB;KACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompt-assembly.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-assembly.spec.d.ts","sourceRoot":"","sources":["../../source/utils/prompt-assembly.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import test from 'ava';
2
+ import { PlaceholderType } from '../types/hooks.js';
3
+ // Minimal implementation for testing - avoids complex dependencies
4
+ function assemblePrompt(inputState) {
5
+ let assembledPrompt = inputState.displayValue;
6
+ // Replace each placeholder with its full content
7
+ Object.entries(inputState.placeholderContent).forEach(([pasteId, placeholder]) => {
8
+ if (placeholder.type === 'paste') {
9
+ const placeholderPattern = `\\[Paste #${pasteId}: \\d+ chars\\]`;
10
+ const regex = new RegExp(placeholderPattern, 'g');
11
+ assembledPrompt = assembledPrompt.replace(regex, placeholder.content);
12
+ }
13
+ });
14
+ return assembledPrompt;
15
+ }
16
+ function extractPlaceholderIds(displayValue) {
17
+ const placeholderRegex = /\[Paste #(\d+): \d+ chars\]/g;
18
+ const matches = [];
19
+ let match;
20
+ while ((match = placeholderRegex.exec(displayValue)) !== null) {
21
+ matches.push(match[1]); // The captured paste ID
22
+ }
23
+ return matches;
24
+ }
25
+ // Tests for prompt assembly
26
+ test('assemblePrompt replaces single placeholder with content', t => {
27
+ const inputState = {
28
+ displayValue: 'Analyze this: [Paste #1640995200: 100 chars]',
29
+ placeholderContent: {
30
+ '1640995200': {
31
+ type: PlaceholderType.PASTE,
32
+ displayText: '[Paste #1640995200: 100 chars]',
33
+ content: 'function test() { return "hello world"; }',
34
+ originalSize: 100,
35
+ },
36
+ },
37
+ };
38
+ const result = assemblePrompt(inputState);
39
+ t.is(result, 'Analyze this: function test() { return "hello world"; }');
40
+ });
41
+ test('assemblePrompt handles multiple placeholders', t => {
42
+ const inputState = {
43
+ displayValue: 'Compare [Paste #123: 50 chars] with [Paste #456: 30 chars]',
44
+ placeholderContent: {
45
+ '123': {
46
+ type: PlaceholderType.PASTE,
47
+ displayText: '[Paste #123: 50 chars]',
48
+ content: 'first code snippet',
49
+ originalSize: 50,
50
+ },
51
+ '456': {
52
+ type: PlaceholderType.PASTE,
53
+ displayText: '[Paste #456: 30 chars]',
54
+ content: 'second code snippet',
55
+ originalSize: 30,
56
+ },
57
+ },
58
+ };
59
+ const result = assemblePrompt(inputState);
60
+ t.is(result, 'Compare first code snippet with second code snippet');
61
+ });
62
+ test('assemblePrompt handles no placeholders', t => {
63
+ const inputState = {
64
+ displayValue: 'Regular text without placeholders',
65
+ placeholderContent: {},
66
+ };
67
+ const result = assemblePrompt(inputState);
68
+ t.is(result, 'Regular text without placeholders');
69
+ });
70
+ test('extractPlaceholderIds finds all placeholder IDs', t => {
71
+ const displayValue = 'Text [Paste #123: 100 chars] more text [Paste #456: 200 chars]';
72
+ const result = extractPlaceholderIds(displayValue);
73
+ t.deepEqual(result, ['123', '456']);
74
+ });
75
+ test('extractPlaceholderIds returns empty for no placeholders', t => {
76
+ const displayValue = 'Regular text without placeholders';
77
+ const result = extractPlaceholderIds(displayValue);
78
+ t.deepEqual(result, []);
79
+ });
80
+ //# sourceMappingURL=prompt-assembly.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-assembly.spec.js","sourceRoot":"","sources":["../../source/utils/prompt-assembly.spec.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,17 @@
1
1
  import type { Tool } from '../types/index.js';
2
+ import type { InputState } from '../types/hooks.js';
2
3
  /**
3
- * Process the main prompt template by injecting dynamic tool documentation
4
+ * Process the main prompt template by injecting dynamic tool documentation and system info
4
5
  */
5
6
  export declare function processPromptTemplate(tools: Tool[]): string;
7
+ /**
8
+ * Assemble the final prompt by replacing all placeholders with their full content
9
+ * This function is called before sending the prompt to the AI
10
+ */
11
+ export declare function assemblePrompt(inputState: InputState): string;
12
+ /**
13
+ * Extract all placeholder IDs from a display value
14
+ * Useful for atomic deletion and validation
15
+ */
16
+ export declare function extractPlaceholderIds(displayValue: string): string[];
6
17
  //# sourceMappingURL=prompt-processor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-processor.d.ts","sourceRoot":"","sources":["../../source/utils/prompt-processor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAE5C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA2B3D"}
1
+ {"version":3,"file":"prompt-processor.d.ts","sourceRoot":"","sources":["../../source/utils/prompt-processor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAqElD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CA8B3D;AAgGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CA8C7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAUpE"}