@treeseed/sdk 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +565 -0
  2. package/dist/cli-tools.js +44 -0
  3. package/dist/content-store.js +237 -0
  4. package/dist/d1-store.js +549 -0
  5. package/dist/frontmatter.js +33 -0
  6. package/dist/git-runtime.js +67 -0
  7. package/dist/index.js +12 -0
  8. package/dist/model-registry.js +164 -0
  9. package/dist/runtime.js +36 -0
  10. package/dist/scripts/.ts-run-1775616845195-odh4xzphk3l.js +22 -0
  11. package/dist/scripts/.ts-run-1775616848931-9386s6kwrl.js +126 -0
  12. package/dist/scripts/assert-release-tag-version.d.ts +1 -0
  13. package/dist/scripts/assert-release-tag-version.js +23 -0
  14. package/dist/scripts/build-dist.d.ts +1 -0
  15. package/dist/scripts/build-dist.js +114 -0
  16. package/dist/scripts/package-tools.d.ts +15 -0
  17. package/dist/scripts/package-tools.js +76 -0
  18. package/dist/scripts/publish-package.d.ts +1 -0
  19. package/dist/scripts/publish-package.js +20 -0
  20. package/dist/scripts/release-verify.d.ts +1 -0
  21. package/dist/scripts/release-verify.js +49 -0
  22. package/dist/scripts/run-ts.js +45 -0
  23. package/dist/scripts/test-smoke.d.ts +1 -0
  24. package/dist/scripts/test-smoke.js +77 -0
  25. package/dist/sdk-filters.js +77 -0
  26. package/dist/sdk-types.js +24 -0
  27. package/dist/sdk.js +232 -0
  28. package/dist/src/cli-tools.d.ts +3 -0
  29. package/dist/src/content-store.d.ts +24 -0
  30. package/dist/src/d1-store.d.ts +108 -0
  31. package/dist/src/frontmatter.d.ts +6 -0
  32. package/dist/src/git-runtime.d.ts +16 -0
  33. package/dist/src/index.d.ts +6 -0
  34. package/dist/src/model-registry.d.ts +4 -0
  35. package/dist/src/runtime.d.ts +1 -0
  36. package/dist/src/sdk-filters.d.ts +4 -0
  37. package/dist/src/sdk-types.d.ts +285 -0
  38. package/dist/src/sdk.d.ts +109 -0
  39. package/dist/src/stores/cursor-store.d.ts +10 -0
  40. package/dist/src/stores/envelopes.d.ts +116 -0
  41. package/dist/src/stores/helpers.d.ts +12 -0
  42. package/dist/src/stores/lease-store.d.ts +18 -0
  43. package/dist/src/stores/message-store.d.ts +12 -0
  44. package/dist/src/stores/run-store.d.ts +10 -0
  45. package/dist/src/stores/subscription-store.d.ts +9 -0
  46. package/dist/src/types/agents.d.ts +100 -0
  47. package/dist/src/types/cloudflare.d.ts +32 -0
  48. package/dist/src/wrangler-d1.d.ts +25 -0
  49. package/dist/stores/cursor-store.js +158 -0
  50. package/dist/stores/envelopes.js +219 -0
  51. package/dist/stores/helpers.js +42 -0
  52. package/dist/stores/lease-store.js +183 -0
  53. package/dist/stores/message-store.js +249 -0
  54. package/dist/stores/run-store.js +166 -0
  55. package/dist/stores/subscription-store.js +171 -0
  56. package/dist/test/test-fixture.d.ts +1 -0
  57. package/dist/test/utils/envelopes.test.d.ts +1 -0
  58. package/dist/test/utils/sdk.test.d.ts +1 -0
  59. package/dist/types/agents.js +40 -0
  60. package/dist/types/cloudflare.js +0 -0
  61. package/dist/vitest.config.d.ts +2 -0
  62. package/dist/wrangler-d1.js +84 -0
  63. package/package.json +130 -0
