@n8n/ai-utilities 0.23.3 → 0.24.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/cjs/adapters/langchain-chat-model.js +174 -184
- package/dist/cjs/adapters/langchain-chat-model.js.map +1 -1
- package/dist/cjs/adapters/langchain-history.js +23 -33
- package/dist/cjs/adapters/langchain-history.js.map +1 -1
- package/dist/cjs/adapters/langchain-memory.js +32 -42
- package/dist/cjs/adapters/langchain-memory.js.map +1 -1
- package/dist/cjs/agent-config/config-normalization.d.ts +11 -0
- package/dist/cjs/agent-config/config-normalization.js +134 -0
- package/dist/cjs/agent-config/config-normalization.js.map +1 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.d.ts +7 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.js +43 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.js.map +1 -0
- package/dist/cjs/agent-config/index.d.ts +3 -0
- package/dist/cjs/agent-config/index.js +17 -0
- package/dist/cjs/agent-config/index.js.map +1 -0
- package/dist/cjs/agent-config/model-id.d.ts +5 -0
- package/dist/cjs/agent-config/model-id.js +16 -0
- package/dist/cjs/agent-config/model-id.js.map +1 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.d.ts +7 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.js +55 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.js.map +1 -0
- package/dist/cjs/ai-node-sdk-version.js +4 -14
- package/dist/cjs/ai-node-sdk-version.js.map +1 -1
- package/dist/cjs/chat-model/base.js +21 -31
- package/dist/cjs/chat-model/base.js.map +1 -1
- package/dist/cjs/converters/message.js +308 -318
- package/dist/cjs/converters/message.js.map +1 -1
- package/dist/cjs/converters/tool.js +50 -60
- package/dist/cjs/converters/tool.js.map +1 -1
- package/dist/cjs/guards.js +26 -36
- package/dist/cjs/guards.js.map +1 -1
- package/dist/cjs/index.js +99 -108
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/memory/base-chat-history.js +9 -19
- package/dist/cjs/memory/base-chat-history.js.map +1 -1
- package/dist/cjs/memory/base-chat-memory.js +6 -16
- package/dist/cjs/memory/base-chat-memory.js.map +1 -1
- package/dist/cjs/memory/windowed-chat-memory.js +33 -43
- package/dist/cjs/memory/windowed-chat-memory.js.map +1 -1
- package/dist/cjs/model-discovery/index.js +61 -71
- package/dist/cjs/model-discovery/index.js.map +1 -1
- package/dist/cjs/model-discovery/providers/anthropic.js +12 -22
- package/dist/cjs/model-discovery/providers/anthropic.js.map +1 -1
- package/dist/cjs/model-discovery/providers/cohere.js +12 -22
- package/dist/cjs/model-discovery/providers/cohere.js.map +1 -1
- package/dist/cjs/model-discovery/providers/deepseek.js +5 -15
- package/dist/cjs/model-discovery/providers/deepseek.js.map +1 -1
- package/dist/cjs/model-discovery/providers/google.js +15 -25
- package/dist/cjs/model-discovery/providers/google.js.map +1 -1
- package/dist/cjs/model-discovery/providers/groq.js +9 -19
- package/dist/cjs/model-discovery/providers/groq.js.map +1 -1
- package/dist/cjs/model-discovery/providers/mistral.js +11 -21
- package/dist/cjs/model-discovery/providers/mistral.js.map +1 -1
- package/dist/cjs/model-discovery/providers/nvidia.js +21 -31
- package/dist/cjs/model-discovery/providers/nvidia.js.map +1 -1
- package/dist/cjs/model-discovery/providers/openai.js +31 -41
- package/dist/cjs/model-discovery/providers/openai.js.map +1 -1
- package/dist/cjs/model-discovery/providers/openrouter.js +5 -15
- package/dist/cjs/model-discovery/providers/openrouter.js.map +1 -1
- package/dist/cjs/model-discovery/providers/vercel.js +5 -15
- package/dist/cjs/model-discovery/providers/vercel.js.map +1 -1
- package/dist/cjs/model-discovery/providers/xai.js +5 -15
- package/dist/cjs/model-discovery/providers/xai.js.map +1 -1
- package/dist/cjs/model-discovery/request.js +40 -50
- package/dist/cjs/model-discovery/request.js.map +1 -1
- package/dist/cjs/model-discovery/types.js +2 -12
- package/dist/cjs/node-catalog/discriminator-utils.js +75 -85
- package/dist/cjs/node-catalog/discriminator-utils.js.map +1 -1
- package/dist/cjs/node-catalog/dynamic-node-parameters.js +169 -179
- package/dist/cjs/node-catalog/dynamic-node-parameters.js.map +1 -1
- package/dist/cjs/node-catalog/get.js +349 -359
- package/dist/cjs/node-catalog/get.js.map +1 -1
- package/dist/cjs/node-catalog/index.js +42 -52
- package/dist/cjs/node-catalog/index.js.map +1 -1
- package/dist/cjs/node-catalog/lean-node-type.js +46 -56
- package/dist/cjs/node-catalog/lean-node-type.js.map +1 -1
- package/dist/cjs/node-catalog/node-type-parser.js +61 -71
- package/dist/cjs/node-catalog/node-type-parser.js.map +1 -1
- package/dist/cjs/node-catalog/resource-operation-extractor.js +133 -143
- package/dist/cjs/node-catalog/resource-operation-extractor.js.map +1 -1
- package/dist/cjs/node-catalog/search-engine.js +285 -295
- package/dist/cjs/node-catalog/search-engine.js.map +1 -1
- package/dist/cjs/node-catalog/search.js +280 -290
- package/dist/cjs/node-catalog/search.js.map +1 -1
- package/dist/cjs/node-catalog/suggested-nodes-data.js +235 -245
- package/dist/cjs/node-catalog/suggested-nodes-data.js.map +1 -1
- package/dist/cjs/node-catalog/suggested.js +63 -73
- package/dist/cjs/node-catalog/suggested.js.map +1 -1
- package/dist/cjs/node-catalog/types.js +2 -12
- package/dist/cjs/suppliers/supplyMemory.js +13 -23
- package/dist/cjs/suppliers/supplyMemory.js.map +1 -1
- package/dist/cjs/suppliers/supplyModel.js +72 -82
- package/dist/cjs/suppliers/supplyModel.js.map +1 -1
- package/dist/cjs/typecheck.tsbuildinfo +1 -1
- package/dist/cjs/types/chat-model.js +2 -12
- package/dist/cjs/types/json.js +2 -12
- package/dist/cjs/types/memory.js +2 -12
- package/dist/cjs/types/message.js +2 -12
- package/dist/cjs/types/openai.js +2 -12
- package/dist/cjs/types/output.js +2 -12
- package/dist/cjs/types/tool.js +2 -12
- package/dist/cjs/utils/embeddings-input-validation.js +24 -34
- package/dist/cjs/utils/embeddings-input-validation.js.map +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js +27 -37
- package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js +23 -33
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
- package/dist/cjs/utils/follow-redirects.js +38 -48
- package/dist/cjs/utils/follow-redirects.js.map +1 -1
- package/dist/cjs/utils/fromai-helpers.js +21 -31
- package/dist/cjs/utils/fromai-helpers.js.map +1 -1
- package/dist/cjs/utils/fromai-tool-factory.js +18 -28
- package/dist/cjs/utils/fromai-tool-factory.js.map +1 -1
- package/dist/cjs/utils/helpers.js +44 -54
- package/dist/cjs/utils/helpers.js.map +1 -1
- package/dist/cjs/utils/http-proxy-agent.js +38 -48
- package/dist/cjs/utils/http-proxy-agent.js.map +1 -1
- package/dist/cjs/utils/lazy-import.d.ts +1 -0
- package/dist/cjs/utils/lazy-import.js +7 -0
- package/dist/cjs/utils/lazy-import.js.map +1 -0
- package/dist/cjs/utils/loaders/n8n-pdf-loader.js +50 -94
- package/dist/cjs/utils/loaders/n8n-pdf-loader.js.map +1 -1
- package/dist/cjs/utils/log-ai-event.js +10 -20
- package/dist/cjs/utils/log-ai-event.js.map +1 -1
- package/dist/cjs/utils/log-wrapper.d.ts +1 -1
- package/dist/cjs/utils/log-wrapper.js +313 -323
- package/dist/cjs/utils/log-wrapper.js.map +1 -1
- package/dist/cjs/utils/n8n-binary-loader.js +143 -153
- package/dist/cjs/utils/n8n-binary-loader.js.map +1 -1
- package/dist/cjs/utils/n8n-json-loader.js +57 -67
- package/dist/cjs/utils/n8n-json-loader.js.map +1 -1
- package/dist/cjs/utils/n8n-llm-tracing.js +164 -174
- package/dist/cjs/utils/n8n-llm-tracing.js.map +1 -1
- package/dist/cjs/utils/redact-headers.js +42 -52
- package/dist/cjs/utils/redact-headers.js.map +1 -1
- package/dist/cjs/utils/shared-fields.js +137 -147
- package/dist/cjs/utils/shared-fields.js.map +1 -1
- package/dist/cjs/utils/sse.js +83 -93
- package/dist/cjs/utils/sse.js.map +1 -1
- package/dist/cjs/utils/text-editor.js +274 -284
- package/dist/cjs/utils/text-editor.js.map +1 -1
- package/dist/cjs/utils/tokenizer/tiktoken.js +38 -48
- package/dist/cjs/utils/tokenizer/tiktoken.js.map +1 -1
- package/dist/cjs/utils/tokenizer/token-estimator.js +86 -96
- package/dist/cjs/utils/tokenizer/token-estimator.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js +43 -53
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js +154 -164
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js +82 -92
- package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/config.js +34 -44
- package/dist/cjs/utils/vector-store/MemoryManager/config.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/types.js +2 -12
- package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js +44 -54
- package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +229 -229
- package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js +8 -18
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js +33 -43
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js +41 -51
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js +59 -69
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js +58 -68
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js +26 -36
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js +34 -44
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/types.js +2 -12
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js +34 -29
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
- package/dist/cjs/utils/vector-store/processDocuments.js +37 -47
- package/dist/cjs/utils/vector-store/processDocuments.js.map +1 -1
- package/dist/cjs/utils/workflow-text-editor.js +50 -60
- package/dist/cjs/utils/workflow-text-editor.js.map +1 -1
- package/dist/cjs/web-search/brave-search.js +38 -48
- package/dist/cjs/web-search/brave-search.js.map +1 -1
- package/dist/cjs/web-search/index.js +7 -17
- package/dist/cjs/web-search/index.js.map +1 -1
- package/dist/cjs/web-search/searxng-search.js +35 -45
- package/dist/cjs/web-search/searxng-search.js.map +1 -1
- package/dist/cjs/web-search/types.js +2 -12
- package/dist/esm/adapters/langchain-chat-model.js.map +1 -1
- package/dist/esm/adapters/langchain-history.js.map +1 -1
- package/dist/esm/adapters/langchain-memory.js.map +1 -1
- package/dist/esm/agent-config/config-normalization.d.ts +11 -0
- package/dist/esm/agent-config/config-normalization.js +134 -0
- package/dist/esm/agent-config/config-normalization.js.map +1 -0
- package/dist/esm/agent-config/from-ai-node-parameters.d.ts +7 -0
- package/dist/esm/agent-config/from-ai-node-parameters.js +43 -0
- package/dist/esm/agent-config/from-ai-node-parameters.js.map +1 -0
- package/dist/esm/agent-config/index.d.ts +3 -0
- package/dist/esm/agent-config/index.js +17 -0
- package/dist/esm/agent-config/index.js.map +1 -0
- package/dist/esm/agent-config/model-id.d.ts +5 -0
- package/dist/esm/agent-config/model-id.js +16 -0
- package/dist/esm/agent-config/model-id.js.map +1 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.d.ts +7 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.js +55 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.js.map +1 -0
- package/dist/esm/chat-model/base.js.map +1 -1
- package/dist/esm/converters/message.js.map +1 -1
- package/dist/esm/converters/tool.js.map +1 -1
- package/dist/esm/guards.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory/base-chat-history.js.map +1 -1
- package/dist/esm/memory/base-chat-memory.js.map +1 -1
- package/dist/esm/memory/windowed-chat-memory.js.map +1 -1
- package/dist/esm/model-discovery/index.js.map +1 -1
- package/dist/esm/model-discovery/providers/anthropic.js.map +1 -1
- package/dist/esm/model-discovery/providers/cohere.js.map +1 -1
- package/dist/esm/model-discovery/providers/google.js.map +1 -1
- package/dist/esm/model-discovery/providers/groq.js.map +1 -1
- package/dist/esm/model-discovery/providers/mistral.js.map +1 -1
- package/dist/esm/model-discovery/providers/nvidia.js.map +1 -1
- package/dist/esm/model-discovery/providers/openai.js.map +1 -1
- package/dist/esm/model-discovery/request.js.map +1 -1
- package/dist/esm/node-catalog/discriminator-utils.js.map +1 -1
- package/dist/esm/node-catalog/dynamic-node-parameters.js.map +1 -1
- package/dist/esm/node-catalog/get.js.map +1 -1
- package/dist/esm/node-catalog/lean-node-type.js.map +1 -1
- package/dist/esm/node-catalog/node-type-parser.js.map +1 -1
- package/dist/esm/node-catalog/resource-operation-extractor.js.map +1 -1
- package/dist/esm/node-catalog/search-engine.js.map +1 -1
- package/dist/esm/node-catalog/search.js.map +1 -1
- package/dist/esm/node-catalog/suggested-nodes-data.js.map +1 -1
- package/dist/esm/node-catalog/suggested.js.map +1 -1
- package/dist/esm/suppliers/supplyMemory.js.map +1 -1
- package/dist/esm/suppliers/supplyModel.js.map +1 -1
- package/dist/esm/typecheck.tsbuildinfo +1 -1
- package/dist/esm/utils/embeddings-input-validation.js.map +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
- package/dist/esm/utils/follow-redirects.js.map +1 -1
- package/dist/esm/utils/fromai-helpers.js.map +1 -1
- package/dist/esm/utils/fromai-tool-factory.js.map +1 -1
- package/dist/esm/utils/helpers.js.map +1 -1
- package/dist/esm/utils/http-proxy-agent.js.map +1 -1
- package/dist/esm/utils/lazy-import.d.ts +1 -0
- package/dist/esm/utils/lazy-import.js +7 -0
- package/dist/esm/utils/lazy-import.js.map +1 -0
- package/dist/esm/utils/loaders/n8n-pdf-loader.js +2 -35
- package/dist/esm/utils/loaders/n8n-pdf-loader.js.map +1 -1
- package/dist/esm/utils/log-ai-event.js.map +1 -1
- package/dist/esm/utils/log-wrapper.d.ts +1 -1
- package/dist/esm/utils/log-wrapper.js.map +1 -1
- package/dist/esm/utils/n8n-binary-loader.js.map +1 -1
- package/dist/esm/utils/n8n-json-loader.js.map +1 -1
- package/dist/esm/utils/n8n-llm-tracing.js.map +1 -1
- package/dist/esm/utils/redact-headers.js.map +1 -1
- package/dist/esm/utils/shared-fields.js.map +1 -1
- package/dist/esm/utils/sse.js.map +1 -1
- package/dist/esm/utils/text-editor.js.map +1 -1
- package/dist/esm/utils/tokenizer/tiktoken.js.map +1 -1
- package/dist/esm/utils/tokenizer/token-estimator.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/config.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +43 -33
- package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js +15 -0
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
- package/dist/esm/utils/vector-store/processDocuments.js.map +1 -1
- package/dist/esm/utils/workflow-text-editor.js.map +1 -1
- package/dist/esm/web-search/brave-search.js.map +1 -1
- package/dist/esm/web-search/searxng-search.js.map +1 -1
- package/package.json +22 -7
|
@@ -1,322 +1,312 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TextEditorDocument = exports.FileNotFoundError = exports.InvalidPathError = exports.InvalidViewRangeError = exports.InvalidLineNumberError = exports.MultipleMatchesError = exports.NoMatchFoundError = void 0;
|
|
4
|
+
exports.formatTextWithLineNumbers = formatTextWithLineNumbers;
|
|
5
|
+
exports.findDivergenceContext = findDivergenceContext;
|
|
6
|
+
exports.parseStrReplacements = parseStrReplacements;
|
|
7
|
+
class NoMatchFoundError extends Error {
|
|
8
|
+
constructor(_searchStr, nearMatchContext) {
|
|
9
|
+
const base = 'No exact match found for str_replace. The old_str content was not found in the file.';
|
|
10
|
+
const message = nearMatchContext ? `${base}\n${nearMatchContext}` : base;
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'NoMatchFoundError';
|
|
5
13
|
}
|
|
6
|
-
|
|
7
|
-
|
|
14
|
+
}
|
|
15
|
+
exports.NoMatchFoundError = NoMatchFoundError;
|
|
16
|
+
class MultipleMatchesError extends Error {
|
|
17
|
+
constructor(count) {
|
|
18
|
+
super(`Found ${count} matches. Please provide more context to make the replacement unique.`);
|
|
19
|
+
this.name = 'MultipleMatchesError';
|
|
8
20
|
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
exports.parseStrReplacements = parseStrReplacements;
|
|
16
|
-
class NoMatchFoundError extends Error {
|
|
17
|
-
constructor(_searchStr, nearMatchContext) {
|
|
18
|
-
const base = 'No exact match found for str_replace. The old_str content was not found in the file.';
|
|
19
|
-
const message = nearMatchContext ? `${base}\n${nearMatchContext}` : base;
|
|
20
|
-
super(message);
|
|
21
|
-
this.name = 'NoMatchFoundError';
|
|
22
|
-
}
|
|
21
|
+
}
|
|
22
|
+
exports.MultipleMatchesError = MultipleMatchesError;
|
|
23
|
+
class InvalidLineNumberError extends Error {
|
|
24
|
+
constructor(line, maxLine) {
|
|
25
|
+
super(`Invalid line number ${line}. File has ${maxLine} lines (valid range: 0-${maxLine}).`);
|
|
26
|
+
this.name = 'InvalidLineNumberError';
|
|
23
27
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
}
|
|
29
|
+
exports.InvalidLineNumberError = InvalidLineNumberError;
|
|
30
|
+
class InvalidViewRangeError extends Error {
|
|
31
|
+
constructor(start, end, maxLine) {
|
|
32
|
+
super(`Invalid view range: end (${end}) must be >= start (${start}). File has ${maxLine} lines (valid range: 1-${maxLine}).`);
|
|
33
|
+
this.name = 'InvalidViewRangeError';
|
|
30
34
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
}
|
|
36
|
+
exports.InvalidViewRangeError = InvalidViewRangeError;
|
|
37
|
+
class InvalidPathError extends Error {
|
|
38
|
+
constructor(path, supportedPath, message) {
|
|
39
|
+
super(message ?? `Invalid path "${path}". Only ${supportedPath} is supported.`);
|
|
40
|
+
this.name = 'InvalidPathError';
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
}
|
|
43
|
+
exports.InvalidPathError = InvalidPathError;
|
|
44
|
+
class FileNotFoundError extends Error {
|
|
45
|
+
constructor(message = 'No file content exists yet. Use create first.') {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = 'FileNotFoundError';
|
|
44
48
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
49
|
+
}
|
|
50
|
+
exports.FileNotFoundError = FileNotFoundError;
|
|
51
|
+
const PREVIEW_MAX_LENGTH = 80;
|
|
52
|
+
const MIN_PREFIX_LENGTH = 10;
|
|
53
|
+
const CONTEXT_LINES = 3;
|
|
54
|
+
const OLD_STR_CONTEXT_LENGTH = 40;
|
|
55
|
+
function truncatePreview(str) {
|
|
56
|
+
if (str.length <= PREVIEW_MAX_LENGTH)
|
|
57
|
+
return str;
|
|
58
|
+
return str.slice(0, PREVIEW_MAX_LENGTH) + '...';
|
|
59
|
+
}
|
|
60
|
+
function escapeWhitespace(str) {
|
|
61
|
+
return str.replace(/\n/g, '\\n').replace(/\t/g, '\\t').replace(/\r/g, '\\r');
|
|
62
|
+
}
|
|
63
|
+
function isObjectRecord(value) {
|
|
64
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
65
|
+
}
|
|
66
|
+
function isUnknownArray(value) {
|
|
67
|
+
return Array.isArray(value);
|
|
68
|
+
}
|
|
69
|
+
function formatTextWithLineNumbers(text) {
|
|
70
|
+
const lines = text.split('\n');
|
|
71
|
+
return lines.map((line, i) => `${i + 1}: ${line}`).join('\n');
|
|
72
|
+
}
|
|
73
|
+
function findDivergenceContext(code, searchStr) {
|
|
74
|
+
let lo = 0;
|
|
75
|
+
let hi = searchStr.length;
|
|
76
|
+
while (lo < hi) {
|
|
77
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
78
|
+
if (code.includes(searchStr.substring(0, mid))) {
|
|
79
|
+
lo = mid;
|
|
50
80
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class FileNotFoundError extends Error {
|
|
54
|
-
constructor(message = 'No file content exists yet. Use create first.') {
|
|
55
|
-
super(message);
|
|
56
|
-
this.name = 'FileNotFoundError';
|
|
81
|
+
else {
|
|
82
|
+
hi = mid - 1;
|
|
57
83
|
}
|
|
58
84
|
}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
85
|
+
const matchLength = lo;
|
|
86
|
+
if (matchLength < MIN_PREFIX_LENGTH)
|
|
87
|
+
return undefined;
|
|
88
|
+
const matchPos = code.indexOf(searchStr.substring(0, matchLength));
|
|
89
|
+
const divergePos = matchPos + matchLength;
|
|
90
|
+
const percentage = Math.round((matchLength / searchStr.length) * 100);
|
|
91
|
+
const codeUpToDiverge = code.substring(0, divergePos);
|
|
92
|
+
const divergeLine = codeUpToDiverge.split('\n').length;
|
|
93
|
+
const oldStrRemainder = searchStr.substring(matchLength, matchLength + OLD_STR_CONTEXT_LENGTH);
|
|
94
|
+
const oldStrPrefix = searchStr.substring(Math.max(0, matchLength - 20), matchLength);
|
|
95
|
+
const codeLines = code.split('\n');
|
|
96
|
+
const startLine = Math.max(0, divergeLine - CONTEXT_LINES);
|
|
97
|
+
const endLine = Math.min(codeLines.length, divergeLine + 1);
|
|
98
|
+
const fileContext = codeLines
|
|
99
|
+
.slice(startLine, endLine)
|
|
100
|
+
.map((line, i) => ` ${startLine + i + 1}: ${line}`)
|
|
101
|
+
.join('\n');
|
|
102
|
+
return (`Closest match (${percentage}% of old_str matched, diverges at line ${divergeLine}):\n` +
|
|
103
|
+
` old_str: ...${escapeWhitespace(oldStrPrefix)}>>> ${escapeWhitespace(oldStrRemainder)}\n` +
|
|
104
|
+
` file:\n${fileContext}`);
|
|
105
|
+
}
|
|
106
|
+
function parseStrReplacements(raw) {
|
|
107
|
+
let parsed = raw;
|
|
108
|
+
if (typeof parsed === 'string') {
|
|
109
|
+
try {
|
|
110
|
+
parsed = JSON.parse(parsed);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
throw new Error('replacements must be a JSON array of {old_str, new_str} objects, but received an invalid JSON string.');
|
|
114
|
+
}
|
|
77
115
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return lines.map((line, i) => `${i + 1}: ${line}`).join('\n');
|
|
116
|
+
if (!isUnknownArray(parsed)) {
|
|
117
|
+
throw new Error('replacements must be an array of {old_str, new_str} objects. Example: {"replacements": [{"old_str": "foo", "new_str": "bar"}]}');
|
|
81
118
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
hi = mid - 1;
|
|
92
|
-
}
|
|
119
|
+
const replacements = [];
|
|
120
|
+
for (let i = 0; i < parsed.length; i++) {
|
|
121
|
+
const item = parsed[i];
|
|
122
|
+
if (!isObjectRecord(item) || typeof item.old_str !== 'string') {
|
|
123
|
+
throw new Error(`replacements[${i}] is missing a valid "old_str" string. Each replacement must have {old_str: string, new_str: string}.`);
|
|
124
|
+
}
|
|
125
|
+
if (typeof item.new_str !== 'string') {
|
|
126
|
+
throw new Error(`replacements[${i}] is missing a valid "new_str" string. Each replacement must have {old_str: string, new_str: string}.`);
|
|
93
127
|
}
|
|
94
|
-
|
|
95
|
-
if (matchLength < MIN_PREFIX_LENGTH)
|
|
96
|
-
return undefined;
|
|
97
|
-
const matchPos = code.indexOf(searchStr.substring(0, matchLength));
|
|
98
|
-
const divergePos = matchPos + matchLength;
|
|
99
|
-
const percentage = Math.round((matchLength / searchStr.length) * 100);
|
|
100
|
-
const codeUpToDiverge = code.substring(0, divergePos);
|
|
101
|
-
const divergeLine = codeUpToDiverge.split('\n').length;
|
|
102
|
-
const oldStrRemainder = searchStr.substring(matchLength, matchLength + OLD_STR_CONTEXT_LENGTH);
|
|
103
|
-
const oldStrPrefix = searchStr.substring(Math.max(0, matchLength - 20), matchLength);
|
|
104
|
-
const codeLines = code.split('\n');
|
|
105
|
-
const startLine = Math.max(0, divergeLine - CONTEXT_LINES);
|
|
106
|
-
const endLine = Math.min(codeLines.length, divergeLine + 1);
|
|
107
|
-
const fileContext = codeLines
|
|
108
|
-
.slice(startLine, endLine)
|
|
109
|
-
.map((line, i) => ` ${startLine + i + 1}: ${line}`)
|
|
110
|
-
.join('\n');
|
|
111
|
-
return (`Closest match (${percentage}% of old_str matched, diverges at line ${divergeLine}):\n` +
|
|
112
|
-
` old_str: ...${escapeWhitespace(oldStrPrefix)}>>> ${escapeWhitespace(oldStrRemainder)}\n` +
|
|
113
|
-
` file:\n${fileContext}`);
|
|
128
|
+
replacements.push({ old_str: item.old_str, new_str: item.new_str });
|
|
114
129
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
130
|
+
return replacements;
|
|
131
|
+
}
|
|
132
|
+
class TextEditorDocument {
|
|
133
|
+
constructor(options = {}) {
|
|
134
|
+
this.text = options.initialText ?? null;
|
|
135
|
+
this.options = options;
|
|
136
|
+
}
|
|
137
|
+
execute(command) {
|
|
138
|
+
if (command.command === 'create') {
|
|
139
|
+
this.validateCreatePath(command.path);
|
|
124
140
|
}
|
|
125
|
-
|
|
126
|
-
|
|
141
|
+
this.validatePath(command.path);
|
|
142
|
+
switch (command.command) {
|
|
143
|
+
case 'view':
|
|
144
|
+
return this.handleView(command);
|
|
145
|
+
case 'create':
|
|
146
|
+
return this.handleCreate(command);
|
|
147
|
+
case 'str_replace':
|
|
148
|
+
return this.handleStrReplace(command);
|
|
149
|
+
case 'insert':
|
|
150
|
+
return this.handleInsert(command);
|
|
127
151
|
}
|
|
128
|
-
const replacements = [];
|
|
129
|
-
for (let i = 0; i < parsed.length; i++) {
|
|
130
|
-
const item = parsed[i];
|
|
131
|
-
if (!isObjectRecord(item) || typeof item.old_str !== 'string') {
|
|
132
|
-
throw new Error(`replacements[${i}] is missing a valid "old_str" string. Each replacement must have {old_str: string, new_str: string}.`);
|
|
133
|
-
}
|
|
134
|
-
if (typeof item.new_str !== 'string') {
|
|
135
|
-
throw new Error(`replacements[${i}] is missing a valid "new_str" string. Each replacement must have {old_str: string, new_str: string}.`);
|
|
136
|
-
}
|
|
137
|
-
replacements.push({ old_str: item.old_str, new_str: item.new_str });
|
|
138
|
-
}
|
|
139
|
-
return replacements;
|
|
140
152
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.
|
|
144
|
-
this.options = options;
|
|
153
|
+
executeBatch(replacements) {
|
|
154
|
+
if (this.text === null) {
|
|
155
|
+
throw this.createFileNotFoundError();
|
|
145
156
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
this.validateCreatePath(command.path);
|
|
149
|
-
}
|
|
150
|
-
this.validatePath(command.path);
|
|
151
|
-
switch (command.command) {
|
|
152
|
-
case 'view':
|
|
153
|
-
return this.handleView(command);
|
|
154
|
-
case 'create':
|
|
155
|
-
return this.handleCreate(command);
|
|
156
|
-
case 'str_replace':
|
|
157
|
-
return this.handleStrReplace(command);
|
|
158
|
-
case 'insert':
|
|
159
|
-
return this.handleInsert(command);
|
|
160
|
-
}
|
|
157
|
+
if (replacements.length === 0) {
|
|
158
|
+
return 'No replacements to apply.';
|
|
161
159
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
const snapshot = this.text;
|
|
161
|
+
const results = [];
|
|
162
|
+
for (let i = 0; i < replacements.length; i++) {
|
|
163
|
+
const { old_str, new_str } = replacements[i];
|
|
164
|
+
const preview = truncatePreview(old_str);
|
|
165
|
+
const count = this.countOccurrences(this.text, old_str);
|
|
166
|
+
if (count === 0) {
|
|
167
|
+
this.text = snapshot;
|
|
168
|
+
results.push({
|
|
169
|
+
index: i,
|
|
170
|
+
old_str: preview,
|
|
171
|
+
status: 'failed',
|
|
172
|
+
error: new NoMatchFoundError(old_str).message,
|
|
173
|
+
});
|
|
174
|
+
this.appendNotAttemptedResults(results, replacements, i + 1);
|
|
175
|
+
return results;
|
|
168
176
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
old_str: preview,
|
|
180
|
-
status: 'failed',
|
|
181
|
-
error: new NoMatchFoundError(old_str).message,
|
|
182
|
-
});
|
|
183
|
-
this.appendNotAttemptedResults(results, replacements, i + 1);
|
|
184
|
-
return results;
|
|
185
|
-
}
|
|
186
|
-
if (count > 1) {
|
|
187
|
-
this.text = snapshot;
|
|
188
|
-
results.push({
|
|
189
|
-
index: i,
|
|
190
|
-
old_str: preview,
|
|
191
|
-
status: 'failed',
|
|
192
|
-
error: new MultipleMatchesError(count).message,
|
|
193
|
-
});
|
|
194
|
-
this.appendNotAttemptedResults(results, replacements, i + 1);
|
|
195
|
-
return results;
|
|
196
|
-
}
|
|
197
|
-
this.text = this.text.replace(old_str, this.escapeReplacement(new_str));
|
|
198
|
-
results.push({ index: i, old_str: preview, status: 'success' });
|
|
177
|
+
if (count > 1) {
|
|
178
|
+
this.text = snapshot;
|
|
179
|
+
results.push({
|
|
180
|
+
index: i,
|
|
181
|
+
old_str: preview,
|
|
182
|
+
status: 'failed',
|
|
183
|
+
error: new MultipleMatchesError(count).message,
|
|
184
|
+
});
|
|
185
|
+
this.appendNotAttemptedResults(results, replacements, i + 1);
|
|
186
|
+
return results;
|
|
199
187
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
getText() {
|
|
203
|
-
return this.text;
|
|
204
|
-
}
|
|
205
|
-
setText(text) {
|
|
206
|
-
this.text = text;
|
|
207
|
-
}
|
|
208
|
-
hasText() {
|
|
209
|
-
return this.text !== null;
|
|
188
|
+
this.text = this.text.replace(old_str, this.escapeReplacement(new_str));
|
|
189
|
+
results.push({ index: i, old_str: preview, status: 'success' });
|
|
210
190
|
}
|
|
211
|
-
|
|
212
|
-
|
|
191
|
+
return `All ${replacements.length} replacements applied successfully.`;
|
|
192
|
+
}
|
|
193
|
+
getText() {
|
|
194
|
+
return this.text;
|
|
195
|
+
}
|
|
196
|
+
setText(text) {
|
|
197
|
+
this.text = text;
|
|
198
|
+
}
|
|
199
|
+
hasText() {
|
|
200
|
+
return this.text !== null;
|
|
201
|
+
}
|
|
202
|
+
clearText() {
|
|
203
|
+
this.text = null;
|
|
204
|
+
}
|
|
205
|
+
validateCreatePath(path) {
|
|
206
|
+
const supportedPath = this.options.supportedPath;
|
|
207
|
+
if (supportedPath === undefined || path === supportedPath) {
|
|
208
|
+
return;
|
|
213
209
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
210
|
+
throw new Error(this.options.createInvalidPathMessage?.(path, supportedPath) ??
|
|
211
|
+
`Cannot create "${path}". Only ${supportedPath} is supported.`);
|
|
212
|
+
}
|
|
213
|
+
validatePath(path) {
|
|
214
|
+
const supportedPath = this.options.supportedPath;
|
|
215
|
+
if (supportedPath === undefined || path === supportedPath) {
|
|
216
|
+
return;
|
|
221
217
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
throw this.createInvalidPathError(path, supportedPath, this.options.invalidPathMessage?.(path, supportedPath));
|
|
218
|
+
throw this.createInvalidPathError(path, supportedPath, this.options.invalidPathMessage?.(path, supportedPath));
|
|
219
|
+
}
|
|
220
|
+
handleView(command) {
|
|
221
|
+
if (this.text === null) {
|
|
222
|
+
throw this.createFileNotFoundError();
|
|
228
223
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
224
|
+
const lines = this.text.split('\n');
|
|
225
|
+
if (command.view_range) {
|
|
226
|
+
const [start, rawEnd] = command.view_range;
|
|
227
|
+
const end = rawEnd === -1 ? lines.length : rawEnd;
|
|
228
|
+
if (start < 1 || start > lines.length) {
|
|
229
|
+
throw new InvalidLineNumberError(start, lines.length);
|
|
232
230
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
const [start, rawEnd] = command.view_range;
|
|
236
|
-
const end = rawEnd === -1 ? lines.length : rawEnd;
|
|
237
|
-
if (start < 1 || start > lines.length) {
|
|
238
|
-
throw new InvalidLineNumberError(start, lines.length);
|
|
239
|
-
}
|
|
240
|
-
if (end < start) {
|
|
241
|
-
throw new InvalidViewRangeError(start, end, lines.length);
|
|
242
|
-
}
|
|
243
|
-
const startIndex = start - 1;
|
|
244
|
-
const endIndex = Math.min(end, lines.length);
|
|
245
|
-
const selectedLines = lines.slice(startIndex, endIndex);
|
|
246
|
-
return selectedLines.map((line, i) => `${startIndex + i + 1}: ${line}`).join('\n');
|
|
231
|
+
if (end < start) {
|
|
232
|
+
throw new InvalidViewRangeError(start, end, lines.length);
|
|
247
233
|
}
|
|
248
|
-
|
|
234
|
+
const startIndex = start - 1;
|
|
235
|
+
const endIndex = Math.min(end, lines.length);
|
|
236
|
+
const selectedLines = lines.slice(startIndex, endIndex);
|
|
237
|
+
return selectedLines.map((line, i) => `${startIndex + i + 1}: ${line}`).join('\n');
|
|
249
238
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
239
|
+
return formatTextWithLineNumbers(this.text);
|
|
240
|
+
}
|
|
241
|
+
handleCreate(command) {
|
|
242
|
+
this.text = command.file_text;
|
|
243
|
+
return 'File created successfully.';
|
|
244
|
+
}
|
|
245
|
+
handleStrReplace(command) {
|
|
246
|
+
if (this.text === null) {
|
|
247
|
+
throw this.createFileNotFoundError();
|
|
253
248
|
}
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
249
|
+
const { old_str, new_str } = command;
|
|
250
|
+
const count = this.countOccurrences(this.text, old_str);
|
|
251
|
+
if (count === 0) {
|
|
252
|
+
const normalized = old_str.endsWith('\n') ? old_str.slice(0, -1) : old_str + '\n';
|
|
253
|
+
const normalizedCount = this.countOccurrences(this.text, normalized);
|
|
254
|
+
if (normalizedCount === 1) {
|
|
255
|
+
this.text = this.text.replace(normalized, this.escapeReplacement(new_str));
|
|
256
|
+
return 'Edit applied successfully.';
|
|
257
257
|
}
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
if (count === 0) {
|
|
261
|
-
const normalized = old_str.endsWith('\n') ? old_str.slice(0, -1) : old_str + '\n';
|
|
262
|
-
const normalizedCount = this.countOccurrences(this.text, normalized);
|
|
263
|
-
if (normalizedCount === 1) {
|
|
264
|
-
this.text = this.text.replace(normalized, this.escapeReplacement(new_str));
|
|
265
|
-
return 'Edit applied successfully.';
|
|
266
|
-
}
|
|
267
|
-
const context = findDivergenceContext(this.text, old_str);
|
|
268
|
-
throw new NoMatchFoundError(old_str, context);
|
|
269
|
-
}
|
|
270
|
-
if (count > 1) {
|
|
271
|
-
throw new MultipleMatchesError(count);
|
|
272
|
-
}
|
|
273
|
-
this.text = this.text.replace(old_str, this.escapeReplacement(new_str));
|
|
274
|
-
return 'Edit applied successfully.';
|
|
258
|
+
const context = findDivergenceContext(this.text, old_str);
|
|
259
|
+
throw new NoMatchFoundError(old_str, context);
|
|
275
260
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
throw this.createFileNotFoundError();
|
|
279
|
-
}
|
|
280
|
-
const { insert_line, insert_text } = command;
|
|
281
|
-
const lines = this.text.split('\n');
|
|
282
|
-
if (insert_line < 0 || insert_line > lines.length) {
|
|
283
|
-
throw new InvalidLineNumberError(insert_line, lines.length);
|
|
284
|
-
}
|
|
285
|
-
lines.splice(insert_line, 0, insert_text);
|
|
286
|
-
this.text = lines.join('\n');
|
|
287
|
-
return 'Text inserted successfully.';
|
|
261
|
+
if (count > 1) {
|
|
262
|
+
throw new MultipleMatchesError(count);
|
|
288
263
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
while ((pos = text.indexOf(search, pos)) !== -1) {
|
|
296
|
-
count++;
|
|
297
|
-
pos += search.length;
|
|
298
|
-
}
|
|
299
|
-
return count;
|
|
264
|
+
this.text = this.text.replace(old_str, this.escapeReplacement(new_str));
|
|
265
|
+
return 'Edit applied successfully.';
|
|
266
|
+
}
|
|
267
|
+
handleInsert(command) {
|
|
268
|
+
if (this.text === null) {
|
|
269
|
+
throw this.createFileNotFoundError();
|
|
300
270
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
old_str: truncatePreview(replacements[i].old_str),
|
|
306
|
-
status: 'not_attempted',
|
|
307
|
-
});
|
|
308
|
-
}
|
|
271
|
+
const { insert_line, insert_text } = command;
|
|
272
|
+
const lines = this.text.split('\n');
|
|
273
|
+
if (insert_line < 0 || insert_line > lines.length) {
|
|
274
|
+
throw new InvalidLineNumberError(insert_line, lines.length);
|
|
309
275
|
}
|
|
310
|
-
|
|
311
|
-
|
|
276
|
+
lines.splice(insert_line, 0, insert_text);
|
|
277
|
+
this.text = lines.join('\n');
|
|
278
|
+
return 'Text inserted successfully.';
|
|
279
|
+
}
|
|
280
|
+
countOccurrences(text, search) {
|
|
281
|
+
if (search.length === 0) {
|
|
282
|
+
return 0;
|
|
312
283
|
}
|
|
313
|
-
|
|
314
|
-
|
|
284
|
+
let count = 0;
|
|
285
|
+
let pos = 0;
|
|
286
|
+
while ((pos = text.indexOf(search, pos)) !== -1) {
|
|
287
|
+
count++;
|
|
288
|
+
pos += search.length;
|
|
315
289
|
}
|
|
316
|
-
|
|
317
|
-
|
|
290
|
+
return count;
|
|
291
|
+
}
|
|
292
|
+
appendNotAttemptedResults(results, replacements, startIndex) {
|
|
293
|
+
for (let i = startIndex; i < replacements.length; i++) {
|
|
294
|
+
results.push({
|
|
295
|
+
index: i,
|
|
296
|
+
old_str: truncatePreview(replacements[i].old_str),
|
|
297
|
+
status: 'not_attempted',
|
|
298
|
+
});
|
|
318
299
|
}
|
|
319
300
|
}
|
|
320
|
-
|
|
321
|
-
|
|
301
|
+
createInvalidPathError(path, supportedPath, message) {
|
|
302
|
+
return new InvalidPathError(path, supportedPath, message);
|
|
303
|
+
}
|
|
304
|
+
createFileNotFoundError() {
|
|
305
|
+
return new FileNotFoundError(this.options.fileNotFoundMessage);
|
|
306
|
+
}
|
|
307
|
+
escapeReplacement(replacement) {
|
|
308
|
+
return replacement.replace(/\$/g, '$$$$');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
exports.TextEditorDocument = TextEditorDocument;
|
|
322
312
|
//# sourceMappingURL=text-editor.js.map
|