@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.
- package/README.md +17 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -29
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +104 -10
- package/dist/commands/update.js.map +1 -1
- package/dist/components/status.d.ts +1 -6
- package/dist/components/status.d.ts.map +1 -1
- package/dist/components/status.js +3 -2
- package/dist/components/status.js.map +1 -1
- package/dist/components/tool-confirmation.d.ts.map +1 -1
- package/dist/components/tool-confirmation.js +5 -19
- package/dist/components/tool-confirmation.js.map +1 -1
- package/dist/components/user-input.d.ts.map +1 -1
- package/dist/components/user-input.js +61 -19
- package/dist/components/user-input.js.map +1 -1
- package/dist/components/warning-message.d.ts +7 -0
- package/dist/components/warning-message.d.ts.map +1 -0
- package/dist/components/warning-message.js +12 -0
- package/dist/components/warning-message.js.map +1 -0
- package/dist/config/index.js +6 -6
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +1 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +28 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/paths.spec.d.ts +2 -0
- package/dist/config/paths.spec.d.ts.map +1 -0
- package/dist/config/paths.spec.js +114 -0
- package/dist/config/paths.spec.js.map +1 -0
- package/dist/config/themes.d.ts.map +1 -1
- package/dist/config/themes.js +19 -0
- package/dist/config/themes.js.map +1 -1
- package/dist/hooks/useChatHandler.d.ts.map +1 -1
- package/dist/hooks/useChatHandler.js +10 -71
- package/dist/hooks/useChatHandler.js.map +1 -1
- package/dist/hooks/useDirectoryTrust.d.ts.map +1 -1
- package/dist/hooks/useDirectoryTrust.js +4 -4
- package/dist/hooks/useDirectoryTrust.js.map +1 -1
- package/dist/hooks/useInputState.d.ts.map +1 -1
- package/dist/hooks/useInputState.js +95 -8
- package/dist/hooks/useInputState.js.map +1 -1
- package/dist/hooks/useToolHandler.d.ts +0 -1
- package/dist/hooks/useToolHandler.d.ts.map +1 -1
- package/dist/hooks/useToolHandler.js +9 -75
- package/dist/hooks/useToolHandler.js.map +1 -1
- package/dist/message-handler.d.ts.map +1 -1
- package/dist/message-handler.js +6 -11
- package/dist/message-handler.js.map +1 -1
- package/dist/models/models-dev-client.spec.js +1 -0
- package/dist/models/models-dev-client.spec.js.map +1 -1
- package/dist/tools/execute-bash.d.ts.map +1 -1
- package/dist/tools/execute-bash.js +5 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/types/ui.d.ts +1 -1
- package/dist/types/ui.d.ts.map +1 -1
- package/dist/types/utils.d.ts +2 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/usage/storage.d.ts +1 -1
- package/dist/usage/storage.d.ts.map +1 -1
- package/dist/usage/storage.js +55 -9
- package/dist/usage/storage.js.map +1 -1
- package/dist/usage/storage.spec.js +136 -2
- package/dist/usage/storage.spec.js.map +1 -1
- package/dist/utils/error-formatter.d.ts +22 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/error-formatter.js +27 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/error-formatter.spec.d.ts +2 -0
- package/dist/utils/error-formatter.spec.d.ts.map +1 -0
- package/dist/utils/error-formatter.spec.js +147 -0
- package/dist/utils/error-formatter.spec.js.map +1 -0
- package/dist/utils/fuzzy-matching.spec.js +1 -0
- package/dist/utils/fuzzy-matching.spec.js.map +1 -1
- package/dist/utils/installation-detector.d.ts +16 -0
- package/dist/utils/installation-detector.d.ts.map +1 -0
- package/dist/utils/installation-detector.js +118 -0
- package/dist/utils/installation-detector.js.map +1 -0
- package/dist/utils/installation-detector.spec.d.ts +2 -0
- package/dist/utils/installation-detector.spec.d.ts.map +1 -0
- package/dist/utils/installation-detector.spec.js +141 -0
- package/dist/utils/installation-detector.spec.js.map +1 -0
- package/dist/utils/message-queue.d.ts +2 -0
- package/dist/utils/message-queue.d.ts.map +1 -1
- package/dist/utils/message-queue.js +11 -0
- package/dist/utils/message-queue.js.map +1 -1
- package/dist/utils/paste-detection.d.ts.map +1 -1
- package/dist/utils/paste-detection.js +8 -3
- package/dist/utils/paste-detection.js.map +1 -1
- package/dist/utils/paste-detection.spec.js +15 -8
- package/dist/utils/paste-detection.spec.js.map +1 -1
- package/dist/utils/paste-utils.d.ts.map +1 -1
- package/dist/utils/paste-utils.js +4 -2
- package/dist/utils/paste-utils.js.map +1 -1
- package/dist/utils/paste-utils.spec.js +19 -3
- package/dist/utils/paste-utils.spec.js.map +1 -1
- package/dist/utils/tool-args-parser.d.ts +37 -0
- package/dist/utils/tool-args-parser.d.ts.map +1 -0
- package/dist/utils/tool-args-parser.js +50 -0
- package/dist/utils/tool-args-parser.js.map +1 -0
- package/dist/utils/tool-args-parser.spec.d.ts +2 -0
- package/dist/utils/tool-args-parser.spec.d.ts.map +1 -0
- package/dist/utils/tool-args-parser.spec.js +111 -0
- package/dist/utils/tool-args-parser.spec.js.map +1 -0
- package/dist/utils/tool-cancellation.d.ts +21 -0
- package/dist/utils/tool-cancellation.d.ts.map +1 -0
- package/dist/utils/tool-cancellation.js +27 -0
- package/dist/utils/tool-cancellation.js.map +1 -0
- package/dist/utils/tool-cancellation.spec.d.ts +2 -0
- package/dist/utils/tool-cancellation.spec.d.ts.map +1 -0
- package/dist/utils/tool-cancellation.spec.js +186 -0
- package/dist/utils/tool-cancellation.spec.js.map +1 -0
- package/dist/utils/tool-result-display.d.ts +15 -0
- package/dist/utils/tool-result-display.d.ts.map +1 -0
- package/dist/utils/tool-result-display.js +51 -0
- package/dist/utils/tool-result-display.js.map +1 -0
- package/dist/utils/update-checker.d.ts.map +1 -1
- package/dist/utils/update-checker.js +31 -3
- package/dist/utils/update-checker.js.map +1 -1
- package/dist/utils/update-checker.spec.js +68 -18
- package/dist/utils/update-checker.spec.js.map +1 -1
- package/dist/wizard/steps/location-step.js +2 -2
- package/dist/wizard/steps/location-step.js.map +1 -1
- 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;
|
|
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;
|
|
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:
|
|
5
|
-
charThreshold:
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
24
|
+
test('PasteDetector detects small paste', t => {
|
|
23
25
|
const detector = new PasteDetector();
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
t.
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
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,
|
|
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
|
|
8
|
-
const pastedText = '
|
|
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);
|
|
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":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAE9C,yCAAyC;AACzC,0DAA0D;AAE1D,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAErC,IAAI,CAAC,2CAA2C,EAAE,CAAC,CAAC,EAAE;IACrD,MAAM,UAAU,GAAG,
|
|
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 @@
|
|
|
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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"}
|