@nanocollective/nanocoder 1.16.2 → 1.16.4

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 (150) hide show
  1. package/README.md +17 -1
  2. package/dist/commands/update.d.ts +6 -0
  3. package/dist/commands/update.d.ts.map +1 -1
  4. package/dist/commands/update.js +129 -3
  5. package/dist/commands/update.js.map +1 -1
  6. package/dist/components/assistant-message.d.ts +1 -4
  7. package/dist/components/assistant-message.d.ts.map +1 -1
  8. package/dist/components/assistant-message.js +1 -199
  9. package/dist/components/assistant-message.js.map +1 -1
  10. package/dist/components/status.d.ts +1 -6
  11. package/dist/components/status.d.ts.map +1 -1
  12. package/dist/components/status.js +3 -2
  13. package/dist/components/status.js.map +1 -1
  14. package/dist/components/user-input.d.ts.map +1 -1
  15. package/dist/components/user-input.js +61 -19
  16. package/dist/components/user-input.js.map +1 -1
  17. package/dist/components/warning-message.d.ts +7 -0
  18. package/dist/components/warning-message.d.ts.map +1 -0
  19. package/dist/components/warning-message.js +12 -0
  20. package/dist/components/warning-message.js.map +1 -0
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/index.js +19 -11
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/config/paths.d.ts +1 -0
  25. package/dist/config/paths.d.ts.map +1 -1
  26. package/dist/config/paths.js +48 -2
  27. package/dist/config/paths.js.map +1 -1
  28. package/dist/config/paths.spec.d.ts +2 -0
  29. package/dist/config/paths.spec.d.ts.map +1 -0
  30. package/dist/config/paths.spec.js +114 -0
  31. package/dist/config/paths.spec.js.map +1 -0
  32. package/dist/config/themes.d.ts.map +1 -1
  33. package/dist/config/themes.js +19 -0
  34. package/dist/config/themes.js.map +1 -1
  35. package/dist/hooks/useAppState.d.ts.map +1 -1
  36. package/dist/hooks/useAppState.js +8 -15
  37. package/dist/hooks/useAppState.js.map +1 -1
  38. package/dist/hooks/useInputState.d.ts.map +1 -1
  39. package/dist/hooks/useInputState.js +95 -8
  40. package/dist/hooks/useInputState.js.map +1 -1
  41. package/dist/hooks/useTerminalWidth.d.ts.map +1 -1
  42. package/dist/hooks/useTerminalWidth.js +6 -0
  43. package/dist/hooks/useTerminalWidth.js.map +1 -1
  44. package/dist/markdown-parser/html-entities.d.ts +2 -0
  45. package/dist/markdown-parser/html-entities.d.ts.map +1 -0
  46. package/dist/markdown-parser/html-entities.js +41 -0
  47. package/dist/markdown-parser/html-entities.js.map +1 -0
  48. package/dist/markdown-parser/html-entities.spec.d.ts +2 -0
  49. package/dist/markdown-parser/html-entities.spec.d.ts.map +1 -0
  50. package/dist/markdown-parser/html-entities.spec.js +73 -0
  51. package/dist/markdown-parser/html-entities.spec.js.map +1 -0
  52. package/dist/markdown-parser/index.d.ts +6 -0
  53. package/dist/markdown-parser/index.d.ts.map +1 -0
  54. package/dist/markdown-parser/index.js +97 -0
  55. package/dist/markdown-parser/index.js.map +1 -0
  56. package/dist/markdown-parser/index.spec.d.ts +2 -0
  57. package/dist/markdown-parser/index.spec.d.ts.map +1 -0
  58. package/dist/markdown-parser/index.spec.js +245 -0
  59. package/dist/markdown-parser/index.spec.js.map +1 -0
  60. package/dist/markdown-parser/table-parser.d.ts +3 -0
  61. package/dist/markdown-parser/table-parser.d.ts.map +1 -0
  62. package/dist/markdown-parser/table-parser.js +92 -0
  63. package/dist/markdown-parser/table-parser.js.map +1 -0
  64. package/dist/markdown-parser/table-parser.spec.d.ts +2 -0
  65. package/dist/markdown-parser/table-parser.spec.d.ts.map +1 -0
  66. package/dist/markdown-parser/table-parser.spec.js +120 -0
  67. package/dist/markdown-parser/table-parser.spec.js.map +1 -0
  68. package/dist/markdown-parser/utils.d.ts +2 -0
  69. package/dist/markdown-parser/utils.d.ts.map +1 -0
  70. package/dist/markdown-parser/utils.js +14 -0
  71. package/dist/markdown-parser/utils.js.map +1 -0
  72. package/dist/markdown-parser/utils.spec.d.ts +2 -0
  73. package/dist/markdown-parser/utils.spec.d.ts.map +1 -0
  74. package/dist/markdown-parser/utils.spec.js +59 -0
  75. package/dist/markdown-parser/utils.spec.js.map +1 -0
  76. package/dist/tools/execute-bash.d.ts.map +1 -1
  77. package/dist/tools/execute-bash.js +5 -3
  78. package/dist/tools/execute-bash.js.map +1 -1
  79. package/dist/tools/find-files.d.ts +3 -0
  80. package/dist/tools/find-files.d.ts.map +1 -0
  81. package/dist/tools/find-files.js +186 -0
  82. package/dist/tools/find-files.js.map +1 -0
  83. package/dist/tools/index.js +4 -4
  84. package/dist/tools/index.js.map +1 -1
  85. package/dist/tools/read-file.d.ts.map +1 -1
  86. package/dist/tools/read-file.js +143 -9
  87. package/dist/tools/read-file.js.map +1 -1
  88. package/dist/tools/search-file-contents.d.ts +3 -0
  89. package/dist/tools/search-file-contents.d.ts.map +1 -0
  90. package/dist/tools/search-file-contents.js +164 -0
  91. package/dist/tools/search-file-contents.js.map +1 -0
  92. package/dist/types/markdown-parser.d.ts +11 -0
  93. package/dist/types/markdown-parser.d.ts.map +1 -0
  94. package/dist/types/markdown-parser.js +2 -0
  95. package/dist/types/markdown-parser.js.map +1 -0
  96. package/dist/types/ui.d.ts +1 -1
  97. package/dist/types/ui.d.ts.map +1 -1
  98. package/dist/types/utils.d.ts +2 -1
  99. package/dist/types/utils.d.ts.map +1 -1
  100. package/dist/usage/storage.d.ts +1 -1
  101. package/dist/usage/storage.d.ts.map +1 -1
  102. package/dist/usage/storage.js +55 -9
  103. package/dist/usage/storage.js.map +1 -1
  104. package/dist/usage/storage.spec.js +136 -2
  105. package/dist/usage/storage.spec.js.map +1 -1
  106. package/dist/utils/installation-detector.d.ts +16 -0
  107. package/dist/utils/installation-detector.d.ts.map +1 -0
  108. package/dist/utils/installation-detector.js +118 -0
  109. package/dist/utils/installation-detector.js.map +1 -0
  110. package/dist/utils/installation-detector.spec.d.ts +2 -0
  111. package/dist/utils/installation-detector.spec.d.ts.map +1 -0
  112. package/dist/utils/installation-detector.spec.js +141 -0
  113. package/dist/utils/installation-detector.spec.js.map +1 -0
  114. package/dist/utils/message-queue.d.ts +2 -0
  115. package/dist/utils/message-queue.d.ts.map +1 -1
  116. package/dist/utils/message-queue.js +11 -0
  117. package/dist/utils/message-queue.js.map +1 -1
  118. package/dist/utils/paste-detection.d.ts.map +1 -1
  119. package/dist/utils/paste-detection.js +8 -3
  120. package/dist/utils/paste-detection.js.map +1 -1
  121. package/dist/utils/paste-detection.spec.js +15 -8
  122. package/dist/utils/paste-detection.spec.js.map +1 -1
  123. package/dist/utils/paste-utils.d.ts.map +1 -1
  124. package/dist/utils/paste-utils.js +4 -2
  125. package/dist/utils/paste-utils.js.map +1 -1
  126. package/dist/utils/paste-utils.spec.js +19 -3
  127. package/dist/utils/paste-utils.spec.js.map +1 -1
  128. package/dist/utils/update-checker.d.ts.map +1 -1
  129. package/dist/utils/update-checker.js +31 -3
  130. package/dist/utils/update-checker.js.map +1 -1
  131. package/dist/utils/update-checker.spec.d.ts +2 -0
  132. package/dist/utils/update-checker.spec.d.ts.map +1 -0
  133. package/dist/utils/update-checker.spec.js +280 -0
  134. package/dist/utils/update-checker.spec.js.map +1 -0
  135. package/dist/wizard/steps/location-step.js +2 -2
  136. package/dist/wizard/steps/location-step.js.map +1 -1
  137. package/package.json +1 -1
  138. package/source/app/prompts/main-prompt.md +67 -23
  139. package/dist/components/update-message.d.ts +0 -7
  140. package/dist/components/update-message.d.ts.map +0 -1
  141. package/dist/components/update-message.js +0 -93
  142. package/dist/components/update-message.js.map +0 -1
  143. package/dist/tools/read-many-files.d.ts +0 -3
  144. package/dist/tools/read-many-files.d.ts.map +0 -1
  145. package/dist/tools/read-many-files.js +0 -169
  146. package/dist/tools/read-many-files.js.map +0 -1
  147. package/dist/tools/search-files.d.ts +0 -3
  148. package/dist/tools/search-files.d.ts.map +0 -1
  149. package/dist/tools/search-files.js +0 -251
  150. package/dist/tools/search-files.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation-detector.d.ts","sourceRoot":"","sources":["../../source/utils/installation-detector.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAWxE;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAuB5E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAoC7D"}
