@toolplex/client 0.1.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/LICENSE +98 -0
- package/README.md +112 -0
- package/dist/mcp-server/clientContext.d.ts +35 -0
- package/dist/mcp-server/clientContext.js +107 -0
- package/dist/mcp-server/index.d.ts +1 -0
- package/dist/mcp-server/index.js +22 -0
- package/dist/mcp-server/logging/telemetryLogger.d.ts +18 -0
- package/dist/mcp-server/logging/telemetryLogger.js +54 -0
- package/dist/mcp-server/policy/callToolObserver.d.ts +9 -0
- package/dist/mcp-server/policy/callToolObserver.js +25 -0
- package/dist/mcp-server/policy/feedbackPolicy.d.ts +27 -0
- package/dist/mcp-server/policy/feedbackPolicy.js +39 -0
- package/dist/mcp-server/policy/installObserver.d.ts +11 -0
- package/dist/mcp-server/policy/installObserver.js +35 -0
- package/dist/mcp-server/policy/playbookPolicy.d.ts +29 -0
- package/dist/mcp-server/policy/playbookPolicy.js +81 -0
- package/dist/mcp-server/policy/policyEnforcer.d.ts +57 -0
- package/dist/mcp-server/policy/policyEnforcer.js +105 -0
- package/dist/mcp-server/policy/serverPolicy.d.ts +39 -0
- package/dist/mcp-server/policy/serverPolicy.js +61 -0
- package/dist/mcp-server/promptsCache.d.ts +25 -0
- package/dist/mcp-server/promptsCache.js +51 -0
- package/dist/mcp-server/registry.d.ts +34 -0
- package/dist/mcp-server/registry.js +109 -0
- package/dist/mcp-server/serversCache.d.ts +53 -0
- package/dist/mcp-server/serversCache.js +100 -0
- package/dist/mcp-server/staticPrompts.d.ts +6 -0
- package/dist/mcp-server/staticPrompts.js +6 -0
- package/dist/mcp-server/toolDefinitionsCache.d.ts +33 -0
- package/dist/mcp-server/toolDefinitionsCache.js +67 -0
- package/dist/mcp-server/toolHandlers/callToolHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/callToolHandler.js +79 -0
- package/dist/mcp-server/toolHandlers/getServerConfigHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/getServerConfigHandler.js +69 -0
- package/dist/mcp-server/toolHandlers/initHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/initHandler.js +117 -0
- package/dist/mcp-server/toolHandlers/installServerHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/installServerHandler.js +151 -0
- package/dist/mcp-server/toolHandlers/listServersHandler.d.ts +2 -0
- package/dist/mcp-server/toolHandlers/listServersHandler.js +81 -0
- package/dist/mcp-server/toolHandlers/listToolsHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/listToolsHandler.js +112 -0
- package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.js +65 -0
- package/dist/mcp-server/toolHandlers/lookupEntityHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/lookupEntityHandler.js +112 -0
- package/dist/mcp-server/toolHandlers/savePlaybookHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/savePlaybookHandler.js +65 -0
- package/dist/mcp-server/toolHandlers/searchHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/searchHandler.js +114 -0
- package/dist/mcp-server/toolHandlers/serverManagerUtils.d.ts +2 -0
- package/dist/mcp-server/toolHandlers/serverManagerUtils.js +20 -0
- package/dist/mcp-server/toolHandlers/submitFeedbackHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/submitFeedbackHandler.js +70 -0
- package/dist/mcp-server/toolHandlers/uninstallServerHandler.d.ts +3 -0
- package/dist/mcp-server/toolHandlers/uninstallServerHandler.js +83 -0
- package/dist/mcp-server/toolplexApi/service.d.ts +32 -0
- package/dist/mcp-server/toolplexApi/service.js +222 -0
- package/dist/mcp-server/toolplexApi/types.d.ts +124 -0
- package/dist/mcp-server/toolplexApi/types.js +1 -0
- package/dist/mcp-server/toolplexServer.d.ts +3 -0
- package/dist/mcp-server/toolplexServer.js +249 -0
- package/dist/mcp-server/tools.d.ts +2 -0
- package/dist/mcp-server/tools.js +13 -0
- package/dist/mcp-server/utils/initServerManagers.d.ts +6 -0
- package/dist/mcp-server/utils/initServerManagers.js +31 -0
- package/dist/mcp-server/utils/resultAnnotators.d.ts +23 -0
- package/dist/mcp-server/utils/resultAnnotators.js +50 -0
- package/dist/mcp-server/utils/runtimeCheck.d.ts +4 -0
- package/dist/mcp-server/utils/runtimeCheck.js +30 -0
- package/dist/server-manager/index.d.ts +1 -0
- package/dist/server-manager/index.js +8 -0
- package/dist/server-manager/serverManager.d.ts +37 -0
- package/dist/server-manager/serverManager.js +419 -0
- package/dist/server-manager/stdioServer.d.ts +9 -0
- package/dist/server-manager/stdioServer.js +136 -0
- package/dist/server-manager/stdioTransportProtocol.d.ts +31 -0
- package/dist/server-manager/stdioTransportProtocol.js +67 -0
- package/dist/shared/enhancedPath.d.ts +7 -0
- package/dist/shared/enhancedPath.js +52 -0
- package/dist/shared/fileLogger.d.ts +13 -0
- package/dist/shared/fileLogger.js +66 -0
- package/dist/shared/mcpServerTypes.d.ts +398 -0
- package/dist/shared/mcpServerTypes.js +148 -0
- package/dist/shared/serverManagerTypes.d.ts +179 -0
- package/dist/shared/serverManagerTypes.js +73 -0
- package/dist/shared/stdioServerManagerClient.d.ts +12 -0
- package/dist/shared/stdioServerManagerClient.js +96 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { FileLogger } from '../../shared/fileLogger.js';
|
|
2
|
+
import Registry from '../registry.js';
|
|
3
|
+
const logger = FileLogger;
|
|
4
|
+
export async function handleSubmitFeedback(params) {
|
|
5
|
+
const startTime = Date.now();
|
|
6
|
+
await logger.info('Handling submit feedback request');
|
|
7
|
+
await logger.debug(`Feedback params: ${JSON.stringify(params)}`);
|
|
8
|
+
const { target_type, target_id, vote, message, security_assessment } = params;
|
|
9
|
+
const apiService = Registry.getToolplexApiService();
|
|
10
|
+
const telemetryLogger = Registry.getTelemetryLogger();
|
|
11
|
+
const promptsCache = Registry.getPromptsCache();
|
|
12
|
+
const policyEnforcer = Registry.getPolicyEnforcer();
|
|
13
|
+
const clientContext = Registry.getClientContext();
|
|
14
|
+
try {
|
|
15
|
+
// Check if the client is in restricted mode
|
|
16
|
+
if (clientContext.clientMode === 'restricted') {
|
|
17
|
+
throw new Error('Feedback functionality is disabled in restricted mode.');
|
|
18
|
+
}
|
|
19
|
+
// Check if read-only mode is enabled
|
|
20
|
+
if (clientContext.permissions.enable_read_only_mode) {
|
|
21
|
+
throw new Error('Saving playbooks is disabled in read-only mode');
|
|
22
|
+
}
|
|
23
|
+
// Enforce feedback policy before submitting
|
|
24
|
+
policyEnforcer.enforceFeedbackPolicy(params);
|
|
25
|
+
const response = await apiService.submitFeedback(target_type, target_id, vote, message, security_assessment);
|
|
26
|
+
await logger.info(`Feedback submitted successfully for ${target_type} ${target_id}`);
|
|
27
|
+
await telemetryLogger.log('client_submit_feedback', {
|
|
28
|
+
success: true,
|
|
29
|
+
log_context: {
|
|
30
|
+
target_type,
|
|
31
|
+
target_id,
|
|
32
|
+
feedback_id: response.id,
|
|
33
|
+
},
|
|
34
|
+
latency_ms: Date.now() - startTime,
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
role: 'system',
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: promptsCache
|
|
42
|
+
.getPrompt('submit_feedback_success')
|
|
43
|
+
.replace('{FEEDBACK_ID}', response.id),
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
50
|
+
await logger.error(`Failed to submit feedback: ${errorMessage}`);
|
|
51
|
+
await telemetryLogger.log('client_submit_feedback', {
|
|
52
|
+
success: false,
|
|
53
|
+
log_context: {
|
|
54
|
+
target_type,
|
|
55
|
+
target_id,
|
|
56
|
+
},
|
|
57
|
+
pii_sanitized_error_message: errorMessage,
|
|
58
|
+
latency_ms: Date.now() - startTime,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
role: 'system',
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: promptsCache.getPrompt('unexpected_error').replace('{ERROR}', errorMessage),
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { findServerManagerClient } from './serverManagerUtils.js';
|
|
2
|
+
import { ServerUninstallResultSchema } from '../../shared/serverManagerTypes.js';
|
|
3
|
+
import { FileLogger } from '../../shared/fileLogger.js';
|
|
4
|
+
import Registry from '../registry.js';
|
|
5
|
+
const logger = FileLogger;
|
|
6
|
+
export async function handleUninstallServer(params) {
|
|
7
|
+
const startTime = Date.now();
|
|
8
|
+
const serverManagerClients = Registry.getServerManagerClients();
|
|
9
|
+
const telemetryLogger = Registry.getTelemetryLogger();
|
|
10
|
+
const promptsCache = Registry.getPromptsCache();
|
|
11
|
+
const serversCache = Registry.getServersCache();
|
|
12
|
+
const clientContext = Registry.getClientContext();
|
|
13
|
+
const policyEnforcer = Registry.getPolicyEnforcer();
|
|
14
|
+
const installObserver = policyEnforcer.getInstallObserver();
|
|
15
|
+
let errorMessage;
|
|
16
|
+
try {
|
|
17
|
+
// Check if the client is in restricted mode
|
|
18
|
+
if (clientContext.clientMode === 'restricted') {
|
|
19
|
+
throw new Error('Uninstall functionality is disabled in restricted mode.');
|
|
20
|
+
}
|
|
21
|
+
const server_id = params.server_id;
|
|
22
|
+
await logger.info(`Handling uninstall request for server ${server_id}`);
|
|
23
|
+
const client = await findServerManagerClient(server_id, serverManagerClients);
|
|
24
|
+
const response = await client.sendRequest('uninstall', { server_id });
|
|
25
|
+
if ('error' in response) {
|
|
26
|
+
errorMessage = `Failed to uninstall server_id: ${server_id}, error message: ${response.error.message}`;
|
|
27
|
+
throw new Error(errorMessage);
|
|
28
|
+
}
|
|
29
|
+
const parsed = ServerUninstallResultSchema.safeParse(response);
|
|
30
|
+
if (!parsed.success) {
|
|
31
|
+
throw new Error(`Invalid uninstall response: ${parsed.error}`);
|
|
32
|
+
}
|
|
33
|
+
// Refresh the servers cache after successful uninstall
|
|
34
|
+
await serversCache.refreshCache(serverManagerClients);
|
|
35
|
+
await logger.info(`Successfully uninstalled server ${server_id}`);
|
|
36
|
+
await telemetryLogger.log('client_uninstall', {
|
|
37
|
+
success: true,
|
|
38
|
+
log_context: {
|
|
39
|
+
server_id: parsed.data.server_id,
|
|
40
|
+
},
|
|
41
|
+
latency_ms: Date.now() - startTime,
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
role: 'system',
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: 'text',
|
|
48
|
+
text: promptsCache
|
|
49
|
+
.getPrompt('uninstall_success')
|
|
50
|
+
.replace('{SERVER_ID}', parsed.data.server_id)
|
|
51
|
+
.replace('{SERVER_NAME}', parsed.data.server_name),
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof Error) {
|
|
58
|
+
errorMessage = error.message;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
errorMessage = promptsCache.getPrompt('unexpected_error');
|
|
62
|
+
}
|
|
63
|
+
await logger.error(`Failed to uninstall server: ${errorMessage}`);
|
|
64
|
+
await telemetryLogger.log('client_uninstall', {
|
|
65
|
+
success: false,
|
|
66
|
+
pii_sanitized_error_message: errorMessage,
|
|
67
|
+
latency_ms: Date.now() - startTime,
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
role: 'system',
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: 'text',
|
|
74
|
+
text: promptsCache.getPrompt('uninstall_failure').replace('{ERROR}', errorMessage),
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
// Record the uninstall action regardless of success or failure
|
|
81
|
+
installObserver.recordUninstall(params.server_id);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CreatePlaybookResponse, LogPlaybookUsageResponse, SubmitFeedbackResponse, SecurityAssessment, FeedbackSummaryResponse, LogTelemetryRequest, LogTelemetryBatchResponse, InitResponse } from './types.js';
|
|
2
|
+
import { ClientContext } from '../clientContext.js';
|
|
3
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { PlaybookAction } from '../../shared/mcpServerTypes.js';
|
|
5
|
+
export declare class ToolplexApiService {
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
private readonly clientContext;
|
|
8
|
+
private readonly machineContext;
|
|
9
|
+
constructor(clientContext: ClientContext);
|
|
10
|
+
private getBaseUrl;
|
|
11
|
+
private handleFetchResponse;
|
|
12
|
+
private getBaseHeaders;
|
|
13
|
+
private getHeadersWithSession;
|
|
14
|
+
init(): Promise<InitResponse>;
|
|
15
|
+
getTools(): Promise<{
|
|
16
|
+
_version: string;
|
|
17
|
+
tools: Tool[];
|
|
18
|
+
}>;
|
|
19
|
+
logTelemetryEvents(events: Array<{
|
|
20
|
+
eventType: LogTelemetryRequest['event_type'];
|
|
21
|
+
data: Partial<Omit<LogTelemetryRequest, 'event_type'>>;
|
|
22
|
+
}>): Promise<LogTelemetryBatchResponse>;
|
|
23
|
+
lookupEntity(entityType: 'server' | 'playbook' | 'feedback', entityId: string): Promise<any>;
|
|
24
|
+
search(query: string, expandedKeywords?: string[], filter?: string, size?: number): Promise<{
|
|
25
|
+
mcp_servers?: any[];
|
|
26
|
+
playbooks?: any[];
|
|
27
|
+
}>;
|
|
28
|
+
createPlaybook(description: string, actions: Array<PlaybookAction>, domain?: string, keywords?: string[], requirements?: string[], sourcePlaybookId?: string, forkReason?: string): Promise<CreatePlaybookResponse>;
|
|
29
|
+
logPlaybookUsage(playbookId: string, success: boolean, errorMessage?: string): Promise<LogPlaybookUsageResponse>;
|
|
30
|
+
submitFeedback(targetType: 'server' | 'playbook', targetId: string, vote: 'up' | 'down', message?: string, securityAssessment?: SecurityAssessment): Promise<SubmitFeedbackResponse>;
|
|
31
|
+
getFeedbackSummary(): Promise<FeedbackSummaryResponse>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import fetch from 'node-fetch';
|
|
2
|
+
import { FileLogger } from '../../shared/fileLogger.js';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
const logger = FileLogger;
|
|
5
|
+
export class ToolplexApiService {
|
|
6
|
+
constructor(clientContext) {
|
|
7
|
+
if (!clientContext.apiKey) {
|
|
8
|
+
throw new Error('API key not set in client context');
|
|
9
|
+
}
|
|
10
|
+
if (!clientContext.clientVersion) {
|
|
11
|
+
throw new Error('Client version not set in client context');
|
|
12
|
+
}
|
|
13
|
+
this.clientContext = clientContext;
|
|
14
|
+
this.baseUrl = this.getBaseUrl(clientContext.dev);
|
|
15
|
+
this.machineContext = {
|
|
16
|
+
os: `${os.platform()} ${os.release()}`,
|
|
17
|
+
arch: os.arch(),
|
|
18
|
+
memory_gb: Math.round(os.totalmem() / (1024 * 1024 * 1024)),
|
|
19
|
+
cpu_cores: os.cpus().length.toString(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
getBaseUrl(dev) {
|
|
23
|
+
return dev ? 'http://localhost:8080' : 'https://api.toolplex.ai';
|
|
24
|
+
}
|
|
25
|
+
async handleFetchResponse(response) {
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const error = await response.text();
|
|
28
|
+
throw new Error(`HTTP ${response.status}: ${error}`);
|
|
29
|
+
}
|
|
30
|
+
return response.json();
|
|
31
|
+
}
|
|
32
|
+
getBaseHeaders() {
|
|
33
|
+
return {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
Accept: 'application/json',
|
|
36
|
+
'x-api-key': this.clientContext.apiKey,
|
|
37
|
+
'x-client-mode': this.clientContext.clientMode,
|
|
38
|
+
'x-client-version': this.clientContext.clientVersion,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
getHeadersWithSession() {
|
|
42
|
+
return {
|
|
43
|
+
...this.getBaseHeaders(),
|
|
44
|
+
'x-session-id': this.clientContext.sessionId,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async init() {
|
|
48
|
+
try {
|
|
49
|
+
const initRequest = {
|
|
50
|
+
llm_context: this.clientContext.llmContext,
|
|
51
|
+
};
|
|
52
|
+
const response = await fetch(`${this.baseUrl}/init`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: this.getBaseHeaders(),
|
|
55
|
+
body: JSON.stringify(initRequest),
|
|
56
|
+
});
|
|
57
|
+
return this.handleFetchResponse(response);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
await logger.error(`Error initializing session: ${err}`);
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async getTools() {
|
|
65
|
+
try {
|
|
66
|
+
const response = await fetch(`${this.baseUrl}/tools`, {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers: this.getBaseHeaders(),
|
|
69
|
+
body: JSON.stringify({}),
|
|
70
|
+
});
|
|
71
|
+
return this.handleFetchResponse(response);
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
await logger.error(`Error fetching tool definitions: ${err}`);
|
|
75
|
+
throw err;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async logTelemetryEvents(events) {
|
|
79
|
+
try {
|
|
80
|
+
const response = await fetch(`${this.baseUrl}/telemetry/log/batch`, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers: this.getHeadersWithSession(),
|
|
83
|
+
body: JSON.stringify(events.map((event) => ({
|
|
84
|
+
event_type: event.eventType,
|
|
85
|
+
...event.data,
|
|
86
|
+
}))),
|
|
87
|
+
});
|
|
88
|
+
return this.handleFetchResponse(response);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
await logger.error(`Error batch logging telemetry events: ${err}`);
|
|
92
|
+
return { success: false };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async lookupEntity(entityType, entityId
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
) {
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(`${this.baseUrl}/lookup-entity`, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: this.getHeadersWithSession(),
|
|
102
|
+
body: JSON.stringify({
|
|
103
|
+
entity_type: entityType,
|
|
104
|
+
entity_id: entityId,
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
return this.handleFetchResponse(response);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
await logger.error(`Error looking up entity: ${err}`);
|
|
111
|
+
throw err;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async search(query, expandedKeywords = [], filter = 'all', size = 10
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
+
) {
|
|
117
|
+
const requestBody = {
|
|
118
|
+
query,
|
|
119
|
+
expanded_keywords: expandedKeywords,
|
|
120
|
+
filter,
|
|
121
|
+
size,
|
|
122
|
+
};
|
|
123
|
+
await logger.debug(`Searching API at ${this.baseUrl} with query: ${query}`);
|
|
124
|
+
try {
|
|
125
|
+
const response = await fetch(`${this.baseUrl}/search`, {
|
|
126
|
+
method: 'POST',
|
|
127
|
+
headers: this.getHeadersWithSession(),
|
|
128
|
+
body: JSON.stringify(requestBody),
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
const errorText = await response.text();
|
|
132
|
+
throw new Error(`HTTP ${response.status}: ${errorText}`);
|
|
133
|
+
}
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
135
|
+
return (await response.json());
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
await logger.error(`Error during search request: ${err}`);
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async createPlaybook(description, actions, domain, keywords, requirements, sourcePlaybookId, forkReason) {
|
|
143
|
+
const requestBody = {
|
|
144
|
+
description,
|
|
145
|
+
actions,
|
|
146
|
+
llm_context: this.clientContext.llmContext,
|
|
147
|
+
domain,
|
|
148
|
+
keywords,
|
|
149
|
+
requirements,
|
|
150
|
+
source_playbook_id: sourcePlaybookId,
|
|
151
|
+
fork_reason: forkReason,
|
|
152
|
+
};
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(`${this.baseUrl}/playbooks/create`, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: this.getHeadersWithSession(),
|
|
157
|
+
body: JSON.stringify(requestBody),
|
|
158
|
+
});
|
|
159
|
+
return this.handleFetchResponse(response);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
await logger.error(`Error creating playbook: ${err}`);
|
|
163
|
+
throw err;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async logPlaybookUsage(playbookId, success, errorMessage) {
|
|
167
|
+
const requestBody = {
|
|
168
|
+
playbook_id: playbookId,
|
|
169
|
+
success,
|
|
170
|
+
llm_context: this.clientContext.llmContext,
|
|
171
|
+
error_message: errorMessage,
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
const response = await fetch(`${this.baseUrl}/playbooks/log-usage`, {
|
|
175
|
+
method: 'POST',
|
|
176
|
+
headers: this.getHeadersWithSession(),
|
|
177
|
+
body: JSON.stringify(requestBody),
|
|
178
|
+
});
|
|
179
|
+
return this.handleFetchResponse(response);
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
await logger.error(`Error logging playbook usage: ${err}`);
|
|
183
|
+
throw err;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async submitFeedback(targetType, targetId, vote, message, securityAssessment) {
|
|
187
|
+
const requestBody = {
|
|
188
|
+
target_type: targetType,
|
|
189
|
+
target_id: targetId,
|
|
190
|
+
vote,
|
|
191
|
+
message,
|
|
192
|
+
llm_context: this.clientContext.llmContext,
|
|
193
|
+
machine_context: this.machineContext,
|
|
194
|
+
security_assessment: securityAssessment,
|
|
195
|
+
};
|
|
196
|
+
try {
|
|
197
|
+
const response = await fetch(`${this.baseUrl}/feedback/submit`, {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
headers: this.getHeadersWithSession(),
|
|
200
|
+
body: JSON.stringify(requestBody),
|
|
201
|
+
});
|
|
202
|
+
return this.handleFetchResponse(response);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
await logger.error(`Error submitting feedback: ${err}`);
|
|
206
|
+
throw err;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
async getFeedbackSummary() {
|
|
210
|
+
try {
|
|
211
|
+
const response = await fetch(`${this.baseUrl}/feedback/summarize`, {
|
|
212
|
+
method: 'GET',
|
|
213
|
+
headers: this.getHeadersWithSession(),
|
|
214
|
+
});
|
|
215
|
+
return this.handleFetchResponse(response);
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
await logger.error(`Error getting feedback summary: ${err}`);
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export interface InitRequest {
|
|
2
|
+
llm_context: LlmContext;
|
|
3
|
+
}
|
|
4
|
+
export interface ClientPermissions {
|
|
5
|
+
use_desktop_commander: boolean;
|
|
6
|
+
enable_read_only_mode: boolean;
|
|
7
|
+
allowed_mcp_servers?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface ClientFlags {
|
|
10
|
+
desktop_commander_server_id: string;
|
|
11
|
+
blocked_mcp_servers: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface InitResponse {
|
|
14
|
+
session_id: string;
|
|
15
|
+
playbooks: {
|
|
16
|
+
playbooks: Array<{
|
|
17
|
+
id: string;
|
|
18
|
+
description: string;
|
|
19
|
+
times_used: number;
|
|
20
|
+
days_since_last_used: number | null;
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
23
|
+
is_org_user: boolean;
|
|
24
|
+
prompts: Record<string, string>;
|
|
25
|
+
permissions: ClientPermissions;
|
|
26
|
+
flags: ClientFlags;
|
|
27
|
+
}
|
|
28
|
+
export type SecurityFlag = string;
|
|
29
|
+
export type RiskLevel = string;
|
|
30
|
+
export interface CustomSecurityFlag {
|
|
31
|
+
custom_flag: string;
|
|
32
|
+
}
|
|
33
|
+
export interface SecurityAssessment {
|
|
34
|
+
security_flags: Array<SecurityFlag | CustomSecurityFlag>;
|
|
35
|
+
risk_assessment: RiskLevel;
|
|
36
|
+
context_note?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface LlmContext {
|
|
39
|
+
model_family: string;
|
|
40
|
+
model_name: string;
|
|
41
|
+
model_version: string;
|
|
42
|
+
chat_client?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CreatePlaybookRequest {
|
|
45
|
+
description: string;
|
|
46
|
+
actions: Array<{
|
|
47
|
+
do: string;
|
|
48
|
+
call?: string;
|
|
49
|
+
}>;
|
|
50
|
+
llm_context: LlmContext;
|
|
51
|
+
domain?: string;
|
|
52
|
+
keywords?: string[];
|
|
53
|
+
requirements?: string[];
|
|
54
|
+
source_playbook_id?: string;
|
|
55
|
+
fork_reason?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface CreatePlaybookResponse {
|
|
58
|
+
id: string;
|
|
59
|
+
success: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface LogPlaybookUsageRequest {
|
|
62
|
+
playbook_id: string;
|
|
63
|
+
success: boolean;
|
|
64
|
+
llm_context: LlmContext;
|
|
65
|
+
error_message?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface LogPlaybookUsageResponse {
|
|
68
|
+
success: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface SubmitFeedbackRequest {
|
|
71
|
+
target_type: 'server' | 'playbook';
|
|
72
|
+
target_id: string;
|
|
73
|
+
vote: 'up' | 'down';
|
|
74
|
+
message?: string;
|
|
75
|
+
llm_context: LlmContext;
|
|
76
|
+
machine_context: {
|
|
77
|
+
os: string;
|
|
78
|
+
arch: string;
|
|
79
|
+
memory_gb: number;
|
|
80
|
+
cpu_cores: string;
|
|
81
|
+
};
|
|
82
|
+
security_assessment?: SecurityAssessment;
|
|
83
|
+
}
|
|
84
|
+
export interface SubmitFeedbackResponse {
|
|
85
|
+
id: string;
|
|
86
|
+
success: boolean;
|
|
87
|
+
}
|
|
88
|
+
export interface FeedbackSummaryResponse {
|
|
89
|
+
servers: Array<{
|
|
90
|
+
server_id: string;
|
|
91
|
+
upvotes: number;
|
|
92
|
+
downvotes: number;
|
|
93
|
+
feedback_ids: string[];
|
|
94
|
+
}>;
|
|
95
|
+
playbooks: Array<{
|
|
96
|
+
playbook_id: string;
|
|
97
|
+
upvotes: number;
|
|
98
|
+
downvotes: number;
|
|
99
|
+
}>;
|
|
100
|
+
}
|
|
101
|
+
export interface LogTelemetryRequest {
|
|
102
|
+
client_version: string;
|
|
103
|
+
event_type: string;
|
|
104
|
+
session_id?: string;
|
|
105
|
+
agent_id?: string;
|
|
106
|
+
agent_type?: 'user' | 'system' | 'external';
|
|
107
|
+
success?: boolean;
|
|
108
|
+
pii_sanitized_error_message?: string;
|
|
109
|
+
log_context?: {
|
|
110
|
+
[key: string]: any;
|
|
111
|
+
};
|
|
112
|
+
latency_ms: number;
|
|
113
|
+
llm_context: {
|
|
114
|
+
model: string;
|
|
115
|
+
provider: string;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export interface LogTelemetryBatchResponse {
|
|
119
|
+
success: boolean;
|
|
120
|
+
}
|
|
121
|
+
export interface SearchResponse {
|
|
122
|
+
mcp_servers?: any[];
|
|
123
|
+
playbooks?: any[];
|
|
124
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|