@oharness/engine 0.1.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 (256) hide show
  1. package/dist/agent/agent.d.ts +196 -0
  2. package/dist/agent/agent.js +758 -0
  3. package/dist/agent/agent.js.map +1 -0
  4. package/dist/agent/compaction.d.ts +68 -0
  5. package/dist/agent/compaction.js +179 -0
  6. package/dist/agent/compaction.js.map +1 -0
  7. package/dist/agent/hooks.d.ts +77 -0
  8. package/dist/agent/hooks.js +152 -0
  9. package/dist/agent/hooks.js.map +1 -0
  10. package/dist/agent/memory.d.ts +45 -0
  11. package/dist/agent/memory.js +147 -0
  12. package/dist/agent/memory.js.map +1 -0
  13. package/dist/agent/overflow.d.ts +35 -0
  14. package/dist/agent/overflow.js +69 -0
  15. package/dist/agent/overflow.js.map +1 -0
  16. package/dist/agent/permissions.d.ts +181 -0
  17. package/dist/agent/permissions.js +289 -0
  18. package/dist/agent/permissions.js.map +1 -0
  19. package/dist/agent/prompt.d.ts +25 -0
  20. package/dist/agent/prompt.js +63 -0
  21. package/dist/agent/prompt.js.map +1 -0
  22. package/dist/agent/session.d.ts +108 -0
  23. package/dist/agent/session.js +231 -0
  24. package/dist/agent/session.js.map +1 -0
  25. package/dist/agent/settings.d.ts +37 -0
  26. package/dist/agent/settings.js +113 -0
  27. package/dist/agent/settings.js.map +1 -0
  28. package/dist/agent/skills.d.ts +58 -0
  29. package/dist/agent/skills.js +225 -0
  30. package/dist/agent/skills.js.map +1 -0
  31. package/dist/agent/store.d.ts +308 -0
  32. package/dist/agent/store.js +596 -0
  33. package/dist/agent/store.js.map +1 -0
  34. package/dist/agent/subagent.d.ts +44 -0
  35. package/dist/agent/subagent.js +138 -0
  36. package/dist/agent/subagent.js.map +1 -0
  37. package/dist/agent/titles.d.ts +8 -0
  38. package/dist/agent/titles.js +23 -0
  39. package/dist/agent/titles.js.map +1 -0
  40. package/dist/agent/workspace.d.ts +60 -0
  41. package/dist/agent/workspace.js +156 -0
  42. package/dist/agent/workspace.js.map +1 -0
  43. package/dist/artifacts/publish.d.ts +94 -0
  44. package/dist/artifacts/publish.js +104 -0
  45. package/dist/artifacts/publish.js.map +1 -0
  46. package/dist/artifacts/store.d.ts +324 -0
  47. package/dist/artifacts/store.js +500 -0
  48. package/dist/artifacts/store.js.map +1 -0
  49. package/dist/auth/index.d.ts +13 -0
  50. package/dist/auth/index.js +10 -0
  51. package/dist/auth/index.js.map +1 -0
  52. package/dist/auth/manager.d.ts +83 -0
  53. package/dist/auth/manager.js +266 -0
  54. package/dist/auth/manager.js.map +1 -0
  55. package/dist/auth/oauth.d.ts +83 -0
  56. package/dist/auth/oauth.js +327 -0
  57. package/dist/auth/oauth.js.map +1 -0
  58. package/dist/auth/providers/account.d.ts +59 -0
  59. package/dist/auth/providers/account.js +282 -0
  60. package/dist/auth/providers/account.js.map +1 -0
  61. package/dist/auth/providers/anthropic.d.ts +24 -0
  62. package/dist/auth/providers/anthropic.js +209 -0
  63. package/dist/auth/providers/anthropic.js.map +1 -0
  64. package/dist/auth/providers/generic.d.ts +57 -0
  65. package/dist/auth/providers/generic.js +155 -0
  66. package/dist/auth/providers/generic.js.map +1 -0
  67. package/dist/auth/providers/official.d.ts +3 -0
  68. package/dist/auth/providers/official.js +90 -0
  69. package/dist/auth/providers/official.js.map +1 -0
  70. package/dist/auth/providers/ottoport.d.ts +3 -0
  71. package/dist/auth/providers/ottoport.js +60 -0
  72. package/dist/auth/providers/ottoport.js.map +1 -0
  73. package/dist/auth/store.d.ts +22 -0
  74. package/dist/auth/store.js +138 -0
  75. package/dist/auth/store.js.map +1 -0
  76. package/dist/auth/types.d.ts +167 -0
  77. package/dist/auth/types.js +16 -0
  78. package/dist/auth/types.js.map +1 -0
  79. package/dist/config.d.ts +197 -0
  80. package/dist/config.js +195 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/core/errors.d.ts +46 -0
  83. package/dist/core/errors.js +83 -0
  84. package/dist/core/errors.js.map +1 -0
  85. package/dist/core/tokens.d.ts +12 -0
  86. package/dist/core/tokens.js +56 -0
  87. package/dist/core/tokens.js.map +1 -0
  88. package/dist/core/types.d.ts +91 -0
  89. package/dist/core/types.js +49 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/harness.d.ts +302 -0
  92. package/dist/harness.js +695 -0
  93. package/dist/harness.js.map +1 -0
  94. package/dist/index.d.ts +32 -0
  95. package/dist/index.js +21 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/mcp/client.d.ts +55 -0
  98. package/dist/mcp/client.js +199 -0
  99. package/dist/mcp/client.js.map +1 -0
  100. package/dist/mcp/index.d.ts +13 -0
  101. package/dist/mcp/index.js +8 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/dist/mcp/manager.d.ts +77 -0
  104. package/dist/mcp/manager.js +325 -0
  105. package/dist/mcp/manager.js.map +1 -0
  106. package/dist/mcp/oauth.d.ts +63 -0
  107. package/dist/mcp/oauth.js +302 -0
  108. package/dist/mcp/oauth.js.map +1 -0
  109. package/dist/mcp/protocol.d.ts +130 -0
  110. package/dist/mcp/protocol.js +14 -0
  111. package/dist/mcp/protocol.js.map +1 -0
  112. package/dist/mcp/registry.d.ts +52 -0
  113. package/dist/mcp/registry.js +100 -0
  114. package/dist/mcp/registry.js.map +1 -0
  115. package/dist/mcp/registry.json +293 -0
  116. package/dist/mcp/secrets.d.ts +20 -0
  117. package/dist/mcp/secrets.js +75 -0
  118. package/dist/mcp/secrets.js.map +1 -0
  119. package/dist/mcp/transport.d.ts +51 -0
  120. package/dist/mcp/transport.js +158 -0
  121. package/dist/mcp/transport.js.map +1 -0
  122. package/dist/paths.d.ts +37 -0
  123. package/dist/paths.js +63 -0
  124. package/dist/paths.js.map +1 -0
  125. package/dist/plugins.d.ts +55 -0
  126. package/dist/plugins.js +201 -0
  127. package/dist/plugins.js.map +1 -0
  128. package/dist/providers/builtin.d.ts +23 -0
  129. package/dist/providers/builtin.js +141 -0
  130. package/dist/providers/builtin.js.map +1 -0
  131. package/dist/providers/catalog.d.ts +129 -0
  132. package/dist/providers/catalog.js +254 -0
  133. package/dist/providers/catalog.js.map +1 -0
  134. package/dist/providers/catalog.json +472 -0
  135. package/dist/providers/discovery.d.ts +16 -0
  136. package/dist/providers/discovery.js +161 -0
  137. package/dist/providers/discovery.js.map +1 -0
  138. package/dist/providers/http.d.ts +24 -0
  139. package/dist/providers/http.js +139 -0
  140. package/dist/providers/http.js.map +1 -0
  141. package/dist/providers/index.d.ts +10 -0
  142. package/dist/providers/index.js +8 -0
  143. package/dist/providers/index.js.map +1 -0
  144. package/dist/providers/piai.d.ts +124 -0
  145. package/dist/providers/piai.js +551 -0
  146. package/dist/providers/piai.js.map +1 -0
  147. package/dist/providers/registry.d.ts +65 -0
  148. package/dist/providers/registry.js +195 -0
  149. package/dist/providers/registry.js.map +1 -0
  150. package/dist/providers/resilient.d.ts +46 -0
  151. package/dist/providers/resilient.js +117 -0
  152. package/dist/providers/resilient.js.map +1 -0
  153. package/dist/providers/types.d.ts +182 -0
  154. package/dist/providers/types.js +50 -0
  155. package/dist/providers/types.js.map +1 -0
  156. package/dist/schedule/cron.d.ts +35 -0
  157. package/dist/schedule/cron.js +125 -0
  158. package/dist/schedule/cron.js.map +1 -0
  159. package/dist/schedule/scheduler.d.ts +87 -0
  160. package/dist/schedule/scheduler.js +237 -0
  161. package/dist/schedule/scheduler.js.map +1 -0
  162. package/dist/storage/kv.d.ts +56 -0
  163. package/dist/storage/kv.js +173 -0
  164. package/dist/storage/kv.js.map +1 -0
  165. package/dist/storage/migrate.d.ts +11 -0
  166. package/dist/storage/migrate.js +93 -0
  167. package/dist/storage/migrate.js.map +1 -0
  168. package/dist/storage/project.d.ts +9 -0
  169. package/dist/storage/project.js +57 -0
  170. package/dist/storage/project.js.map +1 -0
  171. package/dist/storage/records.d.ts +32 -0
  172. package/dist/storage/records.js +48 -0
  173. package/dist/storage/records.js.map +1 -0
  174. package/dist/sync/client.d.ts +79 -0
  175. package/dist/sync/client.js +118 -0
  176. package/dist/sync/client.js.map +1 -0
  177. package/dist/sync/mirror.d.ts +85 -0
  178. package/dist/sync/mirror.js +389 -0
  179. package/dist/sync/mirror.js.map +1 -0
  180. package/dist/sync/protocol.d.ts +67 -0
  181. package/dist/sync/protocol.js +16 -0
  182. package/dist/sync/protocol.js.map +1 -0
  183. package/dist/sync/settings.d.ts +56 -0
  184. package/dist/sync/settings.js +60 -0
  185. package/dist/sync/settings.js.map +1 -0
  186. package/dist/tools/builtin/artifact.d.ts +16 -0
  187. package/dist/tools/builtin/artifact.js +134 -0
  188. package/dist/tools/builtin/artifact.js.map +1 -0
  189. package/dist/tools/builtin/bash.d.ts +3 -0
  190. package/dist/tools/builtin/bash.js +142 -0
  191. package/dist/tools/builtin/bash.js.map +1 -0
  192. package/dist/tools/builtin/fs.d.ts +19 -0
  193. package/dist/tools/builtin/fs.js +280 -0
  194. package/dist/tools/builtin/fs.js.map +1 -0
  195. package/dist/tools/builtin/index.d.ts +22 -0
  196. package/dist/tools/builtin/index.js +42 -0
  197. package/dist/tools/builtin/index.js.map +1 -0
  198. package/dist/tools/builtin/mcp-resource.d.ts +3 -0
  199. package/dist/tools/builtin/mcp-resource.js +220 -0
  200. package/dist/tools/builtin/mcp-resource.js.map +1 -0
  201. package/dist/tools/builtin/memory.d.ts +10 -0
  202. package/dist/tools/builtin/memory.js +76 -0
  203. package/dist/tools/builtin/memory.js.map +1 -0
  204. package/dist/tools/builtin/recall.d.ts +13 -0
  205. package/dist/tools/builtin/recall.js +163 -0
  206. package/dist/tools/builtin/recall.js.map +1 -0
  207. package/dist/tools/builtin/search.d.ts +3 -0
  208. package/dist/tools/builtin/search.js +240 -0
  209. package/dist/tools/builtin/search.js.map +1 -0
  210. package/dist/tools/builtin/skill.d.ts +10 -0
  211. package/dist/tools/builtin/skill.js +46 -0
  212. package/dist/tools/builtin/skill.js.map +1 -0
  213. package/dist/tools/builtin/task.d.ts +9 -0
  214. package/dist/tools/builtin/task.js +68 -0
  215. package/dist/tools/builtin/task.js.map +1 -0
  216. package/dist/tools/builtin/todo.d.ts +20 -0
  217. package/dist/tools/builtin/todo.js +63 -0
  218. package/dist/tools/builtin/todo.js.map +1 -0
  219. package/dist/tools/define.d.ts +19 -0
  220. package/dist/tools/define.js +39 -0
  221. package/dist/tools/define.js.map +1 -0
  222. package/dist/tools/index.d.ts +7 -0
  223. package/dist/tools/index.js +5 -0
  224. package/dist/tools/index.js.map +1 -0
  225. package/dist/tools/registry.d.ts +39 -0
  226. package/dist/tools/registry.js +101 -0
  227. package/dist/tools/registry.js.map +1 -0
  228. package/dist/tools/types.d.ts +112 -0
  229. package/dist/tools/types.js +22 -0
  230. package/dist/tools/types.js.map +1 -0
  231. package/dist/util/id.d.ts +9 -0
  232. package/dist/util/id.js +19 -0
  233. package/dist/util/id.js.map +1 -0
  234. package/dist/util/json.d.ts +25 -0
  235. package/dist/util/json.js +100 -0
  236. package/dist/util/json.js.map +1 -0
  237. package/dist/util/jwt.d.ts +74 -0
  238. package/dist/util/jwt.js +177 -0
  239. package/dist/util/jwt.js.map +1 -0
  240. package/dist/util/logger.d.ts +13 -0
  241. package/dist/util/logger.js +59 -0
  242. package/dist/util/logger.js.map +1 -0
  243. package/dist/util/queue.d.ts +26 -0
  244. package/dist/util/queue.js +106 -0
  245. package/dist/util/queue.js.map +1 -0
  246. package/dist/util/schema.d.ts +17 -0
  247. package/dist/util/schema.js +98 -0
  248. package/dist/util/schema.js.map +1 -0
  249. package/dist/util/shell.d.ts +20 -0
  250. package/dist/util/shell.js +24 -0
  251. package/dist/util/shell.js.map +1 -0
  252. package/official.json +4 -0
  253. package/package.json +38 -0
  254. package/skills/artifact-authoring/SKILL.md +81 -0
  255. package/skills/canvas/SKILL.md +85 -0
  256. package/skills/skill-authoring/SKILL.md +85 -0