@@ -0,0 +1,118 @@
1
+ import { fileURLToPath } from 'url';
2
+ import { dirname, join, sep } from 'path';
3
+ import { existsSync } from 'fs';
4
+ import { logWarning } from './message-queue.js';
5
+ const safeProcess = typeof process !== 'undefined' ? process : {};
6
+ /**
7
+ * Detects installation method from a given module path.
8
+ * Exported for testing purposes.
9
+ * @param modulePath The path to check
10
+ * @returns The detected installation method or null if not detected from path
11
+ */
12
+ export function detectFromPath(modulePath) {
13
+ // Strategy 1: Check for Nix installation (most specific)
14
+ // Nix store has `/nix/store/` path with store hashes - this is very reliable
15
+ if (modulePath.includes('/nix/store/')) {
16
+ return 'nix';
17
+ }
18
+ // Strategy 2: Check for Homebrew installation via path
19
+ // Homebrew puts packages under Cellar directory in standard locations
20
+ // Common paths: /opt/homebrew, /usr/local, /home/linuxbrew/.linuxbrew
21
+ if (modulePath.includes(`${sep}Cellar${sep}`) ||
22
+ modulePath.includes(`${sep}homebrew${sep}`)) {
23
+ return 'homebrew';
24
+ }
25
+ // Strategy 3: Check for npm/pnpm/yarn installation using multiple signals
26
+ if (isNpmBasedInstallation(modulePath)) {
27
+ return 'npm';
28
+ }
29
+ return null;
30
+ }
31
+ /**
32
+ * Detects how Nanocoder was installed by using multiple detection strategies.
33
+ * Uses a combination of path inspection, environment variables, and file system markers.
34
+ * An environment variable `NANOCODER_INSTALL_METHOD` can be used to override detection for testing.
35
+ * @returns {InstallationMethod} The detected installation method.
36
+ */
37
+ export function detectInstallationMethod() {
38
+ // Env var override has highest priority for testing / debugging
39
+ const envOverride = safeProcess.env?.NANOCODER_INSTALL_METHOD;
40
+ if (envOverride) {
41
+ const validMethods = [
42
+ 'npm',
43
+ 'homebrew',
44
+ 'nix',
45
+ 'unknown',
46
+ ];
47
+ if (validMethods.includes(envOverride)) {
48
+ return envOverride;
49
+ }
50
+ // Warn about invalid value but continue with normal detection
51
+ logWarning(`Invalid NANOCODER_INSTALL_METHOD: "${envOverride}". Valid values: ${validMethods.join(', ')}`);
52
+ }
53
+ // Strategy 1: Check environment variables (most reliable after override)
54
+ if (safeProcess.env?.HOMEBREW_PREFIX || safeProcess.env?.HOMEBREW_CELLAR) {
55
+ return 'homebrew';
56
+ }
57
+ // Use the module path of this file (compiled output in `dist`) to determine how it was installed.
58
+ const modulePath = dirname(fileURLToPath(import.meta.url));
59
+ // Strategy 2: Check path-based detection
60
+ const pathResult = detectFromPath(modulePath);
61
+ if (pathResult) {
62
+ return pathResult;
63
+ }
64
+ return 'unknown';
65
+ }
66
+ /**
67
+ * Checks if this is an npm-based installation (npm, pnpm, or yarn).
68
+ * Uses multiple detection strategies for robustness across different package managers.
69
+ */
70
+ function isNpmBasedInstallation(modulePath) {
71
+ // Check 1: Environment variables set by package managers
72
+ if (safeProcess.env?.npm_config_prefix ||
73
+ safeProcess.env?.npm_config_global ||
74
+ safeProcess.env?.PNPM_HOME ||
75
+ safeProcess.env?.npm_execpath) {
76
+ return true;
77
+ }
78
+ // Check 2: Standard node_modules path (npm, yarn v1)
79
+ if (modulePath.includes('node_modules')) {
80
+ return true;
81
+ }
82
+ // Check 3: pnpm store structure (.pnpm directory)
83
+ if (modulePath.includes(`.pnpm${sep}`)) {
84
+ return true;
85
+ }
86
+ // Check 4: Look for .bin directory in parent paths (all package managers use this)
87
+ // This handles symlinked executables
88
+ const binDirPattern = `${sep}.bin${sep}`;
89
+ if (modulePath.includes(binDirPattern)) {
90
+ return true;
91
+ }
92
+ // Check 5: Look for package.json in expected locations relative to the module
93
+ // For global installs, package.json should be in parent directories
94
+ // This handles edge cases like custom install locations
95
+ return hasPackageJsonMarker(modulePath);
96
+ }
97
+ /**
98
+ * Walks up the directory tree looking for package.json as a marker of npm installation.
99
+ * Only checks a few levels to avoid excessive file system operations.
100
+ */
101
+ function hasPackageJsonMarker(startPath) {
102
+ let currentPath = startPath;
103
+ const maxLevelsToCheck = 4; // Limit to prevent excessive traversal
104
+ for (let i = 0; i < maxLevelsToCheck; i++) {
105
+ const packageJsonPath = join(currentPath, 'package.json');
106
+ if (existsSync(packageJsonPath)) {
107
+ return true;
108
+ }
109
+ const parentPath = dirname(currentPath);
110
+ // Stop if we've reached the root
111
+ if (parentPath === currentPath) {
112
+ break;
113
+ }
114
+ currentPath = parentPath;
115
+ }
116
+ return false;
117
+ }
118
+ //# sourceMappingURL=installation-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation-detector.js","sourceRoot":"","sources":["../../source/utils/installation-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=installation-detector.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installation-detector.spec.d.ts","sourceRoot":"","sources":["../../source/utils/installation-detector.spec.ts"],"names":[],"mappings":""}
@@ -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":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EACN,wBAAwB,EACxB,cAAc,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAE/C,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;IACpB,kDAAkD;IAClD,OAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACrC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACnC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,6BAA6B;AAC7B,IAAI,CAAC,yDAAyD,EAAE,CAAC,CAAC,EAAE;IACnE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,KAAK,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,CAAC,CAAC,EAAE;IACxE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC;IAClD,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,CAAC,CAAC,EAAE;IACnE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,KAAK,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,SAAS,CAAC;IACjD,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,SAAS,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,0CAA0C;AAC1C,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IAC1E,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IAC1E,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,sBAAsB,CAAC;IACrD,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,qCAAqC;AACrC,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,YAAY,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;IACvC,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,CAAC,CAAC,EAAE;IAC/D,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,8BAA8B,CAAC;IACvD,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAClE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,gDAAgD,CAAC;IAC5E,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,uBAAuB;AACvB,sGAAsG;AAEtG,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,EAAE;IAC5D,MAAM,IAAI,GACT,mFAAmF,CAAC;IACrF,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,CAAC,CAAC,EAAE;IAC3E,MAAM,IAAI,GACT,2FAA2F,CAAC;IAC7F,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,CAAC,CAAC,EAAE;IACzE,MAAM,IAAI,GACT,8FAA8F,CAAC;IAChG,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,IAAI,GAAG,+DAA+D,CAAC;IAC7E,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,CAAC,CAAC,EAAE;IACrE,MAAM,IAAI,GACT,mGAAmG,CAAC;IACrG,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,IAAI,GAAG,4DAA4D,CAAC;IAC1E,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4DAA4D,EAAE,CAAC,CAAC,EAAE;IACtE,MAAM,IAAI,GAAG,gEAAgE,CAAC;IAC9E,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,CAAC,CAAC,EAAE;IAC5D,MAAM,IAAI,GACT,0GAA0G,CAAC;IAC5G,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE;IAC3D,MAAM,IAAI,GAAG,4CAA4C,CAAC;IAC1D,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,IAAI,GAAG,qCAAqC,CAAC;IACnD,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,CAAC,CAAC,EAAE;IACjE,2DAA2D;IAC3D,MAAM,IAAI,GACT,wFAAwF,CAAC;IAC1F,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAClE,gEAAgE;IAChE,MAAM,IAAI,GACT,mFAAmF,CAAC;IACrF,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,CAAC,CAAC,EAAE;IACvE,iDAAiD;IACjD,MAAM,IAAI,GACT,sFAAsF,CAAC;IACxF,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,IAAI,CAAC,8DAA8D,EAAE,CAAC,CAAC,EAAE;IACxE,gFAAgF;IAChF,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,CAAC,CAAC,EAAE;IAC3F,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,gBAAgB,CAAC;IAExD,sFAAsF;IACtF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAChC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,uCAAuC;IACvC,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAE1C,sBAAsB;IACtB,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAE1B,yCAAyC;IACzC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAC;IACzD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAEvC,kDAAkD;IAClD,wGAAwG;IACxG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC"}
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../source/utils/update-checker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAsB,UAAU,EAAC,MAAM,eAAe,CAAC;AAgGnE;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CAoC3D"}
1
+ {"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../source/utils/update-checker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAsB,UAAU,EAAC,MAAM,eAAe,CAAC;AA8GnE;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,CAAC,CA8D3D"}
@@ -3,6 +3,16 @@ import { join, dirname } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { loadPreferences, savePreferences } from '../config/preferences.js';
5
5
  import { logError } from '../utils/message-queue.js';
