@treeseed/core 0.8.2 → 0.8.4

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 (133) hide show
  1. package/README.md +7 -11
  2. package/dist/dev-watch.js +1 -1
  3. package/dist/dev.d.ts +2 -4
  4. package/dist/dev.js +4 -124
  5. package/dist/env.yaml +23 -175
  6. package/dist/index.d.ts +0 -4
  7. package/dist/index.js +0 -6
  8. package/dist/scripts/build-dist.js +3 -3
  9. package/dist/scripts/dev-platform.js +1 -7
  10. package/dist/scripts/run-fixture-astro-command.js +25 -51
  11. package/dist/scripts/test-smoke.js +50 -7
  12. package/package.json +5 -78
  13. package/templates/github/deploy-web.workflow.yml +106 -0
  14. package/templates/github/hosted-project.workflow.yml +4 -4
  15. package/dist/agent-runtime.d.ts +0 -17
  16. package/dist/agent-runtime.js +0 -117
  17. package/dist/agent.d.ts +0 -11
  18. package/dist/agent.js +0 -25
  19. package/dist/agents/adapters/execution.d.ts +0 -41
  20. package/dist/agents/adapters/execution.js +0 -73
  21. package/dist/agents/adapters/mutations.d.ts +0 -22
  22. package/dist/agents/adapters/mutations.js +0 -30
  23. package/dist/agents/adapters/notification.d.ts +0 -26
  24. package/dist/agents/adapters/notification.js +0 -46
  25. package/dist/agents/adapters/repository.d.ts +0 -23
  26. package/dist/agents/adapters/repository.js +0 -61
  27. package/dist/agents/adapters/research.d.ts +0 -26
  28. package/dist/agents/adapters/research.js +0 -59
  29. package/dist/agents/adapters/verification.d.ts +0 -36
  30. package/dist/agents/adapters/verification.js +0 -62
  31. package/dist/agents/cli-tools.d.ts +0 -1
  32. package/dist/agents/cli-tools.js +0 -5
  33. package/dist/agents/cli.d.ts +0 -15
  34. package/dist/agents/cli.js +0 -109
  35. package/dist/agents/contracts/messages.d.ts +0 -88
  36. package/dist/agents/contracts/messages.js +0 -138
  37. package/dist/agents/contracts/run.d.ts +0 -21
  38. package/dist/agents/contracts/run.js +0 -0
  39. package/dist/agents/index.d.ts +0 -1
  40. package/dist/agents/index.js +0 -5
  41. package/dist/agents/kernel/agent-kernel.d.ts +0 -51
  42. package/dist/agents/kernel/agent-kernel.js +0 -292
  43. package/dist/agents/kernel/trigger-resolver.d.ts +0 -19
  44. package/dist/agents/kernel/trigger-resolver.js +0 -157
  45. package/dist/agents/registry-helper.d.ts +0 -4
  46. package/dist/agents/registry-helper.js +0 -14
  47. package/dist/agents/registry.d.ts +0 -6
  48. package/dist/agents/registry.js +0 -98
  49. package/dist/agents/runtime-types.d.ts +0 -118
  50. package/dist/agents/runtime-types.js +0 -0
  51. package/dist/agents/spec-loader.d.ts +0 -18
  52. package/dist/agents/spec-loader.js +0 -55
  53. package/dist/agents/spec-normalizer.d.ts +0 -2
  54. package/dist/agents/spec-normalizer.js +0 -327
  55. package/dist/agents/spec-types.d.ts +0 -64
  56. package/dist/agents/spec-types.js +0 -0
  57. package/dist/agents/testing/agents-smoke.d.ts +0 -1
  58. package/dist/agents/testing/agents-smoke.js +0 -32
  59. package/dist/agents/testing/e2e-harness.d.ts +0 -44
  60. package/dist/agents/testing/e2e-harness.js +0 -504
  61. package/dist/api/agent-routes.d.ts +0 -13
  62. package/dist/api/agent-routes.js +0 -327
  63. package/dist/api/app.d.ts +0 -5
  64. package/dist/api/app.js +0 -361
  65. package/dist/api/auth/d1-database.d.ts +0 -3
  66. package/dist/api/auth/d1-database.js +0 -20
  67. package/dist/api/auth/d1-provider.d.ts +0 -79
  68. package/dist/api/auth/d1-provider.js +0 -92
  69. package/dist/api/auth/d1-store.d.ts +0 -114
  70. package/dist/api/auth/d1-store.js +0 -895
  71. package/dist/api/auth/memory-provider.d.ts +0 -77
  72. package/dist/api/auth/memory-provider.js +0 -249
  73. package/dist/api/auth/rbac.d.ts +0 -22
  74. package/dist/api/auth/rbac.js +0 -162
  75. package/dist/api/auth/tokens.d.ts +0 -18
  76. package/dist/api/auth/tokens.js +0 -56
  77. package/dist/api/capabilities.d.ts +0 -9
  78. package/dist/api/capabilities.js +0 -33
  79. package/dist/api/config.d.ts +0 -2
  80. package/dist/api/config.js +0 -77
  81. package/dist/api/http.d.ts +0 -28
  82. package/dist/api/http.js +0 -51
  83. package/dist/api/index.d.ts +0 -9
  84. package/dist/api/index.js +0 -18
  85. package/dist/api/operations-routes.d.ts +0 -11
  86. package/dist/api/operations-routes.js +0 -87
  87. package/dist/api/operations.d.ts +0 -3
  88. package/dist/api/operations.js +0 -26
  89. package/dist/api/project-routes.d.ts +0 -8
  90. package/dist/api/project-routes.js +0 -586
  91. package/dist/api/providers.d.ts +0 -2
  92. package/dist/api/providers.js +0 -62
  93. package/dist/api/railway.d.ts +0 -50
  94. package/dist/api/railway.js +0 -69
  95. package/dist/api/sdk-dispatch.d.ts +0 -5
  96. package/dist/api/sdk-dispatch.js +0 -13
  97. package/dist/api/sdk-routes.d.ts +0 -11
  98. package/dist/api/sdk-routes.js +0 -29
  99. package/dist/api/server.d.ts +0 -2
  100. package/dist/api/server.js +0 -10
  101. package/dist/api/templates.d.ts +0 -3
  102. package/dist/api/templates.js +0 -31
  103. package/dist/api/types.d.ts +0 -231
  104. package/dist/api/types.js +0 -0
  105. package/dist/api.d.ts +0 -1
  106. package/dist/api.js +0 -1
  107. package/dist/railway.d.ts +0 -1
  108. package/dist/railway.js +0 -4
  109. package/dist/services/agents.d.ts +0 -11
  110. package/dist/services/agents.js +0 -48
  111. package/dist/services/common.d.ts +0 -66
  112. package/dist/services/common.js +0 -212
  113. package/dist/services/index.d.ts +0 -6
  114. package/dist/services/index.js +0 -19
  115. package/dist/services/manager.d.ts +0 -267
  116. package/dist/services/manager.js +0 -1368
  117. package/dist/services/remote-runner.d.ts +0 -30
  118. package/dist/services/remote-runner.js +0 -230
  119. package/dist/services/workday-content.d.ts +0 -53
  120. package/dist/services/workday-content.js +0 -190
  121. package/dist/services/workday-manager.d.ts +0 -279
  122. package/dist/services/workday-manager.js +0 -163
  123. package/dist/services/workday-report.d.ts +0 -195
  124. package/dist/services/workday-report.js +0 -17
  125. package/dist/services/workday-start.d.ts +0 -195
  126. package/dist/services/workday-start.js +0 -17
  127. package/dist/services/worker-capacity.d.ts +0 -58
  128. package/dist/services/worker-capacity.js +0 -208
  129. package/dist/services/worker-pool-scaler.d.ts +0 -27
  130. package/dist/services/worker-pool-scaler.js +0 -127
  131. package/dist/services/worker.d.ts +0 -19
  132. package/dist/services/worker.js +0 -436
  133. package/templates/github/deploy.workflow.yml +0 -577
