@nanocollective/nanocoder 1.16.3 → 1.16.5

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 (126) hide show
  1. package/README.md +17 -1
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +4 -29
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/update.d.ts +6 -0
  6. package/dist/commands/update.d.ts.map +1 -1
  7. package/dist/commands/update.js +104 -10
  8. package/dist/commands/update.js.map +1 -1
  9. package/dist/components/status.d.ts +1 -6
  10. package/dist/components/status.d.ts.map +1 -1
  11. package/dist/components/status.js +3 -2
  12. package/dist/components/status.js.map +1 -1
  13. package/dist/components/tool-confirmation.d.ts.map +1 -1
  14. package/dist/components/tool-confirmation.js +5 -19
  15. package/dist/components/tool-confirmation.js.map +1 -1
  16. package/dist/components/user-input.d.ts.map +1 -1
  17. package/dist/components/user-input.js +61 -19
  18. package/dist/components/user-input.js.map +1 -1
  19. package/dist/components/warning-message.d.ts +7 -0
  20. package/dist/components/warning-message.d.ts.map +1 -0
  21. package/dist/components/warning-message.js +12 -0
  22. package/dist/components/warning-message.js.map +1 -0
  23. package/dist/config/index.js +6 -6
  24. package/dist/config/index.js.map +1 -1
  25. package/dist/config/paths.d.ts +1 -0
  26. package/dist/config/paths.d.ts.map +1 -1
  27. package/dist/config/paths.js +28 -3
  28. package/dist/config/paths.js.map +1 -1
  29. package/dist/config/paths.spec.d.ts +2 -0
  30. package/dist/config/paths.spec.d.ts.map +1 -0
  31. package/dist/config/paths.spec.js +114 -0
  32. package/dist/config/paths.spec.js.map +1 -0
  33. package/dist/config/themes.d.ts.map +1 -1
  34. package/dist/config/themes.js +19 -0
  35. package/dist/config/themes.js.map +1 -1
  36. package/dist/hooks/useChatHandler.d.ts.map +1 -1
  37. package/dist/hooks/useChatHandler.js +10 -71
  38. package/dist/hooks/useChatHandler.js.map +1 -1
  39. package/dist/hooks/useDirectoryTrust.d.ts.map +1 -1
  40. package/dist/hooks/useDirectoryTrust.js +4 -4
  41. package/dist/hooks/useDirectoryTrust.js.map +1 -1
  42. package/dist/hooks/useInputState.d.ts.map +1 -1
  43. package/dist/hooks/useInputState.js +95 -8
  44. package/dist/hooks/useInputState.js.map +1 -1
  45. package/dist/hooks/useToolHandler.d.ts +0 -1
  46. package/dist/hooks/useToolHandler.d.ts.map +1 -1
  47. package/dist/hooks/useToolHandler.js +9 -75
  48. package/dist/hooks/useToolHandler.js.map +1 -1
  49. package/dist/message-handler.d.ts.map +1 -1
  50. package/dist/message-handler.js +6 -11
  51. package/dist/message-handler.js.map +1 -1
  52. package/dist/models/models-dev-client.spec.js +1 -0
  53. package/dist/models/models-dev-client.spec.js.map +1 -1
  54. package/dist/tools/execute-bash.d.ts.map +1 -1
  55. package/dist/tools/execute-bash.js +5 -3
  56. package/dist/tools/execute-bash.js.map +1 -1
  57. package/dist/types/ui.d.ts +1 -1
  58. package/dist/types/ui.d.ts.map +1 -1
  59. package/dist/types/utils.d.ts +2 -1
  60. package/dist/types/utils.d.ts.map +1 -1
  61. package/dist/usage/storage.d.ts +1 -1
  62. package/dist/usage/storage.d.ts.map +1 -1
  63. package/dist/usage/storage.js +55 -9
  64. package/dist/usage/storage.js.map +1 -1
  65. package/dist/usage/storage.spec.js +136 -2
  66. package/dist/usage/storage.spec.js.map +1 -1
  67. package/dist/utils/error-formatter.d.ts +22 -0
  68. package/dist/utils/error-formatter.d.ts.map +1 -0
  69. package/dist/utils/error-formatter.js +27 -0
  70. package/dist/utils/error-formatter.js.map +1 -0
  71. package/dist/utils/error-formatter.spec.d.ts +2 -0
  72. package/dist/utils/error-formatter.spec.d.ts.map +1 -0
  73. package/dist/utils/error-formatter.spec.js +147 -0
  74. package/dist/utils/error-formatter.spec.js.map +1 -0
  75. package/dist/utils/fuzzy-matching.spec.js +1 -0
  76. package/dist/utils/fuzzy-matching.spec.js.map +1 -1
  77. package/dist/utils/installation-detector.d.ts +16 -0
  78. package/dist/utils/installation-detector.d.ts.map +1 -0
  79. package/dist/utils/installation-detector.js +118 -0
  80. package/dist/utils/installation-detector.js.map +1 -0
  81. package/dist/utils/installation-detector.spec.d.ts +2 -0
  82. package/dist/utils/installation-detector.spec.d.ts.map +1 -0
  83. package/dist/utils/installation-detector.spec.js +141 -0
  84. package/dist/utils/installation-detector.spec.js.map +1 -0
  85. package/dist/utils/message-queue.d.ts +2 -0
  86. package/dist/utils/message-queue.d.ts.map +1 -1
  87. package/dist/utils/message-queue.js +11 -0
  88. package/dist/utils/message-queue.js.map +1 -1
  89. package/dist/utils/paste-detection.d.ts.map +1 -1
  90. package/dist/utils/paste-detection.js +8 -3
  91. package/dist/utils/paste-detection.js.map +1 -1
  92. package/dist/utils/paste-detection.spec.js +15 -8
  93. package/dist/utils/paste-detection.spec.js.map +1 -1
  94. package/dist/utils/paste-utils.d.ts.map +1 -1
  95. package/dist/utils/paste-utils.js +4 -2
  96. package/dist/utils/paste-utils.js.map +1 -1
  97. package/dist/utils/paste-utils.spec.js +19 -3
  98. package/dist/utils/paste-utils.spec.js.map +1 -1
  99. package/dist/utils/tool-args-parser.d.ts +37 -0
  100. package/dist/utils/tool-args-parser.d.ts.map +1 -0
  101. package/dist/utils/tool-args-parser.js +50 -0
  102. package/dist/utils/tool-args-parser.js.map +1 -0
  103. package/dist/utils/tool-args-parser.spec.d.ts +2 -0
  104. package/dist/utils/tool-args-parser.spec.d.ts.map +1 -0
  105. package/dist/utils/tool-args-parser.spec.js +111 -0
  106. package/dist/utils/tool-args-parser.spec.js.map +1 -0
  107. package/dist/utils/tool-cancellation.d.ts +21 -0
  108. package/dist/utils/tool-cancellation.d.ts.map +1 -0
  109. package/dist/utils/tool-cancellation.js +27 -0
  110. package/dist/utils/tool-cancellation.js.map +1 -0
  111. package/dist/utils/tool-cancellation.spec.d.ts +2 -0
  112. package/dist/utils/tool-cancellation.spec.d.ts.map +1 -0
  113. package/dist/utils/tool-cancellation.spec.js +186 -0
  114. package/dist/utils/tool-cancellation.spec.js.map +1 -0
  115. package/dist/utils/tool-result-display.d.ts +15 -0
  116. package/dist/utils/tool-result-display.d.ts.map +1 -0
  117. package/dist/utils/tool-result-display.js +51 -0
  118. package/dist/utils/tool-result-display.js.map +1 -0
  119. package/dist/utils/update-checker.d.ts.map +1 -1
  120. package/dist/utils/update-checker.js +31 -3
  121. package/dist/utils/update-checker.js.map +1 -1
  122. package/dist/utils/update-checker.spec.js +68 -18
  123. package/dist/utils/update-checker.spec.js.map +1 -1
  124. package/dist/wizard/steps/location-step.js +2 -2
  125. package/dist/wizard/steps/location-step.js.map +1 -1
  126. package/package.json +1 -1
