wave-agent-sdk 0.0.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/README.md +32 -0
- package/dist/agent.d.ts +96 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +286 -0
- package/dist/hooks/executor.d.ts +56 -0
- package/dist/hooks/executor.d.ts.map +1 -0
- package/dist/hooks/executor.js +312 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +14 -0
- package/dist/hooks/manager.d.ts +90 -0
- package/dist/hooks/manager.d.ts.map +1 -0
- package/dist/hooks/manager.js +395 -0
- package/dist/hooks/matcher.d.ts +49 -0
- package/dist/hooks/matcher.d.ts.map +1 -0
- package/dist/hooks/matcher.js +147 -0
- package/dist/hooks/settings.d.ts +46 -0
- package/dist/hooks/settings.d.ts.map +1 -0
- package/dist/hooks/settings.js +100 -0
- package/dist/hooks/types.d.ts +80 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +59 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/managers/aiManager.d.ts +61 -0
- package/dist/managers/aiManager.d.ts.map +1 -0
- package/dist/managers/aiManager.js +415 -0
- package/dist/managers/backgroundBashManager.d.ts +27 -0
- package/dist/managers/backgroundBashManager.d.ts.map +1 -0
- package/dist/managers/backgroundBashManager.js +166 -0
- package/dist/managers/bashManager.d.ts +20 -0
- package/dist/managers/bashManager.d.ts.map +1 -0
- package/dist/managers/bashManager.js +66 -0
- package/dist/managers/mcpManager.d.ts +63 -0
- package/dist/managers/mcpManager.d.ts.map +1 -0
- package/dist/managers/mcpManager.js +378 -0
- package/dist/managers/messageManager.d.ts +85 -0
- package/dist/managers/messageManager.d.ts.map +1 -0
- package/dist/managers/messageManager.js +265 -0
- package/dist/managers/skillManager.d.ts +59 -0
- package/dist/managers/skillManager.d.ts.map +1 -0
- package/dist/managers/skillManager.js +317 -0
- package/dist/managers/slashCommandManager.d.ts +77 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -0
- package/dist/managers/slashCommandManager.js +208 -0
- package/dist/managers/toolManager.d.ts +23 -0
- package/dist/managers/toolManager.d.ts.map +1 -0
- package/dist/managers/toolManager.js +79 -0
- package/dist/services/aiService.d.ts +28 -0
- package/dist/services/aiService.d.ts.map +1 -0
- package/dist/services/aiService.js +180 -0
- package/dist/services/memory.d.ts +8 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +128 -0
- package/dist/services/session.d.ts +54 -0
- package/dist/services/session.d.ts.map +1 -0
- package/dist/services/session.js +196 -0
- package/dist/tools/bashTool.d.ts +14 -0
- package/dist/tools/bashTool.d.ts.map +1 -0
- package/dist/tools/bashTool.js +351 -0
- package/dist/tools/deleteFileTool.d.ts +6 -0
- package/dist/tools/deleteFileTool.d.ts.map +1 -0
- package/dist/tools/deleteFileTool.js +67 -0
- package/dist/tools/editTool.d.ts +6 -0
- package/dist/tools/editTool.d.ts.map +1 -0
- package/dist/tools/editTool.js +168 -0
- package/dist/tools/globTool.d.ts +6 -0
- package/dist/tools/globTool.d.ts.map +1 -0
- package/dist/tools/globTool.js +113 -0
- package/dist/tools/grepTool.d.ts +6 -0
- package/dist/tools/grepTool.d.ts.map +1 -0
- package/dist/tools/grepTool.js +268 -0
- package/dist/tools/lsTool.d.ts +6 -0
- package/dist/tools/lsTool.d.ts.map +1 -0
- package/dist/tools/lsTool.js +160 -0
- package/dist/tools/multiEditTool.d.ts +6 -0
- package/dist/tools/multiEditTool.d.ts.map +1 -0
- package/dist/tools/multiEditTool.js +222 -0
- package/dist/tools/readTool.d.ts +6 -0
- package/dist/tools/readTool.d.ts.map +1 -0
- package/dist/tools/readTool.js +136 -0
- package/dist/tools/types.d.ts +35 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +4 -0
- package/dist/tools/writeTool.d.ts +6 -0
- package/dist/tools/writeTool.d.ts.map +1 -0
- package/dist/tools/writeTool.js +138 -0
- package/dist/types.d.ts +212 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/utils/bashHistory.d.ts +46 -0
- package/dist/utils/bashHistory.d.ts.map +1 -0
- package/dist/utils/bashHistory.js +236 -0
- package/dist/utils/commandArgumentParser.d.ts +34 -0
- package/dist/utils/commandArgumentParser.d.ts.map +1 -0
- package/dist/utils/commandArgumentParser.js +123 -0
- package/dist/utils/constants.d.ts +27 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +28 -0
- package/dist/utils/convertMessagesForAPI.d.ts +9 -0
- package/dist/utils/convertMessagesForAPI.d.ts.map +1 -0
- package/dist/utils/convertMessagesForAPI.js +189 -0
- package/dist/utils/customCommands.d.ts +14 -0
- package/dist/utils/customCommands.d.ts.map +1 -0
- package/dist/utils/customCommands.js +71 -0
- package/dist/utils/fileFilter.d.ts +26 -0
- package/dist/utils/fileFilter.d.ts.map +1 -0
- package/dist/utils/fileFilter.js +177 -0
- package/dist/utils/markdownParser.d.ts +27 -0
- package/dist/utils/markdownParser.d.ts.map +1 -0
- package/dist/utils/markdownParser.js +109 -0
- package/dist/utils/mcpUtils.d.ts +24 -0
- package/dist/utils/mcpUtils.d.ts.map +1 -0
- package/dist/utils/mcpUtils.js +51 -0
- package/dist/utils/messageOperations.d.ts +118 -0
- package/dist/utils/messageOperations.d.ts.map +1 -0
- package/dist/utils/messageOperations.js +334 -0
- package/dist/utils/path.d.ts +25 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +109 -0
- package/dist/utils/skillParser.d.ts +18 -0
- package/dist/utils/skillParser.d.ts.map +1 -0
- package/dist/utils/skillParser.js +147 -0
- package/dist/utils/stringUtils.d.ts +13 -0
- package/dist/utils/stringUtils.d.ts.map +1 -0
- package/dist/utils/stringUtils.js +44 -0
- package/package.json +51 -0
- package/src/agent.ts +405 -0
- package/src/hooks/executor.ts +440 -0
- package/src/hooks/index.ts +52 -0
- package/src/hooks/manager.ts +618 -0
- package/src/hooks/matcher.ts +187 -0
- package/src/hooks/settings.ts +129 -0
- package/src/hooks/types.ts +169 -0
- package/src/index.ts +24 -0
- package/src/managers/aiManager.ts +573 -0
- package/src/managers/backgroundBashManager.ts +203 -0
- package/src/managers/bashManager.ts +97 -0
- package/src/managers/mcpManager.ts +493 -0
- package/src/managers/messageManager.ts +415 -0
- package/src/managers/skillManager.ts +404 -0
- package/src/managers/slashCommandManager.ts +293 -0
- package/src/managers/toolManager.ts +106 -0
- package/src/services/aiService.ts +252 -0
- package/src/services/memory.ts +149 -0
- package/src/services/session.ts +265 -0
- package/src/tools/bashTool.ts +402 -0
- package/src/tools/deleteFileTool.ts +81 -0
- package/src/tools/editTool.ts +192 -0
- package/src/tools/globTool.ts +135 -0
- package/src/tools/grepTool.ts +326 -0
- package/src/tools/lsTool.ts +187 -0
- package/src/tools/multiEditTool.ts +268 -0
- package/src/tools/readTool.ts +165 -0
- package/src/tools/types.ts +47 -0
- package/src/tools/writeTool.ts +163 -0
- package/src/types.ts +260 -0
- package/src/utils/bashHistory.ts +303 -0
- package/src/utils/commandArgumentParser.ts +153 -0
- package/src/utils/constants.ts +37 -0
- package/src/utils/convertMessagesForAPI.ts +236 -0
- package/src/utils/customCommands.ts +85 -0
- package/src/utils/fileFilter.ts +202 -0
- package/src/utils/markdownParser.ts +156 -0
- package/src/utils/mcpUtils.ts +81 -0
- package/src/utils/messageOperations.ts +506 -0
- package/src/utils/path.ts +118 -0
- package/src/utils/skillParser.ts +188 -0
- package/src/utils/stringUtils.ts +50 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import type { CustomSlashCommandConfig } from "../types.js";
|
|
3
|
+
|
|
4
|
+
interface ParsedMarkdownFile {
|
|
5
|
+
content: string;
|
|
6
|
+
config?: CustomSlashCommandConfig;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Parse YAML frontmatter from markdown content
|
|
11
|
+
*/
|
|
12
|
+
function parseFrontmatter(content: string): {
|
|
13
|
+
frontmatter?: Record<string, unknown>;
|
|
14
|
+
content: string;
|
|
15
|
+
} {
|
|
16
|
+
const frontmatterRegex = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;
|
|
17
|
+
const match = content.match(frontmatterRegex);
|
|
18
|
+
|
|
19
|
+
if (!match) {
|
|
20
|
+
return { content };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const [, frontmatterStr, bodyContent] = match;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
// Simple YAML parser for our use case (only supports key: value pairs)
|
|
27
|
+
const frontmatter: Record<string, unknown> = {};
|
|
28
|
+
const lines = frontmatterStr.split("\n");
|
|
29
|
+
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
const trimmedLine = line.trim();
|
|
32
|
+
if (!trimmedLine || trimmedLine.startsWith("#")) continue;
|
|
33
|
+
|
|
34
|
+
const colonIndex = trimmedLine.indexOf(":");
|
|
35
|
+
if (colonIndex === -1) continue;
|
|
36
|
+
|
|
37
|
+
const key = trimmedLine.slice(0, colonIndex).trim();
|
|
38
|
+
const value = trimmedLine.slice(colonIndex + 1).trim();
|
|
39
|
+
|
|
40
|
+
// Handle array values for allowed-tools
|
|
41
|
+
if (key === "allowed-tools" && value) {
|
|
42
|
+
// Simple array parsing: "tool1, tool2, tool3" or "[tool1, tool2]"
|
|
43
|
+
let arrayValue = value;
|
|
44
|
+
if (arrayValue.startsWith("[") && arrayValue.endsWith("]")) {
|
|
45
|
+
arrayValue = arrayValue.slice(1, -1);
|
|
46
|
+
}
|
|
47
|
+
frontmatter[key] = arrayValue
|
|
48
|
+
.split(",")
|
|
49
|
+
.map((s) => s.trim())
|
|
50
|
+
.filter(Boolean);
|
|
51
|
+
} else if (value) {
|
|
52
|
+
frontmatter[key] = value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return { frontmatter, content: bodyContent };
|
|
57
|
+
} catch {
|
|
58
|
+
// If parsing fails, just return the content without frontmatter
|
|
59
|
+
return { content };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Parse markdown file and extract config and content
|
|
65
|
+
*/
|
|
66
|
+
export function parseMarkdownFile(filePath: string): ParsedMarkdownFile {
|
|
67
|
+
try {
|
|
68
|
+
const fileContent = readFileSync(filePath, "utf-8");
|
|
69
|
+
const { frontmatter, content } = parseFrontmatter(fileContent);
|
|
70
|
+
|
|
71
|
+
let config: CustomSlashCommandConfig | undefined;
|
|
72
|
+
|
|
73
|
+
if (frontmatter) {
|
|
74
|
+
config = {};
|
|
75
|
+
|
|
76
|
+
if (
|
|
77
|
+
frontmatter["allowed-tools"] &&
|
|
78
|
+
Array.isArray(frontmatter["allowed-tools"])
|
|
79
|
+
) {
|
|
80
|
+
config.allowedTools = frontmatter["allowed-tools"] as string[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (frontmatter.model && typeof frontmatter.model === "string") {
|
|
84
|
+
config.model = frontmatter.model;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (
|
|
88
|
+
frontmatter.description &&
|
|
89
|
+
typeof frontmatter.description === "string"
|
|
90
|
+
) {
|
|
91
|
+
config.description = frontmatter.description;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
content: content.trim(),
|
|
97
|
+
config,
|
|
98
|
+
};
|
|
99
|
+
} catch (error) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`Failed to parse markdown file ${filePath}: ${error instanceof Error ? error.message : String(error)}`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Parse and execute bash commands in markdown content
|
|
108
|
+
*/
|
|
109
|
+
export interface BashCommandResult {
|
|
110
|
+
command: string;
|
|
111
|
+
output: string;
|
|
112
|
+
exitCode: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function parseBashCommands(content: string): {
|
|
116
|
+
commands: string[];
|
|
117
|
+
processedContent: string;
|
|
118
|
+
} {
|
|
119
|
+
const bashCommandRegex = /!`([^`]+)`/g;
|
|
120
|
+
const commands: string[] = [];
|
|
121
|
+
let match;
|
|
122
|
+
|
|
123
|
+
// Extract all bash commands
|
|
124
|
+
while ((match = bashCommandRegex.exec(content)) !== null) {
|
|
125
|
+
commands.push(match[1]);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// For now, return the content as-is. The actual command execution
|
|
129
|
+
// will be handled by the slash command manager
|
|
130
|
+
return {
|
|
131
|
+
commands,
|
|
132
|
+
processedContent: content,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Replace bash command placeholders with their outputs
|
|
138
|
+
*/
|
|
139
|
+
export function replaceBashCommandsWithOutput(
|
|
140
|
+
content: string,
|
|
141
|
+
results: BashCommandResult[],
|
|
142
|
+
): string {
|
|
143
|
+
const bashCommandRegex = /!`([^`]+)`/g;
|
|
144
|
+
let processedContent = content;
|
|
145
|
+
let commandIndex = 0;
|
|
146
|
+
|
|
147
|
+
processedContent = processedContent.replace(bashCommandRegex, (match) => {
|
|
148
|
+
if (commandIndex < results.length) {
|
|
149
|
+
const result = results[commandIndex++];
|
|
150
|
+
return `\`\`\`\n$ ${result.command}\n${result.output}\n\`\`\``;
|
|
151
|
+
}
|
|
152
|
+
return match;
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return processedContent;
|
|
156
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { ChatCompletionFunctionTool } from "openai/resources.js";
|
|
2
|
+
import type { ToolPlugin, ToolResult, ToolContext } from "../tools/types.js";
|
|
3
|
+
import type { McpTool, McpServerStatus } from "../types.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Convert MCP tool to OpenAI function tool format
|
|
7
|
+
*/
|
|
8
|
+
export function mcpToolToOpenAITool(
|
|
9
|
+
mcpTool: McpTool,
|
|
10
|
+
serverName: string,
|
|
11
|
+
): ChatCompletionFunctionTool {
|
|
12
|
+
// Remove $schema field if it exists, as OpenAI API doesn't accept it
|
|
13
|
+
const cleanInputSchema = { ...mcpTool.inputSchema };
|
|
14
|
+
delete cleanInputSchema.$schema;
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
type: "function",
|
|
18
|
+
function: {
|
|
19
|
+
name: mcpTool.name,
|
|
20
|
+
description: `${mcpTool.description || `Tool from MCP server ${serverName}`} (MCP: ${serverName})`,
|
|
21
|
+
parameters: cleanInputSchema,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Create a tool plugin wrapper for an MCP tool
|
|
28
|
+
*/
|
|
29
|
+
export function createMcpToolPlugin(
|
|
30
|
+
mcpTool: McpTool,
|
|
31
|
+
serverName: string,
|
|
32
|
+
executeTool: (
|
|
33
|
+
name: string,
|
|
34
|
+
args: Record<string, unknown>,
|
|
35
|
+
) => Promise<{
|
|
36
|
+
success: boolean;
|
|
37
|
+
content: string;
|
|
38
|
+
serverName?: string;
|
|
39
|
+
images?: Array<{ data: string; mediaType?: string }>;
|
|
40
|
+
}>,
|
|
41
|
+
): ToolPlugin {
|
|
42
|
+
return {
|
|
43
|
+
name: mcpTool.name,
|
|
44
|
+
config: mcpToolToOpenAITool(mcpTool, serverName),
|
|
45
|
+
async execute(
|
|
46
|
+
args: Record<string, unknown>,
|
|
47
|
+
context?: ToolContext,
|
|
48
|
+
): Promise<ToolResult> {
|
|
49
|
+
try {
|
|
50
|
+
// Context is available for future use when MCP tools need execution context
|
|
51
|
+
if (context) {
|
|
52
|
+
// Future: Could pass working directory or other context to MCP tools
|
|
53
|
+
}
|
|
54
|
+
const result = await executeTool(mcpTool.name, args);
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
content: result.content || `Executed ${mcpTool.name}`,
|
|
58
|
+
};
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
content: "",
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Find which server a tool belongs to
|
|
72
|
+
*/
|
|
73
|
+
export function findToolServer(
|
|
74
|
+
toolName: string,
|
|
75
|
+
servers: McpServerStatus[],
|
|
76
|
+
): McpServerStatus | undefined {
|
|
77
|
+
return servers.find(
|
|
78
|
+
(s) =>
|
|
79
|
+
s.status === "connected" && s.tools?.some((t) => t.name === toolName),
|
|
80
|
+
);
|
|
81
|
+
}
|