@derive-to/artifacts 0.6.0 → 0.6.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 (64) hide show
  1. package/README.md +6 -7
  2. package/dist/host/client.d.ts +20 -4
  3. package/dist/host/client.d.ts.map +1 -1
  4. package/dist/host/client.js +29 -1
  5. package/dist/host/client.js.map +1 -1
  6. package/dist/host/index.d.ts +1 -1
  7. package/dist/host/index.d.ts.map +1 -1
  8. package/dist/host/index.js.map +1 -1
  9. package/dist/protocol/tools.d.ts +4 -0
  10. package/dist/protocol/tools.d.ts.map +1 -1
  11. package/dist/protocol/tools.js +5 -1
  12. package/dist/protocol/tools.js.map +1 -1
  13. package/dist/runtime/assets.js +1 -1
  14. package/dist/runtime.global.js +17 -17
  15. package/dist/server/adapters/kysely/index.d.ts +30 -0
  16. package/dist/server/adapters/kysely/index.d.ts.map +1 -0
  17. package/dist/server/adapters/kysely/index.js +31 -0
  18. package/dist/server/adapters/kysely/index.js.map +1 -0
  19. package/dist/server/adapters/kysely/schema.d.ts +11 -0
  20. package/dist/server/adapters/kysely/schema.d.ts.map +1 -0
  21. package/dist/server/adapters/kysely/schema.js +159 -0
  22. package/dist/server/adapters/kysely/schema.js.map +1 -0
  23. package/dist/server/adapters/kysely/sharing.d.ts +5 -0
  24. package/dist/server/adapters/kysely/sharing.d.ts.map +1 -0
  25. package/dist/server/adapters/kysely/sharing.js +81 -0
  26. package/dist/server/adapters/kysely/sharing.js.map +1 -0
  27. package/dist/server/adapters/kysely/store.d.ts +87 -0
  28. package/dist/server/adapters/kysely/store.d.ts.map +1 -0
  29. package/dist/server/adapters/kysely/store.js +328 -0
  30. package/dist/server/adapters/kysely/store.js.map +1 -0
  31. package/dist/server/adapters/sqlite/index.d.ts +7 -8
  32. package/dist/server/adapters/sqlite/index.d.ts.map +1 -1
  33. package/dist/server/adapters/sqlite/index.js +24 -44
  34. package/dist/server/adapters/sqlite/index.js.map +1 -1
  35. package/dist/server/bin.d.ts +3 -0
  36. package/dist/server/bin.d.ts.map +1 -0
  37. package/dist/server/bin.js +7 -0
  38. package/dist/server/bin.js.map +1 -0
  39. package/dist/server/cli.d.ts +8 -0
  40. package/dist/server/cli.d.ts.map +1 -0
  41. package/dist/server/cli.js +103 -0
  42. package/dist/server/cli.js.map +1 -0
  43. package/dist/server/kit/tool.d.ts +7 -1
  44. package/dist/server/kit/tool.d.ts.map +1 -1
  45. package/dist/server/kit/tool.js +9 -0
  46. package/dist/server/kit/tool.js.map +1 -1
  47. package/dist/server/kit.d.ts +1 -1
  48. package/dist/server/kit.d.ts.map +1 -1
  49. package/dist/server/kit.js +1 -1
  50. package/dist/server/kit.js.map +1 -1
  51. package/dist/server/sharing/store.d.ts +1 -1
  52. package/package.json +61 -55
  53. package/dist/server/adapters/sqlite/schema.d.ts +0 -3
  54. package/dist/server/adapters/sqlite/schema.d.ts.map +0 -1
  55. package/dist/server/adapters/sqlite/schema.js +0 -69
  56. package/dist/server/adapters/sqlite/schema.js.map +0 -1
  57. package/dist/server/adapters/sqlite/sharing.d.ts +0 -6
  58. package/dist/server/adapters/sqlite/sharing.d.ts.map +0 -1
  59. package/dist/server/adapters/sqlite/sharing.js +0 -81
  60. package/dist/server/adapters/sqlite/sharing.js.map +0 -1
  61. package/dist/server/adapters/sqlite/store.d.ts +0 -6
  62. package/dist/server/adapters/sqlite/store.d.ts.map +0 -1
  63. package/dist/server/adapters/sqlite/store.js +0 -130
  64. package/dist/server/adapters/sqlite/store.js.map +0 -1
