@mandible-ai/mandible 0.3.13 → 0.3.14

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 (107) hide show
  1. package/README.md +5 -7
  2. package/dist/src/cli/index.js +6 -0
  3. package/dist/src/cli/index.js.map +1 -1
  4. package/dist/src/cli/init.d.ts +25 -0
  5. package/dist/src/cli/init.d.ts.map +1 -0
  6. package/dist/src/cli/init.js +348 -0
  7. package/dist/src/cli/init.js.map +1 -0
  8. package/dist/src/core/events.d.ts +1 -1
  9. package/dist/src/core/events.d.ts.map +1 -1
  10. package/dist/src/core/events.js.map +1 -1
  11. package/dist/src/core/runtime.d.ts.map +1 -1
  12. package/dist/src/core/runtime.js +25 -2
  13. package/dist/src/core/runtime.js.map +1 -1
  14. package/dist/src/core/types.d.ts +12 -0
  15. package/dist/src/core/types.d.ts.map +1 -1
  16. package/dist/src/core/types.js.map +1 -1
  17. package/dist/src/core/validation.d.ts +7 -0
  18. package/dist/src/core/validation.d.ts.map +1 -1
  19. package/dist/src/core/validation.js +19 -0
  20. package/dist/src/core/validation.js.map +1 -1
  21. package/dist/src/dsl/builder.d.ts +2 -0
  22. package/dist/src/dsl/builder.d.ts.map +1 -1
  23. package/dist/src/dsl/builder.js +5 -0
  24. package/dist/src/dsl/builder.js.map +1 -1
  25. package/dist/src/dsl/mandible.d.ts +1 -1
  26. package/dist/src/dsl/mandible.js +1 -1
  27. package/dist/src/environments/dolt/adapter.d.ts +21 -7
  28. package/dist/src/environments/dolt/adapter.d.ts.map +1 -1
  29. package/dist/src/environments/dolt/adapter.js +319 -59
  30. package/dist/src/environments/dolt/adapter.js.map +1 -1
  31. package/dist/src/environments/dolt/client.d.ts +72 -0
  32. package/dist/src/environments/dolt/client.d.ts.map +1 -0
  33. package/dist/src/environments/dolt/client.js +209 -0
  34. package/dist/src/environments/dolt/client.js.map +1 -0
  35. package/dist/src/environments/dolt/index.d.ts +2 -0
  36. package/dist/src/environments/dolt/index.d.ts.map +1 -1
  37. package/dist/src/environments/dolt/index.js +2 -0
  38. package/dist/src/environments/dolt/index.js.map +1 -1
  39. package/dist/src/environments/dolt/sql-client.d.ts +24 -0
  40. package/dist/src/environments/dolt/sql-client.d.ts.map +1 -0
  41. package/dist/src/environments/dolt/sql-client.js +46 -0
  42. package/dist/src/environments/dolt/sql-client.js.map +1 -0
  43. package/dist/src/environments/filesystem/adapter.d.ts +4 -0
  44. package/dist/src/environments/filesystem/adapter.d.ts.map +1 -1
  45. package/dist/src/environments/filesystem/adapter.js +23 -0
  46. package/dist/src/environments/filesystem/adapter.js.map +1 -1
  47. package/dist/src/environments/github/adapter.d.ts +4 -0
  48. package/dist/src/environments/github/adapter.d.ts.map +1 -1
  49. package/dist/src/environments/github/adapter.js +18 -0
  50. package/dist/src/environments/github/adapter.js.map +1 -1
  51. package/dist/src/hosts/docker.d.ts +52 -37
  52. package/dist/src/hosts/docker.d.ts.map +1 -1
  53. package/dist/src/hosts/docker.js +207 -90
  54. package/dist/src/hosts/docker.js.map +1 -1
  55. package/dist/src/index.d.ts +9 -2
  56. package/dist/src/index.d.ts.map +1 -1
  57. package/dist/src/index.js +5 -1
  58. package/dist/src/index.js.map +1 -1
  59. package/dist/src/patterns/barrier.d.ts +104 -0
  60. package/dist/src/patterns/barrier.d.ts.map +1 -0
  61. package/dist/src/patterns/barrier.js +196 -0
  62. package/dist/src/patterns/barrier.js.map +1 -0
  63. package/dist/src/patterns/gate.d.ts +71 -0
  64. package/dist/src/patterns/gate.d.ts.map +1 -0
  65. package/dist/src/patterns/gate.js +167 -0
  66. package/dist/src/patterns/gate.js.map +1 -0
  67. package/dist/src/patterns/index.d.ts +4 -0
  68. package/dist/src/patterns/index.d.ts.map +1 -1
  69. package/dist/src/patterns/index.js +2 -0
  70. package/dist/src/patterns/index.js.map +1 -1
  71. package/dist/src/providers/claude-code.d.ts.map +1 -1
  72. package/dist/src/providers/claude-code.js +5 -4
  73. package/dist/src/providers/claude-code.js.map +1 -1
  74. package/dist/src/providers/context.d.ts.map +1 -1
  75. package/dist/src/providers/context.js +16 -10
  76. package/dist/src/providers/context.js.map +1 -1
  77. package/dist/src/providers/index.d.ts +12 -1
  78. package/dist/src/providers/index.d.ts.map +1 -1
  79. package/dist/src/providers/index.js +11 -0
  80. package/dist/src/providers/index.js.map +1 -1
  81. package/dist/src/providers/llm.d.ts +17 -0
  82. package/dist/src/providers/llm.d.ts.map +1 -0
  83. package/dist/src/providers/llm.js +225 -0
  84. package/dist/src/providers/llm.js.map +1 -0
  85. package/dist/src/providers/opencode.d.ts +87 -0
  86. package/dist/src/providers/opencode.d.ts.map +1 -0
  87. package/dist/src/providers/opencode.js +170 -0
  88. package/dist/src/providers/opencode.js.map +1 -0
  89. package/dist/src/providers/qwen-code.d.ts +69 -0
  90. package/dist/src/providers/qwen-code.d.ts.map +1 -0
  91. package/dist/src/providers/qwen-code.js +175 -0
  92. package/dist/src/providers/qwen-code.js.map +1 -0
  93. package/dist/src/providers/skill.d.ts +120 -0
  94. package/dist/src/providers/skill.d.ts.map +1 -0
  95. package/dist/src/providers/skill.js +262 -0
  96. package/dist/src/providers/skill.js.map +1 -0
  97. package/dist/src/providers/tool-loop.d.ts +163 -0
  98. package/dist/src/providers/tool-loop.d.ts.map +1 -0
  99. package/dist/src/providers/tool-loop.js +580 -0
  100. package/dist/src/providers/tool-loop.js.map +1 -0
  101. package/dist/src/providers/types.d.ts +63 -0
  102. package/dist/src/providers/types.d.ts.map +1 -1
  103. package/dist/src/providers/vllm.d.ts +62 -0
  104. package/dist/src/providers/vllm.d.ts.map +1 -0
  105. package/dist/src/providers/vllm.js +262 -0
  106. package/dist/src/providers/vllm.js.map +1 -0
  107. package/package.json +7 -2
