swarm-mail 0.3.3 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/hive/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA6B5D;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,GACjB,WAAW,CA6iBb"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/hive/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA+B5D;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,GACjB,WAAW,CA6iBb"}
package/dist/index.js CHANGED
@@ -18912,6 +18912,18 @@ function getDatabasePath2(projectPath) {
18912
18912
  return join4(globalTmpDir, "streams");
18913
18913
  }
18914
18914
  var instances2 = new Map;
18915
+ var initPromises = new Map;
18916
+ function formatError2(error45) {
18917
+ if (error45 instanceof Error)
18918
+ return error45.message;
18919
+ if (typeof error45 === "string")
18920
+ return error45;
18921
+ try {
18922
+ return JSON.stringify(error45, Object.getOwnPropertyNames(error45));
18923
+ } catch {
18924
+ return String(error45);
18925
+ }
18926
+ }
18915
18927
  function isWasmAbortError(error45) {
18916
18928
  if (error45 instanceof Error) {
18917
18929
  const message = error45.message.toLowerCase();
@@ -18927,16 +18939,18 @@ async function createPGliteWithRecovery(dbPath) {
18927
18939
  } catch (error45) {
18928
18940
  if (isWasmAbortError(error45)) {
18929
18941
  console.warn(`[swarm-mail] PGLite WASM abort detected, recovering by deleting corrupted database: ${dbPath}`);
18930
- if (existsSync4(dbPath)) {
18942
+ if (!existsSync4(dbPath)) {
18943
+ console.log("[swarm-mail] Database already cleaned up by another process");
18944
+ } else {
18931
18945
  rmSync(dbPath, { recursive: true, force: true });
18932
18946
  }
18933
18947
  try {
18934
18948
  const pglite = new PGlite2(dbPath);
18935
18949
  await pglite.query("SELECT 1");
18936
- console.log("[swarm-mail] Successfully recovered from corrupted database");
18950
+ console.log(`[swarm-mail] Successfully recovered from corrupted database: ${dbPath}`);
18937
18951
  return pglite;
18938
18952
  } catch (retryError) {
18939
- throw new Error(`Failed to recover PGLite database after deleting corrupted data: ${retryError instanceof Error ? retryError.message : String(retryError)}`);
18953
+ throw new Error(`Failed to recover PGLite database after deleting corrupted data: ${formatError2(retryError)}`);
18940
18954
  }
18941
18955
  }
18942
18956
  throw error45;
@@ -18945,7 +18959,13 @@ async function createPGliteWithRecovery(dbPath) {
18945
18959
  async function getSwarmMail(projectPath) {
18946
18960
  const dbPath = getDatabasePath2(projectPath);
18947
18961
  const projectKey = projectPath || dbPath;
18948
- if (!instances2.has(dbPath)) {
18962
+ if (instances2.has(dbPath)) {
18963
+ return instances2.get(dbPath).adapter;
18964
+ }
18965
+ if (initPromises.has(dbPath)) {
18966
+ return initPromises.get(dbPath);
18967
+ }
18968
+ const initPromise = (async () => {
18949
18969
  const useSocket = process.env.SWARM_MAIL_SOCKET === "true";
18950
18970
  if (useSocket) {
18951
18971
  try {
@@ -18961,8 +18981,15 @@ async function getSwarmMail(projectPath) {
18961
18981
  const adapter = createSwarmMailAdapter(db, projectKey);
18962
18982
  await adapter.runMigrations();
18963
18983
  instances2.set(dbPath, { adapter, pglite });
18984
+ return adapter;
18985
+ })();
18986
+ initPromises.set(dbPath, initPromise);
18987
+ try {
18988
+ const adapter = await initPromise;
18989
+ return adapter;
18990
+ } finally {
18991
+ initPromises.delete(dbPath);
18964
18992
  }
18965
- return instances2.get(dbPath).adapter;
18966
18993
  }
18967
18994
  async function getSwarmMailSocket(projectPath) {
18968
18995
  const dbPath = getDatabasePath2(projectPath);
@@ -19027,6 +19054,10 @@ async function closeAllSwarmMail() {
19027
19054
  // src/index.ts
19028
19055
  init_streams();
19029
19056
 
19057
+ // src/hive/adapter.ts
19058
+ import { readFileSync, existsSync as existsSync5 } from "node:fs";
19059
+ import { join as join5 } from "node:path";
19060
+
19030
19061
  // src/hive/store.ts
19031
19062
  init_streams();
19032
19063
 
@@ -19296,7 +19327,7 @@ async function getInProgressCells(db, projectKey) {
19296
19327
  async function getBlockedCells(db, projectKey) {
19297
19328
  const result = await db.query(`SELECT b.*, bbc.blocker_ids
19298
19329
  FROM beads b
19299
- JOIN blocked_beads_cache bbc ON b.id = bcc.cell_id
19330
+ JOIN blocked_beads_cache bbc ON b.id = bbc.cell_id
19300
19331
  WHERE b.project_key = $1 AND b.deleted_at IS NULL
19301
19332
  ORDER BY b.priority DESC, b.created_at ASC`, [projectKey]);
19302
19333
  return result.rows.map((r) => {
@@ -19884,10 +19915,29 @@ function createHiveAdapter(db, projectKey) {
19884
19915
  };
19885
19916
  }
19886
19917
  function generateBeadId(projectKey) {
19918
+ const prefix = getProjectPrefix(projectKey);
19887
19919
  const hash2 = projectKey.split("").reduce((acc, char) => (acc << 5) - acc + char.charCodeAt(0) | 0, 0).toString(36).slice(0, 6);
19888
19920
  const timestamp = Date.now().toString(36);
19889
19921
  const random = Math.random().toString(36).slice(2, 5);
19890
- return `bd-${hash2}-${timestamp}${random}`;
19922
+ return `${prefix}-${hash2}-${timestamp}${random}`;
19923
+ }
19924
+ function getProjectPrefix(projectKey) {
19925
+ try {
19926
+ const packageJsonPath = join5(projectKey, "package.json");
19927
+ if (!existsSync5(packageJsonPath)) {
19928
+ return "cell";
19929
+ }
19930
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
19931
+ if (!packageJson.name || typeof packageJson.name !== "string") {
19932
+ return "cell";
19933
+ }
19934
+ return slugifyProjectName(packageJson.name);
19935
+ } catch (error45) {
19936
+ return "cell";
19937
+ }
19938
+ }
19939
+ function slugifyProjectName(name) {
19940
+ return name.toLowerCase().replace(/[@/]/g, "-").replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
19891
19941
  }
19892
19942
 
19893
19943
  // src/hive/index.ts
@@ -20154,7 +20204,7 @@ async function importDependencies(adapter, projectKey, cellExport) {
20154
20204
  return;
20155
20205
  }
20156
20206
  const db = await adapter.getDatabase();
20157
- await db.query("DELETE FROM cell_dependencies WHERE cell_id = $1", [
20207
+ await db.query("DELETE FROM bead_dependencies WHERE cell_id = $1", [
20158
20208
  cellExport.id
20159
20209
  ]);
20160
20210
  for (const dep of cellExport.dependencies) {
@@ -20166,7 +20216,7 @@ async function importLabels(adapter, projectKey, cellExport) {
20166
20216
  return;
20167
20217
  }
20168
20218
  const db = await adapter.getDatabase();
20169
- await db.query("DELETE FROM cell_labels WHERE cell_id = $1", [
20219
+ await db.query("DELETE FROM bead_labels WHERE cell_id = $1", [
20170
20220
  cellExport.id
20171
20221
  ]);
20172
20222
  for (const label of cellExport.labels) {
@@ -20178,7 +20228,7 @@ async function importComments(adapter, projectKey, cellExport) {
20178
20228
  return;
20179
20229
  }
20180
20230
  const db = await adapter.getDatabase();
20181
- await db.query("DELETE FROM cell_comments WHERE cell_id = $1", [
20231
+ await db.query("DELETE FROM bead_comments WHERE cell_id = $1", [
20182
20232
  cellExport.id
20183
20233
  ]);
20184
20234
  for (const comment of cellExport.comments) {
@@ -1 +1 @@
1
- {"version":3,"file":"pglite.d.ts","sourceRoot":"","sources":["../src/pglite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAQ1D;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAsFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,YAAY,CAChC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAgC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AA0DD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,SAAS,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUvD;AAGD,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"pglite.d.ts","sourceRoot":"","sources":["../src/pglite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAM9C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,CAQ1D;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAkB5D;AAoHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,YAAY,CAChC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AA0DD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,SAAS,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUvD;AAGD,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swarm-mail",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Event sourcing primitives for multi-agent coordination. Local-first, no external servers.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",