homaruscc 0.2.0

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 (171) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +21 -0
  3. package/README.md +307 -0
  4. package/bin/event-loop +60 -0
  5. package/config.example.json +55 -0
  6. package/dist/agent-registry.d.ts +38 -0
  7. package/dist/agent-registry.d.ts.map +1 -0
  8. package/dist/agent-registry.js +207 -0
  9. package/dist/agent-registry.js.map +1 -0
  10. package/dist/backend.d.ts +3 -0
  11. package/dist/backend.d.ts.map +1 -0
  12. package/dist/backend.js +59 -0
  13. package/dist/backend.js.map +1 -0
  14. package/dist/browser-service.d.ts +19 -0
  15. package/dist/browser-service.d.ts.map +1 -0
  16. package/dist/browser-service.js +101 -0
  17. package/dist/browser-service.js.map +1 -0
  18. package/dist/channel-adapter.d.ts +22 -0
  19. package/dist/channel-adapter.d.ts.map +1 -0
  20. package/dist/channel-adapter.js +62 -0
  21. package/dist/channel-adapter.js.map +1 -0
  22. package/dist/channel-manager.d.ts +18 -0
  23. package/dist/channel-manager.d.ts.map +1 -0
  24. package/dist/channel-manager.js +73 -0
  25. package/dist/channel-manager.js.map +1 -0
  26. package/dist/compaction-manager.d.ts +23 -0
  27. package/dist/compaction-manager.d.ts.map +1 -0
  28. package/dist/compaction-manager.js +135 -0
  29. package/dist/compaction-manager.js.map +1 -0
  30. package/dist/config.d.ts +21 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +169 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/dashboard-adapter.d.ts +17 -0
  35. package/dist/dashboard-adapter.d.ts.map +1 -0
  36. package/dist/dashboard-adapter.js +41 -0
  37. package/dist/dashboard-adapter.js.map +1 -0
  38. package/dist/dashboard-server.d.ts +29 -0
  39. package/dist/dashboard-server.d.ts.map +1 -0
  40. package/dist/dashboard-server.js +381 -0
  41. package/dist/dashboard-server.js.map +1 -0
  42. package/dist/embedding-provider.d.ts +28 -0
  43. package/dist/embedding-provider.d.ts.map +1 -0
  44. package/dist/embedding-provider.js +91 -0
  45. package/dist/embedding-provider.js.map +1 -0
  46. package/dist/event-bus.d.ts +18 -0
  47. package/dist/event-bus.d.ts.map +1 -0
  48. package/dist/event-bus.js +41 -0
  49. package/dist/event-bus.js.map +1 -0
  50. package/dist/event-queue.d.ts +18 -0
  51. package/dist/event-queue.d.ts.map +1 -0
  52. package/dist/event-queue.js +68 -0
  53. package/dist/event-queue.js.map +1 -0
  54. package/dist/homaruscc.d.ts +69 -0
  55. package/dist/homaruscc.d.ts.map +1 -0
  56. package/dist/homaruscc.js +337 -0
  57. package/dist/homaruscc.js.map +1 -0
  58. package/dist/identity-manager.d.ts +36 -0
  59. package/dist/identity-manager.d.ts.map +1 -0
  60. package/dist/identity-manager.js +142 -0
  61. package/dist/identity-manager.js.map +1 -0
  62. package/dist/mcp-proxy.d.ts +3 -0
  63. package/dist/mcp-proxy.d.ts.map +1 -0
  64. package/dist/mcp-proxy.js +259 -0
  65. package/dist/mcp-proxy.js.map +1 -0
  66. package/dist/mcp-resources.d.ts +10 -0
  67. package/dist/mcp-resources.d.ts.map +1 -0
  68. package/dist/mcp-resources.js +67 -0
  69. package/dist/mcp-resources.js.map +1 -0
  70. package/dist/mcp-server.d.ts +3 -0
  71. package/dist/mcp-server.d.ts.map +1 -0
  72. package/dist/mcp-server.js +169 -0
  73. package/dist/mcp-server.js.map +1 -0
  74. package/dist/mcp-tools.d.ts +14 -0
  75. package/dist/mcp-tools.d.ts.map +1 -0
  76. package/dist/mcp-tools.js +408 -0
  77. package/dist/mcp-tools.js.map +1 -0
  78. package/dist/memory-index.d.ts +79 -0
  79. package/dist/memory-index.d.ts.map +1 -0
  80. package/dist/memory-index.js +437 -0
  81. package/dist/memory-index.js.map +1 -0
  82. package/dist/session-checkpoint.d.ts +22 -0
  83. package/dist/session-checkpoint.d.ts.map +1 -0
  84. package/dist/session-checkpoint.js +100 -0
  85. package/dist/session-checkpoint.js.map +1 -0
  86. package/dist/skill-manager.d.ts +26 -0
  87. package/dist/skill-manager.d.ts.map +1 -0
  88. package/dist/skill-manager.js +156 -0
  89. package/dist/skill-manager.js.map +1 -0
  90. package/dist/skill-transport.d.ts +45 -0
  91. package/dist/skill-transport.d.ts.map +1 -0
  92. package/dist/skill-transport.js +111 -0
  93. package/dist/skill-transport.js.map +1 -0
  94. package/dist/skill.d.ts +22 -0
  95. package/dist/skill.d.ts.map +1 -0
  96. package/dist/skill.js +106 -0
  97. package/dist/skill.js.map +1 -0
  98. package/dist/telegram-adapter.d.ts +43 -0
  99. package/dist/telegram-adapter.d.ts.map +1 -0
  100. package/dist/telegram-adapter.js +188 -0
  101. package/dist/telegram-adapter.js.map +1 -0
  102. package/dist/timer-service.d.ts +30 -0
  103. package/dist/timer-service.d.ts.map +1 -0
  104. package/dist/timer-service.js +176 -0
  105. package/dist/timer-service.js.map +1 -0
  106. package/dist/tool-registry.d.ts +30 -0
  107. package/dist/tool-registry.d.ts.map +1 -0
  108. package/dist/tool-registry.js +108 -0
  109. package/dist/tool-registry.js.map +1 -0
  110. package/dist/tools/bash.d.ts +3 -0
  111. package/dist/tools/bash.d.ts.map +1 -0
  112. package/dist/tools/bash.js +67 -0
  113. package/dist/tools/bash.js.map +1 -0
  114. package/dist/tools/browser.d.ts +4 -0
  115. package/dist/tools/browser.d.ts.map +1 -0
  116. package/dist/tools/browser.js +138 -0
  117. package/dist/tools/browser.js.map +1 -0
  118. package/dist/tools/edit.d.ts +3 -0
  119. package/dist/tools/edit.d.ts.map +1 -0
  120. package/dist/tools/edit.js +47 -0
  121. package/dist/tools/edit.js.map +1 -0
  122. package/dist/tools/git.d.ts +3 -0
  123. package/dist/tools/git.d.ts.map +1 -0
  124. package/dist/tools/git.js +105 -0
  125. package/dist/tools/git.js.map +1 -0
  126. package/dist/tools/glob.d.ts +3 -0
  127. package/dist/tools/glob.d.ts.map +1 -0
  128. package/dist/tools/glob.js +84 -0
  129. package/dist/tools/glob.js.map +1 -0
  130. package/dist/tools/grep.d.ts +3 -0
  131. package/dist/tools/grep.d.ts.map +1 -0
  132. package/dist/tools/grep.js +168 -0
  133. package/dist/tools/grep.js.map +1 -0
  134. package/dist/tools/index.d.ts +6 -0
  135. package/dist/tools/index.d.ts.map +1 -0
  136. package/dist/tools/index.js +46 -0
  137. package/dist/tools/index.js.map +1 -0
  138. package/dist/tools/memory.d.ts +4 -0
  139. package/dist/tools/memory.d.ts.map +1 -0
  140. package/dist/tools/memory.js +64 -0
  141. package/dist/tools/memory.js.map +1 -0
  142. package/dist/tools/read.d.ts +3 -0
  143. package/dist/tools/read.d.ts.map +1 -0
  144. package/dist/tools/read.js +50 -0
  145. package/dist/tools/read.js.map +1 -0
  146. package/dist/tools/web-fetch.d.ts +3 -0
  147. package/dist/tools/web-fetch.d.ts.map +1 -0
  148. package/dist/tools/web-fetch.js +51 -0
  149. package/dist/tools/web-fetch.js.map +1 -0
  150. package/dist/tools/web-search.d.ts +3 -0
  151. package/dist/tools/web-search.d.ts.map +1 -0
  152. package/dist/tools/web-search.js +65 -0
  153. package/dist/tools/web-search.js.map +1 -0
  154. package/dist/tools/write.d.ts +3 -0
  155. package/dist/tools/write.d.ts.map +1 -0
  156. package/dist/tools/write.js +32 -0
  157. package/dist/tools/write.js.map +1 -0
  158. package/dist/transcript-logger.d.ts +23 -0
  159. package/dist/transcript-logger.d.ts.map +1 -0
  160. package/dist/transcript-logger.js +101 -0
  161. package/dist/transcript-logger.js.map +1 -0
  162. package/dist/types.d.ts +190 -0
  163. package/dist/types.d.ts.map +1 -0
  164. package/dist/types.js +14 -0
  165. package/dist/types.js.map +1 -0
  166. package/identity.example/disagreements.md +9 -0
  167. package/identity.example/preferences.md +11 -0
  168. package/identity.example/soul.md +12 -0
  169. package/identity.example/state.md +21 -0
  170. package/identity.example/user.md +14 -0
  171. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ import type { BrowserService } from "../browser-service.js";