@@ -0,0 +1,328 @@
1
+ import { sql } from "kysely";
2
+ import { activityFrom } from "../activity.js";
3
+ import { toActivity, toArtifact, toComment, toState, toThread, toVersion } from "../sql-rows.js";
4
+ const json = (value) => JSON.stringify(value);
5
+ /** Rows changed by a write, as every dialect reports it. */
6
+ const changed = (result) => Number(result.numUpdatedRows ?? result.numDeletedRows ?? 0n);
7
+ const versionRow = (v) => ({
8
+ artifact_id: v.artifactId,
9
+ n: v.n,
10
+ content_hash: v.contentHash,
11
+ size: v.size,
12
+ csp: json(v.csp),
13
+ created_at: v.createdAt,
14
+ created_by: json(v.createdBy),
15
+ source_info: v.source ? json(v.source) : null,
16
+ });
17
+ const commentRow = (c) => ({
18
+ id: c.id,
19
+ artifact_id: c.artifactId,
20
+ thread_id: c.threadId,
21
+ version: c.version,
22
+ quote: c.quote ? json(c.quote) : null,
23
+ body: c.body,
24
+ author: json(c.author),
25
+ created_at: c.createdAt,
26
+ });
27
+ /** `%` and `_` match themselves: search is literal text. `!` is the escape character, the
28
+ * same in both dialects. */
29
+ const literalLike = (text) => `%${text.toLowerCase().replace(/[!%_]/g, "!$&")}%`;
30
+ /** Every table that hangs off an artifact. Comments go before threads, which they reference. */
31
+ const CHILD_TABLES = [
32
+ "oa_activity",
33
+ "oa_states",
34
+ "oa_comments",
35
+ "oa_threads",
36
+ "oa_versions",
37
+ "oa_share_grants",
38
+ "oa_share_settings",
39
+ ];
40
+ const artifactQueries = (db, dialect) => ({
41
+ createArtifact: async (a, v) => {
42
+ await db.transaction().execute(async (trx) => {
43
+ await trx
44
+ .insertInto("oa_artifacts")
45
+ .values({
46
+ id: a.id,
47
+ title: a.title,
48
+ current_version: a.currentVersion,
49
+ created_at: a.createdAt,
50
+ updated_at: a.updatedAt,
51
+ created_by: json(a.createdBy),
52
+ space: a.space,
53
+ summary: a.summary,
54
+ updated_by: json(a.updatedBy),
55
+ kind: a.kind,
56
+ })
57
+ .execute();
58
+ await trx.insertInto("oa_versions").values(versionRow(v)).execute();
59
+ });
60
+ },
61
+ getArtifact: async (id) => {
62
+ const row = await db
63
+ .selectFrom("oa_artifacts")
64
+ .selectAll()
65
+ .where("id", "=", id)
66
+ .executeTakeFirst();
67
+ return row ? toArtifact(row) : null;
68
+ },
69
+ listArtifacts: async ({ space, limit, after, search, createdBy }) => {
70
+ const creatorId = dialect === "postgres"
71
+ ? sql `created_by->>'id'`
72
+ : sql `json_extract(created_by, '$.id')`;
73
+ const pattern = literalLike(search ?? "");
74
+ const rows = await db
75
+ .selectFrom("oa_artifacts")
76
+ .selectAll()
77
+ .where("space", "=", space)
78
+ .$if(after !== undefined, (q) => q.where(({ eb, or, and }) => or([
79
+ eb("updated_at", "<", after?.updatedAt ?? ""),
80
+ and([eb("updated_at", "=", after?.updatedAt ?? ""), eb("id", "<", after?.id ?? "")]),
81
+ ])))
82
+ .$if(Boolean(search), (q) => q.where(sql `(lower(title) like ${pattern} escape '!' or lower(summary) like ${pattern} escape '!')`))
83
+ .$if(createdBy !== undefined, (q) => q.where(creatorId, "=", createdBy ?? ""))
84
+ .orderBy("updated_at", "desc")
85
+ .orderBy("id", "desc")
86
+ .limit(limit)
87
+ .execute();
88
+ return rows.map(toArtifact);
89
+ },
90
+ renameArtifact: async (id, title) => changed(await db.updateTable("oa_artifacts").set({ title }).where("id", "=", id).executeTakeFirst()) === 1,
91
+ // Children first, in one transaction: correct whether or not the database enforces the
92
+ // foreign keys' cascades (SQLite does only when asked).
93
+ deleteArtifact: async (id) => db.transaction().execute(async (trx) => {
94
+ const drop = (table) => trx.deleteFrom(table).where("artifact_id", "=", id).execute();
95
+ await Promise.all(CHILD_TABLES.slice(0, 2).map(drop));
96
+ await drop("oa_comments");
97
+ await drop("oa_threads");
98
+ await Promise.all(CHILD_TABLES.slice(4).map(drop));
99
+ return (changed(await trx.deleteFrom("oa_artifacts").where("id", "=", id).executeTakeFirst()) ===
100
+ 1);
101
+ }),
102
+ });
103
+ const versionQueries = (db) => ({
104
+ // Compare-and-swap on current_version, then the insert, in one transaction.
105
+ addVersion: async (v, expected, facts) => {
106
+ if (v.n !== expected + 1)
107
+ return null;
108
+ return db.transaction().execute(async (trx) => {
109
+ const moved = await trx
110
+ .updateTable("oa_artifacts")
111
+ .set((eb) => ({
112
+ current_version: v.n,
113
+ updated_at: v.createdAt,
114
+ summary: facts.summary,
115
+ kind: facts.kind,
116
+ title: facts.title ?? eb.ref("title"),
117
+ updated_by: json(v.createdBy),
118
+ }))
119
+ .where("id", "=", v.artifactId)
120
+ .where("current_version", "=", expected)
121
+ .executeTakeFirst();
122
+ if (changed(moved) !== 1)
123
+ return null;
124
+ await trx.insertInto("oa_versions").values(versionRow(v)).execute();
125
+ return v;
126
+ });
127
+ },
128
+ // Only the current version, and only while it still has the source the editor read.
129
+ replaceVersion: async (v, expectedHash, facts) => db.transaction().execute(async (trx) => {
130
+ const saved = await trx
131
+ .updateTable("oa_versions")
132
+ .set({
133
+ content_hash: v.contentHash,
134
+ size: v.size,
135
+ csp: json(v.csp),
136
+ created_at: v.createdAt,
137
+ created_by: json(v.createdBy),
138
+ source_info: v.source ? json(v.source) : null,
139
+ })
140
+ .where("artifact_id", "=", v.artifactId)
141
+ .where("n", "=", v.n)
142
+ .where("content_hash", "=", expectedHash)
143
+ .where((eb) => eb("n", "=", eb
144
+ .selectFrom("oa_artifacts")
145
+ .select("current_version")
146
+ .where("id", "=", v.artifactId)))
147
+ .executeTakeFirst();
148
+ if (changed(saved) !== 1)
149
+ return null;
150
+ await trx
151
+ .updateTable("oa_artifacts")
152
+ .set((eb) => ({
153
+ updated_at: v.createdAt,
154
+ summary: facts.summary,
155
+ kind: facts.kind,
156
+ title: facts.title ?? eb.ref("title"),
157
+ updated_by: json(v.createdBy),
158
+ }))
159
+ .where("id", "=", v.artifactId)
160
+ .execute();
161
+ return v;
162
+ }),
163
+ getVersion: async (artifactId, n) => {
164
+ const row = await db
165
+ .selectFrom("oa_versions")
166
+ .selectAll()
167
+ .where("artifact_id", "=", artifactId)
168
+ .where("n", "=", n)
169
+ .executeTakeFirst();
170
+ return row ? toVersion(row) : null;
171
+ },
172
+ listVersions: async (artifactId) => (await db
173
+ .selectFrom("oa_versions")
174
+ .selectAll()
175
+ .where("artifact_id", "=", artifactId)
176
+ .orderBy("n")
177
+ .execute()).map(toVersion),
178
+ });
179
+ const threadQueries = (db) => ({
180
+ createThread: async (thread, first) => {
181
+ await db.transaction().execute(async (trx) => {
182
+ await trx
183
+ .insertInto("oa_threads")
184
+ .values({ id: thread.id, artifact_id: thread.artifactId, state: thread.state })
185
+ .execute();
186
+ await trx
187
+ .insertInto("oa_comments")
188
+ .values(commentRow({ ...first, threadId: thread.id }))
189
+ .execute();
190
+ });
191
+ },
192
+ addComment: async (comment) => {
193
+ await db.insertInto("oa_comments").values(commentRow(comment)).execute();
194
+ },
195
+ setThreadState: async (artifactId, threadId, state) => changed(await db
196
+ .updateTable("oa_threads")
197
+ .set({ state })
198
+ .where("id", "=", threadId)
199
+ .where("artifact_id", "=", artifactId)
200
+ .executeTakeFirst()) === 1,
201
+ listThreads: async (artifactId) => {
202
+ const [threads, comments] = await Promise.all([
203
+ db.selectFrom("oa_threads").selectAll().where("artifact_id", "=", artifactId).execute(),
204
+ db
205
+ .selectFrom("oa_comments")
206
+ .selectAll()
207
+ .where("artifact_id", "=", artifactId)
208
+ .orderBy("created_at")
209
+ .execute(),
210
+ ]);
211
+ return { threads: threads.map(toThread), comments: comments.map(toComment) };
212
+ },
213
+ threadActivity: async (artifactIds) => {
214
+ if (artifactIds.length === 0)
215
+ return [];
216
+ const ids = [...artifactIds];
217
+ const [threads, comments] = await Promise.all([
218
+ db.selectFrom("oa_threads").selectAll().where("artifact_id", "in", ids).execute(),
219
+ db.selectFrom("oa_comments").selectAll().where("artifact_id", "in", ids).execute(),
220
+ ]);
221
+ return activityFrom(artifactIds, threads.map(toThread), comments.map(toComment));
222
+ },
223
+ });
224
+ /** Insert unless the key exists; true when this call inserted. */
225
+ const insertedNew = (result) => Number(result.numInsertedOrUpdatedRows ?? 0n) === 1;
226
+ const stateQueries = (db) => ({
227
+ getState: async (artifactId, key) => {
228
+ const row = await db
229
+ .selectFrom("oa_states")
230
+ .selectAll()
231
+ .where("artifact_id", "=", artifactId)
232
+ .where("key", "=", key)
233
+ .executeTakeFirst();
234
+ return row ? toState(row) : null;
235
+ },
236
+ countStateKeys: async (artifactId) => {
237
+ const row = await db
238
+ .selectFrom("oa_states")
239
+ .select((eb) => eb.fn.countAll().as("n"))
240
+ .where("artifact_id", "=", artifactId)
241
+ .executeTakeFirst();
242
+ return Number(row?.n ?? 0);
243
+ },
244
+ // Insert when new, otherwise update only the version that was read.
245
+ putState: async (s, expected) => expected === 0
246
+ ? insertedNew(await db
247
+ .insertInto("oa_states")
248
+ .values({
249
+ artifact_id: s.artifactId,
250
+ key: s.key,
251
+ items: json(s.items),
252
+ version: s.version,
253
+ })
254
+ .onConflict((oc) => oc.doNothing())
255
+ .executeTakeFirst())
256
+ : changed(await db
257
+ .updateTable("oa_states")
258
+ .set({ items: json(s.items), version: s.version })
259
+ .where("artifact_id", "=", s.artifactId)
260
+ .where("key", "=", s.key)
261
+ .where("version", "=", expected)
262
+ .executeTakeFirst()) === 1,
263
+ // Insert, then prune to the newest `keep`.
264
+ appendActivity: async (a, keep) => {
265
+ await db.transaction().execute(async (trx) => {
266
+ await trx
267
+ .insertInto("oa_activity")
268
+ .values({
269
+ artifact_id: a.artifactId,
270
+ key: a.key,
271
+ action: a.action,
272
+ item_id: a.itemId,
273
+ version: a.version,
274
+ actor: json(a.actor),
275
+ at: a.at,
276
+ })
277
+ .execute();
278
+ const newest = trx
279
+ .selectFrom("oa_activity")
280
+ .select("id")
281
+ .where("artifact_id", "=", a.artifactId)
282
+ .where("key", "=", a.key)
283
+ .orderBy("id", "desc")
284
+ .limit(keep);
285
+ await trx
286
+ .deleteFrom("oa_activity")
287
+ .where("artifact_id", "=", a.artifactId)
288
+ .where("key", "=", a.key)
289
+ .where("id", "not in", (eb) => eb.selectFrom(newest.as("newest")).select("newest.id"))
290
+ .execute();
291
+ });
292
+ },
293
+ listActivity: async (artifactId, key, limit) => (await db
294
+ .selectFrom("oa_activity")
295
+ .selectAll()
296
+ .where("artifact_id", "=", artifactId)
297
+ .where("key", "=", key)
298
+ .orderBy("id", "desc")
299
+ .limit(limit)
300
+ .execute()).map(toActivity),
301
+ });
302
+ export const kyselyStoreOn = (db, dialect) => ({
303
+ ...artifactQueries(db, dialect),
304
+ ...versionQueries(db),
305
+ ...threadQueries(db),
306
+ ...stateQueries(db),
307
+ });
308
+ /** Files in the same database: no bucket to provision. Content-addressed, so a second put
309
+ * of the same key is a no-op. */
310
+ export const kyselyBlobsOn = (db) => ({
311
+ put: async (key, blob) => {
312
+ await db
313
+ .insertInto("oa_blobs")
314
+ .values({ key, type: blob.type, bytes: blob.bytes })
315
+ .onConflict((oc) => oc.doNothing())
316
+ .execute();
317
+ },
318
+ get: async (key) => {
319
+ const row = await db
320
+ .selectFrom("oa_blobs")
321
+ .select(["type", "bytes"])
322
+ .where("key", "=", key)
323
+ .executeTakeFirst();
324
+ // A copy the kit owns, backed by a plain ArrayBuffer, whatever the driver returned.
325
+ return row ? { type: row.type, bytes: new Uint8Array(row.bytes) } : null;
326
+ },
327
+ });
328
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/server/adapters/kysely/store.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { DatabaseSync } from "node:sqlite";
2
- import type { WiredBackend } from "../../ports.js";
3
- export { sqliteSharing } from "./sharing.js";
1
+ import { Kysely } from "kysely";
2
+ import { type KitTables, type KyselyBackend } from "../kysely/index.js";
4
3
  /** Everything in one SQLite file on Node's built-in `node:sqlite`: no native modules, no
5
- * other services. Pass a path or `":memory:"`. One process owns the file; `db` is it, for
6
- * `sqliteSharing(db)` and your own tables. */
7
- export declare const sqlite: (path: string) => WiredBackend & {
8
- db: DatabaseSync;
9
- };
4
+ * other services. Pass a path or `":memory:"`. One process owns the file. Migrates on open;
5
+ * `db` is the Kysely instance, for your own tables beside the kit's. */
6
+ export declare const sqlite: (path: string) => Promise<KyselyBackend & {
7
+ db: Kysely<KitTables>;
8
+ }>;
10
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/adapters/sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAA;AA2B7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;+CAE+C;AAC/C,eAAO,MAAM,MAAM,SAAU,MAAM,KAAG,YAAY,GAAG;IAAE,EAAE,EAAE,YAAY,CAAA;CAiBtE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/adapters/sqlite/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAsC,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAU,MAAM,oBAAoB,CAAA;AAkB/E;;yEAEyE;AACzE,eAAO,MAAM,MAAM,SAAgB,MAAM,KAAG,OAAO,CAAC,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;CAAE,CAO5F,CAAA"}
@@ -1,50 +1,30 @@
1
1
  import { DatabaseSync } from "node:sqlite";