@@ -1,15 +1,11 @@
1
1
  // ============================================================
2
- // Dolt Environment Adapter (Stub)
2
+ // Dolt Environment Adapter — DoltHub HTTP API
3
3
  // ============================================================
4
- // Dolt is a SQL database with Git-like versioning.
5
- // This makes it a natural stigmergy environment because:
4
+ // Maps the stigmergy Environment interface to a DoltHub database
5
+ // via the DoltHub v1alpha1 REST API.
6
6
  //
7
- // 1. Signals = rows in a signals table
8
- // 2. Concentration = numeric column, trivial to query/sort
9
- // 3. Claims = SELECT ... FOR UPDATE (real DB-level locking)
10
- // 4. History = Dolt's built-in versioning (dolt_diff, dolt_log)
11
- // 5. Watch = Dolt's binlog or polling
12
- // 6. Branching = multiple environment "realities" (experiments!)
7
+ // No local Dolt server or mysql2 dependency required — just a
8
+ // DoltHub account, a database, and an API token.
13
9
  //
14
10
  // Schema:
15
11
  // CREATE TABLE signals (
@@ -28,84 +24,289 @@
28
24
  // withdrawn BOOLEAN DEFAULT FALSE,
29
25
  // INDEX idx_type (type),
30
26
  // INDEX idx_concentration (concentration),