@@ -0,0 +1,141 @@
1
+ import test from 'ava';
2
+ import { detectInstallationMethod, detectFromPath, } from './installation-detector.js';
3
+ console.log(`\ninstallation-detector.spec.ts`);
4
+ test.beforeEach(() => {
5
+ // Clean up environment variables before each test
6
+ delete process.env.NANOCODER_INSTALL_METHOD;
7
+ delete process.env.npm_config_prefix;
8
+ delete process.env.npm_config_global;
9
+ delete process.env.PNPM_HOME;
10
+ delete process.env.npm_execpath;
11
+ delete process.env.HOMEBREW_PREFIX;
12
+ delete process.env.HOMEBREW_CELLAR;
13
+ });
14
+ // Environment override tests
15
+ test('detectInstallationMethod: respects env override for npm', t => {
16
+ process.env.NANOCODER_INSTALL_METHOD = 'npm';
17
+ t.is(detectInstallationMethod(), 'npm');
18
+ });
19
+ test('detectInstallationMethod: respects env override for homebrew', t => {
20
+ process.env.NANOCODER_INSTALL_METHOD = 'homebrew';
21
+ t.is(detectInstallationMethod(), 'homebrew');
22
+ });
23
+ test('detectInstallationMethod: respects env override for nix', t => {
24
+ process.env.NANOCODER_INSTALL_METHOD = 'nix';
25
+ t.is(detectInstallationMethod(), 'nix');
26
+ });
27
+ test('detectInstallationMethod: respects env override for unknown', t => {
28
+ process.env.NANOCODER_INSTALL_METHOD = 'unknown';
29
+ t.is(detectInstallationMethod(), 'unknown');
30
+ });
31
+ // Homebrew environment variable detection
32
+ test('detectInstallationMethod: detects homebrew via HOMEBREW_PREFIX', t => {
33
+ process.env.HOMEBREW_PREFIX = '/opt/homebrew';
34
+ t.is(detectInstallationMethod(), 'homebrew');
35
+ });
36
+ test('detectInstallationMethod: detects homebrew via HOMEBREW_CELLAR', t => {
37
+ process.env.HOMEBREW_CELLAR = '/opt/homebrew/Cellar';
38
+ t.is(detectInstallationMethod(), 'homebrew');
39
+ });
40
+ // NPM environment variable detection
41
+ test('detectInstallationMethod: detects npm via npm_config_prefix', t => {
42
+ process.env.npm_config_prefix = '/usr/local';
43
+ t.is(detectInstallationMethod(), 'npm');
44
+ });
45
+ test('detectInstallationMethod: detects npm via npm_config_global', t => {
46
+ process.env.npm_config_global = 'true';
47
+ t.is(detectInstallationMethod(), 'npm');
48
+ });
49
+ test('detectInstallationMethod: detects npm via PNPM_HOME', t => {
50
+ process.env.PNPM_HOME = '/home/user/.local/share/pnpm';
51
+ t.is(detectInstallationMethod(), 'npm');
52
+ });
53
+ test('detectInstallationMethod: detects npm via npm_execpath', t => {
54
+ process.env.npm_execpath = '/usr/local/lib/node_modules/npm/bin/npm-cli.js';
55
+ t.is(detectInstallationMethod(), 'npm');
56
+ });
57
+ // Path Detection Tests
58
+ // These tests verify the detectFromPath function correctly identifies installation methods from paths
59
+ test('detectFromPath: detects nix from /nix/store path', t => {
60
+ const path = '/nix/store/abc123-nanocoder-1.0.0/lib/node_modules/@nanocollective/nanocoder/dist';
61
+ t.is(detectFromPath(path), 'nix');
62
+ });
63
+ test('detectFromPath: detects homebrew from Cellar path (macOS Intel)', t => {
64
+ const path = '/usr/local/Cellar/nanocoder/1.0.0/libexec/lib/node_modules/@nanocollective/nanocoder/dist';
65
+ t.is(detectFromPath(path), 'homebrew');
66
+ });
67
+ test('detectFromPath: detects homebrew from Cellar path (macOS ARM)', t => {
68
+ const path = '/opt/homebrew/Cellar/nanocoder/1.0.0/libexec/lib/node_modules/@nanocollective/nanocoder/dist';
69
+ t.is(detectFromPath(path), 'homebrew');
70
+ });
71
+ test('detectFromPath: detects homebrew from generic homebrew path', t => {
72
+ const path = '/opt/homebrew/lib/node_modules/@nanocollective/nanocoder/dist';
73
+ t.is(detectFromPath(path), 'homebrew');
74
+ });
75
+ test('detectFromPath: detects homebrew from Linux homebrew path', t => {
76
+ const path = '/home/linuxbrew/.linuxbrew/Cellar/nanocoder/1.0.0/lib/node_modules/@nanocollective/nanocoder/dist';
77
+ t.is(detectFromPath(path), 'homebrew');
78
+ });
79
+ test('detectFromPath: detects npm from node_modules path (global)', t => {
80
+ const path = '/usr/local/lib/node_modules/@nanocollective/nanocoder/dist';
81
+ t.is(detectFromPath(path), 'npm');
82
+ });
83
+ test('detectFromPath: detects npm from node_modules path (local)', t => {
84
+ const path = '/home/user/project/node_modules/@nanocollective/nanocoder/dist';
85
+ t.is(detectFromPath(path), 'npm');
86
+ });
87
+ test('detectFromPath: detects npm from pnpm store path', t => {
88
+ const path = '/home/user/.pnpm-store/.pnpm/@nanocollective+nanocoder@1.0.0/node_modules/@nanocollective/nanocoder/dist';
89
+ t.is(detectFromPath(path), 'npm');
90
+ });
91
+ test('detectFromPath: detects npm from .bin directory', t => {
92
+ const path = '/usr/local/lib/node_modules/.bin/nanocoder';
93
+ t.is(detectFromPath(path), 'npm');
94
+ });
95
+ test('detectFromPath: returns null for unrecognized paths', t => {
96
+ const path = '/home/user/Downloads/nanocoder/dist';
97
+ t.is(detectFromPath(path), null);
98
+ });
99
+ test('detectFromPath: detects npm from Windows AppData path', t => {
100
+ // Windows npm global installations typically go to AppData
101
+ const path = 'C:\\Users\\user\\AppData\\Roaming\\npm\\node_modules\\@nanocollective\\nanocoder\\dist';
102
+ t.is(detectFromPath(path), 'npm');
103
+ });
104
+ test('detectFromPath: nix takes precedence over node_modules', t => {
105
+ // Edge case: nix store might contain "node_modules" in the path
106
+ const path = '/nix/store/abc123-nanocoder-1.0.0/lib/node_modules/@nanocollective/nanocoder/dist';
107
+ t.is(detectFromPath(path), 'nix');
108
+ });
109
+ test('detectFromPath: homebrew takes precedence over node_modules', t => {
110
+ // Edge case: homebrew path contains node_modules
111
+ const path = '/opt/homebrew/Cellar/nanocoder/1.0.0/lib/node_modules/@nanocollective/nanocoder/dist';
112
+ t.is(detectFromPath(path), 'homebrew');
113
+ });
114
+ // Edge case tests
115
+ test('detectInstallationMethod: env vars take precedence over path', t => {
116
+ // Even if running from a homebrew path, HOMEBREW_PREFIX should be checked first
117
+ process.env.HOMEBREW_PREFIX = '/opt/homebrew';
118
+ t.is(detectInstallationMethod(), 'homebrew');
119
+ });
120
+ test('detectInstallationMethod: warns on invalid env override and continues detection', t => {
121
+ // Set an invalid value
122
+ process.env.NANOCODER_INSTALL_METHOD = 'invalid-method';
123
+ // Capture console.log (logWarning falls back to console.log when queue not available)
124
+ const warnings = [];
125
+ const originalLog = console.log;
126
+ console.log = (msg) => {
127
+ warnings.push(msg);
128
+ };
129
+ // Should fall back to normal detection
130
+ const result = detectInstallationMethod();
131
+ // Restore console.log
132
+ console.log = originalLog;
133
+ // Should have warned about invalid value
134
+ t.is(warnings.length, 1);
135
+ t.regex(warnings[0], /Invalid NANOCODER_INSTALL_METHOD/);
136
+ t.regex(warnings[0], /invalid-method/);
137
+ // Should still return a valid installation method
138
+ // (will be detected from the actual running environment - npm in this case since we're in node_modules)
139
+ t.true(['npm', 'homebrew', 'nix', 'unknown'].includes(result));
140
+ });
141
+ //# sourceMappingURL=installation-detector.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation-detector.spec.js","sourceRoot":"","sources":["../../source/utils/installation-detector.spec.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ import React from 'react';
2
2
  export declare function setGlobalMessageQueue(addToChatQueue: (component: React.ReactNode) => void): void;
