@spenceriam/impulse 0.15.0
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 +194 -0
- package/dist/api/client.d.ts +53 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +271 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/index.d.ts +6 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/stream.d.ts +98 -0
- package/dist/api/stream.d.ts.map +1 -0
- package/dist/api/stream.js +202 -0
- package/dist/api/stream.js.map +1 -0
- package/dist/api/types.d.ts +1353 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +143 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bash.txt +28 -0
- package/dist/bus/bus.d.ts +21 -0
- package/dist/bus/bus.d.ts.map +1 -0
- package/dist/bus/bus.js +22 -0
- package/dist/bus/bus.js.map +1 -0
- package/dist/bus/events.d.ts +100 -0
- package/dist/bus/events.d.ts.map +1 -0
- package/dist/bus/events.js +45 -0
- package/dist/bus/events.js.map +1 -0
- package/dist/bus/index.d.ts +3 -0
- package/dist/bus/index.d.ts.map +1 -0
- package/dist/bus/index.js +3 -0
- package/dist/bus/index.js.map +1 -0
- package/dist/file-edit.txt +21 -0
- package/dist/file-read.txt +18 -0
- package/dist/file-write.txt +16 -0
- package/dist/glob.txt +19 -0
- package/dist/global.d.ts +8 -0
- package/dist/global.d.ts.map +1 -0
- package/dist/global.js +14 -0
- package/dist/global.js.map +1 -0
- package/dist/grep.txt +20 -0
- package/dist/highlights-eq9cgrbb.scm +604 -0
- package/dist/highlights-ghv9g403.scm +205 -0
- package/dist/highlights-hk7bwhj4.scm +284 -0
- package/dist/highlights-r812a2qc.scm +150 -0
- package/dist/highlights-x6tmsnaa.scm +115 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62122 -0
- package/dist/index.js.map +1 -0
- package/dist/index.jsx +5 -0
- package/dist/index.jsx.map +1 -0
- package/dist/injections-73j83es3.scm +27 -0
- package/dist/input/at-refs.d.ts +42 -0
- package/dist/input/at-refs.d.ts.map +1 -0
- package/dist/input/at-refs.js +154 -0
- package/dist/input/at-refs.js.map +1 -0
- package/dist/input/history.d.ts +26 -0
- package/dist/input/history.d.ts.map +1 -0
- package/dist/input/history.js +109 -0
- package/dist/input/history.js.map +1 -0
- package/dist/input/index.d.ts +5 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +5 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/paste.d.ts +19 -0
- package/dist/input/paste.d.ts.map +1 -0
- package/dist/input/paste.js +75 -0
- package/dist/input/paste.js.map +1 -0
- package/dist/input/shortcuts.d.ts +6 -0
- package/dist/input/shortcuts.d.ts.map +1 -0
- package/dist/input/shortcuts.js +84 -0
- package/dist/input/shortcuts.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/manager.d.ts +51 -0
- package/dist/mcp/manager.d.ts.map +1 -0
- package/dist/mcp/manager.js +158 -0
- package/dist/mcp/manager.js.map +1 -0
- package/dist/mcp/types.d.ts +18 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/session/todo.d.ts +24 -0
- package/dist/session/todo.d.ts.map +1 -0
- package/dist/session/todo.js +39 -0
- package/dist/session/todo.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +13 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +84 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/task.txt +26 -0
- package/dist/todo-read.txt +14 -0
- package/dist/todo-write.txt +166 -0
- package/dist/tools/bash.d.ts +22 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +70 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file-edit.d.ts +22 -0
- package/dist/tools/file-edit.d.ts.map +1 -0
- package/dist/tools/file-edit.js +67 -0
- package/dist/tools/file-edit.js.map +1 -0
- package/dist/tools/file-read.d.ts +19 -0
- package/dist/tools/file-read.d.ts.map +1 -0
- package/dist/tools/file-read.js +70 -0
- package/dist/tools/file-read.js.map +1 -0
- package/dist/tools/file-write.d.ts +16 -0
- package/dist/tools/file-write.d.ts.map +1 -0
- package/dist/tools/file-write.js +45 -0
- package/dist/tools/file-write.js.map +1 -0
- package/dist/tools/glob.d.ts +16 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +45 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +19 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +65 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +75 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/task.d.ts +19 -0
- package/dist/tools/task.d.ts.map +1 -0
- package/dist/tools/task.js +51 -0
- package/dist/tools/task.js.map +1 -0
- package/dist/tools/todo-read.d.ts +7 -0
- package/dist/tools/todo-read.d.ts.map +1 -0
- package/dist/tools/todo-read.js +56 -0
- package/dist/tools/todo-read.js.map +1 -0
- package/dist/tools/todo-write.d.ts +38 -0
- package/dist/tools/todo-write.d.ts.map +1 -0
- package/dist/tools/todo-write.js +40 -0
- package/dist/tools/todo-write.js.map +1 -0
- package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.jsx +37 -0
- package/dist/ui/App.jsx.map +1 -0
- package/dist/ui/components/Autocomplete.d.ts +24 -0
- package/dist/ui/components/Autocomplete.d.ts.map +1 -0
- package/dist/ui/components/Autocomplete.jsx +67 -0
- package/dist/ui/components/Autocomplete.jsx.map +1 -0
- package/dist/ui/components/ChatView.d.ts +14 -0
- package/dist/ui/components/ChatView.d.ts.map +1 -0
- package/dist/ui/components/ChatView.jsx +11 -0
- package/dist/ui/components/ChatView.jsx.map +1 -0
- package/dist/ui/components/InputArea.d.ts +18 -0
- package/dist/ui/components/InputArea.d.ts.map +1 -0
- package/dist/ui/components/InputArea.jsx +35 -0
- package/dist/ui/components/InputArea.jsx.map +1 -0
- package/dist/ui/components/MessageBlock.d.ts +21 -0
- package/dist/ui/components/MessageBlock.d.ts.map +1 -0
- package/dist/ui/components/MessageBlock.jsx +94 -0
- package/dist/ui/components/MessageBlock.jsx.map +1 -0
- package/dist/ui/components/Overlay.d.ts +28 -0
- package/dist/ui/components/Overlay.d.ts.map +1 -0
- package/dist/ui/components/Overlay.jsx +102 -0
- package/dist/ui/components/Overlay.jsx.map +1 -0
- package/dist/ui/components/ProgressBar.d.ts +9 -0
- package/dist/ui/components/ProgressBar.d.ts.map +1 -0
- package/dist/ui/components/ProgressBar.jsx +17 -0
- package/dist/ui/components/ProgressBar.jsx.map +1 -0
- package/dist/ui/components/Sidebar.d.ts +22 -0
- package/dist/ui/components/Sidebar.d.ts.map +1 -0
- package/dist/ui/components/Sidebar.jsx +96 -0
- package/dist/ui/components/Sidebar.jsx.map +1 -0
- package/dist/ui/components/StatusLine.d.ts +6 -0
- package/dist/ui/components/StatusLine.d.ts.map +1 -0
- package/dist/ui/components/StatusLine.jsx +32 -0
- package/dist/ui/components/StatusLine.jsx.map +1 -0
- package/dist/ui/components/ThinkingBlock.d.ts +15 -0
- package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
- package/dist/ui/components/ThinkingBlock.jsx +33 -0
- package/dist/ui/components/ThinkingBlock.jsx.map +1 -0
- package/dist/ui/components/TodoItem.d.ts +22 -0
- package/dist/ui/components/TodoItem.d.ts.map +1 -0
- package/dist/ui/components/TodoItem.jsx +11 -0
- package/dist/ui/components/TodoItem.jsx.map +1 -0
- package/dist/ui/components/ToolBlock.d.ts +27 -0
- package/dist/ui/components/ToolBlock.d.ts.map +1 -0
- package/dist/ui/components/ToolBlock.jsx +76 -0
- package/dist/ui/components/ToolBlock.jsx.map +1 -0
- package/dist/ui/components/index.d.ts +12 -0
- package/dist/ui/components/index.d.ts.map +1 -0
- package/dist/ui/components/index.js +12 -0
- package/dist/ui/components/index.js.map +1 -0
- package/dist/ui/context/index.d.ts +4 -0
- package/dist/ui/context/index.d.ts.map +1 -0
- package/dist/ui/context/index.js +4 -0
- package/dist/ui/context/index.js.map +1 -0
- package/dist/ui/context/mode.d.ts +24 -0
- package/dist/ui/context/mode.d.ts.map +1 -0
- package/dist/ui/context/mode.jsx +53 -0
- package/dist/ui/context/mode.jsx.map +1 -0
- package/dist/ui/context/session.d.ts +43 -0
- package/dist/ui/context/session.d.ts.map +1 -0
- package/dist/ui/context/session.jsx +63 -0
- package/dist/ui/context/session.jsx.map +1 -0
- package/dist/ui/context/todo.d.ts +32 -0
- package/dist/ui/context/todo.d.ts.map +1 -0
- package/dist/ui/context/todo.jsx +75 -0
- package/dist/ui/context/todo.jsx.map +1 -0
- package/dist/ui/design.d.ts +182 -0
- package/dist/ui/design.d.ts.map +1 -0
- package/dist/ui/design.js +189 -0
- package/dist/ui/design.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/util/config.d.ts +22 -0
- package/dist/util/config.d.ts.map +1 -0
- package/dist/util/config.js +55 -0
- package/dist/util/config.js.map +1 -0
- package/dist/util/instructions.d.ts +39 -0
- package/dist/util/instructions.d.ts.map +1 -0
- package/dist/util/instructions.js +96 -0
- package/dist/util/instructions.js.map +1 -0
- package/dist/util/lock.d.ts +18 -0
- package/dist/util/lock.d.ts.map +1 -0
- package/dist/util/lock.js +65 -0
- package/dist/util/lock.js.map +1 -0
- package/dist/util/logger.d.ts +8 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +81 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC"}
|
package/dist/index.jsx
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,CAAC,GAAG,EAAE;IACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
; Query from: https://raw.githubusercontent.com/nvim-treesitter/nvim-treesitter/refs/heads/master/queries/markdown/injections.scm
|
|
2
|
+
(fenced_code_block
|
|
3
|
+
(info_string
|
|
4
|
+
(language) @_lang)
|
|
5
|
+
(code_fence_content) @injection.content
|
|
6
|
+
(#set-lang-from-info-string! @_lang))
|
|
7
|
+
|
|
8
|
+
((html_block) @injection.content
|
|
9
|
+
(#set! injection.language "html")
|
|
10
|
+
(#set! injection.combined)
|
|
11
|
+
(#set! injection.include-children))
|
|
12
|
+
|
|
13
|
+
((minus_metadata) @injection.content
|
|
14
|
+
(#set! injection.language "yaml")
|
|
15
|
+
(#offset! @injection.content 1 0 -1 0)
|
|
16
|
+
(#set! injection.include-children))
|
|
17
|
+
|
|
18
|
+
((plus_metadata) @injection.content
|
|
19
|
+
(#set! injection.language "toml")
|
|
20
|
+
(#offset! @injection.content 1 0 -1 0)
|
|
21
|
+
(#set! injection.include-children))
|
|
22
|
+
|
|
23
|
+
([
|
|
24
|
+
(inline)
|
|
25
|
+
(pipe_table_cell)
|
|
26
|
+
] @injection.content
|
|
27
|
+
(#set! injection.language "markdown_inline"))
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ Reference Parser
|
|
3
|
+
* Parses @ file/directory references with fuzzy matching and line range support
|
|
4
|
+
*/
|
|
5
|
+
export interface AtReference {
|
|
6
|
+
fullMatch: string;
|
|
7
|
+
path: string;
|
|
8
|
+
lineRange?: {
|
|
9
|
+
start: number;
|
|
10
|
+
end: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface AtCandidate {
|
|
14
|
+
path: string;
|
|
15
|
+
display: string;
|
|
16
|
+
type: "file" | "directory";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse @ reference from input
|
|
20
|
+
* Supports:
|
|
21
|
+
* - @file - file reference
|
|
22
|
+
* - @~ - home directory expansion
|
|
23
|
+
* - @dir/ - directory reference
|
|
24
|
+
* - @file#10-20 - line range reference
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseAtReference(input: string, cursorPosition: number): {
|
|
27
|
+
reference: AtReference | null;
|
|
28
|
+
position: number;
|
|
29
|
+
} | null;
|
|
30
|
+
/**
|
|
31
|
+
* Get completion candidates for @ reference
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAtCandidates(partialPath: string, workingDirectory?: string): Promise<AtCandidate[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Filter candidates by fuzzy match
|
|
36
|
+
*/
|
|
37
|
+
export declare function filterCandidatesByFuzzy(candidates: AtCandidate[], searchTerm: string): AtCandidate[];
|
|
38
|
+
/**
|
|
39
|
+
* Format reference with line range
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatReference(reference: AtReference): string;
|
|
42
|
+
//# sourceMappingURL=at-refs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"at-refs.d.ts","sourceRoot":"","sources":["../../src/input/at-refs.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB;IAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuD5D;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,gBAAgB,GAAE,MAAsB,GACvC,OAAO,CAAC,WAAW,EAAE,CAAC,CA0DxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,WAAW,EAAE,EACzB,UAAU,EAAE,MAAM,GACjB,WAAW,EAAE,CA2Bf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,CAQ9D"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { glob } from "glob";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import os from "os";
|
|
4
|
+
/**
|
|
5
|
+
* Parse @ reference from input
|
|
6
|
+
* Supports:
|
|
7
|
+
* - @file - file reference
|
|
8
|
+
* - @~ - home directory expansion
|
|
9
|
+
* - @dir/ - directory reference
|
|
10
|
+
* - @file#10-20 - line range reference
|
|
11
|
+
*/
|
|
12
|
+
export function parseAtReference(input, cursorPosition) {
|
|
13
|
+
// Find @ before cursor
|
|
14
|
+
const beforeCursor = input.slice(0, cursorPosition);
|
|
15
|
+
const atIndex = beforeCursor.lastIndexOf("@");
|
|
16
|
+
if (atIndex === -1) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Get reference text after @
|
|
20
|
+
const refText = input.slice(atIndex, cursorPosition);
|
|
21
|
+
// Validate reference (must contain something after @)
|
|
22
|
+
if (refText.length <= 1) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
let filePath = refText.slice(1);
|
|
26
|
+
let lineRange;
|
|
27
|
+
// Parse line range (e.g., @file#10-20)
|
|
28
|
+
const lineMatch = filePath.match(/^(.+?)#(\d+)(?:-(\d+))?$/);
|
|
29
|
+
if (lineMatch && lineMatch[1] && lineMatch[2]) {
|
|
30
|
+
filePath = lineMatch[1];
|
|
31
|
+
const start = parseInt(lineMatch[2], 10);
|
|
32
|
+
const end = lineMatch[3] ? parseInt(lineMatch[3], 10) : start;
|
|
33
|
+
lineRange = { start, end };
|
|
34
|
+
}
|
|
35
|
+
// Handle @~ home directory
|
|
36
|
+
if (filePath.startsWith("~")) {
|
|
37
|
+
const homeDir = os.homedir();
|
|
38
|
+
if (homeDir) {
|
|
39
|
+
filePath = path.join(homeDir, filePath.slice(1));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (lineRange) {
|
|
43
|
+
return {
|
|
44
|
+
reference: {
|
|
45
|
+
fullMatch: refText,
|
|
46
|
+
path: filePath || "",
|
|
47
|
+
lineRange,
|
|
48
|
+
},
|
|
49
|
+
position: atIndex,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
reference: {
|
|
54
|
+
fullMatch: refText,
|
|
55
|
+
path: filePath || "",
|
|
56
|
+
},
|
|
57
|
+
position: atIndex,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get completion candidates for @ reference
|
|
62
|
+
*/
|
|
63
|
+
export async function getAtCandidates(partialPath, workingDirectory = process.cwd()) {
|
|
64
|
+
let searchPath = partialPath;
|
|
65
|
+
// Handle @~ home directory
|
|
66
|
+
if (searchPath.startsWith("~")) {
|
|
67
|
+
searchPath = path.join(os.homedir(), searchPath.slice(1));
|
|
68
|
+
}
|
|
69
|
+
// If path is empty or just ~, use working directory or home
|
|
70
|
+
if (!searchPath || searchPath === "~") {
|
|
71
|
+
searchPath = workingDirectory;
|
|
72
|
+
}
|
|
73
|
+
const candidates = [];
|
|
74
|
+
try {
|
|
75
|
+
// Search for files and directories
|
|
76
|
+
const pattern = path.join(searchPath, "**/*");
|
|
77
|
+
const files = await glob(pattern, {
|
|
78
|
+
nodir: true,
|
|
79
|
+
windowsPathsNoEscape: true,
|
|
80
|
+
ignore: [
|
|
81
|
+
"**/node_modules/**",
|
|
82
|
+
"**/.git/**",
|
|
83
|
+
"**/dist/**",
|
|
84
|
+
"**/build/**",
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
const dirPattern = path.join(searchPath, "*/");
|
|
88
|
+
const dirs = await glob(dirPattern, {
|
|
89
|
+
windowsPathsNoEscape: true,
|
|
90
|
+
});
|
|
91
|
+
// Add file candidates
|
|
92
|
+
for (const file of files.slice(0, 50)) {
|
|
93
|
+
const relativePath = path.relative(workingDirectory, file);
|
|
94
|
+
candidates.push({
|
|
95
|
+
path: file,
|
|
96
|
+
display: relativePath,
|
|
97
|
+
type: "file",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
// Add directory candidates
|
|
101
|
+
for (const dir of dirs.slice(0, 20)) {
|
|
102
|
+
const relativePath = path.relative(workingDirectory, dir.slice(0, -1)); // Remove trailing /
|
|
103
|
+
candidates.push({
|
|
104
|
+
path: dir.slice(0, -1),
|
|
105
|
+
display: relativePath + "/",
|
|
106
|
+
type: "directory",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error("Error getting @ candidates:", error);
|
|
112
|
+
}
|
|
113
|
+
return candidates;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Filter candidates by fuzzy match
|
|
117
|
+
*/
|
|
118
|
+
export function filterCandidatesByFuzzy(candidates, searchTerm) {
|
|
119
|
+
if (!searchTerm) {
|
|
120
|
+
return candidates;
|
|
121
|
+
}
|
|
122
|
+
const lowerSearch = searchTerm.toLowerCase();
|
|
123
|
+
return candidates
|
|
124
|
+
.filter((candidate) => {
|
|
125
|
+
const lowerPath = candidate.display.toLowerCase();
|
|
126
|
+
// Exact match
|
|
127
|
+
if (lowerPath.includes(lowerSearch)) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
// Fuzzy match (all characters in order)
|
|
131
|
+
let searchIndex = 0;
|
|
132
|
+
for (const char of lowerPath) {
|
|
133
|
+
if (char === lowerSearch[searchIndex]) {
|
|
134
|
+
searchIndex++;
|
|
135
|
+
if (searchIndex >= lowerSearch.length) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
})
|
|
142
|
+
.slice(0, 10); // Limit to 10 results
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Format reference with line range
|
|
146
|
+
*/
|
|
147
|
+
export function formatReference(reference) {
|
|
148
|
+
let result = `@${reference.path}`;
|
|
149
|
+
if (reference.lineRange) {
|
|
150
|
+
result += `#${reference.lineRange.start}-${reference.lineRange.end}`;
|
|
151
|
+
}
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=at-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"at-refs.js","sourceRoot":"","sources":["../../src/input/at-refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAsBpB;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,cAAsB;IAEtB,uBAAuB;IACvB,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAErD,sDAAsD;IACtD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,SAAqD,CAAC;IAE1D,uCAAuC;IACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7D,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9D,SAAS,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED,2BAA2B;IAC3B,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,SAAS,EAAE;gBACT,SAAS,EAAE,OAAO;gBAClB,IAAI,EAAE,QAAQ,IAAI,EAAE;gBACpB,SAAS;aACV;YACD,QAAQ,EAAE,OAAO;SAClB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE;YACT,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ,IAAI,EAAE;SACrB;QACD,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,mBAA2B,OAAO,CAAC,GAAG,EAAE;IAExC,IAAI,UAAU,GAAG,WAAW,CAAC;IAE7B,2BAA2B;IAC3B,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACtC,UAAU,GAAG,gBAAgB,CAAC;IAChC,CAAC;IAED,MAAM,UAAU,GAAkB,EAAE,CAAC;IAErC,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;YAChC,KAAK,EAAE,IAAI;YACX,oBAAoB,EAAE,IAAI;YAC1B,MAAM,EAAE;gBACN,oBAAoB;gBACpB,YAAY;gBACZ,YAAY;gBACZ,aAAa;aACd;SACF,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE;YAClC,oBAAoB,EAAE,IAAI;SAC3B,CAAC,CAAC;QAEH,sBAAsB;QACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB;YAC5F,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,OAAO,EAAE,YAAY,GAAG,GAAG;gBAC3B,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAyB,EACzB,UAAkB;IAElB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IAE7C,OAAO,UAAU;SACd,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;QACpB,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,cAAc;QACd,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,wCAAwC;QACxC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,WAAW,EAAE,CAAC;gBACd,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAsB;IACpD,IAAI,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;IAElC,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,IAAI,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Input History Manager
|
|
3
|
+
* Manages submitted inputs for navigation with up/down arrows
|
|
4
|
+
*/
|
|
5
|
+
export interface InputHistory {
|
|
6
|
+
items: string[];
|
|
7
|
+
currentIndex: number;
|
|
8
|
+
currentInput: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function useInputHistory(): {
|
|
11
|
+
addItem: (input: string) => void;
|
|
12
|
+
goBack: () => string;
|
|
13
|
+
goForward: () => string;
|
|
14
|
+
reset: () => void;
|
|
15
|
+
storeCurrentInput: (input: string) => void;
|
|
16
|
+
getState: () => {
|
|
17
|
+
items: string[];
|
|
18
|
+
currentIndex: number;
|
|
19
|
+
currentInput: string;
|
|
20
|
+
canGoBack: boolean;
|
|
21
|
+
canGoForward: boolean;
|
|
22
|
+
isNavigating: boolean;
|
|
23
|
+
};
|
|
24
|
+
clear: () => void;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/input/history.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,eAAe;qBAQL,MAAM,KAAG,IAAI;kBAiBlB,MAAM;qBA8BH,MAAM;iBA2BV,IAAI;+BAOY,MAAM,KAAG,IAAI;;;;;;;;;iBAmB7B,IAAI;EAevB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createSignal } from "solid-js";
|
|
2
|
+
export function useInputHistory() {
|
|
3
|
+
const [items, setItems] = createSignal([]);
|
|
4
|
+
const [currentIndex, setCurrentIndex] = createSignal(-1);
|
|
5
|
+
const [currentInput, setCurrentInput] = createSignal("");
|
|
6
|
+
/**
|
|
7
|
+
* Add a new item to history
|
|
8
|
+
*/
|
|
9
|
+
const addItem = (input) => {
|
|
10
|
+
if (!input.trim()) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// Don't add if same as last item
|
|
14
|
+
if (items()[0] === input) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
setItems((prev) => [input, ...prev]);
|
|
18
|
+
setCurrentIndex(-1);
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Navigate to previous input (up arrow)
|
|
22
|
+
*/
|
|
23
|
+
const goBack = () => {
|
|
24
|
+
const historyItems = items();
|
|
25
|
+
if (historyItems.length === 0) {
|
|
26
|
+
return currentInput();
|
|
27
|
+
}
|
|
28
|
+
// If we're not in history, start from beginning
|
|
29
|
+
if (currentIndex() === -1) {
|
|
30
|
+
setCurrentIndex(0);
|
|
31
|
+
const item = historyItems[0];
|
|
32
|
+
if (item) {
|
|
33
|
+
setCurrentInput(item);
|
|
34
|
+
}
|
|
35
|
+
return item || "";
|
|
36
|
+
}
|
|
37
|
+
// Move to previous item
|
|
38
|
+
const newIndex = Math.min(currentIndex() + 1, historyItems.length - 1);
|
|
39
|
+
setCurrentIndex(newIndex);
|
|
40
|
+
const item = historyItems[newIndex];
|
|
41
|
+
if (item) {
|
|
42
|
+
setCurrentInput(item);
|
|
43
|
+
}
|
|
44
|
+
return item || "";
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Navigate to next input (down arrow)
|
|
48
|
+
*/
|
|
49
|
+
const goForward = () => {
|
|
50
|
+
const historyItems = items();
|
|
51
|
+
if (currentIndex() === -1) {
|
|
52
|
+
return currentInput();
|
|
53
|
+
}
|
|
54
|
+
// Move to next item
|
|
55
|
+
const newIndex = currentIndex() - 1;
|
|
56
|
+
if (newIndex < 0) {
|
|
57
|
+
// Back to current input
|
|
58
|
+
setCurrentIndex(-1);
|
|
59
|
+
return currentInput();
|
|
60
|
+
}
|
|
61
|
+
setCurrentIndex(newIndex);
|
|
62
|
+
const item = historyItems[newIndex];
|
|
63
|
+
if (item) {
|
|
64
|
+
setCurrentInput(item);
|
|
65
|
+
}
|
|
66
|
+
return item || "";
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Reset history navigation (back to current input)
|
|
70
|
+
*/
|
|
71
|
+
const reset = () => {
|
|
72
|
+
setCurrentIndex(-1);
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Store the current unsaved input
|
|
76
|
+
*/
|
|
77
|
+
const storeCurrentInput = (input) => {
|
|
78
|
+
setCurrentInput(input);
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Get current navigation state
|
|
82
|
+
*/
|
|
83
|
+
const getState = () => ({
|
|
84
|
+
items: items(),
|
|
85
|
+
currentIndex: currentIndex(),
|
|
86
|
+
currentInput: currentInput(),
|
|
87
|
+
canGoBack: currentIndex() < items().length - 1,
|
|
88
|
+
canGoForward: currentIndex() > -1,
|
|
89
|
+
isNavigating: currentIndex() !== -1,
|
|
90
|
+
});
|
|
91
|
+
/**
|
|
92
|
+
* Clear all history
|
|
93
|
+
*/
|
|
94
|
+
const clear = () => {
|
|
95
|
+
setItems([]);
|
|
96
|
+
setCurrentIndex(-1);
|
|
97
|
+
setCurrentInput("");
|
|
98
|
+
};
|
|
99
|
+
return {
|
|
100
|
+
addItem,
|
|
101
|
+
goBack,
|
|
102
|
+
goForward,
|
|
103
|
+
reset,
|
|
104
|
+
storeCurrentInput,
|
|
105
|
+
getState,
|
|
106
|
+
clear,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/input/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paste Event Handler
|
|
3
|
+
* Detects and handles multi-line paste events
|
|
4
|
+
*/
|
|
5
|
+
export interface PasteEvent {
|
|
6
|
+
content: string;
|
|
7
|
+
isPaste: boolean;
|
|
8
|
+
lineCount: number;
|
|
9
|
+
isImage?: boolean;
|
|
10
|
+
imageIndex?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function usePasteHandler(): {
|
|
13
|
+
handleInput: (value: string, previousValue: string) => PasteEvent;
|
|
14
|
+
handleImagePaste: () => PasteEvent;
|
|
15
|
+
getIndicator: () => string | null;
|
|
16
|
+
clearIndicator: () => void;
|
|
17
|
+
imageCount: () => number;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=paste.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste.d.ts","sourceRoot":"","sources":["../../src/input/paste.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,eAAe;yBAUD,MAAM,iBAAiB,MAAM,KAAG,UAAU;4BAkCzC,UAAU;;;;EA2CxC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createSignal } from "solid-js";
|
|
2
|
+
const PASTE_THRESHOLD_MS = 100;
|
|
3
|
+
export function usePasteHandler() {
|
|
4
|
+
const [pasteIndicator, setPasteIndicator] = createSignal(null);
|
|
5
|
+
const [imageCount, setImageCount] = createSignal(0);
|
|
6
|
+
let lastKeyPressTime = 0;
|
|
7
|
+
let pendingPasteTimeout = null;
|
|
8
|
+
/**
|
|
9
|
+
* Handle input change - detect paste vs typing
|
|
10
|
+
*/
|
|
11
|
+
const handleInput = (value, previousValue) => {
|
|
12
|
+
const now = Date.now();
|
|
13
|
+
const timeSinceLastKey = now - lastKeyPressTime;
|
|
14
|
+
// If large amount of text added quickly, it's likely a paste
|
|
15
|
+
const lineCount = (value.match(/\n/g) || []).length + 1;
|
|
16
|
+
const addedLines = value.length - previousValue.length;
|
|
17
|
+
const likelyPaste = addedLines > 20 || (addedLines > 3 && timeSinceLastKey < PASTE_THRESHOLD_MS);
|
|
18
|
+
if (likelyPaste) {
|
|
19
|
+
const indicator = `[Pasted ~${lineCount} lines]`;
|
|
20
|
+
setPasteIndicator(indicator);
|
|
21
|
+
if (pendingPasteTimeout) {
|
|
22
|
+
clearTimeout(pendingPasteTimeout);
|
|
23
|
+
}
|
|
24
|
+
pendingPasteTimeout = setTimeout(() => {
|
|
25
|
+
setPasteIndicator(null);
|
|
26
|
+
}, 3000);
|
|
27
|
+
}
|
|
28
|
+
lastKeyPressTime = now;
|
|
29
|
+
return {
|
|
30
|
+
content: value,
|
|
31
|
+
isPaste: likelyPaste,
|
|
32
|
+
lineCount,
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Handle image paste
|
|
37
|
+
*/
|
|
38
|
+
const handleImagePaste = () => {
|
|
39
|
+
setImageCount((count) => count + 1);
|
|
40
|
+
const currentCount = imageCount() + 1;
|
|
41
|
+
const indicator = `[Image ${currentCount}]`;
|
|
42
|
+
setPasteIndicator(indicator);
|
|
43
|
+
if (pendingPasteTimeout) {
|
|
44
|
+
clearTimeout(pendingPasteTimeout);
|
|
45
|
+
}
|
|
46
|
+
pendingPasteTimeout = setTimeout(() => {
|
|
47
|
+
setPasteIndicator(null);
|
|
48
|
+
}, 3000);
|
|
49
|
+
return {
|
|
50
|
+
content: "",
|
|
51
|
+
isPaste: true,
|
|
52
|
+
lineCount: 0,
|
|
53
|
+
isImage: true,
|
|
54
|
+
imageIndex: currentCount,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Get current paste indicator
|
|
59
|
+
*/
|
|
60
|
+
const getIndicator = () => pasteIndicator();
|
|
61
|
+
/**
|
|
62
|
+
* Clear paste indicator manually
|
|
63
|
+
*/
|
|
64
|
+
const clearIndicator = () => {
|
|
65
|
+
setPasteIndicator(null);
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
handleInput,
|
|
69
|
+
handleImagePaste,
|
|
70
|
+
getIndicator,
|
|
71
|
+
clearIndicator,
|
|
72
|
+
imageCount: () => imageCount(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=paste.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste.js","sourceRoot":"","sources":["../../src/input/paste.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAexC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAgB,IAAI,CAAC,CAAC;IAC9E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,YAAY,CAAS,CAAC,CAAC,CAAC;IAE5D,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,mBAAmB,GAAyC,IAAI,CAAC;IAErE;;OAEG;IACH,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,aAAqB,EAAc,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,gBAAgB,GAAG,GAAG,GAAG,gBAAgB,CAAC;QAEhD,6DAA6D;QAC7D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QACvD,MAAM,WAAW,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;QAEjG,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,YAAY,SAAS,SAAS,CAAC;YACjD,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE7B,IAAI,mBAAmB,EAAE,CAAC;gBACxB,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACpC,CAAC;YAED,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAED,gBAAgB,GAAG,GAAG,CAAC;QAEvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,WAAW;YACpB,SAAS;SACV,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,gBAAgB,GAAG,GAAe,EAAE;QACxC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,UAAU,EAAE,GAAG,CAAC,CAAC;QAEtC,MAAM,SAAS,GAAG,UAAU,YAAY,GAAG,CAAC;QAC5C,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE7B,IAAI,mBAAmB,EAAE,CAAC;YACxB,YAAY,CAAC,mBAAmB,CAAC,CAAC;QACpC,CAAC;QAED,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,EAAE,IAAI,CAAC,CAAC;QAET,OAAO;YACL,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,YAAY;SACzB,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IAE5C;;OAEG;IACH,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACL,WAAW;QACX,gBAAgB;QAChB,YAAY;QACZ,cAAc;QACd,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../src/input/shortcuts.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AACH,wBAAgB,kBAAkB,SAmEjC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { onMount, onCleanup } from "solid-js";
|
|
2
|
+
import { useKeyboard } from "@opentui/solid";
|
|
3
|
+
import { useMode, useSession } from "../ui/context";
|
|
4
|
+
/**
|
|
5
|
+
* Keyboard Shortcut Definitions
|
|
6
|
+
*/
|
|
7
|
+
const SHORTCUTS = {
|
|
8
|
+
TAB: "tab",
|
|
9
|
+
SHIFT_TAB: "shift+tab",
|
|
10
|
+
CTRL_P: "ctrl+p",
|
|
11
|
+
CTRL_M: "ctrl+m",
|
|
12
|
+
ESCAPE: "escape",
|
|
13
|
+
CTRL_C: "ctrl+c",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Keyboard Handler
|
|
17
|
+
* Global keyboard shortcut handler for mode switching, commands, etc.
|
|
18
|
+
*/
|
|
19
|
+
export function useKeyboardHandler() {
|
|
20
|
+
const { cycleMode, cycleModeReverse } = useMode();
|
|
21
|
+
const { setThinking } = useSession();
|
|
22
|
+
let ctrlCCount = 0;
|
|
23
|
+
let ctrlCTimeout = null;
|
|
24
|
+
let escCount = 0;
|
|
25
|
+
let escTimeout = null;
|
|
26
|
+
onMount(() => {
|
|
27
|
+
useKeyboard((key) => {
|
|
28
|
+
// Mode cycling
|
|
29
|
+
if (key.name === SHORTCUTS.TAB) {
|
|
30
|
+
if (key.shift) {
|
|
31
|
+
cycleModeReverse();
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
cycleMode();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Toggle thinking mode
|
|
38
|
+
if (key.ctrl && key.name === "t") {
|
|
39
|
+
setThinking((t) => !t);
|
|
40
|
+
}
|
|
41
|
+
// Command palette (Ctrl+P)
|
|
42
|
+
if (key.ctrl && key.name === "p") {
|
|
43
|
+
// TODO: Open command palette overlay
|
|
44
|
+
}
|
|
45
|
+
// MCP status (Ctrl+M)
|
|
46
|
+
if (key.ctrl && key.name === "m") {
|
|
47
|
+
// TODO: Open MCP status overlay
|
|
48
|
+
}
|
|
49
|
+
// Double-press escape for cancel
|
|
50
|
+
if (key.name === SHORTCUTS.ESCAPE) {
|
|
51
|
+
escCount++;
|
|
52
|
+
if (escCount >= 2) {
|
|
53
|
+
escCount = 0;
|
|
54
|
+
// TODO: Cancel current operation
|
|
55
|
+
}
|
|
56
|
+
if (escTimeout)
|
|
57
|
+
clearTimeout(escTimeout);
|
|
58
|
+
escTimeout = setTimeout(() => {
|
|
59
|
+
escCount = 0;
|
|
60
|
+
}, 300);
|
|
61
|
+
}
|
|
62
|
+
// Double-press Ctrl+C for exit
|
|
63
|
+
if (key.ctrl && key.name === "c") {
|
|
64
|
+
ctrlCCount++;
|
|
65
|
+
if (ctrlCCount >= 2) {
|
|
66
|
+
ctrlCCount = 0;
|
|
67
|
+
// Exit handled by App.tsx renderer.destroy()
|
|
68
|
+
}
|
|
69
|
+
if (ctrlCTimeout)
|
|
70
|
+
clearTimeout(ctrlCTimeout);
|
|
71
|
+
ctrlCTimeout = setTimeout(() => {
|
|
72
|
+
ctrlCCount = 0;
|
|
73
|
+
}, 500);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
onCleanup(() => {
|
|
78
|
+
if (ctrlCTimeout)
|
|
79
|
+
clearTimeout(ctrlCTimeout);
|
|
80
|
+
if (escTimeout)
|
|
81
|
+
clearTimeout(escTimeout);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=shortcuts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../src/input/shortcuts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|