@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.
Files changed (44) hide show
  1. package/README.md +4 -0
  2. package/dist/renderer/index.d.ts +2 -0
  3. package/dist/renderer/index.d.ts.map +1 -1
  4. package/dist/renderer/index.js +26 -16
  5. package/dist/renderer/index.js.map +1 -1
  6. package/dist/repl.d.ts.map +1 -1
  7. package/dist/repl.js +69 -15
  8. package/dist/repl.js.map +1 -1
  9. package/dist/tools/CronTool/index.d.ts +40 -0
  10. package/dist/tools/CronTool/index.d.ts.map +1 -0
  11. package/dist/tools/CronTool/index.js +59 -0
  12. package/dist/tools/CronTool/index.js.map +1 -0
  13. package/dist/tools/EnterWorktreeTool/index.d.ts +12 -0
  14. package/dist/tools/EnterWorktreeTool/index.d.ts.map +1 -0
  15. package/dist/tools/EnterWorktreeTool/index.js +27 -0
  16. package/dist/tools/EnterWorktreeTool/index.js.map +1 -0
  17. package/dist/tools/ExitWorktreeTool/index.d.ts +15 -0
  18. package/dist/tools/ExitWorktreeTool/index.d.ts.map +1 -0
  19. package/dist/tools/ExitWorktreeTool/index.js +33 -0
  20. package/dist/tools/ExitWorktreeTool/index.js.map +1 -0
  21. package/dist/tools/KillProcessTool/index.d.ts +18 -0
  22. package/dist/tools/KillProcessTool/index.d.ts.map +1 -0
  23. package/dist/tools/KillProcessTool/index.js +43 -0
  24. package/dist/tools/KillProcessTool/index.js.map +1 -0
  25. package/dist/tools/MemoryTool/index.d.ts +30 -0
  26. package/dist/tools/MemoryTool/index.d.ts.map +1 -0
  27. package/dist/tools/MemoryTool/index.js +56 -0
  28. package/dist/tools/MemoryTool/index.js.map +1 -0
  29. package/dist/tools/MultiEditTool/index.d.ts +32 -0
  30. package/dist/tools/MultiEditTool/index.d.ts.map +1 -0
  31. package/dist/tools/MultiEditTool/index.js +53 -0
  32. package/dist/tools/MultiEditTool/index.js.map +1 -0
  33. package/dist/tools/RemoteTriggerTool/index.d.ts +21 -0
  34. package/dist/tools/RemoteTriggerTool/index.d.ts.map +1 -0
  35. package/dist/tools/RemoteTriggerTool/index.js +43 -0
  36. package/dist/tools/RemoteTriggerTool/index.js.map +1 -0
  37. package/dist/tools/SendMessageTool/index.d.ts +18 -0
  38. package/dist/tools/SendMessageTool/index.d.ts.map +1 -0
  39. package/dist/tools/SendMessageTool/index.js +29 -0
  40. package/dist/tools/SendMessageTool/index.js.map +1 -0
  41. package/dist/tools.d.ts.map +1 -1
  42. package/dist/tools.js +32 -0
  43. package/dist/tools.js.map +1 -1
  44. 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"}
@@ -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;AA+BvC;;GAEG;AACH,wBAAgB,WAAW,IAAI,KAAK,CAoCnC"}
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;AAEjE;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,0BAA0B;QAC1B,QAAQ;QACR,YAAY;QACZ,aAAa;QACb,aAAa;QACb,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,YAAY;QACZ,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,cAAc;QACd,oBAAoB;QACpB,WAAW;QACX,SAAS;QACT,SAAS;QACT,WAAW;QACX,iBAAiB;QACjB,gBAAgB;QAChB,YAAY;QACZ,gBAAgB;QAChB,oBAAoB;QACpB,eAAe;QACf,kBAAkB;QAClB,iBAAiB;QACjB,iBAAiB;QACjB,cAAc;KACf,CAAC;AACJ,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.0",
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
  },