@ugm/desiagent 0.1.21
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/README.md +251 -0
- package/dist/__tests__/test-utils.d.ts +24 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/__tests__/test-utils.js +32 -0
- package/dist/__tests__/test-utils.js.map +1 -0
- package/dist/core/execution/agents.d.ts +60 -0
- package/dist/core/execution/agents.d.ts.map +1 -0
- package/dist/core/execution/agents.js +249 -0
- package/dist/core/execution/agents.js.map +1 -0
- package/dist/core/execution/artifacts.d.ts +27 -0
- package/dist/core/execution/artifacts.d.ts.map +1 -0
- package/dist/core/execution/artifacts.js +93 -0
- package/dist/core/execution/artifacts.js.map +1 -0
- package/dist/core/execution/costs.d.ts +160 -0
- package/dist/core/execution/costs.d.ts.map +1 -0
- package/dist/core/execution/costs.js +196 -0
- package/dist/core/execution/costs.js.map +1 -0
- package/dist/core/execution/dagExecutor.d.ts +112 -0
- package/dist/core/execution/dagExecutor.d.ts.map +1 -0
- package/dist/core/execution/dagExecutor.js +647 -0
- package/dist/core/execution/dagExecutor.js.map +1 -0
- package/dist/core/execution/dags.d.ts +167 -0
- package/dist/core/execution/dags.d.ts.map +1 -0
- package/dist/core/execution/dags.js +713 -0
- package/dist/core/execution/dags.js.map +1 -0
- package/dist/core/execution/executions.d.ts +158 -0
- package/dist/core/execution/executions.d.ts.map +1 -0
- package/dist/core/execution/executions.js +258 -0
- package/dist/core/execution/executions.js.map +1 -0
- package/dist/core/execution/goals.d.ts +62 -0
- package/dist/core/execution/goals.d.ts.map +1 -0
- package/dist/core/execution/goals.js +245 -0
- package/dist/core/execution/goals.js.map +1 -0
- package/dist/core/execution/runs.d.ts +65 -0
- package/dist/core/execution/runs.d.ts.map +1 -0
- package/dist/core/execution/runs.js +219 -0
- package/dist/core/execution/runs.js.map +1 -0
- package/dist/core/execution/tools.d.ts +24 -0
- package/dist/core/execution/tools.d.ts.map +1 -0
- package/dist/core/execution/tools.js +33 -0
- package/dist/core/execution/tools.js.map +1 -0
- package/dist/core/orchestration/index.d.ts +7 -0
- package/dist/core/orchestration/index.d.ts.map +1 -0
- package/dist/core/orchestration/index.js +7 -0
- package/dist/core/orchestration/index.js.map +1 -0
- package/dist/core/orchestration/orchestrator.d.ts +39 -0
- package/dist/core/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestration/orchestrator.js +141 -0
- package/dist/core/orchestration/orchestrator.js.map +1 -0
- package/dist/core/orchestration/planner.d.ts +63 -0
- package/dist/core/orchestration/planner.d.ts.map +1 -0
- package/dist/core/orchestration/planner.js +99 -0
- package/dist/core/orchestration/planner.js.map +1 -0
- package/dist/core/providers/factory.d.ts +25 -0
- package/dist/core/providers/factory.d.ts.map +1 -0
- package/dist/core/providers/factory.js +86 -0
- package/dist/core/providers/factory.js.map +1 -0
- package/dist/core/providers/index.d.ts +11 -0
- package/dist/core/providers/index.d.ts.map +1 -0
- package/dist/core/providers/index.js +10 -0
- package/dist/core/providers/index.js.map +1 -0
- package/dist/core/providers/ollama.d.ts +36 -0
- package/dist/core/providers/ollama.d.ts.map +1 -0
- package/dist/core/providers/ollama.js +123 -0
- package/dist/core/providers/ollama.js.map +1 -0
- package/dist/core/providers/openai.d.ts +33 -0
- package/dist/core/providers/openai.d.ts.map +1 -0
- package/dist/core/providers/openai.js +114 -0
- package/dist/core/providers/openai.js.map +1 -0
- package/dist/core/providers/openrouter.d.ts +38 -0
- package/dist/core/providers/openrouter.d.ts.map +1 -0
- package/dist/core/providers/openrouter.js +269 -0
- package/dist/core/providers/openrouter.js.map +1 -0
- package/dist/core/providers/types.d.ts +101 -0
- package/dist/core/providers/types.d.ts.map +1 -0
- package/dist/core/providers/types.js +7 -0
- package/dist/core/providers/types.js.map +1 -0
- package/dist/core/tools/base.d.ts +56 -0
- package/dist/core/tools/base.d.ts.map +1 -0
- package/dist/core/tools/base.js +60 -0
- package/dist/core/tools/base.js.map +1 -0
- package/dist/core/tools/bash.d.ts +50 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +179 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit.d.ts +39 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +67 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/executor.d.ts +33 -0
- package/dist/core/tools/executor.d.ts.map +1 -0
- package/dist/core/tools/executor.js +105 -0
- package/dist/core/tools/executor.js.map +1 -0
- package/dist/core/tools/fetchPage.d.ts +46 -0
- package/dist/core/tools/fetchPage.d.ts.map +1 -0
- package/dist/core/tools/fetchPage.js +87 -0
- package/dist/core/tools/fetchPage.js.map +1 -0
- package/dist/core/tools/fetchURLs.d.ts +39 -0
- package/dist/core/tools/fetchURLs.d.ts.map +1 -0
- package/dist/core/tools/fetchURLs.js +67 -0
- package/dist/core/tools/fetchURLs.js.map +1 -0
- package/dist/core/tools/glob.d.ts +36 -0
- package/dist/core/tools/glob.d.ts.map +1 -0
- package/dist/core/tools/glob.js +78 -0
- package/dist/core/tools/glob.js.map +1 -0
- package/dist/core/tools/grep.d.ts +51 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +152 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +22 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +22 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/llmExecute.d.ts +153 -0
- package/dist/core/tools/llmExecute.d.ts.map +1 -0
- package/dist/core/tools/llmExecute.js +105 -0
- package/dist/core/tools/llmExecute.js.map +1 -0
- package/dist/core/tools/readEmail.d.ts +68 -0
- package/dist/core/tools/readEmail.d.ts.map +1 -0
- package/dist/core/tools/readEmail.js +182 -0
- package/dist/core/tools/readEmail.js.map +1 -0
- package/dist/core/tools/readFile.d.ts +42 -0
- package/dist/core/tools/readFile.d.ts.map +1 -0
- package/dist/core/tools/readFile.js +79 -0
- package/dist/core/tools/readFile.js.map +1 -0
- package/dist/core/tools/registry.d.ts +53 -0
- package/dist/core/tools/registry.d.ts.map +1 -0
- package/dist/core/tools/registry.js +112 -0
- package/dist/core/tools/registry.js.map +1 -0
- package/dist/core/tools/sendEmail.d.ts +83 -0
- package/dist/core/tools/sendEmail.d.ts.map +1 -0
- package/dist/core/tools/sendEmail.js +132 -0
- package/dist/core/tools/sendEmail.js.map +1 -0
- package/dist/core/tools/sendWebhook.d.ts +48 -0
- package/dist/core/tools/sendWebhook.d.ts.map +1 -0
- package/dist/core/tools/sendWebhook.js +61 -0
- package/dist/core/tools/sendWebhook.js.map +1 -0
- package/dist/core/tools/webSearch.d.ts +34 -0
- package/dist/core/tools/webSearch.d.ts.map +1 -0
- package/dist/core/tools/webSearch.js +104 -0
- package/dist/core/tools/webSearch.js.map +1 -0
- package/dist/core/tools/writeFile.d.ts +49 -0
- package/dist/core/tools/writeFile.d.ts.map +1 -0
- package/dist/core/tools/writeFile.js +120 -0
- package/dist/core/tools/writeFile.js.map +1 -0
- package/dist/db/client.d.ts +22 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +178 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.d.ts +1846 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +175 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/errors/index.d.ts +80 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +135 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +172 -0
- package/dist/index.js.map +1 -0
- package/dist/services/initDB.d.ts +17 -0
- package/dist/services/initDB.d.ts.map +1 -0
- package/dist/services/initDB.js +212 -0
- package/dist/services/initDB.js.map +1 -0
- package/dist/types/agent.d.ts +354 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +63 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/client.d.ts +309 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/client.js +2 -0
- package/dist/types/client.js.map +1 -0
- package/dist/types/config.d.ts +96 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +33 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/dag.d.ts +253 -0
- package/dist/types/dag.d.ts.map +1 -0
- package/dist/types/dag.js +46 -0
- package/dist/types/dag.js.map +1 -0
- package/dist/types/execution.d.ts +171 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +41 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/util/cron-validator.d.ts +16 -0
- package/dist/util/cron-validator.d.ts.map +1 -0
- package/dist/util/cron-validator.js +31 -0
- package/dist/util/cron-validator.js.map +1 -0
- package/dist/util/dag-utils.d.ts +54 -0
- package/dist/util/dag-utils.d.ts.map +1 -0
- package/dist/util/dag-utils.js +167 -0
- package/dist/util/dag-utils.js.map +1 -0
- package/dist/util/logger.d.ts +21 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +87 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send Email Tool
|
|
3
|
+
*
|
|
4
|
+
* Send emails via SMTP with optional CC, BCC, and attachments
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import nodemailer from 'nodemailer';
|
|
8
|
+
import { BaseTool } from './base.js';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
const attachmentSchema = z.object({
|
|
11
|
+
filename: z.string().describe('Display name for the attachment'),
|
|
12
|
+
path: z.string().optional().describe('File path to attach (use this OR content, not both)'),
|
|
13
|
+
content: z.string().optional().describe('Base64-encoded content or plain text (use this OR path, not both)'),
|
|
14
|
+
contentType: z.string().optional().describe('MIME type (e.g., "application/pdf", "image/png")'),
|
|
15
|
+
encoding: z.enum(['base64', 'utf-8']).optional().describe('Content encoding if using content field'),
|
|
16
|
+
});
|
|
17
|
+
const sendEmailInputSchema = z.object({
|
|
18
|
+
to: z.string().email().describe('Recipient email address'),
|
|
19
|
+
subject: z.string().describe('Email subject line'),
|
|
20
|
+
body: z.string().describe('Email body content (plain text or HTML)'),
|
|
21
|
+
cc: z.union([
|
|
22
|
+
z.string().email(),
|
|
23
|
+
z.array(z.string().email()),
|
|
24
|
+
]).optional().describe('CC email address(es) - single email or array of emails'),
|
|
25
|
+
bcc: z.union([
|
|
26
|
+
z.string().email(),
|
|
27
|
+
z.array(z.string().email()),
|
|
28
|
+
]).optional().describe('BCC email address(es) - single email or array of emails'),
|
|
29
|
+
html: z.boolean().optional().default(false).describe('Whether body is HTML (default: false)'),
|
|
30
|
+
attachments: z.array(attachmentSchema).optional().describe('File attachments'),
|
|
31
|
+
});
|
|
32
|
+
export class SendEmailTool extends BaseTool {
|
|
33
|
+
name = 'sendEmail';
|
|
34
|
+
description = 'Send an email via SMTP with optional CC, BCC, and attachments. Requires SMTP configuration in environment variables.';
|
|
35
|
+
inputSchema = sendEmailInputSchema;
|
|
36
|
+
transporter = null;
|
|
37
|
+
resolveAttachmentPath(filePath, ctx) {
|
|
38
|
+
const artifactsDir = ctx.artifactsDir || process.env.ARTIFACTS_DIR || './artifacts';
|
|
39
|
+
return path.resolve(artifactsDir, path.basename(filePath));
|
|
40
|
+
}
|
|
41
|
+
getTransporter() {
|
|
42
|
+
if (this.transporter) {
|
|
43
|
+
return this.transporter;
|
|
44
|
+
}
|
|
45
|
+
const smtpHost = process.env.SMTP_HOST;
|
|
46
|
+
const smtpPort = process.env.SMTP_PORT ? parseInt(process.env.SMTP_PORT, 10) : 587;
|
|
47
|
+
const smtpUser = process.env.SMTP_USER;
|
|
48
|
+
const smtpPass = process.env.SMTP_PASS;
|
|
49
|
+
const smtpFrom = process.env.SMTP_FROM;
|
|
50
|
+
if (!smtpHost || !smtpUser || !smtpPass || !smtpFrom) {
|
|
51
|
+
throw new Error('Email configuration missing. Required env vars: SMTP_HOST, SMTP_USER, SMTP_PASS, SMTP_FROM');
|
|
52
|
+
}
|
|
53
|
+
this.transporter = nodemailer.createTransport({
|
|
54
|
+
host: smtpHost,
|
|
55
|
+
port: smtpPort,
|
|
56
|
+
secure: smtpPort === 465,
|
|
57
|
+
auth: {
|
|
58
|
+
user: smtpUser,
|
|
59
|
+
pass: smtpPass,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
return this.transporter;
|
|
63
|
+
}
|
|
64
|
+
normalizeEmailList(emails) {
|
|
65
|
+
if (!emails)
|
|
66
|
+
return undefined;
|
|
67
|
+
if (Array.isArray(emails)) {
|
|
68
|
+
return emails.join(', ');
|
|
69
|
+
}
|
|
70
|
+
return emails;
|
|
71
|
+
}
|
|
72
|
+
async execute(input, ctx) {
|
|
73
|
+
ctx.logger.info(`Sending email to: ${input.to}`);
|
|
74
|
+
try {
|
|
75
|
+
const transporter = this.getTransporter();
|
|
76
|
+
const from = process.env.SMTP_FROM;
|
|
77
|
+
const mailOptions = {
|
|
78
|
+
from,
|
|
79
|
+
to: input.to,
|
|
80
|
+
subject: input.subject,
|
|
81
|
+
};
|
|
82
|
+
if (input.html) {
|
|
83
|
+
mailOptions.html = input.body;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
mailOptions.text = input.body;
|
|
87
|
+
}
|
|
88
|
+
const cc = this.normalizeEmailList(input.cc);
|
|
89
|
+
if (cc) {
|
|
90
|
+
mailOptions.cc = cc;
|
|
91
|
+
}
|
|
92
|
+
const bcc = this.normalizeEmailList(input.bcc);
|
|
93
|
+
if (bcc) {
|
|
94
|
+
mailOptions.bcc = bcc;
|
|
95
|
+
}
|
|
96
|
+
if (input.attachments && input.attachments.length > 0) {
|
|
97
|
+
mailOptions.attachments = input.attachments.map((att) => ({
|
|
98
|
+
filename: att.filename,
|
|
99
|
+
path: att.path ? this.resolveAttachmentPath(att.path, ctx) : undefined,
|
|
100
|
+
content: att.content,
|
|
101
|
+
contentType: att.contentType,
|
|
102
|
+
encoding: att.encoding,
|
|
103
|
+
}));
|
|
104
|
+
ctx.logger.info(`Adding ${input.attachments.length} attachment(s)`);
|
|
105
|
+
}
|
|
106
|
+
const result = await this.retry(async () => {
|
|
107
|
+
return await this.withTimeout(transporter.sendMail(mailOptions), 30000, 'Email send timed out');
|
|
108
|
+
}, 3, 2000);
|
|
109
|
+
ctx.logger.info(`Email sent successfully. Message ID: ${result.messageId}`);
|
|
110
|
+
ctx.emitEvent?.completed?.(`✉️ Email sent`);
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
messageId: result.messageId,
|
|
114
|
+
to: input.to,
|
|
115
|
+
subject: input.subject,
|
|
116
|
+
attachmentCount: input.attachments?.length ?? 0,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
121
|
+
ctx.logger.error({ err: error }, 'Email send failed');
|
|
122
|
+
ctx.emitEvent?.completed?.(`❌ Failed to send email: ${errorMessage}`);
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
to: input.to,
|
|
126
|
+
subject: input.subject,
|
|
127
|
+
error: errorMessage,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=sendEmail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendEmail.js","sourceRoot":"","sources":["../../../src/core/tools/sendEmail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send Webhook Tool
|
|
3
|
+
*
|
|
4
|
+
* Send a POST request with JSON payload to a webhook URL
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { BaseTool, type ToolContext } from './base.js';
|
|
8
|
+
declare const sendWebhookInputSchema: z.ZodObject<{
|
|
9
|
+
url: z.ZodString;
|
|
10
|
+
payload: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
11
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
url: string;
|
|
14
|
+
payload: Record<string, any>;
|
|
15
|
+
headers?: Record<string, string> | undefined;
|
|
16
|
+
}, {
|
|
17
|
+
url: string;
|
|
18
|
+
payload: Record<string, any>;
|
|
19
|
+
headers?: Record<string, string> | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
type SendWebhookInput = z.infer<typeof sendWebhookInputSchema>;
|
|
22
|
+
interface SendWebhookOutput {
|
|
23
|
+
url: string;
|
|
24
|
+
status: number;
|
|
25
|
+
statusText: string;
|
|
26
|
+
success: boolean;
|
|
27
|
+
response?: any;
|
|
28
|
+
}
|
|
29
|
+
export declare class SendWebhookTool extends BaseTool<SendWebhookInput, SendWebhookOutput> {
|
|
30
|
+
name: string;
|
|
31
|
+
description: string;
|
|
32
|
+
inputSchema: z.ZodObject<{
|
|
33
|
+
url: z.ZodString;
|
|
34
|
+
payload: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
35
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
36
|
+
}, "strip", z.ZodTypeAny, {
|
|
37
|
+
url: string;
|
|
38
|
+
payload: Record<string, any>;
|
|
39
|
+
headers?: Record<string, string> | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
url: string;
|
|
42
|
+
payload: Record<string, any>;
|
|
43
|
+
headers?: Record<string, string> | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
execute(input: SendWebhookInput, ctx: ToolContext): Promise<SendWebhookOutput>;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=sendWebhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendWebhook.d.ts","sourceRoot":"","sources":["../../../src/core/tools/sendWebhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEvD,QAAA,MAAM,sBAAsB;;;;;;;;;;;;EAI1B,CAAC;AAEH,KAAK,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/D,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,qBAAa,eAAgB,SAAQ,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAChF,IAAI,SAAiB;IACrB,WAAW,SAA4D;IACvE,WAAW;;;;;;;;;;;;OAA0B;IAE/B,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqDrF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send Webhook Tool
|
|
3
|
+
*
|
|
4
|
+
* Send a POST request with JSON payload to a webhook URL
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { BaseTool } from './base.js';
|
|
8
|
+
const sendWebhookInputSchema = z.object({
|
|
9
|
+
url: z.string().url().describe('Webhook URL to send POST request to'),
|
|
10
|
+
payload: z.record(z.any()).describe('JSON payload to send'),
|
|
11
|
+
headers: z.record(z.string()).optional().describe('Optional custom headers'),
|
|
12
|
+
});
|
|
13
|
+
export class SendWebhookTool extends BaseTool {
|
|
14
|
+
name = 'sendWebhook';
|
|
15
|
+
description = 'Send a POST request with JSON payload to a webhook URL';
|
|
16
|
+
inputSchema = sendWebhookInputSchema;
|
|
17
|
+
async execute(input, ctx) {
|
|
18
|
+
ctx.logger.info(`Sending webhook to: ${input.url}`);
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.retry(async () => {
|
|
21
|
+
return await this.withTimeout(fetch(input.url, {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
'User-Agent': 'DesiAgent/1.0',
|
|
26
|
+
...input.headers,
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify(input.payload),
|
|
29
|
+
signal: ctx.abortSignal,
|
|
30
|
+
}), 10000, 'Webhook request timed out');
|
|
31
|
+
}, 3, 1000);
|
|
32
|
+
const success = response.ok;
|
|
33
|
+
let responseData;
|
|
34
|
+
try {
|
|
35
|
+
const contentType = response.headers.get('content-type');
|
|
36
|
+
if (contentType?.includes('application/json')) {
|
|
37
|
+
responseData = await response.json();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
responseData = await response.text();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
responseData = null;
|
|
45
|
+
}
|
|
46
|
+
ctx.logger.info(`Webhook response: ${response.status} ${response.statusText}`);
|
|
47
|
+
return {
|
|
48
|
+
url: input.url,
|
|
49
|
+
status: response.status,
|
|
50
|
+
statusText: response.statusText,
|
|
51
|
+
success,
|
|
52
|
+
response: responseData,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
ctx.logger.error({ err: error }, 'Webhook send failed');
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=sendWebhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendWebhook.js","sourceRoot":"","sources":["../../../src/core/tools/sendWebhook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAoB,MAAM,WAAW,CAAC;AAEvD,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACrE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CAC7E,CAAC,CAAC;AAYH,MAAM,OAAO,eAAgB,SAAQ,QAA6C;IAChF,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,wDAAwD,CAAC;IACvE,WAAW,GAAG,sBAAsB,CAAC;IAErC,KAAK,CAAC,OAAO,CAAC,KAAuB,EAAE,GAAgB;QACrD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAC/B,KAAK,IAAI,EAAE;gBACT,OAAO,MAAM,IAAI,CAAC,WAAW,CAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;oBACf,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,YAAY,EAAE,eAAe;wBAC7B,GAAG,KAAK,CAAC,OAAO;qBACjB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;oBACnC,MAAM,EAAE,GAAG,CAAC,WAAW;iBACxB,CAAC,EACF,KAAK,EACL,2BAA2B,CAC5B,CAAC;YACJ,CAAC,EACD,CAAC,EACD,IAAI,CACL,CAAC;YAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,YAAiB,CAAC;YAEtB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBACzD,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC9C,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACvC,CAAC;qBAAM,CAAC;oBACN,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACvC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAE/E,OAAO;gBACL,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO;gBACP,QAAQ,EAAE,YAAY;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,qBAAqB,CAAC,CAAC;YACxD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Searches the web using DuckDuckGo HTML search (no API key needed)
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { BaseTool, type ToolContext } from './base.js';
|
|
8
|
+
declare const webSearchInputSchema: z.ZodObject<{
|
|
9
|
+
query: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
|
|
10
|
+
limit: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
query: string | string[];
|
|
13
|
+
limit: number;
|
|
14
|
+
}, {
|
|
15
|
+
query: string | string[];
|
|
16
|
+
limit?: number | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
type WebSearchInput = z.infer<typeof webSearchInputSchema>;
|
|
19
|
+
interface SearchResult {
|
|
20
|
+
title: string;
|
|
21
|
+
url: string;
|
|
22
|
+
snippet: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class WebSearchTool extends BaseTool<any, SearchResult[]> {
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
inputSchema: any;
|
|
28
|
+
execute(input: WebSearchInput, ctx: ToolContext): Promise<SearchResult[]>;
|
|
29
|
+
private extractSearchQueries;
|
|
30
|
+
private parseSearchResults;
|
|
31
|
+
private cleanUrl;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=webSearch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearch.d.ts","sourceRoot":"","sources":["../../../src/core/tools/webSearch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAEvD,QAAA,MAAM,oBAAoB;;;;;;;;;EAGxB,CAAC;AAEH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE3D,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAc,SAAQ,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC;IAC9D,IAAI,SAAe;IACnB,WAAW,SAAqD;IAChE,WAAW,EAAE,GAAG,CAAwB;IAElC,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoC/E,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,QAAQ;CAWjB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Searches the web using DuckDuckGo HTML search (no API key needed)
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import * as cheerio from 'cheerio';
|
|
8
|
+
import { BaseTool } from './base.js';
|
|
9
|
+
const webSearchInputSchema = z.object({
|
|
10
|
+
query: z.union([z.string(), z.array(z.string())]).describe('The search query - string or array of strings'),
|
|
11
|
+
limit: z.number().int().min(1).max(20).default(10).describe('Number of results to return per query'),
|
|
12
|
+
});
|
|
13
|
+
export class WebSearchTool extends BaseTool {
|
|
14
|
+
name = 'webSearch';
|
|
15
|
+
description = 'Search the web for information using DuckDuckGo';
|
|
16
|
+
inputSchema = webSearchInputSchema;
|
|
17
|
+
async execute(input, ctx) {
|
|
18
|
+
const queryString = Array.isArray(input.query) ? input.query.join('\n') : input.query;
|
|
19
|
+
ctx.logger.info(`╰─Searching web...input for ${queryString.slice(0, 50)}...`);
|
|
20
|
+
ctx.emitEvent?.progress?.(`🔎 for ${queryString.slice(0, 50)}...`);
|
|
21
|
+
const queries = this.extractSearchQueries(queryString);
|
|
22
|
+
const allResults = [];
|
|
23
|
+
for (const query of queries) {
|
|
24
|
+
try {
|
|
25
|
+
const response = await this.withTimeout(fetch(`https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`), 10000, 'Web search timed out');
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Search failed with status ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
const html = await response.text();
|
|
30
|
+
const results = this.parseSearchResults(html, input.limit);
|
|
31
|
+
ctx.logger.info(` ╰─Found ${results.length} search results for query: ${query.slice(0, 50)}...`);
|
|
32
|
+
allResults.push(results);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
ctx.logger.error({ err: error, query }, ' ╰─Web search failed');
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
ctx.emitEvent?.progress?.(`🔎 Found ${allResults.flat().length} results`);
|
|
40
|
+
return allResults.flat();
|
|
41
|
+
}
|
|
42
|
+
extractSearchQueries(text) {
|
|
43
|
+
const lines = text.trim().split('\n');
|
|
44
|
+
const queries = lines
|
|
45
|
+
.map((line) => {
|
|
46
|
+
let cleaned = line
|
|
47
|
+
.trim()
|
|
48
|
+
.replace(/^(\d+\.|\*\s*|\-\s*|•\s*)/, '')
|
|
49
|
+
.trim();
|
|
50
|
+
const match = cleaned.match(/"([^"]*)"/);
|
|
51
|
+
if (match) {
|
|
52
|
+
return match[1];
|
|
53
|
+
}
|
|
54
|
+
return cleaned;
|
|
55
|
+
})
|
|
56
|
+
.filter((query) => query.length > 0);
|
|
57
|
+
return queries;
|
|
58
|
+
}
|
|
59
|
+
parseSearchResults(html, limit) {
|
|
60
|
+
const results = [];
|
|
61
|
+
try {
|
|
62
|
+
const $ = cheerio.load(html);
|
|
63
|
+
$('.result').each((_, element) => {
|
|
64
|
+
if (results.length >= limit)
|
|
65
|
+
return;
|
|
66
|
+
const titleLink = $(element).find('.result__a');
|
|
67
|
+
const snippetElem = $(element).find('.result__snippet');
|
|
68
|
+
const href = titleLink.attr('href');
|
|
69
|
+
const title = titleLink.text().trim();
|
|
70
|
+
const snippet = snippetElem.text().trim();
|
|
71
|
+
if (href && title) {
|
|
72
|
+
const url = this.cleanUrl(href);
|
|
73
|
+
if (url) {
|
|
74
|
+
results.push({ title, url, snippet });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// If parsing fails, return fallback
|
|
81
|
+
}
|
|
82
|
+
if (results.length === 0) {
|
|
83
|
+
return [{
|
|
84
|
+
title: 'Search results unavailable',
|
|
85
|
+
url: 'https://duckduckgo.com',
|
|
86
|
+
snippet: 'Web search completed but parsing failed. Consider using a different search method.',
|
|
87
|
+
}];
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
cleanUrl(url) {
|
|
92
|
+
const match = url.match(/uddg=([^&]+)/);
|
|
93
|
+
if (match) {
|
|
94
|
+
try {
|
|
95
|
+
return decodeURIComponent(match[1]);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return url;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=webSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSearch.js","sourceRoot":"","sources":["../../../src/core/tools/webSearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WriteFileTool
|
|
3
|
+
*
|
|
4
|
+
* Writes content to files with overwrite and append modes.
|
|
5
|
+
* Uses bun's fs API.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { BaseTool, type ToolContext } from './base.js';
|
|
9
|
+
declare const writeFileInputSchema: z.ZodObject<{
|
|
10
|
+
path: z.ZodString;
|
|
11
|
+
content: z.ZodString;
|
|
12
|
+
mode: z.ZodDefault<z.ZodEnum<["overwrite", "append"]>>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
path: string;
|
|
15
|
+
content: string;
|
|
16
|
+
mode: "overwrite" | "append";
|
|
17
|
+
}, {
|
|
18
|
+
path: string;
|
|
19
|
+
content: string;
|
|
20
|
+
mode?: "overwrite" | "append" | undefined;
|
|
21
|
+
}>;
|
|
22
|
+
type WriteFileInput = z.infer<typeof writeFileInputSchema>;
|
|
23
|
+
interface WriteFileOutput {
|
|
24
|
+
path: string;
|
|
25
|
+
fullPath: string;
|
|
26
|
+
bytesWritten: number;
|
|
27
|
+
mode: 'overwrite' | 'append';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* WriteFileTool for bun
|
|
31
|
+
* Uses bun's fs API which is compatible with Node.js fs/promises
|
|
32
|
+
*/
|
|
33
|
+
export declare class WriteFileTool extends BaseTool<any, WriteFileOutput> {
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
inputSchema: any;
|
|
37
|
+
private logger;
|
|
38
|
+
private getArtifactsDir;
|
|
39
|
+
/**
|
|
40
|
+
* Strip outermost code fence from markdown
|
|
41
|
+
*/
|
|
42
|
+
private stripOutermostFences;
|
|
43
|
+
/**
|
|
44
|
+
* Execute file write operation
|
|
45
|
+
*/
|
|
46
|
+
execute(input: WriteFileInput, ctx: ToolContext): Promise<WriteFileOutput>;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=writeFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeFile.d.ts","sourceRoot":"","sources":["../../../src/core/tools/writeFile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAMvD,QAAA,MAAM,oBAAoB;;;;;;;;;;;;EAOxB,CAAC;AAEH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE3D,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC;CAC9B;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC/D,IAAI,SAAe;IACnB,WAAW,SAAwD;IACnE,WAAW,EAAE,GAAG,CAAwB;IAExC,OAAO,CAAC,MAAM,CAAe;IAE7B,OAAO,CAAC,eAAe;IAIvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;OAEG;IACG,OAAO,CACX,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,eAAe,CAAC;CAyD5B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WriteFileTool
|
|
3
|
+
*
|
|
4
|
+
* Writes content to files with overwrite and append modes.
|
|
5
|
+
* Uses bun's fs API.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { BaseTool } from './base.js';
|
|
9
|
+
import { writeFile, mkdir, readFile } from 'fs/promises';
|
|
10
|
+
import { dirname, resolve } from 'path';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
12
|
+
import { getLogger } from '../../util/logger.js';
|
|
13
|
+
const writeFileInputSchema = z.object({
|
|
14
|
+
path: z.string().describe('File path relative to artifacts directory'),
|
|
15
|
+
content: z.string().describe('Content to write to the file'),
|
|
16
|
+
mode: z
|
|
17
|
+
.enum(['overwrite', 'append'])
|
|
18
|
+
.default('overwrite')
|
|
19
|
+
.describe('Write mode'),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* WriteFileTool for bun
|
|
23
|
+
* Uses bun's fs API which is compatible with Node.js fs/promises
|
|
24
|
+
*/
|
|
25
|
+
export class WriteFileTool extends BaseTool {
|
|
26
|
+
name = 'writeFile';
|
|
27
|
+
description = 'Write content to a file in the artifacts directory';
|
|
28
|
+
inputSchema = writeFileInputSchema;
|
|
29
|
+
logger = getLogger();
|
|
30
|
+
getArtifactsDir(ctx) {
|
|
31
|
+
return resolve(ctx.artifactsDir || process.env.ARTIFACTS_DIR || './artifacts');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Strip outermost code fence from markdown
|
|
35
|
+
*/
|
|
36
|
+
stripOutermostFences(markdown) {
|
|
37
|
+
if (typeof markdown !== 'string') {
|
|
38
|
+
return markdown;
|
|
39
|
+
}
|
|
40
|
+
const trimmed = markdown.trim();
|
|
41
|
+
if (trimmed.length === 0) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
// Regex to match a fence line: 3+ backticks or tildes
|
|
45
|
+
const fenceRegex = /^([ \t]*)([`~]{3,})[^`\n~]*$/;
|
|
46
|
+
const lines = trimmed.split('\n');
|
|
47
|
+
// Check the first line for opening fence
|
|
48
|
+
const firstLineMatch = lines[0].match(fenceRegex);
|
|
49
|
+
if (!firstLineMatch) {
|
|
50
|
+
return markdown;
|
|
51
|
+
}
|
|
52
|
+
const openingFenceChar = firstLineMatch[2][0];
|
|
53
|
+
const openingFenceLength = firstLineMatch[2].length;
|
|
54
|
+
// Find the closing fence
|
|
55
|
+
let closingIndex = -1;
|
|
56
|
+
for (let i = lines.length - 1; i > 0; i--) {
|
|
57
|
+
const match = lines[i].match(fenceRegex);
|
|
58
|
+
if (match &&
|
|
59
|
+
match[2][0] === openingFenceChar &&
|
|
60
|
+
match[2].length >= openingFenceLength) {
|
|
61
|
+
closingIndex = i;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (closingIndex === -1) {
|
|
66
|
+
return markdown;
|
|
67
|
+
}
|
|
68
|
+
// Extract content between fences
|
|
69
|
+
const contentLines = lines.slice(1, closingIndex);
|
|
70
|
+
return contentLines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute file write operation
|
|
74
|
+
*/
|
|
75
|
+
async execute(input, ctx) {
|
|
76
|
+
const ARTIFACTS_DIR = this.getArtifactsDir(ctx);
|
|
77
|
+
// Security: prevent path traversal
|
|
78
|
+
const fullPath = resolve(ARTIFACTS_DIR, input.path);
|
|
79
|
+
// Ensure path is within artifacts directory
|
|
80
|
+
if (!fullPath.startsWith(ARTIFACTS_DIR)) {
|
|
81
|
+
throw new Error('Invalid path: must be within artifacts directory');
|
|
82
|
+
}
|
|
83
|
+
const safePath = fullPath.substring(ARTIFACTS_DIR.length + 1);
|
|
84
|
+
//this.logger.info(`Writing file: ${safePath}`);
|
|
85
|
+
try {
|
|
86
|
+
// Ensure directory exists
|
|
87
|
+
const dir = dirname(fullPath);
|
|
88
|
+
if (!existsSync(dir)) {
|
|
89
|
+
await mkdir(dir, { recursive: true });
|
|
90
|
+
}
|
|
91
|
+
// Write or append content
|
|
92
|
+
let finalContent = this.stripOutermostFences(input.content);
|
|
93
|
+
if (input.mode === 'append' && existsSync(fullPath)) {
|
|
94
|
+
const existing = await readFile(fullPath, 'utf-8');
|
|
95
|
+
finalContent = existing + finalContent;
|
|
96
|
+
}
|
|
97
|
+
await writeFile(fullPath, finalContent, 'utf-8');
|
|
98
|
+
const bytesWritten = Buffer.byteLength(input.content, 'utf-8');
|
|
99
|
+
//this.logger.info(`Wrote ${bytesWritten} bytes to ${safePath}`);
|
|
100
|
+
if (ctx.onEvent) {
|
|
101
|
+
ctx.onEvent('tool:writeFile:completed', {
|
|
102
|
+
path: safePath,
|
|
103
|
+
bytesWritten,
|
|
104
|
+
mode: input.mode,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
path: safePath,
|
|
109
|
+
fullPath,
|
|
110
|
+
bytesWritten,
|
|
111
|
+
mode: input.mode,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
this.logger.error(`File write failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=writeFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeFile.js","sourceRoot":"","sources":["../../../src/core/tools/writeFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as schema from './schema.js';
|
|
2
|
+
import type { BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';
|
|
3
|
+
export type DrizzleDB = BunSQLiteDatabase<typeof schema>;
|
|
4
|
+
/**
|
|
5
|
+
* Get or create the global database instance
|
|
6
|
+
*/
|
|
7
|
+
export declare function getDatabase(dbPath: string): DrizzleDB;
|
|
8
|
+
/**
|
|
9
|
+
* Close database connection
|
|
10
|
+
*/
|
|
11
|
+
export declare function closeDatabase(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Run database migrations
|
|
14
|
+
* Note: For Phase 2, this is a placeholder.
|
|
15
|
+
* In production, migrations should be managed via drizzle-kit
|
|
16
|
+
*/
|
|
17
|
+
export declare function runMigrations(db: DrizzleDB): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Execute a query with error handling
|
|
20
|
+
*/
|
|
21
|
+
export declare function withDatabase<T>(db: DrizzleDB, operation: (db: DrizzleDB) => Promise<T>): Promise<T>;
|
|
22
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,MAAM,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,MAAM,CAAC,CAAC;AAqIzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAKrD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAapC;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAahE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,SAAS,EACb,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CAYZ"}
|