6
+ import { detectInstallationMethod } from './installation-detector.js';
7
+ const UPDATE_COMMANDS = {
8
+ NPM: 'npm update -g @nanocollective/nanocoder',
9
+ // Check if package exists before upgrading to provide better error messages
10
+ HOMEBREW: 'brew list nanocoder >/dev/null 2>&1 && brew upgrade nanocoder || (echo "Error: nanocoder not found in Homebrew. Please install it first with: brew install nanocoder" && exit 1)',
11
+ };
12
+ const UPDATE_MESSAGES = {
13
+ NIX: 'To update, re-run: nix run github:Nano-Collective/nanocoder (or update your flake).',
14
+ UNKNOWN: 'A new version is available. Please update using your package manager.',
15
+ };
6
16
  const __filename = fileURLToPath(import.meta.url);
7
17
  const __dirname = dirname(__filename);
8
18
  /**
@@ -90,13 +100,31 @@ export async function checkForUpdates() {
90
100
  };
91
101
  }
92
102
  const hasUpdate = isNewerVersion(currentVersion, latestVersion);
103
+ function getUpdateDetails(hasUpdate) {
104
+ if (!hasUpdate) {
105
+ return {};
106
+ }
107
+ const method = detectInstallationMethod();
108
+ // Use constants defined at top of file for maintainability
109
+ switch (method) {
110
+ case 'npm':
111
+ return { command: UPDATE_COMMANDS.NPM };
112
+ case 'homebrew':
113
+ return { command: UPDATE_COMMANDS.HOMEBREW };
114
+ case 'nix':
115
+ return { message: UPDATE_MESSAGES.NIX };
116
+ default:
117
+ // For 'unknown' fallback to a general message (do not attempt to run a command)
118
+ return { message: UPDATE_MESSAGES.UNKNOWN };
119
+ }
120
+ }
121
+ const updateDetails = getUpdateDetails(hasUpdate);
93
122
  return {
94
123
  hasUpdate,
95
124
  currentVersion,
96
125
  latestVersion,
97
- updateCommand: hasUpdate
98
- ? 'npm update -g @nanocollective/nanocoder'
99
- : undefined,
126
+ updateCommand: updateDetails.command,
127
+ updateMessage: updateDetails.message,
100
128
  };
101
129
  }
102
130
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../source/utils/update-checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../source/utils/update-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=update-checker.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.spec.d.ts","sourceRoot":"","sources":["../../source/utils/update-checker.spec.ts"],"names":[],"mappings":""}