@ash-ai/server 0.0.3 → 0.0.5

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 (184) hide show
  1. package/dist/__tests__/attachments.test.d.ts +2 -0
  2. package/dist/__tests__/attachments.test.d.ts.map +1 -0
  3. package/dist/__tests__/attachments.test.js +57 -0
  4. package/dist/__tests__/attachments.test.js.map +1 -0
  5. package/dist/__tests__/bundle.test.d.ts +2 -0
  6. package/dist/__tests__/bundle.test.d.ts.map +1 -0
  7. package/dist/__tests__/bundle.test.js +55 -0
  8. package/dist/__tests__/bundle.test.js.map +1 -0
  9. package/dist/__tests__/coordinator.test.d.ts +2 -0
  10. package/dist/__tests__/coordinator.test.d.ts.map +1 -0
  11. package/dist/__tests__/coordinator.test.js +283 -0
  12. package/dist/__tests__/coordinator.test.js.map +1 -0
  13. package/dist/__tests__/crypto.test.d.ts +2 -0
  14. package/dist/__tests__/crypto.test.d.ts.map +1 -0
  15. package/dist/__tests__/crypto.test.js +72 -0
  16. package/dist/__tests__/crypto.test.js.map +1 -0
  17. package/dist/__tests__/file-store.test.d.ts +2 -0
  18. package/dist/__tests__/file-store.test.d.ts.map +1 -0
  19. package/dist/__tests__/file-store.test.js +105 -0
  20. package/dist/__tests__/file-store.test.js.map +1 -0
  21. package/dist/__tests__/files.test.js +18 -5
  22. package/dist/__tests__/files.test.js.map +1 -1
  23. package/dist/__tests__/multi-tenant.test.js +15 -1
  24. package/dist/__tests__/multi-tenant.test.js.map +1 -1
  25. package/dist/__tests__/openapi.test.js +6 -3
  26. package/dist/__tests__/openapi.test.js.map +1 -1
  27. package/dist/__tests__/queue.test.d.ts +2 -0
  28. package/dist/__tests__/queue.test.d.ts.map +1 -0
  29. package/dist/__tests__/queue.test.js +151 -0
  30. package/dist/__tests__/queue.test.js.map +1 -0
  31. package/dist/__tests__/usage.test.d.ts +2 -0
  32. package/dist/__tests__/usage.test.d.ts.map +1 -0
  33. package/dist/__tests__/usage.test.js +74 -0
  34. package/dist/__tests__/usage.test.js.map +1 -0
  35. package/dist/auth.d.ts +6 -2
  36. package/dist/auth.d.ts.map +1 -1
  37. package/dist/auth.js +23 -5
  38. package/dist/auth.js.map +1 -1
  39. package/dist/crypto.d.ts +14 -0
  40. package/dist/crypto.d.ts.map +1 -0
  41. package/dist/crypto.js +45 -0
  42. package/dist/crypto.js.map +1 -0
  43. package/dist/db/drizzle-db.d.ts +129 -0
  44. package/dist/db/drizzle-db.d.ts.map +1 -0
  45. package/dist/db/drizzle-db.js +789 -0
  46. package/dist/db/drizzle-db.js.map +1 -0
  47. package/dist/db/index.d.ts +129 -3
  48. package/dist/db/index.d.ts.map +1 -1
  49. package/dist/db/index.js +147 -8
  50. package/dist/db/index.js.map +1 -1
  51. package/dist/db/schema.pg.d.ts +1642 -0
  52. package/dist/db/schema.pg.d.ts.map +1 -0
  53. package/dist/db/schema.pg.js +151 -0
  54. package/dist/db/schema.pg.js.map +1 -0
  55. package/dist/db/schema.sqlite.d.ts +1800 -0
  56. package/dist/db/schema.sqlite.d.ts.map +1 -0
  57. package/dist/db/schema.sqlite.js +151 -0
  58. package/dist/db/schema.sqlite.js.map +1 -0
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +16 -95
  62. package/dist/index.js.map +1 -1
  63. package/dist/queue/processor.d.ts +51 -0
  64. package/dist/queue/processor.d.ts.map +1 -0
  65. package/dist/queue/processor.js +98 -0
  66. package/dist/queue/processor.js.map +1 -0
  67. package/dist/routes/attachments.d.ts +3 -0
  68. package/dist/routes/attachments.d.ts.map +1 -0
  69. package/dist/routes/attachments.js +168 -0
  70. package/dist/routes/attachments.js.map +1 -0
  71. package/dist/routes/credentials.d.ts +11 -0
  72. package/dist/routes/credentials.d.ts.map +1 -0
  73. package/dist/routes/credentials.js +120 -0
  74. package/dist/routes/credentials.js.map +1 -0
  75. package/dist/routes/files.d.ts.map +1 -1
  76. package/dist/routes/files.js +97 -31
  77. package/dist/routes/files.js.map +1 -1
  78. package/dist/routes/health.d.ts.map +1 -1
  79. package/dist/routes/health.js +9 -1
  80. package/dist/routes/health.js.map +1 -1
  81. package/dist/routes/queue.d.ts +3 -0
  82. package/dist/routes/queue.d.ts.map +1 -0
  83. package/dist/routes/queue.js +144 -0
  84. package/dist/routes/queue.js.map +1 -0
  85. package/dist/routes/runners.d.ts +5 -0
  86. package/dist/routes/runners.d.ts.map +1 -1
  87. package/dist/routes/runners.js +42 -5
  88. package/dist/routes/runners.js.map +1 -1
  89. package/dist/routes/sessions.d.ts +2 -1
  90. package/dist/routes/sessions.d.ts.map +1 -1
  91. package/dist/routes/sessions.js +218 -12
  92. package/dist/routes/sessions.js.map +1 -1
  93. package/dist/routes/usage.d.ts +3 -0
  94. package/dist/routes/usage.d.ts.map +1 -0
  95. package/dist/routes/usage.js +64 -0
  96. package/dist/routes/usage.js.map +1 -0
  97. package/dist/routes/workspace.d.ts +4 -0
  98. package/dist/routes/workspace.d.ts.map +1 -0
  99. package/dist/routes/workspace.js +123 -0
  100. package/dist/routes/workspace.js.map +1 -0
  101. package/dist/runner/coordinator.d.ts +77 -9
  102. package/dist/runner/coordinator.d.ts.map +1 -1
  103. package/dist/runner/coordinator.js +163 -89
  104. package/dist/runner/coordinator.js.map +1 -1
  105. package/dist/runner/local-backend.d.ts +1 -0
  106. package/dist/runner/local-backend.d.ts.map +1 -1
  107. package/dist/runner/local-backend.js +8 -0
  108. package/dist/runner/local-backend.js.map +1 -1
  109. package/dist/runner/remote-backend.d.ts +2 -0
  110. package/dist/runner/remote-backend.d.ts.map +1 -1
  111. package/dist/runner/remote-backend.js +9 -0
  112. package/dist/runner/remote-backend.js.map +1 -1
  113. package/dist/runner/runner-client.d.ts +6 -0
  114. package/dist/runner/runner-client.d.ts.map +1 -1
  115. package/dist/runner/runner-client.js +15 -0
  116. package/dist/runner/runner-client.js.map +1 -1
  117. package/dist/runner/types.d.ts +6 -0
  118. package/dist/runner/types.d.ts.map +1 -1
  119. package/dist/schemas.d.ts.map +1 -1
  120. package/dist/schemas.js +85 -1
  121. package/dist/schemas.js.map +1 -1
  122. package/dist/server.d.ts +31 -0
  123. package/dist/server.d.ts.map +1 -0
  124. package/dist/server.js +176 -0
  125. package/dist/server.js.map +1 -0
  126. package/dist/telemetry/exporter.d.ts +16 -0
  127. package/dist/telemetry/exporter.d.ts.map +1 -0
  128. package/dist/telemetry/exporter.js +89 -0
  129. package/dist/telemetry/exporter.js.map +1 -0
  130. package/dist/usage/extractor.d.ts +18 -0
  131. package/dist/usage/extractor.d.ts.map +1 -0
  132. package/dist/usage/extractor.js +48 -0
  133. package/dist/usage/extractor.js.map +1 -0
  134. package/drizzle/pg/0000_thick_loners.sql +75 -0
  135. package/drizzle/pg/0001_rare_lester.sql +13 -0
  136. package/drizzle/pg/0002_short_shinko_yamashiro.sql +1 -0
  137. package/drizzle/pg/0003_remarkable_mastermind.sql +14 -0
  138. package/drizzle/pg/0004_warm_reaper.sql +18 -0
  139. package/drizzle/pg/0005_overconfident_mole_man.sql +14 -0
  140. package/drizzle/pg/0006_third_shiva.sql +13 -0
  141. package/drizzle/pg/0007_keen_shockwave.sql +2 -0
  142. package/drizzle/pg/meta/0000_snapshot.json +648 -0
  143. package/drizzle/pg/meta/0001_snapshot.json +743 -0
  144. package/drizzle/pg/meta/0002_snapshot.json +749 -0
  145. package/drizzle/pg/meta/0003_snapshot.json +841 -0
  146. package/drizzle/pg/meta/0004_snapshot.json +974 -0
  147. package/drizzle/pg/meta/0005_snapshot.json +1079 -0
  148. package/drizzle/pg/meta/0006_snapshot.json +1193 -0
  149. package/drizzle/pg/meta/0007_snapshot.json +1199 -0
  150. package/drizzle/pg/meta/_journal.json +62 -0
  151. package/drizzle/sqlite/0000_massive_kinsey_walden.sql +75 -0
  152. package/drizzle/sqlite/0001_quiet_phantom_reporter.sql +13 -0
  153. package/drizzle/sqlite/0002_broad_sheva_callister.sql +1 -0
  154. package/drizzle/sqlite/0003_thankful_agent_brand.sql +14 -0
  155. package/drizzle/sqlite/0004_productive_wolverine.sql +18 -0
  156. package/drizzle/sqlite/0005_chilly_carlie_cooper.sql +14 -0
  157. package/drizzle/sqlite/0006_workable_starfox.sql +13 -0
  158. package/drizzle/sqlite/0007_quick_hemingway.sql +19 -0
  159. package/drizzle/sqlite/meta/0000_snapshot.json +503 -0
  160. package/drizzle/sqlite/meta/0001_snapshot.json +587 -0
  161. package/drizzle/sqlite/meta/0002_snapshot.json +594 -0
  162. package/drizzle/sqlite/meta/0003_snapshot.json +685 -0
  163. package/drizzle/sqlite/meta/0004_snapshot.json +807 -0
  164. package/drizzle/sqlite/meta/0005_snapshot.json +897 -0
  165. package/drizzle/sqlite/meta/0006_snapshot.json +981 -0
  166. package/drizzle/sqlite/meta/0007_snapshot.json +988 -0
  167. package/drizzle/sqlite/meta/_journal.json +62 -0
  168. package/package.json +10 -5
  169. package/dist/__tests__/schema.test.d.ts +0 -2
  170. package/dist/__tests__/schema.test.d.ts.map +0 -1
  171. package/dist/__tests__/schema.test.js +0 -31
  172. package/dist/__tests__/schema.test.js.map +0 -1
  173. package/dist/db/dump-schema.d.ts +0 -10
  174. package/dist/db/dump-schema.d.ts.map +0 -1
  175. package/dist/db/dump-schema.js +0 -64
  176. package/dist/db/dump-schema.js.map +0 -1
  177. package/dist/db/pg.d.ts +0 -52
  178. package/dist/db/pg.d.ts.map +0 -1
  179. package/dist/db/pg.js +0 -398
  180. package/dist/db/pg.js.map +0 -1
  181. package/dist/db/sqlite.d.ts +0 -51
  182. package/dist/db/sqlite.d.ts.map +0 -1
  183. package/dist/db/sqlite.js +0 -412
  184. package/dist/db/sqlite.js.map +0 -1
