@hasna/cloud 0.1.31 → 0.1.32

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 (45) hide show
  1. package/LICENSE +2 -1
  2. package/README.md +17 -0
  3. package/dist/adapter.test.d.ts +2 -0
  4. package/dist/adapter.test.d.ts.map +1 -0
  5. package/dist/auto-sync.d.ts.map +1 -1
  6. package/dist/cli/cmd-doctor.d.ts +3 -0
  7. package/dist/cli/cmd-doctor.d.ts.map +1 -0
  8. package/dist/cli/cmd-feedback.d.ts +3 -0
  9. package/dist/cli/cmd-feedback.d.ts.map +1 -0
  10. package/dist/cli/cmd-migrate.d.ts +3 -0
  11. package/dist/cli/cmd-migrate.d.ts.map +1 -0
  12. package/dist/cli/cmd-setup.d.ts +3 -0
  13. package/dist/cli/cmd-setup.d.ts.map +1 -0
  14. package/dist/cli/cmd-sync.d.ts +4 -0
  15. package/dist/cli/cmd-sync.d.ts.map +1 -0
  16. package/dist/cli/index.js +2330 -1079
  17. package/dist/config.d.ts +138 -4
  18. package/dist/config.d.ts.map +1 -1
  19. package/dist/daemon-sync.d.ts +108 -0
  20. package/dist/daemon-sync.d.ts.map +1 -0
  21. package/dist/dialect.test.d.ts +2 -0
  22. package/dist/dialect.test.d.ts.map +1 -0
  23. package/dist/discover.test.d.ts +2 -0
  24. package/dist/discover.test.d.ts.map +1 -0
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1143 -153
  28. package/dist/machines.d.ts +63 -0
  29. package/dist/machines.d.ts.map +1 -0
  30. package/dist/mcp/http.d.ts +27 -0
  31. package/dist/mcp/http.d.ts.map +1 -0
  32. package/dist/mcp/index.d.ts +2 -1
  33. package/dist/mcp/index.d.ts.map +1 -1
  34. package/dist/mcp/index.js +2125 -438
  35. package/dist/scheduled-sync.js +205 -44
  36. package/dist/sync-conflicts.test.d.ts +2 -0
  37. package/dist/sync-conflicts.test.d.ts.map +1 -0
  38. package/dist/sync-incremental.d.ts +5 -0
  39. package/dist/sync-incremental.d.ts.map +1 -1
  40. package/dist/sync-schedule.test.d.ts +2 -0
  41. package/dist/sync-schedule.test.d.ts.map +1 -0
  42. package/dist/sync.d.ts.map +1 -1
  43. package/dist/sync.test.d.ts +2 -0
  44. package/dist/sync.test.d.ts.map +1 -0
  45. package/package.json +1 -1
@@ -155,7 +155,7 @@ var require_arrayParser = __commonJS((exports, module) => {
155
155
  };
156
156
  });
157
157
 
