@mate-academy/llm-gateway 6.0.0 → 6.2.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/dist/LLMError.d.ts +12 -0
- package/dist/LLMError.js +36 -0
- package/dist/LLMError.js.map +1 -0
- package/dist/LLMService.constants.d.ts +792 -2
- package/dist/LLMService.constants.js +5 -1
- package/dist/LLMService.constants.js.map +1 -1
- package/dist/LLMService.typedefs.d.ts +24 -2
- package/dist/LLMService.typedefs.js +1 -0
- package/dist/LLMService.typedefs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.d.ts +72 -0
- package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.js +6 -0
- package/dist/providers/GoogleGenerativeAI/GoogleGenerativeAI.constants.js.map +1 -1
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.d.ts +8 -7
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js +217 -31
- package/dist/providers/GoogleGenerativeAI/services/GoogleGenerativeAIAssistance.service.js.map +1 -1
- package/dist/providers/LLMAPI/LLMAPI.constants.d.ts +884 -0
- package/dist/providers/LLMAPI/LLMAPI.constants.js +282 -0
- package/dist/providers/LLMAPI/LLMAPI.constants.js.map +1 -0
- package/dist/providers/LLMAPI/LLMAPI.entity.d.ts +6 -0
- package/dist/providers/LLMAPI/LLMAPI.entity.js +49 -0
- package/dist/providers/LLMAPI/LLMAPI.entity.js.map +1 -0
- package/dist/providers/LLMAPI/LLMAPI.typedefs.d.ts +48 -0
- package/dist/providers/LLMAPI/LLMAPI.typedefs.js +46 -0
- package/dist/providers/LLMAPI/LLMAPI.typedefs.js.map +1 -0
- package/dist/providers/LLMAPI/LLMAPIService.factory.d.ts +6 -0
- package/dist/providers/LLMAPI/LLMAPIService.factory.js +19 -0
- package/dist/providers/LLMAPI/LLMAPIService.factory.js.map +1 -0
- package/dist/providers/LLMAPI/index.d.ts +6 -0
- package/dist/providers/LLMAPI/index.js +23 -0
- package/dist/providers/LLMAPI/index.js.map +1 -0
- package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.d.ts +3 -0
- package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.js +8 -0
- package/dist/providers/LLMAPI/schemas/LLMAPISchemaAdapter.js.map +1 -0
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.d.ts +34 -0
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js +497 -0
- package/dist/providers/LLMAPI/services/LLMAPIAssistance.service.js.map +1 -0
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.d.ts +18 -0
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js +138 -0
- package/dist/providers/LLMAPI/services/LLMAPICompletion.service.js.map +1 -0
- package/dist/providers/LLMAPI/services/index.d.ts +2 -0
- package/dist/providers/LLMAPI/services/index.js +19 -0
- package/dist/providers/LLMAPI/services/index.js.map +1 -0
- package/dist/providers/LLMAPI/utilities/LLMAPIJsonFixer.d.ts +22 -0
- package/dist/providers/LLMAPI/utilities/LLMAPIJsonFixer.js +228 -0
- package/dist/providers/LLMAPI/utilities/LLMAPIJsonFixer.js.map +1 -0
- package/dist/providers/LLMAPI/utilities/index.d.ts +1 -0
- package/dist/providers/LLMAPI/utilities/index.js +7 -0
- package/dist/providers/LLMAPI/utilities/index.js.map +1 -0
- package/dist/providers/OpenAI/OpenAI.constants.d.ts +165 -0
- package/dist/providers/OpenAI/OpenAI.constants.js +11 -0
- package/dist/providers/OpenAI/OpenAI.constants.js.map +1 -1
- package/dist/providers/OpenAI/OpenAI.typedefs.d.ts +6 -0
- package/dist/providers/OpenAI/OpenAI.typedefs.js +9 -1
- package/dist/providers/OpenAI/OpenAI.typedefs.js.map +1 -1
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.d.ts +9 -7
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.js +209 -40
- package/dist/providers/OpenAI/services/OpenAIAssistance.service.js.map +1 -1
- package/dist/providers/OpenAI/services/OpenAICompletion.service.d.ts +3 -13
- package/dist/providers/OpenAI/services/OpenAICompletion.service.js +2 -181
- package/dist/providers/OpenAI/services/OpenAICompletion.service.js.map +1 -1
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.d.ts +21 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js +204 -0
- package/dist/providers/OpenAICompatible/OpenAICompatibleCompletion.service.js.map +1 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/services/LLMAssistanceService.abstract.d.ts +8 -6
- package/dist/services/LLMAssistanceService.abstract.js +20 -0
- package/dist/services/LLMAssistanceService.abstract.js.map +1 -1
- package/dist/services/chatState/CompletionsChatState.d.ts +19 -0
- package/dist/services/chatState/CompletionsChatState.js +80 -0
- package/dist/services/chatState/CompletionsChatState.js.map +1 -0
- package/dist/services/chatState/index.d.ts +1 -0
- package/dist/services/chatState/index.js +6 -0
- package/dist/services/chatState/index.js.map +1 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.d.ts +15 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.js +172 -0
- package/dist/services/fileStorage/FileStorageToolExecutor.js.map +1 -0
- package/dist/services/fileStorage/InMemoryFileStorage.d.ts +20 -0
- package/dist/services/fileStorage/InMemoryFileStorage.js +67 -0
- package/dist/services/fileStorage/InMemoryFileStorage.js.map +1 -0
- package/dist/services/fileStorage/fileStorageTools.d.ts +26 -0
- package/dist/services/fileStorage/fileStorageTools.js +67 -0
- package/dist/services/fileStorage/fileStorageTools.js.map +1 -0
- package/dist/services/fileStorage/index.d.ts +4 -0
- package/dist/services/fileStorage/index.js +11 -0
- package/dist/services/fileStorage/index.js.map +1 -0
- package/dist/utilities/index.d.ts +1 -0
- package/dist/utilities/index.js +1 -0
- package/dist/utilities/index.js.map +1 -1
- package/dist/utilities/schema/SchemaAdapterRegistry.d.ts +2 -0
- package/dist/utilities/schema/SchemaAdapterRegistry.js +2 -0
- package/dist/utilities/schema/SchemaAdapterRegistry.js.map +1 -1
- package/dist/utilities/tools/LLMTool.d.ts +10 -0
- package/dist/utilities/tools/LLMTool.js +10 -0
- package/dist/utilities/tools/LLMTool.js.map +1 -0
- package/dist/utilities/tools/index.d.ts +1 -0
- package/dist/utilities/tools/index.js +6 -0
- package/dist/utilities/tools/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAICompletion.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAICompletion.service.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"OpenAICompletion.service.js","sourceRoot":"","sources":["../../../../src/providers/OpenAI/services/OpenAICompletion.service.ts"],"names":[],"mappings":";;;AAAA,+DAG+B;AAG/B,wHAEyE;AAEzE,MAAa,uBAEX,SAAQ,sEAET;IACC,YACE,MAAsC,EACtC,QAAkB,EAClB,OAAiD;QAEjD,KAAK,CAAC,kCAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;CACF;AAZD,0DAYC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenAI } from 'openai';
|
|
2
|
+
import type { LLMCompletionMessage, LLMCompletionResult, LLMInstanceOptions, LLMModel, LLMProviders, LLMSendMessageOptions, LLMStructuredResult } from '../../LLMService.typedefs';
|
|
3
|
+
import { type LLMLoggerInterface } from '../../utilities/logger';
|
|
4
|
+
import { type LLMReporterInterface } from '../../utilities/reporter';
|
|
5
|
+
import { LLMCompletionService } from '../../services';
|
|
6
|
+
import { type LLMSchemaInterface, type InferSchema } from '../../utilities/schema';
|
|
7
|
+
type OpenAICompatibleProvider = LLMProviders.OpenAI | LLMProviders.LLMAPI;
|
|
8
|
+
export declare class OpenAICompatibleCompletionService<Provider extends OpenAICompatibleProvider, Reporter extends LLMReporterInterface<any> | undefined> extends LLMCompletionService<Provider, Reporter> {
|
|
9
|
+
constructor(provider: Provider, logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[Provider]);
|
|
10
|
+
get instance(): OpenAI;
|
|
11
|
+
sendMessage<S extends LLMSchemaInterface>(options: LLMSendMessageOptions<Provider, Reporter> & {
|
|
12
|
+
schema: S;
|
|
13
|
+
}): Promise<LLMStructuredResult<InferSchema<S>>>;
|
|
14
|
+
sendMessage(options: LLMSendMessageOptions<Provider, Reporter>): Promise<LLMCompletionResult>;
|
|
15
|
+
countTokens(messages: LLMCompletionMessage[], _model: LLMModel<Provider>): Promise<number>;
|
|
16
|
+
protected sendTextMessage(options: LLMSendMessageOptions<Provider, Reporter>): Promise<LLMCompletionResult>;
|
|
17
|
+
protected sendStructuredMessage(options: LLMSendMessageOptions<Provider, Reporter> & {
|
|
18
|
+
schema: LLMSchemaInterface;
|
|
19
|
+
}): Promise<LLMStructuredResult>;
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAICompatibleCompletionService = void 0;
|
|
4
|
+
const openai_1 = require("openai");
|
|
5
|
+
const serializeError_1 = require("../../utilities/serializeError");
|
|
6
|
+
const services_1 = require("../../services");
|
|
7
|
+
const OpenAI_entity_1 = require("../../providers/OpenAI/OpenAI.entity");
|
|
8
|
+
class OpenAICompatibleCompletionService extends services_1.LLMCompletionService {
|
|
9
|
+
constructor(provider, logger, reporter, options) {
|
|
10
|
+
super(provider, logger, reporter, options);
|
|
11
|
+
}
|
|
12
|
+
get instance() {
|
|
13
|
+
return this.getOrCreateInstance(() => new openai_1.OpenAI(this.options));
|
|
14
|
+
}
|
|
15
|
+
async sendMessage(options) {
|
|
16
|
+
if (options.schema) {
|
|
17
|
+
return this.sendStructuredMessage(options);
|
|
18
|
+
}
|
|
19
|
+
return this.sendTextMessage(options);
|
|
20
|
+
}
|
|
21
|
+
async countTokens(messages, _model) {
|
|
22
|
+
const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
|
|
23
|
+
const allContents = messages.flatMap((message) => message.content);
|
|
24
|
+
return countTokensFn(allContents);
|
|
25
|
+
}
|
|
26
|
+
async sendTextMessage(options) {
|
|
27
|
+
const { model, message, history = [], instructions, abortSignal, reporterContext, } = options;
|
|
28
|
+
const writeMetrics = this.reporter?.initWriter(reporterContext);
|
|
29
|
+
try {
|
|
30
|
+
abortSignal?.throwIfAborted();
|
|
31
|
+
const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
|
|
32
|
+
const combinedMessages = await OpenAI_entity_1.OpenAIEntity
|
|
33
|
+
.combineMessagesWithLimit({
|
|
34
|
+
history,
|
|
35
|
+
message,
|
|
36
|
+
model,
|
|
37
|
+
countTokensFn,
|
|
38
|
+
instance: this.instance,
|
|
39
|
+
logger: this.logger,
|
|
40
|
+
});
|
|
41
|
+
const chatCompletionMessageParam = OpenAI_entity_1.OpenAIEntity
|
|
42
|
+
.getChatCompletionMessageParam(combinedMessages, this.logger);
|
|
43
|
+
const systemMessage = instructions
|
|
44
|
+
? [{ role: 'system', content: instructions }]
|
|
45
|
+
: [];
|
|
46
|
+
abortSignal?.throwIfAborted();
|
|
47
|
+
const completion = await this.instance.chat.completions
|
|
48
|
+
.create({
|
|
49
|
+
model: model.name,
|
|
50
|
+
messages: [
|
|
51
|
+
...systemMessage,
|
|
52
|
+
...chatCompletionMessageParam,
|
|
53
|
+
],
|
|
54
|
+
n: 1,
|
|
55
|
+
...model.config,
|
|
56
|
+
}, {
|
|
57
|
+
signal: abortSignal,
|
|
58
|
+
});
|
|
59
|
+
abortSignal?.throwIfAborted();
|
|
60
|
+
const promptTokens = completion.usage?.prompt_tokens ?? 0;
|
|
61
|
+
const cachedTokens = completion.usage?.prompt_tokens_details
|
|
62
|
+
?.cached_tokens ?? 0;
|
|
63
|
+
const regularInputTokens = promptTokens - cachedTokens;
|
|
64
|
+
const outputTokens = completion.usage?.completion_tokens ?? 0;
|
|
65
|
+
const reasoningTokens = completion.usage?.completion_tokens_details
|
|
66
|
+
?.reasoning_tokens ?? 0;
|
|
67
|
+
await this.writeSuccessMetrics({
|
|
68
|
+
method: this.getMethodName(this.sendTextMessage),
|
|
69
|
+
model,
|
|
70
|
+
usage: {
|
|
71
|
+
inputTextTokens: regularInputTokens,
|
|
72
|
+
inputCachedTextTokens: cachedTokens,
|
|
73
|
+
outputTextTokens: outputTokens,
|
|
74
|
+
outputReasoningTokens: reasoningTokens,
|
|
75
|
+
},
|
|
76
|
+
writeMetrics,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
text: completion.choices[0]?.message.content ?? '',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
await this.writeErrorMetrics({
|
|
84
|
+
method: this.getMethodName(this.sendTextMessage),
|
|
85
|
+
model,
|
|
86
|
+
isAborted: abortSignal?.aborted,
|
|
87
|
+
writeMetrics,
|
|
88
|
+
});
|
|
89
|
+
this.logger
|
|
90
|
+
?.child(this.getMethodName(this.sendTextMessage))
|
|
91
|
+
.error('Error sending text message', {
|
|
92
|
+
error: (0, serializeError_1.serializeError)(error),
|
|
93
|
+
options,
|
|
94
|
+
});
|
|
95
|
+
return { error };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async sendStructuredMessage(options) {
|
|
99
|
+
const { model, message, history = [], instructions, abortSignal, schema, reporterContext, } = options;
|
|
100
|
+
const writeMetrics = this.reporter?.initWriter(reporterContext);
|
|
101
|
+
try {
|
|
102
|
+
abortSignal?.throwIfAborted();
|
|
103
|
+
const countTokensFn = OpenAI_entity_1.OpenAIEntity.getCountTokensFn();
|
|
104
|
+
const combinedMessages = await OpenAI_entity_1.OpenAIEntity
|
|
105
|
+
.combineMessagesWithLimit({
|
|
106
|
+
history,
|
|
107
|
+
message,
|
|
108
|
+
model,
|
|
109
|
+
countTokensFn,
|
|
110
|
+
instance: this.instance,
|
|
111
|
+
logger: this.logger,
|
|
112
|
+
});
|
|
113
|
+
const chatCompletionMessageParam = OpenAI_entity_1.OpenAIEntity
|
|
114
|
+
.getChatCompletionMessageParam(combinedMessages, this.logger);
|
|
115
|
+
const systemMessage = instructions
|
|
116
|
+
? [{ role: 'system', content: instructions }]
|
|
117
|
+
: [];
|
|
118
|
+
abortSignal?.throwIfAborted();
|
|
119
|
+
const jsonSchema = schema._toProviderSchema(this.provider);
|
|
120
|
+
const completion = await this.instance.chat.completions
|
|
121
|
+
.create({
|
|
122
|
+
model: model.name,
|
|
123
|
+
messages: [
|
|
124
|
+
...systemMessage,
|
|
125
|
+
...chatCompletionMessageParam,
|
|
126
|
+
],
|
|
127
|
+
n: 1,
|
|
128
|
+
...model.config,
|
|
129
|
+
response_format: {
|
|
130
|
+
type: 'json_schema',
|
|
131
|
+
json_schema: {
|
|
132
|
+
name: 'structured_response',
|
|
133
|
+
strict: true,
|
|
134
|
+
schema: jsonSchema,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
}, {
|
|
138
|
+
signal: abortSignal,
|
|
139
|
+
});
|
|
140
|
+
abortSignal?.throwIfAborted();
|
|
141
|
+
const content = completion.choices[0]?.message.content ?? '';
|
|
142
|
+
if (!content) {
|
|
143
|
+
throw new Error(`Empty response from ${this.provider}`);
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const parsed = JSON.parse(content);
|
|
147
|
+
const validation = schema._parse(parsed);
|
|
148
|
+
const promptTokens = completion.usage?.prompt_tokens ?? 0;
|
|
149
|
+
const cachedTokens = completion.usage?.prompt_tokens_details
|
|
150
|
+
?.cached_tokens ?? 0;
|
|
151
|
+
const regularInputTokens = promptTokens - cachedTokens;
|
|
152
|
+
const outputTokens = completion.usage?.completion_tokens ?? 0;
|
|
153
|
+
const reasoningTokens = completion.usage?.completion_tokens_details
|
|
154
|
+
?.reasoning_tokens ?? 0;
|
|
155
|
+
await this.writeSuccessMetrics({
|
|
156
|
+
method: this.getMethodName(this.sendStructuredMessage),
|
|
157
|
+
model,
|
|
158
|
+
usage: {
|
|
159
|
+
inputTextTokens: regularInputTokens,
|
|
160
|
+
inputCachedTextTokens: cachedTokens,
|
|
161
|
+
outputTextTokens: outputTokens,
|
|
162
|
+
outputReasoningTokens: reasoningTokens,
|
|
163
|
+
},
|
|
164
|
+
writeMetrics,
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
text: content,
|
|
168
|
+
data: validation.data,
|
|
169
|
+
parseError: validation.error,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (parseError) {
|
|
173
|
+
this.logger
|
|
174
|
+
?.child(this.getMethodName(this.sendStructuredMessage))
|
|
175
|
+
.warn('Failed to parse JSON response', {
|
|
176
|
+
content,
|
|
177
|
+
parseError: parseError.message,
|
|
178
|
+
});
|
|
179
|
+
throw parseError;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
await this.writeErrorMetrics({
|
|
184
|
+
method: this.getMethodName(this.sendStructuredMessage),
|
|
185
|
+
model,
|
|
186
|
+
isAborted: abortSignal?.aborted,
|
|
187
|
+
writeMetrics,
|
|
188
|
+
});
|
|
189
|
+
this.logger
|
|
190
|
+
?.child(this.getMethodName(this.sendStructuredMessage))
|
|
191
|
+
.error('Error sending structured message', {
|
|
192
|
+
error: (0, serializeError_1.serializeError)(error),
|
|
193
|
+
options,
|
|
194
|
+
});
|
|
195
|
+
return {
|
|
196
|
+
text: '',
|
|
197
|
+
error,
|
|
198
|
+
parseError: `Failed to get structured response from ${this.provider}`,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.OpenAICompatibleCompletionService = OpenAICompatibleCompletionService;
|
|
204
|
+
//# sourceMappingURL=OpenAICompatibleCompletion.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAICompatibleCompletion.service.js","sourceRoot":"","sources":["../../../src/providers/OpenAICompatible/OpenAICompatibleCompletion.service.ts"],"names":[],"mappings":"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"}
|
package/dist/providers/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./OpenAI"), exports);
|
|
18
18
|
__exportStar(require("./GoogleGenerativeAI"), exports);
|
|
19
|
+
__exportStar(require("./LLMAPI"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,uDAAqC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,uDAAqC;AACrC,2CAAyB"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type LLMAssistanceOptions, type LLMAssistanceResult, type LLMAssistanceMessage, type LLMCreateChatOptions, type LLMCreateChatResult, type LLMCreateFileStorageOptions, type LLMCreateFileStorageResult, type LLMInstanceOptions, type LLMModel, type LLMProviders, LLMPurposes, type LLMUploadFileOptions, type LLMUploadFileResult, type LLMStructuredResult, type LLMUploadedFile } from '../LLMService.typedefs';
|
|
1
|
+
import { type LLMAssistanceOptions, type LLMAssistanceResult, type LLMAssistanceMessage, type LLMToolDefinition, type LLMCreateChatOptions, type LLMCreateChatResult, type LLMCreateFileStorageOptions, type LLMCreateFileStorageResult, type LLMInstanceOptions, type LLMModel, type LLMProviders, LLMPurposes, type LLMUploadFileOptions, type LLMUploadFileResult, type LLMStructuredResult, type LLMUploadedFile } from '../LLMService.typedefs';
|
|
2
2
|
import { type LLMLoggerInterface } from '../utilities/logger';
|
|
3
3
|
import { type LLMReporterInterface } from '../utilities/reporter';
|
|
4
4
|
import { LLMBaseService } from '../services';
|
|
5
5
|
import { type LLMSchemaInterface, type InferSchema } from '../utilities/schema';
|
|
6
6
|
export declare abstract class LLMAssistanceService<Provider extends LLMProviders, Reporter extends LLMReporterInterface<any> | undefined> extends LLMBaseService<LLMPurposes.Assistance, Provider, Reporter> {
|
|
7
7
|
constructor(provider: Provider, logger: LLMLoggerInterface | undefined, reporter: Reporter, options?: LLMInstanceOptions[Provider]);
|
|
8
|
+
protected validateToolDefinitions(tools: LLMToolDefinition[]): void;
|
|
8
9
|
abstract uploadFile(options: LLMUploadFileOptions<Reporter>): Promise<LLMUploadFileResult>;
|
|
9
10
|
abstract getFile(path: string): Promise<LLMUploadedFile | null>;
|
|
10
11
|
abstract deleteFile(fileId: string): Promise<void>;
|
|
@@ -12,12 +13,13 @@ export declare abstract class LLMAssistanceService<Provider extends LLMProviders
|
|
|
12
13
|
abstract deleteFileStorage(fileStorageId: string): Promise<void>;
|
|
13
14
|
abstract createChat(options: LLMCreateChatOptions<Provider, Reporter>): Promise<LLMCreateChatResult>;
|
|
14
15
|
abstract deleteChat(chatId: string): Promise<void>;
|
|
15
|
-
|
|
16
|
+
assistInChat<Schema extends LLMSchemaInterface>(options: LLMAssistanceOptions<Provider, Reporter> & {
|
|
16
17
|
schema: Schema;
|
|
17
18
|
}): Promise<LLMStructuredResult<InferSchema<Schema>>>;
|
|
18
|
-
|
|
19
|
-
abstract
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
assistInChat(options: LLMAssistanceOptions<Provider, Reporter>): Promise<LLMAssistanceResult>;
|
|
20
|
+
protected abstract assistInChatText(options: LLMAssistanceOptions<Provider, Reporter>): Promise<LLMAssistanceResult>;
|
|
21
|
+
protected abstract assistInChatStructured(options: LLMAssistanceOptions<Provider, Reporter> & {
|
|
22
|
+
schema: LLMSchemaInterface;
|
|
23
|
+
}): Promise<LLMStructuredResult>;
|
|
22
24
|
abstract countTokens(messages: LLMAssistanceMessage[], model: LLMModel<Provider>): Promise<number>;
|
|
23
25
|
}
|
|
@@ -7,6 +7,26 @@ class LLMAssistanceService extends services_1.LLMBaseService {
|
|
|
7
7
|
constructor(provider, logger, reporter, options) {
|
|
8
8
|
super(provider, 'AssistanceService', LLMService_typedefs_1.LLMPurposes.Assistance, logger, reporter, options);
|
|
9
9
|
}
|
|
10
|
+
validateToolDefinitions(tools) {
|
|
11
|
+
const namePattern = /^[a-zA-Z0-9_-]+$/;
|
|
12
|
+
const names = new Set();
|
|
13
|
+
for (const tool of tools) {
|
|
14
|
+
if (!namePattern.test(tool.name)) {
|
|
15
|
+
throw new Error(`Invalid tool name "${tool.name}":`
|
|
16
|
+
+ ' must match [a-zA-Z0-9_-]+');
|
|
17
|
+
}
|
|
18
|
+
if (names.has(tool.name)) {
|
|
19
|
+
throw new Error(`Duplicate tool name "${tool.name}"`);
|
|
20
|
+
}
|
|
21
|
+
names.add(tool.name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
assistInChat(options) {
|
|
25
|
+
if (options.schema) {
|
|
26
|
+
return this.assistInChatStructured(options);
|
|
27
|
+
}
|
|
28
|
+
return this.assistInChatText(options);
|
|
29
|
+
}
|
|
10
30
|
}
|
|
11
31
|
exports.LLMAssistanceService = LLMAssistanceService;
|
|
12
32
|
//# sourceMappingURL=LLMAssistanceService.abstract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LLMAssistanceService.abstract.js","sourceRoot":"","sources":["../../src/services/LLMAssistanceService.abstract.ts"],"names":[],"mappings":";;;AAAA,+
|
|
1
|
+
{"version":3,"file":"LLMAssistanceService.abstract.js","sourceRoot":"","sources":["../../src/services/LLMAssistanceService.abstract.ts"],"names":[],"mappings":";;;AAAA,+DAiB+B;AAG/B,yCAA4C;AAG5C,MAAsB,oBAGpB,SAAQ,yBAIP;IACD,YACE,QAAkB,EAClB,MAAsC,EACtC,QAAkB,EAClB,OAAsC;QAEtC,KAAK,CACH,QAAQ,EACR,mBAAmB,EACnB,iCAAW,CAAC,UAAU,EACtB,MAAM,EACN,QAAQ,EACR,OAAO,CACR,CAAC;IACJ,CAAC;IAES,uBAAuB,CAC/B,KAA0B;QAE1B,MAAM,WAAW,GAAG,kBAAkB,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,IAAI;sBACjC,4BAA4B,CAC/B,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,IAAI,GAAG,CACrC,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAuCD,YAAY,CACV,OACmC;QAEnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,sBAAsB,CAChC,OACkC,CACnC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CAeF;AAhHD,oDAgHC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChatCompletionMessageParam, ChatCompletionMessageToolCall } from 'openai/resources/chat';
|
|
2
|
+
import type { ChatCompletionContentPart } from 'openai/resources/chat';
|
|
3
|
+
interface ChatStateEntry {
|
|
4
|
+
instructions: string | undefined;
|
|
5
|
+
storageId: string | undefined;
|
|
6
|
+
messages: ChatCompletionMessageParam[];
|
|
7
|
+
}
|
|
8
|
+
export declare class CompletionsChatState {
|
|
9
|
+
private chats;
|
|
10
|
+
createChat(chatId: string, instructions?: string, storageId?: string, history?: ChatCompletionMessageParam[]): void;
|
|
11
|
+
getChat(chatId: string): ChatStateEntry | null;
|
|
12
|
+
appendUserMessage(chatId: string, content: ChatCompletionContentPart[]): void;
|
|
13
|
+
appendAssistantMessage(chatId: string, content: string): void;
|
|
14
|
+
appendToolCallMessages(chatId: string, toolCalls: ChatCompletionMessageToolCall[]): void;
|
|
15
|
+
appendToolResult(chatId: string, toolCallId: string, content: string): void;
|
|
16
|
+
getMessages(chatId: string): ChatCompletionMessageParam[];
|
|
17
|
+
deleteChat(chatId: string): void;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompletionsChatState = void 0;
|
|
4
|
+
class CompletionsChatState {
|
|
5
|
+
chats = new Map();
|
|
6
|
+
createChat(chatId, instructions, storageId, history) {
|
|
7
|
+
const messages = [];
|
|
8
|
+
if (instructions) {
|
|
9
|
+
messages.push({
|
|
10
|
+
role: 'system',
|
|
11
|
+
content: instructions,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
if (history) {
|
|
15
|
+
messages.push(...history);
|
|
16
|
+
}
|
|
17
|
+
this.chats.set(chatId, {
|
|
18
|
+
instructions,
|
|
19
|
+
storageId,
|
|
20
|
+
messages,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
getChat(chatId) {
|
|
24
|
+
return this.chats.get(chatId) ?? null;
|
|
25
|
+
}
|
|
26
|
+
appendUserMessage(chatId, content) {
|
|
27
|
+
const chat = this.chats.get(chatId);
|
|
28
|
+
if (!chat) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
chat.messages.push({
|
|
32
|
+
role: 'user',
|
|
33
|
+
content,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
appendAssistantMessage(chatId, content) {
|
|
37
|
+
const chat = this.chats.get(chatId);
|
|
38
|
+
if (!chat) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
chat.messages.push({
|
|
42
|
+
role: 'assistant',
|
|
43
|
+
content,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
appendToolCallMessages(chatId, toolCalls) {
|
|
47
|
+
const chat = this.chats.get(chatId);
|
|
48
|
+
if (!chat) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
chat.messages.push({
|
|
52
|
+
role: 'assistant',
|
|
53
|
+
content: null,
|
|
54
|
+
tool_calls: toolCalls,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
appendToolResult(chatId, toolCallId, content) {
|
|
58
|
+
const chat = this.chats.get(chatId);
|
|
59
|
+
if (!chat) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
chat.messages.push({
|
|
63
|
+
role: 'tool',
|
|
64
|
+
tool_call_id: toolCallId,
|
|
65
|
+
content,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
getMessages(chatId) {
|
|
69
|
+
const chat = this.chats.get(chatId);
|
|
70
|
+
if (!chat) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return chat.messages;
|
|
74
|
+
}
|
|
75
|
+
deleteChat(chatId) {
|
|
76
|
+
this.chats.delete(chatId);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.CompletionsChatState = CompletionsChatState;
|
|
80
|
+
//# sourceMappingURL=CompletionsChatState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompletionsChatState.js","sourceRoot":"","sources":["../../../src/services/chatState/CompletionsChatState.ts"],"names":[],"mappings":";;;AAcA,MAAa,oBAAoB;IACvB,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,UAAU,CACR,MAAc,EACd,YAAqB,EACrB,SAAkB,EAClB,OAAsC;QAEtC,MAAM,QAAQ,GAAiC,EAAE,CAAC;QAElD,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;YACrB,YAAY;YACZ,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC;IAED,iBAAiB,CACf,MAAc,EACd,OAAoC;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB,CACpB,MAAc,EACd,OAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB,CACpB,MAAc,EACd,SAA0C;QAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CACd,MAAc,EACd,UAAkB,EAClB,OAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,UAAU;YACxB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;CACF;AAjHD,oDAiHC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CompletionsChatState } from './CompletionsChatState';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CompletionsChatState = void 0;
|
|
4
|
+
var CompletionsChatState_1 = require("./CompletionsChatState");
|
|
5
|
+
Object.defineProperty(exports, "CompletionsChatState", { enumerable: true, get: function () { return CompletionsChatState_1.CompletionsChatState; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/chatState/index.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type InMemoryFileStorage } from './InMemoryFileStorage';
|
|
2
|
+
export declare class FileStorageToolExecutor {
|
|
3
|
+
private storage;
|
|
4
|
+
constructor(storage: InMemoryFileStorage);
|
|
5
|
+
execute(storageId: string, toolName: string, rawArguments: string): string;
|
|
6
|
+
private listFiles;
|
|
7
|
+
private searchFiles;
|
|
8
|
+
private mergeContextRanges;
|
|
9
|
+
private readFile;
|
|
10
|
+
private readFileLines;
|
|
11
|
+
private resolveLineRange;
|
|
12
|
+
private findFileByPath;
|
|
13
|
+
private fileNotFoundMessage;
|
|
14
|
+
private formatLinesWithNumbers;
|
|
15
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileStorageToolExecutor = void 0;
|
|
4
|
+
const fileStorageTools_1 = require("./fileStorageTools");
|
|
5
|
+
const MAX_OUTPUT_LENGTH = 50_000;
|
|
6
|
+
class FileStorageToolExecutor {
|
|
7
|
+
storage;
|
|
8
|
+
constructor(storage) {
|
|
9
|
+
this.storage = storage;
|
|
10
|
+
}
|
|
11
|
+
execute(storageId, toolName, rawArguments) {
|
|
12
|
+
switch (toolName) {
|
|
13
|
+
case fileStorageTools_1.FileStorageToolName.ListFiles:
|
|
14
|
+
return this.listFiles(storageId);
|
|
15
|
+
case fileStorageTools_1.FileStorageToolName.SearchFiles:
|
|
16
|
+
return this.searchFiles(storageId, JSON.parse(rawArguments));
|
|
17
|
+
case fileStorageTools_1.FileStorageToolName.ReadFile:
|
|
18
|
+
return this.readFile(storageId, JSON.parse(rawArguments));
|
|
19
|
+
case fileStorageTools_1.FileStorageToolName.ReadFileLines:
|
|
20
|
+
return this.readFileLines(storageId, JSON.parse(rawArguments));
|
|
21
|
+
default:
|
|
22
|
+
return `Unknown tool: '${toolName}'`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
listFiles(storageId) {
|
|
26
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
return 'No files in storage.';
|
|
29
|
+
}
|
|
30
|
+
return files
|
|
31
|
+
.map((file) => {
|
|
32
|
+
const lineCount = file.content.split('\n').length;
|
|
33
|
+
return `${file.name} (${file.path}) - ${lineCount} lines`;
|
|
34
|
+
})
|
|
35
|
+
.join('\n');
|
|
36
|
+
}
|
|
37
|
+
searchFiles(storageId, arguments_) {
|
|
38
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
39
|
+
const contextLines = arguments_.context_lines ?? 3;
|
|
40
|
+
const lowerQuery = arguments_.query.toLowerCase();
|
|
41
|
+
const filteredFiles = arguments_.path
|
|
42
|
+
? files.filter((file) => file.path.includes(arguments_.path))
|
|
43
|
+
: files;
|
|
44
|
+
const results = [];
|
|
45
|
+
for (const file of filteredFiles) {
|
|
46
|
+
if (!file.content.toLowerCase().includes(lowerQuery)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const lines = file.content.split('\n');
|
|
50
|
+
const matchingLineIndices = [];
|
|
51
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
52
|
+
if (lines[lineIndex].toLowerCase().includes(lowerQuery)) {
|
|
53
|
+
matchingLineIndices.push(lineIndex);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (matchingLineIndices.length === 0) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const ranges = this.mergeContextRanges(matchingLineIndices, contextLines, lines.length);
|
|
60
|
+
for (const range of ranges) {
|
|
61
|
+
for (let lineIndex = range.start; lineIndex <= range.end; lineIndex++) {
|
|
62
|
+
results.push(`${file.path}:${lineIndex + 1}: ${lines[lineIndex]}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (results.length === 0) {
|
|
67
|
+
return `No matches found for '${arguments_.query}'`;
|
|
68
|
+
}
|
|
69
|
+
const output = results.join('\n');
|
|
70
|
+
if (output.length > MAX_OUTPUT_LENGTH) {
|
|
71
|
+
return output.slice(0, MAX_OUTPUT_LENGTH)
|
|
72
|
+
+ '\n... (output truncated)';
|
|
73
|
+
}
|
|
74
|
+
return output;
|
|
75
|
+
}
|
|
76
|
+
mergeContextRanges(matchingIndices, contextLines, totalLines) {
|
|
77
|
+
const ranges = [];
|
|
78
|
+
for (const matchIndex of matchingIndices) {
|
|
79
|
+
const start = Math.max(0, matchIndex - contextLines);
|
|
80
|
+
const end = Math.min(totalLines - 1, matchIndex + contextLines);
|
|
81
|
+
const lastRange = ranges[ranges.length - 1];
|
|
82
|
+
if (lastRange && start <= lastRange.end + 1) {
|
|
83
|
+
lastRange.end = end;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
ranges.push({ start, end });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return ranges;
|
|
90
|
+
}
|
|
91
|
+
readFile(storageId, arguments_) {
|
|
92
|
+
const file = this.findFileByPath(storageId, arguments_.path);
|
|
93
|
+
if (!file) {
|
|
94
|
+
return this.fileNotFoundMessage(storageId, arguments_.path);
|
|
95
|
+
}
|
|
96
|
+
const lines = file.content.split('\n');
|
|
97
|
+
return this.formatLinesWithNumbers(lines, 1);
|
|
98
|
+
}
|
|
99
|
+
readFileLines(storageId, arguments_) {
|
|
100
|
+
const file = this.findFileByPath(storageId, arguments_.path);
|
|
101
|
+
if (!file) {
|
|
102
|
+
return this.fileNotFoundMessage(storageId, arguments_.path);
|
|
103
|
+
}
|
|
104
|
+
const lines = file.content.split('\n');
|
|
105
|
+
const { startIndex, endIndex } = this.resolveLineRange(lines.length, arguments_.start_line, arguments_.end_line);
|
|
106
|
+
const selectedLines = lines.slice(startIndex, endIndex);
|
|
107
|
+
return this.formatLinesWithNumbers(selectedLines, startIndex + 1);
|
|
108
|
+
}
|
|
109
|
+
resolveLineRange(totalLines, startLine, endLine) {
|
|
110
|
+
if (startLine !== undefined && endLine !== undefined) {
|
|
111
|
+
return {
|
|
112
|
+
startIndex: Math.max(0, startLine - 1),
|
|
113
|
+
endIndex: Math.min(totalLines, endLine),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (startLine !== undefined) {
|
|
117
|
+
return {
|
|
118
|
+
startIndex: Math.max(0, startLine - 1),
|
|
119
|
+
endIndex: totalLines,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
if (endLine !== undefined && endLine < 0) {
|
|
123
|
+
return {
|
|
124
|
+
startIndex: Math.max(0, totalLines + endLine),
|
|
125
|
+
endIndex: totalLines,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (endLine !== undefined) {
|
|
129
|
+
return {
|
|
130
|
+
startIndex: 0,
|
|
131
|
+
endIndex: Math.min(totalLines, endLine),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
startIndex: 0,
|
|
136
|
+
endIndex: totalLines,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
findFileByPath(storageId, path) {
|
|
140
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
141
|
+
const exactMatch = files.find((file) => file.path === path);
|
|
142
|
+
if (exactMatch) {
|
|
143
|
+
return exactMatch;
|
|
144
|
+
}
|
|
145
|
+
const endsWithMatch = files.find((file) => file.path.endsWith(path));
|
|
146
|
+
if (endsWithMatch) {
|
|
147
|
+
return endsWithMatch;
|
|
148
|
+
}
|
|
149
|
+
const includesMatch = files.find((file) => file.path.includes(path));
|
|
150
|
+
return includesMatch ?? null;
|
|
151
|
+
}
|
|
152
|
+
fileNotFoundMessage(storageId, path) {
|
|
153
|
+
const files = this.storage.getStorageFiles(storageId);
|
|
154
|
+
const availablePaths = files
|
|
155
|
+
.map((file) => file.path)
|
|
156
|
+
.join(', ');
|
|
157
|
+
return `File not found: '${path}'. Available files: ${availablePaths}`;
|
|
158
|
+
}
|
|
159
|
+
formatLinesWithNumbers(lines, startLineNumber) {
|
|
160
|
+
const lastLineNumber = startLineNumber + lines.length - 1;
|
|
161
|
+
const maxWidth = String(lastLineNumber).length;
|
|
162
|
+
return lines
|
|
163
|
+
.map((line, index) => {
|
|
164
|
+
const lineNumber = String(startLineNumber + index)
|
|
165
|
+
.padStart(maxWidth, ' ');
|
|
166
|
+
return `${lineNumber}: ${line}`;
|
|
167
|
+
})
|
|
168
|
+
.join('\n');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
exports.FileStorageToolExecutor = FileStorageToolExecutor;
|
|
172
|
+
//# sourceMappingURL=FileStorageToolExecutor.js.map
|