package/dist/auth.d.ts CHANGED
@@ -9,8 +9,12 @@ declare module 'fastify' {
9
9
  tenantId: string;
10
10
  }
11
11
  }
12
- /** SHA-256 hash of an API key — used to look up keys without storing the raw value. */
13
- export declare function hashApiKey(key: string): string;
12
+ /**
13
+ * HMAC-SHA256 hash of an API key using a server-side secret.
14
+ * Prevents rainbow table attacks on stored key hashes.
15
+ * Falls back to plain SHA-256 if no secret is available (local dev mode).
16
+ */
17
+ export declare function hashApiKey(key: string, secret?: string): string;
14
18
  /**
15
19
  * Multi-tenant authentication hook.
16
20
  *
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC;;;GAGG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB;CACF;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CA4D5F"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC;;;GAGG;AACH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,QAAQ,EAAE,MAAM,CAAC;KAClB;CACF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CA0E5F"}
package/dist/auth.js CHANGED
@@ -1,6 +1,13 @@
1
- import { createHash } from 'node:crypto';
2
- /** SHA-256 hash of an API key — used to look up keys without storing the raw value. */
3
- export function hashApiKey(key) {
1
+ import { createHash, createHmac } from 'node:crypto';
2
+ /**
3
+ * HMAC-SHA256 hash of an API key using a server-side secret.
4
+ * Prevents rainbow table attacks on stored key hashes.
5
+ * Falls back to plain SHA-256 if no secret is available (local dev mode).
6
+ */
7
+ export function hashApiKey(key, secret) {
8
+ if (secret) {
9
+ return createHmac('sha256', secret).update(key).digest('hex');
10
+ }
4
11
  return createHash('sha256').update(key).digest('hex');
5
12
  }
6
13
  /**
@@ -15,6 +22,7 @@ export function hashApiKey(key) {
15
22
  * 6. No match → 401
16
23
  */
17
24
  export function registerAuth(app, apiKey, db) {
25
+ const hmacSecret = process.env.ASH_CREDENTIAL_KEY;
18
26
  // Decorate request with tenantId so it's always available
19
27
  app.decorateRequest('tenantId', 'default');
20
28
  app.addHook('onRequest', async (request, reply) => {
@@ -46,8 +54,18 @@ export function registerAuth(app, apiKey, db) {
46
54
  const bearerKey = parts[1];
47
55
  // Try api_keys table first (multi-tenant path)
48
56
  if (db) {
49
- const keyHash = hashApiKey(bearerKey);
50
- const apiKeyRecord = await db.getApiKeyByHash(keyHash);
57
+ // Try HMAC hash first (new keys), then fall back to plain SHA-256 (legacy keys)
58
+ const hmacHash = hmacSecret ? hashApiKey(bearerKey, hmacSecret) : null;
59
+ const legacyHash = hashApiKey(bearerKey);
60
+ if (hmacHash) {
61
+ const apiKeyRecord = await db.getApiKeyByHash(hmacHash);
62
+ if (apiKeyRecord) {
63
+ request.tenantId = apiKeyRecord.tenantId;
64
+ return;
65
+ }
66
+ }
67
+ // Fall back to legacy hash for keys created before HMAC migration
68
+ const apiKeyRecord = await db.getApiKeyByHash(legacyHash);
51
69
  if (apiKeyRecord) {
52
70
  request.tenantId = apiKeyRecord.tenantId;
53
71
  return;
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface EncryptedData {
2
+ encrypted: string;
3
+ iv: string;
4
+ authTag: string;
5
+ salt: string;
6
+ }
7
+ export declare function encrypt(plaintext: string, masterKey: string): EncryptedData;
8
+ /**
9
+ * Decrypt credential data. If salt is provided, uses PBKDF2 key derivation.
10
+ * If salt is null/undefined, falls back to legacy SHA-256 derivation for
11
+ * backward compatibility with credentials encrypted before the PBKDF2 migration.
12
+ */
13
+ export declare function decrypt(encrypted: string, iv: string, authTag: string, masterKey: string, salt?: string | null): string;
14
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,CAgB3E;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAWvH"}
package/dist/crypto.js ADDED
@@ -0,0 +1,45 @@
1
+ import { createCipheriv, createDecipheriv, randomBytes, createHash, pbkdf2Sync } from 'node:crypto';
2
+ const ALGORITHM = 'aes-256-gcm';
3
+ const IV_LENGTH = 12;
4
+ const SALT_LENGTH = 16;
5
+ const PBKDF2_ITERATIONS = 100_000;
6
+ const PBKDF2_DIGEST = 'sha256';
7
+ /** Derive a 32-byte key using PBKDF2 with a random salt. */
8
+ function deriveKey(masterKey, salt) {
9
+ return pbkdf2Sync(masterKey, salt, PBKDF2_ITERATIONS, 32, PBKDF2_DIGEST);
10
+ }
11
+ /** Legacy key derivation — unsalted SHA-256. Used only for decrypting old credentials. */
12
+ function deriveKeyLegacy(masterKey) {
13
+ return createHash('sha256').update(masterKey).digest();
14
+ }
15
+ export function encrypt(plaintext, masterKey) {
16
+ const salt = randomBytes(SALT_LENGTH);
17
+ const key = deriveKey(masterKey, salt);
18
+ const iv = randomBytes(IV_LENGTH);
19
+ const cipher = createCipheriv(ALGORITHM, key, iv);
20
+ let encrypted = cipher.update(plaintext, 'utf8', 'base64');
21
+ encrypted += cipher.final('base64');
22
+ const authTag = cipher.getAuthTag();
23
+ return {
24
+ encrypted,
25
+ iv: iv.toString('base64'),
26
+ authTag: authTag.toString('base64'),
27
+ salt: salt.toString('base64'),
28
+ };
29
+ }
30
+ /**
31
+ * Decrypt credential data. If salt is provided, uses PBKDF2 key derivation.
32
+ * If salt is null/undefined, falls back to legacy SHA-256 derivation for
33
+ * backward compatibility with credentials encrypted before the PBKDF2 migration.
34
+ */
35
+ export function decrypt(encrypted, iv, authTag, masterKey, salt) {
36
+ const key = salt
37
+ ? deriveKey(masterKey, Buffer.from(salt, 'base64'))
38
+ : deriveKeyLegacy(masterKey);
39
+ const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(iv, 'base64'));
40
+ decipher.setAuthTag(Buffer.from(authTag, 'base64'));
41
+ let decrypted = decipher.update(encrypted, 'base64', 'utf8');
42
+ decrypted += decipher.final('utf8');
43
+ return decrypted;
44
+ }
45
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpG,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAE/B,4DAA4D;AAC5D,SAAS,SAAS,CAAC,SAAiB,EAAE,IAAY;IAChD,OAAO,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;AAC3E,CAAC;AAED,0FAA0F;AAC1F,SAAS,eAAe,CAAC,SAAiB;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;AACzD,CAAC;AASD,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,SAAiB;IAC1D,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAElD,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3D,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS;QACT,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAC9B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,EAAU,EAAE,OAAe,EAAE,SAAiB,EAAE,IAAoB;IAC7G,MAAM,GAAG,GAAG,IAAI;QACd,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpD,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,129 @@
1
+ import type { Agent, Session, SessionStatus, SandboxRecord, SandboxState, ApiKey, Message, SessionEvent, SessionEventType, RunnerRecord, Credential, QueueItem, QueueItemStatus, QueueStats, Attachment, UsageEvent, UsageEventType, UsageStats } from '@ash-ai/shared';
2
+ import type { Db } from './index.js';
3
+ import type * as sqliteSchema from './schema.sqlite.js';
4
+ import type * as pgSchema from './schema.pg.js';
5
+ type Schema = typeof sqliteSchema | typeof pgSchema;
6
+ /**
7
+ * Unified Db implementation backed by Drizzle ORM.
8
+ * Works with both SQLite (better-sqlite3) and PostgreSQL (pg) drivers.
9
+ */
10
+ export declare class DrizzleDb implements Db {
11
+ private drizzle;
12
+ private schema;
13
+ private dialect;
14
+ private closeFn;
15
+ constructor(drizzle: any, // DrizzleSQLiteDatabase | DrizzleNodePgDatabase
16
+ schema: Schema, dialect: 'sqlite' | 'pg', closeFn: () => Promise<void>);
17
+ upsertRunner(id: string, host: string, port: number, maxSandboxes: number): Promise<RunnerRecord>;
18
+ heartbeatRunner(id: string, activeCount: number, warmingCount: number): Promise<void>;
19
+ getRunner(id: string): Promise<RunnerRecord | null>;
20
+ listHealthyRunners(cutoffIso: string): Promise<RunnerRecord[]>;
21
+ listDeadRunners(cutoffIso: string): Promise<RunnerRecord[]>;
22
+ selectBestRunner(cutoffIso: string): Promise<RunnerRecord | null>;
23
+ deleteRunner(id: string): Promise<void>;
24
+ listAllRunners(): Promise<RunnerRecord[]>;
25
+ upsertAgent(name: string, path: string, tenantId?: string): Promise<Agent>;
26
+ getAgent(name: string, tenantId?: string): Promise<Agent | null>;
27
+ listAgents(tenantId?: string): Promise<Agent[]>;
28
+ deleteAgent(name: string, tenantId?: string): Promise<boolean>;
29
+ insertSession(id: string, agentName: string, sandboxId: string, tenantId?: string, parentSessionId?: string): Promise<Session>;
30
+ insertForkedSession(id: string, parentSession: Session, sandboxId: string): Promise<Session>;
31
+ updateSessionStatus(id: string, status: SessionStatus): Promise<void>;
32
+ updateSessionSandbox(id: string, sandboxId: string): Promise<void>;
33
+ updateSessionRunner(id: string, runnerId: string | null): Promise<void>;
34
+ getSession(id: string): Promise<Session | null>;
35
+ listSessions(tenantId?: string, agent?: string): Promise<Session[]>;
36
+ listSessionsByRunner(runnerId: string): Promise<Session[]>;
37
+ bulkPauseSessionsByRunner(runnerId: string): Promise<number>;
38
+ touchSession(id: string): Promise<void>;
39
+ insertSandbox(id: string, agentName: string, workspaceDir: string, sessionId?: string, tenantId?: string): Promise<void>;
40
+ updateSandboxState(id: string, state: SandboxState): Promise<void>;
41
+ updateSandboxSession(id: string, sessionId: string | null): Promise<void>;
42
+ touchSandbox(id: string): Promise<void>;
43
+ getSandbox(id: string): Promise<SandboxRecord | null>;
44
+ countSandboxes(): Promise<number>;
45
+ getBestEvictionCandidate(): Promise<SandboxRecord | null>;
46
+ getIdleSandboxes(olderThan: string): Promise<SandboxRecord[]>;
47
+ deleteSandbox(id: string): Promise<void>;
48
+ markAllSandboxesCold(): Promise<number>;
49
+ insertMessage(sessionId: string, role: 'user' | 'assistant', content: string, tenantId?: string): Promise<Message>;
50
+ listMessages(sessionId: string, tenantId?: string, opts?: {
51
+ limit?: number;
52
+ afterSequence?: number;
53
+ }): Promise<Message[]>;
54
+ insertSessionEvent(sessionId: string, type: SessionEventType, data: string | null, tenantId?: string): Promise<SessionEvent>;
55
+ insertSessionEvents(events: Array<{
56
+ sessionId: string;
57
+ type: SessionEventType;
58
+ data: string | null;
59
+ tenantId?: string;
60
+ }>): Promise<SessionEvent[]>;
61
+ listSessionEvents(sessionId: string, tenantId?: string, opts?: {
62
+ limit?: number;
63
+ afterSequence?: number;
64
+ type?: SessionEventType;
65
+ }): Promise<SessionEvent[]>;
66
+ getApiKeyByHash(keyHash: string): Promise<ApiKey | null>;
67
+ insertApiKey(id: string, tenantId: string, keyHash: string, label: string): Promise<ApiKey>;
68
+ listApiKeysByTenant(tenantId: string): Promise<ApiKey[]>;
69
+ deleteApiKey(id: string): Promise<boolean>;
70
+ insertCredential(id: string, tenantId: string, type: string, encryptedKey: string, iv: string, authTag: string, label: string, salt?: string | null): Promise<Credential>;
71
+ getCredential(id: string): Promise<{
72
+ id: string;
73
+ tenantId: string;
74
+ type: string;
75
+ encryptedKey: string;
76
+ iv: string;
77
+ authTag: string;
78
+ salt: string | null;
79
+ label: string;
80
+ active: boolean;
81
+ createdAt: string;
82
+ lastUsedAt: string | null;
83
+ } | null>;
84
+ listCredentials(tenantId: string): Promise<Credential[]>;
85
+ deleteCredential(id: string): Promise<boolean>;
86
+ touchCredentialUsed(id: string): Promise<void>;
87
+ insertQueueItem(id: string, tenantId: string, agentName: string, prompt: string, sessionId?: string, priority?: number, maxRetries?: number): Promise<QueueItem>;
88
+ getQueueItem(id: string): Promise<QueueItem | null>;
89
+ getNextPendingQueueItem(tenantId?: string): Promise<QueueItem | null>;
90
+ /**
91
+ * Atomically claim a queue item by setting status to 'processing'
92
+ * only if it is still 'pending'. Returns true if the claim succeeded.
93
+ */
94
+ claimQueueItem(id: string): Promise<boolean>;
95
+ updateQueueItemStatus(id: string, status: QueueItemStatus, error?: string): Promise<void>;
96
+ incrementQueueItemRetry(id: string, retryAfter?: string): Promise<void>;
97
+ listQueueItems(tenantId: string, status?: QueueItemStatus, limit?: number): Promise<QueueItem[]>;
98
+ getQueueStats(tenantId: string): Promise<QueueStats>;
99
+ insertAttachment(id: string, tenantId: string, messageId: string, sessionId: string, filename: string, mimeType: string, size: number, storagePath: string): Promise<Attachment>;
100
+ getAttachment(id: string): Promise<Attachment | null>;
101
+ listAttachmentsByMessage(messageId: string, tenantId?: string): Promise<Attachment[]>;
102
+ listAttachmentsBySession(sessionId: string, tenantId?: string): Promise<Attachment[]>;
103
+ deleteAttachment(id: string): Promise<boolean>;
104
+ insertUsageEvent(id: string, tenantId: string, sessionId: string, agentName: string, eventType: UsageEventType, value: number): Promise<UsageEvent>;
105
+ insertUsageEvents(events: Array<{
106
+ id: string;
107
+ tenantId: string;
108
+ sessionId: string;
109
+ agentName: string;
110
+ eventType: UsageEventType;
111
+ value: number;
112
+ }>): Promise<void>;
113
+ listUsageEvents(tenantId: string, opts?: {
114
+ sessionId?: string;
115
+ agentName?: string;
116
+ after?: string;
117
+ before?: string;
118
+ limit?: number;
119
+ }): Promise<UsageEvent[]>;
120
+ getUsageStats(tenantId: string, opts?: {
121
+ sessionId?: string;
122
+ agentName?: string;
123
+ after?: string;
124
+ before?: string;
125
+ }): Promise<UsageStats>;
126
+ close(): Promise<void>;
127
+ }
128
+ export {};
129
+ //# sourceMappingURL=drizzle-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drizzle-db.d.ts","sourceRoot":"","sources":["../../src/db/drizzle-db.ts"],"names":[],"mappings":"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"}