31
- // INDEX idx_unclaimed (claimed_by, withdrawn)
27
+ // INDEX idx_unclaimed (withdrawn, claimed_by)
32
28
  // );
33
29
  //
34
- // The branching capability opens up a fascinating pattern:
35
- // - Shaper colony works on a Dolt branch
36
- // - Critic colony reviews by diffing branches
37
- // - Keeper merges branches (Dolt merge = Git merge for data)
38
- // - Signals themselves can be branched and merged!
30
+ // Branching capability:
31
+ // - createBranch / mergeBranch / diffBranch
32
+ // - Colonies can operate on branches for isolation
33
+ // - Dolt handles merge conflicts at the row level
39
34
  // ============================================================
40
35
  import { registerEnvironment } from '../../core/environment-registry.js';
36
+ import { createSignal } from '../../core/signal.js';
37
+ import { validateSignalInput } from '../../core/validation.js';
38
+ import { DoltHubClient, sqlValue } from './client.js';
39
+ import { tryCreateSQLClient } from './sql-client.js';
40
+ const CREATE_TABLE_SQL = `CREATE TABLE IF NOT EXISTS signals (
41
+ id VARCHAR(64) PRIMARY KEY,
42
+ type VARCHAR(255) NOT NULL,
43
+ payload JSON,
44
+ deposited_at BIGINT NOT NULL,
45
+ deposited_by VARCHAR(255),
46
+ concentration DECIMAL(5,4) DEFAULT 1.0,
47
+ ttl BIGINT,
48
+ claimed_by VARCHAR(255),
49
+ claimed_at BIGINT,
50
+ claim_lease BIGINT,
51
+ caused_by JSON,
52
+ tags JSON,
53
+ withdrawn BOOLEAN DEFAULT FALSE,
54
+ INDEX idx_type (type),
55
+ INDEX idx_concentration (concentration),
56
+ INDEX idx_unclaimed (withdrawn, claimed_by)
57
+ )`;
41
58
  export class DoltEnvironment {
42
59
  name;
60
+ client;
61
+ sqlClient;
43
62
  config;
63
+ pollInterval;
64
+ initPromise;
44
65
  constructor(config) {
45
66
  this.config = config;
46
- this.name = config.name ?? `dolt:${config.database}/${config.branch ?? 'main'}`;
67
+ this.client = new DoltHubClient(config);
68
+ this.name = config.name ?? `dolt:${config.owner}/${config.database}/${config.branch ?? 'main'}`;
69
+ this.pollInterval = config.pollInterval ?? 5000;
70
+ }
71
+ ensureInit() {
72
+ if (!this.initPromise) {
73
+ this.initPromise = this.doInit();
74
+ }
75
+ return this.initPromise;
76
+ }
77
+ async doInit() {
78
+ // Try to connect via mysql2 if sql config provided
79
+ if (this.config.sql && !this.sqlClient) {
80
+ const client = await tryCreateSQLClient(this.config.sql);
81
+ if (client) {
82
+ this.sqlClient = client;
83
+ }
84
+ }
85
+ await this.activeClient.execute(CREATE_TABLE_SQL);
86
+ }
87
+ /** Returns the SQL client if available, otherwise falls back to HTTP client */
88
+ get activeClient() {
89
+ return this.sqlClient ?? this.client;
47
90
  }
48
91
  // ----------------------------------------------------------
49
- // All methods throw until a Dolt client is integrated.
50
- // The interface is identical to FilesystemEnvironment so
51
- // colony definitions work unchanged across either env.
92
+ // Core operations
52
93
  // ----------------------------------------------------------
53
94
  async observe(query) {
54
- // TODO: SELECT * FROM signals WHERE type LIKE ? AND concentration >= ? AND claimed_by IS NULL ...
55
- // Dolt's SQL engine makes this trivially efficient with proper indexes.
56
- throw new Error('DoltEnvironment: not yet implemented. Install doltdb and configure connection.');
95
+ await this.ensureInit();
96
+ const conditions = ['withdrawn = FALSE'];
97
+ if (query.type) {
98
+ if (Array.isArray(query.type)) {
99
+ const likes = query.type.map(t => `type LIKE ${sqlValue(globToLike(t))}`);
100
+ conditions.push(`(${likes.join(' OR ')})`);
101
+ }
102
+ else {
103
+ conditions.push(`type LIKE ${sqlValue(globToLike(query.type))}`);
104
+ }
105
+ }
106
+ if (query.minConcentration !== undefined) {
107
+ conditions.push(`concentration >= ${sqlValue(query.minConcentration)}`);
108
+ }
109
+ if (query.unclaimed) {
110
+ conditions.push('claimed_by IS NULL');
111
+ }
112
+ if (query.tags && query.tags.length > 0) {
113
+ // Check that all query tags exist in the signal's tags JSON array
114
+ for (const tag of query.tags) {
115
+ conditions.push(`JSON_CONTAINS(tags, ${sqlValue(JSON.stringify(tag))})`);
116
+ }
117
+ }
118
+ if (query.after !== undefined) {
119
+ conditions.push(`deposited_at > ${sqlValue(query.after)}`);
120
+ }
121
+ let sql = `SELECT * FROM signals WHERE ${conditions.join(' AND ')} ORDER BY concentration DESC`;
122
+ if (query.limit) {
123
+ sql += ` LIMIT ${sanitizeLimit(query.limit)}`;
124
+ }
125
+ const { rows } = await this.activeClient.query(sql);
126
+ let signals = rows.map(rowToSignal);
127
+ // Apply custom filter predicate if provided (can't express in SQL)
128
+ if (query.filter) {
129
+ signals = signals.filter(query.filter);
130
+ }
131
+ return signals;
57
132
  }
58
133
  async deposit(input) {
59
- // TODO: INSERT INTO signals (id, type, payload, ...) VALUES (?, ?, ?, ...)
60
- // Then: CALL DOLT_COMMIT('-m', 'deposit: {type}') ← auto-version each signal!
61
- throw new Error('DoltEnvironment: not yet implemented.');
134
+ await this.ensureInit();
135
+ validateSignalInput(input);
136
+ const signal = createSignal(input.type, input.payload, {
137
+ deposited_by: input.meta?.deposited_by,
138
+ ttl: input.meta?.ttl,
139
+ tags: input.meta?.tags,
140
+ caused_by: input.meta?.caused_by,
141
+ concentration: input.meta?.concentration,
142
+ });
143
+ const sql = `INSERT INTO signals (id, type, payload, deposited_at, deposited_by, concentration, ttl, caused_by, tags, withdrawn) VALUES (${sqlValue(signal.id)}, ${sqlValue(signal.type)}, ${sqlValue(JSON.stringify(signal.payload))}, ${sqlValue(signal.meta.deposited_at)}, ${sqlValue(signal.meta.deposited_by)}, ${sqlValue(signal.meta.concentration)}, ${signal.meta.ttl != null ? sqlValue(signal.meta.ttl) : 'NULL'}, ${signal.meta.caused_by ? sqlValue(JSON.stringify(signal.meta.caused_by)) : 'NULL'}, ${signal.meta.tags ? sqlValue(JSON.stringify(signal.meta.tags)) : 'NULL'}, FALSE)`;
144
+ await this.activeClient.execute(sql);
145
+ return signal;
62
146
  }
63
147
  async withdraw(signalId) {
64
- // TODO: UPDATE signals SET withdrawn = TRUE WHERE id = ?
65
- // Dolt keeps the history automatically no need for a separate withdrawn table.
66
- throw new Error('DoltEnvironment: not yet implemented.');
148
+ await this.ensureInit();
149
+ await this.activeClient.execute(`UPDATE signals SET withdrawn = TRUE WHERE id = ${sqlValue(signalId)}`);
67
150
  }
68
- async claim(signalId, claimant, leaseDuration) {
69
- // TODO: BEGIN; SELECT ... FOR UPDATE; UPDATE SET claimed_by = ?; COMMIT;
70
- // This gives us real ACID claim semantics — no filesystem race conditions.
71
- throw new Error('DoltEnvironment: not yet implemented.');
151
+ async update(signalId, changes) {
152
+ await this.ensureInit();
153
+ const setClauses = [];
154
+ if (changes.payload) {
155
+ // Read current payload, merge, then SET
156
+ const { rows } = await this.activeClient.query(`SELECT payload FROM signals WHERE id = ${sqlValue(signalId)} AND withdrawn = FALSE`);
157
+ if (rows.length === 0) {
158
+ throw new Error(`Signal ${signalId} not found or already withdrawn`);
159
+ }
160
+ const current = (parseJSON(rows[0].payload) ?? {});
161
+ const merged = { ...current, ...changes.payload };
162
+ setClauses.push(`payload = ${sqlValue(JSON.stringify(merged))}`);
163
+ }
164
+ if (changes.meta?.tags !== undefined) {
165
+ setClauses.push(`tags = ${sqlValue(JSON.stringify(changes.meta.tags))}`);
166
+ }
167
+ if (changes.meta?.concentration !== undefined) {
168
+ setClauses.push(`concentration = ${sqlValue(changes.meta.concentration)}`);
169
+ }
170
+ if (setClauses.length === 0) {
171
+ // No changes — just read and return
172
+ const { rows } = await this.activeClient.query(`SELECT * FROM signals WHERE id = ${sqlValue(signalId)} AND withdrawn = FALSE`);
173
+ if (rows.length === 0) {
174
+ throw new Error(`Signal ${signalId} not found or already withdrawn`);
175
+ }
176
+ return rowToSignal(rows[0]);
177
+ }
178
+ const updateSql = `UPDATE signals SET ${setClauses.join(', ')} WHERE id = ${sqlValue(signalId)} AND withdrawn = FALSE`;
179
+ const result = await this.activeClient.execute(updateSql);
180
+ if (result.affectedRows === 0) {
181
+ throw new Error(`Signal ${signalId} not found or already withdrawn`);
182
+ }
183
+ // Re-read the updated signal
184
+ const { rows } = await this.activeClient.query(`SELECT * FROM signals WHERE id = ${sqlValue(signalId)}`);
185
+ return rowToSignal(rows[0]);
186
+ }
187
+ async claim(signalId, claimant, leaseDuration = 60_000) {
188
+ await this.ensureInit();
189
+ const now = Date.now();
190
+ const sql = `UPDATE signals SET claimed_by = ${sqlValue(claimant)}, claimed_at = ${sqlValue(now)}, claim_lease = ${sqlValue(leaseDuration)} WHERE id = ${sqlValue(signalId)} AND withdrawn = FALSE AND (claimed_by IS NULL OR (claimed_at + claim_lease) < ${sqlValue(now)})`;
191
+ const result = await this.activeClient.execute(sql);
192
+ return result.affectedRows > 0;
72
193
  }
73
194
  async release(signalId) {
74
- // TODO: UPDATE signals SET claimed_by = NULL, claimed_at = NULL WHERE id = ?
75
- throw new Error('DoltEnvironment: not yet implemented.');
195
+ await this.ensureInit();
196
+ await this.activeClient.execute(`UPDATE signals SET claimed_by = NULL, claimed_at = NULL, claim_lease = NULL WHERE id = ${sqlValue(signalId)}`);
76
197
  }
77
198
  watch(query, callback) {
78
- // TODO: Poll-based initially, or use Dolt's binlog for push.
79
- // Dolt also supports `dolt_diff()` which could detect new signals by comparing commits.
80
- throw new Error('DoltEnvironment: not yet implemented.');
199
+ const seen = new Set();
200
+ let active = true;
201
+ let timer;
202
+ const poll = async () => {
203
+ if (!active)
204
+ return;
205
+ try {
206
+ const signals = await this.observe(query);
207
+ for (const signal of signals) {
208
+ if (!active)
209
+ return;
210
+ if (!seen.has(signal.id)) {
211
+ seen.add(signal.id);
212
+ callback(signal);
213
+ }
214
+ }
215
+ }
216
+ catch {
217
+ // Swallow errors during polling — will retry on next interval
218
+ }
219
+ };
220
+ // Initial poll, then interval
221
+ const setup = async () => {
222
+ await poll();
223
+ if (active) {
224
+ timer = setInterval(poll, this.pollInterval);
225
+ }
226
+ };
227
+ setup();
228
+ return {
229
+ unsubscribe() {
230
+ active = false;
231
+ if (timer)
232
+ clearInterval(timer);
233
+ },
234
+ };
81
235
  }
82
236
  async history(query) {
83
- // TODO: This is where Dolt SHINES.
84
- // SELECT * FROM `dolt_history_signals` WHERE type LIKE ?
85
- // Gets the full history of every signal across all commits.
86
- // Can even query: "what did the signal table look like 5 minutes ago?"
87
- // AS OF 'HEAD~5' or AS OF TIMESTAMP '2024-01-01 00:00:00'
88
- throw new Error('DoltEnvironment: not yet implemented.');
237
+ await this.ensureInit();
238
+ const conditions = [];
239
+ if (!query.includeWithdrawn) {
240
+ conditions.push('withdrawn = FALSE');
241
+ }
242
+ if (query.type) {
243
+ if (Array.isArray(query.type)) {
244
+ const likes = query.type.map(t => `type LIKE ${sqlValue(globToLike(t))}`);
245
+ conditions.push(`(${likes.join(' OR ')})`);
246
+ }
247
+ else {
248
+ conditions.push(`type LIKE ${sqlValue(globToLike(query.type))}`);
249
+ }
250
+ }
251
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
252
+ let sql = `SELECT * FROM signals ${where} ORDER BY deposited_at DESC`;
253
+ if (query.limit) {
254
+ sql += ` LIMIT ${sanitizeLimit(query.limit)}`;
255
+ }
256
+ const { rows } = await this.activeClient.query(sql);
257
+ let signals = rows.map(rowToSignal);
258
+ if (query.filter) {
259
+ signals = signals.filter(query.filter);
260
+ }
261
+ return signals;
89
262
  }
90
263
  async decay() {
91
- // TODO: UPDATE signals SET concentration = concentration - (rate * elapsed)
92
- // WHERE withdrawn = FALSE
93
- // DELETE FROM signals WHERE concentration < floor
94
- // Single SQL statement way more efficient than filesystem iteration.
95
- throw new Error('DoltEnvironment: not yet implemented.');
264
+ await this.ensureInit();
265
+ const now = Date.now();
266
+ const result = { decayed: 0, evaporated: 0, claimsReleased: 0 };
267
+ // Step 1: Release expired claims
268
+ const claimResult = await this.activeClient.execute(`UPDATE signals SET claimed_by = NULL, claimed_at = NULL, claim_lease = NULL WHERE claimed_by IS NOT NULL AND (claimed_at + claim_lease) < ${sqlValue(now)}`);
269
+ result.claimsReleased = claimResult.affectedRows;
270
+ // Step 2: Evaporate signals below floor or past TTL
271
+ // Target concentration = 1.0 - rate * age. Evaporate when target < 0.05.
272
+ const evapResult = await this.activeClient.execute(`UPDATE signals SET withdrawn = TRUE WHERE withdrawn = FALSE AND ((1.0 - (0.01 * (${sqlValue(now)} - deposited_at) / 1000.0)) < 0.05 OR (ttl IS NOT NULL AND (deposited_at + ttl) < ${sqlValue(now)}))`);
273
+ result.evaporated = evapResult.affectedRows;
274
+ // Step 3: Update remaining concentrations
275
+ // Directly SET the target concentration (linear decay from 1.0).
276
+ // Use LEAST(concentration, target) to never increase concentration
277
+ // (handles signals deposited at <1.0, e.g. gated signals).
278
+ const decayResult = await this.activeClient.execute(`UPDATE signals SET concentration = LEAST(concentration, GREATEST(0, 1.0 - (0.01 * (${sqlValue(now)} - deposited_at) / 1000.0))) WHERE withdrawn = FALSE`);
279
+ result.decayed = decayResult.affectedRows;
280
+ return result;
96
281
  }
97
282
  async snapshot() {
98
- // TODO: SELECT * FROM signals WHERE withdrawn = FALSE ORDER BY concentration DESC
99
- throw new Error('DoltEnvironment: not yet implemented.');
283
+ await this.ensureInit();
284
+ const { rows } = await this.activeClient.query('SELECT * FROM signals WHERE withdrawn = FALSE ORDER BY concentration DESC');
285
+ return rows.map(rowToSignal);
100
286
  }
287
+ // ----------------------------------------------------------
288
+ // Lifecycle
289
+ // ----------------------------------------------------------
290
+ /** Close the mysql2 connection pool (if active). Call on shutdown to prevent leaks. */
291
+ async close() {
292
+ if (this.sqlClient) {
293
+ await this.sqlClient.close();
294
+ this.sqlClient = undefined;
295
+ }
296
+ }
297
+ // ----------------------------------------------------------
298
+ // Serialization
299
+ // ----------------------------------------------------------
101
300
  serialize() {
102
- return {
301
+ const config = {
103
302
  type: 'dolt',
104
303
  name: this.name,
105
- connectionString: this.config.connectionString,
304
+ owner: this.config.owner,
106
305
  database: this.config.database,
107
306
  branch: this.config.branch,
307
+ apiBase: this.config.apiBase,
108
308
  };
309
+ return config;
109
310
  }
110
311
  // ----------------------------------------------------------
111
312
  // Dolt-specific operations (not part of the base interface)
@@ -115,31 +316,90 @@ export class DoltEnvironment {
115
316
  * Colonies can operate on branches for isolation/experimentation.
116
317
  */
117
318
  async createBranch(branchName, fromBranch) {
118
- // TODO: CALL DOLT_BRANCH(branchName, fromBranch ?? 'main')
119
- throw new Error('DoltEnvironment: not yet implemented.');
319
+ await this.client.createBranch(branchName, fromBranch);
120
320
  }
121
321
  /**
122
322
  * Merge a branch back. Signals deposited on the branch become visible on target.
123
323
  * Dolt handles merge conflicts at the row level.
124
324
  */
125
325
  async mergeBranch(sourceBranch, targetBranch) {
126
- // TODO: CALL DOLT_CHECKOUT(targetBranch); CALL DOLT_MERGE(sourceBranch);
127
- throw new Error('DoltEnvironment: not yet implemented.');
326
+ await this.client.mergeBranch(sourceBranch, targetBranch ?? this.client.branch);
128
327
  }
129
328
  /**
130
329
  * Diff two branches to see what signals changed.
131
330
  * Useful for Critic colonies reviewing Shaper work.
132
331
  */
133
332
  async diffBranch(branch1, branch2) {
134
- // TODO: SELECT * FROM dolt_diff('signals', branch1, branch2)
135
- throw new Error('DoltEnvironment: not yet implemented.');
333
+ const { rows } = await this.client.query(`SELECT * FROM dolt_diff('signals', ${sqlValue(branch1)}, ${sqlValue(branch2)})`);
334
+ return rows.map(rowToSignal);
335
+ }
336
+ }
337
+ // ----------------------------------------------------------
338
+ // Helpers
339
+ // ----------------------------------------------------------
340
+ /**
341
+ * Convert a glob pattern to a SQL LIKE pattern.
342
+ * `*` → `%`, `?` → `_`, escape existing `%` and `_`.
343
+ */
344
+ function globToLike(glob) {
345
+ return glob
346
+ .replace(/%/g, '\\%')
347
+ .replace(/_/g, '\\_')
348
+ .replace(/\*/g, '%')
349
+ .replace(/\?/g, '_');
350
+ }
351
+ /**
352
+ * Map a database row to a Signal object.
353
+ * Handles JSON columns that may be strings or already-parsed objects.
354
+ */
355
+ function rowToSignal(row) {
356
+ return {
357
+ id: row.id,
358
+ type: row.type,
359
+ payload: (parseJSON(row.payload) ?? {}),
360
+ meta: {
361
+ deposited_at: Number(row.deposited_at),
362
+ deposited_by: row.deposited_by ?? undefined,
363
+ concentration: Number(row.concentration),
364
+ ttl: row.ttl != null ? Number(row.ttl) : undefined,
365
+ claimed_by: row.claimed_by ?? undefined,
366
+ claimed_at: row.claimed_at != null ? Number(row.claimed_at) : undefined,
367
+ claim_lease: row.claim_lease != null ? Number(row.claim_lease) : undefined,
368
+ caused_by: parseJSON(row.caused_by) ?? undefined,
369
+ tags: parseJSON(row.tags) ?? undefined,
370
+ },
371
+ };
372
+ }
373
+ /**
374
+ * Coerce a limit value to a safe positive integer for SQL interpolation.
375
+ * Prevents SQL injection through unvalidated limit values.
376
+ */
377
+ function sanitizeLimit(value) {
378
+ const n = Math.floor(Number(value));
379
+ if (!Number.isFinite(n) || n < 1)
380
+ return 1;
381
+ return n;
382
+ }
383
+ function parseJSON(value) {
384
+ if (value === null || value === undefined)
385
+ return undefined;
386
+ if (typeof value === 'string') {
387
+ try {
388
+ return JSON.parse(value);
389
+ }
390
+ catch {
391
+ return value;
392
+ }
136
393
  }
394
+ return value;
137
395
  }
138
396
  // Self-register for deserialization
139
397
  registerEnvironment('dolt', (c) => new DoltEnvironment({
140
- connectionString: c.connectionString,
398
+ owner: c.owner,
141
399
  database: c.database,
142
400
  branch: c.branch,
401
+ apiBase: c.apiBase,
143
402
  name: c.name,
403
+ sql: c.sql,
144
404
  }));
145
405
  //# sourceMappingURL=adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/environments/dolt/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/environments/dolt/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export interface DoltHubConfig {
2
+ /** DoltHub database owner (user or organization) */
3
+ owner: string;
4
+ /** Database name on DoltHub */
5
+ database: string;
6
+ /** Branch to operate on (default: 'main') */
7
+ branch?: string;
8
+ /** DoltHub API token (format: "dhat.v1.xxx"). Falls back to DOLTHUB_TOKEN env var */
9
+ token?: string;
10
+ /** API base URL (default: 'https://www.dolthub.com') */
11
+ apiBase?: string;
12
+ }
13
+ export declare class DoltHubError extends Error {
14
+ status: number;
15
+ responseBody?: unknown | undefined;
16
+ constructor(message: string, status: number, responseBody?: unknown | undefined);
17
+ }
18
+ export declare class DoltHubClient {
19
+ private readonly owner;
20
+ private readonly database;
21
+ readonly branch: string;
22
+ private readonly token;
23
+ private readonly apiBase;
24
+ constructor(config: DoltHubConfig);
25
+ /**
26
+ * Execute a read-only SQL query against the database.
27
+ * Returns rows as plain objects and column names.
28
+ */
29
+ query<T = Record<string, unknown>>(sql: string): Promise<{
30
+ rows: T[];
31
+ columns: string[];
32
+ }>;
33
+ /**
34
+ * Execute a write SQL statement (INSERT, UPDATE, DELETE, CREATE TABLE, etc.).
35
+ * Writes go through the async write endpoint — we poll until complete.
36
+ */
37
+ execute(sql: string): Promise<{
38
+ affectedRows: number;
39
+ message: string;
40
+ }>;
41
+ /**
42
+ * Create a new branch from an existing ref.
43
+ */
44
+ createBranch(name: string, fromRef?: string): Promise<void>;
45
+ /**
46
+ * List all branches in the database.
47
+ */
48
+ listBranches(): Promise<string[]>;
49
+ /**
50
+ * Merge source branch into target branch.
51
+ * Uses the write endpoint with no query — DoltHub interprets this as a merge.
52
+ */
53
+ mergeBranch(source: string, target: string): Promise<void>;
54
+ private fetch;
55
+ private parseResponse;
56
+ private pollOperation;
57
+ private parseWriteResult;
58
+ }
59
+ /**
60
+ * Escape a string value for safe interpolation into a SQL query.
61
+ * Handles single quotes, backslashes, and null bytes.
62
+ *
63
+ * This is used for internal values (signal IDs, colony names, type strings)
64
+ * — not arbitrary user input from the internet.
65
+ */
66
+ export declare function escapeSQL(value: string): string;
67
+ /**
68
+ * Format a value for SQL interpolation.
69
+ * Strings are quoted and escaped, numbers/booleans are literal, null/undefined become NULL.
70
+ */
71
+ export declare function sqlValue(value: unknown): string;
72
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/environments/dolt/client.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAa,SAAQ,KAAK;IAG5B,MAAM,EAAE,MAAM;IACd,YAAY,CAAC,EAAE,OAAO;gBAF7B,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,MAAM,EACd,YAAY,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,aAAa;IAYjC;;;OAGG;IACG,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAkBhG;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAqB9E;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBjE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYvC;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAelD,KAAK;YAYL,aAAa;YAkBb,aAAa;IAyB3B,OAAO,CAAC,gBAAgB;CASzB;AAMD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAO/C"}