@shareai-lab/kode 1.1.13 → 1.1.16-dev.1
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/dist/entrypoints/cli.js +59 -38
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/index.js +5 -26
- package/dist/package.json +4 -1
- package/package.json +11 -104
- package/dist/test/testAdapters.js +0 -88
- package/dist/test/testAdapters.js.map +0 -1
- package/src/ProjectOnboarding.tsx +0 -198
- package/src/Tool.ts +0 -83
- package/src/commands/agents.tsx +0 -3416
- package/src/commands/approvedTools.ts +0 -53
- package/src/commands/bug.tsx +0 -20
- package/src/commands/clear.ts +0 -43
- package/src/commands/compact.ts +0 -120
- package/src/commands/config.tsx +0 -19
- package/src/commands/cost.ts +0 -18
- package/src/commands/ctx_viz.ts +0 -209
- package/src/commands/doctor.ts +0 -24
- package/src/commands/help.tsx +0 -19
- package/src/commands/init.ts +0 -37
- package/src/commands/listen.ts +0 -42
- package/src/commands/login.tsx +0 -51
- package/src/commands/logout.tsx +0 -40
- package/src/commands/mcp.ts +0 -41
- package/src/commands/model.tsx +0 -40
- package/src/commands/modelstatus.tsx +0 -20
- package/src/commands/onboarding.tsx +0 -34
- package/src/commands/pr_comments.ts +0 -59
- package/src/commands/refreshCommands.ts +0 -54
- package/src/commands/release-notes.ts +0 -34
- package/src/commands/resume.tsx +0 -31
- package/src/commands/review.ts +0 -49
- package/src/commands/terminalSetup.ts +0 -221
- package/src/commands.ts +0 -139
- package/src/components/ApproveApiKey.tsx +0 -93
- package/src/components/AsciiLogo.tsx +0 -13
- package/src/components/AutoUpdater.tsx +0 -148
- package/src/components/Bug.tsx +0 -367
- package/src/components/Config.tsx +0 -293
- package/src/components/ConsoleOAuthFlow.tsx +0 -327
- package/src/components/Cost.tsx +0 -23
- package/src/components/CostThresholdDialog.tsx +0 -46
- package/src/components/CustomSelect/option-map.ts +0 -42
- package/src/components/CustomSelect/select-option.tsx +0 -78
- package/src/components/CustomSelect/select.tsx +0 -152
- package/src/components/CustomSelect/theme.ts +0 -45
- package/src/components/CustomSelect/use-select-state.ts +0 -414
- package/src/components/CustomSelect/use-select.ts +0 -35
- package/src/components/FallbackToolUseRejectedMessage.tsx +0 -15
- package/src/components/FileEditToolUpdatedMessage.tsx +0 -66
- package/src/components/Help.tsx +0 -215
- package/src/components/HighlightedCode.tsx +0 -33
- package/src/components/InvalidConfigDialog.tsx +0 -113
- package/src/components/Link.tsx +0 -32
- package/src/components/LogSelector.tsx +0 -86
- package/src/components/Logo.tsx +0 -170
- package/src/components/MCPServerApprovalDialog.tsx +0 -100
- package/src/components/MCPServerDialogCopy.tsx +0 -25
- package/src/components/MCPServerMultiselectDialog.tsx +0 -109
- package/src/components/Message.tsx +0 -221
- package/src/components/MessageResponse.tsx +0 -15
- package/src/components/MessageSelector.tsx +0 -211
- package/src/components/ModeIndicator.tsx +0 -88
- package/src/components/ModelConfig.tsx +0 -301
- package/src/components/ModelListManager.tsx +0 -227
- package/src/components/ModelSelector.tsx +0 -3387
- package/src/components/ModelStatusDisplay.tsx +0 -230
- package/src/components/Onboarding.tsx +0 -274
- package/src/components/PressEnterToContinue.tsx +0 -11
- package/src/components/PromptInput.tsx +0 -760
- package/src/components/SentryErrorBoundary.ts +0 -39
- package/src/components/Spinner.tsx +0 -129
- package/src/components/StickerRequestForm.tsx +0 -16
- package/src/components/StructuredDiff.tsx +0 -191
- package/src/components/TextInput.tsx +0 -259
- package/src/components/TodoItem.tsx +0 -47
- package/src/components/TokenWarning.tsx +0 -31
- package/src/components/ToolUseLoader.tsx +0 -40
- package/src/components/TrustDialog.tsx +0 -106
- package/src/components/binary-feedback/BinaryFeedback.tsx +0 -63
- package/src/components/binary-feedback/BinaryFeedbackOption.tsx +0 -111
- package/src/components/binary-feedback/BinaryFeedbackView.tsx +0 -172
- package/src/components/binary-feedback/utils.ts +0 -220
- package/src/components/messages/AssistantBashOutputMessage.tsx +0 -22
- package/src/components/messages/AssistantLocalCommandOutputMessage.tsx +0 -49
- package/src/components/messages/AssistantRedactedThinkingMessage.tsx +0 -19
- package/src/components/messages/AssistantTextMessage.tsx +0 -144
- package/src/components/messages/AssistantThinkingMessage.tsx +0 -40
- package/src/components/messages/AssistantToolUseMessage.tsx +0 -132
- package/src/components/messages/TaskProgressMessage.tsx +0 -32
- package/src/components/messages/TaskToolMessage.tsx +0 -58
- package/src/components/messages/UserBashInputMessage.tsx +0 -28
- package/src/components/messages/UserCommandMessage.tsx +0 -30
- package/src/components/messages/UserKodingInputMessage.tsx +0 -28
- package/src/components/messages/UserPromptMessage.tsx +0 -35
- package/src/components/messages/UserTextMessage.tsx +0 -39
- package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +0 -12
- package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +0 -36
- package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +0 -31
- package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +0 -57
- package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +0 -35
- package/src/components/messages/UserToolResultMessage/utils.tsx +0 -56
- package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +0 -121
- package/src/components/permissions/FallbackPermissionRequest.tsx +0 -153
- package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +0 -182
- package/src/components/permissions/FileEditPermissionRequest/FileEditToolDiff.tsx +0 -77
- package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +0 -164
- package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +0 -83
- package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +0 -240
- package/src/components/permissions/PermissionRequest.tsx +0 -101
- package/src/components/permissions/PermissionRequestTitle.tsx +0 -69
- package/src/components/permissions/hooks.ts +0 -44
- package/src/components/permissions/toolUseOptions.ts +0 -59
- package/src/components/permissions/utils.ts +0 -23
- package/src/constants/betas.ts +0 -5
- package/src/constants/claude-asterisk-ascii-art.tsx +0 -238
- package/src/constants/figures.ts +0 -4
- package/src/constants/keys.ts +0 -3
- package/src/constants/macros.ts +0 -11
- package/src/constants/modelCapabilities.ts +0 -179
- package/src/constants/models.ts +0 -1025
- package/src/constants/oauth.ts +0 -18
- package/src/constants/product.ts +0 -17
- package/src/constants/prompts.ts +0 -168
- package/src/constants/releaseNotes.ts +0 -7
- package/src/context/PermissionContext.tsx +0 -149
- package/src/context.ts +0 -278
- package/src/cost-tracker.ts +0 -84
- package/src/entrypoints/cli.tsx +0 -1561
- package/src/entrypoints/mcp.ts +0 -175
- package/src/history.ts +0 -25
- package/src/hooks/useApiKeyVerification.ts +0 -59
- package/src/hooks/useArrowKeyHistory.ts +0 -55
- package/src/hooks/useCanUseTool.ts +0 -138
- package/src/hooks/useCancelRequest.ts +0 -39
- package/src/hooks/useDoublePress.ts +0 -41
- package/src/hooks/useExitOnCtrlCD.ts +0 -31
- package/src/hooks/useInterval.ts +0 -25
- package/src/hooks/useLogMessages.ts +0 -16
- package/src/hooks/useLogStartupTime.ts +0 -12
- package/src/hooks/useNotifyAfterTimeout.ts +0 -65
- package/src/hooks/usePermissionRequestLogging.ts +0 -44
- package/src/hooks/useTerminalSize.ts +0 -49
- package/src/hooks/useTextInput.ts +0 -317
- package/src/hooks/useUnifiedCompletion.ts +0 -1405
- package/src/index.ts +0 -34
- package/src/messages.ts +0 -38
- package/src/permissions.ts +0 -268
- package/src/query.ts +0 -720
- package/src/screens/ConfigureNpmPrefix.tsx +0 -197
- package/src/screens/Doctor.tsx +0 -219
- package/src/screens/LogList.tsx +0 -68
- package/src/screens/REPL.tsx +0 -813
- package/src/screens/ResumeConversation.tsx +0 -68
- package/src/services/adapters/base.ts +0 -38
- package/src/services/adapters/chatCompletions.ts +0 -90
- package/src/services/adapters/responsesAPI.ts +0 -170
- package/src/services/browserMocks.ts +0 -66
- package/src/services/claude.ts +0 -2197
- package/src/services/customCommands.ts +0 -704
- package/src/services/fileFreshness.ts +0 -377
- package/src/services/gpt5ConnectionTest.ts +0 -340
- package/src/services/mcpClient.ts +0 -564
- package/src/services/mcpServerApproval.tsx +0 -50
- package/src/services/mentionProcessor.ts +0 -273
- package/src/services/modelAdapterFactory.ts +0 -69
- package/src/services/notifier.ts +0 -40
- package/src/services/oauth.ts +0 -357
- package/src/services/openai.ts +0 -1359
- package/src/services/responseStateManager.ts +0 -90
- package/src/services/sentry.ts +0 -3
- package/src/services/statsig.ts +0 -172
- package/src/services/statsigStorage.ts +0 -86
- package/src/services/systemReminder.ts +0 -507
- package/src/services/vcr.ts +0 -161
- package/src/test/testAdapters.ts +0 -96
- package/src/tools/ArchitectTool/ArchitectTool.tsx +0 -135
- package/src/tools/ArchitectTool/prompt.ts +0 -15
- package/src/tools/AskExpertModelTool/AskExpertModelTool.tsx +0 -576
- package/src/tools/BashTool/BashTool.tsx +0 -243
- package/src/tools/BashTool/BashToolResultMessage.tsx +0 -38
- package/src/tools/BashTool/OutputLine.tsx +0 -49
- package/src/tools/BashTool/prompt.ts +0 -174
- package/src/tools/BashTool/utils.ts +0 -56
- package/src/tools/FileEditTool/FileEditTool.tsx +0 -319
- package/src/tools/FileEditTool/prompt.ts +0 -51
- package/src/tools/FileEditTool/utils.ts +0 -58
- package/src/tools/FileReadTool/FileReadTool.tsx +0 -404
- package/src/tools/FileReadTool/prompt.ts +0 -7
- package/src/tools/FileWriteTool/FileWriteTool.tsx +0 -301
- package/src/tools/FileWriteTool/prompt.ts +0 -10
- package/src/tools/GlobTool/GlobTool.tsx +0 -119
- package/src/tools/GlobTool/prompt.ts +0 -8
- package/src/tools/GrepTool/GrepTool.tsx +0 -147
- package/src/tools/GrepTool/prompt.ts +0 -11
- package/src/tools/MCPTool/MCPTool.tsx +0 -107
- package/src/tools/MCPTool/prompt.ts +0 -3
- package/src/tools/MemoryReadTool/MemoryReadTool.tsx +0 -127
- package/src/tools/MemoryReadTool/prompt.ts +0 -3
- package/src/tools/MemoryWriteTool/MemoryWriteTool.tsx +0 -89
- package/src/tools/MemoryWriteTool/prompt.ts +0 -3
- package/src/tools/MultiEditTool/MultiEditTool.tsx +0 -388
- package/src/tools/MultiEditTool/prompt.ts +0 -45
- package/src/tools/NotebookEditTool/NotebookEditTool.tsx +0 -298
- package/src/tools/NotebookEditTool/prompt.ts +0 -3
- package/src/tools/NotebookReadTool/NotebookReadTool.tsx +0 -258
- package/src/tools/NotebookReadTool/prompt.ts +0 -3
- package/src/tools/StickerRequestTool/StickerRequestTool.tsx +0 -107
- package/src/tools/StickerRequestTool/prompt.ts +0 -19
- package/src/tools/TaskTool/TaskTool.tsx +0 -438
- package/src/tools/TaskTool/constants.ts +0 -1
- package/src/tools/TaskTool/prompt.ts +0 -92
- package/src/tools/ThinkTool/ThinkTool.tsx +0 -54
- package/src/tools/ThinkTool/prompt.ts +0 -12
- package/src/tools/TodoWriteTool/TodoWriteTool.tsx +0 -313
- package/src/tools/TodoWriteTool/prompt.ts +0 -63
- package/src/tools/URLFetcherTool/URLFetcherTool.tsx +0 -178
- package/src/tools/URLFetcherTool/cache.ts +0 -55
- package/src/tools/URLFetcherTool/htmlToMarkdown.ts +0 -55
- package/src/tools/URLFetcherTool/prompt.ts +0 -17
- package/src/tools/WebSearchTool/WebSearchTool.tsx +0 -103
- package/src/tools/WebSearchTool/prompt.ts +0 -13
- package/src/tools/WebSearchTool/searchProviders.ts +0 -66
- package/src/tools/lsTool/lsTool.tsx +0 -272
- package/src/tools/lsTool/prompt.ts +0 -2
- package/src/tools.ts +0 -67
- package/src/types/PermissionMode.ts +0 -120
- package/src/types/RequestContext.ts +0 -72
- package/src/types/common.d.ts +0 -2
- package/src/types/conversation.ts +0 -51
- package/src/types/logs.ts +0 -58
- package/src/types/modelCapabilities.ts +0 -64
- package/src/types/notebook.ts +0 -87
- package/src/utils/Cursor.ts +0 -436
- package/src/utils/PersistentShell.ts +0 -552
- package/src/utils/advancedFuzzyMatcher.ts +0 -290
- package/src/utils/agentLoader.ts +0 -278
- package/src/utils/agentStorage.ts +0 -97
- package/src/utils/array.ts +0 -3
- package/src/utils/ask.tsx +0 -99
- package/src/utils/auth.ts +0 -13
- package/src/utils/autoCompactCore.ts +0 -223
- package/src/utils/autoUpdater.ts +0 -458
- package/src/utils/betas.ts +0 -20
- package/src/utils/browser.ts +0 -14
- package/src/utils/cleanup.ts +0 -72
- package/src/utils/commands.ts +0 -261
- package/src/utils/commonUnixCommands.ts +0 -161
- package/src/utils/config.ts +0 -945
- package/src/utils/conversationRecovery.ts +0 -55
- package/src/utils/debugLogger.ts +0 -1235
- package/src/utils/diff.ts +0 -42
- package/src/utils/env.ts +0 -57
- package/src/utils/errors.ts +0 -21
- package/src/utils/exampleCommands.ts +0 -109
- package/src/utils/execFileNoThrow.ts +0 -51
- package/src/utils/expertChatStorage.ts +0 -136
- package/src/utils/file.ts +0 -405
- package/src/utils/fileRecoveryCore.ts +0 -71
- package/src/utils/format.tsx +0 -44
- package/src/utils/fuzzyMatcher.ts +0 -328
- package/src/utils/generators.ts +0 -62
- package/src/utils/git.ts +0 -92
- package/src/utils/globalLogger.ts +0 -77
- package/src/utils/http.ts +0 -10
- package/src/utils/imagePaste.ts +0 -38
- package/src/utils/json.ts +0 -13
- package/src/utils/log.ts +0 -382
- package/src/utils/markdown.ts +0 -213
- package/src/utils/messageContextManager.ts +0 -294
- package/src/utils/messages.tsx +0 -945
- package/src/utils/model.ts +0 -914
- package/src/utils/permissions/filesystem.ts +0 -127
- package/src/utils/responseState.ts +0 -23
- package/src/utils/ripgrep.ts +0 -167
- package/src/utils/secureFile.ts +0 -564
- package/src/utils/sessionState.ts +0 -49
- package/src/utils/state.ts +0 -25
- package/src/utils/style.ts +0 -29
- package/src/utils/terminal.ts +0 -50
- package/src/utils/theme.ts +0 -127
- package/src/utils/thinking.ts +0 -144
- package/src/utils/todoStorage.ts +0 -431
- package/src/utils/tokens.ts +0 -43
- package/src/utils/toolExecutionController.ts +0 -163
- package/src/utils/unaryLogging.ts +0 -26
- package/src/utils/user.ts +0 -37
- package/src/utils/validate.ts +0 -165
package/src/utils/Cursor.ts
DELETED
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
import wrapAnsi from 'wrap-ansi'
|
|
2
|
-
|
|
3
|
-
type WrappedText = string[]
|
|
4
|
-
type Position = {
|
|
5
|
-
line: number
|
|
6
|
-
column: number
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class Cursor {
|
|
10
|
-
readonly offset: number
|
|
11
|
-
constructor(
|
|
12
|
-
readonly measuredText: MeasuredText,
|
|
13
|
-
offset: number = 0,
|
|
14
|
-
readonly selection: number = 0,
|
|
15
|
-
) {
|
|
16
|
-
// it's ok for the cursor to be 1 char beyond the end of the string
|
|
17
|
-
this.offset = Math.max(0, Math.min(this.measuredText.text.length, offset))
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
static fromText(
|
|
21
|
-
text: string,
|
|
22
|
-
columns: number,
|
|
23
|
-
offset: number = 0,
|
|
24
|
-
selection: number = 0,
|
|
25
|
-
): Cursor {
|
|
26
|
-
// make MeasuredText on less than columns width, to account for cursor
|
|
27
|
-
return new Cursor(new MeasuredText(text, columns - 1), offset, selection)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
render(cursorChar: string, mask: string, invert: (text: string) => string) {
|
|
31
|
-
const { line, column } = this.getPosition()
|
|
32
|
-
return this.measuredText
|
|
33
|
-
.getWrappedText()
|
|
34
|
-
.map((text, currentLine, allLines) => {
|
|
35
|
-
let displayText = text
|
|
36
|
-
if (mask && currentLine === allLines.length - 1) {
|
|
37
|
-
const lastSixStart = Math.max(0, text.length - 6)
|
|
38
|
-
displayText = mask.repeat(lastSixStart) + text.slice(lastSixStart)
|
|
39
|
-
}
|
|
40
|
-
// looking for the line with the cursor
|
|
41
|
-
if (line != currentLine) return displayText.trimEnd()
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
displayText.slice(0, column) +
|
|
45
|
-
invert(displayText[column] || cursorChar) +
|
|
46
|
-
displayText.trimEnd().slice(column + 1)
|
|
47
|
-
)
|
|
48
|
-
})
|
|
49
|
-
.join('\n')
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
left(): Cursor {
|
|
53
|
-
return new Cursor(this.measuredText, this.offset - 1)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
right(): Cursor {
|
|
57
|
-
return new Cursor(this.measuredText, this.offset + 1)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
up(): Cursor {
|
|
61
|
-
const { line, column } = this.getPosition()
|
|
62
|
-
if (line == 0) {
|
|
63
|
-
return new Cursor(this.measuredText, 0, 0)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const newOffset = this.getOffset({ line: line - 1, column })
|
|
67
|
-
return new Cursor(this.measuredText, newOffset, 0)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
down(): Cursor {
|
|
71
|
-
const { line, column } = this.getPosition()
|
|
72
|
-
if (line >= this.measuredText.lineCount - 1) {
|
|
73
|
-
return new Cursor(this.measuredText, this.text.length, 0)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const newOffset = this.getOffset({ line: line + 1, column })
|
|
77
|
-
return new Cursor(this.measuredText, newOffset, 0)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
startOfLine(): Cursor {
|
|
81
|
-
const { line } = this.getPosition()
|
|
82
|
-
return new Cursor(
|
|
83
|
-
this.measuredText,
|
|
84
|
-
this.getOffset({
|
|
85
|
-
line,
|
|
86
|
-
column: 0,
|
|
87
|
-
}),
|
|
88
|
-
0,
|
|
89
|
-
)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
endOfLine(): Cursor {
|
|
93
|
-
const { line } = this.getPosition()
|
|
94
|
-
const column = this.measuredText.getLineLength(line)
|
|
95
|
-
const offset = this.getOffset({ line, column })
|
|
96
|
-
return new Cursor(this.measuredText, offset, 0)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
nextWord(): Cursor {
|
|
100
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
101
|
-
let nextCursor: Cursor = this
|
|
102
|
-
// If we're on a word, move to the next non-word
|
|
103
|
-
while (nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {
|
|
104
|
-
nextCursor = nextCursor.right()
|
|
105
|
-
}
|
|
106
|
-
// now move to the next word char
|
|
107
|
-
while (!nextCursor.isOverWordChar() && !nextCursor.isAtEnd()) {
|
|
108
|
-
nextCursor = nextCursor.right()
|
|
109
|
-
}
|
|
110
|
-
return nextCursor
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
prevWord(): Cursor {
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
115
|
-
let cursor: Cursor = this
|
|
116
|
-
|
|
117
|
-
// if we are already at the beginning of a word, step off it
|
|
118
|
-
if (!cursor.left().isOverWordChar()) {
|
|
119
|
-
cursor = cursor.left()
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Move left over any non-word characters
|
|
123
|
-
while (!cursor.isOverWordChar() && !cursor.isAtStart()) {
|
|
124
|
-
cursor = cursor.left()
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// If we're over a word character, move to the start of this word
|
|
128
|
-
if (cursor.isOverWordChar()) {
|
|
129
|
-
while (cursor.left().isOverWordChar() && !cursor.isAtStart()) {
|
|
130
|
-
cursor = cursor.left()
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return cursor
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
private modifyText(end: Cursor, insertString: string = ''): Cursor {
|
|
138
|
-
const startOffset = this.offset
|
|
139
|
-
const endOffset = end.offset
|
|
140
|
-
|
|
141
|
-
const newText =
|
|
142
|
-
this.text.slice(0, startOffset) +
|
|
143
|
-
insertString +
|
|
144
|
-
this.text.slice(endOffset)
|
|
145
|
-
|
|
146
|
-
return Cursor.fromText(
|
|
147
|
-
newText,
|
|
148
|
-
this.columns,
|
|
149
|
-
startOffset + insertString.length,
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
insert(insertString: string): Cursor {
|
|
154
|
-
const newCursor = this.modifyText(this, insertString)
|
|
155
|
-
return newCursor
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
del(): Cursor {
|
|
159
|
-
if (this.isAtEnd()) {
|
|
160
|
-
return this
|
|
161
|
-
}
|
|
162
|
-
return this.modifyText(this.right())
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
backspace(): Cursor {
|
|
166
|
-
if (this.isAtStart()) {
|
|
167
|
-
return this
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Get the current position
|
|
171
|
-
const currentOffset = this.offset
|
|
172
|
-
|
|
173
|
-
// Create a new cursor at the position before the current one
|
|
174
|
-
const leftCursor = this.left()
|
|
175
|
-
const leftOffset = leftCursor.offset
|
|
176
|
-
|
|
177
|
-
// Create the new text by removing one character
|
|
178
|
-
const newText =
|
|
179
|
-
this.text.slice(0, leftOffset) + this.text.slice(currentOffset)
|
|
180
|
-
|
|
181
|
-
// Return a new cursor with the updated text and position
|
|
182
|
-
return Cursor.fromText(newText, this.columns, leftOffset)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
deleteToLineStart(): Cursor {
|
|
186
|
-
return this.startOfLine().modifyText(this)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
deleteToLineEnd(): Cursor {
|
|
190
|
-
// If cursor is on a newline character, delete just that character
|
|
191
|
-
if (this.text[this.offset] === '\n') {
|
|
192
|
-
return this.modifyText(this.right())
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return this.modifyText(this.endOfLine())
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
deleteWordBefore(): Cursor {
|
|
199
|
-
if (this.isAtStart()) {
|
|
200
|
-
return this
|
|
201
|
-
}
|
|
202
|
-
return this.prevWord().modifyText(this)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
deleteWordAfter(): Cursor {
|
|
206
|
-
if (this.isAtEnd()) {
|
|
207
|
-
return this
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return this.modifyText(this.nextWord())
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
private isOverWordChar(): boolean {
|
|
214
|
-
const currentChar = this.text[this.offset] ?? ''
|
|
215
|
-
return /\w/.test(currentChar)
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
equals(other: Cursor): boolean {
|
|
219
|
-
return (
|
|
220
|
-
this.offset === other.offset && this.measuredText == other.measuredText
|
|
221
|
-
)
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
private isAtStart(): boolean {
|
|
225
|
-
return this.offset == 0
|
|
226
|
-
}
|
|
227
|
-
private isAtEnd(): boolean {
|
|
228
|
-
return this.offset == this.text.length
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
public get text(): string {
|
|
232
|
-
return this.measuredText.text
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
private get columns(): number {
|
|
236
|
-
return this.measuredText.columns + 1
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
private getPosition(): Position {
|
|
240
|
-
return this.measuredText.getPositionFromOffset(this.offset)
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
private getOffset(position: Position): number {
|
|
244
|
-
return this.measuredText.getOffsetFromPosition(position)
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
class WrappedLine {
|
|
249
|
-
constructor(
|
|
250
|
-
public readonly text: string,
|
|
251
|
-
public readonly startOffset: number,
|
|
252
|
-
public readonly isPrecededByNewline: boolean,
|
|
253
|
-
public readonly endsWithNewline: boolean = false,
|
|
254
|
-
) {}
|
|
255
|
-
|
|
256
|
-
equals(other: WrappedLine): boolean {
|
|
257
|
-
return this.text === other.text && this.startOffset === other.startOffset
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
get length(): number {
|
|
261
|
-
return this.text.length + (this.endsWithNewline ? 1 : 0)
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
export class MeasuredText {
|
|
266
|
-
private wrappedLines: WrappedLine[]
|
|
267
|
-
|
|
268
|
-
constructor(
|
|
269
|
-
readonly text: string,
|
|
270
|
-
readonly columns: number,
|
|
271
|
-
) {
|
|
272
|
-
this.wrappedLines = this.measureWrappedText()
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
private measureWrappedText(): WrappedLine[] {
|
|
276
|
-
const wrappedText = wrapAnsi(this.text, this.columns, {
|
|
277
|
-
hard: true,
|
|
278
|
-
trim: false,
|
|
279
|
-
})
|
|
280
|
-
|
|
281
|
-
const wrappedLines: WrappedLine[] = []
|
|
282
|
-
let searchOffset = 0
|
|
283
|
-
let lastNewLinePos = -1
|
|
284
|
-
|
|
285
|
-
const lines = wrappedText.split('\n')
|
|
286
|
-
for (let i = 0; i < lines.length; i++) {
|
|
287
|
-
const text = lines[i]!
|
|
288
|
-
const isPrecededByNewline = (startOffset: number) =>
|
|
289
|
-
i == 0 || (startOffset > 0 && this.text[startOffset - 1] === '\n')
|
|
290
|
-
|
|
291
|
-
if (text.length === 0) {
|
|
292
|
-
// For blank lines, find the next newline character after the last one
|
|
293
|
-
lastNewLinePos = this.text.indexOf('\n', lastNewLinePos + 1)
|
|
294
|
-
|
|
295
|
-
if (lastNewLinePos !== -1) {
|
|
296
|
-
const startOffset = lastNewLinePos
|
|
297
|
-
const endsWithNewline = true
|
|
298
|
-
|
|
299
|
-
wrappedLines.push(
|
|
300
|
-
new WrappedLine(
|
|
301
|
-
text,
|
|
302
|
-
startOffset,
|
|
303
|
-
isPrecededByNewline(startOffset),
|
|
304
|
-
endsWithNewline,
|
|
305
|
-
),
|
|
306
|
-
)
|
|
307
|
-
} else {
|
|
308
|
-
// If we can't find another newline, this must be the end of text
|
|
309
|
-
const startOffset = this.text.length
|
|
310
|
-
wrappedLines.push(
|
|
311
|
-
new WrappedLine(
|
|
312
|
-
text,
|
|
313
|
-
startOffset,
|
|
314
|
-
isPrecededByNewline(startOffset),
|
|
315
|
-
false,
|
|
316
|
-
),
|
|
317
|
-
)
|
|
318
|
-
}
|
|
319
|
-
} else {
|
|
320
|
-
// For non-blank lines
|
|
321
|
-
const startOffset = this.text.indexOf(text, searchOffset)
|
|
322
|
-
if (startOffset === -1) {
|
|
323
|
-
console.log('Debug: Failed to find wrapped line in original text')
|
|
324
|
-
console.log('Debug: Current text:', text)
|
|
325
|
-
console.log('Debug: Full original text:', this.text)
|
|
326
|
-
console.log('Debug: Search offset:', searchOffset)
|
|
327
|
-
console.log('Debug: Wrapped text:', wrappedText)
|
|
328
|
-
throw new Error('Failed to find wrapped line in original text')
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
searchOffset = startOffset + text.length
|
|
332
|
-
|
|
333
|
-
// Check if this line ends with a newline in the original text
|
|
334
|
-
const potentialNewlinePos = startOffset + text.length
|
|
335
|
-
const endsWithNewline =
|
|
336
|
-
potentialNewlinePos < this.text.length &&
|
|
337
|
-
this.text[potentialNewlinePos] === '\n'
|
|
338
|
-
|
|
339
|
-
if (endsWithNewline) {
|
|
340
|
-
lastNewLinePos = potentialNewlinePos
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
wrappedLines.push(
|
|
344
|
-
new WrappedLine(
|
|
345
|
-
text,
|
|
346
|
-
startOffset,
|
|
347
|
-
isPrecededByNewline(startOffset),
|
|
348
|
-
endsWithNewline,
|
|
349
|
-
),
|
|
350
|
-
)
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
return wrappedLines
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
public getWrappedText(): WrappedText {
|
|
358
|
-
return this.wrappedLines.map(line =>
|
|
359
|
-
line.isPrecededByNewline ? line.text : line.text.trimStart(),
|
|
360
|
-
)
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
private getLine(line: number): WrappedLine {
|
|
364
|
-
return this.wrappedLines[
|
|
365
|
-
Math.max(0, Math.min(line, this.wrappedLines.length - 1))
|
|
366
|
-
]!
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
public getOffsetFromPosition(position: Position): number {
|
|
370
|
-
const wrappedLine = this.getLine(position.line)
|
|
371
|
-
const startOffsetPlusColumn = wrappedLine.startOffset + position.column
|
|
372
|
-
|
|
373
|
-
// Handle blank lines specially
|
|
374
|
-
if (wrappedLine.text.length === 0 && wrappedLine.endsWithNewline) {
|
|
375
|
-
return wrappedLine.startOffset
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// For normal lines
|
|
379
|
-
const lineEnd = wrappedLine.startOffset + wrappedLine.text.length
|
|
380
|
-
// Add 1 only if this line ends with a newline
|
|
381
|
-
const maxOffset = wrappedLine.endsWithNewline ? lineEnd + 1 : lineEnd
|
|
382
|
-
|
|
383
|
-
return Math.min(startOffsetPlusColumn, maxOffset)
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
public getLineLength(line: number): number {
|
|
387
|
-
const currentLine = this.getLine(line)
|
|
388
|
-
const nextLine = this.getLine(line + 1)
|
|
389
|
-
if (nextLine.equals(currentLine)) {
|
|
390
|
-
return this.text.length - currentLine.startOffset
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
return nextLine.startOffset - currentLine.startOffset - 1
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
public getPositionFromOffset(offset: number): Position {
|
|
397
|
-
const lines = this.wrappedLines
|
|
398
|
-
for (let line = 0; line < lines.length; line++) {
|
|
399
|
-
const currentLine = lines[line]!
|
|
400
|
-
const nextLine = lines[line + 1]
|
|
401
|
-
if (
|
|
402
|
-
offset >= currentLine.startOffset &&
|
|
403
|
-
(!nextLine || offset < nextLine.startOffset)
|
|
404
|
-
) {
|
|
405
|
-
const leadingWhitepace = currentLine.isPrecededByNewline
|
|
406
|
-
? 0
|
|
407
|
-
: currentLine.text.length - currentLine.text.trimStart().length
|
|
408
|
-
const column = Math.max(
|
|
409
|
-
0,
|
|
410
|
-
Math.min(
|
|
411
|
-
offset - currentLine.startOffset - leadingWhitepace,
|
|
412
|
-
currentLine.text.length,
|
|
413
|
-
),
|
|
414
|
-
)
|
|
415
|
-
return {
|
|
416
|
-
line,
|
|
417
|
-
column,
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
// If we're past the last character, return the end of the last line
|
|
423
|
-
const line = lines.length - 1
|
|
424
|
-
return {
|
|
425
|
-
line,
|
|
426
|
-
column: this.wrappedLines[line]!.text.length,
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
public get lineCount(): number {
|
|
431
|
-
return this.wrappedLines.length
|
|
432
|
-
}
|
|
433
|
-
equals(other: MeasuredText): boolean {
|
|
434
|
-
return this.text === other.text && this.columns === other.columns
|
|
435
|
-
}
|
|
436
|
-
}
|