2
- import { memoryBus } from "../memory-bus.js";
3
- import { MIGRATIONS } from "./schema.js";
4
- import { sqliteStoreOn } from "./store.js";
5
- const migrate = (db) => {
6
- const applied = Number(db.prepare("PRAGMA user_version").get()?.["user_version"] ?? 0);
7
- for (const [index, sql] of MIGRATIONS.entries()) {
8
- if (index < applied)
9
- continue;
10
- db.exec("BEGIN");
11
- db.exec(sql);
12
- db.exec(`PRAGMA user_version = ${index + 1}`);
13
- db.exec("COMMIT");
14
- }
15
- };
16
- const sqliteBlobsOn = (q) => ({
17
- put: async (key, blob) => {
18
- q("INSERT OR IGNORE INTO oa_blobs VALUES (?, ?, ?)").run(key, blob.type, blob.bytes);
19
- },
20
- get: async (key) => {
21
- const row = q("SELECT type, bytes FROM oa_blobs WHERE key = ?").get(key);
22
- if (!row)
23
- return null;
24
- return { type: String(row["type"]), bytes: new Uint8Array(row["bytes"]) };
2
+ import { Kysely, SqliteDialect } from "kysely";
3
+ import { kysely } from "../kysely/index.js";
4
+ /** Node's built-in `node:sqlite`, in the shape Kysely's SQLite dialect drives. */
5
+ const nodeSqlite = (db) => ({
6
+ close: () => db.close(),
7
+ prepare: (text) => {
8
+ const statement = db.prepare(text);
9
+ // Kysely binds only the values a query was built with: strings, numbers, bytes, null.
10
+ const bind = (parameters) => parameters;
11
+ return {
12
+ reader: statement.columns().length > 0,
13
+ all: (parameters) => statement.all(...bind(parameters)),
14
+ run: (parameters) => statement.run(...bind(parameters)),
15
+ iterate: (parameters) => statement.iterate(...bind(parameters)),
16
+ };
25
17
  },
26
18
  });
27
- export { sqliteSharing } from "./sharing.js";
28
19
  /** Everything in one SQLite file on Node's built-in `node:sqlite`: no native modules, no
29
- * other services. Pass a path or `":memory:"`. One process owns the file; `db` is it, for
30
- * `sqliteSharing(db)` and your own tables. */
31
- export const sqlite = (path) => {
32
- const db = new DatabaseSync(path);
33
- db.exec("PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000");
34
- migrate(db);
35
- const q = (sql) => db.prepare(sql);
36
- const tx = (work) => {
37
- db.exec("BEGIN IMMEDIATE");
38
- try {
39
- const result = work();
40
- db.exec("COMMIT");
41
- return result;
42
- }
43
- catch (error) {
44
- db.exec("ROLLBACK");
45
- throw error;
46
- }
47
- };
48
- return { store: sqliteStoreOn(q, tx), blobs: sqliteBlobsOn(q), bus: memoryBus(), db };
20
+ * other services. Pass a path or `":memory:"`. One process owns the file. Migrates on open;
21
+ * `db` is the Kysely instance, for your own tables beside the kit's. */
22
+ export const sqlite = async (path) => {
23
+ const raw = new DatabaseSync(path);
24
+ raw.exec("PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000");
25
+ const db = new Kysely({ dialect: new SqliteDialect({ database: nodeSqlite(raw) }) });
26
+ const backend = kysely(db);
27
+ await backend.migrate();
28
+ return { ...backend, db };
49
29
  };
50
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/adapters/sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAc,aAAa,EAAW,MAAM,YAAY,CAAA;AAE/D,MAAM,OAAO,GAAG,CAAC,EAAgB,EAAE,EAAE;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;IACtF,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,IAAI,KAAK,GAAG,OAAO;YAAE,SAAQ;QAC7B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAChB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACZ,EAAE,CAAC,IAAI,CAAC,yBAAyB,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7C,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,CAAQ,EAAa,EAAE,CAAC,CAAC;IAC9C,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACvB,CAAC,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACtF,CAAC;IACD,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,OAAO,CAAe,CAAC,EAAE,CAAA;IACzF,CAAC;CACF,CAAC,CAAA;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;+CAE+C;AAC/C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAuC,EAAE;IAC1E,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,EAAE,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAA;IAC1F,OAAO,CAAC,EAAE,CAAC,CAAA;IACX,MAAM,CAAC,GAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,EAAE,GAAO,CAAC,IAAI,EAAE,EAAE;QACtB,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,EAAE,CAAA;YACrB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACjB,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACnB,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAA;AACvF,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/adapters/sqlite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,MAAM,EAAuB,aAAa,EAAE,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAsC,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE/E,kFAAkF;AAClF,MAAM,UAAU,GAAG,CAAC,EAAgB,EAAkB,EAAE,CAAC,CAAC;IACxD,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;IACvB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAChB,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClC,sFAAsF;QACtF,MAAM,IAAI,GAAG,CAAC,UAA8B,EAAE,EAAE,CAAC,UAA6B,CAAA;QAC9E,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC;YACtC,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACvD,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACvD,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;SAChE,CAAA;IACH,CAAC;CACF,CAAC,CAAA;AAEF;;yEAEyE;AACzE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAsD,EAAE;IAC/F,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA;IAClC,GAAG,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAA;IAC3F,MAAM,EAAE,GAAG,IAAI,MAAM,CAAY,EAAE,OAAO,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC/F,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;IACvB,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAA;AAC3B,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/server/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli.js";
3
+ process.exitCode = await runCli(process.argv.slice(2), {
4
+ cwd: process.cwd(),
5
+ out: (text) => process.stdout.write(`${text}\n`),
6
+ });
7
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/server/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACrD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;IAClB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;CACjD,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare const USAGE = "Usage:\n artifacts generate [--dialect postgres|sqlite] [--config <file>] [--out <file>]\n Print the kit's schema as SQL, for your own migration tool.\n artifacts migrate [--config <file>]\n Create or upgrade the kit's tables with the backend your config exports.\n\nThe config file default-exports a backend: `export default kysely(db)`, `await sqlite(path)`\nor `postgres({ sql })`. Without --config: artifacts.config.ts, .mts, .js or .mjs here.";
2
+ export interface CliIo {
3
+ cwd: string;
4
+ out(text: string): void;
5
+ }
6
+ /** Run one command. Returns the process exit code; never exits itself. */
7
+ export declare const runCli: (argv: readonly string[], io: CliIo) => Promise<number>;
8
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/server/cli.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,KAAK,gdAOuE,CAAA;AAuEzF,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAeD,0EAA0E;AAC1E,eAAO,MAAM,MAAM,SAAgB,SAAS,MAAM,EAAE,MAAM,KAAK,KAAG,OAAO,CAAC,MAAM,CA2B/E,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { access, writeFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { parseArgs } from "node:util";
5
+ import { DummyDriver, Kysely, PostgresAdapter, PostgresIntrospector, PostgresQueryCompiler, SqliteAdapter, SqliteIntrospector, SqliteQueryCompiler, } from "kysely";
6
+ import { schemaSql } from "./adapters/kysely/schema.js";
7
+ export const USAGE = `Usage:
8
+ artifacts generate [--dialect postgres|sqlite] [--config <file>] [--out <file>]
9
+ Print the kit's schema as SQL, for your own migration tool.
10
+ artifacts migrate [--config <file>]
11
+ Create or upgrade the kit's tables with the backend your config exports.
12
+
13
+ The config file default-exports a backend: \`export default kysely(db)\`, \`await sqlite(path)\`
14
+ or \`postgres({ sql })\`. Without --config: artifacts.config.ts, .mts, .js or .mjs here.`;
15
+ const isMigratable = (value) => typeof value === "object" &&
16
+ value !== null &&
17
+ "migrate" in value &&
18
+ typeof value.migrate === "function" &&
19
+ "schemaSql" in value &&
20
+ typeof value.schemaSql === "function";
21
+ /** A Kysely that compiles for a dialect and connects to nothing, for printing SQL. */
22
+ const coldKysely = (dialect) => new Kysely({
23
+ dialect: {
24
+ createAdapter: () => (dialect === "postgres" ? new PostgresAdapter() : new SqliteAdapter()),
25
+ createDriver: () => new DummyDriver(),
26
+ createIntrospector: (db) => dialect === "postgres" ? new PostgresIntrospector(db) : new SqliteIntrospector(db),
27
+ createQueryCompiler: () => dialect === "postgres" ? new PostgresQueryCompiler() : new SqliteQueryCompiler(),
28
+ },
29
+ });
30
+ const CONFIG_NAMES = [
31
+ "artifacts.config.ts",
32
+ "artifacts.config.mts",
33
+ "artifacts.config.js",
34
+ "artifacts.config.mjs",
35
+ ];
36
+ const findConfig = async (cwd, given) => {
37
+ if (given)
38
+ return resolve(cwd, given);
39
+ const paths = CONFIG_NAMES.map((name) => resolve(cwd, name));
40
+ const exists = await Promise.all(paths.map((path) => access(path).then(() => true, () => false)));
41
+ // The first name in the list that exists wins.
42
+ const found = paths.find((_, index) => exists[index]);
43
+ if (found)
44
+ return found;
45
+ throw new Error(`No config found. Pass --config, or add one of: ${CONFIG_NAMES.join(", ")}.`);
46
+ };
47
+ const loadBackend = async (cwd, given) => {
48
+ const path = await findConfig(cwd, given);
49
+ const loaded = await import(pathToFileURL(path).href);
50
+ const backend = typeof loaded === "object" && loaded !== null && "default" in loaded
51
+ ? await loaded.default
52
+ : undefined;
53
+ if (!isMigratable(backend))
54
+ throw new Error(`${path} must default-export a backend with migrate() and schemaSql(), such as kysely(db).`);
55
+ return backend;
56
+ };
57
+ const DIALECTS = ["postgres", "sqlite"];
58
+ const isDialect = (value) => DIALECTS.includes(value);
59
+ const generate = async (values, io) => {
60
+ const { dialect } = values;
61
+ if (dialect !== undefined && !isDialect(dialect))
62
+ throw new Error(`--dialect must be postgres or sqlite, not "${dialect}".`);
63
+ const text = dialect
64
+ ? schemaSql(coldKysely(dialect))
65
+ : (await loadBackend(io.cwd, values["config"])).schemaSql();
66
+ if (values["out"]) {
67
+ await writeFile(resolve(io.cwd, values["out"]), text);
68
+ io.out(`Wrote the schema to ${values["out"]}.`);
69
+ }
70
+ else
71
+ io.out(text);
72
+ };
73
+ /** Run one command. Returns the process exit code; never exits itself. */
74
+ export const runCli = async (argv, io) => {
75
+ const [command, ...rest] = argv;
76
+ try {
77
+ const { values } = parseArgs({
78
+ args: [...rest],
79
+ options: {
80
+ dialect: { type: "string" },
81
+ config: { type: "string" },
82
+ out: { type: "string" },
83
+ },
84
+ strict: true,
85
+ });
86
+ if (command === "generate") {
87
+ await generate(values, io);
88
+ return 0;
89
+ }
90
+ if (command === "migrate") {
91
+ await (await loadBackend(io.cwd, values.config)).migrate();
92
+ io.out("The kit's tables are up to date.");
93
+ return 0;
94
+ }
95
+ io.out(USAGE);
96
+ return command === undefined || command === "help" || command === "--help" ? 0 : 1;
97
+ }
98
+ catch (error) {
99
+ io.out(error instanceof Error ? error.message : String(error));
100
+ return 1;
101
+ }
102
+ };
103
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/server/cli.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { McpServer } from "@modelcontextprotocol/server";
2
2
  import * as z from "zod/mini";
3
- import { type Actor, type Principal, type Verb } from "../../protocol/index.js";
3
+ import { type Actor, type Principal, type ToolSpec, type Verb } from "../../protocol/index.js";
4
4
  import type { Access as AccessService } from "../core/access.js";
5
5
  import type { ArtifactRow } from "../ports.js";
6
6
  import type { Observe } from "./observe.js";
@@ -40,6 +40,12 @@ export interface ToolDef<S extends z.ZodMiniObject = z.ZodMiniObject, A extends
40
40
  }
41
41
  /** Identity: the type is the documentation. */
42
42
  export declare const defineTool: <S extends z.ZodMiniObject, A extends ToolAccess>(def: ToolDef<S, A>) => ToolDef<S, A>;
43
+ /** A tool built from a shared `ToolSpec`: its name and input come from the spec, and every
44
+ * answer is checked against the spec's output before it leaves, so the typed client never
45
+ * receives a shape it was not promised. */
46
+ export declare const implementTool: <I extends z.ZodMiniObject, O extends z.ZodMiniObject, A extends ToolAccess>(spec: ToolSpec<I, O>, def: Omit<ToolDef<I, A>, "name" | "input" | "run"> & {
47
+ run(args: z.output<I>, scope: ToolScope<A>): Promise<z.input<O>>;
48
+ }) => ToolDef<I, A>;
43
49
  export interface ToolContext {
44
50
  access: AccessService;
45
51
  who: Principal;