@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.
- package/README.md +6 -7
- package/dist/host/client.d.ts +20 -4
- package/dist/host/client.d.ts.map +1 -1
- package/dist/host/client.js +29 -1
- package/dist/host/client.js.map +1 -1
- package/dist/host/index.d.ts +1 -1
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js.map +1 -1
- package/dist/protocol/tools.d.ts +4 -0
- package/dist/protocol/tools.d.ts.map +1 -1
- package/dist/protocol/tools.js +5 -1
- package/dist/protocol/tools.js.map +1 -1
- package/dist/runtime/assets.js +1 -1
- package/dist/runtime.global.js +17 -17
- package/dist/server/adapters/kysely/index.d.ts +30 -0
- package/dist/server/adapters/kysely/index.d.ts.map +1 -0
- package/dist/server/adapters/kysely/index.js +31 -0
- package/dist/server/adapters/kysely/index.js.map +1 -0
- package/dist/server/adapters/kysely/schema.d.ts +11 -0
- package/dist/server/adapters/kysely/schema.d.ts.map +1 -0
- package/dist/server/adapters/kysely/schema.js +159 -0
- package/dist/server/adapters/kysely/schema.js.map +1 -0
- package/dist/server/adapters/kysely/sharing.d.ts +5 -0
- package/dist/server/adapters/kysely/sharing.d.ts.map +1 -0
- package/dist/server/adapters/kysely/sharing.js +81 -0
- package/dist/server/adapters/kysely/sharing.js.map +1 -0
- package/dist/server/adapters/kysely/store.d.ts +87 -0
- package/dist/server/adapters/kysely/store.d.ts.map +1 -0
- package/dist/server/adapters/kysely/store.js +328 -0
- package/dist/server/adapters/kysely/store.js.map +1 -0
- package/dist/server/adapters/sqlite/index.d.ts +7 -8
- package/dist/server/adapters/sqlite/index.d.ts.map +1 -1
- package/dist/server/adapters/sqlite/index.js +24 -44
- package/dist/server/adapters/sqlite/index.js.map +1 -1
- package/dist/server/bin.d.ts +3 -0
- package/dist/server/bin.d.ts.map +1 -0
- package/dist/server/bin.js +7 -0
- package/dist/server/bin.js.map +1 -0
- package/dist/server/cli.d.ts +8 -0
- package/dist/server/cli.d.ts.map +1 -0
- package/dist/server/cli.js +103 -0
- package/dist/server/cli.js.map +1 -0
- package/dist/server/kit/tool.d.ts +7 -1
- package/dist/server/kit/tool.d.ts.map +1 -1
- package/dist/server/kit/tool.js +9 -0
- package/dist/server/kit/tool.js.map +1 -1
- package/dist/server/kit.d.ts +1 -1
- package/dist/server/kit.d.ts.map +1 -1
- package/dist/server/kit.js +1 -1
- package/dist/server/kit.js.map +1 -1
- package/dist/server/sharing/store.d.ts +1 -1
- package/package.json +61 -55
- package/dist/server/adapters/sqlite/schema.d.ts +0 -3
- package/dist/server/adapters/sqlite/schema.d.ts.map +0 -1
- package/dist/server/adapters/sqlite/schema.js +0 -69
- package/dist/server/adapters/sqlite/schema.js.map +0 -1
- package/dist/server/adapters/sqlite/sharing.d.ts +0 -6
- package/dist/server/adapters/sqlite/sharing.d.ts.map +0 -1
- package/dist/server/adapters/sqlite/sharing.js +0 -81
- package/dist/server/adapters/sqlite/sharing.js.map +0 -1
- package/dist/server/adapters/sqlite/store.d.ts +0 -6
- package/dist/server/adapters/sqlite/store.d.ts.map +0 -1
- package/dist/server/adapters/sqlite/store.js +0 -130
- 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 {
|
|
2
|
-
import type
|
|
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
|
|
6
|
-
* `
|
|
7
|
-
export declare const sqlite: (path: string) =>
|
|
8
|
-
db:
|
|
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":"
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
30
|
-
* `
|
|
31
|
-
export const sqlite = (path) => {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/server/bin.ts"],"names":[],"mappings":""}
|
|
@@ -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;
|