@@ -0,0 +1,280 @@
1
+ import { constants } from "node:fs";
2
+ import { access, mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { expandHome, within } from "../../paths.js";
6
+ import { defineTool } from "../define.js";
7
+ import { toolError, toolText } from "../types.js";
8
+ const MAX_READ_BYTES = 400_000;
9
+ const DEFAULT_READ_LINES = 2_000;
10
+ const IMAGE_TYPES = {
11
+ ".png": "image/png",
12
+ ".jpg": "image/jpeg",
13
+ ".jpeg": "image/jpeg",
14
+ ".gif": "image/gif",
15
+ ".webp": "image/webp",
16
+ };
17
+ /**
18
+ * Records the mtime each file had when the agent last read it. `edit` and
19
+ * `write` refuse to touch a file whose mtime has moved since — the cheapest
20
+ * guard against an agent clobbering work it never saw.
21
+ *
22
+ * We store the file's own mtime rather than a wall-clock timestamp: mtimes
23
+ * carry sub-millisecond precision on modern filesystems, so comparing them
24
+ * against `Date.now()` reports a file written and read in the same
25
+ * millisecond as stale.
26
+ */
27
+ const READ_TIMES = "fs:readMtimes";
28
+ function readMtimes(ctx) {
29
+ let map = ctx.host.state.get(READ_TIMES);
30
+ if (!map) {
31
+ map = new Map();
32
+ ctx.host.state.set(READ_TIMES, map);
33
+ }
34
+ return map;
35
+ }
36
+ /** Remember the file's current mtime as the agent's last-seen version. */
37
+ async function markSeen(ctx, target) {
38
+ try {
39
+ const info = await stat(target);
40
+ readMtimes(ctx).set(target, info.mtimeMs);
41
+ }
42
+ catch {
43
+ readMtimes(ctx).delete(target);
44
+ }
45
+ }
46
+ /**
47
+ * Resolve a model-supplied path and keep it inside the roots the agent is
48
+ * allowed to touch.
49
+ *
50
+ * Defers to the host, which owns the workspace policy and therefore knows
51
+ * about roots beyond the working directory — the user-level skills directory
52
+ * the skill registry loads from, for one, which this used to refuse to read or
53
+ * write while the harness happily loaded skills out of it.
54
+ *
55
+ * The fallback is for a host without a policy: confine to the working
56
+ * directory, which is what this did unconditionally before.
57
+ */
58
+ export function resolvePath(ctx, input, access = "read") {
59
+ if (ctx.host.resolvePath)
60
+ return ctx.host.resolvePath(input, access);
61
+ const resolved = path.resolve(ctx.cwd, expandHome(input));
62
+ if (!within([path.resolve(ctx.cwd)], resolved)) {
63
+ throw new Error(`path escapes the working directory: ${input} (resolved to ${resolved})`);
64
+ }
65
+ return resolved;
66
+ }
67
+ export const readTool = defineTool({
68
+ name: "read",
69
+ description: "Read a file from the filesystem. Returns line-numbered content. Use `offset` and `limit` for large files; images are returned as image content. You must read a file before editing it.",
70
+ readOnly: true,
71
+ parameters: z.object({
72
+ path: z.string().describe("Path to the file, absolute or relative to the working directory"),
73
+ offset: z.number().int().min(1).optional().describe("1-based line to start from"),
74
+ limit: z.number().int().min(1).optional().describe("Maximum number of lines to return"),
75
+ }),
76
+ renderTitle: (input) => `Read(${input.path})`,
77
+ async execute(input, ctx) {
78
+ let target;
79
+ try {
80
+ target = resolvePath(ctx, input.path);
81
+ }
82
+ catch (err) {
83
+ return toolError(String(err instanceof Error ? err.message : err));
84
+ }
85
+ let info;
86
+ try {
87
+ info = await stat(target);
88
+ }
89
+ catch {
90
+ return toolError(`file not found: ${input.path}`);
91
+ }
92
+ if (info.isDirectory()) {
93
+ const entries = await readdir(target, { withFileTypes: true });
94
+ const listing = entries
95
+ .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))
96
+ .sort()
97
+ .join("\n");
98
+ return toolText(`${input.path} is a directory:\n${listing}`);
99
+ }
100
+ const ext = path.extname(target).toLowerCase();
101
+ const mime = IMAGE_TYPES[ext];
102
+ if (mime) {
103
+ const data = await readFile(target);
104
+ readMtimes(ctx).set(target, info.mtimeMs);
105
+ return {
106
+ content: [
107
+ { type: "text", text: `Image ${input.path} (${info.size} bytes)` },
108
+ { type: "image", mimeType: mime, data: data.toString("base64") },
109
+ ],
110
+ };
111
+ }
112
+ if (info.size > MAX_READ_BYTES && !input.limit) {
113
+ return toolError(`file is ${info.size} bytes, which is too large to read at once. Re-read with \`offset\`/\`limit\`, or use grep to find the relevant section.`);
114
+ }
115
+ const raw = await readFile(target, "utf8");
116
+ readMtimes(ctx).set(target, info.mtimeMs);
117
+ const lines = raw.split("\n");
118
+ const start = (input.offset ?? 1) - 1;
119
+ const end = Math.min(lines.length, start + (input.limit ?? DEFAULT_READ_LINES));
120
+ if (start >= lines.length && lines.length > 0) {
121
+ return toolError(`offset ${input.offset} is past the end of the file (${lines.length} lines)`);
122
+ }
123
+ const width = String(end).length;
124
+ const body = lines
125
+ .slice(start, end)
126
+ .map((line, i) => `${String(start + i + 1).padStart(width)}\t${line}`)
127
+ .join("\n");
128
+ const truncated = end < lines.length;
129
+ const footer = truncated
130
+ ? `\n\n… ${lines.length - end} more lines. Continue with offset ${end + 1}.`
131
+ : "";
132
+ return toolText(body === "" ? "(empty file)" : body + footer, {
133
+ lines: lines.length,
134
+ truncated,
135
+ });
136
+ },
137
+ });
138
+ export const writeTool = defineTool({
139
+ name: "write",
140
+ description: "Write a file, creating parent directories as needed. Overwrites existing content — read the file first if it already exists.",
141
+ parameters: z.object({
142
+ path: z.string().describe("Path to write"),
143
+ content: z.string().describe("Full file content"),
144
+ }),
145
+ renderTitle: (input) => `Write(${input.path})`,
146
+ async execute(input, ctx) {
147
+ let target;
148
+ try {
149
+ target = resolvePath(ctx, input.path, "write");
150
+ }
151
+ catch (err) {
152
+ return toolError(String(err instanceof Error ? err.message : err));
153
+ }
154
+ const exists = await pathExists(target);
155
+ if (exists) {
156
+ const stale = await staleness(target, readMtimes(ctx).get(target));
157
+ if (stale)
158
+ return toolError(stale);
159
+ }
160
+ await mkdir(path.dirname(target), { recursive: true });
161
+ await writeFile(target, input.content, "utf8");
162
+ await markSeen(ctx, target);
163
+ const lines = input.content.split("\n").length;
164
+ return toolText(`${exists ? "Updated" : "Created"} ${input.path} (${lines} lines)`);
165
+ },
166
+ });
167
+ export const editTool = defineTool({
168
+ name: "edit",
169
+ description: "Replace an exact string in a file. `oldString` must appear exactly once unless `replaceAll` is set. Read the file first — the edit is rejected if the file changed since your last read.",
170
+ parameters: z.object({
171
+ path: z.string().describe("File to edit"),
172
+ oldString: z.string().describe("Exact text to replace, including indentation"),
173
+ newString: z.string().describe("Replacement text"),
174
+ replaceAll: z.boolean().optional().describe("Replace every occurrence instead of requiring uniqueness"),
175
+ }),
176
+ renderTitle: (input) => `Edit(${input.path})`,
177
+ async execute(input, ctx) {
178
+ let target;
179
+ try {
180
+ target = resolvePath(ctx, input.path, "write");
181
+ }
182
+ catch (err) {
183
+ return toolError(String(err instanceof Error ? err.message : err));
184
+ }
185
+ if (!(await pathExists(target)))
186
+ return toolError(`file not found: ${input.path}`);
187
+ const lastRead = readMtimes(ctx).get(target);
188
+ if (lastRead === undefined) {
189
+ return toolError(`read ${input.path} before editing it`);
190
+ }
191
+ const stale = await staleness(target, lastRead);
192
+ if (stale)
193
+ return toolError(stale);
194
+ if (input.oldString === input.newString) {
195
+ return toolError("oldString and newString are identical");
196
+ }
197
+ const original = await readFile(target, "utf8");
198
+ const occurrences = countOccurrences(original, input.oldString);
199
+ if (occurrences === 0) {
200
+ return toolError(`oldString not found in ${input.path}. Whitespace and indentation must match exactly.`);
201
+ }
202
+ if (occurrences > 1 && !input.replaceAll) {
203
+ return toolError(`oldString appears ${occurrences} times in ${input.path}. Add more surrounding context, or set replaceAll.`);
204
+ }
205
+ const updated = input.replaceAll
206
+ ? original.split(input.oldString).join(input.newString)
207
+ : original.replace(input.oldString, input.newString);
208
+ await writeFile(target, updated, "utf8");
209
+ await markSeen(ctx, target);
210
+ return toolText(`Edited ${input.path} (${occurrences} replacement${occurrences === 1 ? "" : "s"})`);
211
+ },
212
+ });
213
+ export const listTool = defineTool({
214
+ name: "list",
215
+ description: "List the entries of a directory. Directories are suffixed with '/'.",
216
+ readOnly: true,
217
+ parameters: z.object({
218
+ path: z.string().optional().describe("Directory to list; defaults to the working directory"),
219
+ }),
220
+ renderTitle: (input) => `List(${input.path ?? "."})`,
221
+ async execute(input, ctx) {
222
+ let target;
223
+ try {
224
+ target = resolvePath(ctx, input.path ?? ".");
225
+ }
226
+ catch (err) {
227
+ return toolError(String(err instanceof Error ? err.message : err));
228
+ }
229
+ try {
230
+ const entries = await readdir(target, { withFileTypes: true });
231
+ if (entries.length === 0)
232
+ return toolText("(empty directory)");
233
+ const lines = entries
234
+ .map((e) => (e.isDirectory() ? `${e.name}/` : e.name))
235
+ .sort((a, b) => a.localeCompare(b));
236
+ return toolText(lines.join("\n"), { count: entries.length });
237
+ }
238
+ catch {
239
+ return toolError(`not a directory: ${input.path ?? "."}`);
240
+ }
241
+ },
242
+ });
243
+ // ---------------------------------------------------------------------------
244
+ async function pathExists(target) {
245
+ try {
246
+ await access(target, constants.F_OK);
247
+ return true;
248
+ }
249
+ catch {
250
+ return false;
251
+ }
252
+ }
253
+ /** Returns an error message if the file changed since the agent last saw it. */
254
+ async function staleness(target, seenMtime) {
255
+ if (seenMtime === undefined)
256
+ return null;
257
+ try {
258
+ const info = await stat(target);
259
+ if (info.mtimeMs > seenMtime) {
260
+ return `${path.basename(target)} changed on disk since you read it. Read it again before writing.`;
261
+ }
262
+ }
263
+ catch {
264
+ // A file that vanished is handled by the caller's existence check.
265
+ }
266
+ return null;
267
+ }
268
+ function countOccurrences(haystack, needle) {
269
+ if (needle === "")
270
+ return 0;
271
+ let count = 0;
272
+ let index = haystack.indexOf(needle);
273
+ while (index !== -1) {
274
+ count++;
275
+ index = haystack.indexOf(needle, index + needle.length);
276
+ }
277
+ return count;
278
+ }
279
+ export const fileTools = [readTool, writeTool, editTool, listTool];
280
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/tools/builtin/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Tool } from "../types.ts";
2
+ export { bashTool } from "./bash.ts";
3
+ export { artifactTool, artifactReadTool, artifactTools, ARTIFACT_METADATA_KEY } from "./artifact.ts";
4
+ export { readTool, writeTool, editTool, listTool, fileTools, resolvePath } from "./fs.ts";
5
+ export { globTool, grepTool, searchTools } from "./search.ts";
6
+ export { todoTool, getTodos, renderTodos } from "./todo.ts";
7
+ export { recallTool, ARCHIVE_READER } from "./recall.ts";
8
+ export type { ArchiveReader } from "./recall.ts";
9
+ export type { TodoItem } from "./todo.ts";
10
+ export { createTaskTool } from "./task.ts";
11
+ /**
12
+ * The default tool set. `task` is not here because it must be constructed
13
+ * against a live host to describe the configured subagent types.
14
+ */
15
+ export declare const builtinTools: Tool[];
16
+ /**
17
+ * Read-only subset, suitable for exploration-only subagents.
18
+ *
19
+ * `artifact_read` is here but `artifact_write` is not: reading back what the
20
+ * parent made is exploration, creating a surface the user sees is not.
21
+ */
22
+ export declare const readOnlyTools: Tool[];
@@ -0,0 +1,42 @@
1
+ import { bashTool } from "./bash.js";
2
+ import { editTool, fileTools, listTool, readTool, writeTool } from "./fs.js";
3
+ import { globTool, grepTool, searchTools } from "./search.js";
4
+ import { recallTool } from "./recall.js";
5
+ import { todoTool } from "./todo.js";
6
+ import { artifactReadTool, artifactTool, artifactTools } from "./artifact.js";
7
+ export { bashTool } from "./bash.js";
8
+ export { artifactTool, artifactReadTool, artifactTools, ARTIFACT_METADATA_KEY } from "./artifact.js";
9
+ export { readTool, writeTool, editTool, listTool, fileTools, resolvePath } from "./fs.js";
10
+ export { globTool, grepTool, searchTools } from "./search.js";
11
+ export { todoTool, getTodos, renderTodos } from "./todo.js";
12
+ export { recallTool, ARCHIVE_READER } from "./recall.js";
13
+ export { createTaskTool } from "./task.js";
14
+ /**
15
+ * The default tool set. `task` is not here because it must be constructed
16
+ * against a live host to describe the configured subagent types.
17
+ */
18
+ export const builtinTools = [
19
+ ...fileTools,
20
+ ...searchTools,
21
+ bashTool,
22
+ recallTool,
23
+ todoTool,
24
+ ...artifactTools,
25
+ ];
26
+ /**
27
+ * Read-only subset, suitable for exploration-only subagents.
28
+ *
29
+ * `artifact_read` is here but `artifact_write` is not: reading back what the
30
+ * parent made is exploration, creating a surface the user sees is not.
31
+ */
32
+ export const readOnlyTools = [
33
+ readTool,
34
+ listTool,
35
+ globTool,
36
+ grepTool,
37
+ recallTool,
38
+ artifactReadTool,
39
+ ];
40
+ void writeTool;
41
+ void editTool;
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,GAAG,SAAS;IACZ,GAAG,WAAW;IACd,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,GAAG,aAAa;CACjB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,gBAAgB;CACjB,CAAC;AAEF,KAAK,SAAS,CAAC;AACf,KAAK,QAAQ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpManager } from "../../mcp/manager.ts";
2
+ import type { Tool } from "../types.ts";
3
+ export declare function createMcpResourceTools(mcp: McpManager): Tool[];
@@ -0,0 +1,220 @@
1
+ import { z } from "zod";
2
+ import { defineTool } from "../define.js";
3
+ import { toolError, toolText } from "../types.js";
4
+ /**
5
+ * MCP servers expose two things beyond tools: **resources** (documents the
6
+ * server can hand over — files, schemas, dashboards) and **prompts** (canned
7
+ * instruction templates).
8
+ *
9
+ * The client could already speak both, but nothing surfaced them, so the agent
10
+ * had no way to read an MCP resource at all. These tools close that gap.
11
+ */
12
+ const MAX_CHARS = 30_000;
13
+ /** URIs are namespaced `server:uri` so two servers can serve the same path. */
14
+ function splitRef(ref) {
15
+ // Resource URIs are themselves schemed (`file://`, `https://`), so only a
16
+ // prefix that is not part of a scheme counts as a server name.
17
+ const match = /^([A-Za-z0-9_-]+):(?!\/\/)(.+)$/.exec(ref);
18
+ return match ? { server: match[1], uri: match[2] } : { uri: ref };
19
+ }
20
+ export function createMcpResourceTools(mcp) {
21
+ const listTool = defineTool({
22
+ name: "mcp_list_resources",
23
+ readOnly: true,
24
+ description: "List the documents exposed by connected MCP servers — files, schemas, records the " +
25
+ "server can provide. Returns URIs to pass to `mcp_read_resource`. Use this before " +
26
+ "guessing at a URI.",
27
+ parameters: z.object({
28
+ server: z.string().optional().describe("Limit to one server; omit to list all"),
29
+ }),
30
+ renderTitle: (input) => `McpResources(${input.server ?? "all"})`,
31
+ async execute(input) {
32
+ const servers = mcp
33
+ .status()
34
+ .filter((s) => s.connected && (!input.server || s.name === input.server));
35
+ if (servers.length === 0) {
36
+ return toolText(input.server
37
+ ? `No connected MCP server named "${input.server}".`
38
+ : "No MCP servers are connected.");
39
+ }
40
+ const lines = [];
41
+ for (const status of servers) {
42
+ const client = mcp.client(status.name);
43
+ if (!client)
44
+ continue;
45
+ let resources;
46
+ try {
47
+ resources = await client.listResources();
48
+ }
49
+ catch (err) {
50
+ // One broken server should not hide the others' resources.
51
+ lines.push(`${status.name}: (listing failed — ${String(err)})`);
52
+ continue;
53
+ }
54
+ if (resources.length === 0)
55
+ continue;
56
+ lines.push(`${status.name}:`);
57
+ for (const resource of resources) {
58
+ const label = resource.name ?? resource.title ?? "";
59
+ const mime = resource.mimeType ? ` [${resource.mimeType}]` : "";
60
+ lines.push(` ${status.name}:${resource.uri}${mime}${label ? ` — ${label}` : ""}`);
61
+ if (resource.description)
62
+ lines.push(` ${resource.description}`);
63
+ }
64
+ }
65
+ return lines.length === 0
66
+ ? toolText("No MCP server exposes any resources.")
67
+ : toolText(lines.join("\n"), { servers: servers.length });
68
+ },
69
+ });
70
+ const readTool = defineTool({
71
+ name: "mcp_read_resource",
72
+ readOnly: true,
73
+ description: "Read a document from an MCP server. Pass a URI from `mcp_list_resources`, " +
74
+ "optionally prefixed with the server name (`docs:file:///spec.md`).",
75
+ parameters: z.object({
76
+ uri: z.string().describe("Resource URI, optionally prefixed `server:`"),
77
+ server: z.string().optional().describe("Server name, if not in the URI"),
78
+ }),
79
+ renderTitle: (input) => `McpRead(${input.uri})`,
80
+ async execute(input) {
81
+ const parsed = splitRef(input.uri);
82
+ const serverName = input.server ?? parsed.server;
83
+ // Without a server name we would have to guess which server owns the
84
+ // URI; asking is better than reading the wrong document.
85
+ const candidates = serverName
86
+ ? [serverName]
87
+ : mcp.status().filter((s) => s.connected).map((s) => s.name);
88
+ if (candidates.length === 0)
89
+ return toolError("No MCP servers are connected.");
90
+ if (!serverName && candidates.length > 1) {
91
+ return toolError(`Several servers are connected (${candidates.join(", ")}). ` +
92
+ `Prefix the URI with a server name, e.g. "${candidates[0]}:${parsed.uri}".`);
93
+ }
94
+ const name = candidates[0];
95
+ const client = mcp.client(name);
96
+ if (!client)
97
+ return toolError(`No connected MCP server named "${name}".`);
98
+ let contents;
99
+ try {
100
+ contents = await client.readResource(parsed.uri);
101
+ }
102
+ catch (err) {
103
+ return toolError(`Could not read ${parsed.uri} from ${name}: ${err instanceof Error ? err.message : String(err)}`);
104
+ }
105
+ const parts = [];
106
+ let budget = MAX_CHARS;
107
+ let truncated = false;
108
+ for (const item of contents.contents ?? []) {
109
+ if (typeof item.text === "string") {
110
+ const slice = item.text.slice(0, budget);
111
+ if (slice.length < item.text.length)
112
+ truncated = true;
113
+ parts.push(slice);
114
+ budget -= slice.length;
115
+ }
116
+ else if (item.blob) {
117
+ // Binary payloads are base64; dumping them into the transcript is
118
+ // never what the caller wanted.
119
+ parts.push(`[binary ${item.mimeType ?? "content"}, ${item.blob.length} base64 chars]`);
120
+ }
121
+ if (budget <= 0) {
122
+ truncated = true;
123
+ break;
124
+ }
125
+ }
126
+ if (parts.length === 0)
127
+ return toolText(`${parsed.uri} is empty.`);
128
+ return toolText(parts.join("\n\n") + (truncated ? "\n\n… truncated." : ""), { server: name, uri: parsed.uri, truncated });
129
+ },
130
+ });
131
+ const promptTool = defineTool({
132
+ name: "mcp_prompt",
133
+ readOnly: true,
134
+ description: "List or fetch the prompt templates an MCP server provides. Call with no arguments " +
135
+ "to see what exists, then with a name to get the template text.",
136
+ parameters: z.object({
137
+ name: z.string().optional().describe("Prompt to fetch; omit to list"),
138
+ server: z.string().optional().describe("Limit to one server"),
139
+ arguments: z
140
+ .record(z.string(), z.string())
141
+ .optional()
142
+ .describe("Arguments to fill the template with"),
143
+ }),
144
+ renderTitle: (input) => (input.name ? `McpPrompt(${input.name})` : "McpPrompt(list)"),
145
+ async execute(input) {
146
+ const servers = mcp
147
+ .status()
148
+ .filter((s) => s.connected && (!input.server || s.name === input.server));
149
+ if (servers.length === 0)
150
+ return toolText("No MCP servers are connected.");
151
+ if (!input.name) {
152
+ const lines = [];
153
+ for (const status of servers) {
154
+ const client = mcp.client(status.name);
155
+ if (!client)
156
+ continue;
157
+ const prompts = await client.listPrompts().catch(() => []);
158
+ if (prompts.length === 0)
159
+ continue;
160
+ lines.push(`${status.name}:`);
161
+ for (const prompt of prompts) {
162
+ const args = prompt.arguments?.length
163
+ ? ` (${prompt.arguments.map((a) => (a.required ? a.name : `${a.name}?`)).join(", ")})`
164
+ : "";
165
+ lines.push(` ${prompt.name}${args}`);
166
+ if (prompt.description)
167
+ lines.push(` ${prompt.description}`);
168
+ }
169
+ }
170
+ return lines.length === 0
171
+ ? toolText("No MCP server exposes any prompts.")
172
+ : toolText(lines.join("\n"));
173
+ }
174
+ for (const status of servers) {
175
+ const client = mcp.client(status.name);
176
+ if (!client)
177
+ continue;
178
+ const prompts = await client.listPrompts().catch(() => []);
179
+ if (!prompts.some((prompt) => prompt.name === input.name))
180
+ continue;
181
+ try {
182
+ const result = await client.getPrompt(input.name, input.arguments ?? {});
183
+ return toolText(renderPrompt(result), { server: status.name, prompt: input.name });
184
+ }
185
+ catch (err) {
186
+ return toolError(`Could not fetch prompt "${input.name}" from ${status.name}: ${err instanceof Error ? err.message : String(err)}`);
187
+ }
188
+ }
189
+ return toolError(`No MCP server provides a prompt named "${input.name}".`);
190
+ },
191
+ });
192
+ return [listTool, readTool, promptTool];
193
+ }
194
+ /** Flatten an MCP prompt result into text the model can act on. */
195
+ function renderPrompt(result) {
196
+ const lines = [];
197
+ if (result.description)
198
+ lines.push(result.description, "");
199
+ for (const message of result.messages ?? []) {
200
+ const role = message.role ?? "user";
201
+ const content = message.content;
202
+ if (typeof content === "string") {
203
+ lines.push(`[${role}] ${content}`);
204
+ continue;
205
+ }
206
+ if (Array.isArray(content)) {
207
+ for (const block of content) {
208
+ const text = block?.text;
209
+ if (typeof text === "string")
210
+ lines.push(`[${role}] ${text}`);
211
+ }
212
+ continue;
213
+ }
214
+ const text = content?.text;
215
+ if (typeof text === "string")
216
+ lines.push(`[${role}] ${text}`);
217
+ }
218
+ return lines.join("\n").trim() || "(the prompt returned no content)";
219
+ }
220
+ //# sourceMappingURL=mcp-resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-resource.js","sourceRoot":"","sources":["../../../src/tools/builtin/mcp-resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { MemoryStore } from "../../agent/memory.ts";
2
+ import type { Tool } from "../types.ts";
3
+ /**
4
+ * Read and write the agent's durable notes.
5
+ *
6
+ * Split into two tools rather than one with a `mode` argument: writing a note
7
+ * is a decision the model should make deliberately, and a single tool whose
8
+ * behaviour flips on a string is one the model gets wrong under pressure.
9
+ */
10
+ export declare function createMemoryTools(memory: MemoryStore): Tool[];