@@ -0,0 +1,49 @@
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
+ import { extname, join, resolve } from 'node:path';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { packageRoot } from './package-tools.js';
5
+ const textExtensions = new Set(['.js', '.ts', '.mjs', '.cjs', '.d.js', '.json', '.md']);
6
+ const forbiddenPatterns = [
7
+ /['"`]file:[^'"`\n]+['"`]/,
8
+ /['"`]workspace:[^'"`\n]+['"`]/,
9
+ /['"`](?:\.\.\/|\.\/)[^'"`\n]*src\/[^'"`\n]*\.(?:[cm]?js|ts|tsx|json|astro|css)['"`]/,
10
+ /['"`][^'"`\n]*\/packages\/[^'"`\n]*\/src\/[^'"`\n]*['"`]/,
11
+ ];
12
+ function run(command, args) {
13
+ const result = spawnSync(command, args, {
14
+ cwd: packageRoot,
15
+ stdio: 'inherit',
16
+ env: process.env,
17
+ });
18
+ if (result.status !== 0) {
19
+ process.exit(result.status ?? 1);
20
+ }
21
+ }
22
+ function walkFiles(root) {
23
+ const files = [];
24
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
25
+ const fullPath = join(root, entry.name);
26
+ if (entry.isDirectory()) {
27
+ files.push(...walkFiles(fullPath));
28
+ continue;
29
+ }
30
+ files.push(fullPath);
31
+ }
32
+ return files;
33
+ }
34
+ function scanDirectory(root) {
35
+ for (const filePath of walkFiles(root)) {
36
+ if (!textExtensions.has(extname(filePath)))
37
+ continue;
38
+ const source = readFileSync(filePath, 'utf8');
39
+ for (const pattern of forbiddenPatterns) {
40
+ if (pattern.test(source)) {
41
+ throw new Error(`${filePath} contains forbidden publish reference matching ${pattern}.`);
42
+ }
43
+ }
44
+ }
45
+ }
46
+ run('npm', ['run', 'build:dist']);
47
+ scanDirectory(resolve(packageRoot, 'dist'));
48
+ run('npm', ['run', 'test:unit']);
49
+ run('npm', ['run', 'test:smoke']);
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { build } from 'esbuild';
4
+ import { readFileSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { dirname, resolve } from 'node:path';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ const [, , entryArg, ...scriptArgs] = process.argv;
9
+
10
+ if (!entryArg) {
11
+ console.error('Usage: node ./scripts/run-ts.mjs <entry.ts> [...args]');
12
+ process.exit(1);
13
+ }
14
+
15
+ const cwd = process.cwd();
16
+ const entryPath = resolve(cwd, entryArg);
17
+ const outfile = resolve(
18
+ dirname(entryPath),
19
+ `.ts-run-${Date.now()}-${Math.random().toString(36).slice(2)}.js`,
20
+ );
21
+
22
+ try {
23
+ await build({
24
+ entryPoints: [entryPath],
25
+ outfile,
26
+ bundle: true,
27
+ format: 'esm',
28
+ platform: 'node',
29
+ packages: 'external',
30
+ sourcemap: 'inline',
31
+ logLevel: 'silent',
32
+ });
33
+
34
+ const builtSource = readFileSync(outfile, 'utf8');
35
+ writeFileSync(
36
+ outfile,
37
+ builtSource.replace(/(['"`])(\.[^'"`\n]+)\.ts\1/g, '$1$2.js$1'),
38
+ 'utf8',
39
+ );
40
+
41
+ process.argv = [process.argv[0] ?? 'node', entryPath, ...scriptArgs];
42
+ await import(pathToFileURL(outfile).href);
43
+ } finally {
44
+ rmSync(outfile, { force: true });
45
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,77 @@
1
+ import { mkdirSync, readdirSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
2
+ import { mkdtempSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join, resolve } from 'node:path';
5
+ import { spawnSync } from 'node:child_process';
6
+ import { packageRoot } from './package-tools.js';
7
+ function run(command, args, cwd = packageRoot, capture = false) {
8
+ const result = spawnSync(command, args, {
9
+ cwd,
10
+ stdio: capture ? 'pipe' : 'inherit',
11
+ encoding: 'utf8',
12
+ env: process.env,
13
+ });
14
+ if (result.status !== 0) {
15
+ throw new Error(result.stderr?.trim() || result.stdout?.trim() || `${command} ${args.join(' ')} failed`);
16
+ }
17
+ return (result.stdout ?? '').trim();
18
+ }
19
+ function resolveNodeModulesRoot() {
20
+ let lastCandidate = null;
21
+ let current = packageRoot;
22
+ while (true) {
23
+ const candidate = resolve(current, 'node_modules');
24
+ try {
25
+ readdirSync(candidate);
26
+ lastCandidate = candidate;
27
+ }
28
+ catch {
29
+ }
30
+ const parent = resolve(current, '..');
31
+ if (parent === current)
32
+ break;
33
+ current = parent;
34
+ }
35
+ if (lastCandidate) {
36
+ return lastCandidate;
37
+ }
38
+ throw new Error(`Unable to locate node_modules for ${packageRoot}.`);
39
+ }
40
+ function mirrorDependencies(tempRoot) {
41
+ const sharedNodeModules = resolveNodeModulesRoot();
42
+ for (const entry of readdirSync(sharedNodeModules, { withFileTypes: true })) {
43
+ if (entry.name === '.bin' || entry.name === '@treeseed') {
44
+ continue;
45
+ }
46
+ const targetPath = resolve(tempRoot, 'node_modules', entry.name);
47
+ mkdirSync(dirname(targetPath), { recursive: true });
48
+ symlinkSync(resolve(sharedNodeModules, entry.name), targetPath, 'dir');
49
+ }
50
+ }
51
+ const stageRoot = mkdtempSync(join(tmpdir(), 'treeseed-sdk-smoke-'));
52
+ const packRoot = resolve(stageRoot, 'pack');
53
+ const extractRoot = resolve(stageRoot, 'extract');
54
+ const installRoot = resolve(stageRoot, 'install');
55
+ try {
56
+ mkdirSync(packRoot, { recursive: true });
57
+ mkdirSync(extractRoot, { recursive: true });
58
+ const filename = run('npm', ['pack', '--silent', '--ignore-scripts', '--pack-destination', packRoot], packageRoot, true)
59
+ .split('\n')
60
+ .map((line) => line.trim())
61
+ .filter(Boolean)
62
+ .at(-1);
63
+ if (!filename) {
64
+ throw new Error('Unable to determine packed SDK tarball name.');
65
+ }
66
+ const tarballPath = resolve(packRoot, filename);
67
+ run('tar', ['-xzf', tarballPath, '-C', extractRoot]);
68
+ mkdirSync(resolve(installRoot, 'node_modules', '@treeseed'), { recursive: true });
69
+ run('cp', ['-R', resolve(extractRoot, 'package'), resolve(installRoot, 'node_modules', '@treeseed', 'sdk')]);
70
+ mirrorDependencies(installRoot);
71
+ writeFileSync(resolve(installRoot, 'package.json'), `${JSON.stringify({ name: 'treeseed-sdk-smoke', private: true, type: 'module' }, null, 2)}\n`, 'utf8');
72
+ run(process.execPath, ['--input-type=module', '-e', 'await import("@treeseed/sdk");'], installRoot);
73
+ console.log('SDK packed-install smoke passed.');
74
+ }
75
+ finally {
76
+ rmSync(stageRoot, { recursive: true, force: true });
77
+ }
@@ -0,0 +1,77 @@
1
+ function toArray(value) {
2
+ if (Array.isArray(value)) {
3
+ return value;
4
+ }
5
+ if (value === void 0 || value === null) {
6
+ return [];
7
+ }
8
+ return [value];
9
+ }
10
+ function compareScalar(left, right) {
11
+ if (typeof left === "number" && typeof right === "number") {
12
+ return left - right;
13
+ }
14
+ return String(left ?? "").localeCompare(String(right ?? ""));
15
+ }
16
+ function getFieldValue(entry, field) {
17
+ if (field in entry) {
18
+ return entry[field];
19
+ }
20
+ if ("frontmatter" in entry && entry.frontmatter && typeof entry.frontmatter === "object") {
21
+ return entry.frontmatter[field];
22
+ }
23
+ return void 0;
24
+ }
25
+ function matchesFilter(entry, filter) {
26
+ const fieldValue = getFieldValue(entry, filter.field);
27
+ switch (filter.op) {
28
+ case "eq":
29
+ return fieldValue === filter.value;
30
+ case "in":
31
+ return toArray(filter.value).includes(fieldValue);
32
+ case "contains":
33
+ if (Array.isArray(fieldValue)) {
34
+ return fieldValue.includes(filter.value);
35
+ }
36
+ return String(fieldValue ?? "").toLowerCase().includes(String(filter.value ?? "").toLowerCase());
37
+ case "prefix":
38
+ return String(fieldValue ?? "").toLowerCase().startsWith(String(filter.value ?? "").toLowerCase());
39
+ case "gt":
40
+ return compareScalar(fieldValue, filter.value) > 0;
41
+ case "gte":
42
+ return compareScalar(fieldValue, filter.value) >= 0;
43
+ case "lt":
44
+ return compareScalar(fieldValue, filter.value) < 0;
45
+ case "lte":
46
+ return compareScalar(fieldValue, filter.value) <= 0;
47
+ case "updated_since":
48
+ return new Date(String(fieldValue ?? 0)).valueOf() >= new Date(String(filter.value)).valueOf();
49
+ case "related_to":
50
+ return Array.isArray(fieldValue) && fieldValue.includes(filter.value);
51
+ default:
52
+ return false;
53
+ }
54
+ }
55
+ function applyFilters(items, filters = []) {
56
+ return items.filter((item) => filters.every((filter) => matchesFilter(item, filter)));
57
+ }
58
+ function applySort(items, sort = []) {
59
+ if (sort.length === 0) {
60
+ return items;
61
+ }
62
+ return [...items].sort((left, right) => {
63
+ for (const spec of sort) {
64
+ const direction = spec.direction === "asc" ? 1 : -1;
65
+ const comparison = compareScalar(getFieldValue(left, spec.field), getFieldValue(right, spec.field));
66
+ if (comparison !== 0) {
67
+ return comparison * direction;
68
+ }
69
+ }
70
+ return 0;
71
+ });
72
+ }
73
+ export {
74
+ applyFilters,
75
+ applySort,
76
+ matchesFilter
77
+ };
@@ -0,0 +1,24 @@
1
+ const SDK_MODEL_NAMES = [
2
+ "page",
3
+ "note",
4
+ "question",
5
+ "book",
6
+ "knowledge",
7
+ "objective",
8
+ "person",
9
+ "subscription",
10
+ "message",
11
+ "agent",
12
+ "agent_run",
13
+ "agent_cursor",
14
+ "content_lease"
15
+ ];
16
+ const SDK_OPERATIONS = ["get", "read", "search", "follow", "pick", "create", "update"];
17
+ const SDK_STORAGE_BACKENDS = ["content", "d1"];
18
+ const SDK_PICK_STRATEGIES = ["latest", "highest_priority", "oldest"];
19
+ export {
20
+ SDK_MODEL_NAMES,
21
+ SDK_OPERATIONS,
22
+ SDK_PICK_STRATEGIES,
23
+ SDK_STORAGE_BACKENDS
24
+ };
package/dist/sdk.js ADDED
@@ -0,0 +1,232 @@
1
+ import { resolveSdkRepoRoot } from "./runtime.js";
2
+ import { normalizeAgentCliOptions } from "./cli-tools.js";
3
+ import { ContentStore } from "./content-store.js";
4
+ import { CloudflareD1AgentDatabase, MemoryAgentDatabase } from "./d1-store.js";
5
+ import { resolveModelDefinition } from "./model-registry.js";
6
+ import { WranglerD1Database } from "./wrangler-d1.js";
7
+ function normalizeAgentSpec(entry) {
8
+ if (!entry) {
9
+ return null;
10
+ }
11
+ const frontmatter = entry.frontmatter ?? {};
12
+ return {
13
+ ...frontmatter,
14
+ slug: String(frontmatter.slug ?? entry.slug ?? ""),
15
+ cli: normalizeAgentCliOptions(frontmatter.cli)
16
+ };
17
+ }
18
+ function normalizeOperation(operation) {
19
+ return operation === "read" ? "get" : operation;
20
+ }
21
+ function operationAllowed(permissions, model, operation) {
22
+ const normalizedOperation = normalizeOperation(operation);
23
+ return permissions.some(
24
+ (permission) => permission.model === model && permission.operations.map(normalizeOperation).includes(normalizedOperation)
25
+ );
26
+ }
27
+ class AgentSdk {
28
+ database;
29
+ content;
30
+ constructor(options = {}) {
31
+ const repoRoot = resolveSdkRepoRoot(options.repoRoot);
32
+ this.database = options.database ?? new MemoryAgentDatabase();
33
+ this.content = new ContentStore(repoRoot, this.database);
34
+ }
35
+ static createLocal(options) {
36
+ const repoRoot = resolveSdkRepoRoot(options.repoRoot);
37
+ const d1 = new WranglerD1Database(
38
+ options.databaseName ?? "karyon-docs-site-data",
39
+ repoRoot,
40
+ options.persistTo
41
+ );
42
+ return new AgentSdk({
43
+ repoRoot,
44
+ database: new CloudflareD1AgentDatabase(d1)
45
+ });
46
+ }
47
+ envelope(model, operation, payload, meta) {
48
+ return {
49
+ ok: true,
50
+ model: resolveModelDefinition(model).name,
51
+ operation,
52
+ payload,
53
+ meta
54
+ };
55
+ }
56
+ async get(request) {
57
+ const definition = resolveModelDefinition(request.model);
58
+ const payload = definition.storage === "content" ? await this.content.get({ ...request, model: definition.name }) : await this.database.get({ ...request, model: definition.name });
59
+ return this.envelope(definition.name, "get", payload);
60
+ }
61
+ read(request) {
62
+ return this.get(request).then((response) => ({
63
+ ...response,
64
+ operation: "read"
65
+ }));
66
+ }
67
+ async search(request) {
68
+ const definition = resolveModelDefinition(request.model);
69
+ const payload = definition.storage === "content" ? await this.content.search({ ...request, model: definition.name }) : await this.database.search({ ...request, model: definition.name });
70
+ return this.envelope(definition.name, "search", payload, {
71
+ count: Array.isArray(payload) ? payload.length : 0
72
+ });
73
+ }
74
+ async follow(request) {
75
+ const definition = resolveModelDefinition(request.model);
76
+ const payload = definition.storage === "content" ? await this.content.follow({ ...request, model: definition.name }) : await this.database.follow({ ...request, model: definition.name });
77
+ return this.envelope(definition.name, "follow", payload, {
78
+ count: payload.items.length
79
+ });
80
+ }
81
+ async pick(request) {
82
+ const definition = resolveModelDefinition(request.model);
83
+ const payload = definition.storage === "content" ? await this.content.pick({ ...request, model: definition.name }) : await this.database.pick({ ...request, model: definition.name });
84
+ return this.envelope(definition.name, "pick", payload, {
85
+ claimed: Boolean(payload.item)
86
+ });
87
+ }
88
+ async create(request) {
89
+ const definition = resolveModelDefinition(request.model);
90
+ const payload = definition.storage === "content" ? await this.content.create({ ...request, model: definition.name }) : await this.database.create({ ...request, model: definition.name });
91
+ return this.envelope(definition.name, "create", payload);
92
+ }
93
+ async update(request) {
94
+ const definition = resolveModelDefinition(request.model);
95
+ const payload = definition.storage === "content" ? await this.content.update({ ...request, model: definition.name }) : await this.database.update({ ...request, model: definition.name });
96
+ return this.envelope(definition.name, "update", payload);
97
+ }
98
+ async claimMessage(request) {
99
+ const payload = await this.database.claimMessage(request);
100
+ return this.envelope("message", "pick", payload, {
101
+ claimed: Boolean(payload)
102
+ });
103
+ }
104
+ async ackMessage(request) {
105
+ await this.database.ackMessage(request);
106
+ return this.envelope("message", "update", { id: request.id, status: request.status });
107
+ }
108
+ async createMessage(request) {
109
+ const payload = await this.database.createMessage(request);
110
+ return this.envelope("message", "create", payload);
111
+ }
112
+ async recordRun(request) {
113
+ const payload = await this.database.recordRun(request);
114
+ return this.envelope("agent_run", "update", payload);
115
+ }
116
+ async getCursor(request) {
117
+ const payload = await this.database.getCursor(request);
118
+ return this.envelope("agent_cursor", "get", payload);
119
+ }
120
+ async upsertCursor(request) {
121
+ await this.database.upsertCursor(request);
122
+ return this.envelope("agent_cursor", "update", request);
123
+ }
124
+ async releaseLease(request) {
125
+ await this.database.releaseLease(request);
126
+ return this.envelope("content_lease", "update", request);
127
+ }
128
+ async releaseAllLeases() {
129
+ const count = await this.database.releaseAllLeases();
130
+ return this.envelope("content_lease", "update", { count });
131
+ }
132
+ async listAgentSpecs(options) {
133
+ const rawEntries = await this.listRawAgentSpecs(options);
134
+ return rawEntries.map((entry) => normalizeAgentSpec(entry)).filter((entry) => Boolean(entry && entry.slug));
135
+ }
136
+ async listRawAgentSpecs(options) {
137
+ const filters = typeof options?.enabled === "boolean" ? [{ field: "enabled", op: "eq", value: options.enabled }] : [];
138
+ const response = await this.search({
139
+ model: "agent",
140
+ filters,
141
+ sort: [{ field: "name", direction: "asc" }]
142
+ });
143
+ return response.payload;
144
+ }
145
+ scopeForAgent(agent) {
146
+ return new ScopedAgentSdk(this, agent.slug, agent.permissions);
147
+ }
148
+ }
149
+ class ScopedAgentSdk {
150
+ constructor(base, actor, permissions) {
151
+ this.base = base;
152
+ this.actor = actor;
153
+ this.permissions = permissions;
154
+ }
155
+ base;
156
+ actor;
157
+ permissions;
158
+ assertAllowed(model, operation) {
159
+ const normalized = resolveModelDefinition(model).name;
160
+ if (!operationAllowed(this.permissions, normalized, operation)) {
161
+ throw new Error(`Agent "${this.actor}" is not allowed to ${operation} ${normalized}.`);
162
+ }
163
+ }
164
+ get(request) {
165
+ this.assertAllowed(request.model, "get");
166
+ return this.base.get(request);
167
+ }
168
+ read(request) {
169
+ this.assertAllowed(request.model, "read");
170
+ return this.base.read(request);
171
+ }
172
+ search(request) {
173
+ this.assertAllowed(request.model, "search");
174
+ return this.base.search(request);
175
+ }
176
+ follow(request) {
177
+ this.assertAllowed(request.model, "follow");
178
+ return this.base.follow(request);
179
+ }
180
+ pick(request) {
181
+ this.assertAllowed(request.model, "pick");
182
+ return this.base.pick(request);
183
+ }
184
+ create(request) {
185
+ this.assertAllowed(request.model, "create");
186
+ return this.base.create({
187
+ ...request,
188
+ actor: this.actor
189
+ });
190
+ }
191
+ update(request) {
192
+ this.assertAllowed(request.model, "update");
193
+ return this.base.update({
194
+ ...request,
195
+ actor: this.actor
196
+ });
197
+ }
198
+ claimMessage(request) {
199
+ this.assertAllowed("message", "pick");
200
+ return this.base.claimMessage(request);
201
+ }
202
+ ackMessage(request) {
203
+ this.assertAllowed("message", "update");
204
+ return this.base.ackMessage(request);
205
+ }
206
+ createMessage(request) {
207
+ this.assertAllowed("message", "create");
208
+ return this.base.createMessage({
209
+ ...request,
210
+ actor: this.actor
211
+ });
212
+ }
213
+ recordRun(request) {
214
+ return this.base.recordRun(request);
215
+ }
216
+ getCursor(request) {
217
+ return this.base.getCursor(request);
218
+ }
219
+ upsertCursor(request) {
220
+ return this.base.upsertCursor(request);
221
+ }
222
+ releaseLease(request) {
223
+ return this.base.releaseLease(request);
224
+ }
225
+ releaseAllLeases() {
226
+ return this.base.releaseAllLeases();
227
+ }
228
+ }
229
+ export {
230
+ AgentSdk,
231
+ ScopedAgentSdk
232
+ };
@@ -0,0 +1,3 @@
1
+ import { type AgentCliOptions } from './types/agents.ts';
2
+ export declare function normalizeAgentCliOptions(input: unknown): AgentCliOptions;
3
+ export declare function buildCopilotAllowToolArgs(allowTools?: AgentCliOptions['allowTools']): string[];
@@ -0,0 +1,24 @@
1
+ import type { SdkContentEntry, SdkFollowRequest, SdkGetRequest, SdkMutationRequest, SdkPickRequest, SdkPickResult, SdkSearchRequest, SdkUpdateRequest } from './sdk-types.ts';
2
+ import type { AgentDatabase } from './d1-store.ts';
3
+ export declare class ContentStore {
4
+ private readonly repoRoot;
5
+ private readonly database;
6
+ private readonly gitRuntime;
7
+ constructor(repoRoot: string, database: AgentDatabase);
8
+ list(model: string): Promise<SdkContentEntry[]>;
9
+ get(request: SdkGetRequest): Promise<SdkContentEntry | null>;
10
+ search(request: SdkSearchRequest): Promise<SdkContentEntry[]>;
11
+ follow(request: SdkFollowRequest): Promise<{
12
+ items: SdkContentEntry[];
13
+ since: string;
14
+ }>;
15
+ pick(request: SdkPickRequest): Promise<SdkPickResult<SdkContentEntry>>;
16
+ create(request: SdkMutationRequest): Promise<{
17
+ item: SdkContentEntry;
18
+ git: import("./git-runtime.ts").GitMutationResult;
19
+ }>;
20
+ update(request: SdkUpdateRequest): Promise<{
21
+ item: SdkContentEntry;
22
+ git: import("./git-runtime.ts").GitMutationResult;
23
+ }>;
24
+ }
@@ -0,0 +1,108 @@
1
+ import type { ContentLeaseRecord } from './types/agents.ts';
2
+ import type { D1DatabaseLike } from './types/cloudflare.ts';
3
+ import type { SdkAckMessageRequest, SdkClaimMessageRequest, SdkCreateMessageRequest, SdkCursorEntity, SdkCursorRequest, SdkFollowRequest, SdkGetRequest, SdkGetCursorRequest, SdkLeaseEntity, SdkLeaseReleaseRequest, SdkMessageEntity, SdkMutationRequest, SdkPickRequest, SdkPickResult, SdkRecordRunRequest, SdkRunEntity, SdkSearchRequest, SdkSubscriptionEntity, SdkUpdateRequest } from './sdk-types.ts';
4
+ import { type LeaseClaimInput } from './stores/lease-store.ts';
5
+ export interface TryClaimContentLeaseInput extends LeaseClaimInput {
6
+ }
7
+ export interface AgentDatabase {
8
+ get(request: SdkGetRequest): Promise<Record<string, unknown> | null>;
9
+ search(request: SdkSearchRequest): Promise<Record<string, unknown>[]>;
10
+ follow(request: SdkFollowRequest): Promise<{
11
+ items: Record<string, unknown>[];
12
+ since: string;
13
+ }>;
14
+ pick(request: SdkPickRequest): Promise<SdkPickResult<Record<string, unknown>>>;
15
+ create(request: SdkMutationRequest): Promise<Record<string, unknown>>;
16
+ update(request: SdkUpdateRequest): Promise<Record<string, unknown> | null>;
17
+ claimMessage(request: SdkClaimMessageRequest): Promise<SdkMessageEntity | null>;
18
+ ackMessage(request: SdkAckMessageRequest): Promise<void>;
19
+ createMessage(request: SdkCreateMessageRequest): Promise<SdkMessageEntity>;
20
+ recordRun(request: SdkRecordRunRequest): Promise<Record<string, unknown>>;
21
+ getCursor(request: SdkGetCursorRequest): Promise<string | null>;
22
+ upsertCursor(request: SdkCursorRequest): Promise<void>;
23
+ releaseLease(request: SdkLeaseReleaseRequest): Promise<void>;
24
+ tryClaimContentLease(input: TryClaimContentLeaseInput): Promise<string | null>;
25
+ releaseAllLeases(): Promise<number>;
26
+ }
27
+ export declare class MemoryAgentDatabase implements AgentDatabase {
28
+ private readonly subscriptions;
29
+ private readonly messages;
30
+ private readonly runs;
31
+ private readonly contentLeases;
32
+ private readonly cursors;
33
+ private messageId;
34
+ constructor(seed?: {
35
+ subscriptions?: SdkSubscriptionEntity[];
36
+ messages?: SdkMessageEntity[];
37
+ runs?: SdkRunEntity[];
38
+ cursors?: SdkCursorEntity[];
39
+ leases?: SdkLeaseEntity[];
40
+ });
41
+ private rowsForModel;
42
+ get(request: SdkGetRequest): Promise<Record<string, unknown> | null>;
43
+ search(request: SdkSearchRequest): Promise<Record<string, unknown>[]>;
44
+ follow(request: SdkFollowRequest): Promise<{
45
+ items: Record<string, unknown>[];
46
+ since: string;
47
+ }>;
48
+ pick(request: SdkPickRequest): Promise<SdkPickResult<Record<string, unknown>>>;
49
+ create(request: SdkMutationRequest): Promise<Record<string, unknown>>;
50
+ update(request: SdkUpdateRequest): Promise<Record<string, unknown> | {
51
+ updated_at: string;
52
+ id?: number;
53
+ recordType?: import("./sdk-types.ts").TreeseedRuntimeRecordType;
54
+ schemaVersion?: import("./sdk-types.ts").TreeseedSchemaVersion;
55
+ email: string;
56
+ name?: string | null;
57
+ status: string;
58
+ source?: string;
59
+ metaJson?: string;
60
+ consent_at?: string;
61
+ created_at?: string;
62
+ ip_hash?: string;
63
+ } | null>;
64
+ claimMessage(request: SdkClaimMessageRequest): Promise<SdkMessageEntity | null>;
65
+ ackMessage(request: SdkAckMessageRequest): Promise<void>;
66
+ createMessage(request: SdkCreateMessageRequest): Promise<SdkMessageEntity>;
67
+ recordRun(request: SdkRecordRunRequest): Promise<SdkRunEntity>;
68
+ getCursor(request: SdkGetCursorRequest): Promise<string | null>;
69
+ upsertCursor(request: SdkCursorRequest): Promise<void>;
70
+ releaseLease(request: SdkLeaseReleaseRequest): Promise<void>;
71
+ tryClaimContentLease(input: TryClaimContentLeaseInput): Promise<`${string}-${string}-${string}-${string}-${string}` | null>;
72
+ releaseAllLeases(): Promise<number>;
73
+ inspectRuns(): SdkRunEntity[];
74
+ inspectLeases(): ContentLeaseRecord[];
75
+ }
76
+ export declare class CloudflareD1AgentDatabase implements AgentDatabase {
77
+ readonly db: D1DatabaseLike;
78
+ private readonly subscriptions;
79
+ private readonly messages;
80
+ private readonly runs;
81
+ private readonly cursors;
82
+ private readonly leases;
83
+ constructor(db: D1DatabaseLike);
84
+ get(request: SdkGetRequest): Promise<Record<string, unknown> | null>;
85
+ search(request: SdkSearchRequest): Promise<Record<string, unknown>[]>;
86
+ follow(request: SdkFollowRequest): Promise<{
87
+ items: Record<string, unknown>[];
88
+ since: string;
89
+ }>;
90
+ pick(request: SdkPickRequest): Promise<{
91
+ item: Record<string, unknown> | null;
92
+ leaseToken: `${string}-${string}-${string}-${string}-${string}` | null;
93
+ } | {
94
+ item: Record<string, unknown> | null;
95
+ leaseToken: string;
96
+ }>;
97
+ create(request: SdkMutationRequest): Promise<Record<string, unknown>>;
98
+ update(request: SdkUpdateRequest): Promise<Record<string, unknown> | null>;
99
+ claimMessage(request: SdkClaimMessageRequest): Promise<SdkMessageEntity | null>;
100
+ ackMessage(request: SdkAckMessageRequest): Promise<void>;
101
+ createMessage(request: SdkCreateMessageRequest): Promise<SdkMessageEntity>;
102
+ recordRun(request: SdkRecordRunRequest): Promise<SdkRunEntity>;
103
+ getCursor(request: SdkGetCursorRequest): Promise<string | null>;
104
+ upsertCursor(request: SdkCursorRequest): Promise<void>;
105
+ releaseLease(request: SdkLeaseReleaseRequest): Promise<void>;
106
+ tryClaimContentLease(input: TryClaimContentLeaseInput): Promise<`${string}-${string}-${string}-${string}-${string}` | null>;
107
+ releaseAllLeases(): Promise<number>;
108
+ }
@@ -0,0 +1,6 @@
1
+ export interface ParsedMarkdownDocument {
2
+ frontmatter: Record<string, unknown>;
3
+ body: string;
4
+ }
5
+ export declare function parseFrontmatterDocument(source: string): ParsedMarkdownDocument;
6
+ export declare function serializeFrontmatterDocument(frontmatter: Record<string, unknown>, body: string): string;
@@ -0,0 +1,16 @@
1
+ export interface GitMutationResult {
2
+ branchName: string;
3
+ commitMessage: string;
4
+ worktreePath: string;
5
+ commitSha: string | null;
6
+ changedPaths: string[];
7
+ }
8
+ export declare class GitRuntime {
9
+ private readonly repoRoot;
10
+ private readonly disabled;
11
+ constructor(repoRoot: string, disabled?: boolean);
12
+ currentBranch(): Promise<string>;
13
+ ensureWorktree(branchName: string): Promise<string>;
14
+ commitFileChange(filePath: string, branchName: string, commitMessage: string): Promise<GitMutationResult>;
15
+ commitFileChanges(filePaths: string[], branchName: string, commitMessage: string): Promise<GitMutationResult>;
16
+ }
@@ -0,0 +1,6 @@
1
+ export { AgentSdk, ScopedAgentSdk } from './sdk.ts';
2
+ export { MODEL_REGISTRY, buildModelRegistry, resolveModelDefinition } from './model-registry.ts';
3
+ export { normalizeAgentCliOptions, buildCopilotAllowToolArgs } from './cli-tools.ts';
4
+ export type { SdkContentEntry, SdkCursorEntity, SdkFilterCondition, SdkFollowRequest, SdkGetRequest, SdkJsonEnvelope, SdkLeaseEntity, SdkMessageEntity, SdkModelDefinition, SdkModelName, SdkMutationRequest, SdkOperation, SdkPickRequest, SdkPickResult, SdkRunEntity, SdkSearchRequest, SdkSubscriptionEntity, SdkUpdateRequest, } from './sdk-types.ts';
5
+ export type { AgentDatabase } from './d1-store.ts';
6
+ export type { D1DatabaseLike, D1PreparedStatementLike } from './types/cloudflare.ts';