@modelprofile.com/flexharness 6.1.0 → 7.0.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts_chat/classes.chatsession.d.ts +37 -0
- package/dist_ts_chat/classes.chatsession.js +102 -0
- package/dist_ts_chat/index.d.ts +2 -0
- package/dist_ts_chat/index.js +2 -0
- package/dist_ts_chat/interfaces.d.ts +72 -0
- package/dist_ts_chat/interfaces.js +2 -0
- package/dist_ts_chat/plugins.d.ts +4 -0
- package/dist_ts_chat/plugins.js +4 -0
- package/dist_ts_chat_cli/components.chatapp.d.ts +10 -0
- package/dist_ts_chat_cli/components.chatapp.js +75 -0
- package/dist_ts_chat_cli/components.inputarea.d.ts +7 -0
- package/dist_ts_chat_cli/components.inputarea.js +18 -0
- package/dist_ts_chat_cli/components.message.d.ts +12 -0
- package/dist_ts_chat_cli/components.message.js +21 -0
- package/dist_ts_chat_cli/components.messagelist.d.ts +9 -0
- package/dist_ts_chat_cli/components.messagelist.js +19 -0
- package/dist_ts_chat_cli/components.statusbar.d.ts +9 -0
- package/dist_ts_chat_cli/components.statusbar.js +15 -0
- package/dist_ts_chat_cli/index.d.ts +2 -0
- package/dist_ts_chat_cli/index.js +2 -0
- package/dist_ts_chat_cli/plugins.d.ts +12 -0
- package/dist_ts_chat_cli/plugins.js +14 -0
- package/dist_ts_chat_cli/startchat.d.ts +18 -0
- package/dist_ts_chat_cli/startchat.js +17 -0
- package/dist_ts_chat_web/flexchat-input.d.ts +21 -0
- package/dist_ts_chat_web/flexchat-input.js +172 -0
- package/dist_ts_chat_web/flexchat-message.d.ts +26 -0
- package/dist_ts_chat_web/flexchat-message.js +174 -0
- package/dist_ts_chat_web/flexchat-window.d.ts +34 -0
- package/dist_ts_chat_web/flexchat-window.js +394 -0
- package/dist_ts_chat_web/index.d.ts +3 -0
- package/dist_ts_chat_web/index.js +4 -0
- package/dist_ts_chat_web/plugins.d.ts +6 -0
- package/dist_ts_chat_web/plugins.js +4 -0
- package/dist_ts_compaction/index.d.ts +2 -0
- package/dist_ts_compaction/index.js +2 -0
- package/dist_ts_compaction/plugins.d.ts +4 -0
- package/dist_ts_compaction/plugins.js +3 -0
- package/dist_ts_compaction/smartagent.compaction.d.ts +14 -0
- package/dist_ts_compaction/smartagent.compaction.js +49 -0
- package/dist_ts_document/index.d.ts +19 -0
- package/dist_ts_document/index.js +55 -0
- package/dist_ts_document/plugins.d.ts +3 -0
- package/dist_ts_document/plugins.js +4 -0
- package/dist_ts_kvm/classes.browserkvm.d.ts +22 -0
- package/dist_ts_kvm/classes.browserkvm.js +271 -0
- package/dist_ts_kvm/classes.kvmterminal.d.ts +8 -0
- package/dist_ts_kvm/classes.kvmterminal.js +88 -0
- package/dist_ts_kvm/commandwrappers.d.ts +14 -0
- package/dist_ts_kvm/commandwrappers.js +58 -0
- package/dist_ts_kvm/index.d.ts +6 -0
- package/dist_ts_kvm/index.js +7 -0
- package/dist_ts_kvm/interfaces.d.ts +106 -0
- package/dist_ts_kvm/interfaces.js +2 -0
- package/dist_ts_kvm/ocr.d.ts +14 -0
- package/dist_ts_kvm/ocr.js +23 -0
- package/dist_ts_kvm/plugins.d.ts +6 -0
- package/dist_ts_kvm/plugins.js +10 -0
- package/dist_ts_kvm/tools.d.ts +15 -0
- package/dist_ts_kvm/tools.js +40 -0
- package/dist_ts_mcp/index.d.ts +86 -0
- package/dist_ts_mcp/index.js +284 -0
- package/dist_ts_mcp/requestcontext.d.ts +11 -0
- package/dist_ts_mcp/requestcontext.js +42 -0
- package/dist_ts_media/index.d.ts +8 -0
- package/dist_ts_media/index.js +21 -0
- package/dist_ts_media/plugins.d.ts +2 -0
- package/dist_ts_media/plugins.js +3 -0
- package/dist_ts_ocr/classes.imageocr.d.ts +19 -0
- package/dist_ts_ocr/classes.imageocr.js +27 -0
- package/dist_ts_ocr/index.d.ts +2 -0
- package/dist_ts_ocr/index.js +3 -0
- package/dist_ts_ocr/ocr.mistral.d.ts +75 -0
- package/dist_ts_ocr/ocr.mistral.js +77 -0
- package/dist_ts_tools/index.d.ts +17 -0
- package/dist_ts_tools/index.js +10 -0
- package/dist_ts_tools/plugins.d.ts +7 -0
- package/dist_ts_tools/plugins.js +6 -0
- package/dist_ts_tools/tool.browser.d.ts +11 -0
- package/dist_ts_tools/tool.browser.js +128 -0
- package/dist_ts_tools/tool.context.d.ts +4 -0
- package/dist_ts_tools/tool.context.js +23 -0
- package/dist_ts_tools/tool.filesystem.d.ts +11 -0
- package/dist_ts_tools/tool.filesystem.js +106 -0
- package/dist_ts_tools/tool.http.d.ts +2 -0
- package/dist_ts_tools/tool.http.js +65 -0
- package/dist_ts_tools/tool.json.d.ts +2 -0
- package/dist_ts_tools/tool.json.js +47 -0
- package/dist_ts_tools/tool.shell.d.ts +15 -0
- package/dist_ts_tools/tool.shell.js +329 -0
- package/dist_ts_tools/utils.truncation.d.ts +10 -0
- package/dist_ts_tools/utils.truncation.js +26 -0
- package/dist_ts_tools_node/index.d.ts +5 -0
- package/dist_ts_tools_node/index.js +4 -0
- package/dist_ts_tools_node/plugins.d.ts +13 -0
- package/dist_ts_tools_node/plugins.js +13 -0
- package/dist_ts_tools_node/tool.context.d.ts +31 -0
- package/dist_ts_tools_node/tool.context.js +837 -0
- package/dist_ts_tools_node/tool.persistence.d.ts +15 -0
- package/dist_ts_tools_node/tool.persistence.js +129 -0
- package/dist_ts_tools_node/tools.local.d.ts +11 -0
- package/dist_ts_tools_node/tools.local.js +15 -0
- package/package.json +112 -4
- package/readme.md +122 -66
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/readme.md +122 -66
- package/ts_chat/classes.chatsession.ts +116 -0
- package/ts_chat/index.ts +8 -0
- package/ts_chat/interfaces.ts +64 -0
- package/ts_chat/plugins.ts +7 -0
- package/ts_chat/readme.md +49 -0
- package/ts_chat_cli/components.chatapp.ts +103 -0
- package/ts_chat_cli/components.inputarea.ts +29 -0
- package/ts_chat_cli/components.message.ts +48 -0
- package/ts_chat_cli/components.messagelist.ts +45 -0
- package/ts_chat_cli/components.statusbar.ts +31 -0
- package/ts_chat_cli/index.ts +2 -0
- package/ts_chat_cli/plugins.ts +21 -0
- package/ts_chat_cli/readme.md +40 -0
- package/ts_chat_cli/startchat.ts +34 -0
- package/ts_chat_web/flexchat-input.ts +184 -0
- package/ts_chat_web/flexchat-message.ts +185 -0
- package/ts_chat_web/flexchat-window.ts +416 -0
- package/ts_chat_web/index.ts +3 -0
- package/ts_chat_web/plugins.ts +9 -0
- package/ts_chat_web/readme.md +46 -0
- package/ts_compaction/index.ts +2 -0
- package/ts_compaction/plugins.ts +6 -0
- package/ts_compaction/readme.md +37 -0
- package/ts_compaction/smartagent.compaction.ts +59 -0
- package/ts_document/index.ts +82 -0
- package/ts_document/plugins.ts +3 -0
- package/ts_document/readme.md +49 -0
- package/ts_kvm/classes.browserkvm.ts +335 -0
- package/ts_kvm/classes.kvmterminal.ts +103 -0
- package/ts_kvm/commandwrappers.ts +83 -0
- package/ts_kvm/index.ts +6 -0
- package/ts_kvm/interfaces.ts +152 -0
- package/ts_kvm/ocr.ts +41 -0
- package/ts_kvm/plugins.ts +13 -0
- package/ts_kvm/readme.md +482 -0
- package/ts_kvm/tools.ts +58 -0
- package/ts_mcp/index.ts +470 -0
- package/ts_mcp/readme.md +37 -0
- package/ts_mcp/requestcontext.ts +66 -0
- package/ts_media/index.ts +29 -0
- package/ts_media/plugins.ts +2 -0
- package/ts_media/readme.md +37 -0
- package/ts_ocr/classes.imageocr.ts +53 -0
- package/ts_ocr/index.ts +2 -0
- package/ts_ocr/ocr.mistral.ts +192 -0
- package/ts_ocr/readme.md +48 -0
- package/ts_tools/index.ts +49 -0
- package/ts_tools/plugins.ts +7 -0
- package/ts_tools/readme.md +37 -0
- package/ts_tools/tool.browser.ts +159 -0
- package/ts_tools/tool.context.ts +23 -0
- package/ts_tools/tool.filesystem.ts +144 -0
- package/ts_tools/tool.http.ts +78 -0
- package/ts_tools/tool.json.ts +53 -0
- package/ts_tools/tool.shell.ts +418 -0
- package/ts_tools/utils.truncation.ts +39 -0
- package/ts_tools_node/index.ts +5 -0
- package/ts_tools_node/plugins.ts +16 -0
- package/ts_tools_node/readme.md +37 -0
- package/ts_tools_node/tool.context.ts +991 -0
- package/ts_tools_node/tool.persistence.ts +146 -0
- package/ts_tools_node/tools.local.ts +26 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export type TSmartAiOcrImageMimeType = 'image/png' | 'image/jpeg' | 'image/webp' | 'image/gif' | string;
|
|
2
|
+
export type TSmartAiMistralOcrTableFormat = 'markdown' | 'html';
|
|
3
|
+
export type TSmartAiMistralOcrConfidenceScoresGranularity = 'page' | 'word';
|
|
4
|
+
export interface ISmartAiOcrImageInput {
|
|
5
|
+
dataBase64: string;
|
|
6
|
+
mimeType: TSmartAiOcrImageMimeType;
|
|
7
|
+
}
|
|
8
|
+
export interface ISmartAiOcrPageResult {
|
|
9
|
+
index: number;
|
|
10
|
+
text: string;
|
|
11
|
+
confidence?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ISmartAiOcrResult<TRaw = unknown> {
|
|
14
|
+
text: string;
|
|
15
|
+
confidence?: number;
|
|
16
|
+
pages: ISmartAiOcrPageResult[];
|
|
17
|
+
raw: TRaw;
|
|
18
|
+
}
|
|
19
|
+
export interface ISmartAiOcrEngine {
|
|
20
|
+
recognizeImage: (input: ISmartAiOcrImageInput, options?: ISmartAiMistralOcrRecognizeOptions) => Promise<ISmartAiOcrResult<IMistralOcrResponse>>;
|
|
21
|
+
}
|
|
22
|
+
export interface IMistralOcrPageConfidenceScores {
|
|
23
|
+
average_page_confidence_score?: number;
|
|
24
|
+
averagePageConfidenceScore?: number;
|
|
25
|
+
minimum_page_confidence_score?: number;
|
|
26
|
+
minimumPageConfidenceScore?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface IMistralOcrPageResponse {
|
|
29
|
+
index: number;
|
|
30
|
+
markdown: string;
|
|
31
|
+
confidence_scores?: IMistralOcrPageConfidenceScores | null;
|
|
32
|
+
confidenceScores?: IMistralOcrPageConfidenceScores | null;
|
|
33
|
+
}
|
|
34
|
+
export interface IMistralOcrResponse {
|
|
35
|
+
pages: IMistralOcrPageResponse[];
|
|
36
|
+
model: string;
|
|
37
|
+
document_annotation?: unknown;
|
|
38
|
+
documentAnnotation?: unknown;
|
|
39
|
+
usage_info?: unknown;
|
|
40
|
+
usageInfo?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface IMistralOcrRequest {
|
|
43
|
+
model: string;
|
|
44
|
+
document: {
|
|
45
|
+
type: 'image_url';
|
|
46
|
+
image_url: string;
|
|
47
|
+
};
|
|
48
|
+
include_image_base64?: boolean;
|
|
49
|
+
table_format?: TSmartAiMistralOcrTableFormat;
|
|
50
|
+
extract_header?: boolean;
|
|
51
|
+
extract_footer?: boolean;
|
|
52
|
+
confidence_scores_granularity?: TSmartAiMistralOcrConfidenceScoresGranularity;
|
|
53
|
+
}
|
|
54
|
+
export interface ISmartAiMistralOcrTransport {
|
|
55
|
+
process: (request: IMistralOcrRequest) => Promise<IMistralOcrResponse>;
|
|
56
|
+
}
|
|
57
|
+
export interface ISmartAiMistralOcrOptions {
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
model?: string;
|
|
60
|
+
endpointUrl?: string;
|
|
61
|
+
transport?: ISmartAiMistralOcrTransport;
|
|
62
|
+
includeImageBase64?: boolean;
|
|
63
|
+
tableFormat?: TSmartAiMistralOcrTableFormat;
|
|
64
|
+
extractHeader?: boolean;
|
|
65
|
+
extractFooter?: boolean;
|
|
66
|
+
confidenceScoresGranularity?: TSmartAiMistralOcrConfidenceScoresGranularity;
|
|
67
|
+
}
|
|
68
|
+
export interface ISmartAiMistralOcrRecognizeOptions {
|
|
69
|
+
includeImageBase64?: boolean;
|
|
70
|
+
tableFormat?: TSmartAiMistralOcrTableFormat;
|
|
71
|
+
extractHeader?: boolean;
|
|
72
|
+
extractFooter?: boolean;
|
|
73
|
+
confidenceScoresGranularity?: TSmartAiMistralOcrConfidenceScoresGranularity;
|
|
74
|
+
}
|
|
75
|
+
export declare const createMistralOcrEngine: (options?: ISmartAiMistralOcrOptions) => ISmartAiOcrEngine;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const defaultMistralOcrModel = 'mistral-ocr-latest';
|
|
2
|
+
const defaultMistralOcrEndpointUrl = 'https://api.mistral.ai/v1/ocr';
|
|
3
|
+
const createMistralOcrHttpTransport = (options) => {
|
|
4
|
+
return {
|
|
5
|
+
process: async (request) => {
|
|
6
|
+
if (!options.apiKey) {
|
|
7
|
+
throw new Error('Mistral OCR requires an apiKey when no custom transport is provided.');
|
|
8
|
+
}
|
|
9
|
+
const response = await fetch(options.endpointUrl ?? defaultMistralOcrEndpointUrl, {
|
|
10
|
+
method: 'POST',
|
|
11
|
+
headers: {
|
|
12
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
13
|
+
'Content-Type': 'application/json',
|
|
14
|
+
},
|
|
15
|
+
body: JSON.stringify(request),
|
|
16
|
+
});
|
|
17
|
+
if (!response.ok) {
|
|
18
|
+
const errorBody = await response.text();
|
|
19
|
+
throw new Error(`Mistral OCR request failed with status ${response.status}: ${errorBody}`);
|
|
20
|
+
}
|
|
21
|
+
return (await response.json());
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const getPageConfidence = (page) => {
|
|
26
|
+
const confidenceScores = page.confidence_scores ?? page.confidenceScores;
|
|
27
|
+
return (confidenceScores?.average_page_confidence_score ??
|
|
28
|
+
confidenceScores?.averagePageConfidenceScore);
|
|
29
|
+
};
|
|
30
|
+
export const createMistralOcrEngine = (options = {}) => {
|
|
31
|
+
const transport = options.transport ??
|
|
32
|
+
createMistralOcrHttpTransport({
|
|
33
|
+
apiKey: options.apiKey,
|
|
34
|
+
endpointUrl: options.endpointUrl,
|
|
35
|
+
});
|
|
36
|
+
const model = options.model ?? defaultMistralOcrModel;
|
|
37
|
+
return {
|
|
38
|
+
recognizeImage: async (input, recognizeOptions = {}) => {
|
|
39
|
+
if (!input.dataBase64) {
|
|
40
|
+
throw new Error('Mistral OCR image input requires dataBase64.');
|
|
41
|
+
}
|
|
42
|
+
if (!input.mimeType) {
|
|
43
|
+
throw new Error('Mistral OCR image input requires mimeType.');
|
|
44
|
+
}
|
|
45
|
+
const response = await transport.process({
|
|
46
|
+
model,
|
|
47
|
+
document: {
|
|
48
|
+
type: 'image_url',
|
|
49
|
+
image_url: `data:${input.mimeType};base64,${input.dataBase64}`,
|
|
50
|
+
},
|
|
51
|
+
include_image_base64: recognizeOptions.includeImageBase64 ?? options.includeImageBase64 ?? false,
|
|
52
|
+
table_format: recognizeOptions.tableFormat ?? options.tableFormat,
|
|
53
|
+
extract_header: recognizeOptions.extractHeader ?? options.extractHeader,
|
|
54
|
+
extract_footer: recognizeOptions.extractFooter ?? options.extractFooter,
|
|
55
|
+
confidence_scores_granularity: recognizeOptions.confidenceScoresGranularity ?? options.confidenceScoresGranularity,
|
|
56
|
+
});
|
|
57
|
+
const pages = response.pages.map((page) => ({
|
|
58
|
+
index: page.index,
|
|
59
|
+
text: page.markdown,
|
|
60
|
+
confidence: getPageConfidence(page),
|
|
61
|
+
}));
|
|
62
|
+
const pageConfidences = pages
|
|
63
|
+
.map((page) => page.confidence)
|
|
64
|
+
.filter((confidence) => typeof confidence === 'number');
|
|
65
|
+
const confidence = pageConfidences.length
|
|
66
|
+
? pageConfidences.reduce((sum, value) => sum + value, 0) / pageConfidences.length
|
|
67
|
+
: undefined;
|
|
68
|
+
return {
|
|
69
|
+
text: pages.map((page) => page.text).join('\n\n').trim(),
|
|
70
|
+
confidence,
|
|
71
|
+
pages,
|
|
72
|
+
raw: response,
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NyLm1pc3RyYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19vY3Ivb2NyLm1pc3RyYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0dBLE1BQU0sc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7QUFDcEQsTUFBTSw0QkFBNEIsR0FBRywrQkFBK0IsQ0FBQztBQUVyRSxNQUFNLDZCQUE2QixHQUFHLENBQUMsT0FHdEMsRUFBK0IsRUFBRTtJQUNoQyxPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7WUFDMUYsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksNEJBQTRCLEVBQUU7Z0JBQ2hGLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRTtvQkFDUCxhQUFhLEVBQUUsVUFBVSxPQUFPLENBQUMsTUFBTSxFQUFFO29CQUN6QyxjQUFjLEVBQUUsa0JBQWtCO2lCQUNuQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7YUFDOUIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM3RixDQUFDO1lBRUQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUF3QixDQUFDO1FBQ3hELENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FB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
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { createBrowserTools } from './tool.browser.js';
|
|
2
|
+
export { acquireToolExecutionContext, ToolExecutionAdapterCleanupError, } from '@modelprofile.com/flexharness-agent';
|
|
3
|
+
export type { IToolExecutionAdapter, IToolExecutionAdapterRequest, IToolExecutionContextLease, } from '@modelprofile.com/flexharness-agent';
|
|
4
|
+
export type { ICreateBrowserToolsOptions } from './tool.browser.js';
|
|
5
|
+
export { createFilesystemTools } from './tool.filesystem.js';
|
|
6
|
+
export type { ICreateFilesystemToolsOptions } from './tool.filesystem.js';
|
|
7
|
+
export { createShellTools } from './tool.shell.js';
|
|
8
|
+
export type { ICreateShellToolsOptions } from './tool.shell.js';
|
|
9
|
+
export type { ToolSet } from 'ai';
|
|
10
|
+
export { formatShellResult, formatToolOutput } from './tool.context.js';
|
|
11
|
+
export type { IBrowserToolInput, IShellCommand, IShellFinishedResult, IShellStartedResult, IToolBrowserContext, IToolBrowserRunOptions, IToolExecutionContext, IToolFilesystemContext, IToolFilesystemListOptions, IToolFilesystemReadOptions, IToolInvocationOptions, IToolJobContext, IToolJobEvent, IToolJobOutputEvent, IToolJobHandle, IToolJobRequest, IToolJobState, IToolPermissionRequest, IToolRunOptions, IToolShellContext, IToolShellResult, TBrowserToolAction, TToolJobEvent, TToolJobEventListener, } from './tool.context.js';
|
|
12
|
+
export { InMemoryToolJobStore, ToolJobStoreConflictError } from '@modelprofile.com/flexharness-agent';
|
|
13
|
+
export type { IToolJobSnapshot, IToolJobStore } from '@modelprofile.com/flexharness-agent';
|
|
14
|
+
export { httpTool } from './tool.http.js';
|
|
15
|
+
export { jsonTool } from './tool.json.js';
|
|
16
|
+
export { truncateOutput } from './plugins.js';
|
|
17
|
+
export type { ITruncateResult } from './plugins.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { createBrowserTools } from './tool.browser.js';
|
|
2
|
+
export { acquireToolExecutionContext, ToolExecutionAdapterCleanupError, } from '@modelprofile.com/flexharness-agent';
|
|
3
|
+
export { createFilesystemTools } from './tool.filesystem.js';
|
|
4
|
+
export { createShellTools } from './tool.shell.js';
|
|
5
|
+
export { formatShellResult, formatToolOutput } from './tool.context.js';
|
|
6
|
+
export { InMemoryToolJobStore, ToolJobStoreConflictError } from '@modelprofile.com/flexharness-agent';
|
|
7
|
+
export { httpTool } from './tool.http.js';
|
|
8
|
+
export { jsonTool } from './tool.json.js';
|
|
9
|
+
export { truncateOutput } from './plugins.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c190b29scy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGdDQUFnQyxHQUNqQyxNQUFNLHFDQUFxQyxDQUFDO0FBTzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBMkJ4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV0RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUMifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { tool } from 'ai';
|
|
3
|
+
import * as smartrequest from '@push.rocks/smartrequest';
|
|
4
|
+
import { truncateOutput } from './utils.truncation.js';
|
|
5
|
+
export { z, tool, smartrequest, truncateOutput };
|
|
6
|
+
export type { ToolExecutionOptions, ToolSet } from 'ai';
|
|
7
|
+
export type { ITruncateResult } from './utils.truncation.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { tool } from 'ai';
|
|
3
|
+
import * as smartrequest from '@push.rocks/smartrequest';
|
|
4
|
+
import { truncateOutput } from './utils.truncation.js';
|
|
5
|
+
export { z, tool, smartrequest, truncateOutput };
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX3Rvb2xzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzFCLE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsQ0FBQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { type IToolExecutionContext, type TBrowserToolAction } from './tool.context.js';
|
|
3
|
+
export interface ICreateBrowserToolsOptions {
|
|
4
|
+
/** Maximum output lines before truncating. */
|
|
5
|
+
maxLines?: number;
|
|
6
|
+
/** Maximum output bytes before truncating. */
|
|
7
|
+
maxBytes?: number;
|
|
8
|
+
/** Browser actions exposed by the tool. Defaults to every supported action. */
|
|
9
|
+
allowedActions?: readonly TBrowserToolAction[];
|
|
10
|
+
}
|
|
11
|
+
export declare function createBrowserTools(context: IToolExecutionContext, options?: ICreateBrowserToolsOptions): plugins.ToolSet;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { formatToolOutput, } from './tool.context.js';
|
|
3
|
+
const browserActions = [
|
|
4
|
+
'navigate',
|
|
5
|
+
'snapshot',
|
|
6
|
+
'screenshot',
|
|
7
|
+
'click',
|
|
8
|
+
'fill',
|
|
9
|
+
'press',
|
|
10
|
+
'evaluate',
|
|
11
|
+
'close',
|
|
12
|
+
];
|
|
13
|
+
export function createBrowserTools(context, options = {}) {
|
|
14
|
+
const allowedActions = normalizeAllowedBrowserActions(options.allowedActions);
|
|
15
|
+
const allowedActionList = [...allowedActions].join(', ');
|
|
16
|
+
const defaultAction = allowedActions.has('snapshot')
|
|
17
|
+
? 'snapshot'
|
|
18
|
+
: allowedActions.values().next().value;
|
|
19
|
+
const description = [
|
|
20
|
+
'Control a browser supplied by the host execution context for web UI inspection and interaction.',
|
|
21
|
+
`Actions: ${allowedActionList}.`,
|
|
22
|
+
...(allowedActions.has('snapshot')
|
|
23
|
+
? ['Use snapshot after navigation or interaction to inspect page text and interactive selectors before choosing the next action.']
|
|
24
|
+
: []),
|
|
25
|
+
...(hasBrowserSideEffectAction(allowedActions)
|
|
26
|
+
? ['Actions that navigate or modify page state require host permission when configured.']
|
|
27
|
+
: []),
|
|
28
|
+
].join(' ');
|
|
29
|
+
const inputSchema = plugins.z.object({
|
|
30
|
+
action: plugins.z.string().default(defaultAction).describe(`Action: ${allowedActionList}`),
|
|
31
|
+
url: plugins.z.string().optional().describe('Optional target URL'),
|
|
32
|
+
selector: plugins.z.string().optional().describe('Optional element selector'),
|
|
33
|
+
text: plugins.z.string().optional().describe('Optional text, key, or mode hint'),
|
|
34
|
+
script: plugins.z.string().optional().describe('Optional host-defined script input'),
|
|
35
|
+
timeoutMs: plugins.z.number().optional().describe('Optional action timeout in milliseconds'),
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
browser: plugins.tool({
|
|
39
|
+
description,
|
|
40
|
+
inputSchema,
|
|
41
|
+
execute: async (input, invocationOptions) => {
|
|
42
|
+
if (!context.browser) {
|
|
43
|
+
throw new Error('Browser tool is not available in this execution context.');
|
|
44
|
+
}
|
|
45
|
+
const action = normalizeBrowserAction(input.action, allowedActions, defaultAction);
|
|
46
|
+
const abortSignal = invocationOptions?.abortSignal ?? context.abortSignal;
|
|
47
|
+
await requestBrowserPermission(context, { ...input, action }, {
|
|
48
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
49
|
+
abortSignal,
|
|
50
|
+
});
|
|
51
|
+
const result = await context.browser.execute({ ...input, action }, {
|
|
52
|
+
timeoutMs: input.timeoutMs,
|
|
53
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
54
|
+
abortSignal,
|
|
55
|
+
});
|
|
56
|
+
return plugins.truncateOutput(formatToolOutput(result), {
|
|
57
|
+
maxLines: options.maxLines,
|
|
58
|
+
maxBytes: options.maxBytes,
|
|
59
|
+
}).content;
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const normalizeAllowedBrowserActions = (actionsArg) => {
|
|
65
|
+
const actions = actionsArg ?? browserActions;
|
|
66
|
+
if (!Array.isArray(actions) || actions.length === 0) {
|
|
67
|
+
throw new Error('allowedActions must contain at least one supported browser action.');
|
|
68
|
+
}
|
|
69
|
+
const allowedActions = new Set();
|
|
70
|
+
for (const action of actions) {
|
|
71
|
+
if (!browserActions.includes(action)) {
|
|
72
|
+
throw new Error(`Unsupported allowed browser action: ${String(action)}.`);
|
|
73
|
+
}
|
|
74
|
+
allowedActions.add(action);
|
|
75
|
+
}
|
|
76
|
+
return allowedActions;
|
|
77
|
+
};
|
|
78
|
+
const hasBrowserSideEffectAction = (actionsArg) => {
|
|
79
|
+
for (const action of ['navigate', 'click', 'fill', 'press', 'evaluate', 'close']) {
|
|
80
|
+
if (actionsArg.has(action))
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
};
|
|
85
|
+
const normalizeBrowserAction = (input, allowedActions, defaultAction) => {
|
|
86
|
+
const action = typeof input === 'string' && input.trim()
|
|
87
|
+
? input.trim().toLowerCase()
|
|
88
|
+
: defaultAction;
|
|
89
|
+
if (allowedActions.has(action)) {
|
|
90
|
+
return action;
|
|
91
|
+
}
|
|
92
|
+
throw new Error(`Unsupported browser action: ${String(input)}. Use one of: ${[...allowedActions].join(', ')}.`);
|
|
93
|
+
};
|
|
94
|
+
const requestBrowserPermission = async (context, input, invocationOptions) => {
|
|
95
|
+
if (!context.requestPermission)
|
|
96
|
+
return;
|
|
97
|
+
if (input.action === 'snapshot' || input.action === 'screenshot')
|
|
98
|
+
return;
|
|
99
|
+
const titleByAction = {
|
|
100
|
+
navigate: 'Navigate browser',
|
|
101
|
+
snapshot: 'Inspect browser',
|
|
102
|
+
screenshot: 'Capture browser screenshot',
|
|
103
|
+
click: 'Click browser element',
|
|
104
|
+
fill: 'Fill browser element',
|
|
105
|
+
press: 'Press browser key',
|
|
106
|
+
evaluate: 'Evaluate browser JavaScript',
|
|
107
|
+
close: 'Close browser session',
|
|
108
|
+
};
|
|
109
|
+
await context.requestPermission({
|
|
110
|
+
type: 'browser',
|
|
111
|
+
title: titleByAction[input.action],
|
|
112
|
+
toolCallId: invocationOptions.toolCallId,
|
|
113
|
+
abortSignal: invocationOptions.abortSignal,
|
|
114
|
+
metadata: {
|
|
115
|
+
action: input.action,
|
|
116
|
+
url: input.url,
|
|
117
|
+
selector: input.selector,
|
|
118
|
+
key: input.action === 'press' ? input.text : undefined,
|
|
119
|
+
textLength: input.action === 'fill' ? input.text?.length ?? 0 : undefined,
|
|
120
|
+
scriptPreview: input.action === 'evaluate' && input.script ? compactMetadataText(input.script) : undefined,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
const compactMetadataText = (text) => {
|
|
125
|
+
const compacted = text.replace(/\s+/g, ' ').trim();
|
|
126
|
+
return compacted.length > 160 ? `${compacted.slice(0, 157)}...` : compacted;
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5icm93c2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdG9vbHMvdG9vbC5icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxnQkFBZ0IsR0FLakIsTUFBTSxtQkFBbUIsQ0FBQztBQVczQixNQUFNLGNBQWMsR0FBRztJQUNyQixVQUFVO0lBQ1YsVUFBVTtJQUNWLFlBQVk7SUFDWixPQUFPO0lBQ1AsTUFBTTtJQUNOLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztDQUN5QyxDQUFDO0FBRW5ELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUE4QixFQUFFLFVBQXNDLEVBQUU7SUFDekcsTUFBTSxjQUFjLEdBQUcsOEJBQThCLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDLENBQUMsVUFBVTtRQUNaLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBTSxDQUFDO0lBQzFDLE1BQU0sV0FBVyxHQUFHO1FBQ2xCLGlHQUFpRztRQUNqRyxZQUFZLGlCQUFpQixHQUFHO1FBQ2hDLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQyw4SEFBOEgsQ0FBQztZQUNsSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsR0FBRyxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQyxxRkFBcUYsQ0FBQztZQUN6RixDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1IsQ0FBQyxJ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
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IToolShellResult } from '@modelprofile.com/flexharness-agent';
|
|
2
|
+
export type * from '@modelprofile.com/flexharness-agent';
|
|
3
|
+
export declare const formatShellResult: (result: IToolShellResult | string) => string;
|
|
4
|
+
export declare const formatToolOutput: (output: unknown) => string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const formatShellResult = (result) => {
|
|
2
|
+
if (typeof result === 'string')
|
|
3
|
+
return result;
|
|
4
|
+
if (result.exitCode === 0)
|
|
5
|
+
return result.stdout;
|
|
6
|
+
return [
|
|
7
|
+
`Exit code: ${result.exitCode}`,
|
|
8
|
+
result.signal ? `Signal: ${result.signal}` : '',
|
|
9
|
+
`stdout:\n${result.stdout}`,
|
|
10
|
+
`stderr:\n${result.stderr ?? ''}`,
|
|
11
|
+
].filter(Boolean).join('\n');
|
|
12
|
+
};
|
|
13
|
+
export const formatToolOutput = (output) => {
|
|
14
|
+
if (typeof output === 'string')
|
|
15
|
+
return output;
|
|
16
|
+
try {
|
|
17
|
+
return JSON.stringify(output, undefined, 2);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return String(output);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdG9vbHMvdG9vbC5jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBaUMsRUFBVSxFQUFFO0lBQzdFLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzlDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hELE9BQU87UUFDTCxjQUFjLE1BQU0sQ0FBQyxRQUFRLEVBQUU7UUFDL0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDL0MsWUFBWSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQzNCLFlBQVksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUU7S0FDbEMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBZSxFQUFVLEVBQUU7SUFDMUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDOUMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { type IToolExecutionContext } from './tool.context.js';
|
|
3
|
+
export interface ICreateFilesystemToolsOptions {
|
|
4
|
+
/** Include delete_file. Default: true. */
|
|
5
|
+
includeDelete?: boolean;
|
|
6
|
+
/** Maximum output lines before truncating. */
|
|
7
|
+
maxLines?: number;
|
|
8
|
+
/** Maximum output bytes before truncating. */
|
|
9
|
+
maxBytes?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createFilesystemTools(context: IToolExecutionContext, options?: ICreateFilesystemToolsOptions): plugins.ToolSet;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { formatToolOutput, } from './tool.context.js';
|
|
3
|
+
export function createFilesystemTools(context, options = {}) {
|
|
4
|
+
const truncate = (output) => plugins.truncateOutput(formatToolOutput(output), {
|
|
5
|
+
maxLines: options.maxLines,
|
|
6
|
+
maxBytes: options.maxBytes,
|
|
7
|
+
}).content;
|
|
8
|
+
const tools = {
|
|
9
|
+
read_file: plugins.tool({
|
|
10
|
+
description: 'Read a UTF-8 file in the active workspace. Paths may be absolute or relative to the workspace root.',
|
|
11
|
+
inputSchema: plugins.z.object({
|
|
12
|
+
path: plugins.z.string().describe('File path'),
|
|
13
|
+
startLine: plugins.z
|
|
14
|
+
.number()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('First line (1-indexed, inclusive)'),
|
|
17
|
+
endLine: plugins.z
|
|
18
|
+
.number()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Last line (1-indexed, inclusive)'),
|
|
21
|
+
}),
|
|
22
|
+
execute: async ({ path: filePath, startLine, endLine, }, invocationOptions) => {
|
|
23
|
+
if (!context.fs) {
|
|
24
|
+
throw new Error('Filesystem tools are not available in this execution context.');
|
|
25
|
+
}
|
|
26
|
+
return truncate(await context.fs.readFile(filePath, { startLine, endLine }, {
|
|
27
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
28
|
+
abortSignal: invocationOptions?.abortSignal ?? context.abortSignal,
|
|
29
|
+
}));
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
write_file: plugins.tool({
|
|
33
|
+
description: 'Write UTF-8 content to a file in the active workspace. Creates parent directories and overwrites existing content. Requires host permission when configured.',
|
|
34
|
+
inputSchema: plugins.z.object({
|
|
35
|
+
path: plugins.z.string().describe('File path'),
|
|
36
|
+
content: plugins.z.string().describe('Complete file content to write'),
|
|
37
|
+
}),
|
|
38
|
+
execute: async ({ path: filePath, content }, invocationOptions) => {
|
|
39
|
+
if (!context.fs) {
|
|
40
|
+
throw new Error('Filesystem tools are not available in this execution context.');
|
|
41
|
+
}
|
|
42
|
+
const abortSignal = invocationOptions?.abortSignal ?? context.abortSignal;
|
|
43
|
+
await context.requestPermission?.({
|
|
44
|
+
type: 'write',
|
|
45
|
+
title: 'Write file',
|
|
46
|
+
metadata: { path: filePath, bytes: Buffer.byteLength(content, 'utf8') },
|
|
47
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
48
|
+
abortSignal,
|
|
49
|
+
});
|
|
50
|
+
const result = await context.fs.writeFile(filePath, content, {
|
|
51
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
52
|
+
abortSignal,
|
|
53
|
+
});
|
|
54
|
+
return truncate(result ?? `Written ${Buffer.byteLength(content, 'utf8')} bytes to ${filePath}`);
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
list_directory: plugins.tool({
|
|
58
|
+
description: 'List files and directories in the active workspace. Paths may be absolute or relative to the workspace root.',
|
|
59
|
+
inputSchema: plugins.z.object({
|
|
60
|
+
path: plugins.z.string().default('.').describe('Directory path to list'),
|
|
61
|
+
recursive: plugins.z
|
|
62
|
+
.boolean()
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('List recursively. Default: false'),
|
|
65
|
+
}),
|
|
66
|
+
execute: async ({ path: directoryPath, recursive }, invocationOptions) => {
|
|
67
|
+
if (!context.fs) {
|
|
68
|
+
throw new Error('Filesystem tools are not available in this execution context.');
|
|
69
|
+
}
|
|
70
|
+
const result = await context.fs.listDirectory(directoryPath, { recursive }, {
|
|
71
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
72
|
+
abortSignal: invocationOptions?.abortSignal ?? context.abortSignal,
|
|
73
|
+
});
|
|
74
|
+
return truncate(Array.isArray(result) ? result.join('\n') : result);
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
};
|
|
78
|
+
if (options.includeDelete !== false) {
|
|
79
|
+
tools.delete_file = plugins.tool({
|
|
80
|
+
description: 'Delete a file or empty directory in the active workspace. Requires host permission when configured.',
|
|
81
|
+
inputSchema: plugins.z.object({
|
|
82
|
+
path: plugins.z.string().describe('Path to delete'),
|
|
83
|
+
}),
|
|
84
|
+
execute: async ({ path: targetPath }, invocationOptions) => {
|
|
85
|
+
if (!context.fs?.deletePath) {
|
|
86
|
+
throw new Error('Deleting files is not available in this execution context.');
|
|
87
|
+
}
|
|
88
|
+
const abortSignal = invocationOptions?.abortSignal ?? context.abortSignal;
|
|
89
|
+
await context.requestPermission?.({
|
|
90
|
+
type: 'delete',
|
|
91
|
+
title: 'Delete file',
|
|
92
|
+
metadata: { path: targetPath },
|
|
93
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
94
|
+
abortSignal,
|
|
95
|
+
});
|
|
96
|
+
const result = await context.fs.deletePath(targetPath, {
|
|
97
|
+
toolCallId: invocationOptions?.toolCallId,
|
|
98
|
+
abortSignal,
|
|
99
|
+
});
|
|
100
|
+
return truncate(result ?? `Deleted ${targetPath}`);
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return tools;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5maWxlc3lzdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdG9vbHMvdG9vbC5maWxlc3lzdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxnQkFBZ0IsR0FFakIsTUFBTSxtQkFBbUIsQ0FBQztBQVczQixNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBOEIsRUFBRSxVQUF5QyxFQUFFO0lBQy9HLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBZSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JGLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7S0FDM0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNYLE1BQU0sS0FBSyxHQUFvQjtRQUM3QixTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUN0QixXQUFXLEVBQ1QscUdBQXFHO1lBQ3ZHLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDOUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNqQixNQUFNLEVBQUU7cUJBQ1IsUUFBUSxFQUFFO3FCQUNWLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQztnQkFDaEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNmLE1BQU0sRUFBRTtxQkFDUixRQUFRLEVBQUU7cUJBQ1YsUUFBUSxDQUFDLGtDQUFrQyxDQUFDO2FBQ2hELENBQUM7WUFDRixPQUFPLEVBQUUsS0FBSyxFQUNaLEVBQ0UsSUFBSSxFQUFFLFFBQVEsRUFDZCxTQUFTLEVBQ1QsT0FBTyxHQUtS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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export function httpTool() {
|
|
3
|
+
return {
|
|
4
|
+
http_get: plugins.tool({
|
|
5
|
+
description: 'Make an HTTP GET request and return the response.',
|
|
6
|
+
inputSchema: plugins.z.object({
|
|
7
|
+
url: plugins.z.string().describe('URL to request'),
|
|
8
|
+
headers: plugins.z
|
|
9
|
+
.record(plugins.z.string(), plugins.z.string())
|
|
10
|
+
.optional()
|
|
11
|
+
.describe('Request headers'),
|
|
12
|
+
}),
|
|
13
|
+
execute: async ({ url, headers, }) => {
|
|
14
|
+
let req = plugins.smartrequest.default.create().url(url);
|
|
15
|
+
if (headers) {
|
|
16
|
+
req = req.headers(headers);
|
|
17
|
+
}
|
|
18
|
+
const response = await req.get();
|
|
19
|
+
let body;
|
|
20
|
+
try {
|
|
21
|
+
const json = await response.json();
|
|
22
|
+
body = JSON.stringify(json, null, 2);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
body = await response.text();
|
|
26
|
+
}
|
|
27
|
+
return plugins.truncateOutput(`HTTP ${response.status}\n${body}`).content;
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
http_post: plugins.tool({
|
|
31
|
+
description: 'Make an HTTP POST request with a JSON body.',
|
|
32
|
+
inputSchema: plugins.z.object({
|
|
33
|
+
url: plugins.z.string().describe('URL to request'),
|
|
34
|
+
body: plugins.z
|
|
35
|
+
.record(plugins.z.string(), plugins.z.unknown())
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('JSON body to send'),
|
|
38
|
+
headers: plugins.z
|
|
39
|
+
.record(plugins.z.string(), plugins.z.string())
|
|
40
|
+
.optional()
|
|
41
|
+
.describe('Request headers'),
|
|
42
|
+
}),
|
|
43
|
+
execute: async ({ url, body, headers, }) => {
|
|
44
|
+
let req = plugins.smartrequest.default.create().url(url);
|
|
45
|
+
if (headers) {
|
|
46
|
+
req = req.headers(headers);
|
|
47
|
+
}
|
|
48
|
+
if (body) {
|
|
49
|
+
req = req.json(body);
|
|
50
|
+
}
|
|
51
|
+
const response = await req.post();
|
|
52
|
+
let responseBody;
|
|
53
|
+
try {
|
|
54
|
+
const json = await response.json();
|
|
55
|
+
responseBody = JSON.stringify(json, null, 2);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
responseBody = await response.text();
|
|
59
|
+
}
|
|
60
|
+
return plugins.truncateOutput(`HTTP ${response.status}\n${responseBody}`).content;
|
|
61
|
+
},
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC5odHRwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfdG9vbHMvdG9vbC5odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxRQUFRO0lBQ3RCLE9BQU87UUFDTCxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNyQixXQUFXLEVBQUUsbURBQW1EO1lBQ2hFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2dCQUNsRCxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ2YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztxQkFDOUMsUUFBUSxFQUFFO3FCQUNWLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQzthQUMvQixDQUFDO1lBQ0YsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUNkLEdBQUcsRUFDSCxPQUFPLEdBSVIsRUFBRSxFQUFFO2dCQUNILElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekQsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxJQUFZLENBQUM7Z0JBQ2pCLElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixDQUFDO2dCQUNELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDNUUsQ0FBQztTQUNGLENBQUM7UUFFRixTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztZQUN0QixXQUFXLEVBQUUsNkNBQTZDO1lBQzFELFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDNUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO2dCQUNsRCxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ1osTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztxQkFDL0MsUUFBUSxFQUFFO3FCQUNWLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQzlDLFFBQVEsRUFBRTtxQkFDVixRQUFRLENBQUMsaUJBQWlCLENBQUM7YUFDL0IsQ0FBQztZQUNGLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFDZCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE9BQU8sR0FLUixFQUFFLEVBQUU7Z0JBQ0gsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM3QixDQUFDO2dCQUNELElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2xDLElBQUksWUFBb0IsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsUUFBUSxDQUFDLE1BQU0sS0FBSyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUNwRixDQUFDO1NBQ0YsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDIn0=
|