@bassfish/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/api.d.ts +365 -0
- package/dist/api.js +113 -0
- package/dist/api.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +217 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.js +68 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +4 -0
- package/dist/daemon.js +220 -0
- package/dist/daemon.js.map +1 -0
- package/dist/domain.d.ts +393 -0
- package/dist/domain.js +75 -0
- package/dist/domain.js.map +1 -0
- package/dist/export.d.ts +7 -0
- package/dist/export.js +37 -0
- package/dist/export.js.map +1 -0
- package/dist/ipc.d.ts +14 -0
- package/dist/ipc.js +125 -0
- package/dist/ipc.js.map +1 -0
- package/dist/lock.d.ts +2 -0
- package/dist/lock.js +18 -0
- package/dist/lock.js.map +1 -0
- package/dist/mcp.d.ts +16 -0
- package/dist/mcp.js +200 -0
- package/dist/mcp.js.map +1 -0
- package/dist/note-cli.d.ts +28 -0
- package/dist/note-cli.js +204 -0
- package/dist/note-cli.js.map +1 -0
- package/dist/note.d.ts +12 -0
- package/dist/note.js +181 -0
- package/dist/note.js.map +1 -0
- package/dist/repository.d.ts +1 -0
- package/dist/repository.js +21 -0
- package/dist/repository.js.map +1 -0
- package/dist/runtime.d.ts +12 -0
- package/dist/runtime.js +32 -0
- package/dist/runtime.js.map +1 -0
- package/dist/service.d.ts +106 -0
- package/dist/service.js +1185 -0
- package/dist/service.js.map +1 -0
- package/dist/setup.d.ts +21 -0
- package/dist/setup.js +108 -0
- package/dist/setup.js.map +1 -0
- package/dist/sql-worker.d.ts +6 -0
- package/dist/sql-worker.js +76 -0
- package/dist/sql-worker.js.map +1 -0
- package/dist/storage/control.d.ts +10 -0
- package/dist/storage/control.js +160 -0
- package/dist/storage/control.js.map +1 -0
- package/dist/storage/dolt.d.ts +32 -0
- package/dist/storage/dolt.js +494 -0
- package/dist/storage/dolt.js.map +1 -0
- package/dist/storage/search.d.ts +22 -0
- package/dist/storage/search.js +75 -0
- package/dist/storage/search.js.map +1 -0
- package/dist/supervisor.d.ts +11 -0
- package/dist/supervisor.js +97 -0
- package/dist/supervisor.js.map +1 -0
- package/dist/tasks.d.ts +52 -0
- package/dist/tasks.js +33 -0
- package/dist/tasks.js.map +1 -0
- package/dist/thread-cli.d.ts +2 -0
- package/dist/thread-cli.js +64 -0
- package/dist/thread-cli.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/storage/control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ContentResourceType, ContentStore, HistoricalNote, HistoryEntry, Note, NoteSnapshot, PendingCommit, ProjectHistoryEntry, ProjectRestoreOperation, ProjectSnapshot, Resolution, Snapshot, StorageResult, Thread, WriteOperation } from '../domain.js';
|
|
2
|
+
export declare class DoltContent implements ContentStore {
|
|
3
|
+
private readonly pool;
|
|
4
|
+
private readonly initialized;
|
|
5
|
+
private readonly unsettled;
|
|
6
|
+
constructor(options: {
|
|
7
|
+
socketPath: string;
|
|
8
|
+
password: string;
|
|
9
|
+
});
|
|
10
|
+
private connection;
|
|
11
|
+
private release;
|
|
12
|
+
ensureProject(projectId: string): Promise<void>;
|
|
13
|
+
private currentHead;
|
|
14
|
+
head(projectId: string): Promise<string>;
|
|
15
|
+
listThreads(projectId: string): Promise<Thread[]>;
|
|
16
|
+
listNotes(projectId: string): Promise<Note[]>;
|
|
17
|
+
resourceType(projectId: string, resourceId: string): Promise<ContentResourceType>;
|
|
18
|
+
snapshot(projectId: string, resourceId: string, limit: number, before?: string, at?: string): Promise<Snapshot>;
|
|
19
|
+
noteSnapshot(projectId: string, resourceId: string, cursor?: string, at?: string): Promise<NoteSnapshot>;
|
|
20
|
+
write(operation: WriteOperation | ProjectRestoreOperation): Promise<StorageResult>;
|
|
21
|
+
private writeProjectRestore;
|
|
22
|
+
history(projectId: string, resourceType: ContentResourceType, resourceId: string): Promise<HistoryEntry[]>;
|
|
23
|
+
commitAtRevision(projectId: string, resourceType: ContentResourceType, resourceId: string, revision: string): Promise<string>;
|
|
24
|
+
maxRevision(projectId: string, resourceType: ContentResourceType, resourceId: string): Promise<string>;
|
|
25
|
+
maxSequence(projectId: string, threadId: string): Promise<string>;
|
|
26
|
+
private operationCommits;
|
|
27
|
+
projectHistory(projectId: string): Promise<ProjectHistoryEntry[]>;
|
|
28
|
+
historicalNotes(projectId: string, at: string): Promise<HistoricalNote[]>;
|
|
29
|
+
projectSnapshot(projectId: string, at?: string): Promise<ProjectSnapshot>;
|
|
30
|
+
resolve(pending: PendingCommit): Promise<Resolution>;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import mysql from 'mysql2/promise';
|
|
2
|
+
import { BassfishError } from '../domain.js';
|
|
3
|
+
import { notePage } from '../domain.js';
|
|
4
|
+
const database = (id) => {
|
|
5
|
+
if (!/^p_[a-f0-9]{32}$/.test(id))
|
|
6
|
+
throw new BassfishError('INVALID_PROJECT', 'Invalid internal project identifier.');
|
|
7
|
+
return `\`${id}\``;
|
|
8
|
+
};
|
|
9
|
+
const threadFrom = (row) => ({ id: row.id, title: row.title, description: row.description, state: row.state,
|
|
10
|
+
revision: String(row.revision), headSequence: String(row.headSequence), creator: row.creator, createdAt: row.createdAt });
|
|
11
|
+
const messageFrom = (row) => ({ id: row.id, threadId: row.threadId, sequence: String(row.sequence),
|
|
12
|
+
identityId: row.identityId, name: row.senderName, instanceId: row.instanceId, createdAt: row.createdAt, body: row.body });
|
|
13
|
+
const noteFrom = (row, links = []) => ({ id: row.id, path: row.path, title: row.title, body: row.body,
|
|
14
|
+
labels: JSON.parse(String(row.labelsJson)), kind: row.noteKind === null ? null : String(row.noteKind), state: row.state,
|
|
15
|
+
revision: String(row.revision), creator: row.creator, creatorName: row.creatorName, lastEditor: row.lastEditor,
|
|
16
|
+
lastEditorName: row.lastEditorName, createdAt: row.createdAt, updatedAt: row.updatedAt, links });
|
|
17
|
+
export class DoltContent {
|
|
18
|
+
pool;
|
|
19
|
+
initialized = new Set();
|
|
20
|
+
unsettled = new Set();
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.pool = mysql.createPool({ ...options, user: 'root', connectionLimit: 8, supportBigNumbers: true, bigNumberStrings: true,
|
|
23
|
+
multipleStatements: false, connectTimeout: 5000, decimalNumbers: false });
|
|
24
|
+
}
|
|
25
|
+
async connection(projectId) {
|
|
26
|
+
const connection = await this.pool.getConnection();
|
|
27
|
+
try {
|
|
28
|
+
await connection.query(`USE ${database(projectId)}`);
|
|
29
|
+
return connection;
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
connection.release();
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
release(connection) { connection.release(); }
|
|
37
|
+
async ensureProject(projectId) {
|
|
38
|
+
if (this.initialized.has(projectId))
|
|
39
|
+
return;
|
|
40
|
+
await this.pool.query(`CREATE DATABASE IF NOT EXISTS ${database(projectId)}`);
|
|
41
|
+
const c = await this.connection(projectId);
|
|
42
|
+
try {
|
|
43
|
+
const [tables] = await c.query('SHOW TABLES');
|
|
44
|
+
const names = tables.map(row => String(Object.values(row)[0]));
|
|
45
|
+
if (names.length === 0) {
|
|
46
|
+
await c.query(`CREATE TABLE threads (
|
|
47
|
+
id VARCHAR(36) PRIMARY KEY, title VARCHAR(200) NOT NULL, description TEXT NOT NULL,
|
|
48
|
+
state VARCHAR(16) NOT NULL, revision BIGINT UNSIGNED NOT NULL, headSequence BIGINT UNSIGNED NOT NULL,
|
|
49
|
+
creator VARCHAR(36) NOT NULL, createdAt VARCHAR(32) NOT NULL
|
|
50
|
+
)`);
|
|
51
|
+
await c.query(`CREATE TABLE messages (
|
|
52
|
+
id VARCHAR(36) PRIMARY KEY, threadId VARCHAR(36) NOT NULL, sequence BIGINT UNSIGNED NOT NULL,
|
|
53
|
+
identityId VARCHAR(36) NOT NULL, senderName VARCHAR(64) NOT NULL, instanceId VARCHAR(36) NOT NULL,
|
|
54
|
+
createdAt VARCHAR(32) NOT NULL, body TEXT NOT NULL,
|
|
55
|
+
UNIQUE KEY thread_sequence(threadId,sequence), FOREIGN KEY (threadId) REFERENCES threads(id)
|
|
56
|
+
)`);
|
|
57
|
+
await c.query(`CREATE TABLE notes (
|
|
58
|
+
id VARCHAR(36) PRIMARY KEY, path VARCHAR(240) COLLATE utf8mb4_bin NOT NULL UNIQUE, title VARCHAR(200) NOT NULL,
|
|
59
|
+
body MEDIUMTEXT NOT NULL, labelsJson TEXT NOT NULL, noteKind VARCHAR(32), state VARCHAR(16) NOT NULL,
|
|
60
|
+
revision BIGINT UNSIGNED NOT NULL, creator VARCHAR(36) NOT NULL, creatorName VARCHAR(64) NOT NULL,
|
|
61
|
+
lastEditor VARCHAR(36) NOT NULL, lastEditorName VARCHAR(64) NOT NULL,
|
|
62
|
+
createdAt VARCHAR(32) NOT NULL, updatedAt VARCHAR(32) NOT NULL
|
|
63
|
+
)`);
|
|
64
|
+
await c.query(`CREATE TABLE resource_links (
|
|
65
|
+
sourceType VARCHAR(16) NOT NULL, sourceId VARCHAR(36) NOT NULL, targetType VARCHAR(16) NOT NULL, targetId VARCHAR(36) NOT NULL,
|
|
66
|
+
PRIMARY KEY(sourceType,sourceId,targetType,targetId)
|
|
67
|
+
)`);
|
|
68
|
+
await c.query(`CREATE TABLE operations (
|
|
69
|
+
operationId VARCHAR(36) PRIMARY KEY, kind VARCHAR(64) NOT NULL, actor_identityId VARCHAR(36) NOT NULL,
|
|
70
|
+
actorName VARCHAR(64) NOT NULL, instanceId VARCHAR(36) NOT NULL, createdAt VARCHAR(32) NOT NULL, reason TEXT
|
|
71
|
+
)`);
|
|
72
|
+
await c.query(`CREATE TABLE operation_objects (
|
|
73
|
+
operationId VARCHAR(36) NOT NULL, resourceType VARCHAR(16) NOT NULL, resourceId VARCHAR(36) NOT NULL,
|
|
74
|
+
beforeRevision BIGINT UNSIGNED NOT NULL, afterRevision BIGINT UNSIGNED NOT NULL,
|
|
75
|
+
PRIMARY KEY(operationId,resourceType,resourceId)
|
|
76
|
+
)`);
|
|
77
|
+
await c.query(`CREATE TABLE message_visibility (
|
|
78
|
+
id VARCHAR(36) PRIMARY KEY, threadId VARCHAR(36) NOT NULL, messageId VARCHAR(36) NOT NULL, visible BOOLEAN NOT NULL,
|
|
79
|
+
threadRevision BIGINT UNSIGNED NOT NULL, operationId VARCHAR(36) NOT NULL, createdAt VARCHAR(32) NOT NULL
|
|
80
|
+
)`);
|
|
81
|
+
await c.query('CREATE TABLE bassfish_meta (schemaVersion INT NOT NULL)');
|
|
82
|
+
await c.query('INSERT INTO bassfish_meta VALUES(3)');
|
|
83
|
+
await c.query("CALL DOLT_COMMIT('-Am', ?, '--author', ?)", ['bassfish:schema:3', 'Bassfish <bassfish@localhost>']);
|
|
84
|
+
}
|
|
85
|
+
else if (!['threads', 'messages', 'notes', 'resource_links', 'operations', 'operation_objects', 'message_visibility', 'bassfish_meta'].every(name => names.includes(name))) {
|
|
86
|
+
throw new BassfishError('RESET_REQUIRED', 'This preview content schema is incompatible. Move it aside with bassfish data reset.');
|
|
87
|
+
}
|
|
88
|
+
const [metadata] = await c.query('SELECT schemaVersion FROM bassfish_meta');
|
|
89
|
+
if (Number(metadata[0]?.schemaVersion) !== 3)
|
|
90
|
+
throw new BassfishError('RESET_REQUIRED', 'This preview content schema is incompatible. Move it aside with bassfish data reset.');
|
|
91
|
+
const [dirty] = await c.query('SELECT * FROM dolt_status');
|
|
92
|
+
if (dirty.length)
|
|
93
|
+
throw new BassfishError('PROJECT_RECOVERING', 'The project has an unexplained working set; it has not been staged, reset, or replayed.');
|
|
94
|
+
this.initialized.add(projectId);
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
this.release(c);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async currentHead(c) {
|
|
101
|
+
const [rows] = await c.query("SELECT DOLT_HASHOF('HEAD') AS hash");
|
|
102
|
+
return String(rows[0].hash);
|
|
103
|
+
}
|
|
104
|
+
async head(projectId) {
|
|
105
|
+
const c = await this.connection(projectId);
|
|
106
|
+
try {
|
|
107
|
+
return await this.currentHead(c);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
this.release(c);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async listThreads(projectId) {
|
|
114
|
+
const c = await this.connection(projectId);
|
|
115
|
+
try {
|
|
116
|
+
const head = await this.currentHead(c);
|
|
117
|
+
const [rows] = await c.query('SELECT * FROM threads AS OF ? ORDER BY createdAt,id', [head]);
|
|
118
|
+
return rows.map(threadFrom);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
this.release(c);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async listNotes(projectId) {
|
|
125
|
+
const c = await this.connection(projectId);
|
|
126
|
+
try {
|
|
127
|
+
const head = await this.currentHead(c);
|
|
128
|
+
const [rows] = await c.query('SELECT * FROM notes AS OF ? ORDER BY path,id', [head]);
|
|
129
|
+
const [linkRows] = await c.query("SELECT * FROM resource_links AS OF ? WHERE sourceType='note'", [head]);
|
|
130
|
+
return rows.map(row => noteFrom(row, linkRows.filter(link => link.sourceId === row.id).map(link => ({ targetType: link.targetType, targetId: link.targetId }))));
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
this.release(c);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async resourceType(projectId, resourceId) {
|
|
137
|
+
const c = await this.connection(projectId);
|
|
138
|
+
try {
|
|
139
|
+
const [threads] = await c.query('SELECT id FROM threads WHERE id=?', [resourceId]);
|
|
140
|
+
if (threads[0])
|
|
141
|
+
return 'thread';
|
|
142
|
+
const [notes] = await c.query('SELECT id FROM notes WHERE id=?', [resourceId]);
|
|
143
|
+
if (notes[0])
|
|
144
|
+
return 'note';
|
|
145
|
+
throw new BassfishError('NOT_FOUND', 'Resource not found in this project.');
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
this.release(c);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async snapshot(projectId, resourceId, limit, before, at) {
|
|
152
|
+
const c = await this.connection(projectId);
|
|
153
|
+
try {
|
|
154
|
+
const commit = at ?? await this.currentHead(c);
|
|
155
|
+
const [threads] = await c.query('SELECT * FROM threads AS OF ? WHERE id=?', [commit, resourceId]);
|
|
156
|
+
if (!threads[0])
|
|
157
|
+
throw new BassfishError('NOT_FOUND', 'Thread not found in this project.');
|
|
158
|
+
const [rows] = await c.query(`SELECT * FROM messages AS OF ? WHERE threadId=? ${before === undefined ? '' : 'AND sequence < ?'} ORDER BY sequence DESC LIMIT ?`, [commit, resourceId, ...(before === undefined ? [] : [before]), limit + 1]);
|
|
159
|
+
const messages = rows.slice(0, limit).map(messageFrom).reverse();
|
|
160
|
+
if (messages.length) {
|
|
161
|
+
const [visibility] = await c.query('SELECT * FROM message_visibility AS OF ? WHERE threadId=? ORDER BY threadRevision,id', [commit, resourceId]);
|
|
162
|
+
const latest = new Map();
|
|
163
|
+
for (const row of visibility)
|
|
164
|
+
latest.set(String(row.messageId), Boolean(row.visible));
|
|
165
|
+
for (const message of messages)
|
|
166
|
+
if (latest.get(message.id) === false) {
|
|
167
|
+
message.body = '';
|
|
168
|
+
message.retracted = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { resourceType: 'thread', thread: threadFrom(threads[0]), commit, messages, truncated: rows.length > limit, nextBefore: rows.length > limit ? messages[0].sequence : null };
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
this.release(c);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async noteSnapshot(projectId, resourceId, cursor, at) {
|
|
178
|
+
const c = await this.connection(projectId);
|
|
179
|
+
try {
|
|
180
|
+
const commit = at ?? await this.currentHead(c);
|
|
181
|
+
const [rows] = await c.query('SELECT * FROM notes AS OF ? WHERE id=?', [commit, resourceId]);
|
|
182
|
+
if (!rows[0])
|
|
183
|
+
throw new BassfishError('NOT_FOUND', 'Note not found in this project.');
|
|
184
|
+
const [linkRows] = await c.query("SELECT * FROM resource_links AS OF ? WHERE sourceType='note' AND sourceId=? ORDER BY targetType,targetId", [commit, resourceId]);
|
|
185
|
+
const note = noteFrom(rows[0], linkRows.map(link => ({ targetType: link.targetType, targetId: link.targetId })));
|
|
186
|
+
return { resourceType: 'note', note, commit, page: notePage(note.body, cursor) };
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
this.release(c);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async write(operation) {
|
|
193
|
+
if (operation.resourceType === 'project')
|
|
194
|
+
return this.writeProjectRestore(operation);
|
|
195
|
+
const c = await this.connection(operation.actor.projectId);
|
|
196
|
+
let commitStarted = false;
|
|
197
|
+
const resource = operation.resourceType === 'thread' ? operation.thread : operation.note;
|
|
198
|
+
const creating = operation.mutation.kind === 'createThread' || operation.mutation.kind === 'createNote';
|
|
199
|
+
const result = { resourceId: resource.id, previousRevision: creating ? '0' : (BigInt(resource.revision) - 1n).toString(), revision: resource.revision, doltCommit: '' };
|
|
200
|
+
try {
|
|
201
|
+
await c.beginTransaction();
|
|
202
|
+
if (operation.resourceType === 'thread' && operation.mutation.kind === 'createThread') {
|
|
203
|
+
const t = operation.thread;
|
|
204
|
+
await c.query('INSERT INTO threads VALUES(?,?,?,?,?,?,?,?)', [t.id, t.title, t.description, t.state, t.revision, t.headSequence, t.creator, t.createdAt]);
|
|
205
|
+
}
|
|
206
|
+
else if (operation.resourceType === 'thread') {
|
|
207
|
+
const t = operation.thread;
|
|
208
|
+
const [updated] = await c.query('UPDATE threads SET title=?,description=?,state=?,revision=?,headSequence=? WHERE id=? AND revision=?', [t.title, t.description, t.state, t.revision, t.headSequence, t.id, result.previousRevision]);
|
|
209
|
+
if (updated.affectedRows !== 1)
|
|
210
|
+
throw new BassfishError('REVISION_CHANGED', 'The persisted thread revision changed.');
|
|
211
|
+
if (operation.mutation.kind === 'appendMessage') {
|
|
212
|
+
// A deterministic server operation ID also identifies this one message; it is never a retry key.
|
|
213
|
+
result.messageId = operation.id;
|
|
214
|
+
result.sequence = t.headSequence;
|
|
215
|
+
await c.query('INSERT INTO messages VALUES(?,?,?,?,?,?,?,?)', [operation.id, t.id, t.headSequence, operation.actor.identityId, operation.actor.name,
|
|
216
|
+
operation.actor.instanceId, operation.at, operation.mutation.body]);
|
|
217
|
+
}
|
|
218
|
+
if (operation.mutation.kind === 'retractMessage' || operation.mutation.kind === 'reinstateMessage') {
|
|
219
|
+
const [message] = await c.query('SELECT id FROM messages WHERE id=? AND threadId=?', [operation.mutation.messageId, t.id]);
|
|
220
|
+
if (!message[0])
|
|
221
|
+
throw new BassfishError('NOT_FOUND', 'Message not found in this thread.');
|
|
222
|
+
await c.query('INSERT INTO message_visibility VALUES(?,?,?,?,?,?,?)', [operation.id, t.id, operation.mutation.messageId, operation.mutation.kind === 'reinstateMessage', t.revision, operation.id, operation.at]);
|
|
223
|
+
}
|
|
224
|
+
for (const [index, change] of (operation.visibilityChanges ?? []).entries()) {
|
|
225
|
+
await c.query('INSERT INTO message_visibility VALUES(?,?,?,?,?,?,?)', [`${operation.id.slice(0, 30)}${String(index).padStart(6, '0')}`, t.id, change.messageId, change.visible, t.revision, operation.id, operation.at]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const n = operation.note;
|
|
230
|
+
if (operation.mutation.kind === 'createNote') {
|
|
231
|
+
try {
|
|
232
|
+
await c.query('INSERT INTO notes VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [n.id, n.path, n.title, n.body, JSON.stringify(n.labels), n.kind, n.state, n.revision, n.creator, n.creatorName, n.lastEditor, n.lastEditorName, n.createdAt, n.updatedAt]);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
if (error.code === 'ER_DUP_ENTRY')
|
|
236
|
+
throw new BassfishError('PATH_CONFLICT', 'A note already reserves this path.');
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
try {
|
|
242
|
+
const [updated] = await c.query('UPDATE notes SET path=?,title=?,body=?,labelsJson=?,noteKind=?,state=?,revision=?,lastEditor=?,lastEditorName=?,updatedAt=? WHERE id=? AND revision=?', [n.path, n.title, n.body, JSON.stringify(n.labels), n.kind, n.state, n.revision, n.lastEditor, n.lastEditorName, n.updatedAt, n.id, result.previousRevision]);
|
|
243
|
+
if (updated.affectedRows !== 1)
|
|
244
|
+
throw new BassfishError('REVISION_CHANGED', 'The persisted note revision changed.');
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (error.code === 'ER_DUP_ENTRY')
|
|
248
|
+
throw new BassfishError('PATH_CONFLICT', 'A note already reserves this path.');
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
await c.query("DELETE FROM resource_links WHERE sourceType='note' AND sourceId=?", [n.id]);
|
|
253
|
+
for (const link of n.links)
|
|
254
|
+
await c.query('INSERT INTO resource_links VALUES(?,?,?,?)', ['note', n.id, link.targetType, link.targetId]);
|
|
255
|
+
}
|
|
256
|
+
await c.query('INSERT INTO operations VALUES(?,?,?,?,?,?,?)', [operation.id, operation.mutation.kind, operation.actor.identityId, operation.actor.name, operation.actor.instanceId, operation.at, null]);
|
|
257
|
+
await c.query('INSERT INTO operation_objects VALUES(?,?,?,?,?)', [operation.id, operation.resourceType, operation.resourceId, result.previousRevision, result.revision]);
|
|
258
|
+
const metadata = JSON.stringify({ bassfish: 1, operationId: operation.id, kind: operation.mutation.kind, actor: operation.actor, at: operation.at, result });
|
|
259
|
+
commitStarted = true;
|
|
260
|
+
const [rows] = await c.query({ sql: "CALL DOLT_COMMIT('-Am', ?, '--author', ?)", timeout: 10_000 }, [metadata, `${operation.actor.name} <${operation.actor.identityId}@bassfish.local>`]);
|
|
261
|
+
const sets = rows;
|
|
262
|
+
const hash = sets[0]?.[0]?.hash;
|
|
263
|
+
result.doltCommit = hash ? String(hash) : await this.currentHead(c);
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
// Once commit was sent, preserve uncertainty and discard the connection; no SQL mutation is repeated.
|
|
268
|
+
if (!commitStarted) {
|
|
269
|
+
try {
|
|
270
|
+
await c.rollback();
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
c.destroy();
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.unsettled.add(operation.id);
|
|
279
|
+
c.destroy();
|
|
280
|
+
}
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
this.release(c);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async writeProjectRestore(operation) {
|
|
288
|
+
const c = await this.connection(operation.actor.projectId);
|
|
289
|
+
let commitStarted = false;
|
|
290
|
+
const result = { operationId: operation.id, targetCommit: operation.target.commit, previousCommit: operation.current.commit, doltCommit: '', changes: operation.changes };
|
|
291
|
+
try {
|
|
292
|
+
await c.beginTransaction();
|
|
293
|
+
if (await this.currentHead(c) !== operation.current.commit)
|
|
294
|
+
throw new BassfishError('PREVIEW_STALE', 'The project changed after the restore preview.');
|
|
295
|
+
await c.query('DELETE FROM resource_links');
|
|
296
|
+
await c.query('DELETE FROM message_visibility');
|
|
297
|
+
await c.query('DELETE FROM messages');
|
|
298
|
+
await c.query('DELETE FROM notes');
|
|
299
|
+
await c.query('DELETE FROM threads');
|
|
300
|
+
for (const thread of operation.target.threads)
|
|
301
|
+
await c.query('INSERT INTO threads VALUES(?,?,?,?,?,?,?,?)', [thread.id, thread.title, thread.description, thread.state, thread.revision, thread.headSequence, thread.creator, thread.createdAt]);
|
|
302
|
+
for (const message of operation.target.messages)
|
|
303
|
+
await c.query('INSERT INTO messages VALUES(?,?,?,?,?,?,?,?)', [message.id, message.threadId, message.sequence, message.identityId, message.name, message.instanceId, message.createdAt, message.body]);
|
|
304
|
+
for (const note of operation.target.notes) {
|
|
305
|
+
await c.query('INSERT INTO notes VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)', [note.id, note.path, note.title, note.body, JSON.stringify(note.labels), note.kind, note.state, note.revision, note.creator, note.creatorName, note.lastEditor, note.lastEditorName, note.createdAt, note.updatedAt]);
|
|
306
|
+
for (const link of note.links)
|
|
307
|
+
await c.query('INSERT INTO resource_links VALUES(?,?,?,?)', ['note', note.id, link.targetType, link.targetId]);
|
|
308
|
+
}
|
|
309
|
+
for (const [index, visibility] of operation.target.visibility.entries())
|
|
310
|
+
await c.query('INSERT INTO message_visibility VALUES(?,?,?,?,?,?,?)', [`${operation.id.slice(0, 29)}${String(index).padStart(7, '0')}`, visibility.threadId, visibility.messageId, visibility.visible, visibility.threadRevision, visibility.operationId, visibility.createdAt]);
|
|
311
|
+
await c.query('INSERT INTO operations VALUES(?,?,?,?,?,?,?)', [operation.id, 'restoreSnapshot', operation.actor.identityId, operation.actor.name, operation.actor.instanceId, operation.at, `Restore ${operation.target.commit}`]);
|
|
312
|
+
for (const change of operation.changes)
|
|
313
|
+
await c.query('INSERT INTO operation_objects VALUES(?,?,?,?,?)', [operation.id, change.resourceType, change.resourceId, change.beforeRevision, change.afterRevision]);
|
|
314
|
+
const metadata = JSON.stringify({ bassfish: 1, operationId: operation.id, kind: 'restoreSnapshot', actor: operation.actor, at: operation.at, result });
|
|
315
|
+
commitStarted = true;
|
|
316
|
+
const [rows] = await c.query({ sql: "CALL DOLT_COMMIT('-Am', ?, '--author', ?)", timeout: 10_000 }, [metadata, `${operation.actor.name} <${operation.actor.identityId}@bassfish.local>`]);
|
|
317
|
+
const sets = rows;
|
|
318
|
+
const hash = sets[0]?.[0]?.hash;
|
|
319
|
+
result.doltCommit = hash ? String(hash) : await this.currentHead(c);
|
|
320
|
+
return result;
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (!commitStarted) {
|
|
324
|
+
try {
|
|
325
|
+
await c.rollback();
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
c.destroy();
|
|
329
|
+
throw error;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
this.unsettled.add(operation.id);
|
|
334
|
+
c.destroy();
|
|
335
|
+
}
|
|
336
|
+
throw error;
|
|
337
|
+
}
|
|
338
|
+
finally {
|
|
339
|
+
this.release(c);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async history(projectId, resourceType, resourceId) {
|
|
343
|
+
const c = await this.connection(projectId);
|
|
344
|
+
try {
|
|
345
|
+
const [rows] = await c.query(`SELECT o.*,x.beforeRevision,x.afterRevision
|
|
346
|
+
FROM operations o JOIN operation_objects x ON x.operationId=o.operationId
|
|
347
|
+
WHERE x.resourceType=? AND x.resourceId=? ORDER BY o.createdAt DESC,o.operationId DESC`, [resourceType, resourceId]);
|
|
348
|
+
const [logs] = await c.query('SELECT commit_hash,message FROM dolt_log');
|
|
349
|
+
const commits = new Map();
|
|
350
|
+
for (const log of logs) {
|
|
351
|
+
try {
|
|
352
|
+
const meta = JSON.parse(String(log.message));
|
|
353
|
+
if (meta.operationId)
|
|
354
|
+
commits.set(meta.operationId, String(log.commit_hash));
|
|
355
|
+
}
|
|
356
|
+
catch { }
|
|
357
|
+
}
|
|
358
|
+
return rows.map(row => ({ operationId: row.operationId, kind: row.kind, actorIdentityId: row.actor_identityId, actorName: row.actorName,
|
|
359
|
+
instanceId: row.instanceId, createdAt: row.createdAt, reason: row.reason, beforeRevision: String(row.beforeRevision), afterRevision: String(row.afterRevision), doltCommit: commits.get(String(row.operationId)) ?? '' }));
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
this.release(c);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async commitAtRevision(projectId, resourceType, resourceId, revision) {
|
|
366
|
+
const entries = await this.history(projectId, resourceType, resourceId);
|
|
367
|
+
const entry = entries.find(item => item.afterRevision === revision);
|
|
368
|
+
if (!entry?.doltCommit)
|
|
369
|
+
throw new BassfishError('REVISION_NOT_FOUND', 'No committed content exists at that resource revision.');
|
|
370
|
+
return entry.doltCommit;
|
|
371
|
+
}
|
|
372
|
+
async maxRevision(projectId, resourceType, resourceId) {
|
|
373
|
+
const c = await this.connection(projectId);
|
|
374
|
+
try {
|
|
375
|
+
const [rows] = await c.query('SELECT MAX(afterRevision) AS revision FROM operation_objects WHERE resourceType=? AND resourceId=?', [resourceType, resourceId]);
|
|
376
|
+
return rows[0]?.revision === null || rows[0]?.revision === undefined ? '0' : String(rows[0].revision);
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
this.release(c);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
async maxSequence(projectId, threadId) {
|
|
383
|
+
const entries = await this.history(projectId, 'thread', threadId);
|
|
384
|
+
let maximum = 0n;
|
|
385
|
+
const c = await this.connection(projectId);
|
|
386
|
+
try {
|
|
387
|
+
for (const entry of entries) {
|
|
388
|
+
if (!entry.doltCommit)
|
|
389
|
+
continue;
|
|
390
|
+
const [rows] = await c.query('SELECT headSequence FROM threads AS OF ? WHERE id=?', [entry.doltCommit, threadId]);
|
|
391
|
+
if (rows[0])
|
|
392
|
+
maximum = maximum > BigInt(rows[0].headSequence) ? maximum : BigInt(rows[0].headSequence);
|
|
393
|
+
}
|
|
394
|
+
return String(maximum);
|
|
395
|
+
}
|
|
396
|
+
finally {
|
|
397
|
+
this.release(c);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async operationCommits(c) {
|
|
401
|
+
const [logs] = await c.query('SELECT commit_hash,message FROM dolt_log');
|
|
402
|
+
const commits = new Map();
|
|
403
|
+
for (const log of logs) {
|
|
404
|
+
try {
|
|
405
|
+
const meta = JSON.parse(String(log.message));
|
|
406
|
+
if (meta.operationId)
|
|
407
|
+
commits.set(meta.operationId, String(log.commit_hash));
|
|
408
|
+
}
|
|
409
|
+
catch { }
|
|
410
|
+
}
|
|
411
|
+
return commits;
|
|
412
|
+
}
|
|
413
|
+
async projectHistory(projectId) {
|
|
414
|
+
const c = await this.connection(projectId);
|
|
415
|
+
try {
|
|
416
|
+
const [rows] = await c.query('SELECT * FROM operations ORDER BY createdAt DESC,operationId DESC');
|
|
417
|
+
const commits = await this.operationCommits(c);
|
|
418
|
+
return rows.map(row => ({ operationId: String(row.operationId), kind: String(row.kind), actorIdentityId: String(row.actor_identityId), actorName: String(row.actorName), instanceId: String(row.instanceId), createdAt: String(row.createdAt), doltCommit: commits.get(String(row.operationId)) ?? '' }));
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
this.release(c);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
async historicalNotes(projectId, at) {
|
|
425
|
+
const c = await this.connection(projectId);
|
|
426
|
+
try {
|
|
427
|
+
const [rows] = await c.query(`SELECT o.operationId,o.createdAt,x.afterRevision FROM operations AS OF ? AS o JOIN operation_objects AS OF ? AS x ON x.operationId=o.operationId WHERE x.resourceType='note' ORDER BY o.createdAt,o.operationId`, [at, at]);
|
|
428
|
+
const commits = await this.operationCommits(c);
|
|
429
|
+
const output = [];
|
|
430
|
+
for (const row of rows) {
|
|
431
|
+
const commit = commits.get(String(row.operationId));
|
|
432
|
+
if (!commit)
|
|
433
|
+
continue;
|
|
434
|
+
const [notes] = await c.query('SELECT * FROM notes AS OF ? WHERE id=(SELECT resourceId FROM operation_objects AS OF ? WHERE operationId=? AND resourceType=\'note\')', [commit, commit, row.operationId]);
|
|
435
|
+
if (!notes[0])
|
|
436
|
+
continue;
|
|
437
|
+
const [links] = await c.query("SELECT * FROM resource_links AS OF ? WHERE sourceType='note' AND sourceId=? ORDER BY targetType,targetId", [commit, notes[0].id]);
|
|
438
|
+
output.push({ note: noteFrom(notes[0], links.map(link => ({ targetType: link.targetType, targetId: link.targetId }))), doltCommit: commit, changedAt: String(row.createdAt) });
|
|
439
|
+
}
|
|
440
|
+
return output;
|
|
441
|
+
}
|
|
442
|
+
finally {
|
|
443
|
+
this.release(c);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
async projectSnapshot(projectId, at) {
|
|
447
|
+
const c = await this.connection(projectId);
|
|
448
|
+
try {
|
|
449
|
+
const commit = at ?? await this.currentHead(c);
|
|
450
|
+
const [threads] = await c.query('SELECT * FROM threads AS OF ? ORDER BY id', [commit]);
|
|
451
|
+
const [messages] = await c.query('SELECT * FROM messages AS OF ? ORDER BY threadId,sequence', [commit]);
|
|
452
|
+
const [notes] = await c.query('SELECT * FROM notes AS OF ? ORDER BY id', [commit]);
|
|
453
|
+
const [links] = await c.query('SELECT * FROM resource_links AS OF ? ORDER BY sourceType,sourceId,targetType,targetId', [commit]);
|
|
454
|
+
const [visibility] = await c.query('SELECT * FROM message_visibility AS OF ? ORDER BY threadId,threadRevision,id', [commit]);
|
|
455
|
+
return { commit, threads: threads.map(threadFrom), messages: messages.map(messageFrom), notes: notes.map(row => noteFrom(row, links.filter(link => link.sourceType === 'note' && link.sourceId === row.id).map(link => ({ targetType: link.targetType, targetId: link.targetId })))),
|
|
456
|
+
visibility: visibility.map(row => ({ messageId: row.messageId, threadId: row.threadId, visible: Boolean(row.visible), threadRevision: String(row.threadRevision), operationId: row.operationId, createdAt: row.createdAt })) };
|
|
457
|
+
}
|
|
458
|
+
finally {
|
|
459
|
+
this.release(c);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
async resolve(pending) {
|
|
463
|
+
const c = await this.connection(pending.projectId);
|
|
464
|
+
try {
|
|
465
|
+
const [logs] = await c.query('SELECT commit_hash,message FROM dolt_log');
|
|
466
|
+
for (const log of logs) {
|
|
467
|
+
let meta;
|
|
468
|
+
try {
|
|
469
|
+
meta = JSON.parse(String(log.message));
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
if (meta.bassfish === 1 && meta.operationId === pending.id) {
|
|
475
|
+
// Working changes still need diagnosis; a found commit is not permission to stage an unexplained working set.
|
|
476
|
+
const [dirty] = await c.query('SELECT * FROM dolt_status');
|
|
477
|
+
if (dirty.length)
|
|
478
|
+
return { state: 'unknown' };
|
|
479
|
+
return { state: 'committed', result: { ...meta.result, doltCommit: String(log.commit_hash) } };
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
const head = await this.currentHead(c);
|
|
483
|
+
const [dirty] = await c.query('SELECT * FROM dolt_status');
|
|
484
|
+
// The supervisor guarantees that no old SQL server remains when restart recovery runs.
|
|
485
|
+
// In-process unknown commits require the same exclusion; the caller must restart the SQL service first.
|
|
486
|
+
return !this.unsettled.has(pending.id) && head === pending.startingHead && dirty.length === 0 ? { state: 'absent' } : { state: 'unknown' };
|
|
487
|
+
}
|
|
488
|
+
finally {
|
|
489
|
+
this.release(c);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
async close() { await this.pool.end(); }
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=dolt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dolt.js","sourceRoot":"","sources":["../../src/storage/dolt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { HistoricalNote, Note } from '../domain.js';
|
|
2
|
+
export interface SearchMatch {
|
|
3
|
+
noteId: string;
|
|
4
|
+
path: string;
|
|
5
|
+
revision: string;
|
|
6
|
+
snippet: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HistoricalSearchMatch extends SearchMatch {
|
|
9
|
+
doltCommit: string;
|
|
10
|
+
changedAt: string;
|
|
11
|
+
state: string;
|
|
12
|
+
}
|
|
13
|
+
/** Disposable current-state index. A head mismatch always triggers a full rebuild from Dolt. */
|
|
14
|
+
export declare class NoteSearchIndex {
|
|
15
|
+
private readonly db;
|
|
16
|
+
constructor(path: string);
|
|
17
|
+
ensure(projectId: string, head: string, notes: Note[]): void;
|
|
18
|
+
search(projectId: string, query: string, states: string[], limit: number, offset: number): SearchMatch[];
|
|
19
|
+
ensureHistory(projectId: string, head: string, notes: HistoricalNote[]): void;
|
|
20
|
+
searchHistory(projectId: string, query: string, states: string[], noteId: string | undefined, limit: number, offset: number): HistoricalSearchMatch[];
|
|
21
|
+
close(): void;
|
|
22
|
+
}
|