3
+ export declare function createBrowserTools(browserService: BrowserService): ToolDefinition[];
4
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,cAAc,EAAE,CAwInF"}
@@ -0,0 +1,138 @@
1
+ export function createBrowserTools(browserService) {
2
+ const browserNavigate = {
3
+ name: "browser_navigate",
4
+ description: "Navigate the browser to a URL. Returns page title and URL.",
5
+ parameters: {
6
+ type: "object",
7
+ properties: {
8
+ url: { type: "string", description: "URL to navigate to" },
9
+ },
10
+ required: ["url"],
11
+ },
12
+ source: "builtin",
13
+ async execute(params) {
14
+ const { url } = params;
15
+ try {
16
+ const result = await browserService.navigate(url);
17
+ return { output: result };
18
+ }
19
+ catch (err) {
20
+ return { output: "", error: String(err) };
21
+ }
22
+ },
23
+ };
24
+ const browserSnapshot = {
25
+ name: "browser_snapshot",
26
+ description: "Get the accessibility tree of the current page.",
27
+ parameters: { type: "object", properties: {} },
28
+ source: "builtin",
29
+ async execute() {
30
+ try {
31
+ const result = await browserService.snapshot();
32
+ return { output: result };
33
+ }
34
+ catch (err) {
35
+ return { output: "", error: String(err) };
36
+ }
37
+ },
38
+ };
39
+ const browserScreenshot = {
40
+ name: "browser_screenshot",
41
+ description: "Take a screenshot of the current page. Returns base64-encoded PNG.",
42
+ parameters: { type: "object", properties: {} },
43
+ source: "builtin",
44
+ async execute() {
45
+ try {
46
+ const result = await browserService.screenshot();
47
+ return { output: result };
48
+ }
49
+ catch (err) {
50
+ return { output: "", error: String(err) };
51
+ }
52
+ },
53
+ };
54
+ const browserClick = {
55
+ name: "browser_click",
56
+ description: "Click an element on the page by CSS selector.",
57
+ parameters: {
58
+ type: "object",
59
+ properties: {
60
+ selector: { type: "string", description: "CSS selector of element to click" },
61
+ },
62
+ required: ["selector"],
63
+ },
64
+ source: "builtin",
65
+ async execute(params) {
66
+ const { selector } = params;
67
+ try {
68
+ const result = await browserService.click(selector);
69
+ return { output: result };
70
+ }
71
+ catch (err) {
72
+ return { output: "", error: String(err) };
73
+ }
74
+ },
75
+ };
76
+ const browserType = {
77
+ name: "browser_type",
78
+ description: "Type text into an input element by CSS selector.",
79
+ parameters: {
80
+ type: "object",
81
+ properties: {
82
+ selector: { type: "string", description: "CSS selector of input element" },
83
+ text: { type: "string", description: "Text to type" },
84
+ },
85
+ required: ["selector", "text"],
86
+ },
87
+ source: "builtin",
88
+ async execute(params) {
89
+ const { selector, text } = params;
90
+ try {
91
+ const result = await browserService.type(selector, text);
92
+ return { output: result };
93
+ }
94
+ catch (err) {
95
+ return { output: "", error: String(err) };
96
+ }
97
+ },
98
+ };
99
+ const browserEvaluate = {
100
+ name: "browser_evaluate",
101
+ description: "Execute JavaScript in the browser page and return the result.",
102
+ parameters: {
103
+ type: "object",
104
+ properties: {
105
+ script: { type: "string", description: "JavaScript code to execute" },
106
+ },
107
+ required: ["script"],
108
+ },
109
+ source: "builtin",
110
+ async execute(params) {
111
+ const { script } = params;
112
+ try {
113
+ const result = await browserService.evaluate(script);
114
+ return { output: result };
115
+ }
116
+ catch (err) {
117
+ return { output: "", error: String(err) };
118
+ }
119
+ },
120
+ };
121
+ const browserContent = {
122
+ name: "browser_content",
123
+ description: "Get the text content of the current page.",
124
+ parameters: { type: "object", properties: {} },
125
+ source: "builtin",
126
+ async execute() {
127
+ try {
128
+ const result = await browserService.getContent();
129
+ return { output: result };
130
+ }
131
+ catch (err) {
132
+ return { output: "", error: String(err) };
133
+ }
134
+ },
135
+ };
136
+ return [browserNavigate, browserSnapshot, browserScreenshot, browserClick, browserType, browserEvaluate, browserContent];
137
+ }
138
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const editTool: ToolDefinition;
3
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAC;AAS3E,eAAO,MAAM,QAAQ,EAAE,cAkDtB,CAAC"}
@@ -0,0 +1,47 @@
1
+ // CRC: crc-ToolRegistry.md
2
+ // Built-in tool: edit — from HomarUS
3
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
4
+ import { resolve } from "node:path";
5
+ export const editTool = {
6
+ name: "edit",
7
+ description: "Perform an exact string replacement in a file.",
8
+ parameters: {
9
+ type: "object",
10
+ properties: {
11
+ path: { type: "string", description: "Absolute or relative path to the file" },
12
+ old_string: { type: "string", description: "The exact text to find and replace" },
13
+ new_string: { type: "string", description: "The replacement text" },
14
+ replace_all: { type: "boolean", description: "Replace all occurrences (default false)" },
15
+ },
16
+ required: ["path", "old_string", "new_string"],
17
+ },
18
+ source: "builtin",
19
+ async execute(params, context) {
20
+ const { path: filePath, old_string, new_string, replace_all = false } = params;
21
+ const absPath = resolve(context.workingDir, filePath);
22
+ if (context.sandbox) {
23
+ return { output: "", error: "edit tool is not available in sandbox mode" };
24
+ }
25
+ if (!existsSync(absPath)) {
26
+ return { output: "", error: `File not found: ${absPath}` };
27
+ }
28
+ const content = readFileSync(absPath, "utf-8");
29
+ if (!content.includes(old_string)) {
30
+ return { output: "", error: "old_string not found in file" };
31
+ }
32
+ if (!replace_all) {
33
+ const firstIdx = content.indexOf(old_string);
34
+ const secondIdx = content.indexOf(old_string, firstIdx + 1);
35
+ if (secondIdx !== -1) {
36
+ return { output: "", error: "old_string is not unique in the file. Provide more context or use replace_all." };
37
+ }
38
+ }
39
+ const updated = replace_all
40
+ ? content.split(old_string).join(new_string)
41
+ : content.replace(old_string, new_string);
42
+ writeFileSync(absPath, updated);
43
+ const count = replace_all ? content.split(old_string).length - 1 : 1;
44
+ return { output: `Replaced ${count} occurrence(s) in ${absPath}` };
45
+ },
46
+ };
47
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACtC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,gDAAgD;IAC7D,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;YAC9E,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oCAAoC,EAAE;YACjF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;YACnE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yCAAyC,EAAE;SACzF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC;KAC/C;IACD,MAAM,EAAE,SAAS;IAEjB,KAAK,CAAC,OAAO,CAAC,MAAe,EAAE,OAAoB;QACjD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,MAAoB,CAAC;QAC7F,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEtD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,OAAO,EAAE,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC5D,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;gBACrB,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gFAAgF,EAAE,CAAC;YACjH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,WAAW;YACzB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAE5C,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,EAAE,MAAM,EAAE,YAAY,KAAK,qBAAqB,OAAO,EAAE,EAAE,CAAC;IACrE,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const gitTool: ToolDefinition;
3
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAC;AA4D3E,eAAO,MAAM,OAAO,EAAE,cA+DrB,CAAC"}
@@ -0,0 +1,105 @@
1
+ // CRC: crc-ToolRegistry.md
2
+ // Built-in tool: git — from HomarUS
3
+ import { exec } from "node:child_process";
4
+ const WRITE_ACTIONS = new Set([
5
+ "add", "commit", "checkout", "pull", "push", "fetch",
6
+ "stash", "stash_pop", "merge", "rebase", "tag", "init", "clone",
7
+ ]);
8
+ const BLOCKED_PATTERNS = [
9
+ /--force\b/,
10
+ /push\s+--force/,
11
+ /reset\s+--hard/,
12
+ /clean\s+-f/,
13
+ /branch\s+-D/,
14
+ /--no-verify/,
15
+ ];
16
+ function buildCommand(action, args, message) {
17
+ switch (action) {
18
+ case "status": return `git status${args ? " " + args : ""}`;
19
+ case "diff": return `git diff${args ? " " + args : ""}`;
20
+ case "log": return `git log --oneline -20${args ? " " + args : ""}`;
21
+ case "show": return `git show${args ? " " + args : " HEAD"}`;
22
+ case "branch": return `git branch${args ? " " + args : ""}`;
23
+ case "branches": return "git branch -a";
24
+ case "add": return `git add ${args ?? "."}`;
25
+ case "commit": {
26
+ if (!message)
27
+ return "echo 'Error: commit requires a message'";
28
+ return `git commit -m ${JSON.stringify(message)}`;
29
+ }
30
+ case "checkout": return `git checkout ${args ?? ""}`;
31
+ case "pull": return `git pull${args ? " " + args : ""}`;
32
+ case "push": return `git push${args ? " " + args : ""}`;
33
+ case "fetch": return `git fetch${args ? " " + args : " --all"}`;
34
+ case "stash": return `git stash${args ? " " + args : ""}`;
35
+ case "stash_pop": return "git stash pop";
36
+ case "merge": return `git merge ${args ?? ""}`;
37
+ case "rebase": return `git rebase ${args ?? ""}`;
38
+ case "blame": return `git blame ${args ?? ""}`;
39
+ case "tag": return `git tag ${args ?? ""}`;
40
+ case "tags": return "git tag -l";
41
+ case "remote": return `git remote ${args ?? "-v"}`;
42
+ case "init": return "git init";
43
+ case "clone": return `git clone ${args ?? ""}`;
44
+ default: return `git ${action}${args ? " " + args : ""}`;
45
+ }
46
+ }
47
+ export const gitTool = {
48
+ name: "git",
49
+ description: "Git operations with safety guardrails. Blocks force-push, hard reset, and destructive commands.",
50
+ parameters: {
51
+ type: "object",
52
+ properties: {
53
+ action: {
54
+ type: "string",
55
+ description: "The git action to perform",
56
+ enum: [
57
+ "status", "diff", "log", "show", "branch", "branches",
58
+ "add", "commit", "checkout", "pull", "push", "fetch",
59
+ "stash", "stash_pop", "merge", "rebase",
60
+ "blame", "tag", "tags", "remote", "init", "clone",
61
+ ],
62
+ },
63
+ args: { type: "string", description: "Additional arguments" },
64
+ message: { type: "string", description: "Commit message (required for commit)" },
65
+ path: { type: "string", description: "Working directory" },
66
+ },
67
+ required: ["action"],
68
+ },
69
+ source: "builtin",
70
+ async execute(params, context) {
71
+ const { action, args, message, path } = params;
72
+ if (context.sandbox && WRITE_ACTIONS.has(action)) {
73
+ return { output: "", error: `git ${action} is not available in sandbox mode` };
74
+ }
75
+ const command = buildCommand(action, args, message);
76
+ for (const pattern of BLOCKED_PATTERNS) {
77
+ if (pattern.test(command)) {
78
+ return { output: "", error: `Blocked: "${command}" matches dangerous pattern.` };
79
+ }
80
+ }
81
+ const cwd = path ? path : context.workingDir;
82
+ return new Promise((resolve) => {
83
+ exec(command, {
84
+ cwd,
85
+ timeout: 60_000,
86
+ maxBuffer: 5 * 1024 * 1024,
87
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
88
+ }, (error, stdout, stderr) => {
89
+ let output = stdout;
90
+ if (stderr)
91
+ output += (output ? "\n" : "") + stderr;
92
+ if (output.length > 50_000) {
93
+ output = output.slice(0, 50_000) + "\n... (truncated)";
94
+ }
95
+ if (error) {
96
+ resolve({ output, error: `git ${action} failed (exit ${error.code}): ${error.message}` });
97
+ }
98
+ else {
99
+ resolve({ output });
100
+ }
101
+ });
102
+ });
103
+ },
104
+ };
105
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/tools/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const globTool: ToolDefinition;
3
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAC;AAgD3E,eAAO,MAAM,QAAQ,EAAE,cA2CtB,CAAC"}
@@ -0,0 +1,84 @@
1
+ // CRC: crc-ToolRegistry.md
2
+ // Built-in tool: glob — from HomarUS
3
+ import { resolve } from "node:path";
4
+ import { readdirSync, statSync, existsSync } from "node:fs";
5
+ const MAX_RESULTS = 500;
6
+ function minimatch(filePath, pattern) {
7
+ let regex = pattern
8
+ .replace(/\./g, "\\.")
9
+ .replace(/\*\*/g, "\u2B50\u2B50")
10
+ .replace(/\*/g, "[^/]*")
11
+ .replace(/\u2B50\u2B50/g, ".*")
12
+ .replace(/\?/g, "[^/]");
13
+ if (!regex.startsWith(".*") && !regex.startsWith("/")) {
14
+ regex = "(^|/)" + regex;
15
+ }
16
+ return new RegExp(regex + "$").test(filePath);
17
+ }
18
+ function walkDir(dir, pattern, results, maxDepth = 20, depth = 0) {
19
+ if (depth > maxDepth || results.length >= MAX_RESULTS)
20
+ return;
21
+ let entries;
22
+ try {
23
+ entries = readdirSync(dir, { withFileTypes: true });
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ for (const entry of entries) {
29
+ if (results.length >= MAX_RESULTS)
30
+ return;
31
+ if (entry.name.startsWith(".") && !pattern.startsWith("."))
32
+ continue;
33
+ if (entry.name === "node_modules" || entry.name === ".git")
34
+ continue;
35
+ const fullPath = resolve(dir, entry.name);
36
+ if (entry.isDirectory()) {
37
+ walkDir(fullPath, pattern, results, maxDepth, depth + 1);
38
+ }
39
+ else if (entry.isFile()) {
40
+ if (minimatch(fullPath, pattern) || minimatch(entry.name, pattern)) {
41
+ results.push(fullPath);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ export const globTool = {
47
+ name: "glob",
48
+ description: "Find files matching a glob pattern. Supports **, *, ?. Excludes node_modules and .git.",
49
+ parameters: {
50
+ type: "object",
51
+ properties: {
52
+ pattern: { type: "string", description: "Glob pattern to match files" },
53
+ path: { type: "string", description: "Directory to search in (default: working directory)" },
54
+ },
55
+ required: ["pattern"],
56
+ },
57
+ source: "builtin",
58
+ async execute(params, context) {
59
+ const { pattern, path: searchPath } = params;
60
+ const rootDir = searchPath ? resolve(context.workingDir, searchPath) : context.workingDir;
61
+ if (!existsSync(rootDir)) {
62
+ return { output: "", error: `Directory not found: ${rootDir}` };
63
+ }
64
+ const results = [];
65
+ walkDir(rootDir, pattern, results);
66
+ results.sort((a, b) => {
67
+ try {
68
+ return statSync(b).mtimeMs - statSync(a).mtimeMs;
69
+ }
70
+ catch {
71
+ return 0;
72
+ }
73
+ });
74
+ if (results.length === 0) {
75
+ return { output: "No files found" };
76
+ }
77
+ let output = results.join("\n");
78
+ if (results.length >= MAX_RESULTS) {
79
+ output += `\n... (truncated at ${MAX_RESULTS} results)`;
80
+ }
81
+ return { output };
82
+ },
83
+ };
84
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const grepTool: ToolDefinition;
3
+ //# sourceMappingURL=grep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,aAAa,CAAC;AA4D3E,eAAO,MAAM,QAAQ,EAAE,cA8HtB,CAAC"}
@@ -0,0 +1,168 @@
1
+ // CRC: crc-ToolRegistry.md
2
+ // Built-in tool: grep — from HomarUS
3
+ import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
4
+ import { resolve, extname } from "node:path";
5
+ const MAX_MATCHES = 200;
6
+ const MAX_FILE_SIZE = 2 * 1024 * 1024;
7
+ const TYPE_EXTENSIONS = {
8
+ js: [".js", ".mjs", ".cjs"],
9
+ ts: [".ts", ".tsx", ".mts"],
10
+ py: [".py", ".pyi"],
11
+ rust: [".rs"],
12
+ go: [".go"],
13
+ java: [".java"],
14
+ md: [".md"],
15
+ json: [".json"],
16
+ yaml: [".yaml", ".yml"],
17
+ html: [".html", ".htm"],
18
+ css: [".css", ".scss"],
19
+ sh: [".sh", ".bash", ".zsh"],
20
+ };
21
+ function matchesGlob(filename, glob) {
22
+ const regex = glob
23
+ .replace(/\./g, "\\.")
24
+ .replace(/\*\*/g, ".*")
25
+ .replace(/\*/g, "[^/]*")
26
+ .replace(/\?/g, ".");
27
+ return new RegExp(regex + "$").test(filename);
28
+ }
29
+ function walkFiles(dir, filterFn, results, depth = 0) {
30
+ if (depth > 20)
31
+ return;
32
+ let entries;
33
+ try {
34
+ entries = readdirSync(dir, { withFileTypes: true });
35
+ }
36
+ catch {
37
+ return;
38
+ }
39
+ for (const entry of entries) {
40
+ if (entry.name.startsWith(".") || entry.name === "node_modules")
41
+ continue;
42
+ const fullPath = resolve(dir, entry.name);
43
+ if (entry.isDirectory()) {
44
+ walkFiles(fullPath, filterFn, results, depth + 1);
45
+ }
46
+ else if (entry.isFile() && filterFn(fullPath)) {
47
+ results.push(fullPath);
48
+ }
49
+ }
50
+ }
51
+ export const grepTool = {
52
+ name: "grep",
53
+ description: "Search file contents using regex. Supports file type filtering, context lines, and multiple output modes.",
54
+ parameters: {
55
+ type: "object",
56
+ properties: {
57
+ pattern: { type: "string", description: "Regex pattern to search for" },
58
+ path: { type: "string", description: "File or directory to search in" },
59
+ glob: { type: "string", description: "Glob to filter files" },
60
+ type: { type: "string", description: "File type filter (js, ts, py, etc.)" },
61
+ output_mode: { type: "string", description: "Output mode: content, files_with_matches, count", enum: ["content", "files_with_matches", "count"] },
62
+ context: { type: "number", description: "Context lines before and after each match" },
63
+ case_insensitive: { type: "boolean", description: "Case insensitive search" },
64
+ limit: { type: "number", description: "Maximum number of results" },
65
+ },
66
+ required: ["pattern"],
67
+ },
68
+ source: "builtin",
69
+ async execute(params, context) {
70
+ const { pattern: rawPattern, path: searchPath, glob: globFilter, type: typeFilter, output_mode = "files_with_matches", context: ctxLines = 0, case_insensitive = false, limit, } = params;
71
+ const rootPath = searchPath ? resolve(context.workingDir, searchPath) : context.workingDir;
72
+ if (!existsSync(rootPath)) {
73
+ return { output: "", error: `Path not found: ${rootPath}` };
74
+ }
75
+ let regex;
76
+ try {
77
+ regex = new RegExp(rawPattern, case_insensitive ? "gi" : "g");
78
+ }
79
+ catch (err) {
80
+ return { output: "", error: `Invalid regex: ${String(err)}` };
81
+ }
82
+ const typeExts = typeFilter ? TYPE_EXTENSIONS[typeFilter] : null;
83
+ const filterFn = (filePath) => {
84
+ if (typeExts && !typeExts.includes(extname(filePath)))
85
+ return false;
86
+ if (globFilter && !matchesGlob(filePath, globFilter))
87
+ return false;
88
+ return true;
89
+ };
90
+ const files = [];
91
+ const stat = statSync(rootPath);
92
+ if (stat.isFile()) {
93
+ files.push(rootPath);
94
+ }
95
+ else {
96
+ walkFiles(rootPath, filterFn, files);
97
+ }
98
+ const maxResults = limit ?? MAX_MATCHES;
99
+ let totalMatches = 0;
100
+ const outputParts = [];
101
+ const matchingFiles = [];
102
+ const fileCounts = [];
103
+ for (const file of files) {
104
+ if (totalMatches >= maxResults)
105
+ break;
106
+ let content;
107
+ try {
108
+ const fstat = statSync(file);
109
+ if (fstat.size > MAX_FILE_SIZE)
110
+ continue;
111
+ content = readFileSync(file, "utf-8");
112
+ }
113
+ catch {
114
+ continue;
115
+ }
116
+ const lines = content.split("\n");
117
+ const matchedLineNums = [];
118
+ for (let i = 0; i < lines.length; i++) {
119
+ regex.lastIndex = 0;
120
+ if (regex.test(lines[i])) {
121
+ matchedLineNums.push(i);
122
+ }
123
+ }
124
+ if (matchedLineNums.length === 0)
125
+ continue;
126
+ matchingFiles.push(file);
127
+ fileCounts.push({ file, count: matchedLineNums.length });
128
+ if (output_mode === "content") {
129
+ for (const lineNum of matchedLineNums) {
130
+ if (totalMatches >= maxResults)
131
+ break;
132
+ totalMatches++;
133
+ const startCtx = Math.max(0, lineNum - ctxLines);
134
+ const endCtx = Math.min(lines.length - 1, lineNum + ctxLines);
135
+ if (ctxLines > 0) {
136
+ outputParts.push(`${file}:`);
137
+ for (let i = startCtx; i <= endCtx; i++) {
138
+ const prefix = i === lineNum ? ">" : " ";
139
+ outputParts.push(`${prefix}${i + 1}:${lines[i]}`);
140
+ }
141
+ outputParts.push("--");
142
+ }
143
+ else {
144
+ outputParts.push(`${file}:${lineNum + 1}:${lines[lineNum]}`);
145
+ }
146
+ }
147
+ }
148
+ else {
149
+ totalMatches += matchedLineNums.length;
150
+ }
151
+ }
152
+ switch (output_mode) {
153
+ case "content":
154
+ return { output: outputParts.length > 0 ? outputParts.join("\n") : "No matches found" };
155
+ case "files_with_matches":
156
+ return { output: matchingFiles.length > 0 ? matchingFiles.join("\n") : "No matches found" };
157
+ case "count":
158
+ return {
159
+ output: fileCounts.length > 0
160
+ ? fileCounts.map((f) => `${f.file}: ${f.count}`).join("\n")
161
+ : "No matches found",
162
+ };
163
+ default:
164
+ return { output: matchingFiles.join("\n") };
165
+ }
166
+ },
167
+ };
168
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}