158
- // node_modules/pg-types/node_modules/postgres-date/index.js
158
+ // node_modules/postgres-date/index.js
159
159
  var require_postgres_date = __commonJS((exports, module) => {
160
160
  var DATE_TIME = /(\d{1,})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(\.\d{1,})?.*?( BC)?$/;
161
161
  var DATE = /^(\d{1,})-(\d{2})-(\d{2})( BC)?$/;
@@ -257,7 +257,7 @@ var require_mutable = __commonJS((exports, module) => {
257
257
  }
258
258
  });
259
259
 
260
- // node_modules/pg-types/node_modules/postgres-interval/index.js
260
+ // node_modules/postgres-interval/index.js
261
261
  var require_postgres_interval = __commonJS((exports, module) => {
262
262
  var extend = require_mutable();
263
263
  module.exports = PostgresInterval;
@@ -349,7 +349,7 @@ var require_postgres_interval = __commonJS((exports, module) => {
349
349
  }
350
350
  });
351
351
 
352
- // node_modules/pg-types/node_modules/postgres-bytea/index.js
352
+ // node_modules/postgres-bytea/index.js
353
353
  var require_postgres_bytea = __commonJS((exports, module) => {
354
354
  var bufferFrom = Buffer.from || Buffer;
355
355
  module.exports = function parseBytea(input) {
@@ -9023,8 +9023,10 @@ class SqliteAdapter {
9023
9023
  return this.db;
9024
9024
  }
9025
9025
  }
9026
- class PgAdapterAsync {
9026
+
9027
+ class PgAdapter {
9027
9028
  pool;
9029
+ _client = null;
9028
9030
  constructor(arg) {
9029
9031
  if (typeof arg === "string") {
9030
9032
  const sslConfig = arg.includes("sslmode=require") || arg.includes("ssl=true") ? { rejectUnauthorized: false } : undefined;
@@ -9033,47 +9035,118 @@ class PgAdapterAsync {
9033
9035
  this.pool = arg;
9034
9036
  }
9035
9037
  }
9036
- async run(sql, ...params) {
9038
+ runSync(fn) {
9039
+ let result;
9040
+ let error;
9041
+ let done = false;
9042
+ fn().then((r) => {
9043
+ result = r;
9044
+ done = true;
9045
+ }).catch((e) => {
9046
+ error = e;
9047
+ done = true;
9048
+ });
9049
+ const deadline = Date.now() + 30000;
9050
+ while (!done && Date.now() < deadline) {
9051
+ Bun.sleepSync(1);
9052
+ }
9053
+ if (error)
9054
+ throw error;
9055
+ if (!done)
9056
+ throw new Error("PgAdapter: query timed out (30s)");
9057
+ return result;
9058
+ }
9059
+ run(sql, ...params) {
9037
9060
  const pgSql = translateSql(sql, "pg");
9038
9061
  const pgParams = translateParams(params);
9039
- const res = await this.pool.query(pgSql, pgParams);
9040
- return {
9041
- changes: res.rowCount ?? 0,
9042
- lastInsertRowid: res.rows?.[0]?.id ?? 0
9043
- };
9062
+ return this.runSync(async () => {
9063
+ const res = await this.pool.query(pgSql, pgParams);
9064
+ return {
9065
+ changes: res.rowCount ?? 0,
9066
+ lastInsertRowid: res.rows?.[0]?.id ?? 0
9067
+ };
9068
+ });
9044
9069
  }
9045
- async get(sql, ...params) {
9070
+ get(sql, ...params) {
9046
9071
  const pgSql = translateSql(sql, "pg");
9047
9072
  const pgParams = translateParams(params);
9048
- const res = await this.pool.query(pgSql, pgParams);
9049
- return res.rows[0] ?? null;
9073
+ return this.runSync(async () => {
9074
+ const res = await this.pool.query(pgSql, pgParams);
9075
+ return res.rows[0] ?? null;
9076
+ });
9050
9077
  }
9051
- async all(sql, ...params) {
9078
+ all(sql, ...params) {
9052
9079
  const pgSql = translateSql(sql, "pg");
9053
9080
  const pgParams = translateParams(params);
9054
- const res = await this.pool.query(pgSql, pgParams);
9055
- return res.rows;
9081
+ return this.runSync(async () => {
9082
+ const res = await this.pool.query(pgSql, pgParams);
9083
+ return res.rows;
9084
+ });
9056
9085
  }
9057
- async exec(sql) {
9086
+ exec(sql) {
9058
9087
  const pgSql = translateSql(sql, "pg");
9059
- await this.pool.query(pgSql);
9088
+ this.runSync(async () => {
9089
+ await this.pool.query(pgSql);
9090
+ });
9060
9091
  }
9061
- async close() {
9062
- await this.pool.end();
9092
+ prepare(sql) {
9093
+ const pgSql = translateSql(sql, "pg");
9094
+ const adapter = this;
9095
+ return {
9096
+ run(...params) {
9097
+ const pgParams = translateParams(params);
9098
+ return adapter.runSync(async () => {
9099
+ const res = await adapter.pool.query(pgSql, pgParams);
9100
+ return {
9101
+ changes: res.rowCount ?? 0,
9102
+ lastInsertRowid: res.rows?.[0]?.id ?? 0
9103
+ };
9104
+ });
9105
+ },
9106
+ get(...params) {
9107
+ const pgParams = translateParams(params);
9108
+ return adapter.runSync(async () => {
9109
+ const res = await adapter.pool.query(pgSql, pgParams);
9110
+ return res.rows[0] ?? null;
9111
+ });
9112
+ },
9113
+ all(...params) {
9114
+ const pgParams = translateParams(params);
9115
+ return adapter.runSync(async () => {
9116
+ const res = await adapter.pool.query(pgSql, pgParams);
9117
+ return res.rows;
9118
+ });
9119
+ },
9120
+ finalize() {}
9121
+ };
9063
9122
  }
9064
- async transaction(fn) {
9065
- const client = await this.pool.connect();
9066
- try {
9067
- await client.query("BEGIN");
9068
- const result = await fn(client);
9069
- await client.query("COMMIT");
9070
- return result;
9071
- } catch (err) {
9072
- await client.query("ROLLBACK");
9073
- throw err;
9074
- } finally {
9075
- client.release();
9076
- }
9123
+ close() {
9124
+ this.runSync(async () => {
9125
+ await this.pool.end();
9126
+ });
9127
+ }
9128
+ transaction(fn) {
9129
+ return this.runSync(async () => {
9130
+ const client = await this.pool.connect();
9131
+ try {
9132
+ await client.query("BEGIN");
9133
+ const origQuery = this.pool.query.bind(this.pool);
9134
+ this.pool.query = client.query.bind(client);
9135
+ let result;
9136
+ try {
9137
+ result = fn();
9138
+ } finally {
9139
+ this.pool.query = origQuery;
9140
+ }
9141
+ await client.query("COMMIT");
9142
+ return result;
9143
+ } catch (err) {
9144
+ await client.query("ROLLBACK");
9145
+ throw err;
9146
+ } finally {
9147
+ client.release();
9148
+ }
9149
+ });
9077
9150
  }
9078
9151
  get raw() {
9079
9152
  return this.pool;
@@ -9100,7 +9173,77 @@ function getHasnaDir() {
9100
9173
  return HASNA_DIR;
9101
9174
  }
9102
9175
 
9176
+ // src/discover.ts
9177
+ var SYNC_EXCLUDED_TABLE_PATTERNS = [
9178
+ /^sqlite_/,
9179
+ /_fts$/,
9180
+ /_fts_/,
9181
+ /^_sync_/,
9182
+ /^_pg_migrations$/
9183
+ ];
9184
+ function isSyncExcludedTable(table) {
9185
+ return SYNC_EXCLUDED_TABLE_PATTERNS.some((p) => p.test(table));
9186
+ }
9187
+
9188
+ // src/machines.ts
9189
+ function tableExists(db, table) {
9190
+ try {
9191
+ if (typeof db.query === "function") {
9192
+ const rows2 = db.all(`SELECT name FROM sqlite_master WHERE type='table' AND name = ?`, table);
9193
+ return rows2.length > 0;
9194
+ }
9195
+ const rows = db.all(`SELECT table_name
9196
+ FROM information_schema.tables
9197
+ WHERE table_schema = 'public' AND table_name = ?`, table);
9198
+ return rows.length > 0;
9199
+ } catch {
9200
+ return false;
9201
+ }
9202
+ }
9203
+ function hasMachineIdColumn(db, table) {
9204
+ try {
9205
+ if (typeof db.query === "function") {
9206
+ const rows2 = db.all(`PRAGMA table_info("${table}")`);
9207
+ return rows2.some((row) => row.name === "machine_id");
9208
+ }
9209
+ const rows = db.all(`SELECT column_name
9210
+ FROM information_schema.columns
9211
+ WHERE table_schema = 'public' AND table_name = ? AND column_name = 'machine_id'`, table);
9212
+ return rows.length > 0;
9213
+ } catch {
9214
+ return false;
9215
+ }
9216
+ }
9217
+ function shouldTrackMachineId(table) {
9218
+ return table !== "machines" && !isSyncExcludedTable(table);
9219
+ }
9220
+ function ensureMachineIdColumn(db, table) {
9221
+ if (!shouldTrackMachineId(table) || !tableExists(db, table)) {
9222
+ return false;
9223
+ }
9224
+ if (hasMachineIdColumn(db, table)) {
9225
+ return false;
9226
+ }
9227
+ db.exec(`ALTER TABLE "${table}" ADD COLUMN machine_id TEXT DEFAULT ''`);
9228
+ return true;
9229
+ }
9230
+
9103
9231
  // src/config.ts
9232
+ var DaemonConfigSchema = exports_external.object({
9233
+ enabled: exports_external.boolean().default(false),
9234
+ paused: exports_external.boolean().default(false),
9235
+ watch_interval_seconds: exports_external.number().int().positive().default(5),
9236
+ pull_interval_seconds: exports_external.number().int().positive().default(60),
9237
+ push_debounce_seconds: exports_external.number().int().positive().default(5),
9238
+ conflict_strategy: exports_external.enum(["newest-wins", "local-wins", "remote-wins"]).default("newest-wins"),
9239
+ services: exports_external.array(exports_external.string()).default([]),
9240
+ table_intervals: exports_external.record(exports_external.string(), exports_external.record(exports_external.string(), exports_external.number().int().positive())).default({}),
9241
+ file_rules: exports_external.array(exports_external.object({
9242
+ path: exports_external.string(),
9243
+ interval_seconds: exports_external.number().int().positive().default(30),
9244
+ enabled: exports_external.boolean().default(true)
9245
+ })).default([])
9246
+ }).default({});
9104
9247
  var CloudConfigSchema = exports_external.object({
9105
9248
  rds: exports_external.object({
9106
9249
  host: exports_external.string().default(""),
@@ -9114,7 +9257,8 @@ var CloudConfigSchema = exports_external.object({
9114
9257
  feedback_endpoint: exports_external.string().default("https://feedback.hasna.com/api/v1/feedback"),
9115
9258
  sync: exports_external.object({
9116
9259
  schedule_minutes: exports_external.number().default(0)
9117
- }).default({})
9260
+ }).default({}),
9261
+ daemon: DaemonConfigSchema
9118
9262
  });
9119
9263
  var CONFIG_DIR = join2(homedir2(), ".hasna", "cloud");
9120
9264
  var CONFIG_PATH = join2(CONFIG_DIR, "config.json");
@@ -9175,6 +9319,11 @@ function transferRows(source, target, table, rows, options) {
9175
9319
  if (rows.length === 0)
9176
9320
  return { written, skipped, errors: errors2 };
9177
9321
  const columns = Object.keys(rows[0]);
9322
+ if (columns.includes("machine_id") && table !== "machines") {
9323
+ try {
9324
+ ensureMachineIdColumn(target, table);
9325
+ } catch {}
9326
+ }
9178
9327
  const hasConflictCol = columns.includes(conflictColumn);
9179
9328
  const hasPrimaryKey = columns.includes(primaryKey);
9180
9329
  if (!hasPrimaryKey) {
@@ -9185,12 +9334,21 @@ function transferRows(source, target, table, rows, options) {
9185
9334
  try {
9186
9335
  const existing = target.get(`SELECT "${primaryKey}"${hasConflictCol ? `, "${conflictColumn}"` : ""} FROM "${table}" WHERE "${primaryKey}" = ?`, row[primaryKey]);
9187
9336
  if (existing) {
9188
- if (hasConflictCol && existing[conflictColumn] && row[conflictColumn]) {
9189
- const existingTime = new Date(existing[conflictColumn]).getTime();
9190
- const incomingTime = new Date(row[conflictColumn]).getTime();
9191
- if (existingTime >= incomingTime) {
9192
- skipped++;
9193
- continue;
9337
+ const conflictStrategy = options.conflictStrategy ?? "newest-wins";
9338
+ const sourceRole = options.sourceRole ?? "local";
9339
+ const sourceWins = conflictStrategy === "local-wins" && sourceRole === "local" || conflictStrategy === "remote-wins" && sourceRole === "remote";
9340
+ if (!sourceWins && conflictStrategy !== "newest-wins") {
9341
+ skipped++;
9342
+ continue;
9343
+ }
9344
+ if (conflictStrategy === "newest-wins") {
9345
+ if (hasConflictCol && existing[conflictColumn] && row[conflictColumn]) {
9346
+ const existingTime = new Date(existing[conflictColumn]).getTime();
9347
+ const incomingTime = new Date(row[conflictColumn]).getTime();
9348
+ if (existingTime >= incomingTime) {
9349
+ skipped++;
9350
+ continue;
9351
+ }
9194
9352
  }
9195
9353
  }
9196
9354
  const setClauses = columns.filter((c) => c !== primaryKey).map((c) => `"${c}" = ?`).join(", ");
@@ -9241,7 +9399,10 @@ function incrementalSyncPush(local, remote, tables, options = {}) {
9241
9399
  }
9242
9400
  for (let offset = 0;offset < rows.length; offset += batchSize) {
9243
9401
  const batch = rows.slice(offset, offset + batchSize);
9244
- const result = transferRows(local, remote, table, batch, options);
9402
+ const result = transferRows(local, remote, table, batch, {
9403
+ ...options,
9404
+ sourceRole: "local"
9405
+ });
9245
9406
  stat.synced_rows += result.written;
9246
9407
  stat.skipped_rows += result.skipped;
9247
9408
  stat.errors.push(...result.errors);
@@ -9314,7 +9475,7 @@ async function runScheduledSync() {
9314
9475
  }
9315
9476
  try {
9316
9477
  const connStr = getConnectionString(service);
9317
- remote = new PgAdapterAsync(connStr);
9478
+ remote = new PgAdapter(connStr);
9318
9479
  } catch (err) {
9319
9480
  result.errors.push(`Connection failed: ${err?.message ?? String(err)}`);
9320
9481
  local.close();
@@ -9330,7 +9491,7 @@ async function runScheduledSync() {
9330
9491
  result.errors.push(...s.errors);
9331
9492
  }
9332
9493
  local.close();
9333
- await remote.close();
9494
+ remote.close();
9334
9495
  remote = null;
9335
9496
  } catch (err) {
9336
9497
  result.errors.push(err?.message ?? String(err));
@@ -9339,7 +9500,7 @@ async function runScheduledSync() {
9339
9500
  }
9340
9501
  if (remote) {
9341
9502
  try {
9342
- await remote.close();
9503
+ remote.close();
9343
9504
  } catch {}
9344
9505
  }
9345
9506
  return results;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync-conflicts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-conflicts.test.d.ts","sourceRoot":"","sources":["../src/sync-conflicts.test.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
1
  import type { DbAdapter } from "./adapter.js";
2
+ import type { ConflictStrategy } from "./sync-conflicts.js";
2
3
  export interface IncrementalSyncStats {
3
4
  table: string;
4
5
  total_rows: number;
@@ -20,6 +21,10 @@ export interface IncrementalSyncOptions {
20
21
  conflictColumn?: string;
21
22
  /** Batch size for writes (default: 500). */
22
23
  batchSize?: number;
24
+ /** Conflict resolution strategy for rows present on both sides. */
25
+ conflictStrategy?: ConflictStrategy;
26
+ /** Which side is being transferred into the target. */
27
+ sourceRole?: "local" | "remote";
23
28
  }
24
29
  /**
25
30
  * Ensure the `_sync_meta` table exists in the given database.
@@ -1 +1 @@
1
- {"version":3,"file":"sync-incremental.d.ts","sourceRoot":"","sources":["../src/sync-incremental.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAEvD;AAkID;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,sBAA2B,GACnC,oBAAoB,EAAE,CAyExB;AAMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,sBAA2B,GACnC,oBAAoB,EAAE,CAyExB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,QAAQ,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,GACZ,QAAQ,GAAG,IAAI,CAEjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAGpD"}
1
+ {"version":3,"file":"sync-incremental.d.ts","sourceRoot":"","sources":["../src/sync-incremental.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAM5D,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uDAAuD;IACvD,UAAU,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CACjC;AAcD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAEvD;AAmJD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,sBAA2B,GACnC,oBAAoB,EAAE,CA4ExB;AAMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,GAAE,sBAA2B,GACnC,oBAAoB,EAAE,CA4ExB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,QAAQ,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,MAAM,GACZ,QAAQ,GAAG,IAAI,CAEjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAGpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync-schedule.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-schedule.test.d.ts","sourceRoot":"","sources":["../src/sync-schedule.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAsvBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKxE"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,kCAAkC;IAClC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAMD;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,EAAE,CAAC,CAGvB;AAmxBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,CAKxD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKxE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.test.d.ts","sourceRoot":"","sources":["../src/sync.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/cloud",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "description": "Shared cloud infrastructure — database adapter (SQLite + PostgreSQL), sync engine, feedback system, unified dotfile config",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",