@zhijiewang/openharness 0.11.0 → 0.11.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 +4 -0
- package/dist/renderer/index.d.ts +2 -0
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +26 -16
- package/dist/renderer/index.js.map +1 -1
- package/dist/repl.d.ts.map +1 -1
- package/dist/repl.js +69 -15
- package/dist/repl.js.map +1 -1
- package/dist/tools/CronTool/index.d.ts +40 -0
- package/dist/tools/CronTool/index.d.ts.map +1 -0
- package/dist/tools/CronTool/index.js +59 -0
- package/dist/tools/CronTool/index.js.map +1 -0
- package/dist/tools/EnterWorktreeTool/index.d.ts +12 -0
- package/dist/tools/EnterWorktreeTool/index.d.ts.map +1 -0
- package/dist/tools/EnterWorktreeTool/index.js +27 -0
- package/dist/tools/EnterWorktreeTool/index.js.map +1 -0
- package/dist/tools/ExitWorktreeTool/index.d.ts +15 -0
- package/dist/tools/ExitWorktreeTool/index.d.ts.map +1 -0
- package/dist/tools/ExitWorktreeTool/index.js +33 -0
- package/dist/tools/ExitWorktreeTool/index.js.map +1 -0
- package/dist/tools/KillProcessTool/index.d.ts +18 -0
- package/dist/tools/KillProcessTool/index.d.ts.map +1 -0
- package/dist/tools/KillProcessTool/index.js +43 -0
- package/dist/tools/KillProcessTool/index.js.map +1 -0
- package/dist/tools/MemoryTool/index.d.ts +30 -0
- package/dist/tools/MemoryTool/index.d.ts.map +1 -0
- package/dist/tools/MemoryTool/index.js +56 -0
- package/dist/tools/MemoryTool/index.js.map +1 -0
- package/dist/tools/MultiEditTool/index.d.ts +32 -0
- package/dist/tools/MultiEditTool/index.d.ts.map +1 -0
- package/dist/tools/MultiEditTool/index.js +53 -0
- package/dist/tools/MultiEditTool/index.js.map +1 -0
- package/dist/tools/RemoteTriggerTool/index.d.ts +21 -0
- package/dist/tools/RemoteTriggerTool/index.d.ts.map +1 -0
- package/dist/tools/RemoteTriggerTool/index.js +43 -0
- package/dist/tools/RemoteTriggerTool/index.js.map +1 -0
- package/dist/tools/SendMessageTool/index.d.ts +18 -0
- package/dist/tools/SendMessageTool/index.d.ts.map +1 -0
- package/dist/tools/SendMessageTool/index.js +29 -0
- package/dist/tools/SendMessageTool/index.js.map +1 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +32 -0
- package/dist/tools.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createWorktree, isGitRepo } from "../../git/index.js";
|
|
3
|
+
const inputSchema = z.object({
|
|
4
|
+
branch: z.string().optional().describe("Branch name for the worktree (auto-generated if omitted)"),
|
|
5
|
+
});
|
|
6
|
+
export const EnterWorktreeTool = {
|
|
7
|
+
name: "EnterWorktree",
|
|
8
|
+
description: "Create an isolated git worktree for safe experimentation. Changes won't affect the main working directory.",
|
|
9
|
+
inputSchema,
|
|
10
|
+
riskLevel: "medium",
|
|
11
|
+
isReadOnly() { return false; },
|
|
12
|
+
isConcurrencySafe() { return false; },
|
|
13
|
+
async call(input, context) {
|
|
14
|
+
if (!isGitRepo(context.workingDir)) {
|
|
15
|
+
return { output: "Not a git repository — worktrees require git.", isError: true };
|
|
16
|
+
}
|
|
17
|
+
const path = createWorktree(context.workingDir);
|
|
18
|
+
if (!path) {
|
|
19
|
+
return { output: "Failed to create worktree.", isError: true };
|
|
20
|
+
}
|
|
21
|
+
return { output: `Worktree created at: ${path}\nUse ExitWorktree to clean up when done.`, isError: false };
|
|
22
|
+
},
|
|
23
|
+
prompt() {
|
|
24
|
+
return "EnterWorktree: Create an isolated git worktree for safe code changes.";
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/EnterWorktreeTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;CACnG,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,4GAA4G;IACzH,WAAW;IACX,SAAS,EAAE,QAAQ;IACnB,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,iBAAiB,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAErC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAoB;QACpC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,MAAM,EAAE,+CAA+C,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpF,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,EAAE,4BAA4B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,wBAAwB,IAAI,2CAA2C,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7G,CAAC;IAED,MAAM;QACJ,OAAO,uEAAuE,CAAC;IACjF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
path: z.ZodString;
|
|
5
|
+
force: z.ZodOptional<z.ZodBoolean>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
path: string;
|
|
8
|
+
force?: boolean | undefined;
|
|
9
|
+
}, {
|
|
10
|
+
path: string;
|
|
11
|
+
force?: boolean | undefined;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const ExitWorktreeTool: Tool<typeof inputSchema>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/ExitWorktreeTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,eAAe,CAAC;AAGnE,QAAA,MAAM,WAAW;;;;;;;;;EAGf,CAAC;AAEH,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,OAAO,WAAW,CA0BrD,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { removeWorktree, hasWorktreeChanges } from "../../git/index.js";
|
|
3
|
+
const inputSchema = z.object({
|
|
4
|
+
path: z.string().describe("Path to the worktree to remove"),
|
|
5
|
+
force: z.boolean().optional().describe("Force removal even with uncommitted changes"),
|
|
6
|
+
});
|
|
7
|
+
export const ExitWorktreeTool = {
|
|
8
|
+
name: "ExitWorktree",
|
|
9
|
+
description: "Remove a git worktree. Warns if there are uncommitted changes unless force is true.",
|
|
10
|
+
inputSchema,
|
|
11
|
+
riskLevel: "medium",
|
|
12
|
+
isReadOnly() { return false; },
|
|
13
|
+
isConcurrencySafe() { return false; },
|
|
14
|
+
async call(input) {
|
|
15
|
+
if (!input.force && hasWorktreeChanges(input.path)) {
|
|
16
|
+
return {
|
|
17
|
+
output: `Worktree at ${input.path} has uncommitted changes. Use force: true to remove anyway.`,
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
removeWorktree(input.path);
|
|
23
|
+
return { output: `Worktree removed: ${input.path}`, isError: false };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return { output: `Failed to remove worktree: ${err instanceof Error ? err.message : String(err)}`, isError: true };
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
prompt() {
|
|
30
|
+
return "ExitWorktree: Remove a git worktree created by EnterWorktree.";
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/ExitWorktreeTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC3D,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACtF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,qFAAqF;IAClG,WAAW;IACX,SAAS,EAAE,QAAQ;IACnB,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,iBAAiB,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAErC,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO;gBACL,MAAM,EAAE,eAAe,KAAK,CAAC,IAAI,6DAA6D;gBAC9F,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,EAAE,MAAM,EAAE,qBAAqB,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACrH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,+DAA+D,CAAC;IACzE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
name: z.ZodOptional<z.ZodString>;
|
|
6
|
+
signal: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
name?: string | undefined;
|
|
9
|
+
pid?: number | undefined;
|
|
10
|
+
signal?: string | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
name?: string | undefined;
|
|
13
|
+
pid?: number | undefined;
|
|
14
|
+
signal?: string | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const KillProcessTool: Tool<typeof inputSchema>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/KillProcessTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AAEtD,QAAA,MAAM,WAAW;;;;;;;;;;;;EAIf,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,OAAO,WAAW,CAuCpD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const inputSchema = z.object({
|
|
3
|
+
pid: z.number().optional().describe("Process ID to kill"),
|
|
4
|
+
name: z.string().optional().describe("Process name to kill (uses pkill/taskkill)"),
|
|
5
|
+
signal: z.string().optional().describe("Signal to send (default: SIGTERM)"),
|
|
6
|
+
});
|
|
7
|
+
export const KillProcessTool = {
|
|
8
|
+
name: "KillProcess",
|
|
9
|
+
description: "Kill a running process by PID or name. Use for stopping background tasks or stuck processes.",
|
|
10
|
+
inputSchema,
|
|
11
|
+
riskLevel: "high",
|
|
12
|
+
isReadOnly() { return false; },
|
|
13
|
+
isConcurrencySafe() { return true; },
|
|
14
|
+
async call(input) {
|
|
15
|
+
if (!input.pid && !input.name) {
|
|
16
|
+
return { output: "Provide either pid or name.", isError: true };
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
if (input.pid) {
|
|
20
|
+
const signal = input.signal ?? 'SIGTERM';
|
|
21
|
+
process.kill(input.pid, signal);
|
|
22
|
+
return { output: `Sent ${signal} to PID ${input.pid}`, isError: false };
|
|
23
|
+
}
|
|
24
|
+
if (input.name) {
|
|
25
|
+
const { execSync } = await import('node:child_process');
|
|
26
|
+
const isWin = process.platform === 'win32';
|
|
27
|
+
const cmd = isWin
|
|
28
|
+
? `taskkill /IM "${input.name}" /F`
|
|
29
|
+
: `pkill ${input.signal ? `-${input.signal}` : ''} "${input.name}"`;
|
|
30
|
+
const result = execSync(cmd, { encoding: 'utf-8', timeout: 5000 });
|
|
31
|
+
return { output: result || `Killed process: ${input.name}`, isError: false };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
return { output: `Failed: ${err instanceof Error ? err.message : String(err)}`, isError: true };
|
|
36
|
+
}
|
|
37
|
+
return { output: "No process specified.", isError: true };
|
|
38
|
+
},
|
|
39
|
+
prompt() {
|
|
40
|
+
return "KillProcess: Stop a running process by PID or name.";
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/KillProcessTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAClF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC5E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,8FAA8F;IAC3G,WAAW;IACX,SAAS,EAAE,MAAM;IACjB,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,iBAAiB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAwB,CAAC,CAAC;gBAClD,OAAO,EAAE,MAAM,EAAE,QAAQ,MAAM,WAAW,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1E,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;gBACxD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;gBAC3C,MAAM,GAAG,GAAG,KAAK;oBACf,CAAC,CAAC,iBAAiB,KAAK,CAAC,IAAI,MAAM;oBACnC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC;gBACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,mBAAmB,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC/E,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAClG,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM;QACJ,OAAO,qDAAqD,CAAC;IAC/D,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
action: z.ZodEnum<["save", "list", "search"]>;
|
|
5
|
+
name: z.ZodOptional<z.ZodString>;
|
|
6
|
+
type: z.ZodOptional<z.ZodEnum<["convention", "preference", "project", "debugging"]>>;
|
|
7
|
+
description: z.ZodOptional<z.ZodString>;
|
|
8
|
+
content: z.ZodOptional<z.ZodString>;
|
|
9
|
+
query: z.ZodOptional<z.ZodString>;
|
|
10
|
+
global: z.ZodOptional<z.ZodBoolean>;
|
|
11
|
+
}, "strip", z.ZodTypeAny, {
|
|
12
|
+
action: "search" | "list" | "save";
|
|
13
|
+
content?: string | undefined;
|
|
14
|
+
type?: "convention" | "preference" | "project" | "debugging" | undefined;
|
|
15
|
+
global?: boolean | undefined;
|
|
16
|
+
name?: string | undefined;
|
|
17
|
+
description?: string | undefined;
|
|
18
|
+
query?: string | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
action: "search" | "list" | "save";
|
|
21
|
+
content?: string | undefined;
|
|
22
|
+
type?: "convention" | "preference" | "project" | "debugging" | undefined;
|
|
23
|
+
global?: boolean | undefined;
|
|
24
|
+
name?: string | undefined;
|
|
25
|
+
description?: string | undefined;
|
|
26
|
+
query?: string | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const MemoryTool: Tool<typeof inputSchema>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/MemoryTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AAGtD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;EAQf,CAAC;AAEH,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,OAAO,WAAW,CAsD/C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { saveMemory, loadActiveMemories, touchMemory } from "../../harness/memory.js";
|
|
3
|
+
const inputSchema = z.object({
|
|
4
|
+
action: z.enum(["save", "list", "search"]),
|
|
5
|
+
name: z.string().optional().describe("Memory name (for save)"),
|
|
6
|
+
type: z.enum(["convention", "preference", "project", "debugging"]).optional(),
|
|
7
|
+
description: z.string().optional(),
|
|
8
|
+
content: z.string().optional().describe("Memory content (for save)"),
|
|
9
|
+
query: z.string().optional().describe("Search query (for search)"),
|
|
10
|
+
global: z.boolean().optional().describe("Save to global memory instead of project"),
|
|
11
|
+
});
|
|
12
|
+
export const MemoryTool = {
|
|
13
|
+
name: "Memory",
|
|
14
|
+
description: "Save, list, or search persistent memories that survive across sessions.",
|
|
15
|
+
inputSchema,
|
|
16
|
+
riskLevel: "low",
|
|
17
|
+
isReadOnly(input) { return input.action !== 'save'; },
|
|
18
|
+
isConcurrencySafe() { return true; },
|
|
19
|
+
async call(input) {
|
|
20
|
+
if (input.action === 'save') {
|
|
21
|
+
if (!input.name || !input.content) {
|
|
22
|
+
return { output: "name and content required for save.", isError: true };
|
|
23
|
+
}
|
|
24
|
+
const path = saveMemory(input.name, input.type ?? 'convention', input.description ?? input.name, input.content, input.global);
|
|
25
|
+
return { output: `Memory saved: ${path}`, isError: false };
|
|
26
|
+
}
|
|
27
|
+
if (input.action === 'list') {
|
|
28
|
+
const memories = loadActiveMemories();
|
|
29
|
+
if (memories.length === 0)
|
|
30
|
+
return { output: "No memories saved.", isError: false };
|
|
31
|
+
const lines = memories.map(m => `[${m.type}] ${m.name} (relevance: ${(m.relevance ?? 0.5).toFixed(1)}) — ${m.description}`);
|
|
32
|
+
return { output: lines.join('\n'), isError: false };
|
|
33
|
+
}
|
|
34
|
+
if (input.action === 'search') {
|
|
35
|
+
if (!input.query)
|
|
36
|
+
return { output: "query required for search.", isError: true };
|
|
37
|
+
const memories = loadActiveMemories();
|
|
38
|
+
const q = input.query.toLowerCase();
|
|
39
|
+
const matches = memories.filter(m => m.name.toLowerCase().includes(q) ||
|
|
40
|
+
m.content.toLowerCase().includes(q) ||
|
|
41
|
+
m.description.toLowerCase().includes(q));
|
|
42
|
+
if (matches.length === 0)
|
|
43
|
+
return { output: `No memories matching "${input.query}".`, isError: false };
|
|
44
|
+
// Touch accessed memories to boost relevance
|
|
45
|
+
for (const m of matches)
|
|
46
|
+
touchMemory(m);
|
|
47
|
+
const lines = matches.map(m => `[${m.type}] ${m.name}: ${m.content.slice(0, 200)}`);
|
|
48
|
+
return { output: lines.join('\n\n'), isError: false };
|
|
49
|
+
}
|
|
50
|
+
return { output: "Unknown action.", isError: true };
|
|
51
|
+
},
|
|
52
|
+
prompt() {
|
|
53
|
+
return "Memory: Save/list/search persistent memories across sessions. Actions: save, list, search.";
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/MemoryTool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
edits: z.ZodArray<z.ZodObject<{
|
|
5
|
+
file_path: z.ZodString;
|
|
6
|
+
old_string: z.ZodString;
|
|
7
|
+
new_string: z.ZodString;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
file_path: string;
|
|
10
|
+
old_string: string;
|
|
11
|
+
new_string: string;
|
|
12
|
+
}, {
|
|
13
|
+
file_path: string;
|
|
14
|
+
old_string: string;
|
|
15
|
+
new_string: string;
|
|
16
|
+
}>, "many">;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
edits: {
|
|
19
|
+
file_path: string;
|
|
20
|
+
old_string: string;
|
|
21
|
+
new_string: string;
|
|
22
|
+
}[];
|
|
23
|
+
}, {
|
|
24
|
+
edits: {
|
|
25
|
+
file_path: string;
|
|
26
|
+
old_string: string;
|
|
27
|
+
new_string: string;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
30
|
+
export declare const MultiEditTool: Tool<typeof inputSchema>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/MultiEditTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AAStD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;EAEf,CAAC;AAEH,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,OAAO,WAAW,CA8ClD,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
3
|
+
const editSchema = z.object({
|
|
4
|
+
file_path: z.string(),
|
|
5
|
+
old_string: z.string(),
|
|
6
|
+
new_string: z.string(),
|
|
7
|
+
});
|
|
8
|
+
const inputSchema = z.object({
|
|
9
|
+
edits: z.array(editSchema).describe("Array of edits to apply atomically"),
|
|
10
|
+
});
|
|
11
|
+
export const MultiEditTool = {
|
|
12
|
+
name: "MultiEdit",
|
|
13
|
+
description: "Apply multiple file edits atomically. All edits succeed or none do. Useful for coordinated changes across files.",
|
|
14
|
+
inputSchema,
|
|
15
|
+
riskLevel: "medium",
|
|
16
|
+
isReadOnly() { return false; },
|
|
17
|
+
isConcurrencySafe() { return false; },
|
|
18
|
+
async call(input) {
|
|
19
|
+
// Phase 1: Validate all edits can be applied
|
|
20
|
+
const originals = new Map();
|
|
21
|
+
const modified = new Map();
|
|
22
|
+
for (const edit of input.edits) {
|
|
23
|
+
if (!existsSync(edit.file_path)) {
|
|
24
|
+
return { output: `File not found: ${edit.file_path}`, isError: true };
|
|
25
|
+
}
|
|
26
|
+
if (!originals.has(edit.file_path)) {
|
|
27
|
+
originals.set(edit.file_path, readFileSync(edit.file_path, 'utf-8'));
|
|
28
|
+
}
|
|
29
|
+
const current = modified.get(edit.file_path) ?? originals.get(edit.file_path);
|
|
30
|
+
if (!current.includes(edit.old_string)) {
|
|
31
|
+
return {
|
|
32
|
+
output: `old_string not found in ${edit.file_path}: "${edit.old_string.slice(0, 80)}"`,
|
|
33
|
+
isError: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
modified.set(edit.file_path, current.replace(edit.old_string, edit.new_string));
|
|
37
|
+
}
|
|
38
|
+
// Phase 2: Apply all edits
|
|
39
|
+
const results = [];
|
|
40
|
+
for (const [path, content] of modified) {
|
|
41
|
+
writeFileSync(path, content);
|
|
42
|
+
results.push(path);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
output: `Applied ${input.edits.length} edit(s) across ${results.length} file(s): ${results.join(', ')}`,
|
|
46
|
+
isError: false,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
prompt() {
|
|
50
|
+
return "MultiEdit: Apply multiple file edits atomically. All succeed or none do.";
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/MultiEditTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CAC1E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAA6B;IACrD,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,kHAAkH;IAC/H,WAAW;IACX,SAAS,EAAE,QAAQ;IACnB,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,iBAAiB,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAErC,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,6CAA6C;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,MAAM,EAAE,mBAAmB,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAE,CAAC;YAC/E,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,OAAO;oBACL,MAAM,EAAE,2BAA2B,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG;oBACtF,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,OAAO;YACL,MAAM,EAAE,WAAW,KAAK,CAAC,KAAK,CAAC,MAAM,mBAAmB,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACvG,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,0EAA0E,CAAC;IACpF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
url: z.ZodString;
|
|
5
|
+
method: z.ZodOptional<z.ZodEnum<["GET", "POST", "PUT", "DELETE"]>>;
|
|
6
|
+
body: z.ZodOptional<z.ZodString>;
|
|
7
|
+
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
url: string;
|
|
10
|
+
method?: "POST" | "GET" | "PUT" | "DELETE" | undefined;
|
|
11
|
+
body?: string | undefined;
|
|
12
|
+
headers?: Record<string, string> | undefined;
|
|
13
|
+
}, {
|
|
14
|
+
url: string;
|
|
15
|
+
method?: "POST" | "GET" | "PUT" | "DELETE" | undefined;
|
|
16
|
+
body?: string | undefined;
|
|
17
|
+
headers?: Record<string, string> | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export declare const RemoteTriggerTool: Tool<typeof inputSchema>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/RemoteTriggerTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AAEtD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAEH,eAAO,MAAM,iBAAiB,EAAE,IAAI,CAAC,OAAO,WAAW,CAqCtD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const inputSchema = z.object({
|
|
3
|
+
url: z.string().describe("Webhook URL to trigger"),
|
|
4
|
+
method: z.enum(["GET", "POST", "PUT", "DELETE"]).optional(),
|
|
5
|
+
body: z.string().optional().describe("JSON body for POST/PUT requests"),
|
|
6
|
+
headers: z.record(z.string()).optional().describe("Custom headers"),
|
|
7
|
+
});
|
|
8
|
+
export const RemoteTriggerTool = {
|
|
9
|
+
name: "RemoteTrigger",
|
|
10
|
+
description: "Trigger a remote webhook or API endpoint. Useful for CI/CD, deployments, and external integrations.",
|
|
11
|
+
inputSchema,
|
|
12
|
+
riskLevel: "high",
|
|
13
|
+
isReadOnly() { return false; },
|
|
14
|
+
isConcurrencySafe() { return true; },
|
|
15
|
+
async call(input) {
|
|
16
|
+
try {
|
|
17
|
+
const method = input.method ?? (input.body ? "POST" : "GET");
|
|
18
|
+
const headers = {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
...input.headers,
|
|
21
|
+
};
|
|
22
|
+
const res = await fetch(input.url, {
|
|
23
|
+
method,
|
|
24
|
+
headers,
|
|
25
|
+
body: input.body,
|
|
26
|
+
signal: AbortSignal.timeout(30_000),
|
|
27
|
+
});
|
|
28
|
+
const text = await res.text();
|
|
29
|
+
const truncated = text.length > 5000 ? text.slice(0, 5000) + '\n[truncated]' : text;
|
|
30
|
+
return {
|
|
31
|
+
output: `${res.status} ${res.statusText}\n${truncated}`,
|
|
32
|
+
isError: res.status >= 400,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return { output: `Request failed: ${err instanceof Error ? err.message : String(err)}`, isError: true };
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
prompt() {
|
|
40
|
+
return "RemoteTrigger: Send HTTP requests to webhooks, APIs, or CI/CD triggers.";
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/RemoteTriggerTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAClD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACvE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAA6B;IACzD,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,qGAAqG;IAClH,WAAW;IACX,SAAS,EAAE,MAAM;IACjB,UAAU,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IAC9B,iBAAiB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,KAAK,CAAC,OAAO;aACjB,CAAC;YAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;gBACjC,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;YACpF,OAAO;gBACL,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE;gBACvD,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG;aAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1G,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,yEAAyE,CAAC;IACnF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { Tool } from "../../Tool.js";
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
to: z.ZodString;
|
|
5
|
+
content: z.ZodString;
|
|
6
|
+
type: z.ZodOptional<z.ZodEnum<["request", "response", "status", "error"]>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
content: string;
|
|
9
|
+
to: string;
|
|
10
|
+
type?: "error" | "status" | "request" | "response" | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
content: string;
|
|
13
|
+
to: string;
|
|
14
|
+
type?: "error" | "status" | "request" | "response" | undefined;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const SendMessageTool: Tool<typeof inputSchema>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/SendMessageTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AAGtD,QAAA,MAAM,WAAW;;;;;;;;;;;;EAIf,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,IAAI,CAAC,OAAO,WAAW,CAuBpD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getMessageBus } from "../../services/agent-messaging.js";
|
|
3
|
+
const inputSchema = z.object({
|
|
4
|
+
to: z.string().describe("Target agent ID, or '*' for broadcast"),
|
|
5
|
+
content: z.string().describe("Message content"),
|
|
6
|
+
type: z.enum(["request", "response", "status", "error"]).optional(),
|
|
7
|
+
});
|
|
8
|
+
export const SendMessageTool = {
|
|
9
|
+
name: "SendMessage",
|
|
10
|
+
description: "Send a message to another agent. Use for coordination in multi-agent workflows.",
|
|
11
|
+
inputSchema,
|
|
12
|
+
riskLevel: "low",
|
|
13
|
+
isReadOnly() { return true; },
|
|
14
|
+
isConcurrencySafe() { return true; },
|
|
15
|
+
async call(input) {
|
|
16
|
+
const bus = getMessageBus();
|
|
17
|
+
bus.send({
|
|
18
|
+
from: 'lead',
|
|
19
|
+
to: input.to,
|
|
20
|
+
type: input.type ?? 'request',
|
|
21
|
+
content: input.content,
|
|
22
|
+
});
|
|
23
|
+
return { output: `Message sent to ${input.to}`, isError: false };
|
|
24
|
+
},
|
|
25
|
+
prompt() {
|
|
26
|
+
return "SendMessage: Send messages to other agents for coordination. Use to: '*' for broadcast.";
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/SendMessageTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,iFAAiF;IAC9F,WAAW;IACX,SAAS,EAAE,KAAK;IAEhB,UAAU,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAC7B,iBAAiB,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IAEpC,KAAK,CAAC,IAAI,CAAC,KAAK;QACd,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;YAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,mBAAmB,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IAED,MAAM;QACJ,OAAO,yFAAyF,CAAC;IACnG,CAAC;CACF,CAAC"}
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AA8CvC;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAqDnC"}
|
package/dist/tools.js
CHANGED
|
@@ -28,6 +28,21 @@ import { ImageReadTool } from "./tools/ImageReadTool/index.js";
|
|
|
28
28
|
import { DiagnosticsTool } from "./tools/DiagnosticsTool/index.js";
|
|
29
29
|
import { ParallelAgentTool } from "./tools/ParallelAgentTool/index.js";
|
|
30
30
|
import { ToolSearchTool } from "./tools/ToolSearchTool/index.js";
|
|
31
|
+
// Agent messaging
|
|
32
|
+
import { SendMessageTool } from "./tools/SendMessageTool/index.js";
|
|
33
|
+
// Scheduled tasks
|
|
34
|
+
import { CronCreateTool, CronDeleteTool, CronListTool } from "./tools/CronTool/index.js";
|
|
35
|
+
// Worktree management
|
|
36
|
+
import { EnterWorktreeTool } from "./tools/EnterWorktreeTool/index.js";
|
|
37
|
+
import { ExitWorktreeTool } from "./tools/ExitWorktreeTool/index.js";
|
|
38
|
+
// Process management
|
|
39
|
+
import { KillProcessTool } from "./tools/KillProcessTool/index.js";
|
|
40
|
+
// Remote triggers
|
|
41
|
+
import { RemoteTriggerTool } from "./tools/RemoteTriggerTool/index.js";
|
|
42
|
+
// Memory
|
|
43
|
+
import { MemoryTool } from "./tools/MemoryTool/index.js";
|
|
44
|
+
// Multi-file edits
|
|
45
|
+
import { MultiEditTool } from "./tools/MultiEditTool/index.js";
|
|
31
46
|
/**
|
|
32
47
|
* Returns all registered tools.
|
|
33
48
|
*/
|
|
@@ -66,6 +81,23 @@ export function getAllTools() {
|
|
|
66
81
|
ParallelAgentTool,
|
|
67
82
|
// Tool Discovery
|
|
68
83
|
ToolSearchTool,
|
|
84
|
+
// Agent messaging
|
|
85
|
+
SendMessageTool,
|
|
86
|
+
// Scheduled tasks
|
|
87
|
+
CronCreateTool,
|
|
88
|
+
CronDeleteTool,
|
|
89
|
+
CronListTool,
|
|
90
|
+
// Worktree management
|
|
91
|
+
EnterWorktreeTool,
|
|
92
|
+
ExitWorktreeTool,
|
|
93
|
+
// Process management
|
|
94
|
+
KillProcessTool,
|
|
95
|
+
// Remote triggers
|
|
96
|
+
RemoteTriggerTool,
|
|
97
|
+
// Memory management
|
|
98
|
+
MemoryTool,
|
|
99
|
+
// Multi-file edits
|
|
100
|
+
MultiEditTool,
|
|
69
101
|
];
|
|
70
102
|
}
|
|
71
103
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhijiewang/openharness",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.1",
|
|
4
4
|
"description": "Open-source terminal coding agent. Works with any LLM.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"@types/node": "^22.0.0",
|
|
40
40
|
"@types/react": "^18.3.0",
|
|
41
41
|
"c8": "^11.0.0",
|
|
42
|
+
"sharp": "^0.34.5",
|
|
42
43
|
"tsx": "^4.19.0",
|
|
43
44
|
"typescript": "^5.8.0"
|
|
44
45
|
},
|