3
3
  export declare function logInfo(message: string, hideBox?: boolean): void;
4
4
  export declare function logError(message: string, hideBox?: boolean): void;
5
+ export declare function logSuccess(message: string, hideBox?: boolean): void;
6
+ export declare function logWarning(message: string, hideBox?: boolean): void;
5
7
  //# sourceMappingURL=message-queue.d.ts.map
@@ -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;AAW1B,wBAAgB,qBAAqB,CACpC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,QAGpD;AA4CD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAE/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAEhE"}
1
+ {"version":3,"file":"message-queue.d.ts","sourceRoot":"","sources":["../../source/utils/message-queue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,wBAAgB,qBAAqB,CACpC,cAAc,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,KAAK,IAAI,QAGpD;AAiDD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAE/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAEhE;AAGD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAElE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAc,QAElE"}
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import ErrorMessage from '../components/error-message.js';
3
3
  import InfoMessage from '../components/info-message.js';
4
4
  import SuccessMessage from '../components/success-message.js';
5
+ import WarningMessage from '../components/warning-message.js';
5
6
  // Global message queue function - will be set by App component
6
7
  let globalAddToChatQueue = null;
7
8
  let componentKeyCounter = 0;
@@ -30,6 +31,9 @@ function addMessageToQueue(type, message, hideBox = true) {
30
31
  case 'success':
31
32
  component = (_jsx(SuccessMessage, { message: message, hideBox: hideBox }, key));
32
33
  break;
34
+ case 'warning':
35
+ component = (_jsx(WarningMessage, { message: message, hideBox: hideBox }, key));
36
+ break;
33
37
  case 'info':
34
38
  default:
35
39
  component = _jsx(InfoMessage, { message: message, hideBox: hideBox }, key);
@@ -44,4 +48,11 @@ export function logInfo(message, hideBox = true) {
44
48
  export function logError(message, hideBox = true) {
45
49
  addMessageToQueue('error', message, hideBox);
46
50
  }
51
+ // Temporarily ingored in `knip.json`. We do want this. We just haven't used it yet.
52
+ export function logSuccess(message, hideBox = true) {
53
+ addMessageToQueue('success', message, hideBox);
54
+ }
55
+ export function logWarning(message, hideBox = true) {
56
+ addMessageToQueue('warning', message, hideBox);
57
+ }
47
58
  //# sourceMappingURL=message-queue.js.map
@@ -1 +1 @@
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,SAAS,iBAAiB,CACzB,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"}
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;AAC1D,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,SAAS,iBAAiB,CACzB,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,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,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,UAAmB,IAAI;IAClE,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,UAAmB,IAAI;IAClE,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"paste-detection.d.ts","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAGA,UAAU,qBAAqB;IAE9B,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAQD,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"}
1
+ {"version":3,"file":"paste-detection.d.ts","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAGA,UAAU,qBAAqB;IAE9B,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;IAEtB,aAAa,EAAE,MAAM,CAAC;CACtB;AAQD,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;IAmED;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAI/B"}
@@ -1,8 +1,8 @@
1
1
  // CLI Paste Detection Utilities
2
2
  // Since CLI applications don't receive direct paste events, we use heuristics
3
3
  const DEFAULT_PASTE_OPTIONS = {
4
- timeThreshold: 16, // ~1 frame at 60fps
5
- charThreshold: 50, // Characters added in single change
4
+ timeThreshold: 50, // Increased to 50ms to be more forgiving of fast typing
5
+ charThreshold: 5, // Lower threshold - detect pastes of 5+ chars (size method needs 10+ chars)
6
6
  lineThreshold: 2, // Multiple lines added instantly
7
7
  };
8
8
  export class PasteDetector {
@@ -18,7 +18,12 @@ export class PasteDetector {
18
18
  const currentTime = Date.now();
19
19
  const timeElapsed = currentTime - this.lastInputTime;
20
20
  const charsAdded = newText.length - this.lastInputLength;
21
- const linesAdded = newText.split('\n').length - 1;
21
+ // Calculate lines added in THIS change, not total lines in text
22
+ const previousLineCount = this.lastInputLength > 0
23
+ ? newText.slice(0, this.lastInputLength).split('\n').length
24
+ : 1;
25
+ const currentLineCount = newText.split('\n').length;
26
+ const linesAdded = currentLineCount - previousLineCount;
22
27
  // Get the added text (assuming it's at the end)
23
28
  const addedText = newText.slice(this.lastInputLength);
24
29
  // Update tracking
@@ -1 +1 @@
1
- {"version":3,"file":"paste-detection.js","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8EAA8E;AAW9E,MAAM,qBAAqB,GAA0B;IACpD,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"}
1
+ {"version":3,"file":"paste-detection.js","sourceRoot":"","sources":["../../source/utils/paste-detection.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8EAA8E;AAW9E,MAAM,qBAAqB,GAA0B;IACpD,aAAa,EAAE,EAAE,EAAE,wDAAwD;IAC3E,aAAa,EAAE,CAAC,EAAE,4EAA4E;IAC9F,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;QAEzD,gEAAgE;QAChE,MAAM,iBAAiB,GACtB,IAAI,CAAC,eAAe,GAAG,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;YAC3D,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACpD,MAAM,UAAU,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;QAExD,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"}
@@ -16,24 +16,31 @@ test('PasteDetector detects multi-line input as paste', t => {
16
16
  const multiLineText = 'line1\nline2\nline3\nline4';
17
17
  const result = detector.detectPaste(multiLineText);
18
18
  t.true(result.isPaste);
19
- t.is(result.method, 'lines');
19
+ // With low thresholds, size method triggers first (25 chars > 1*2 = 2)
20
+ // but still correctly detected as paste
21
+ t.true(['size', 'lines'].includes(result.method));
20
22
  t.is(result.addedText, multiLineText);
21
23
  });
22
- test('PasteDetector does not detect small input as paste', t => {
24
+ test('PasteDetector detects small paste', t => {
23
25
  const detector = new PasteDetector();
24
- const result = detector.detectPaste('small');
25
- t.false(result.isPaste);
26
- t.is(result.method, 'none');
26
+ // 15 characters - enough to trigger size detection (> 5*2 = 10)
27
+ const result = detector.detectPaste('small paste txt');
28
+ t.true(result.isPaste);
29
+ t.is(result.method, 'size'); // 15 chars > 5*2 = 10
27
30
  });
28
- test('PasteDetector tracks incremental changes correctly', t => {
31
+ test('PasteDetector does not detect manual typing', async (t) => {
29
32
  const detector = new PasteDetector();
30
- // First input
33
+ // First input - 5 chars, below 10-char size threshold
31
34
  const result1 = detector.detectPaste('hello');
32
35
  t.false(result1.isPaste);
33
- // Add more text (incremental)
36
+ t.is(result1.method, 'none');
37
+ // Wait to simulate human typing speed (not a paste)
38
+ await new Promise(resolve => setTimeout(resolve, 100));
39
+ // Add more text (incremental) - adds " world" (6 chars), still below threshold
34
40
  const result2 = detector.detectPaste('hello world');
35
41
  t.false(result2.isPaste);
36
42
  t.is(result2.addedText, ' world');
43
+ t.is(result2.method, 'none');
37
44
  });
38
45
  test('PasteDetector reset clears state', t => {
39
46
  const detector = new PasteDetector();
@@ -1 +1 @@
1
- {"version":3,"file":"paste-detection.spec.js","sourceRoot":"","sources":["../../source/utils/paste-detection.spec.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,aAAa,EAAC,MAAM,mBAAmB,CAAC;AAEhD,gCAAgC;AAChC,sCAAsC;AAEtC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAEzC,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,EAAE;IACtD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,oEAAoE;IACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAErD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,gCAAgC;IAC7D,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE;IAC3D,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,MAAM,aAAa,GAAG,4BAA4B,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAEnD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,EAAE;IAC9D,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAE7C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,EAAE;IAC9D,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,cAAc;IACd,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEzB,8BAA8B;IAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACpD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,CAAC,CAAC,EAAE;IAC5C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAErC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEjB,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,qCAAqC;AAC1E,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"paste-detection.spec.js","sourceRoot":"","sources":["../../source/utils/paste-detection.spec.ts"],"names":[],"mappings":"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"}
@@ -1 +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,gBAAgB,CAAC;AAExB,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"}
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,gBAAgB,CAAC;AAExB,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,CAuCnB"}
@@ -1,7 +1,9 @@
1
1
  import { PlaceholderType, } from '../types/hooks.js';
2
2
  export function handlePaste(pastedText, currentDisplayValue, currentPlaceholderContent, detectionMethod) {
3
- const THRESHOLD = 80; // characters
4
- if (pastedText.length < THRESHOLD) {
3
+ // No minimum threshold - any detected paste gets a placeholder
4
+ // This is especially important for multi-line pastes where only the first line
5
+ // may be captured by the input component
6
+ if (pastedText.length === 0) {
5
7
  return null;
6
8
  }
7
9
  // Generate simple incrementing ID based on existing paste placeholders
@@ -1 +1 @@
1
- {"version":3,"file":"paste-utils.js","sourceRoot":"","sources":["../../source/utils/paste-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,eAAe,GACf,MAAM,gBAAgB,CAAC;AAExB,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"}
1
+ {"version":3,"file":"paste-utils.js","sourceRoot":"","sources":["../../source/utils/paste-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,eAAe,GACf,MAAM,gBAAgB,CAAC;AAExB,MAAM,UAAU,WAAW,CAC1B,UAAkB,EAClB,mBAA2B,EAC3B,yBAA6D,EAC7D,eAA+C;IAE/C,+DAA+D;IAC/D,+EAA+E;IAC/E,yCAAyC;IACzC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,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"}
@@ -4,15 +4,31 @@ import { PlaceholderType } from '../types/hooks.js';
4
4
  // Tests for handlePaste utility function
5
5
  // Validates paste handling logic and placeholder creation
6
6
  console.log(`\npaste-utils.spec.ts`);
7
- test('handlePaste returns null for small pastes', t => {
8
- const pastedText = 'small text';
7
+ test('handlePaste returns null for empty pastes', t => {
8
+ const pastedText = '';
9
9
  const currentDisplayValue = 'existing content';
10
10
  const currentPlaceholderContent = {};
11
11
  const result = handlePaste(pastedText, currentDisplayValue, currentPlaceholderContent);
12
12
  t.is(result, null);
13
13
  });
14
+ test('handlePaste creates placeholder for small pastes', t => {
15
+ const pastedText = 'small text';
16
+ const currentDisplayValue = 'existing content';
17
+ const currentPlaceholderContent = {};
18
+ const result = handlePaste(pastedText, currentDisplayValue, currentPlaceholderContent);
19
+ t.truthy(result);
20
+ t.is(typeof result.displayValue, 'string');
21
+ t.true(result.displayValue.includes('[Paste #'));
22
+ t.true(result.displayValue.includes('10 chars]'));
23
+ // Should contain the pasted content in the map
24
+ const pasteIds = Object.keys(result.placeholderContent);
25
+ t.is(pasteIds.length, 1);
26
+ const pasteContent = result.placeholderContent[pasteIds[0]];
27
+ t.is(pasteContent.content, pastedText);
28
+ t.is(pasteContent.type, PlaceholderType.PASTE);
29
+ });
14
30
  test('handlePaste creates placeholder for large pastes', t => {
15
- const pastedText = 'a'.repeat(600); // Above 500 char threshold
31
+ const pastedText = 'a'.repeat(600);
16
32
  const currentDisplayValue = 'existing content';
17
33
  const currentPlaceholderContent = {};
18
34
  const result = handlePaste(pastedText, currentDisplayValue, currentPlaceholderContent);
@@ -1 +1 @@
1
- {"version":3,"file":"paste-utils.spec.js","sourceRoot":"","sources":["../../source/utils/paste-utils.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paste-utils.spec.js","sourceRoot":"","sources":["../../source/utils/paste-utils.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Parse tool arguments from various formats
3
+ * Handles both string-encoded JSON and already-parsed objects
4
+ *
5
+ * This utility eliminates the repeated pattern of JSON parsing that appears
6
+ * throughout the codebase when handling tool call arguments.
7
+ *
8
+ * ## Error Handling Modes
9
+ *
10
+ * **Lenient mode (strict=false, default)**: Used for display/UI purposes where
11
+ * graceful degradation is acceptable. If JSON parsing fails, returns the
12
+ * unparsed string, allowing the application to continue.
13
+ *
14
+ * **Strict mode (strict=true)**: Used for tool execution where malformed
15
+ * arguments must be caught early. Throws an error if JSON parsing fails,
16
+ * preventing execution with invalid data.
17
+ *
18
+ * @param args - Arguments in any format (string, object, etc.)
19
+ * @param options - Parsing options
20
+ * @param options.strict - If true, throw error on parse failure. If false, return unparsed value. Default: false
21
+ * @returns Parsed arguments as the specified type
22
+ * @throws Error if strict=true and JSON parsing fails
23
+ *
24
+ * @example
25
+ * // Lenient parsing for display
26
+ * const parsedArgs = parseToolArguments(toolCall.function.arguments);
27
+ *
28
+ * // Strict parsing for tool execution
29
+ * const parsedArgs = parseToolArguments(toolCall.function.arguments, {strict: true});
30
+ *
31
+ * // With type parameter
32
+ * const typedArgs = parseToolArguments<{path: string}>(args, {strict: true});
33
+ */
34
+ export declare function parseToolArguments<T = Record<string, unknown>>(args: unknown, options?: {
35
+ strict?: boolean;
36
+ }): T;
37
+ //# sourceMappingURL=tool-args-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args-parser.d.ts","sourceRoot":"","sources":["../../source/utils/tool-args-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,IAAI,EAAE,OAAO,EACb,OAAO,GAAE;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAM,GAC9B,CAAC,CAiBH"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Parse tool arguments from various formats
3
+ * Handles both string-encoded JSON and already-parsed objects
4
+ *
5
+ * This utility eliminates the repeated pattern of JSON parsing that appears
6
+ * throughout the codebase when handling tool call arguments.
7
+ *
8
+ * ## Error Handling Modes
9
+ *
10
+ * **Lenient mode (strict=false, default)**: Used for display/UI purposes where
11
+ * graceful degradation is acceptable. If JSON parsing fails, returns the
12
+ * unparsed string, allowing the application to continue.
13
+ *
14
+ * **Strict mode (strict=true)**: Used for tool execution where malformed
15
+ * arguments must be caught early. Throws an error if JSON parsing fails,
16
+ * preventing execution with invalid data.
17
+ *
18
+ * @param args - Arguments in any format (string, object, etc.)
19
+ * @param options - Parsing options
20
+ * @param options.strict - If true, throw error on parse failure. If false, return unparsed value. Default: false
21
+ * @returns Parsed arguments as the specified type
22
+ * @throws Error if strict=true and JSON parsing fails
23
+ *
24
+ * @example
25
+ * // Lenient parsing for display
26
+ * const parsedArgs = parseToolArguments(toolCall.function.arguments);
27
+ *
28
+ * // Strict parsing for tool execution
29
+ * const parsedArgs = parseToolArguments(toolCall.function.arguments, {strict: true});
30
+ *
31
+ * // With type parameter
32
+ * const typedArgs = parseToolArguments<{path: string}>(args, {strict: true});
33
+ */
34
+ export function parseToolArguments(args, options = {}) {
35
+ const { strict = false } = options;
36
+ if (typeof args === 'string') {
37
+ try {
38
+ return JSON.parse(args);
39
+ }
40
+ catch (e) {
41
+ if (strict) {
42
+ throw new Error(`Error: Invalid tool arguments: ${e.message}`);
43
+ }
44
+ // If parsing fails in lenient mode, return as-is (will be cast to T)
45
+ return args;
46
+ }
47
+ }
48
+ return args;
49
+ }
50
+ //# sourceMappingURL=tool-args-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args-parser.js","sourceRoot":"","sources":["../../source/utils/tool-args-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,kBAAkB,CACjC,IAAa,EACb,UAA8B,EAAE;IAEhC,MAAM,EAAC,MAAM,GAAG,KAAK,EAAC,GAAG,OAAO,CAAC;IAEjC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACd,kCAAmC,CAAW,CAAC,OAAO,EAAE,CACxD,CAAC;YACH,CAAC;YACD,qEAAqE;YACrE,OAAO,IAAS,CAAC;QAClB,CAAC;IACF,CAAC;IACD,OAAO,IAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tool-args-parser.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args-parser.spec.d.ts","sourceRoot":"","sources":["../../source/utils/tool-args-parser.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import test from 'ava';
2
+ import { parseToolArguments } from './tool-args-parser.js';
3
+ console.log(`\ntool-args-parser.spec.ts`);
4
+ // Tests for lenient mode (default, strict=false)
5
+ test('parseToolArguments - parses valid JSON string in lenient mode', t => {
6
+ const input = '{"path": "/test", "count": 42}';
7
+ const result = parseToolArguments(input);
8
+ t.deepEqual(result, { path: '/test', count: 42 });
9
+ });
10
+ test('parseToolArguments - returns object as-is in lenient mode', t => {
11
+ const input = { path: '/test', count: 42 };
12
+ const result = parseToolArguments(input);
13
+ t.deepEqual(result, input);
14
+ });
15
+ test('parseToolArguments - returns unparsed string on parse failure in lenient mode', t => {
16
+ const input = '{invalid json}';
17
+ const result = parseToolArguments(input);
18
+ t.is(result, input); // Should return the string as-is
19
+ });
20
+ test('parseToolArguments - handles empty object string in lenient mode', t => {
21
+ const input = '{}';
22
+ const result = parseToolArguments(input);
23
+ t.deepEqual(result, {});
24
+ });
25
+ test('parseToolArguments - handles array JSON in lenient mode', t => {
26
+ const input = '[1, 2, 3]';
27
+ const result = parseToolArguments(input);
28
+ t.deepEqual(result, [1, 2, 3]);
29
+ });
30
+ test('parseToolArguments - handles null in lenient mode', t => {
31
+ const result = parseToolArguments(null);
32
+ t.is(result, null);
33
+ });
34
+ test('parseToolArguments - handles undefined in lenient mode', t => {
35
+ const result = parseToolArguments(undefined);
36
+ t.is(result, undefined);
37
+ });
38
+ test('parseToolArguments - handles number in lenient mode', t => {
39
+ const result = parseToolArguments(42);
40
+ t.is(result, 42);
41
+ });
42
+ // Tests for strict mode (strict=true)
43
+ test('parseToolArguments - parses valid JSON string in strict mode', t => {
44
+ const input = '{"path": "/test", "count": 42}';
45
+ const result = parseToolArguments(input, { strict: true });
46
+ t.deepEqual(result, { path: '/test', count: 42 });
47
+ });
48
+ test('parseToolArguments - returns object as-is in strict mode', t => {
49
+ const input = { path: '/test', count: 42 };
50
+ const result = parseToolArguments(input, { strict: true });
51
+ t.deepEqual(result, input);
52
+ });
53
+ test('parseToolArguments - throws on parse failure in strict mode', t => {
54
+ const input = '{invalid json}';
55
+ const error = t.throws(() => {
56
+ parseToolArguments(input, { strict: true });
57
+ });
58
+ t.true(error?.message.includes('Error: Invalid tool arguments'));
59
+ });
60
+ test('parseToolArguments - throws on malformed JSON in strict mode', t => {
61
+ const input = '{"unclosed": ';
62
+ const error = t.throws(() => {
63
+ parseToolArguments(input, { strict: true });
64
+ });
65
+ t.true(error?.message.includes('Error: Invalid tool arguments'));
66
+ });
67
+ test('parseToolArguments - handles empty object string in strict mode', t => {
68
+ const input = '{}';
69
+ const result = parseToolArguments(input, { strict: true });
70
+ t.deepEqual(result, {});
71
+ });
72
+ // Tests for type parameter
73
+ test('parseToolArguments - respects type parameter', t => {
74
+ const input = '{"path": "/test", "count": 42}';
75
+ const result = parseToolArguments(input);
76
+ t.deepEqual(result, { path: '/test', count: 42 });
77
+ });
78
+ // Edge cases
79
+ test('parseToolArguments - handles nested JSON', t => {
80
+ const input = '{"outer": {"inner": {"value": 123}}}';
81
+ const result = parseToolArguments(input);
82
+ t.deepEqual(result, { outer: { inner: { value: 123 } } });
83
+ });
84
+ test('parseToolArguments - handles JSON with special characters', t => {
85
+ const input = '{"message": "Hello \\"world\\"", "newline": "test\\nline"}';
86
+ const result = parseToolArguments(input);
87
+ t.deepEqual(result, { message: 'Hello "world"', newline: 'test\nline' });
88
+ });
89
+ test('parseToolArguments - preserves boolean values', t => {
90
+ const input = '{"enabled": true, "disabled": false}';
91
+ const result = parseToolArguments(input);
92
+ t.deepEqual(result, { enabled: true, disabled: false });
93
+ });
94
+ test('parseToolArguments - preserves null values in JSON', t => {
95
+ const input = '{"value": null}';
96
+ const result = parseToolArguments(input);
97
+ t.deepEqual(result, { value: null });
98
+ });
99
+ // Comparison between strict and lenient modes
100
+ test('parseToolArguments - lenient vs strict behavior on invalid JSON', t => {
101
+ const invalidJson = '{broken}';
102
+ // Lenient mode: returns unparsed string
103
+ const lenientResult = parseToolArguments(invalidJson);
104
+ t.is(lenientResult, invalidJson);
105
+ // Strict mode: throws error
106
+ const error = t.throws(() => {
107
+ parseToolArguments(invalidJson, { strict: true });
108
+ });
109
+ t.true(error?.message.includes('Error: Invalid tool arguments'));
110
+ });
111
+ //# sourceMappingURL=tool-args-parser.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-args-parser.spec.js","sourceRoot":"","sources":["../../source/utils/tool-args-parser.spec.ts"],"names":[],"mappings":"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"}