@@ -1,504 +0,0 @@
1
- import { execFile } from "node:child_process";
2
- import { existsSync } from "node:fs";
3
- import { access, cp, mkdtemp, mkdir, readFile, readdir, rm, symlink, writeFile } from "node:fs/promises";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { promisify } from "node:util";
7
- import { createRequire } from "node:module";
8
- import ts from "typescript";
9
- import {
10
- MemoryAgentDatabase
11
- } from "@treeseed/sdk/d1-store";
12
- import { resolveModelDefinition } from "@treeseed/sdk/models";
13
- import { serializeFrontmatterDocument } from "@treeseed/sdk/frontmatter";
14
- import {
15
- } from "@treeseed/sdk/types";
16
- import { runFromRecord } from "@treeseed/sdk/stores/run-store";
17
- const execFileAsync = promisify(execFile);
18
- const require2 = createRequire(import.meta.url);
19
- function nowIso() {
20
- return (/* @__PURE__ */ new Date()).toISOString();
21
- }
22
- function resolveDocsRoot() {
23
- if (process.env.TREESEED_AGENT_FIXTURE_ROOT) {
24
- return path.resolve(process.env.TREESEED_AGENT_FIXTURE_ROOT);
25
- }
26
- const cwd = process.cwd();
27
- const workspaceSdkPackageRoot = path.resolve(cwd, "../sdk");
28
- const installedSdkPackageRoot = path.resolve(path.dirname(require2.resolve("@treeseed/sdk/platform/tenant-config")), "../..");
29
- const candidates = [];
30
- let current = cwd;
31
- while (true) {
32
- candidates.push(
33
- path.resolve(current, ".fixtures", "treeseed-fixtures", "sites", "working-site"),
34
- path.resolve(current, "fixture"),
35
- path.resolve(current, "fixtures", "sites", "working-site")
36
- );
37
- const parent = path.resolve(current, "..");
38
- if (parent === current) {
39
- break;
40
- }
41
- current = parent;
42
- }
43
- candidates.push(
44
- path.resolve(workspaceSdkPackageRoot, ".fixtures", "treeseed-fixtures", "sites", "working-site"),
45
- path.resolve(workspaceSdkPackageRoot, "fixture"),
46
- path.resolve(installedSdkPackageRoot, ".fixtures", "treeseed-fixtures", "sites", "working-site"),
47
- path.resolve(installedSdkPackageRoot, "fixture")
48
- );
49
- for (const candidate of candidates) {
50
- if (existsSync(path.join(candidate, "src", "manifest.yaml"))) {
51
- return candidate;
52
- }
53
- }
54
- throw new Error(
55
- `Unable to resolve an agent smoke fixture root. Checked: ${candidates.join(", ")}`
56
- );
57
- }
58
- function resolveSharedNodeModules(startDir) {
59
- const requiredPackages = ["@treeseed/sdk"];
60
- const checked = [];
61
- let current = startDir;
62
- while (true) {
63
- const candidate = path.join(current, "node_modules");
64
- checked.push(candidate);
65
- if (existsSync(candidate) && requiredPackages.every((packageName) => existsSync(path.join(candidate, ...packageName.split("/"))))) {
66
- return candidate;
67
- }
68
- const parent = path.resolve(current, "..");
69
- if (parent === current) {
70
- break;
71
- }
72
- current = parent;
73
- }
74
- throw new Error(
75
- `Unable to resolve a shared node_modules directory containing ${requiredPackages.join(", ")}. Checked: ${checked.join(", ")}`
76
- );
77
- }
78
- async function resolveWranglerBin() {
79
- if (process.env.TREESEED_AGENT_WRANGLER_BIN) {
80
- return path.resolve(process.env.TREESEED_AGENT_WRANGLER_BIN);
81
- }
82
- try {
83
- const wranglerPackageRoot = path.resolve(path.dirname(require2.resolve("wrangler/package.json")));
84
- const packageJson = JSON.parse(await readFile(path.join(wranglerPackageRoot, "package.json"), "utf8"));
85
- const relativeBin = typeof packageJson.bin === "string" ? packageJson.bin : packageJson.bin?.wrangler;
86
- if (!relativeBin) {
87
- throw new Error("Unable to resolve wrangler binary path from package.json.");
88
- }
89
- return path.resolve(wranglerPackageRoot, relativeBin);
90
- } catch {
91
- const packageLocal = path.resolve(resolveDocsRoot(), "node_modules", ".bin", "wrangler");
92
- await access(packageLocal);
93
- return packageLocal;
94
- }
95
- }
96
- async function runCommand(command, args, cwd) {
97
- await execFileAsync(command, args, {
98
- cwd,
99
- env: process.env,
100
- maxBuffer: 10 * 1024 * 1024
101
- });
102
- }
103
- async function linkWorkspaceNodeModules(sharedNodeModules, repoRoot, localCorePackageRoot) {
104
- const targetRoot = path.join(repoRoot, "node_modules");
105
- await mkdir(targetRoot, { recursive: true });
106
- const entries = await readdir(sharedNodeModules, { withFileTypes: true }).catch(() => []);
107
- for (const entry of entries) {
108
- if (entry.name === "@treeseed") {
109
- const scopedSource = path.join(sharedNodeModules, entry.name);
110
- const scopedTarget = path.join(targetRoot, entry.name);
111
- await mkdir(scopedTarget, { recursive: true });
112
- const scopedEntries = await readdir(scopedSource, { withFileTypes: true }).catch(() => []);
113
- for (const scopedEntry of scopedEntries) {
114
- const sourcePath2 = path.join(scopedSource, scopedEntry.name);
115
- const targetPath2 = path.join(scopedTarget, scopedEntry.name);
116
- if (scopedEntry.name === "agent") {
117
- continue;
118
- }
119
- await symlink(sourcePath2, targetPath2, scopedEntry.isDirectory() ? "dir" : "file").catch(() => void 0);
120
- }
121
- continue;
122
- }
123
- const sourcePath = path.join(sharedNodeModules, entry.name);
124
- const targetPath = path.join(targetRoot, entry.name);
125
- await symlink(sourcePath, targetPath, entry.isDirectory() ? "dir" : "file").catch(() => void 0);
126
- }
127
- const installedCoreRoot = path.join(targetRoot, "@treeseed", "core");
128
- await mkdir(installedCoreRoot, { recursive: true });
129
- await cp(path.join(localCorePackageRoot, "dist"), path.join(installedCoreRoot, "dist"), { recursive: true });
130
- await writeFile(
131
- path.join(installedCoreRoot, "package.json"),
132
- JSON.stringify({
133
- name: "@treeseed/core",
134
- type: "module",
135
- exports: {
136
- ".": "./dist/index.js",
137
- "./runtime-types": "./dist/agents/runtime-types.js",
138
- "./contracts/messages": "./dist/agents/contracts/messages.js",
139
- "./contracts/run": "./dist/agents/contracts/run.js"
140
- }
141
- }, null, 2),
142
- "utf8"
143
- );
144
- }
145
- async function walkFiles(root) {
146
- const entries = await readdir(root, { withFileTypes: true }).catch(() => []);
147
- const nested = await Promise.all(
148
- entries.map(async (entry) => {
149
- const fullPath = path.join(root, entry.name);
150
- if (entry.isDirectory()) {
151
- return walkFiles(fullPath);
152
- }
153
- return [fullPath];
154
- })
155
- );
156
- return nested.flat();
157
- }
158
- async function patchFixtureAgentSpecs(repoRoot) {
159
- const updates = /* @__PURE__ */ new Map([
160
- ["architecture-agent.mdx", " operations: [pick, update, create]"],
161
- ["engineer-agent.mdx", " operations: [pick, update, create]"],
162
- ["releaser-agent.mdx", " operations: [pick, update, get, create]"],
163
- ["researcher-agent.mdx", " operations: [pick, update, create]"],
164
- ["reviewer-agent.mdx", " operations: [pick, update, get, create]"]
165
- ]);
166
- for (const [filename, permissionLine] of updates) {
167
- const filePath = path.join(repoRoot, "src", "content", "agents", filename);
168
- const source = await readFile(filePath, "utf8").catch(() => null);
169
- if (!source) {
170
- continue;
171
- }
172
- const next = source.replace(
173
- /(\n - model: message\n) operations: \[[^\]]+\]/,
174
- `$1${permissionLine}`
175
- );
176
- if (next !== source) {
177
- await writeFile(filePath, next, "utf8");
178
- }
179
- }
180
- }
181
- async function transpileFixtureAgentHandlers(repoRoot) {
182
- const agentsRoot = path.join(repoRoot, "src", "agents");
183
- const agentFiles = (await readdir(agentsRoot, { withFileTypes: true }).catch(() => [])).filter((entry) => entry.isFile() && entry.name.endsWith(".ts")).map((entry) => entry.name);
184
- for (const filename of agentFiles) {
185
- const sourcePath = path.join(agentsRoot, filename);
186
- const outputPath = path.join(agentsRoot, filename.replace(/\.ts$/u, ".js"));
187
- const source = await readFile(sourcePath, "utf8");
188
- const transformed = ts.transpileModule(source, {
189
- compilerOptions: {
190
- module: ts.ModuleKind.ESNext,
191
- target: ts.ScriptTarget.ES2022
192
- }
193
- }).outputText.replace(/(['"`])(\.[^'"`\n]+)\.ts\1/g, "$1$2.js$1");
194
- await writeFile(outputPath, transformed, "utf8");
195
- }
196
- }
197
- async function migrateDatabase(repoRoot, persistTo) {
198
- const wrangler = await resolveWranglerBin();
199
- for (const migration of [
200
- "0001_subscribers.sql",
201
- "0002_agent_runtime.sql",
202
- "0003_agent_run_trace.sql"
203
- ]) {
204
- await runCommand(
205
- wrangler,
206
- [
207
- "d1",
208
- "execute",
209
- "karyon-docs-site-data",
210
- "--local",
211
- "--persist-to",
212
- persistTo,
213
- "--file",
214
- path.join(repoRoot, "migrations", migration)
215
- ],
216
- repoRoot
217
- );
218
- }
219
- }
220
- async function initializeSandboxRepo(repoRoot) {
221
- await runCommand("git", ["init", "-b", "main"], repoRoot);
222
- await runCommand("git", ["config", "user.email", "agents-e2e@example.test"], repoRoot);
223
- await runCommand("git", ["config", "user.name", "Agents E2E"], repoRoot);
224
- await runCommand("git", ["add", "."], repoRoot);
225
- await runCommand("git", ["commit", "-m", "test: baseline sandbox"], repoRoot);
226
- }
227
- function createObjectiveDocument(slug, date) {
228
- return serializeFrontmatterDocument(
229
- {
230
- title: `Objective ${slug}`,
231
- description: `Objective ${slug} description`,
232
- date,
233
- status: "planned",
234
- tags: ["agent", "e2e"],
235
- summary: `Summary for ${slug}`,
236
- draft: false,
237
- timeHorizon: "near-term",
238
- motivation: `Motivation for ${slug}`,
239
- primaryContributor: "planner-agent",
240
- relatedQuestions: [],
241
- relatedBooks: []
242
- },
243
- `# Objective ${slug}
244
- `
245
- );
246
- }
247
- function createQuestionDocument(slug, date, relatedObjectives = []) {
248
- return serializeFrontmatterDocument(
249
- {
250
- title: `Question ${slug}`,
251
- description: `Question ${slug} description`,
252
- date,
253
- status: "planned",
254
- tags: ["agent", "e2e"],
255
- summary: `Summary for ${slug}`,
256
- draft: false,
257
- questionType: "implementation",
258
- motivation: `Motivation for ${slug}`,
259
- primaryContributor: "planner-agent",
260
- relatedObjectives,
261
- relatedBooks: []
262
- },
263
- `# Question ${slug}
264
- `
265
- );
266
- }
267
- function createKnowledgeDocument(slug, title) {
268
- return serializeFrontmatterDocument(
269
- {
270
- title,
271
- slug,
272
- updated: nowIso(),
273
- tags: ["agent", "e2e"]
274
- },
275
- `# ${title}
276
- `
277
- );
278
- }
279
- async function createAgentTestRuntime(options) {
280
- const rootDir = await mkdtemp(path.join(os.tmpdir(), "karyon-agents-e2e-"));
281
- const repoRoot = path.join(rootDir, "docs");
282
- const persistTo = path.join(rootDir, ".wrangler-state");
283
- const docsRoot = resolveDocsRoot();
284
- const previousContentRoot = process.env.TREESEED_AGENT_CONTENT_ROOT;
285
- const previousExecutionMode = process.env.TREESEED_AGENT_EXECUTION_PROVIDER;
286
- const previousTenantRoot = process.env.TREESEED_TENANT_ROOT;
287
- const previousCwd = process.cwd();
288
- const sharedNodeModules = resolveSharedNodeModules(previousCwd);
289
- await cp(docsRoot, repoRoot, {
290
- recursive: true,
291
- filter(source) {
292
- const relativePath = path.relative(docsRoot, source);
293
- if (!relativePath) {
294
- return true;
295
- }
296
- return ![
297
- ".wrangler",
298
- ".agent-worktrees",
299
- "node_modules",
300
- "dist",
301
- ".astro",
302
- "coverage"
303
- ].some((prefix) => relativePath === prefix || relativePath.startsWith(`${prefix}${path.sep}`));
304
- }
305
- });
306
- if (existsSync(sharedNodeModules)) {
307
- await linkWorkspaceNodeModules(sharedNodeModules, repoRoot, previousCwd);
308
- }
309
- await transpileFixtureAgentHandlers(repoRoot);
310
- await patchFixtureAgentSpecs(repoRoot);
311
- process.env.TREESEED_AGENT_CONTENT_ROOT = path.join(repoRoot, "src", "content");
312
- process.env.TREESEED_AGENT_EXECUTION_PROVIDER = options?.executionMode ?? "stub";
313
- process.env.TREESEED_TENANT_ROOT = repoRoot;
314
- process.chdir(repoRoot);
315
- await mkdir(persistTo, { recursive: true });
316
- await initializeSandboxRepo(repoRoot);
317
- const [{ AgentKernel }, { AgentSdk }] = await Promise.all([
318
- import("../kernel/agent-kernel.js"),
319
- import("@treeseed/sdk/sdk")
320
- ]);
321
- const sdk = options?.databaseMode === "local-d1" ? (await migrateDatabase(repoRoot, persistTo), AgentSdk.createLocal({
322
- repoRoot,
323
- databaseName: "karyon-docs-site-data",
324
- persistTo
325
- })) : new AgentSdk({
326
- repoRoot,
327
- database: new MemoryAgentDatabase()
328
- });
329
- const kernel = new AgentKernel(sdk, repoRoot, {
330
- execution: options?.execution,
331
- mutations: options?.mutations
332
- });
333
- async function writeSeedFile(relativePath, source, message) {
334
- const filePath = path.join(repoRoot, relativePath);
335
- await mkdir(path.dirname(filePath), { recursive: true });
336
- await writeFile(filePath, source, "utf8");
337
- await runCommand("git", ["add", relativePath], repoRoot);
338
- await runCommand("git", ["commit", "-m", message], repoRoot);
339
- }
340
- return {
341
- rootDir,
342
- repoRoot,
343
- persistTo,
344
- sdk,
345
- kernel,
346
- async seedObjectives(entries) {
347
- for (const entry of entries) {
348
- await writeSeedFile(
349
- path.join("src", "content", "objectives", `${entry.slug}.mdx`),
350
- createObjectiveDocument(entry.slug, entry.date ?? "2099-01-01T00:00:00.000Z"),
351
- `test(seed): objective ${entry.slug}`
352
- );
353
- }
354
- },
355
- async seedQuestions(entries) {
356
- for (const entry of entries) {
357
- await writeSeedFile(
358
- path.join("src", "content", "questions", `${entry.slug}.mdx`),
359
- createQuestionDocument(
360
- entry.slug,
361
- entry.date ?? "2099-01-01T00:00:00.000Z",
362
- entry.relatedObjectives ?? []
363
- ),
364
- `test(seed): question ${entry.slug}`
365
- );
366
- }
367
- },
368
- async seedKnowledge(entries) {
369
- for (const entry of entries) {
370
- await writeSeedFile(
371
- path.join("src", "content", "knowledge", `${entry.slug}.md`),
372
- createKnowledgeDocument(entry.slug, entry.title ?? `Knowledge ${entry.slug}`),
373
- `test(seed): knowledge ${entry.slug}`
374
- );
375
- }
376
- },
377
- async seedMessages(entries) {
378
- const messages = [];
379
- for (const entry of entries) {
380
- const created = await sdk.createMessage({
381
- ...entry,
382
- actor: "agents-e2e"
383
- });
384
- messages.push(created.payload);
385
- }
386
- return messages;
387
- },
388
- async clearModelContent(model) {
389
- const definition = resolveModelDefinition(model);
390
- if (!definition.contentDir) {
391
- throw new Error(`Model ${model} is not content-backed.`);
392
- }
393
- const relativeContentDir = path.relative(repoRoot, definition.contentDir);
394
- await rm(definition.contentDir, { recursive: true, force: true });
395
- await mkdir(definition.contentDir, { recursive: true });
396
- await runCommand("git", ["add", "-A", relativeContentDir], repoRoot);
397
- await runCommand("git", ["commit", "-m", `test(seed): clear ${model}`], repoRoot);
398
- },
399
- runAgent(slug) {
400
- return kernel.runAgent(slug);
401
- },
402
- runCycle() {
403
- return kernel.runCycle();
404
- },
405
- async readMessages() {
406
- const response = await sdk.search({
407
- model: "message",
408
- sort: [{ field: "created_at", direction: "asc" }],
409
- limit: 100
410
- });
411
- return response.payload;
412
- },
413
- async readRunLogs() {
414
- const database = sdk.database;
415
- if (database.inspectRuns) {
416
- return database.inspectRuns().map((row) => runFromRecord(row));
417
- }
418
- const rows = database.db ? await database.db.prepare(`
419
- SELECT
420
- record_key AS run_id,
421
- lookup_key AS agent_slug,
422
- status,
423
- json_extract(payload_json, '$.triggerSource') AS trigger_source,
424
- json_extract(payload_json, '$.handlerKind') AS handler_kind,
425
- json_extract(payload_json, '$.triggerKind') AS trigger_kind,
426
- json_extract(payload_json, '$.selectedItemKey') AS selected_item_key,
427
- json_extract(payload_json, '$.selectedMessageId') AS selected_message_id,
428
- json_extract(payload_json, '$.claimedMessageId') AS claimed_message_id,
429
- json_extract(payload_json, '$.branchName') AS branch_name,
430
- secondary_key AS commit_sha,
431
- json_extract(payload_json, '$.prUrl') AS pr_url,
432
- json_extract(payload_json, '$.summary') AS summary,
433
- json_extract(payload_json, '$.error') AS error,
434
- json_extract(payload_json, '$.errorCategory') AS error_category,
435
- json_extract(payload_json, '$.changedPaths') AS changed_paths,
436
- created_at AS started_at,
437
- json_extract(payload_json, '$.finishedAt') AS finished_at
438
- FROM runtime_records
439
- WHERE record_type = 'agent_run'
440
- ORDER BY created_at ASC
441
- `).all() : { results: [] };
442
- return rows.results.map((row) => runFromRecord(row));
443
- },
444
- async readContentLeases() {
445
- const database = sdk.database;
446
- if (database.inspectLeases) {
447
- return database.inspectLeases();
448
- }
449
- if (!database.db) {
450
- return [];
451
- }
452
- const rows = await database.db.prepare("SELECT * FROM lease_state ORDER BY item_key ASC").all();
453
- return rows.results;
454
- },
455
- async readSandboxArtifacts() {
456
- const worktreeRoot = path.join(repoRoot, ".agent-worktrees");
457
- const files = (await walkFiles(worktreeRoot)).filter((entry) => entry.includes(`${path.sep}.agent-artifacts${path.sep}`));
458
- return Promise.all(
459
- files.map(async (filePath) => ({
460
- path: filePath,
461
- content: await readFile(filePath, "utf8")
462
- }))
463
- );
464
- },
465
- async claimMessage(messageTypes, workerId = "agents-e2e-claimer") {
466
- const claimed = await sdk.claimMessage({
467
- workerId,
468
- messageTypes,
469
- leaseSeconds: 300
470
- });
471
- return claimed.payload;
472
- },
473
- async claimObjectiveLease(itemKey, workerId = "agents-e2e-lease-holder") {
474
- return sdk.database.tryClaimContentLease({
475
- model: "objective",
476
- itemKey,
477
- claimedBy: workerId,
478
- leaseSeconds: 300
479
- });
480
- },
481
- async cleanup() {
482
- if (previousContentRoot === void 0) {
483
- delete process.env.TREESEED_AGENT_CONTENT_ROOT;
484
- } else {
485
- process.env.TREESEED_AGENT_CONTENT_ROOT = previousContentRoot;
486
- }
487
- if (previousExecutionMode === void 0) {
488
- delete process.env.TREESEED_AGENT_EXECUTION_PROVIDER;
489
- } else {
490
- process.env.TREESEED_AGENT_EXECUTION_PROVIDER = previousExecutionMode;
491
- }
492
- if (previousTenantRoot === void 0) {
493
- delete process.env.TREESEED_TENANT_ROOT;
494
- } else {
495
- process.env.TREESEED_TENANT_ROOT = previousTenantRoot;
496
- }
497
- process.chdir(previousCwd);
498
- await rm(rootDir, { recursive: true, force: true });
499
- }
500
- };
501
- }
502
- export {
503
- createAgentTestRuntime
504
- };
@@ -1,13 +0,0 @@
1
- import type { Hono } from 'hono';
2
- import type { AgentSdk } from '@treeseed/sdk';
3
- import type { ApiContext } from './http.ts';
4
- interface RegisterAgentRoutesOptions {
5
- sdk: AgentSdk;
6
- prefix?: string;
7
- scope?: string | null;
8
- projectId?: string;
9
- defaultActor?: string;
10
- authorize?: (c: ApiContext) => Response | null;
11
- }
12
- export declare function registerAgentRoutes(app: Hono<any>, options: RegisterAgentRoutesOptions): void;
13
- export {};